Newer
Older
veriq / scripts / deploy.sh
#!/usr/bin/env bash
# VerIQ deploy script — run on the VPS as root (or with sudo).
# Usage: sudo ./scripts/deploy.sh
set -euo pipefail

APP_DIR="/opt/veriq"
APP_USER="veriq"
SERVICE_NAME="veriq"
PORT="8801"
DOMAIN="${VERIQ_DOMAIN:-veriq.example.com}"
REPO="https://git.gnexus.space/git/root/veriq.git"
GIT_USER="root"
GIT_PASS="${VERIQ_GIT_PASS:?set VERIQ_GIT_PASS env var}"
DB_DIR="/var/lib/veriq"

echo "== VerIQ deploy to $DOMAIN =="

# 1. system deps
if ! command -v python3 >/dev/null; then apt-get update && apt-get install -y python3 python3-venv python3-pip; fi
apt-get install -y python3-pil >/dev/null 2>&1 || pip3 install --user pillow 2>/dev/null || true

# 2. app user + dirs
id -u "$APP_USER" &>/dev/null || useradd -r -s /usr/sbin/nologin "$APP_USER"
mkdir -p "$DB_DIR" "$DB_DIR/og_cache"
chown -R "$APP_USER:$APP_USER" "$DB_DIR"

# 3. code
if [ -d "$APP_DIR/.git" ]; then
  echo "-- updating existing checkout"
  cd "$APP_DIR" && sudo -u "$APP_USER" git pull --ff-only
else
  echo "-- fresh clone"
  git clone "https://${GIT_USER}:${GIT_PASS}@git.gnexus.space/git/root/veriq.git" "$APP_DIR"
  chown -R "$APP_USER:$APP_USER" "$APP_DIR"
fi

# 4. venv + deps
cd "$APP_DIR"
sudo -u "$APP_USER" python3 -m venv .venv
sudo -u "$APP_USER" .venv/bin/pip install -q -r requirements.txt pillow

# 5. systemd unit
cat > /etc/systemd/system/veriq.service <<EOF
[Unit]
Description=VerIQ backend (FastAPI)
After=network.target

[Service]
Type=simple
User=veriq
WorkingDirectory=$APP_DIR
Environment=VERIQ_DB_PATH=$DB_DIR/veriq.db
Environment=VERIQ_KEY_PATH=$DB_DIR/ed25519.key
Environment=VERIQ_OG_CACHE=$DB_DIR/og_cache
Environment=VERIQ_PORT=$PORT
ExecStart=$APP_DIR/.venv/bin/uvicorn backend.main:app --host 127.0.0.1 --port $PORT
Restart=always
RestartSec=3
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ReadWritePaths=$DB_DIR

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now veriq

# 6. nginx site
cat > /etc/nginx/sites-available/veriq <<EOF
server {
    listen 80;
    server_name $DOMAIN;

    location / {
        proxy_pass http://127.0.0.1:$PORT;
        proxy_set_header Host \$host;
        proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto \$scheme;
    }

    client_max_body_size 2m;
}
EOF
ln -sf /etc/nginx/sites-available/veriq /etc/nginx/sites-enabled/veriq
nginx -t && systemctl reload nginx

# 7. certbot
if ! command -v certbot >/dev/null; then apt-get install -y certbot python3-certbot-nginx; fi
certbot --nginx -d "$DOMAIN" --non-interactive --agree-tos -m "${VERIQ_LE_EMAIL:?set VERIQ_LE_EMAIL}" || echo "WARN: certbot failed, add TLS manually"

echo "== Done. Check: curl -s http://127.0.0.1:$PORT/ | head -1 =="