$ aoox

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
Override compose + Traefik bawaan
Butuh
2 record DNS, port 80/443, PROXY_ACME_EMAIL

Sebelum & sesudah

Via IP (default)Via domain
Akseshttp://203.0.113.10:3000https://panel.example.com
APIhttp://203.0.113.10:3001https://api.panel.example.com
Cookie sesitanpa SecureSecure (mengikuti WEB_ORIGIN https)
Webhook GitIP:3001 harus publikURL API yang rapi
Port 3000/3001satu-satunya jalantetap terbuka (akses via IP)

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 80 dan 443 di host kosong.
  • Dua record DNS A ke IP server:
DNS
panel.example.com.       A   203.0.113.10
api.panel.example.com.   A   203.0.113.10

Tunggu sampai dig +short panel.example.com dari luar menjawab IP itu — sertifikat baru bisa terbit setelah DNS benar.

Langkah

  1. Isi variabel domain di .env.dist

    .env.dist
    WEB_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.com
    VariabelKenapa
    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.
  2. Jalankan ulang dengan override domain

    docker compose -f docker-compose.dist.yml -f docker-compose.domain.yml --env-file .env.dist up -d

    docker-compose.domain.yml memasang label Traefik ke service web dan api (router aoox-web / aoox-api + varian -secure, bentuk yang sama dengan domain aplikasi) dan memasukkannya ke network aoox. Compose menolak start bila WEB_DOMAIN/API_DOMAIN kosong.

    Mulai sekarang selalu sertakan kedua file -f pada setiap up/pull. Menjalankan tanpa override akan mencabut label dan domain berhenti dilayani.
  3. Provision reverse proxy (bila belum)

    Login (masih via IP:3000 bila perlu) → Settings → Reverse proxy (Traefik) → provision (owner). Proxy yang sudah ada tapi di-provision tanpa PROXY_ACME_EMAIL harus dihapus dan di-provision lagi agar resolver ACME aktif.

  4. 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, provision 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

GejalaPenyebab & solusi
set WEB_DOMAIN in .env.dist saat upVariabel kosong; compose menolak start.
Domain jalan, lalu hilang setelah updateup -d tanpa -f docker-compose.domain.yml. Selalu sertakan kedua file.
Login berhasil tapi langsung logout / 401WEB_ORIGIN masih http atau beda host — cookie Secure/origin tidak cocok. Samakan, up -d, login ulang.
Terminal: origin not allowedSama seperti di atas: WEB_ORIGIN ≠ URL browser.
Sertifikat default TraefikPROXY_ACME_EMAIL kosong saat provision, DNS belum benar, atau port 80 tertutup. Hapus proxy → provision lagi setelah diperbaiki.
Log/terminal tidak mengalir, halaman lain normalPUBLIC_API_URL tidak bisa dijangkau dari browser (WebSocket diblokir oleh proxy di depan).
Belum tersedia
Satu hostname untuk web+API (path-based); sertifikat wildcard; ganti domain dari UI (masih lewat env + restart).

Langkah berikutnya

Ada yang keliru? Edit halaman ini di GitLab ↗