$ aoox

DocsInfrastruktur

Registry

Registry lokal tempat image hasil build disimpan (prasyarat deploy), registry eksternal, dan pemeliharaan disk.

Registry lokal
Wajib — tempat image hasil build
Registry eksternal
Kredensial untuk registry lain
Pemeliharaan
Retensi per aplikasi + cleanup malam

Peran registry dalam deploy

  1. 01buildimage dibuat oleh daemon Docker
  2. 02push → localhost:5000/<project>/<app>:<id>
  3. 03runcontainer dibuat dari image itu
  4. 04rollbackimage lama ditarik lagi dari registry

Setiap deploy mem-push image ke registry lokal dan rollback menariknya kembali dari sana. Karena itu registry harus diaktifkan sebelum deploy pertama — tanpa itu deploy gagal dengan pesan No self-hosted registry. Aplikasi di server remote tidak memakai registry (image tetap di daemon server).

Registry lokal

  1. Menu Registry → tab Registry lokal → Aktifkan registry (owner)

    aoox menjalankan registry:3 sebagai container aoox-registry dengan autentikasi htpasswd, data di volume aoox_registry_data, dan penghapusan tag diaktifkan. Kartu menampilkan status Registry siap, container, dan URL.

    Sebelum diaktifkan, pilih tempat penyimpanan image: Lokal (disk VPS, default) atau salah satu tujuan S3 yang sudah ditambahkan di Backup instance. Tidak bisa diganti setelahnya tanpa hapus lalu aktifkan ulang.

  2. Simpan kredensialnya

    Username aoox dan password acak ditampilkan saat registry diaktifkan — klik Sudah saya simpan setelah mencatatnya. Deploy dari dashboard tidak membutuhkannya; kredensial ini untuk push manual dari mesin lain. Kalau terlupa, owner dan admin bisa menampilkannya lagi, dan owner bisa meresetnya tanpa kehilangan image.

Push manual dari host
docker login localhost:5000 -u aoox
docker tag myimage:latest localhost:5000/tools/myimage:1.0
docker push localhost:5000/tools/myimage:1.0
Env (.env.dist)DefaultKeterangan
REGISTRY_PORT5000Port host registry.
REGISTRY_PUBLISH_ADDRESSkosong (127.0.0.1)Antarmuka jaringan yang didengarkan port host. Default-nya membuat registry hanya bisa dijangkau dari server ini; isi 0.0.0.0 agar mesin lain bisa push lewat IP (lihat di bawah).
REGISTRY_PUBLIC_HOSTlocalhostHost yang dipakai docker push saat tanpa domain kustom (lihat di bawah). localhost dikecualikan dari aturan insecure-registry Docker; host lain butuh TLS (reverse proxy) atau entri insecure-registries di daemon.json setiap daemon yang mem-push.

Siapa yang bisa menjangkau port 5000

Mulai 0.1.0-alpha.13 port host registry di-bind ke 127.0.0.1 secara default, jadi hanya server ini yang bisa push ke localhost:5000 (deploy, docker push dari host sendiri, dan panel tidak terpengaruh: API menjangkau registry lewat jaringan internal aoox). Sebelumnya port itu mendengarkan di semua antarmuka, sehingga registry berpassword terbuka ke internet lewat HTTP biasa. Kartu menampilkan hanya server ini di samping alamat selama itu berlaku. Untuk push dari mesin lain, pilih salah satu:

  • Beri domain kustom (disarankan, di bawah): HTTPS lewat proxy, tidak ada port lain yang perlu dibuka.
  • Buka port lewat IP: isi REGISTRY_PUBLISH_ADDRESS=0.0.0.0 di .env.dist, restart stack (docker compose ... up -d), lalu buat ulang container registry (aktifkan ulang, atau terapkan/hapus domain kustom). Kartu lalu menampilkan alamat yang dipakai mesin lain (REGISTRY_PUBLIC_HOST atau IP publik server ini). Ini HTTP biasa, jadi mesin-mesin itu perlu mencantumkan alamatnya di insecure-registries, dan password adalah satu-satunya penghalang antara registry dan internet — lebih baik pakai domain.
Memperbarui instalasi yang sudah ada
Binding hanya berubah saat container registry dibuat ulang. Setelah memperbarui aoox, registry yang sudah ada tetap mendengarkan di semua antarmuka sampai kamu mengaktifkannya ulang atau menerapkan/menghapus domain kustomnya. Selama itu kartu menampilkan alamat yang bisa dijangkau mesin lain. Membuat ulang tidak menghapus data dan kredensial. Kalau kamu push ke IP:5000 dari laptop atau CI, itu berhenti bekerja setelahnya kecuali port dibuka seperti di atas atau beralih ke domain.

Domain kustom

Alternatif dari REGISTRY_PUBLIC_HOST + insecure-registries manual: arahkan registry lewat reverse proxy bawaan (Traefik) dengan sertifikat Let's Encrypt asli — docker push/login langsung percaya tanpa konfigurasi tambahan di daemon mana pun, termasuk node lain di Swarm.

  • Butuh proxy sudah diaktifkan (lihat Proxy & domain) dengan PROXY_ACME_EMAIL terisi.
  • Isi field Domain kustom di kartu Registry lokal (owner/admin) lalu Terapkan — container di-recreate dengan label Traefik (router aoox-registry), data & kredensial tidak berubah. Bisa juga lewat CLI:
aoox registry domain --set registry.example.com

Setelah domain aktif, docker login registry.example.com (tanpa port — HTTPS standar). Port host tetap di-bind sesuai pengaturan di atas (loopback secara default). Hapus domain dengan aoox registry domain --clear atau tombol Hapus domain di dashboard.

Menampilkan atau mereset password

  • Tampilkan password (ikon mata di kartu Registry lokal, owner dan admin) membaca lagi password yang tersimpan; tersembunyi sendiri setelah semenit dan setiap penampilan tercatat di audit log.
  • Reset password (owner) membuat password baru, menulis ulang file login registry, dan me-restart container sebentar. Image tidak disentuh. Setiap klien dan job CI yang memakai password lama harus menjalankan docker login lagi. Kalau ada yang gagal di tengah jalan, password lama tetap berlaku.
  • Lewat CLI: aoox registry password --show atau aoox registry password --reset --yes.

Melihat & membersihkan isi

  • Tab Registry lokal menampilkan repository → tag beserta digest dan ukuran. Nama repository = <project-slug>/<app-slug>.
  • Hapus tag = hapus manifest. Tag lain yang menunjuk digest sama ikut hilang — UI memperingatkan.
  • Garbage collect (owner) mengembalikan ruang disk setelah tag dihapus — dijalankan di dalam container registry yang sedang berjalan; ada mode dry run untuk melihat apa yang akan dihapus.
  • Hapus image (tombol di header tiap repository) membuang repository itu sepenuhnya, bukan cuma satu tag: semua tag & manifest-nya, foldernya di storage, lalu garbage collect otomatis — beda dari hapus tag satu-satu, dan ini yang dibutuhkan kalau sebuah repository menunjukkan “0 tag” tapi tidak mau hilang dari daftar walau garbage collect sudah dijalankan berkali-kali (garbage collect hanya membuang blob yang tidak terpakai, tidak pernah folder repository itu sendiri). Dialog konfirmasinya menampilkan aplikasi mana saja yang “current image”-nya tampak berasal dari repository ini — rollback atau redeploy tanpa build ke image itu akan gagal setelah dihapus.
  • Menghapus tag yang masih dipakai container berjalan tidak menghentikannya, tapi rollback ke versi itu tidak lagi bisa.
  • Hapus registry (owner) menghentikan container; volume data ditanyakan. Deploy tidak bisa dilakukan sampai diaktifkan lagi.

Pemeliharaan disk

Supaya disk tidak penuh oleh image lama, aoox punya cleanup otomatis yang berjalan tiap malam pukul 04:30 (zona waktu server, UTC kecuali kamu mengisi TZ) dan bisa dipicu manual.

Yang dibersihkanAturan
Deployment lama per aplikasiField Riwayat deployment di Pengaturan aplikasi (default 10): deployment sukses di luar jumlah ini dipangkas, image-nya dihapus lokal dan dari registry. Image yang sedang dipakai tidak pernah disentuh.
Deployment gagal/queuedBaris (log saja) lebih tua dari 30 hari dihapus.
Dangling image & build cacheDihapus di daemon lokal — tidak menyentuh image aplikasi.
RegistryGarbage collect dijalankan setelah pemangkasan.
  1. Docker → strip disk dan Detail

    Strip di atas halaman Docker (host dipilih) menampilkan total pemakaian dan yang bisa dibebaskan; Detail menampilkan pemakaian image, container, volume, build cache, berapa yang bisa direklamasi, jumlah deployment yang bisa dipangkas, dan laporan cleanup terakhir.

  2. Bersihkan sekarang (owner)

    Menjalankan siklus yang sama secara on-demand. Laporan: deployment dipangkas, image dihapus, byte direklamasi, status GC registry, dan error bila ada.

Menurunkan Riwayat deployment mengurangi pilihan rollback. Untuk aplikasi penting, pertahankan ≥ 5; pemangkasan baru terjadi pada cleanup berikutnya.

Registry eksternal

Tab Registry eksternal → Tambah registry (owner/admin): daftarkan kredensial Docker Hub, GHCR, GitLab, dsb.

FieldContoh
NamaGHCR perusahaan
URLghcr.io
Username / Password / tokenToken dengan akses baca (dan tulis bila perlu); disimpan terenkripsi
Image prefixOpsional, mis. myorg → image dirujuk sebagai <url>/<prefix>/<app>
Belum dipakai pipeline
Saat ini pipeline deploy selalu mem-push ke registry lokal; registry eksternal baru bisa didaftarkan dan dites koneksinya. Dukungan men-deploy dari image di registry eksternal sedang dikerjakan.

Jebakan umum

GejalaPenyebab & solusi
Deploy gagal: No self-hosted registryAktifkan registry lokal dulu.
Push manual: http: server gave HTTP response to HTTPS clientREGISTRY_PUBLIC_HOST bukan localhost tanpa TLS. Tambahkan ke insecure-registries atau pasang reverse proxy TLS.
Disk tetap penuh setelah hapus tagJalankan Garbage collect, atau Bersihkan sekarang di strip disk di atas halaman Docker.
Repository “0 tag” tidak hilang walau sudah Garbage collectGarbage collect tidak pernah menghapus repository itu sendiri, hanya blob yang tidak terpakai. Pakai tombol Hapus image di header repository tersebut.
Rollback gagal: image not foundTag sudah dipangkas oleh retensi atau dihapus manual. Deploy ulang commit tersebut.
Kartu Registry: Docker tidak terjangkauDOCKER_GID salah atau socket tidak di-mount — lihat Troubleshooting.

Langkah berikutnya

Ada yang keliru? Edit halaman ini di GitHub ↗