# 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 ```powershell 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_data` - `databaselist_app_storage` ### 0.2 Rename folder repo lokal ```powershell 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) ```yaml 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`) ```nginx 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) ```powershell 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.id` dan `databaselist.gisportal.id` sama-sama mengarah ke container `databaselist`. ### 1.2 Verifikasi ```powershell 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 ```powershell .\scripts\deploy-geonet-console.ps1 -RemoteStack /opt/stacks/geonet-console ``` Atau manual: ```bash # 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) ```bash 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`) ```powershell 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`: ```nginx 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; } ``` ```bash 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): ```sql -- 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) ```bash # 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.yaml` - [ ] `geonet-console/.env.example` - [ ] `geonet-console/DOCKGE.md` - [ ] `geonet-console/nginx/geonet-console.conf` (baru) - [ ] `scripts/deploy-geonet-console.ps1` (baru) - [ ] `readme.txt` - [ ] `database.txt` - [ ] `server/installed-applications-audit.txt` - [ ] `server/reverse-proxy-audit.txt` - [ ] `~/.ssh/config` — tambah alias `Host 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`, arsipkan `databaselist` - [ ] Uptime Kuma monitor ID (jika ada) ### Env production (`.env`) ```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) ```bash 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 1. **Jangan** `docker compose down -v` — akan hapus volume PostgreSQL & storage. 2. **OAuth/API clients** — jika redirect URI hardcode `databaselist.gisportal.id`, update ke `console.gisportal.id` sebelum redirect 301. 3. **Laravel `APP_URL`** — wajib diupdate agar link email, password reset, dan OAuth callback benar. 4. **SESSION / CSRF** — setelah ganti domain utama, user perlu login ulang (normal). 5. **sqlservercheck** — stack terpisah, tidak ikut rename. --- ## Perintah cepat setelah migrasi selesai ```powershell # 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 |