candle-annotator/openspec/changes/ml-db-consolidation/specs/docker-deployment/spec.md
Marko Djordjevic 5f70f13da3 feat: migrate from SQLite to PostgreSQL - complete schema and API updates
- Remove better-sqlite3, add pg driver
- Convert schema to PostgreSQL types (serial, timestamp, boolean, jsonb)
- Generate fresh PostgreSQL migrations
- Update database connection layer with pg.Pool
- Fix all API routes: remove JSON.parse/stringify, use native timestamps and booleans
- Update drizzle.config.ts and .env.example for PostgreSQL
2026-02-17 13:43:06 +01:00

3.4 KiB

MODIFIED Requirements

Requirement: Docker Compose configuration

The project SHALL include docker-compose.yml for simplified deployment orchestration.

Scenario: Service definition

  • WHEN docker-compose.yml is parsed
  • THEN defines service named 'candle-annotator' using Dockerfile from current directory

Scenario: Port mapping

  • WHEN docker-compose up runs
  • THEN maps host port 3000 to container port 3000

Scenario: Volume mounting for ML data

  • WHEN docker-compose up runs
  • THEN mounts named volume 'ml-data' to /app/ml-data in the candle-annotator container

Scenario: Frontend depends on PostgreSQL

  • WHEN docker-compose up runs
  • THEN the candle-annotator service starts only after the postgres service is healthy (depends_on: postgres: condition: service_healthy)

Scenario: Frontend DATABASE_URL

  • WHEN the candle-annotator service starts
  • THEN the DATABASE_URL environment variable is set to postgresql://ml_user:ml_password@postgres:5432/candle_annotator

Scenario: Restart policy

  • WHEN container crashes or stops
  • THEN docker-compose automatically restarts container unless explicitly stopped (restart: unless-stopped)

Scenario: No SQLite volume

  • WHEN docker-compose.yml is parsed
  • THEN there is no candle-data volume defined or mounted

Requirement: Environment variable configuration

The project SHALL use environment variables for runtime configuration.

Scenario: .env.example file

  • WHEN repository is cloned
  • THEN includes .env.example file documenting all configurable environment variables with example values

Scenario: DATABASE_URL configuration

  • WHEN DATABASE_URL environment variable is set
  • THEN the Next.js application connects to the PostgreSQL database at the specified URL

Scenario: No DATABASE_PATH variable

  • WHEN environment variables are inspected
  • THEN there is no DATABASE_PATH variable (SQLite path is removed)

Scenario: PORT configuration

  • WHEN PORT environment variable is set
  • THEN Next.js server listens on specified port (default: 3000)

Scenario: NODE_ENV configuration

  • WHEN NODE_ENV environment variable is set to 'production'
  • THEN Next.js runs in production mode with optimizations enabled

Requirement: Database persistence

The deployment SHALL ensure PostgreSQL data persists across container restarts.

Scenario: PostgreSQL volume

  • WHEN docker-compose up runs
  • THEN the postgres-data named volume is mounted to /var/lib/postgresql/data in the postgres container

Scenario: Container restart preserves data

  • WHEN the postgres container is stopped and restarted
  • THEN all database tables and data remain intact

Scenario: PostgreSQL database name

  • WHEN the postgres service starts
  • THEN the POSTGRES_DB environment variable is set to candle_annotator

Requirement: Health check endpoint

The API SHALL provide a health check endpoint for container orchestration.

Scenario: Health check endpoint responds

  • WHEN GET request sent to /api/health
  • THEN system returns 200 status with JSON { status: 'ok', timestamp: <unix_timestamp> }

Scenario: Database connection check

  • WHEN GET request sent to /api/health?check=db
  • THEN system attempts a PostgreSQL query and returns 200 if successful, 503 if database unavailable