11 KiB
Rencana Migrasi: databaselist → Geonet Console
Tanggal: 2026-06-11
Target production: https://console.gisportal.id
Prinsip: tanpa downtime — stack lama tetap jalan sampai stack baru terverifikasi.
Ringkasan perubahan
| Aspek | Saat ini | Setelah migrasi |
|---|---|---|
| Nama produk | DatabaseList | Geonet Console |
| Subdomain utama | databaselist.gisportal.id |
console.gisportal.id |
| Folder repo lokal | databaselist/ |
geonet-console/ |
| Stack server | /opt/stacks/databaselist/ |
/opt/stacks/geonet-console/ |
| Image Docker | databaselist:latest |
geonet-console:latest |
| Container app | databaselist |
geonet-console |
| Container DB | databaselist-audit |
geonet-console-audit |
| Port host | 127.0.0.1:8091 |
127.0.0.1:8091 (tetap) |
| DB app | databaselist_app |
geonet_console_app (opsional, lihat Fase 3) |
| DB audit | databaselist_audit |
geonet_console_audit (opsional) |
| Volume Docker | databaselist_audit_pg_data, databaselist_app_storage |
reuse volume lama via external: true |
Subdomain lama databaselist.gisportal.id → 301 redirect ke console.gisportal.id (minimal 90 hari).
Diagram alur (zero-downtime)
Fase 1 — Dual hostname, satu backend
User ──► console.gisportal.id ──┐
User ──► databaselist.gisportal.id ──┼──► nginx ──► 127.0.0.1:8091 ──► container databaselist
(keduanya hidup)
Fase 2 — Stack baru, volume sama
nginx ──► 127.0.0.1:8091 ──► container geonet-console (volume lama di-mount)
Fase 3 — Redirect & cleanup
databaselist.gisportal.id ──301──► console.gisportal.id
hapus container/image lama
Fase 0 — Persiapan (lokal, tanpa sentuh production)
0.1 Backup production
ssh -m hmac-sha1 root@10.100.1.24 -p 22 @"
cd /opt/stacks/databaselist
cp .env /opt/stacks/databaselist/.env.bak.`$(date +%Y%m%d)
docker compose exec -T audit-postgres pg_dumpall -U audit > /tmp/databaselist-pg-backup.sql
docker volume ls | grep databaselist
"@
Catat nama volume (biasanya):
databaselist_audit_pg_datadatabaselist_app_storage
0.2 Rename folder repo lokal
cd "d:\Project\app on git\server-connection"
git mv databaselist geonet-console # atau rename manual jika belum git commit
0.3 Perubahan file di repo (search & replace terarah)
| File | Perubahan |
|---|---|
geonet-console/compose.yaml |
service/image/container name, komentar Dockge |
geonet-console/.env.example |
APP_NAME, APP_URL, default DB names |
geonet-console/DOCKGE.md |
URL, path stack |
geonet-console/nginx/databaselist.conf |
rename → geonet-console.conf, server_name, upstream |
scripts/deploy-databaselist.ps1 |
rename → deploy-geonet-console.ps1 |
readme.txt, database.txt |
referensi URL |
server/*.txt |
audit docs |
Jangan rename database PostgreSQL di Fase 0 — data tetap di volume lama.
0.4 Contoh compose.yaml (stack baru, volume lama)
services:
audit-postgres:
image: postgres:16-alpine
container_name: geonet-console-audit
# ... env sama ...
volumes:
- audit_pg_data:/var/lib/postgresql/data
- ./docker/postgres-init:/docker-entrypoint-initdb.d:ro
geonet-console:
build: .
image: geonet-console:latest
container_name: geonet-console
ports:
- "127.0.0.1:8091:80"
volumes:
- app_storage:/var/www/html/storage
- ./database:/var/www/html/database
volumes:
audit_pg_data:
external: true
name: databaselist_audit_pg_data # volume production yang sudah ada
app_storage:
external: true
name: databaselist_app_storage
0.5 Contoh nginx baru (geonet-console/nginx/geonet-console.conf)
upstream geonet_console_backend {
server 127.0.0.1:8091;
keepalive 8;
}
server {
listen 80;
server_name console.gisportal.id;
return 301 https://console.gisportal.id$request_uri;
}
server {
listen 443 ssl;
server_name console.gisportal.id;
include /etc/nginx/conf.d/ssl.conf;
# ... header security sama seperti databaselist.conf ...
location / {
proxy_pass http://geonet_console_backend;
# ... proxy_set_header sama ...
}
}
Fase 1 — Dual hostname (ZERO downtime, ~5 menit)
Stack Docker belum diubah. Hanya tambah nginx + env APP_URL.
1.1 Deploy nginx console.gisportal.id → backend lama (8091)
scp -o MACs=hmac-sha1 databaselist/nginx/geonet-console.conf root@10.100.1.24:/etc/nginx/conf.d/production/geonet-console.conf
ssh -m hmac-sha1 root@10.100.1.24 -p 22 "nginx -t && systemctl reload nginx"
Saat ini
console.gisportal.iddandatabaselist.gisportal.idsama-sama mengarah ke containerdatabaselist.
1.2 Verifikasi
curl -sI https://console.gisportal.id/up
curl -sI https://databaselist.gisportal.id/up
# Keduanya harus 200
1.3 Update APP_URL di .env production (opsional di fase ini)
Bisa ditunda ke Fase 2 agar tidak perlu restart container.
DNS: pastikan record console.gisportal.id mengarah ke reverse proxy (sama seperti subdomain lain).
Fase 2 — Cutover stack Docker (~30 detik downtime minimal)
Strategi: stop container lama → start container baru di port yang sama dengan volume yang sama.
2.1 Upload stack baru ke path paralel
.\scripts\deploy-geonet-console.ps1 -RemoteStack /opt/stacks/geonet-console
Atau manual:
# di server
cp -a /opt/stacks/databaselist /opt/stacks/geonet-console
cd /opt/stacks/geonet-console
# ganti compose.yaml (container name + external volumes)
# update .env:
# APP_NAME="Geonet Console"
# APP_URL=https://console.gisportal.id
2.2 Rolling switch (urutan penting)
cd /opt/stacks/geonet-console
# 1. Build image baru
docker compose build
# 2. Stop stack LAMA (port 8091 lepas)
cd /opt/stacks/databaselist && docker compose stop databaselist audit-postgres
# 3. Start stack BARU (reuse volume, bind 8091)
cd /opt/stacks/geonet-console && docker compose up -d
# 4. Health check
curl -sf http://127.0.0.1:8091/up && echo OK
docker ps --filter name=geonet-console
Downtime: hanya selang antara step 2–3 (~15–45 detik).
Nginx tidak perlu diubah jika port tetap 8091.
2.3 Verifikasi fungsional
- Login UI
- List database SQL Server
- LDAP users / groups
- Mail settings + test send
- API docs
/api-docs - Audit log menulis ke PostgreSQL
- Session/cookie HTTPS (
SESSION_SECURE_COOKIE=true)
ssh -m hmac-sha1 root@10.100.1.24 -p 22 "curl -sf -o /dev/null -w '%{http_code}' https://console.gisportal.id/login"
Fase 3 — Redirect subdomain lama & rename DB (opsional)
3.1 Redirect 301 databaselist → console
Edit /etc/nginx/conf.d/production/databaselist.conf:
server {
listen 80;
server_name databaselist.gisportal.id;
return 301 https://console.gisportal.id$request_uri;
}
server {
listen 443 ssl;
server_name databaselist.gisportal.id;
include /etc/nginx/conf.d/ssl.conf;
return 301 https://console.gisportal.id$request_uri;
}
nginx -t && systemctl reload nginx
3.2 Rename database PostgreSQL (opsional, non-urgent)
Database databaselist_app / databaselist_audit tidak wajib di-rename — aplikasi tetap jalan dengan nama lama.
Jika ingin konsistensi penuh (maintenance window terpisah):
-- di dalam audit-postgres container
ALTER DATABASE databaselist_app RENAME TO geonet_console_app;
ALTER DATABASE databaselist_audit RENAME TO geonet_console_audit;
Lalu update .env dan compose.yaml, restart app container.
3.3 Update Uptime Kuma / monitoring
Ganti monitor URL dari databaselist.gisportal.id ke console.gisportal.id.
Fase 4 — Cleanup (setelah 7–14 hari stabil)
# Hapus stack lama (volume sudah dipakai stack baru — jangan docker volume rm)
cd /opt/stacks/databaselist
docker compose down --remove-orphans # tanpa -v
# Hapus image lama
docker image rm databaselist:latest 2>/dev/null || true
# Opsional: rename folder
mv /opt/stacks/databaselist /opt/stacks/databaselist.archived
Checklist file yang harus diubah
Repo lokal
databaselist/→geonet-console/geonet-console/compose.yamlgeonet-console/.env.examplegeonet-console/DOCKGE.mdgeonet-console/nginx/geonet-console.conf(baru)scripts/deploy-geonet-console.ps1(baru)readme.txtdatabase.txtserver/installed-applications-audit.txtserver/reverse-proxy-audit.txt~/.ssh/config— tambah aliasHost geonet-console(opsional)
Server production (10.100.1.24)
/opt/stacks/geonet-console/(stack baru)/etc/nginx/conf.d/production/geonet-console.conf/etc/nginx/conf.d/production/databaselist.conf(redirect 301)- Dockge — daftarkan stack
geonet-console, arsipkandatabaselist - Uptime Kuma monitor ID (jika ada)
Env production (.env)
APP_NAME="Geonet Console"
APP_URL=https://console.gisportal.id
# APP_DB_DATABASE / AUDIT_DB_DATABASE — biarkan nama lama atau rename Fase 3
Rollback (jika gagal di Fase 2)
cd /opt/stacks/geonet-console && docker compose stop
cd /opt/stacks/databaselist && docker compose up -d
curl -sf http://127.0.0.1:8091/up
Data aman karena volume tidak dihapus.
Urutan eksekusi disarankan
| # | Aksi | Downtime | Siapa |
|---|---|---|---|
| 1 | Backup .env + pg_dump |
0 | Ops |
| 2 | Rename repo lokal + commit | 0 | Dev |
| 3 | Nginx console.gisportal.id → 8091 |
0 | Ops |
| 4 | Test dual URL | 0 | Ops |
| 5 | Deploy stack geonet-console (external volumes) |
~30 detik | Ops |
| 6 | Verifikasi semua modul | 0 | QA |
| 7 | Redirect 301 subdomain lama | 0 | Ops |
| 8 | Update monitoring & docs | 0 | Ops |
| 9 | Cleanup stack lama (minggu berikutnya) | 0 | Ops |
Catatan penting
- Jangan
docker compose down -v— akan hapus volume PostgreSQL & storage. - OAuth/API clients — jika redirect URI hardcode
databaselist.gisportal.id, update keconsole.gisportal.idsebelum redirect 301. - Laravel
APP_URL— wajib diupdate agar link email, password reset, dan OAuth callback benar. - SESSION / CSRF — setelah ganti domain utama, user perlu login ulang (normal).
- sqlservercheck — stack terpisah, tidak ikut rename.
Perintah cepat setelah migrasi selesai
# SSH alias (tambahkan ke ~/.ssh/config)
# Host geonet-console-proxy
# HostName 10.100.1.24
# User root
# MACs hmac-sha1
ssh -m hmac-sha1 root@10.100.1.24 -p 22 "cd /opt/stacks/geonet-console && docker compose ps"
URL production: https://console.gisportal.id
Status migrasi
| Fase | Status | Tanggal | Catatan |
|---|---|---|---|
| 0 — Repo lokal | Selesai | 2026-06-11 | Folder geonet-console/ + script deploy; databaselist/ lama bisa dihapus manual |
| 1 — Nginx dual hostname | Selesai | 2026-06-11 | console.gisportal.id → :8091, verified HTTP 200 |
| 2 — Cutover Docker | Selesai | 2026-06-12 | Stack /opt/stacks/geonet-console, container geonet-console |
| 3 — Redirect 301 | Selesai | 2026-06-12 | databaselist.gisportal.id → console.gisportal.id |
| 4 — Cleanup | Pending | — | Hapus stack/image databaselist setelah stabil |