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.
# 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.
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/.
# 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)
-- 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.
-- 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
# 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.
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.
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:
.envrequirements.txtcore/config.pycore/db.py- Database Tables (
users,ml_jobs)
Anda perlu meminta saya untuk melanjutkan ke Bagian 2 yang akan membahas pembuatan:
- Model Machine Learning (Skeleton).
- API Endpoint (FastAPI).
- Service Logic untuk menangani data.
Ketik: "Lanjut ke Bagian 2"