Production Ready

Panduan Pembangunan AI SaaS

Serial Bagian 1: Persiapan infrastruktur server, Python Virtual Environment, dan desain database PostgreSQL untuk aplikasi Machine Learning.

Overview Sistem

Kita akan membangun arsitektur SaaS yang memisahkan area Private (Backend/Logic) dan Public (Frontend/Static).

Spesifikasi Server:

  • Database Name: ao
  • Database User: ao
  • Database Pass: ap123
  • Area Private: /www/wwwroot/app-collection/ao (Berisi kode Python, Model ML, Venv, Logs).
  • Area Public: /www/wwwroot/ao.baktimakmur.com (Berisi HTML/JS/CSS dan Uploads).

1. Setup Direktori

Jalankan perintah berikut di terminal server Anda untuk membuat struktur folder standar industri.

Lokasi Utama: /www/wwwroot/app-collection/ao
# 1. Masuk ke direktori utama project
cd /www/wwwroot/app-collection/

# 2. Buat struktur folder utama (Private Area)
mkdir -p ao/{app,core,logs,ml_models,supervisor_config}

# 3. Buat struktur sub-folder untuk modularitas (MVC Pattern)
cd ao
mkdir -p app/{api,v1,models,schemas,services}
mkdir -p core/{config,security,db}

# 4. Setup Area Public (untuk akses web/user)
mkdir -p /www/wwwroot/ao.baktimakmur.com/{static,media,uploads}

# 5. Set Permission dasar (Opsional, sesuaikan user server nginx/apache)
chmod 755 /www/wwwroot/ao.baktimakmur.com

Setelah perintah di atas dijalankan, struktur pohon folder Anda akan terlihat seperti ini:

/www/wwwroot/app-collection/ao/          <-- ROOT PYTHON
├── app/
│   ├── api/       <-- Router endpoints
│   ├── v1/        <-- Versi API (api/v1/predict)
│   ├── models/    <-- Pydantic Schemas (Request/Response)
│   ├── schemas/   <-- Struktur Data Input/Output
│   └── services/  <-- Logic Bisnis & ML
├── core/
│   ├── config.py  <-- Config Loader
│   ├── security.py<-- JWT/Auth Logic
│   └── db.py      <-- Database Connector
├── logs/          <-- Log file aplikasi
├── ml_models/     <-- File .pkl / .h5 model terlatih
├── supervisor_config/ <-- Konfigurasi process manager
└── venv/          <-- Virtual Environment (Akan dibuat di langkah 2)

/www/wwwroot/ao.baktimakmur.com/  <-- ROOT PUBLIC
├── static/       <-- CSS, JS, Images
├── media/        <-- File hasil generate
└── uploads/      <-- File input user

2. Virtual Environment (Venv)

Penting untuk mengisolasi dependensi project agar tidak bentrok dengan sistem operasi.

Terminal Command (SSH)
cd /www/wwwroot/app-collection/ao

# Membuat virtual environment dengan nama 'venv'
python3 -m venv venv

# Mengaktifkan environment
source venv/bin/activate

Jika prompt terminal Anda berubah menjadi (venv) user@server:...$, berarti venv aktif.

Install Dependencies (requirements.txt)

Buat file requirements.txt di dalam folder /www/wwwroot/app-collection/ao/.

File: /www/wwwroot/app-collection/ao/requirements.txt
# Framework Web & ASGI Server
fastapi==0.104.1
uvicorn[standard]==0.24.0
pydantic==2.5.0
pydantic-settings==2.1.0

# Database
psycopg2-binary==2.9.9
sqlalchemy==2.0.23
alembic==1.13.0

# Machine Learning
scikit-learn==1.3.2
pandas==2.1.3
numpy==1.26.2
joblib==1.3.2

# Utilities
python-dotenv==1.0.0
python-multipart==0.0.6

Setelah file dibuat, jalankan perintah instal:

pip install -r requirements.txt

3. Database Schema & Dummy Data

Kita akan menggunakan database PostgreSQL. Silakan login ke database Anda via terminal atau pgAdmin, lalu jalankan perintah SQL berikut untuk membuat tabel yang diperlukan oleh sistem ML.

A. Tabel Users (Autentikasi Sederhana)

SQL: Create Table Users
-- Koneksi ke database: ao (User: ao, Pass: ap123)

CREATE TABLE IF NOT EXISTS users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    api_key VARCHAR(255) UNIQUE NOT NULL,
    is_active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

-- Dummy Data Insert (User Production)
INSERT INTO users (username, email, api_key, is_active) VALUES
('admin_saas', 'admin@ao.baktimakmur.com', 'prod-sk-88219238-x98', TRUE);

B. Tabel ML Jobs (Melacak Proses ML)

Tabel ini menampung permintaan prediksi dari user, statusnya, dan lokasi file hasilnya.

SQL: Create Table ML Jobs
-- Tabel untuk queue proses ML
CREATE TABLE IF NOT EXISTS ml_jobs (
    id SERIAL PRIMARY KEY,
    user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
    job_type VARCHAR(50) NOT NULL, -- Contoh: 'sentiment_analysis', 'prediction'
    status VARCHAR(20) DEFAULT 'pending', -- pending, processing, completed, failed
    input_params JSONB, -- Data input fleksibel
    result_path VARCHAR(255), -- Path file hasil di area public
    error_message TEXT,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

-- Trigger untuk update timestamp (PostgreSQL Standard)
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$ BEGIN
    NEW.updated_at = CURRENT_TIMESTAMP;
    RETURN NEW;
END;
 $$ language 'plpgsql';

CREATE TRIGGER update_ml_jobs_updated_at BEFORE UPDATE ON ml_jobs
    FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();

4. Konfigurasi & Environment

Agar kode aman (tidak menyimpan password di script), kita menggunakan file .env.

A. File .env

File: /www/wwwroot/app-collection/ao/.env
# Database Configuration
DB_HOST=localhost
DB_PORT=5432
DB_NAME=ao
DB_USER=ao
DB_PASS=ap123

# App Configuration
APP_NAME="AO ML SaaS"
APP_ENV=production
DEBUG=false
SECRET_KEY=ubah_ini_dengan_random_string_panjang_untuk_jwt

# Paths
PUBLIC_ROOT=/www/wwwroot/ao.baktimakmur.com
UPLOAD_DIR=/www/wwwroot/ao.baktimakmur.com/uploads
MODEL_DIR=/www/wwwroot/app-collection/ao/ml_models

B. Konfigurasi Python (config.py)

File ini bertugas membaca .env dan menyediakannya ke seluruh aplikasi.

File: /www/wwwroot/app-collection/ao/core/config.py
from pydantic_settings import BaseSettings
from functools import lru_cache

class Settings(BaseSettings):
    # Database
    DB_HOST: str
    DB_PORT: str
    DB_NAME: str
    DB_USER: str
    DB_PASS: str

    # App Security
    SECRET_KEY: str
    ALGORITHM: str = "HS256"
    ACCESS_TOKEN_EXPIRE_MINUTES: int = 30
    
    # App Info
    APP_NAME: str
    APP_ENV: str
    DEBUG: bool = False

    # Directories
    PUBLIC_ROOT: str
    UPLOAD_DIR: str
    MODEL_DIR: str

    @property
    def DATABASE_URL(self) -> str:
        return f"postgresql://{self.DB_USER}:{self.DB_PASS}@{self.DB_HOST}:{self.DB_PORT}/{self.DB_NAME}"

    class Config:
        env_file = ".env"
        case_sensitive = True

@lru_cache()
def get_settings() -> Settings:
    return Settings()

C. Database Connection (db.py)

Menggunakan SQLAlchemy untuk koneksi database yang robust dan aman.

File: /www/wwwroot/app-collection/ao/core/db.py
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from core.config import get_settings

settings = get_settings()

# Engine Database
engine = create_engine(settings.DATABASE_URL, pool_pre_ping=True)

# Session Local Factory
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# Base Model
Base = declarative_base()

# Dependency Injection untuk FastAPI
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

Bagian 1 Selesai

Infrastruktur dasar, database, dan environment sudah siap. File yang dibuat di Bagian 1 meliputi:

  • .env
  • requirements.txt
  • core/config.py
  • core/db.py
  • Database Tables (users, ml_jobs)
Langkah Selanjutnya (Bagian 2):
Anda perlu meminta saya untuk melanjutkan ke Bagian 2 yang akan membahas pembuatan:
  1. Model Machine Learning (Skeleton).
  2. API Endpoint (FastAPI).
  3. Service Logic untuk menangani data.

Ketik: "Lanjut ke Bagian 2"