6 menit
Container Mastodon dengan Menggunakan Quadlet Podman
Mastodon adalah sebuah perangkat lunak gratis dan opensource untuk menjalankan social-media yang dapat dijalankan sendiri alias self-hosted. Mastodon menyediakan fitur micro-blogging yang mirip X (dahulu dikenal sebagai twitter), tetapi berbeda karena mastodon merupakan bagian dari fediverse, yang memungkinkan instance-instance mastodon saling terhubung dengan instance mastodon lain ataupun anggota fediverse lain. Hal ini memungkinkan pengguna mastodon dapat berinteraksi dengan pengguna server-server lain layaknya layanan email, dimana pengguna email dari sebuah layanan dapat berinteraksi dengan pengguna server email lain.
Sayangnya, di web mastodon, tidak ada informasi yang terperinci untuk menjalankan mastodon dalam lingkungan container, hanya ada contoh docker-compose jika menjalankan dalam lingkungan docker. Kami bukan aliran docker, buat kami podman adalah “is a must”.
Berikut kami sertakan petunjuk untuk menjalankan mastodon di lingkungan podman. Contoh di artikel ini menggunakan quadlet untuk integrasi dengan systemd.
File environment yang akan dipakai
Untuk menghindari deklarasi berulang “Environment=xxxxx” di setiap container,
lebih baik kita buat sebuah file enviroment tunggal yang akan digunakan
oleh container-container terkait dengan mastodon.
Berikut template file environment yang akan dipakai, buat di /etc/default/mastodon.env dengan isi sebagai berikut:
## /etc/default/mastodon.env
## DOMAIN FEDIVERSE
##
## MISAL: LOCAL_DOMAIN=kodesumber.com
LOCAL_DOMAIN=PLEASE_CHANGE_ME
## HOSTNAME UNTUK FRONTEND WEB JIKA BERBEDA DENGAN LOCAL_DOMAIN.
## MISALNYA KARENA DOMAIN UTAMA SUDAH DIPAKAI UNTUK WEB LAIN
## SEHINGGA KITA HARUS MENJALANKAN MASTODON DENGAN HOSTNAME LAIN.
##
## MISAL: WEB_DOMAIN=mastodon.kodesumber.com
WEB_DOMAIN=PLEASE_CHANGE_ME
## KONFIGURASI REDIS
## TIDAK PERLU MENGGUNAKAN PASSWORD UNTUK KEAMANAN
## KARENA INSTANCE REDIS YANG DIJALANKAN HANYA DAPAT DIAKSES
## DALAM SATU POD SAJA
REDIS_HOST=localhost
REDIS_PORT=6379
## KONFIGURASI POSTGRES
## TIDAK MASALAH MENGGUNAKAN PASSWORD YANG MUDAH DITEBAK
## KARENA SERVER POSTGRES YANG DIJALANKAN TIDAK TERBUKA KE PUBLIK,
## HANYA TERBATAS DALAM POD SAJA
DB_HOST=localhost
DB_USER=postgres
DB_NAME=mastodon
##
## UBAH DB_PASS DENGAN PASSWORD YANG SAMA
## DENGAN YANG DITENTUKAN DI FILE
## /etc/default/mastodon.env
DB_PASS=PLEASE_CHANGE_ME
DB_PORT=5432
## YOU CAN GENERATE SECRET_KEY_BASE BY RUNNING:
## sudo podman run --rm -ti ghcr.io/mastodon/mastodon:latest rails secret
SECRET_KEY_BASE=PLEASE_CHANGE_ME
#
## SAME AS SECRET_KEY_BASE, YOU CAN GENERATE OTP_SECRET BY RUNNING:
## sudo podman run --rm -ti ghcr.io/mastodon/mastodon:latest rails secret
OTP_SECRET=PLEASE_CHANGE_ME
## TO GENERATE VAPID_PRIVATE_KEY AND VAPID_PUBLIC_KEY,
## RUN THIS COMMAND:
## sudo podman run --rm -ti ghcr.io/mastodon/mastodon:latest rails mastodon:webpush:generate_vapid_key
#
VAPID_PRIVATE_KEY=PLEASE_CHANGE_ME
VAPID_PUBLIC_KEY=PLEASE_CHANGE_ME
## RUN THIS COMMAND TO GENERATE ACTIVE RECORD ENCRYPTION VARIABLES:
## sudo podman run --rm -ti ghcr.io/mastodon/mastodon:latest rails db:encryption:init
ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=PLEASE_CHANGE_ME
ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=PLEASE_CHANGE_ME
ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=PLEASE_CHANGE_ME
## OPSIONAL JIKA ANDA INGIN MENGGUNAKAN S3 SEBAGAI MEDIA STORAGE
#
# S3_ENABLED=true
# AWS_ACCESS_KEY_ID=PLEASE_CHANGE_ME
# AWS_SECRET_ACCESS_KEY=PLEASE_CHANGE_ME
# S3_BUCKET=PLEASE_CHANGE_ME
# S3_ENDPOINT=PLEASE_CHANGE_ME
#
## HOSTNAME YANG AKAN DIGUNAKAN PENGUNJUNG
## UNTUK MENGAKSES MEDIA PADA STORAGE S3
##
## MISAL: S3_ALIAS_HOST=s3.mastodon.kodesumber.com
# S3_ALIAS_HOST=PLEASE_CHANGE_ME
## SESUAIKAN DENGAN HOST SMTP SERVER ANDA
SMTP_SERVER=PLEASE_CHANGE_ME
SMTP_LOGIN=PLEASE_CHANGE_ME
SMTP_PASSWORD=PLEASE_CHANGE_ME
SMTP_FROM_ADDRESS=PLEASE_CHANGE_ME
## MASUKKAN IP REVERSE PROXY YANG DIGUNAKAN,
## BISA SINGLE IP ATAU CIDR.
## PISAHKAN DENGAN KOMA JIKA ADA LEBIH DARI SATU
## MISAL: TRUSTED_PROXY_IP=127.0.0.1,10.88.0.1,172.16.0.0/12
TRUSTED_PROXY_IP=PLEASE_CHANGE_ME
MASTODON_PROMETHEUS_EXPORTER_ENABLED=true
MASTODON_PROMETHEUS_EXPORTER_LOCAL=true
MASTODON_PROMETHEUS_EXPORTER_HOST=0.0.0.0
Deklarasi pod
Untuk kemudahan, kita akan membungkus beberapa container podman dalam suatu pod. Pod pada podman memungkinkan sharing network secara mudah antara container-container dalam satu pod tanpa harus membuat network khusus di podman.
## /etc/containers/systemd/mastodon.pod
[Pod]
## Publish port puma
PublishPort=3000:3000
## Publish port streaming
PublishPort=4000:4000
## Publish port prometheus
PublishPort=9394:9394
[Install]
## Jalankan otomatis saat boot
WantedBy=default.target
Container postgresql
Silahkan buat file “/etc/containers/systemd/mastodon-psql.container” sebagai file quadlet untuk container postgresql.
## /etc/containers/systemd/mastodon-psql.container
[Unit]
After=network-online.target
[Container]
ContainerName=mastodon-psql
Pod=mastodon.pod
Image=docker.io/library/postgres:18
AutoUpdate=registry
Timezone=Asia/Jakarta
Environment=POSTGRES_PASSWORD=PLEASE_CHANGE_ME
Volume=mastodon-psql-data:/var/lib/postgresql:Z,U
[Service]
Restart=always
Container redis
Silahkan buat file “/etc/containers/systemd/mastodon-redis.container” sebagai file quadlet untuk container redis.
## /etc/containers/systemd/mastodon-redis.container
[Unit]
After=network-online.target
[Container]
ContainerName=mastodon-redis
Pod=mastodon.pod
Image=docker.io/redis:8
AutoUpdate=registry
Timezone=Asia/Jakarta
Volume=mastodon-redis-data:/data
[Service]
Restart=always
Jalankan pod untuk pertama kali
Setelah file-file quadlet dan environment variable diatas dibuat, sebelum kita membuat container puma dan streaming, jalankan pod mastodon untuk pertama kali. Jangan lupa reload dulu systemd sebelum start. Hal ini perlu dilakukan untuk menginisialisi mastodon anda sebelum melanjutkan tahap-tahap berikutnya.
Berikut perintah yang dapat anda jalankan
sudo systemctl daemon-reload
sudo systemctl start mastodon-pod
Kemudian kita harus menginisialisasi instance mastodon yang akan kita buat, diantaranya untuk menyiapkan database postgresql.
Jalankan perintah berikut:
sudo podman run --rm -ti --pod systemd-mastodon ghcr.io/mastodon/mastodon:latest bundle exec rake mastodon:setup
Silahkan isi pertanyaan-pertanyaan dari wizard tersebut sesuai dengan file environment yang telah anda buat di “/etc/default/mastodon.env”.
Container puma
## /etc/containers/systemd/mastodon-puma.container
[Unit]
After=network-online.target
## Jalankan container ini setelah redis dan postgres up
After=mastodon-redis.service
After=mastodon-psql.service
[Container]
ContainerName=mastodon-puma
Pod=mastodon.pod
Image=ghcr.io/mastodon/mastodon:latest
AutoUpdate=registry
Timezone=Asia/Jakarta
Volume=mastodon-system:/mastodon/public/system:z,U
PodmanArgs=--env-file=/etc/default/mastodon.env
Exec=bundle exec puma -C config/puma.rb
[Service]
Restart=always
Container streaming
## /etc/containers/systemd/mastodon-streaming.container
[Unit]
After=network-online.target
After=mastodon-redis.service
After=mastodon-psql.service
[Container]
ContainerName=mastodon-streaming
Pod=mastodon.pod
Image=ghcr.io/mastodon/mastodon-streaming:latest
AutoUpdate=registry
Timezone=Asia/Jakarta
Volume=mastodon-system:/mastodon/public/system:z,U
PodmanArgs=--env-file=/etc/default/mastodon.env
Exec=node ./streaming/index.js
[Service]
Restart=always
Container sidekiq
Sidekiq adalah standar de-facto untuk menjalankan background task dan queue di lingkungan “ruby on rails”. Container ini berfungsi untuk menjalankan antrian tugas di mastodon di background.
## /etc/containers/systemd/mastodon-sidekiq.container
[Unit]
After=network-online.target
After=mastodon-redis.service
After=mastodon-psql.service
[Container]
ContainerName=mastodon-sidekiq
Pod=mastodon.pod
Image=ghcr.io/mastodon/mastodon:latest
AutoUpdate=registry
Timezone=Asia/Jakarta
Volume=mastodon-system:/mastodon/public/system:z,U
Environment=MASTODON_PROMETHEUS_EXPORTER_LOCAL=false
PodmanArgs=--env-file=/etc/default/mastodon.env
Exec=bundle exec sidekiq
[Service]
Restart=always
Konfigurasi caddy untuk reverse-proxy
Kami menggunakan caddy untuk reverse-proxy. Jika anda menggunakan S3 sebagai “media-storage”, kami menyarankan varian container caddy kami yang sudah mendukung S3 yang dapat anda gunakan.
Sisipkan baris berikut di konfigurasi caddy anda:
GANTI_SESUAI_DENGAN_HOSTNAME_YANG_DITENTUKAN_DI_S3_ALIAS_HOST {
route {
s3proxy {
bucket GANTI_DENGAN_NAMA_BUCKET_S3
region GANTI_DENGAN_REGION_S3
endpoint GANTI_DENGAN_URL_ENDPOINT_S3
profile GANTI_DENGAN_PROFILE_S3
force_path_style
}
}
tls {
on_demand
}
encode zstd gzip
}
GANTI_SESUAI_DENGAN_VARIABEL_S3_ALIAS_HOST {
reverse_proxy /api/v1/streaming http://GANTI_DENGAN_IP_HOST_PODMAN_YANG_MENJALANKAN_POD_MASTODON:4000
reverse_proxy /api/v1/streaming/ http://GANTI_DENGAN_IP_HOST_PODMAN_YANG_MENJALANKAN_POD_MASTODON:4000
reverse_proxy http://GANTI_DENGAN_IP_HOST_PODMAN_YANG_MENJALANKAN_POD_MASTODON:31080
tls {
on_demand
}
encode zstd gzip
}
Jangan lupa untuk “reload” atau “restart” caddy anda.
Langkah akhir
Setelah semua file quadlet anda buat, jalankan perintah berikut untuk menjalankan pod mastodon yang telah lengkap dikonfigurasi:
sudo systemctl daemon-reload
sudo systemctl restart mastodon-pod
Catatan tambahan
-
Contoh di artikel ini adalah contoh untuk menjalankan instance mastodon secara “basic”, bukan yang teroptimasi. File-file di artikel ini merupakan adaptasi penyederhanaan dari file-file quadlet podman yang kami gunakan untuk menjalankan instance kami di mastodon.kodesumber.com
-
Perintah dan konfigurasi di artikel ini tested di Fedora CoreOS, akan tetapi seharusnya juga kompatibel dengan distro lain yang menyediakan podman minimal versi 4.4 yang support quadlet.
-
Di beberapa file quadlet container, terdapat “
PodmanArgs=--env-file=/etc/default/mastodon.env” Hal ini untuk mengaktifkan file environment yang seragam dan konsisten tanpa harus menggunakan “Environment=XXXX” di setiap file. -
“
AutoUpdate=registry” berfungsi untuk menandakan container terkait akan di-update otomatis oleh service systemd podman-auto-update. Jangan lupa untuk mengaktifkan podman-auto-update.timer jika belum dengan perintah:
sudo systemctl enable --now podman-auto-update.timer
-
“PublishPort” dideklarasikan di file quadlet pod, bukan di quadlet container.
-
Jika anda ingin mengulang prosedur-prosedur diatas misalkan ada kesalahan perintah sebelumnya, jangan lupa hapus volume yang telah dibuat, dengan perintah:
sudo podman volume rm mastodon-psql-data
sudo podman volume rm mastodon-redis-data
sudo podman volume rm mastodon-system
-
Jika anda menemui masalah dalam menjalankan instruksi-instruksi di artikel ini, jangan ragu untuk menghubungi kami. Kami akan ikhlas membantu anda troubleshoot masalah anda sesuai dengan batasan kemampuan dan sumber daya kami.
-
Jika anda menjalankan instance mastodon, sebagai sesama warga fediverse +62, kami mengajak kita bersosialisasi, misalkan kita sama-sama membuat relay server ActivityPub agar instance mastodon kita saling terkait.