DocsStack & database
Managed database
Membuat PostgreSQL, MySQL, MariaDB, Redis, Valkey, atau MongoDB per project dan menghubungkannya ke aplikasi.
- Engine
- PostgreSQL · MySQL · MariaDB · Redis · Valkey · MongoDB
- Bentuk
- Container + volume per database
- Hubungkan
- ${{database.<slug>.url}} di env aplikasi
Engine yang didukung
| Engine | Image (tag default) | Port | Bentuk URL internal |
|---|---|---|---|
| PostgreSQL | postgres:16-alpine | 5432 | postgresql://app:pass@host:5432/<db> |
| MySQL | mysql:8 | 3306 | mysql://app:pass@host:3306/<db> |
| MariaDB | mariadb:11 | 3306 | mysql://app:pass@host:3306/<db> |
| Redis | redis:7-alpine | 6379 | redis://:pass@host:6379/0 |
| Valkey | valkey/valkey:8-alpine | 6379 | redis://:pass@host:6379/0 |
| MongoDB | mongo:7 | 27017 | mongodb://app:pass@host:27017/<db>?authSource=admin |
Container mengikuti env resmi image Docker Hub (POSTGRES_*, MYSQL_*, MARIADB_*, --requirepass). Username SQL selalu app; nama database = slug dengan - diganti _. Password acak, disimpan terenkripsi.
redis://, klien Redis apa pun kompatibel).CREATE DATABASE — database baru "ada" begitu punya isi. aoox otomatis menulis satu dokumen placeholder (koleksi _aoox_init) setelah container siap, jadi database utama langsung muncul di daftar (tab Data) tanpa menunggu tulisan pertama dari aplikasi.Varian PostgreSQL
Saat membuat database dengan Engine PostgreSQL, pilih Varian untuk image dengan ekstensi sudah terpasang — protokol, kredensial, backup, dan referensi env tetap sama seperti PostgreSQL polos (hanya image dan tag default yang beda). Ekstensinya diaktifkan otomatis (CREATE EXTENSION IF NOT EXISTS) begitu container siap menerima koneksi.
| Varian | Image (tag default) | Kegunaan |
|---|---|---|
| pgvector | pgvector/pgvector:pg16 | Pencarian similarity vector untuk embedding (AI/ML). |
| PostGIS | postgis/postgis:16-3.4 | Tipe data & query geografis/spasial. |
| TimescaleDB | timescale/timescaledb:latest-pg16 | Data time-series: hypertable, continuous aggregate. |
- Tanpa varian (default) = image
postgrespolos, tanpa ekstensi tambahan. - Ganti varian setelah dibuat tidak didukung dari dashboard — hapus lalu buat ulang (opsional: pulihkan dari backup ke database baru).
- PostGIS dan TimescaleDB sudah mengaktifkan ekstensinya sendiri saat image pertama kali start; aoox tetap memanggil
CREATE EXTENSION IF NOT EXISTSsebagai jaring pengaman (aman diulang, tidak menimbulkan error).
Membuat database
Halaman project → Database baru
Field Keterangan Nama Jadi slug unik (global, bukan per project). Container aoox-db-<slug>, volumeaoox_db_<slug>.Engine Pilih salah satu kartu: PostgreSQL / MySQL / MariaDB / Redis / Valkey / MongoDB. Untuk PostgreSQL, pilih juga Varian (opsional): Polos / pgvector / PostGIS / TimescaleDB. Versi (tag image) Tag Docker Hub. Kosong = default untuk engine dan varian yang dipilih (tampil di bawah kolom dan di tabel atas). Contoh: 17,8.4,7.2.Port host Opsional. Isi hanya kalau perlu koneksi dari luar Docker (laptop, server remote). Aplikasi di host aoox tidak membutuhkannya. Mendengarkan di Default Hanya server ini (127.0.0.1): database tidak bisa dijangkau dari internet dan kamu terhubung lewat SSH tunnel ( ssh -L 5432:127.0.0.1:5432 user@server). Pilih Publik hanya bila harus bisa dijangkau dari mesin lain, dan tutup untuk yang lain di firewall provider: port yang dipublikasikan Docker tidak disaring ufw. Dipilih saat membuat dan tidak bisa diubah nanti (buat ulang database).Batas CPU / memori Opsional; bisa diubah nanti. Tunggu status running
- 01creatingpull image, buat volume & container, lalu tunggu sampai engine menerima login (maksimal 2 menit; mengubah mount, batas resource, atau backup dijawab "masih memulai" selama itu)
- 02runningsiap dipakai; kredensial tersedia
- 03stoppedcontainer berhenti, data tetap
- 04errorprovisioning gagal — lihat pesan
Provisioning berjalan di latar (pull image bisa lama); halaman menyegarkan otomatis selama
creating.Hubungkan ke aplikasi
Di env aplikasi (project yang sama), rujuk dengan referensi — bukan menyalin password:
Env aplikasiDATABASE_URL=${{database.app-db.url}}Deploy (atau rollback) agar container aplikasi baru mendapat nilainya. Bentuk lain (
host,port,username, …) ada di Environment variables.
Koneksi
| Jenis | Host | Siapa yang bisa pakai |
|---|---|---|
| Koneksi internal | aoox-db-<slug> | Container di network aoox: aplikasi, stack compose yang bergabung ke network itu, job. |
| Koneksi eksternal | <ip-server>:<port host> (hanya bila port host diisi) | Laptop, client GUI, aplikasi di server remote. Dengan "Hanya server ini" alamatnya 127.0.0.1 dan hanya server itu sendiri (atau SSH tunnel) yang bisa memakainya; dengan "Publik", amankan lewat firewall provider. |
Tab Ringkasan menampilkan keduanya beserta kredensial (disamarkan, bisa disalin) dan DATABASE_URL siap tempel. Viewer project melihat host, port, database, dan user tetapi tidak pernah password maupun URL-nya, dan tab Data menampilkan nama tabel dan kolom tanpa barisnya (Redis dan Valkey: tidak ada, key adalah data).
Database tambahan di server yang sama
Satu container PostgreSQL/MySQL/MariaDB/MongoDB bisa menampung beberapa database. Di tab Ringkasan, dekat pemilih Koneksi untuk database, owner/admin bisa menekan Tambah database untuk membuat database baru dengan nama [A-Za-z_][A-Za-z0-9_]*, dan menghapus database tambahan lewat ikon tempat sampah di sebelah pemilih (ada dialog konfirmasi; seluruh isinya hilang permanen). Yang dibuat saat provisioning adalah primary dan tidak bisa dihapus. Tab Data tetap punya pemilih database untuk menjelajah.
REPORTS_DB_URL=${{database.app-db.url:reports}}- Host, user, dan password sama — hanya bagian nama database yang berbeda.
- Tab Ringkasan menampilkan Koneksi untuk database per nama bila ada lebih dari satu. Tombol tambah/hapus hanya tampil saat database berjalan.
- Backup punya opsi menyertakan semua database di server (lihat Backup).
- Redis/Valkey tidak punya fitur ini (pakai nomor DB di URL bila perlu).
- MongoDB: database baru dibuat langsung terisi dokumen placeholder, sama seperti database utama.
Operasi
| Aksi | Di mana | Catatan |
|---|---|---|
| Stop / Start | Panel database | Container berhenti; data di volume tetap. Aplikasi yang terhubung akan error sampai start lagi. |
| Batas sumber daya | Kartu Batas sumber daya | Berlaku langsung; mencabut batas = container dibuat ulang (restart singkat). |
| Ganti versi (tag) | — | Belum ada dari UI. Buat database baru, restore backup ke sana. |
| Konfigurasi engine | Tab Mount | File mount ke path config; container di-provision ulang. |
| Hapus | Panel database | Dengan atau tanpa menghapus volume. Daftar backup ikut terhapus. Dengan volume (Hapus dengan data) volume dari mount-nya (termasuk berkas konfigurasi yang tersimpan) dan berkas backup di server beserta salinan S3-nya ikut terhapus; tanpa itu berkasnya dibiarkan di volume backup dan tidak lagi tampil. |
Tab lain
- Data → Data browser: tabel, query, database tambahan.
- Backup → Backup & restore: manual, jadwal, retensi, S3.
- Jobs → perintah terjadwal di container database atau container terpisah dari image engine dengan env
DB_*— Scheduled jobs. - Mount → file konfigurasi engine (
my.cnf,redis.conf) atau volume tambahan — Mount. - Metrik CPU/RAM (sampel 15 detik) di bagian atas panel.
Jebakan umum
| Gejala | Penyebab & solusi |
|---|---|
| Aplikasi: connection refused / ENOTFOUND | Memakai URL eksternal/localhost dari dalam container. Pakai URL internal (nama container) lewat referensi. |
| 400 saat menyimpan env: no database "x" | Slug salah atau database ada di project lain. |
| Status error saat membuat | Tag image tidak ada di Docker Hub, atau port host sudah dipakai. Hapus dan buat ulang. |
| Aplikasi di server remote tidak bisa konek | Database selalu di host aoox. Isi port host + firewall, lalu pakai koneksi eksternal di env (tanpa referensi). |
| Data hilang setelah hapus | Dihapus dengan purge volume. Restore dari backup yang sudah diunduh/S3 ke database baru. |
<koleksi>.find({...}) (baca saja, belum insert/update/ delete/aggregate lewat query box — pakai backup restore atau aplikasi untuk menulis), belum ada tab Struktur/buat koleksi/edit-hapus baris, dan operator extended-JSON seperti {"$oid":"..."} belum diterjemahkan khusus di filter query.Langkah berikutnya
Ada yang keliru? Edit halaman ini di GitHub ↗