DRP v1.4 7 April 2026 Ubuntu 24.04.4 LTS Docker 29.3.0 Internal Use Only

Disaster Recovery Plan yang terasa seperti command center.

Halaman ini merangkum seluruh kebutuhan DevOps untuk server produksi SMKarier: peta infra, alur release, SOP operasional, skenario insiden, recovery dari nol, kredensial penting, dan checklist monitoring. Fokus tampilannya ringan, terang, dan cepat diakses saat kondisi normal maupun insiden.

Hostname core.smkarier.cloud
SSH Operasional deploy@core.smkarier.cloud -p 1453
Stack Utama Traefik, Laravel, PostgreSQL, Redis, GH Actions Runner
Target RTO 5 menit untuk issue ringan, 2-3 jam untuk rebuild penuh

Ringkasan Kritis

Semua indikator penting yang biasanya dibutuhkan cepat oleh DevOps saat membuka dokumen DRP.

Provider Hostinger KVM
Compute 4 vCPU / 16 GB RAM
Storage 193 GB SSD
Entry Port SSH 1453
Zona operasional utama berada di /opt/smkarier, dengan GitHub Actions self-hosted runner di /home/deploy/actions-runner dan log Traefik di /var/log/traefik.

1. Informasi Server & Tim

Siapa yang memegang akses, bagaimana masuk ke server, dan detail spesifikasi host produksi yang menjadi pusat operasi.

Server Produksi

ItemDetail
ProviderHostinger KVM
Hostnamecore.smkarier.cloud
OSUbuntu 24.04.4 LTS (Ubuntu Pro)
CPU4 vCPU
RAM16 GB
Disk193 GB SSD
SSH Port1453
SSH Userdeploy untuk operasional, root untuk emergency
Dockerv29.3.0
Traefikv3.6.1

Tim & Tanggung Jawab

NamaRoleAksesTanggung Jawab
Imam NajmudinCEO / DevOpsSSH root + deploy, GitHub Owner, Cloudflare, HostingerInfra, server, deploy production, keputusan release
Alfian MaulanaCTO / Full-StackGitHub push ke main, GHCRKode aplikasi, push staging, tag release setelah izin Imam
Jaka SupriyantoCPO / MobileGitHub Flutter repoFlutter mobile dan QA
SSH Access
# User deploy (operasional sehari-hari)
ssh deploy@core.smkarier.cloud -p 1453

# Atau langsung ke root workspace operasional
ssh deploy@core.smkarier.cloud -p 1453
cd /opt/smkarier

2. Arsitektur Infrastruktur

Gambaran aliran trafik, komponen container, pemisahan production dan staging, serta titik penting SSL dan DNS.

Topology

Traffic Path
Internet
    |
    v
Cloudflare (DNS + Proxy + SSL Termination)
    |
    v
VPS Hostinger (core.smkarier.cloud)
    |
    v
Traefik v3.6.1 (Reverse Proxy + SSL via DNS Challenge)
    |
    +-- smk-prod-net
    |   +-- smkarier_cms
    |   +-- smkarier_frontend
    |   +-- postgres_prod
    |   +-- redis_prod
    |
    +-- smk-stg-net
        +-- smkarier_cms_stg
        +-- smkarier_frontend_stg
        +-- postgres_stg
        +-- redis_stg

Stack Ringkas

Edge Layer Cloudflare DNS, proxy, SSL termination, dan wildcard cover untuk domain utama.
Ingress Traefik v3.6.1 Reverse proxy dengan DNS challenge via Cloudflare dan sertifikat wildcard.
App Layer Laravel CMS & Frontend Dipisah antara production dan staging, masing-masing pada network berbeda.
Data Layer PostgreSQL 16 & Redis 7 Volume persistent berada di /opt/smkarier/volumes.

Container Detail

ContainerImageNetworkMemory LimitInternal Port
traefiktraefik:v3.6.1host-80, 443
smkarier_cmssmkarier-cms:latestsmk-prod-net512M80
smkarier_frontendsmkarier-frontend:latestsmk-prod-net512M80
smkarier_aismkarier-ai:latestsmk-prod-net512M8000
postgres_prodpostgres:16-alpinesmk-prod-net-5432
redis_prodredis:7-alpinesmk-prod-net512MB maxmemory6379
smkarier_cms_stgsmkarier-cms:mainsmk-stg-net512M80
smkarier_frontend_stgsmkarier-frontend:mainsmk-stg-net512M80
smkarier_ai_stgsmkarier-ai:mainsmk-stg-net512M8000
postgres_stgpostgres:16-alpinesmk-stg-net256M5432
redis_stgredis:7-alpinesmk-stg-net256MB maxmemory6379

Database & Redis

LayerProductionStaging
DB Containerpostgres_prodpostgres_stg
DB Namesmkarier_prodsmkarier_stg
DB Usersmkarier_adminsmkarier_stg
DB Hostpostgres_prodpostgres_stg
DB Volume/opt/smkarier/volumes/postgres_data/opt/smkarier/volumes/postgres_stg
Redis Containerredis_prodredis_stg
Redis Passwordnull internal onlynull internal only
Max Memory512mb256mb
Eviction Policyallkeys-lruallkeys-lru
Wildcard SSL: *.smkarier.com, *.smkarier.cloud
Traefik ACME: /opt/smkarier/config/traefik/acme.json
Email Sertifikat: developer@smkarier.co.id
Resolver DNS: 108.162.192.71, 108.162.193.71

3. Struktur Direktori Lengkap

Peta folder server yang perlu dipahami cepat saat maintenance, recovery, atau troubleshooting.

Core Tree

ENV/opt/smkarier/.env.*File environment untuk CMS, frontend, staging, dan Traefik.
App Compose/opt/smkarier/app/Compose production dan staging untuk container aplikasi.
Data Compose/opt/smkarier/data/Compose PostgreSQL dan Redis untuk production serta staging.
Traefik/opt/smkarier/config/traefik/Static config, dynamic middleware, docker-compose Traefik, dan ACME cert store.
PHP/opt/smkarier/config/php/memory.iniOverride memory limit dan upload size.
Backup/opt/smkarier/backup/Daily, weekly, monthly backup slots.
Volumes/opt/smkarier/volumes/Persistent data untuk database dan Redis. Jangan diedit manual.

Lokasi Penting Lainnya

GitHub Runner/home/deploy/actions-runner/Self-hosted runner untuk CI/CD organisasi.
Runner Workspace/home/deploy/actions-runner/_work/Working directory job GitHub Actions.
Traefik Logs/var/log/traefik/traefik.logRouting, error, dan issue sertifikat.
Access Logs/var/log/traefik/access.logHTTP access log untuk analisis trafik.
Folder /opt/smkarier/volumes berisi data persistent. Perlakukan sebagai area sensitif dan hindari modifikasi manual saat sistem sedang hidup kecuali recovery procedure memang mengharuskan.

4. Peta ENV → Container → Domain

Relasi file ENV dengan container yang dijalankan dan domain yang dilayani, lengkap dengan key variable yang sering dibutuhkan saat debugging.

Production Mapping

File ENVContainerDomain
.env.frontendsmkarier_frontendsmkarier.com, www.smkarier.com, api.smkarier.com, company.smkarier.com, candidate.smkarier.com, bkk.smkarier.com, lpk.smkarier.com, agency.smkarier.com
.env.cmssmkarier_cmsadmin.smkarier.com
.env.aismkarier_aiai.smkarier.com (belum aktif)

Staging Mapping

File ENVContainerDomain
.env.frontend.stagingsmkarier_frontend_stgstg.smkarier.cloud, api-stg.smkarier.cloud, company-stg.smkarier.cloud, candidate-stg.smkarier.cloud, bkk-stg.smkarier.cloud, lpk-stg.smkarier.cloud, agency-stg.smkarier.cloud
.env.cms.stagingsmkarier_cms_stgadmin-stg.smkarier.cloud
.env.ai.stagingsmkarier_ai_stgai-stg.smkarier.cloud ✅
APP_NAMESMKARIER
APP_ENVproduction
APP_URLhttps://smkarier.com
APP_DOMAINsmkarier.com
SUBDOMAIN_SUFFIXkosong di production
URL_CMShttps://admin.smkarier.com
SESSION_DOMAIN.smkarier.com
DB_HOSTpostgres_prod
DB_DATABASEsmkarier_prod
REDIS_HOSTredis_prod
REDIS_PASSWORDnull
FILESYSTEM_DISKgcs
APP_ENVproduction
APP_URLhttps://stg.smkarier.cloud
APP_DOMAINsmkarier.cloud
SUBDOMAIN_SUFFIX-stg
URL_CMShttps://admin-stg.smkarier.cloud
SESSION_DOMAIN.smkarier.cloud
DB_HOSTpostgres_stg
DB_DATABASEsmkarier_stg
REDIS_HOSTredis_stg

5. Alur CI/CD & Deploy

Flow rilis dari push ke main sampai live di production, termasuk semantic versioning dan secrets yang wajib tersedia.

GitHub Organization

OrganizationSMKarier-Inovasi-DigitalOwner repositori dan GitHub Actions runner group.
Registryghcr.io/smkarier-inovasi-digital/Container registry untuk image CMS dan frontend.
Repossmkarier-cms, smkarier-frontend, smkarier_mobile_flutter, smkarier-ai
Runnervps-hostinger-coreLabels: self-hosted, Linux, X64, vps, docker, production, staging.
Serviceactions.runner.SMKarier-Inovasi-Digital.vps-hostinger-core.service

Flow Deploy

1
Push ke branch main

Developer mendorong perubahan ke repositori. GitHub Actions otomatis memulai job build-and-push.

2
Build dan push image

Dalam sekitar 4-5 menit pipeline membangun image Docker lalu push ke GHCR dengan tag :main dan :latest.

3
Deploy staging otomatis

Image :main dipull dan container staging direcreate untuk verifikasi di stg.smkarier.cloud.

4
Release production via tag

Job production hanya jalan saat ada tag semver v*.*.*, lalu image :latest dipull dan container production direcreate.

SOP Release Production

1Alfian push ke mainPerubahan masuk dan pipeline build dimulai.
2Tunggu staging deployEstimasi sekitar 5 menit.
3Imam review stagingVerifikasi di stg.smkarier.cloud dan admin-stg.smkarier.cloud.
4Approval via WhatsAppPesan: Yan, release vX.X.X.
5Buat release tagDilakukan via GitHub web pada repo terkait.
6Pipeline production otomatisDeploy production live dalam sekitar 5 menit.

Semantic Versioning & Secrets

SemvervMAJOR.MINOR.PATCHv1.0.1 untuk hotfix, v1.1.0 untuk fitur baru, v2.0.0 untuk breaking change.
SecretVPS_HOST, VPS_PORT, VPS_USERParameter koneksi SSH production.
SecretVPS_SSH_KEYPrivate key ED25519 milik user deploy.
SecretREGISTRY_TOKEN, REGISTRY_USERAkses ke GHCR untuk build dan pull image.

6. SOP Operasional Harian

Quick actions untuk cek health, log, resource, dan task aplikasi yang paling sering dipakai di production maupun staging.

Cek Status Container

Pastikan seluruh service dalam kondisi healthy atau running.

docker ps
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Image}}"

Cek Error Log

Frontend, CMS, staging, dan Traefik log untuk routing/SSL.

logs
docker logs smkarier_frontend --tail 50
docker logs smkarier_cms --tail 50
docker logs smkarier_frontend_stg --tail 50
tail -50 /var/log/traefik/traefik.log

Cek Resource

Cocok untuk mendeteksi saturation CPU, RAM, atau disk.

resource
docker stats --no-stream
df -h /
free -h

Cek PHP Memory Limit

php memory
docker exec smkarier_frontend sh -c "php -i | grep memory_limit"
docker exec smkarier_cms sh -c "php -i | grep memory_limit"

Cek Koneksi Database

db check
docker exec smkarier_frontend sh -c "php artisan tinker --execute=\"DB::connection()->getPdo(); echo 'DB OK';\""

Cek Koneksi Redis

redis check
docker exec smkarier_frontend sh -c "php artisan tinker --execute=\"echo app('redis')->ping();\""

Migration

migration
docker exec smkarier_frontend sh -c "php artisan migrate --force"
docker exec smkarier_frontend_stg sh -c "php artisan migrate --force"

Clear Cache Laravel

cache clear
docker exec smkarier_frontend sh -c "php artisan cache:clear && php artisan config:clear && php artisan route:clear && php artisan view:clear"
docker exec smkarier_frontend_stg sh -c "php artisan cache:clear && php artisan config:clear && php artisan route:clear && php artisan view:clear"

7. SOP Perubahan Konfigurasi

Panduan aman saat mengubah ENV, menambah subdomain, menaikkan PHP memory, mengubah Traefik, atau menangani GitHub runner yang bermasalah.

A. Edit File ENV Perubahan ENV wajib diikuti recreate container, bukan sekadar restart.
Critical SOP
Edit ENV
ssh deploy@core.smkarier.cloud -p 1453
sudo nano /opt/smkarier/.env.frontend
sudo nano /opt/smkarier/.env.cms
sudo nano /opt/smkarier/.env.frontend.staging
sudo nano /opt/smkarier/.env.cms.staging
Recreate Container
docker compose -f /opt/smkarier/data/docker-compose.data.yml -f /opt/smkarier/app/docker-compose.app.yml up -d --force-recreate smkarier_frontend
docker compose -f /opt/smkarier/data/docker-compose.data.yml -f /opt/smkarier/app/docker-compose.app.yml up -d --force-recreate smkarier_cms
docker compose -f /opt/smkarier/data/docker-compose.data.stg.yml -f /opt/smkarier/app/docker-compose.stg.yml up -d --force-recreate smkarier_frontend_stg
docker compose -f /opt/smkarier/data/docker-compose.data.stg.yml -f /opt/smkarier/app/docker-compose.stg.yml up -d --force-recreate smkarier_cms_stg

# AI Service Staging ✅
docker compose \
  -f /opt/smkarier/app/docker-compose.ai.stg.yml \
  up -d --force-recreate smkarier_ai_stg

# AI Service Production
docker compose \
  -f /opt/smkarier/app/docker-compose.ai.yml \
  up -d --force-recreate smkarier_ai
Skenario 1b smkarier-ai Crash / Restart Loop
< 5 menit

Gejala: ai-stg.smkarier.cloud tidak bisa diakses, container smkarier_ai_stg terus restart.

Diagnosa & Recovery
smk log:ai:stg
docker pull ghcr.io/smkarier-inovasi-digital/smkarier-ai:main
smk up:stg:ai

# Verifikasi
curl https://ai-stg.smkarier.cloud/health
# Expected: {"status":"healthy","version":"2.0.0","environment":"staging"}
B. Tambah Subdomain Baru Edit rule Traefik, tambahkan DNS Cloudflare, lalu recreate frontend.
DNS + App
  • Edit /opt/smkarier/app/docker-compose.app.yml pada baris traefik.http.routers.frontend.rule= dan tambahkan || Host(`newsubdomain.smkarier.com`).
  • Masuk ke Cloudflare, tambahkan record A baru dengan proxy ON.
  • Recreate container frontend production agar rule baru aktif.
  • Wildcard SSL Traefik akan otomatis meng-cover subdomain baru.
Recreate Frontend
docker compose -f /opt/smkarier/data/docker-compose.data.yml -f /opt/smkarier/app/docker-compose.app.yml up -d --force-recreate smkarier_frontend
C. Edit PHP Configuration Perubahan memory limit membutuhkan recreate seluruh container PHP.
App Runtime
PHP Config
sudo nano /opt/smkarier/config/php/memory.ini
docker compose -f /opt/smkarier/data/docker-compose.data.yml -f /opt/smkarier/app/docker-compose.app.yml up -d --force-recreate smkarier_frontend smkarier_cms
D. Update Traefik Config Gunakan recreate Traefik setelah edit static atau dynamic config.
Ingress
Traefik Reload
sudo nano /opt/smkarier/config/traefik/traefik.yml
sudo nano /opt/smkarier/config/traefik/dynamic/middlewares.yml
docker compose -f /opt/smkarier/config/traefik/docker-compose.traefik.yml up -d --force-recreate traefik
E. GitHub Actions Runner Bermasalah Cek service, restart, lalu lihat journal jika runner offline.
CI/CD
Runner Diagnostics
sudo systemctl status actions.runner.SMKarier-Inovasi-Digital.vps-hostinger-core.service
sudo systemctl restart actions.runner.SMKarier-Inovasi-Digital.vps-hostinger-core.service
journalctl -u actions.runner.SMKarier-Inovasi-Digital.vps-hostinger-core.service --tail 30

8. Disaster Scenarios & Recovery Steps

Skenario insiden paling penting dengan diagnosa, langkah recovery, dan target RTO. Gunakan kolom pencarian untuk memfilter skenario secara cepat.

Skenario 1 Container Down
< 5 menit

Gejala: satu atau beberapa subdomain tidak bisa diakses, status container Exited atau Restarting.

Diagnosa & Recovery
docker ps -a --format "table {{.Names}}\t{{.Status}}"
docker logs smkarier_frontend --tail 30
docker compose -f /opt/smkarier/data/docker-compose.data.yml -f /opt/smkarier/app/docker-compose.app.yml up -d --force-recreate smkarier_frontend
docker logs smkarier_frontend --tail 100
Skenario 2 PHP Memory Error
< 3 menit

Gejala: beberapa halaman menampilkan 500 dengan log Allowed memory size exhausted.

Memory Recovery
docker logs smkarier_frontend --tail 20 | grep memory
sudo nano /opt/smkarier/config/php/memory.ini
# Ubah: memory_limit = 512M
docker compose -f /opt/smkarier/data/docker-compose.data.yml -f /opt/smkarier/app/docker-compose.app.yml up -d --force-recreate smkarier_frontend smkarier_cms
Skenario 3 Redis Auth Error
< 5 menit

Gejala: site 500 secara acak dan log mengandung ERR AUTH called without password.

Redis Recovery
docker exec smkarier_frontend sh -c "php artisan tinker --execute=\"echo app('redis')->ping();\""
grep "REDIS_PASSWORD" /opt/smkarier/.env.frontend
sudo nano /opt/smkarier/.env.frontend
# Pastikan: REDIS_PASSWORD=null
docker compose -f /opt/smkarier/data/docker-compose.data.yml -f /opt/smkarier/app/docker-compose.app.yml up -d --force-recreate smkarier_frontend smkarier_cms
Skenario 4 SSL Certificate Error (526)
5-15 menit

Gejala: Cloudflare menampilkan error 526 dan site tidak dapat diakses.

SSL Diagnosa
docker ps | grep traefik
tail -50 /var/log/traefik/traefik.log | grep -i "error\|cert\|acme"
ls -la /opt/smkarier/config/traefik/acme.json
SSL Recovery
docker compose -f /opt/smkarier/config/traefik/docker-compose.traefik.yml up -d traefik
cp /opt/smkarier/config/traefik/acme.json /opt/smkarier/config/traefik/acme.json.bak
sudo sh -c 'echo "{}" > /opt/smkarier/config/traefik/acme.json'
sudo chmod 600 /opt/smkarier/config/traefik/acme.json
docker compose -f /opt/smkarier/config/traefik/docker-compose.traefik.yml up -d --force-recreate traefik
Pastikan CF_DNS_API_TOKEN pada .env.traefik masih valid sebelum memaksa re-issue sertifikat.
Skenario 5 Database Corruption / Data Loss
15-60 menit

Gejala: query error, migration gagal, atau data hilang.

DB Recovery
docker ps | grep postgres
docker logs postgres_prod --tail 30
docker exec postgres_prod pg_isready -U smkarier_admin -d smkarier_prod

# Restore dari backup
docker stop smkarier_frontend smkarier_cms
cat /path/to/backup/smkarier_prod_YYYYMMDD.sql | docker exec -i postgres_prod psql -U smkarier_admin -d smkarier_prod
docker compose -f /opt/smkarier/data/docker-compose.data.yml -f /opt/smkarier/app/docker-compose.app.yml up -d

# Manual worst case tanpa backup
docker exec smkarier_frontend sh -c "php artisan migrate --force"
Skenario 6 Disk Full
10-20 menit

Gejala: container gagal start dengan error no space left on device.

Disk Recovery
df -h /
docker system df
docker image prune -a --filter "until=168h"
docker container prune -f
truncate -s 0 /var/log/traefik/traefik.log
truncate -s 0 /var/log/traefik/access.log
du -sh /opt/smkarier/volumes/*
du -sh /var/lib/docker/*
Skenario 7 GitHub Actions Runner Tidak Jalan
10-20 menit

Gejala: push ke main tidak trigger pipeline dan runner terlihat offline di GitHub.

Runner Recovery
sudo systemctl status actions.runner.SMKarier-Inovasi-Digital.vps-hostinger-core.service
sudo systemctl restart actions.runner.SMKarier-Inovasi-Digital.vps-hostinger-core.service

# Jika masih gagal, re-register runner
cd /home/deploy/actions-runner
./config.sh remove --token [TOKEN_DARI_GITHUB]
./config.sh --url https://github.com/SMKarier-Inovasi-Digital --token [TOKEN_DARI_GITHUB] --name vps-hostinger-core --runnergroup smkarier-vps --labels vps,docker,production,staging --unattended
sudo ./svc.sh install deploy
sudo ./svc.sh start
Skenario 8 VPS Tidak Bisa Diakses
15 menit - 2 jam
  • Login ke panel Hostinger di hpanel.hostinger.com.
  • Cek status VPS dan lakukan restart dari panel jika service terlihat running tapi SSH timeout.
  • Gunakan Recovery Console jika VPS tidak dapat diakses langsung.
  • Jika perlu rebuild total, lanjutkan ke bagian Full Server Recovery.
Hotline Hostinger tersedia melalui panel support dan live chat.
Skenario 9 Deployment Pipeline Stuck / Gagal
Variatif

Diagnosa: buka tab Actions di organisasi GitHub dan identifikasi job yang gagal.

Job GagalPenyebabSolusi
build-and-pushSyntax PHP, Composer fail, Dockerfile errorPerbaiki kode lalu push ulang.
deploy-stagingRunner down, image gagal dipull, health check gagalRestart runner dan cek log container staging.
deploy-productionFormat tag salah atau environment belum siapPastikan tag format v1.0.0 dan environment benar.
Manual Emergency Deploy
ssh deploy@core.smkarier.cloud -p 1453
docker pull ghcr.io/smkarier-inovasi-digital/smkarier-frontend:latest
docker compose -f /opt/smkarier/data/docker-compose.data.yml -f /opt/smkarier/app/docker-compose.app.yml up -d --force-recreate smkarier_frontend

9. Full Server Recovery (Dari Nol)

Runbook rebuild total jika VPS baru harus disiapkan ulang. Estimasi waktu 2-3 jam dari setup dasar sampai verifikasi domain dan runner aktif.

Gunakan prosedur ini saat rebuild penuh, beli VPS baru, atau seluruh host harus dipulihkan dari awal. Prioritas utama: keamanan akses, struktur direktori, config restore, lalu data restore.
Phase 1-4 Server Setup Dasar, Docker, Struktur Direktori, Restore Config
Foundation
Bootstrap
apt update && apt upgrade -y
apt install -y curl wget git ufw fail2ban htop
timedatectl set-timezone Asia/Jakarta
useradd -m -s /bin/bash deploy
usermod -aG sudo deploy
echo "deploy ALL=(ALL) NOPASSWD: /etc/sudoers.d/deploy" >> /etc/sudoers
nano /etc/ssh/sshd_config
# Port 1453, PermitRootLogin no, PasswordAuthentication no
systemctl restart ssh
ufw allow 1453/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

curl -fsSL https://get.docker.com | sh
usermod -aG docker deploy
systemctl enable docker
systemctl start docker

mkdir -p /opt/smkarier/{app,data,config/php,config/traefik/dynamic,backup/{daily,weekly,monthly},scripts,volumes/{postgres_data,postgres_stg,redis_data,redis_stg}}
chown -R deploy:deploy /opt/smkarier
chmod 750 /opt/smkarier

Setelah itu restore seluruh .env, docker-compose, Traefik config, dan memory.ini dari backup atau git. Pastikan permission file ENV dan acme.json berada di 600.

Phase 5-8 Buat Network, Update DNS, Jalankan Traefik dan Data Layer
Infra Bring-up
Network & Data
docker network create smk-prod-net
docker network create smk-stg-net
docker compose -f /opt/smkarier/config/traefik/docker-compose.traefik.yml up -d
docker compose -f /opt/smkarier/data/docker-compose.data.yml up -d
docker compose -f /opt/smkarier/data/docker-compose.data.stg.yml up -d
sleep 30
docker ps | grep -E "postgres|redis"
  • Masuk ke Cloudflare dan arahkan semua A record ke IP server baru.
  • Tunggu propagasi sekitar 5 menit dengan proxy Cloudflare aktif.
Phase 9-12 Restore Database, Jalankan Aplikasi, Setup Runner, Verifikasi
Application Recovery
Restore & Run
docker exec postgres_prod psql -U postgres -c "CREATE USER smkarier_admin WITH PASSWORD 'DqbdFmnjL1S22Ja_dgYdHpbgum9liDch';"
docker exec postgres_prod psql -U postgres -c "CREATE DATABASE smkarier_prod OWNER smkarier_admin;"
cat /path/to/backup/smkarier_prod_latest.sql | docker exec -i postgres_prod psql -U smkarier_admin -d smkarier_prod

echo [GITHUB_TOKEN] | docker login ghcr.io -u [GITHUB_USER] --password-stdin
docker compose -f /opt/smkarier/data/docker-compose.data.yml -f /opt/smkarier/app/docker-compose.app.yml up -d
docker compose -f /opt/smkarier/data/docker-compose.data.stg.yml -f /opt/smkarier/app/docker-compose.stg.yml up -d
Runner Setup & Verify
cd /home/deploy
mkdir actions-runner && cd actions-runner
curl -o actions-runner-linux-x64.tar.gz -L https://github.com/actions/runner/releases/download/v2.x.x/actions-runner-linux-x64-2.x.x.tar.gz
tar xzf actions-runner-linux-x64.tar.gz
./config.sh --url https://github.com/SMKarier-Inovasi-Digital --token [REGISTRATION_TOKEN] --name vps-hostinger-core --runnergroup smkarier-vps --labels vps,docker,production,staging --unattended
sudo ./svc.sh install deploy
sudo ./svc.sh start
sudo systemctl enable actions.runner.SMKarier-Inovasi-Digital.vps-hostinger-core.service

docker ps --format "table {{.Names}}\t{{.Status}}"
curl -I https://smkarier.com
curl -I https://admin.smkarier.com
curl -I https://stg.smkarier.cloud
curl -I https://admin-stg.smkarier.cloud
sudo systemctl is-active actions.runner.SMKarier-Inovasi-Digital.vps-hostinger-core.service

10. Credential & Akses Penting

Area sensitif untuk akses cepat saat insiden. Nilai sensitif disembunyikan secara default dan bisa ditampilkan manual saat diperlukan.

Dokumen ini bersifat confidential. Simpan versi master di password manager atau storage aman, bukan di repo publik yang terbuka.
Akses Server
SSH Hostcore.smkarier.cloud
SSH Port1453
SSH User Operasionaldeploy
SSH User Emergencyroot
SSH Key TypeED25519
Database Production
Hostpostgres_prod
Databasesmkarier_prod
Usernamesmkarier_admin
PasswordDqbdFmnjL1S22Ja_dgYdHpbgum9liDch
Database Staging
Hostpostgres_stg
Databasesmkarier_stg
Usernamesmkarier_stg
PasswordzgQBB2DkrR6znqFnCjhpOLD0P9dN7nGs

Layanan Eksternal

LayananAkun / IdentitasFungsi
Hostingerhpanel.hostinger.comVPS management dan billing
Cloudflarecloudflare.comDNS, SSL, proxy
GitHubgithub.com/SMKarier-Inovasi-DigitalCode, CI/CD, container registry
Google CloudProject: original-brace-482310-s6Storage bucket dan Vertex AI
Watzapapp.watzap.idWhatsApp OTP dan notifikasi
MidtransMerchant ID: M013621025Payment gateway
MailtrapSMTP sandboxEmail development dan testing

Google Cloud Project

Project IDoriginal-brace-482310-s6
Bucket Prodsmkarier-media
Bucket Stagingsmkarier-media-staging
Service Accountsmkarier-media@original-brace-482310-s6.iam.gserviceaccount.com
Credits$2,000 valid s/d Jan 2028

11. Checklist Monitoring

Rutinitas harian, mingguan, dan bulanan agar operasional tetap sehat dan recovery tetap siap dipakai saat dibutuhkan.

Harian

  • docker ps menunjukkan semua container dalam status healthy atau running.
  • df -h / menunjukkan disk usage di bawah 80%.
  • Akses https://smkarier.com berjalan normal.
  • Akses https://admin.smkarier.com berjalan normal.
  • Akses https://stg.smkarier.cloud berjalan normal.

Mingguan

  • Cek 100 log terakhir frontend dan CMS tanpa error kritis.
  • free -h menunjukkan RAM usage normal, idealnya di bawah 80%.
  • Jalankan docker image prune -f untuk bersihkan image lama.
  • Periksa seluruh GitHub Actions run berjalan sukses.
  • Lakukan backup manual database production.

Bulanan

  • Update Docker image ke versi terbaru jika aman.
  • Review auto-renew SSL dan expiry sertifikat.
  • Analisis tren disk usage.
  • Test restore backup di staging.
  • Review ENV untuk menghapus placeholder yang tidak relevan.
  • Update dokumentasi DRP jika ada perubahan infrastruktur.
Backup Database Manual
docker exec postgres_prod pg_dump \
  -U smkarier_admin \
  -d smkarier_prod \
  --no-owner \
  --clean \
  > /opt/smkarier/backup/daily/smkarier_prod_$(date +%Y%m%d_%H%M%S).sql

gzip /opt/smkarier/backup/daily/smkarier_prod_$(date +%Y%m%d)*.sql

smk — Deploy Control Shortcuts

smk commands (di server /usr/local/bin/smk)
smk ps                 # status semua container
smk up:prod            # recreate frontend + cms production
smk up:prod:fe         # recreate frontend production
smk up:prod:cms        # recreate CMS production
smk up:prod:ai         # recreate AI service production

smk up:stg             # recreate frontend + cms staging
smk up:stg:fe          # recreate frontend staging
smk up:stg:cms         # recreate CMS staging
smk up:stg:ai          # recreate AI service staging ✅

smk log:fe             # log frontend production
smk log:cms            # log CMS production
smk log:fe:stg         # log frontend staging
smk log:cms:stg        # log CMS staging
smk log:ai:stg         # log AI staging

smk cache:prod         # clear cache production
smk cache:stg          # clear cache staging
smk config:stg         # config:cache staging
smk migrate:prod       # migrate production
smk migrate:stg        # migrate staging
smk reverb:prod        # restart reverb production
smk reverb:stg         # restart reverb staging

smk disk               # disk + docker usage
smk stats              # RAM/CPU per container
smk runner:status      # cek GitHub runner
smk cleanup            # hapus image lama (>7 hari)

12. Riwayat Perubahan

Versi dokumen, kapan dibuat, dan catatan perawatan agar DRP selalu relevan.