# Docker Infrastructure Specification

## Purpose

Provide a complete Docker-based development environment with all required services.

## Requirements

### Requirement: Docker Compose Setup

The system SHALL provide Docker Compose configurations for both development and traefik deployment.

#### Scenario: Development compose file
- GIVEN the development environment
- THEN `docker-compose.yml` SHALL define all platform services for local development

#### Scenario: Traefik compose file
- GIVEN the production deployment
- THEN `docker-compose.traefik.yml` SHALL define all platform services behind Traefik
- AND no ports SHALL be exposed directly (all traffic through Traefik)

### Requirement: Multi-Stage API Dockerfile

The system SHALL build the API using a multi-stage Docker build.

#### Scenario: API container build
- GIVEN the API source code
- WHEN building the Docker image
- THEN `apps/api/Dockerfile` SHALL:
  - Use Python 3.11+ base image
  - Install dependencies in a builder stage
  - Copy only necessary files to production stage
  - Run as non-root user
  - Expose port 8000

### Requirement: Web Frontend Dockerfile

The system SHALL build the web frontend for production deployment.

#### Scenario: Web container build
- GIVEN the frontend source code
- WHEN building the Docker image
- THEN `apps/web/Dockerfile` SHALL:
  - Use Node.js 20+ base image
  - Install dependencies
  - Build the production bundle with Vite
  - Serve via nginx or similar
  - Run as non-root user

### Requirement: Environment Configuration

The system SHALL document all required environment variables for both development and traefik deployment modes.

#### Scenario: Environment setup
- GIVEN a new developer or operator
- WHEN they set up the project
- THEN `.env.example` SHALL document all variables for both modes
- AND variables SHALL include:
  - Database connection strings
  - Redis connection strings
  - Authentik configuration
  - JWT secrets
  - Docker volume paths
  - Domain configuration for traefik mode
  - External service URLs

### Requirement: Service Health Checks

The system SHALL provide health checks for all services.

#### Scenario: Health verification
- GIVEN running services
- WHEN health checks are performed
- THEN each service reports healthy status
- AND unhealthy services are restarted automatically

### Requirement: Makefile Commands

The system SHALL provide common operational commands.

#### Scenario: Developer workflow
- GIVEN the project repository
- WHEN a developer runs make commands
- THEN these commands work:
  - `make up` - Start all services
  - `make down` - Stop all services
  - `make logs` - View service logs
  - `make migrate` - Run database migrations
  - `make test` - Run test suites
  - `make lint` - Run linting

### Requirement: Persistent Storage

The system SHALL persist git repositories across container restarts.

#### Scenario: Repository storage
- GIVEN the Docker setup
- THEN a dedicated volume SHALL mount at `/data/repos`
- AND repositories persist across container restarts

## Dependencies

- Docker 24.0+
- Docker Compose 2.20+
- Make

## Quality Gates

- `docker-compose config` validates without errors
- All services start successfully with `make up`
- Health checks pass for all services
- `pytest` must pass
- `mypy .` must pass
- `ruff check .` must pass
