Go Live

Deployment & Orchestration

Serial Bagian 3: Mengatur Supervisor untuk menjaga proses Python tetap hidup, dan Nginx sebagai gerbang utama ke aplikasi.

10. Konfigurasi Supervisor

Supervisor adalah manajer proses yang memastikan aplikasi API Anda berjalan otomatis saat server boot, dan akan me-restart otomatis jika aplikasi crash (misal karena memory leak atau error tak terduga).

File: /etc/supervisor/conf.d/ao_api.conf

Buat file konfigurasi ini di direktori konfigurasi supervisor (biasanya /etc/supervisor/conf.d/ atau melalui panel server Anda).

[program:ao_api]
; Nama proses (gunakan nama yang unik)
command=/www/wwwroot/app-collection/ao/venv/bin/uvicorn main:app --host 127.0.0.1 --port 8000

; Direktori kerja (Root project Python)
directory=/www/wwwroot/app-collection/ao

; User yang menjalankan proses (sesuaikan dengan user web server, biasanya www atau www-data)
user=www

; Otostart saat server boot
autostart=true

; Autorestart jika crash
autorestart=true
; Jika berhenti, tunggu 10 detik sebelum restart
startsecs=10

; Redirect log stdout dan stderr
stdout_logfile=/www/wwwroot/app-collection/ao/logs/supervisor.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10

stderr_logfile=/www/wwwroot/app-collection/ao/logs/supervisor_err.log
stderr_logfile_maxbytes=50MB
stderr_logfile_backups=10

; Environment variables
environment=PATH="/www/wwwroot/app-collection/ao/venv/bin"

PENTING: Pastikan folder /www/wwwroot/app-collection/ao/logs/ sudah dibuat (lihat Bagian 1) dan memiliki izin tulis (write permission) untuk user www.

chown -R www:www /www/wwwroot/app-collection/ao/logs

11. Konfigurasi Nginx (Reverse Proxy)

Konfigurasi ini mengarahkan permintaan dari browser (Port 80/443) ke aplikasi Python internal (Port 8000). Konfigurasi ini juga menangani file statis agar dilayani langsung oleh Nginx (lebih cepat).

File: /www/server/panel/vhost/nginx/ao.baktimakmur.com.conf

Catatan: Lokasi file bisa berbeda tergantung panel yang Anda gunakan (aapanel, cpanel, manual install). Pastikan ini adalah config untuk domain ao.baktimakmur.com.

server {
    listen 80;
    server_name ao.baktimakmur.com;
    
    # Root direktori untuk file statis (Public Area)
    root /www/wwwroot/ao.baktimakmur.com;
    index index.html;

    # Log Nginx
    access_log /www/wwwlogs/ao.baktimakmur.com-access.log;
    error_log /www/wwwlogs/ao.baktimakmur.com-error.log;

    # --- 1. Melayani API Python (Reverse Proxy) ---
    location /api/ {
        proxy_pass http://127.0.0.1:8000; # Mengarah ke uvicorn

        # Header Wajib agar FastAPI bisa membaca URL client dengan benar
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # Timeout untuk proses ML (sesuaikan jika prediksi butuh waktu lama)
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;

        # Mengizinkan upload file besar (jika user upload gambar/input file)
        client_max_body_size 20M;
    }

    # --- 2. Melayani Dokumentasi (Opsional) ---
    location /docs {
        proxy_pass http://127.0.0.1:8000/docs;
    }

    # --- 3. Melayani File Statis ---
    location / {
        try_files $uri $uri/ /index.html;
        
        # Cache file statis (CSS, JS, Gambar)
        location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2)$ {
            expires 1y;
            add_header Cache-Control "public, immutable";
        }
    }
}

12. Final Service Restart & Go Live

Semua konfigurasi sudah ditempat. Sekarang saatnya menerapkan perubahan.

A. Reload Supervisor

Jalankan perintah berikut di terminal agar Supervisor membaca konfigurasi baru dan menjalankan API.

# 1. Baca ulang konfigurasi supervisor
supervisorctl reread

# 2. Update perubahan (start service baru)
supervisorctl update

# 3. Cek status service
supervisorctl status

# Output yang diharapkan:
# ao_api                          RUNNING   pid 12345, uptime 0:00:05

B. Reload Nginx

Terapkan konfigurasi Nginx baru tanpa mematikan koneksi yang sedang aktif.

# Tes konfigurasi (pastikan outputnya: successful)
nginx -t

# Reload Nginx
systemctl reload nginx
# atau jika menggunakan panel (aaPanel/cPanel): simpan config di panel, panel akan reload otomatis.
Verifikasi Akhir:
1. Buka browser: http://ao.baktimakmur.com/api/health
2. Harus muncul JSON response: {"status": "healthy", ...}
3. Coba akses http://ao.baktimakmur.com/docs untuk melihat dokumentasi Swagger API.

13. Maintenance & Update Aplikasi

Di masa depan, Anda mungkin perlu mengupdate model ML atau logika kode. Berikut adalah workflow standar (Best Practice) agar tidak menyebabkan downtime yang lama.

Workflow Update Kode:

  1. Upload Baru: Upload file python yang baru ke server (biasanya via Git atau SFTP).
  2. Install Dependencies (jika ada perubahan):
    cd /www/wwwroot/app-collection/ao
    source venv/bin/activate
    pip install -r requirements.txt
  3. Update Model (jika ada):

    Upload file model baru (model_v2.pkl) ke folder ml_models/, lalu update kode inference_service untuk memanggil file baru tersebut.

  4. Restart Service (Tanpa Downtime):

    Gunakan perintah restart pada supervisor. Supervisor akan menutup proses lama dan memulai yang baru dalam hitungan detik.

    supervisorctl restart ao_api
  5. Cek Log:

    Jika terjadi error, periksa log error yang kita set di konfigurasi supervisor tadi.

    tail -f /www/wwwroot/app-collection/ao/logs/supervisor_err.log

Deployment Selesai! 🚀

Selamat! Anda telah berhasil membangun kerangka aplikasi AI SaaS tingkat produksi.

Arsitektur Anda saat ini:
  • ✅ Database: PostgreSQL yang aman (User: ao).
  • ✅ Backend: FastAPI + Python Virtual Env (Private Area).
  • ✅ Orchestrator: Supervisor menjaga API tetap hidup 24/7.
  • ✅ Gateway: Nginx melayani API dan File Statis (Public Area).
  • ✅ Structure: Terpisah rapi antara kode ML, API, dan aset web.

Anda sekarang siap untuk melanjutkan pengembangan model atau integrasi frontend.