Deployment¶
Instalasi MkDocs¶
Menjalankan Server Lokal¶
Build Dokumen Statis (untuk Nginx)¶
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"
db—postgres:16-alpine, volumepgdata, bind127.0.0.1:5432saja.app— bot Telegram (src/bot/), FastAPI + webhook port 8000 (bind127.0.0.1, di-proxy Caddy).scheduler—src/jobs/scheduler.py, jalankan job terjadwal di dalam Docker network yang sama dengandb.dashboard— Streamlit admin, port 8501, image+requirements.txtsendiri.predict-api— image sama dengandashboard, proses FastAPI port 8502, tanpa port publik.
HTTPS / Reverse Proxy (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)¶
- SSH key — dipakai untuk automated deploy (
git pull+docker compose up -d --build), exempt dari 2FA. - 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.
- Master Backup Code — break-glass secret satu kali kalau Telegram tidak reachable. Hanya hash SHA-256-nya yang tersimpan di server.
- 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.
- 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: