Setup Dendrite: 2nd Generation Matrix Server dengan Cloudflare Tunnel
Bersama lagi dengan postingan yang seolah-olah selfhost! Kali ini saya akan mengajak Anda untuk menginstall Dendrite, server dengan basis Go yang akan saya install pada perangkat super lemah saya Pi Zero W.
Perlu diingat bahwa perangkat saya ini sudah berumur dan menggunakan prosesor yang sudah uzur (armv6), jadi jangan terlalu berharap banyak.
Pada tulisan kali ini, di bawah ini adalah pengalaman saya untuk menginstal Dendrite pada armv6. Bagi yang masih mendukung, anggap saja ini sebagai bacaan.
Native vs Docker
Sama seperti lainnya, tentu performa native akan lebih cepat. Namun, karena saya malas (tidak bisa dan tidak mau) untuk compile, jadi saya lompat saja dengan Docker. Kebetulan saja, officialnya tidak menyediakan image untuk armv6, jadi saya pasrah dan install sendiri di Alpine, dan alhamdulillah Alpine menyediakan official package di versi edge mereka.
Build Dendrite pada Alpine
Loh, katanya sudah ada package-nya? Ya benar, namun karena di sini kita menggunakan perintah build, judulnya adalah build. Berikut langkah untuk membuat docker image dendrite pada alpine:
- Buat folder untuk keperluan Dendrite, silahkan buat juga 1 folder
didalamnya untuk file konfigurasi Dendrite. Misalnya
/dendrite/config/
- Buat Dokcerfile dengan isi berikut (sebenarnya saya ambil dari Dockerfile asli Dendrite):
FROM alpine:edge
RUN apk --update --no-cache add dendrite
LABEL org.opencontainers.image.title="Dendrite"
LABEL org.opencontainers.image.description="Next-generation Matrix homeserver written in Go"
LABEL org.opencontainers.image.source="https://github.com/matrix-org/dendrite"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.documentation="https://matrix-org.github.io/dendrite/"
LABEL org.opencontainers.image.vendor="The Matrix.org Foundation C.I.C."
VOLUME /etc/dendrite
WORKDIR /etc/dendrite
ENTRYPOINT ["/usr/bin/dendrite"]
EXPOSE 8008 8448
Dendrite Dockerfile
- Kemudian buat juga docker-compose.yml untuk mempermudah kerja kita, dengan isi seperti berikut:
version: "3.3"
services:
dendrite:
image: dendrite:latest
container_name: dendrite
build:
context: .
# entrypoint: "/usr/bin/dendrite-generate-keys"
# command: ["-private-key", "/etc/dendrite/matrix_key.pem"]
ports:
- 8008:8008
- 8448:8448
volumes:
- ./config:/etc/dendrite
# The following volumes use docker volumes, change this
# if you prefer to have those files outside of docker.
- dendrite_media:/var/dendrite/media
- dendrite_jetstream:/var/dendrite/jetstream
- dendrite_search_index:/var/dendrite/searchindex
volumes:
dendrite_media:
dendrite_jetstream:
dendrite_search_index:
docker-compose
- Jangan hilangkan komentar pada
entrypoint
dancommand
, karena kita akan membutuhkannya nanti. - Jika sudah siap, bisa jalankan perintah
docker compose build
untuk membuat docker imagenya. - Unduh default config Dendrite pada alamat ini, dan simpan pada folder config yang sudah kita buat.
- Beberapa hal yang perlu diubah adalah sebagai berikut:
global:
# ...
server_name: matrix.domain
isikan nama domain anda disini
global:
# ...
private_key: /etc/dendrite/matrix_key.pem
setup pivate keys, yang nanti akan kita buat.
global:
# ...
database:
connection_string: postgres://user:pass@hostname/database?sslmode=disable
max_open_conns: 90
max_idle_conns: 5
conn_max_lifetime: -1
Atur database
- Setelah semua siap, hapus komentar pada
entrypoint
dancommand
untuk membuat private keys. Kemudian jalankandocker comopse up
. - Jika private keys sudah terbuat, maka kamu bisa memberikan komentar
lagi pada
entrypoint
dancommand
, karena kita sudah tidak membutuhkannya lagi. - Jalankan dengan peintah
docker compose up -d
dan expose port 8008 ke cloudflare, akses web anda dan selamat matrix server anda sudah berjalan!
Membuat User (dan admin)
Untuk membuat pengguna, terutama admin, tidak sama seperti apa yang ada dalam dokumentasi, terutama bagian docker. Mengapa? Saya tidak tahu. Di sini, kita harus mengikuti langkah-langkah seperti instalasi binary.
- Masuk ke shell docker image Anda, pastikan image docker sudah
berjalan (lanjutan dari langkah sebelumnya). Ketik perintah seperti
berikut
docker exec -it dendrite /bin/sh
. - Buat akun dengan perintah
dendrite-create-account -username USERNAME -admin
, dan ikuti untuk membuat password. - Pengguna berhasil dibuat dan sudah bisa digunakan untuk login.
Untuk login, kamu bisa menggunakan bermacam-macam client yang sudah pernah dibahas sebelumnya, namun mungkin kamu akan mendapatkan masalah lain seperti tidak mau login atau malah client-nya protes ‘unrecognized request’. Ternyata setup kita belum selesai.
Setup well-known Domain
Dendrite membutuhkan beberapa pengaturan untuk keperluan koneksi dengan server dan klien, terutama ketika kita tidak menggunakan reverse proxy alias langsung dari Cloudflare Tunnel.
Setiap server Matrix akan berkomunikasi pada port 8448, namun karena
kita menggunakan tunnel, kita tidak dapat membuka port ini, sehingga
diperlukan perubahan pada .well-known/matrix/server
.
Kemudian, entah kenapa klien Matrix menginginkan kita untuk mengatur
m.homeserver
pada .well-known/matrix/client
,
jadi kita juga harus mengatur ini.
Sebenarnya, pada dokumentasi Dendrite, sudah diberikan
langkah-langkahnya pada well-known
delegation. Namun, dendrite.yaml
hanya menyediakan
pengaturan untuk kebutuhan server-to-server saja. Sedangkan untuk klien,
jika tidak disetting dengan tepat, kamu tidak akan bisa menggunakan
klien seperti Element.
Saya sarankan karena kita sama-sama menggunakan layanan dari Cloudflare, kita gunakan saja layanan Cloudflare Workers. Berikut langkah-langkahnya:
- Login ke cloudflare
- Buka laman Workers & Pages
- Create Application dan ikuti alurnya untuk pembuatan worker, untuk nama suka suka anda.

- Klik deploy dan lanjutkan edit dengan mengklik quick edit. Masukkan
skrip berikut (saya rasa sudah cukup jelas dengan komentar yang
diberikan). Silakan ganti
matrix.domain
dengan domain tempat Anda meletakkan Dendrite.
// Tangkap event buka link
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
const url = new URL(request.url);
if (url.pathname.startsWith('/.well-known/')) {
// Khusus untuk handle requests ke .well-known/matrix/client
if (url.pathname === '/.well-known/matrix/client') {
return new Response(
'{"m.homeserver": {"base_url": "https://matrix.domain"}}',
{headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
,
}status: 200,
};
)// Khusus handale request ke .well-known/matrix/server
if (url.pathname === '/.well-known/matrix/server') {
return new Response(
'{"m.server": "matrix.domain.com:443"}',
{headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
,
}status: 200,
};
)
}
// Pass other requests through to the origin server
return fetch(request);
} }
Skrip untuk emulasi .well-known
- Jika sudah, Save and Deploy.
- Klik bagian Routes, dan tambahkan route baru.
- Route :
matrix.domain/.well-known/*
dan Zone :matrix.domain
- Setting well-known selesai.
{{< callout emoji=“💡” >}}
Route di Cloudflare Worker mengalami perubahan, tutorial di bawah kurang up-to-date. Sekarang routing dipindah ke ****Settings > Triggers****. Seharusnya kamu hanya perlu mengatur di ****Custom Domains**** kecuali jika kamu memiliki worker lain yang juga berjalan di domain yang sama.
{{< /callout >}}
Gas!
Setelah semuanya selesai, kamu dapat login ke server matrixmu sendiri. Namun, saya sarankan untuk tidak bergabung dengan room milik matrix.org. Entah kenapa, apakah karena banyak server yang mati, perangkat saya yang saya tinggal 3 hari bergabung pada room milik dendrite masih tidak bisa menampilkan apa-apa, hanya terlihat bahwa saya berhasil bergabung di room tersebut.
Pengalaman saya menggunakan dendrite pada RPi Zero W ini sangat mengerikan. Ya, saya juga memiliki beberapa layanan lainnya seperti Actual Server, GotoSocial, RssBridge, Cloudflare Tunnel, dnscrypt-proxy, dan lainnya untuk keperluan pribadi. Bisa sih untuk keperluan chat pribadi, tapi lebih baik menggunakan server milik orang lain.
{{< callout emoji=“💡” >}}
Urungkan niat Anda untuk berfederasi dengan room besar jika Anda menggunakan perangkat yang sangat lemah seperti saya, dan jangan bergabung ke room milik matrix.org jika Anda tidak sabar.
{{< /callout >}}