DocsAplikasi
Membuat aplikasi
Menghubungkan repo Git atau image siap pakai ke sebuah project dan mengatur bagaimana container-nya dijalankan.
- Waktu
- ± 3 menit + durasi build
- Butuh
- Registry lokal (sumber Git) atau image
- Hasil
- Container berjalan dari branch pilihanmu
Prasyarat
- Untuk aplikasi dari repo Git: registry lokal sudah diaktifkan — image hasil build di-push ke sana. Tanpa ini deploy pertama gagal.
- Sudah ada project tempat aplikasi ini akan tinggal.
- Untuk repo privat: kredensial Git sudah ditambahkan di Settings.
- Aplikasi listen di port yang tetap dan menerima koneksi dari
0.0.0.0, bukan hanyalocalhost.
Dua sumber aplikasi
| Sumber | Yang diisi | Alur deploy |
|---|---|---|
| Git repository | URL repo, branch, kredensial (bila privat), cara build | Clone → build (Dockerfile / Nixpacks / statis) → push ke registry → jalankan. |
| Image siap pakai (di-pull) | Referensi image (ghcr.io/acme/api:1.4) dan, bila privat, registry eksternal yang menyimpan kredensialnya | Tanpa build: image ditarik lalu dijalankan. Bisa update otomatis saat digest tag berubah. |
Registry lokal hanya wajib untuk sumber Git (tempat image hasil build disimpan). Aplikasi dari image tidak memerlukannya.
Langkah
Di halaman project, klik Aplikasi baru
Isi form. Sebagian besar bisa diubah lagi nanti di tab Pengaturan.
Field Keterangan Nama Jadi slug unik (app_name); nama container = aoox-app-<slug>, ditampilkan (dengan tombol salin) di header aplikasi; aplikasi lain di server yang sama mengaksesnya lewat http://aoox-app-<slug>:<port container>. Git repository URL https repo. Tanpa user:token di URL — pakai select Kredensial Git untuk repo privat. Branch Branch yang di-build. Webhook hanya bereaksi pada push ke branch ini. Kredensial Git Tidak ada (repo publik) atau salah satu kredensial tersimpan. Cara build Dockerfile atau Nixpacks — lihat Cara build. Port container Port yang di-listen aplikasi di dalam container (mis. 3000). Port host Opsional. Isi kalau mau akses lewat IP:port tanpa domain. Kosongkan bila memakai domain — blue/green butuh port host kosong. Mendengarkan di Hanya bila ada port host. Publik (default aplikasi) mempublikasikannya di semua interface; Hanya server ini (127.0.0.1) membuatnya hanya bisa dijangkau dari server itu sendiri atau lewat SSH tunnel. Port yang dipublikasikan Docker melewati ufw, jadi untuk yang publik pakai firewall provider (lihat Mulai dari VPS baru). Mengubahnya membuat ulang aplikasi yang berjalan, seperti port host baru. Tidak tersedia untuk service Swarm. Health check path Opsional tapi disarankan, mis. /health. Menentukan sukses/gagal deploy dan mengaktifkan blue/green.Server Host aoox (default) atau server remote. Hanya tampil bila ada server terdaftar. Mode deploy container (default) atau service dengan replika bila Swarm aktif — beserta penempatan node dan setelan rolling update. Update otomatis Hanya untuk sumber image: cek digest tag secara berkala dan deploy saat berubah. Batas CPU / memori Opsional. Lihat Monitoring. Contoh pengisian — aplikasi Next.js di repo publik- Nama
- shop
- Git repository
- https://github.com/acme/shop
- Branch
- main
- Kredensial Git
- Tidak ada (repo publik)
- Cara build
- Nixpacks
- Port container
- 3000
- Port host
- (kosong — pakai domain)
- Health check path
- /health
Pilih Akses
Sebelum menyimpan, form meminta cara aplikasi ini akan bisa diakses — supaya aplikasi baru tidak diam-diam tidak bisa dibuka begitu deploy selesai.
Opsi Yang terjadi IP + port Port host diisi otomatis (dicek dulu bentrok dengan port aplikasi/database/stack compose/container lain sebelum disimpan) — langsung bisa diakses di http://<ip-server>:<port>.Domain Host + toggle HTTPS langsung ditambahkan saat ini juga, bukan belakangan lewat tab Domain. Kalau reverse proxy belum pernah diaktifkan, ia dinyalakan otomatis — perilaku yang sama dengan set domain panel, lihat Domain untuk panel → Lewat dashboard. Nanti saja Tanpa port maupun domain. Aplikasi tetap ter-deploy, tapi belum bisa diakses sampai salah satunya ditambahkan lewat tab Pengaturan atau Domain. Simpan, lalu isi Environment variables (bila perlu)
Tab Environment → editor env, satu
KEY=VALUEper baris. Nilai diterapkan saat container dibuat, bukan saat build — lihat Environment variables.Buka tab Deploy dan klik Deploy
Yang terjadi, dan terlihat di log realtime:
queued deployment dibuat building daemon Docker clone repo → build image pushing image → registry lokal (dilewati di server remote) starting container baru dibuat, tunggu healthy success container lama diganti · status aplikasi RunningDeploy berikutnya menolak (409) selama masih ada deployment aktif. Gagal build/push tidak menyentuh container yang sedang berjalan. Detail di Deploy & rollback.
Verifikasi
- Deployment pertama berakhir
successdan badge status aplikasi Running. - Log container (tab Deploy) menampilkan output aplikasi, mis.
Listening on :3000. - Bila memakai port host:
curl http://<ip-server>:<port-host>/menjawab. Bila memakai domain: lanjut ke Proxy & domain.
Tab di halaman aplikasi
| Tab | Isi |
|---|---|
| Deploy | Tombol Deploy/Stop/Start, daftar deployment, log deployment & log container streaming, metrik, Rollback. |
| Pengaturan | Form yang sama dengan saat membuat, plus Build args (Environment punya tab sendiri). Port host, domain, dan limit resource berlaku langsung pada aplikasi yang berjalan — container dibuat ulang dari image yang sama tanpa build (dengan Port host ada downtime singkat, karena dua container tidak bisa memakai port yang sama). Aplikasi yang sedang berhenti memakai port barunya saat dijalankan lagi, dan perubahan Port host ditolak (409) selama ada deployment aktif. Pengaturan lain berlaku pada deploy berikutnya. Juga memuat kartu Mode perawatan. |
| Domain | Hostname untuk aplikasi + toggle HTTPS + cek DNS. |
| Mount | Volume, bind, file — dan backup volume. |
| Environment | Variabel env aplikasi, disimpan sendiri, plus sumber secret (Infisical). Juga kartu Set variabel: environment set yang ditautkan aplikasi ini secara berurutan, sumber ${{vars.KEY}} (lihat Variabel). Berlaku pada deploy berikutnya. |
| Jobs | Perintah terjadwal. |
| Webhook | URL webhook, secret, dan preview pull request. |
| Console | Shell interaktif langsung ke dalam container yang berjalan. |
Console
Tab Console membuka docker exec -it ke dalam container aplikasi yang sedang berjalan, langsung dari dashboard — berbeda dari halaman Terminal yang membuka shell di host lewat SSH. Cocok untuk memeriksa file, menjalankan perintah debug, atau mengecek environment tanpa perlu akses SSH ke server.
- Akses: role project developer ke atas (termasuk admin/owner platform) — viewer tidak melihat tab ini sama sekali, dan API menolaknya juga bila dicoba langsung. Token API
read-onlyjuga ditolak. - Tercatat di audit log — setiap pembukaan sesi console adalah baris tersendiri di Settings → Audit log, dengan siapa dan kapan.
- Mode service (Swarm) dengan lebih dari satu replika: pilih task lewat dropdown yang muncul di atas terminal; hanya task yang berjalan di node ini yang bisa dijangkau.
- Shell yang dipakai:
bashbila tersedia di image, kalau tidaksh. Image distroless/tanpa shell sama sekali akan menampilkan pesan error dari Docker sendiri lalu sesi langsung berakhir — bukan bug, memang tidak ada shell untuk dibuka. - Perubahan di dalam shell ini bersifat sementara: file yang diubah lewat Console hilang saat aplikasi di-redeploy, kecuali disimpan di volume yang di-mount.
Deteksi error di log
Tiap menit, API memindai log container aplikasi yang sedang Running untuk pola error umum (traceback, panic, exception, level=error, dan sejenisnya) dan mengirim notifikasi Error aplikasi kalau ditemukan — lihat Notifikasi untuk detail pola, cooldown, dan cara menyalakannya (nonaktif secara default, per channel).
Untuk aplikasi yang output normalnya memang terlihat seperti error (mis. framework yang verbose), nyalakan Abaikan error di log di tab Pengaturan — aplikasi itu dilewati sepenuhnya dari pemindaian, tidak cuma dibisukan.
Mode perawatan
Tampilkan halaman perawatan kepada pengunjung sebagai ganti aplikasi, tanpa menghentikannya. Ini kartu pertama di tab Pengaturan, bernama Mode perawatan.
- Sakelar Aktif berlaku langsung dan tidak me-restart atau membuat ulang container: yang berubah hanya routing Traefik. Selama aktif, strip status menampilkan lencana Maintenance.
- Setiap permintaan ke semua domain aplikasi mendapat halaman itu dengan HTTP
503danRetry-After: 300(5 menit), sehingga mesin pencari dan monitor melihatnya sebagai gangguan sementara. Termasuk domain HTTPS dengan sertifikat kustom, dan middleware Anda tetap berjalan di depannya. - Pesan halaman: teks biasa, maksimal 280 karakter, dengan tombol Simpan pesan sendiri; kosongkan untuk teks standar. Selalu ditampilkan sebagai teks, bukan HTML. Halamannya sendiri berbahasa Inggris.
- Deploy saat mode ini aktif tidak menghilangkan halamannya. Domain yang ditambah atau dihapus saat aktif otomatis ikut tercakup atau dilepas. Mematikannya langsung mengembalikan aplikasi.
- Developer ke atas bisa menyalakannya; viewer melihat kartu ini tanpa bisa mengubah.
IP:port): hanya domain yang dimasukkan ke mode perawatan.- Aplikasi di server remote belum didukung: kartu memberi tahu hal ini dan API menolaknya (400).
- Aplikasi tidak bisa dipindah ke server lain saat dalam mode perawatan (409); matikan dulu.
- Ekspor/impor project tidak membawa flag ini, jadi aplikasi hasil impor tidak pernah mulai dalam mode perawatan.
Jebakan umum
| Gejala | Penyebab & solusi |
|---|---|
| Monorepo: build tidak menemukan package.json / Dockerfile | Isi Root directory (mis. apps/web) di bagian Git. Lihat Cara build. |
| Deploy gagal di tahap pushing | Registry lokal belum diaktifkan, atau REGISTRY_PUBLIC_HOST bukan localhost tanpa TLS. |
| Build gagal: repository not found | Repo privat tanpa Kredensial Git, atau token tidak punya akses baca. |
| Pull gagal: unauthorized (sumber image) | Image privat tanpa registry eksternal terpilih, atau token registry kedaluwarsa. |
| Health check tidak pernah healthy | Port container tidak cocok dengan port yang di-listen, aplikasi hanya listen di 127.0.0.1, path tidak menjawab 2xx, atau image tidak punya wget/curl/node/python3. |
| Running tapi domain 404 | Container belum healthy, atau DNS belum mengarah — pakai tombol cek DNS di tab Domain. |
| Env baru tidak berlaku | Env diterapkan saat container dibuat — deploy (atau rollback) sekali lagi. |
Langkah berikutnya
Ada yang keliru? Edit halaman ini di GitHub ↗