DocsMulai
Domain untuk panel
Melayani dashboard dan API aoox lewat domain sendiri dengan HTTPS dari Let's Encrypt, memakai reverse proxy bawaan.
- Hasil
- https://panel.example.com + https://api.panel.example.com
- Cara
- Dashboard/CLI (otomatis) atau override compose manual — Traefik bawaan
- Butuh
- 2 record DNS, port 80/443, PROXY_ACME_EMAIL
Sebelum & sesudah
| Via IP (default) | Via domain | |
|---|---|---|
| Akses | http://203.0.113.10:3000 | https://panel.example.com |
| API | http://203.0.113.10:3001 | https://api.panel.example.com |
| Cookie sesi | tanpa Secure | Secure (mengikuti WEB_ORIGIN https) |
| Webhook Git | IP:3001 harus publik | URL API yang rapi |
| Port 3000/3001 | satu-satunya jalan | tetap terbuka (akses via IP), atau ditutup lewat opsi di bawah |
Dua hostname dibutuhkan karena browser memanggil API secara langsung (Socket.IO untuk terminal & log) — bukan lewat web.
Prasyarat
- aoox sudah berjalan via IP (Instalasi) dan kamu bisa login.
- Port
80dan443di host kosong. - Dua record DNS
Ake IP server:
panel.example.com. A 203.0.113.10
api.panel.example.com. A 203.0.113.10Tunggu sampai dig +short panel.example.com dari luar menjawab IP itu — sertifikat baru bisa terbit setelah DNS benar.
Lewat dashboard atau CLI (tanpa SSH)
Cara tercepat: isi INSTALL_DIR sekali di .env.dist (path absolut folder yang berisi docker-compose.dist.yml di server ini), lalu domain bisa diganti kapan saja tanpa SSH. Reverse proxy (Traefik) tidak perlu diaktifkan manual dulu — kalau belum jalan saat domain disimpan, panel akan menyalakannya otomatis (lihat Proxy & domain untuk detail Traefik itu sendiri).
Isi INSTALL_DIR lalu restart stack
.env.distINSTALL_DIR=/opt/aoox # path absolut folder docker-compose.dist.yml di host inidocker compose -f docker-compose.dist.yml --env-file .env.dist up -dSettings → Domain panel (owner)
Isi domain dashboard, domain API, dan email ACME, lalu Simpan & terapkan. Panel menulis
docker-compose.override.ymllewat container helper dan menjalankan ulangdocker compose up -d— koneksi ke dashboard sempat terputus beberapa detik saat containerweb/apidi-recreate, itu wajar. Kalau proxy belum pernah diaktifkan, muncul peringatan bahwa proxy baru saja dinyalakan otomatis, plus tiga hal yang tetap perlu dicek manual sebelum domain benar-benar bisa diakses — lihat Jebakan umum.Atau dari CLI
aoox domain set --web panel.example.com --api api.panel.example.com \ --acme-email kamu@example.comMemanggil endpoint yang sama (termasuk peringatan proxy di atas kalau berlaku), untuk operator yang lebih suka terminal.
docker-compose.override.yml kalau file utamanya bernama persis docker-compose.yml — karena stack ini memakai -f docker-compose.dist.yml secara eksplisit, override tidak otomatis ikut kecuali disebut juga. Panel (dan aoox update panel) sudah menyertakannya sendiri secara internal; ini hanya relevan kalau kamu menjalankan docker compose up/pull manual lewat SSH setelah set domain dari dashboard — tambahkan -f docker-compose.override.yml juga, atau domain yang sudah diset akan hilang.Hanya izinkan akses lewat domain (opsional)
Port 3000 dan 3001 secara default terbuka di semua interface, jadi dashboard juga menjawab di IP:3000. Klien bisa memanggil port web langsung dengan header X-Forwarded-For buatannya sendiri, yang melewati batas percobaan login per IP. Aktifkan Hanya izinkan akses lewat domain di Settings → Domain panel (atau jalankan aoox domain set --web … --api … --domain-only) dan kedua port hanya mendengarkan di 127.0.0.1, sehingga semua akses dari luar lewat Traefik. Default-nya mati, dan butuh domain dashboard sekaligus domain API: CLI, webhook, dan socket terminal/log memakai domain API begitu port 3001 ditutup.
https://panel.example.com terbuka. Kalau DNS, firewall, atau sertifikat rusak sesudahnya, panel tidak bisa dijangkau sama sekali dan IP:3000 tidak lagi berfungsi. Pulihkan lewat SSH: di folder instalasi hapus dua baris ports: di docker-compose.override.yml, lalu jalankan docker compose -f docker-compose.dist.yml -f docker-compose.override.yml --env-file .env.dist up -d. Override memakai tag Compose !override, yang butuh Docker Compose 2.24.4 atau lebih baru untuk perintah yang kamu jalankan manual (panel sendiri menerapkannya dengan Compose-nya yang lebih baru). Mematikan opsi ini di dashboard menulis ulang file tanpa baris itu. Karena itu pula aoox reinstall berhenti sebelum mengubah apa pun bila file itu memakai tag tersebut dan Compose di host lebih lama dari 2.24.4: upgrade plugin Compose, atau matikan opsinya di dashboard dulu.Menghapus domain
Untuk kembali ke akses lewat IP biasa, pakai Hapus domain di Settings → Domain panel (owner, dengan konfirmasi) atau jalankan aoox domain clear (--yes melewati pertanyaan). Panel menghapus domain yang tersimpan, mematikan Hanya izinkan akses lewat domain, menghapus docker-compose.override.yml, mengembalikan WEB_ORIGIN dan PUBLIC_API_URL ke http://<PUBLIC_IP>:3000 / :3001 di .env.dist, lalu membuat ulang container web dan api tanpa override. Setelah restart (beberapa detik) domain lama tidak lagi berfungsi: buka dashboard lagi di http://<IP server>:3000 dan masuk ulang. Reverse proxy, domain aplikasi, dan email ACME tidak diubah. Seperti saat menyimpan domain, ini butuh INSTALL_DIR (400 bila kosong) dan Docker daemon yang berjalan (502 bila tidak).
Manual lewat SSH
Alternatif bila INSTALL_DIR belum/tidak ingin diisi, atau ingin kendali penuh atas file compose.
Isi variabel domain di .env.dist
.env.distWEB_DOMAIN=panel.example.com API_DOMAIN=api.panel.example.com PROXY_ACME_EMAIL=kamu@example.com PROXY_ACME_STAGING=false # true saat uji coba # ganti keduanya ke https + domain di atas WEB_ORIGIN=https://panel.example.com PUBLIC_API_URL=https://api.panel.example.comVariabel Kenapa WEB_DOMAIN/API_DOMAINHost untuk label Traefik di service web dan api. WEB_ORIGINHarus sama persis dengan URL di browser: cookie sesi mendapat flag Secure mengikutinya, dan gateway terminal/log menolak Origin lain. PUBLIC_API_URLURL API yang dipanggil browser dan provider webhook. PROXY_ACME_EMAILMengaktifkan resolver Let's Encrypt; tanpa ini tidak ada HTTPS dan tidak ada redirect. Jalankan ulang dengan override domain
docker compose -f docker-compose.dist.yml -f docker-compose.domain.yml --env-file .env.dist up -ddocker-compose.domain.ymlmemasang label Traefik ke servicewebdanapi(routeraoox-web/aoox-api+ varian-secure, bentuk yang sama dengan domain aplikasi) dan memasukkannya ke networkaoox. Compose menolak start bilaWEB_DOMAIN/API_DOMAINkosong.Mulai sekarang selalu sertakan kedua file-fpada setiapup/pull. Menjalankan tanpa override akan mencabut label dan domain berhenti dilayani.Aktifkan reverse proxy (bila belum)
Login (masih via IP:3000 bila perlu) → Settings → Reverse proxy (Traefik) → aktifkan (owner). Proxy yang sudah ada tapi diaktifkan tanpa
PROXY_ACME_EMAILharus dihapus dan diaktifkan lagi agar resolver ACME aktif.Buka https://panel.example.com
Sertifikat diminta saat host pertama kali diakses (± beberapa detik). Login ulang — sesi lama (cookie tanpa Secure di origin IP) tidak berlaku di origin baru.
Verifikasi
curl -I https://panel.example.com # 200, issuer Let's Encrypt
curl -I http://panel.example.com # 301 → https
curl -s https://api.panel.example.com/auth/setup-status # {"needsSetup":false}- Terminal web bisa dibuka tanpa pesan origin not allowed.
- Log realtime di tab Deploy mengalir (Socket.IO ke
PUBLIC_API_URL). - Webhook URL di tab Webhook aplikasi kini berawalan
https://api.panel.example.com/webhooks/….
Variasi
Uji coba dulu dengan staging
PROXY_ACME_STAGING=true memakai CA staging Let's Encrypt (tanpa rate limit; sertifikat tidak dipercaya browser). Setelah yakin DNS dan port benar, ganti ke false, hapus proxy, aktifkan lagi — volume ACME akan meminta sertifikat produksi.
Di belakang Cloudflare
- Mode SSL Full (strict); Flexible menyebabkan redirect loop.
- Saat pertama menerbitkan sertifikat, set kedua record ke DNS only.
- WebSocket (terminal, log) didukung Cloudflare; pastikan tidak diblokir oleh aturan.
Reverse proxy sendiri (nginx/Caddy di depan)
Tidak perlu docker-compose.domain.yml: arahkan proxy-mu ke :3000 dan :3001, aktifkan WebSocket upgrade, dan tetap set WEB_ORIGIN/PUBLIC_API_URL ke URL publik https. Bila TLS di-terminate di proxy-mu dan ke aoox lewat http, set COOKIE_SECURE=true agar cookie tetap Secure.
Jebakan umum
| Gejala | Penyebab & solusi |
|---|---|
| set WEB_DOMAIN in .env.dist saat up | Variabel kosong; compose menolak start. |
| Domain jalan, lalu hilang setelah update | up -d tanpa -f docker-compose.domain.yml. Selalu sertakan kedua file. |
| Login berhasil tapi langsung logout / 401 | WEB_ORIGIN masih http atau beda host — cookie Secure/origin tidak cocok. Samakan, up -d, login ulang. |
| Terminal: origin not allowed | Sama seperti di atas: WEB_ORIGIN ≠ URL browser. |
| Sertifikat default Traefik | PROXY_ACME_EMAIL kosong saat diaktifkan, DNS belum benar, atau port 80 tertutup. Hapus proxy → aktifkan lagi setelah diperbaiki. |
| Log/terminal tidak mengalir, halaman lain normal | PUBLIC_API_URL tidak bisa dijangkau dari browser (WebSocket diblokir oleh proxy di depan). |
| Domain sudah disimpan, DNS & firewall OS (ufw) sudah benar, tapi browser "unable to connect" | Cek docker ps --filter name=aoox-proxy — kalau tidak muncul, proxy belum jalan (dashboard/CLI sekarang otomatis menyalakannya saat domain disimpan, tapi apply yang lama sebelum fitur ini tidak). Kalau proxy sudah Up tapi tetap gagal, port 80/443 kemungkinan diblokir firewall/security group provider VPS — ufw inactive hanya berarti firewall level OS tidak memblokir, bukan jaminan port terbuka ke publik. |
docker compose up gagal setelah domain diganti.Langkah berikutnya
Ada yang keliru? Edit halaman ini di GitHub ↗