Skip to content

Deployment

Instalasi MkDocs

pip install mkdocs-material mkdocstrings-python pymdown-extensions

Menjalankan Server Lokal

mkdocs serve

Build Dokumen Statis (untuk Nginx)

mkdocs build

Output HTML statis akan tersedia di folder site/, siap disajikan langsung oleh Nginx/Caddy sebagai root directory.

Deployment Aplikasi (Docker + VPS)

cp .env.example .env    # isi API key, Telegram, POSTGRES_PASSWORD
docker compose up -d --build
docker compose ps       # pastikan db, app, scheduler, dashboard "Running"/"healthy"
  • dbpostgres:16-alpine, volume pgdata, bind 127.0.0.1:5432 saja.
  • app — bot Telegram (src/bot/), FastAPI + webhook port 8000 (bind 127.0.0.1, di-proxy Caddy).
  • schedulersrc/jobs/scheduler.py, jalankan job terjadwal di dalam Docker network yang sama dengan db.
  • dashboard — Streamlit admin, port 8501, image+requirements.txt sendiri.
  • predict-api — image sama dengan dashboard, proses FastAPI port 8502, tanpa port publik.

HTTPS / Reverse Proxy (Caddy)

sudo apt install caddy
sudo cp Caddyfile /etc/caddy/Caddyfile
sudo systemctl reload caddy

VPS Server Hardening — SSH Telegram 2FA, fail2ban, GeoIP

Infrastruktur host-level pada VPS produksi (ubuntu@43.133.152.213) — bukan bagian dari deployment aplikasi via Docker, melainkan konfigurasi sistem dan script root-owned yang berjalan langsung di OS VPS.

Access Layers (urutan trust)

  1. SSH key — dipakai untuk automated deploy (git pull + docker compose up -d --build), exempt dari 2FA.
  2. Password + Telegram OTP (2FA) — untuk login interaktif manusia. Password yang benar hanya faktor pertama; prompt kedua ("Enter Telegram OTP or Master Backup Code:") wajib diisi.
  3. Master Backup Code — break-glass secret satu kali kalau Telegram tidak reachable. Hanya hash SHA-256-nya yang tersimpan di server.
  4. fail2ban — permanent ban IP setelah 2 percobaan auth gagal dalam 24 jam, kirim alert Telegram (GeoIP + ISP/org + username yang ditarget) di setiap ban/unban.
  5. Provider web console — fallback terakhir, independen total dari PAM stack sshd.

Rotating Backup Code

python3 -c "import secrets, hashlib; c = secrets.token_urlsafe(18); print('CODE:', c); print('HASH:', hashlib.sha256(c.encode()).hexdigest())"

Simpan CODE di password manager, lalu update backup_code_hash di /etc/telegram-ssh-otp.conf dengan HASH baru. Tidak perlu restart service.

fail2ban ignoreip

sudo systemctl reload fail2ban
sudo fail2ban-client status sshd
sudo fail2ban-client set sshd unbanip <ip>

Update ignoreip di /etc/fail2ban/jail.local setiap kali IP akses berubah (lokasi baru, ganti ISP, VPN) — fail2ban membanning di level firewall, lebih fundamental dari PAM, sehingga IP yang terban tidak bisa connect sama sekali termasuk lewat SSH key.

Rollback (batalkan seluruh perubahan 2FA/PAM)

sudo cp -a /etc/pam.d/sshd.bak-pre-2fa-<timestamp> /etc/pam.d/sshd
sudo cp -a /etc/ssh/sshd_config.bak-pre-2fa-<timestamp> /etc/ssh/sshd_config
sudo rm -f /etc/ssh/sshd_config.d/00-telegram-2fa.conf
sudo sshd -t && sudo systemctl reload ssh

Untuk menghentikan fail2ban sepenuhnya:

sudo systemctl stop fail2ban && sudo systemctl disable fail2ban