ops: add docker-compose.yml and deploy-postgres.sh for production cutover
- docker-compose.yml: Postgres 16 Alpine on port 5433 with healthcheck - scripts/deploy-postgres.sh: one-shot deployment script that handles container startup, schema creation, npm install, data migration, and frontend build - Backup SQLite database as cve_database.db.pre-postgres-backup
This commit is contained in:
BIN
backend/cve_database.db.pre-postgres-backup
Normal file
BIN
backend/cve_database.db.pre-postgres-backup
Normal file
Binary file not shown.
26
docker-compose.yml
Normal file
26
docker-compose.yml
Normal file
@@ -0,0 +1,26 @@
|
||||
# Docker Compose for CVE Dashboard PostgreSQL
|
||||
# Run: docker compose up -d
|
||||
# Stop: docker compose down
|
||||
# View logs: docker compose logs -f postgres
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:16-alpine
|
||||
container_name: steam-postgres
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_DB: cve_dashboard
|
||||
POSTGRES_USER: steam
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-sV4xmC9xAUCFop0ypxMVS056QgPqGrX}
|
||||
ports:
|
||||
- "5433:5432"
|
||||
volumes:
|
||||
- steam-pgdata:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U steam -d cve_dashboard"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
volumes:
|
||||
steam-pgdata:
|
||||
118
scripts/deploy-postgres.sh
Executable file
118
scripts/deploy-postgres.sh
Executable file
@@ -0,0 +1,118 @@
|
||||
#!/bin/bash
|
||||
# =============================================================================
|
||||
# deploy-postgres.sh — One-time deployment script for Postgres migration
|
||||
# =============================================================================
|
||||
# Run this ONCE on a fresh server after pulling the feature/multi-tenancy code.
|
||||
# Prerequisites: Docker installed, Node.js 18+, npm
|
||||
#
|
||||
# What this does:
|
||||
# 1. Starts the Postgres container (docker compose)
|
||||
# 2. Waits for Postgres to be ready
|
||||
# 3. Runs the schema DDL
|
||||
# 4. Installs npm dependencies (adds 'pg' package)
|
||||
# 5. Runs the data migration script (SQLite → Postgres)
|
||||
# 6. Rebuilds the frontend
|
||||
# 7. Prints next steps
|
||||
#
|
||||
# Usage:
|
||||
# chmod +x scripts/deploy-postgres.sh
|
||||
# ./scripts/deploy-postgres.sh
|
||||
# =============================================================================
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
||||
cd "$PROJECT_DIR"
|
||||
|
||||
echo ""
|
||||
echo "╔════════════════════════════════════════════════════════╗"
|
||||
echo "║ CVE Dashboard — Postgres Deployment Script ║"
|
||||
echo "╚════════════════════════════════════════════════════════╝"
|
||||
echo ""
|
||||
|
||||
# Check prerequisites
|
||||
command -v docker >/dev/null 2>&1 || { echo "ERROR: Docker is not installed. Install with: apt install -y docker.io"; exit 1; }
|
||||
command -v node >/dev/null 2>&1 || { echo "ERROR: Node.js is not installed."; exit 1; }
|
||||
command -v psql >/dev/null 2>&1 || { echo "WARNING: psql not found. Installing postgresql-client..."; apt install -y postgresql-client >/dev/null 2>&1 || true; }
|
||||
|
||||
# Check if .env has DATABASE_URL
|
||||
if ! grep -q "DATABASE_URL" backend/.env 2>/dev/null; then
|
||||
echo "Adding DATABASE_URL to backend/.env..."
|
||||
echo "" >> backend/.env
|
||||
echo "# PostgreSQL (Docker container steam-postgres on port 5433)" >> backend/.env
|
||||
echo "DATABASE_URL=postgresql://steam:sV4xmC9xAUCFop0ypxMVS056QgPqGrX@localhost:5433/cve_dashboard" >> backend/.env
|
||||
echo "✓ DATABASE_URL added to .env"
|
||||
else
|
||||
echo "✓ DATABASE_URL already in .env"
|
||||
fi
|
||||
|
||||
# Step 1: Start Postgres container
|
||||
echo ""
|
||||
echo "── Step 1: Starting Postgres container ──"
|
||||
if docker ps --format '{{.Names}}' | grep -q steam-postgres; then
|
||||
echo "✓ steam-postgres container already running"
|
||||
else
|
||||
docker compose up -d
|
||||
echo "✓ Container started"
|
||||
fi
|
||||
|
||||
# Step 2: Wait for Postgres to be ready
|
||||
echo ""
|
||||
echo "── Step 2: Waiting for Postgres to be ready ──"
|
||||
for i in $(seq 1 30); do
|
||||
if PGPASSWORD=sV4xmC9xAUCFop0ypxMVS056QgPqGrX psql -h localhost -p 5433 -U steam -d cve_dashboard -c "SELECT 1" >/dev/null 2>&1; then
|
||||
echo "✓ Postgres is ready"
|
||||
break
|
||||
fi
|
||||
if [ $i -eq 30 ]; then
|
||||
echo "ERROR: Postgres did not become ready in 30 seconds"
|
||||
exit 1
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
# Step 3: Run schema
|
||||
echo ""
|
||||
echo "── Step 3: Creating schema ──"
|
||||
PGPASSWORD=sV4xmC9xAUCFop0ypxMVS056QgPqGrX psql -h localhost -p 5433 -U steam -d cve_dashboard -f backend/db-schema.sql >/dev/null 2>&1
|
||||
echo "✓ Schema created"
|
||||
|
||||
# Step 4: Install dependencies
|
||||
echo ""
|
||||
echo "── Step 4: Installing npm dependencies ──"
|
||||
cd backend && npm install --production >/dev/null 2>&1 && cd ..
|
||||
echo "✓ Dependencies installed"
|
||||
|
||||
# Step 5: Run data migration
|
||||
echo ""
|
||||
echo "── Step 5: Running data migration (SQLite → Postgres) ──"
|
||||
if [ -f backend/cve_database.db ]; then
|
||||
node backend/scripts/migrate-to-postgres.js
|
||||
else
|
||||
echo "⚠ No SQLite database found — skipping migration (fresh install)"
|
||||
fi
|
||||
|
||||
# Step 6: Build frontend
|
||||
echo ""
|
||||
echo "── Step 6: Building frontend ──"
|
||||
cd frontend && npm install >/dev/null 2>&1 && npm run build >/dev/null 2>&1 && cd ..
|
||||
echo "✓ Frontend built"
|
||||
|
||||
# Done
|
||||
echo ""
|
||||
echo "╔════════════════════════════════════════════════════════╗"
|
||||
echo "║ Deployment complete! ║"
|
||||
echo "╚════════════════════════════════════════════════════════╝"
|
||||
echo ""
|
||||
echo "Next steps:"
|
||||
echo " 1. Stop the old backend: kill \$(lsof -t -i:3001)"
|
||||
echo " 2. Start the new backend: node backend/server.js"
|
||||
echo " 3. Verify: curl http://localhost:3001/api/auth/me"
|
||||
echo ""
|
||||
echo "Rollback (if needed):"
|
||||
echo " 1. Stop the new backend"
|
||||
echo " 2. Remove DATABASE_URL from backend/.env"
|
||||
echo " 3. git checkout master~1 (go back one commit)"
|
||||
echo " 4. Restart the old backend"
|
||||
echo ""
|
||||
Reference in New Issue
Block a user