MQTTS, NTP, dan firmware di server
MQTTS (TLS)
Section titled “MQTTS (TLS)”FluxMQ melayani tiga port: MQTT 3.1.1 plain (MQTT_PORT), MQTT 5 plain (MQTT5_PORT), dan MQTTS (MQTTS_PORT, satu port TLS untuk MQTT 3.1.1 dan 5). MQTTS opsional dan aktif sendiri bila berkas sertifikat dan kunci ada; tanpa itu hanya MQTT plain yang jalan.
Sumber sertifikat
Section titled “Sumber sertifikat”Taruh fullchain.pem dan privkey.pem di ${DATA_DIR}/tls (folder dibuat data-init, mode 700, milik root; salin dengan sudo).
Folder dipasang hanya baca (symlink live/ ke archive/ ikut terbaca):
MQTTS_CERT_DIR=/etc/letsencryptMQTTS_CERT_FILE=/certs/live/celestian.contoh.id/fullchain.pemMQTTS_KEY_FILE=/certs/live/celestian.contoh.id/privkey.pemTanpa sertifikat publik, buat CA dan sertifikat server dengan skrip bawaan:
sudo ./scripts/make-tls-cert.sh celestian.contoh.idHasilnya ${DATA_DIR}/tls/fullchain.pem dan privkey.pem, CA di ${DATA_DIR}/tls-ca/ (ca.key tidak dipasang ke kontainer; cadangkan), dan ./celestian-ca.crt untuk dipasang di klien. Sertifikat server berlaku 3 tahun dan CA 10 tahun; skrip aman dijalankan berkala karena melewatinya bila masih berlaku lebih dari 60 hari.
scripts/pull-tls-cert.sh menarik fullchain.pem dan privkey.pem lewat SSH. Isi MQTTS_PULL_HOST dan MQTTS_PULL_DIR di .env, jalankan sekali dengan tangan sebagai root, lalu jadwalkan harian. Skrip menolak pasangan sertifikat dan kunci yang tidak cocok atau sudah kedaluwarsa tanpa menyentuh berkas lama, dan menulis secara atomik.
Sertifikat harus untuk nama yang dipakai klien, dengan rantai lengkap (fullchain.pem). Buka MQTTS_PORT di firewall.
Perpanjangan otomatis
Section titled “Perpanjangan otomatis”FluxMQ membaca sertifikat sekali saat start dan tidak memuat ulang. Karena itu entrypoint kontainer memeriksa isi berkas sertifikat dan kunci tiap MQTTS_RELOAD_CHECK_S detik (bawaan 300) dan menjalankan ulang FluxMQ bila berubah. Tidak butuh hook certbot atau akses Docker socket.
- Tanpa berkas: MQTTS mati, plain jalan. Berkas muncul: TLS aktif sendiri dalam selang pemeriksaan.
- Berkas berganti: FluxMQ dijalankan ulang. Semua koneksi MQTT putus beberapa detik lalu tersambung lagi sendiri.
- Berkas rusak atau tidak cocok: kontainer kembali ke tanpa TLS (MQTT plain tetap hidup) dan mencoba lagi saat berkas berubah.
docker compose logs fluxmq | grep run.sh # "MQTTS aktif" atau "MQTTS nonaktif"echo | openssl s_client -connect celestian.contoh.id:8883 -servername celestian.contoh.id 2>/dev/null \ | openssl x509 -noout -subject -enddatemosquitto_pub -h celestian.contoh.id -p 8883 -V mqttv5 -u <ID> -P <key> -i <ID>-uji \ -t m/<ws>/c/<ch>/uji -m x -d # tambahkan --cafile bila CA sendiriAkses publik dan VPN
Section titled “Akses publik dan VPN”MQTTS_BIND mengatur alamat bind port MQTTS saja. Bila sebagian klien menyambung dari internet dan sebagian lewat VPN: MQTTS_BIND=0.0.0.0 dan biarkan MQTT_BIND di 127.0.0.1 atau IP VPN, sehingga hanya 8883 yang terbuka ke publik dan MQTT plain tidak.
NTP (chrony di host)
Section titled “NTP (chrony di host)”Waktu data SenFlat v2 berasal dari jam perangkat, yang disinkronkan ke gateway atau ke server ini. Karena itu server harus punya jam yang benar dan, bila dipakai sebagai hulu, melayani NTP. Pasang chrony di host server, bukan di Docker.
sudo apt install chronysudo cp deploy/host/chrony-celestian.conf /etc/chrony/conf.d/celestian.confsudo nano /etc/chrony/conf.d/celestian.conf # ganti baris `allow` dengan alamat atau subnet gatewaysudo systemctl restart chronysudo ufw allow from <alamat-gateway> to any port 123 proto udp- Batasi
allowdan firewall ke gateway. NTP terbuka bisa dipakai untuk serangan amplifikasi. - Verifikasi:
chronyc tracking(Stratum 2–3),chronyc sources -v(ada sumber^*),chronyc serverstats(paket masuk naik). Dari gateway:chronyc -h <alamat-server> tracking. - Lewati bila server sudah punya NTP server yang melayani klien; arahkan gateway ke alamat itu.
OTA firmware
Section titled “OTA firmware”Firmware diunggah di Manajemen Device → Firmware (OTA) (panduan). Yang perlu disiapkan:
SECRETS_KEYterisi (alamat unduhan bertanda tangan diturunkan darinya; tanpa itu rollout menjawab 503).- Berkas ada di
${DATA_DIR}/firmware. Cadangkan folder ini: backup workspace tidak memuat berkas firmware. - Batas unggah
FIRMWARE_MAX_BYTES(bawaan 8 MiB). Reverse proxy harus mengizinkan badan sebesar itu (client_max_body_size); naikkan bila Anda menaikkan batasnya. - Rute publik
GET /api/fw/<token>/<berkas>harus dapat dijangkau dari luar, karena perangkat atau gateway mengunduh lewat sana. Tidak perlu aturan khusus bila seluruh web sudah diteruskan.
Perangkat di belakang gateway
Section titled “Perangkat di belakang gateway”Node yang tidak bisa menjangkau Celestian mengambil firmware dari gateway (fw_url relatif /fw/... berarti http://<gateway>:8080/fw/...). Buat gateway meneruskan /fw/ ke Celestian di nginx gateway:
proxy_cache_path /var/cache/nginx/fw levels=1:2 keys_zone=fw:10m max_size=512m inactive=7d use_temp_path=off;
server { listen 80; location /fw/ { # /fw/<token>/<berkas> → https://<celestian>/api/fw/<token>/<berkas> proxy_pass https://celestian.contoh.id/api/fw/; proxy_ssl_server_name on; proxy_set_header Host celestian.contoh.id; proxy_http_version 1.1; proxy_cache fw; proxy_cache_key $uri; proxy_cache_valid 200 7d; proxy_cache_valid 403 404 1m; }}Uji dari gateway: curl -sI http://127.0.0.1:8080/fw/abc/x.bin harus menjawab 403 dari Celestian (token tak sah), bukan 404 atau galat koneksi. Rules on Device juga butuh bridge gateway yang meneruskan +/rules (turun) serta +/rules/reported dan +/rules/current (naik).