Skip to content

Deployment Guide for cbmodels

Domain: models.nominate.ai API Port: 32411 App Port: 32410 (reserved for future frontend)

NGINX Configuration

# /etc/nginx/sites-available/models.nominate.ai

upstream cbmodels_api {
    server 127.0.0.1:32411;
}

server {
    listen 80;
    server_name models.nominate.ai;

    # API endpoints
    location /api/ {
        proxy_pass http://cbmodels_api;
        proxy_http_version 1.1;
        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;
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }

    # OpenAPI docs
    location /docs {
        proxy_pass http://cbmodels_api;
        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;
    }

    location /openapi.json {
        proxy_pass http://cbmodels_api;
        proxy_set_header Host $host;
    }

    # Health check (no auth)
    location = /health {
        proxy_pass http://cbmodels_api/api/v1/health;
        proxy_set_header Host $host;
    }

    # Future frontend (port 32410)
    # location / {
    #     proxy_pass http://127.0.0.1:32410;
    #     proxy_set_header Host $host;
    #     proxy_set_header X-Real-IP $remote_addr;
    # }
}

Systemd Services

API Service

# /etc/systemd/system/cbmodels-api.service

[Unit]
Description=cbmodels Analysis API
After=network.target

[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/cbmodels
Environment="PATH=/opt/cbmodels/.venv/bin"
ExecStart=/opt/cbmodels/.venv/bin/uvicorn cbmodels.api.app:app --host 0.0.0.0 --port 32411
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

App Service (Future Frontend)

# /etc/systemd/system/cbmodels-app.service

[Unit]
Description=cbmodels Frontend App
After=network.target

[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/cbmodels
Environment="PATH=/opt/cbmodels/.venv/bin"
# ExecStart=/opt/cbmodels/.venv/bin/python -m cbmodels.app --host 0.0.0.0 --port 32410
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

Deployment Steps

# 1. Clone and setup
cd /opt
git clone git@github.com:Nominate-AI/cbmodels.git
cd cbmodels
python3 -m venv .venv
source .venv/bin/activate
pip install -e .

# 2. Copy database and build model
cp /path/to/pocket.db ./data/
cbmodels build ./data/pocket.db -o model.json

# 3. Enable and start services
sudo systemctl daemon-reload
sudo systemctl enable cbmodels-api
sudo systemctl start cbmodels-api

# 4. Enable NGINX site
sudo ln -s /etc/nginx/sites-available/models.nominate.ai /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Health Check

curl https://models.nominate.ai/health
# Expected: {"status":"healthy","model_loaded":true,"db_connected":true,"svid_field_configured":true}

Logs

sudo journalctl -u cbmodels-api -f