version: "3.8" services: # PostgreSQL Database db: image: postgres:15-alpine container_name: bookhoard_db environment: POSTGRES_DB: bookhoard POSTGRES_USER: postgres POSTGRES_PASSWORD: ${DBPASS} COOKIE_SECURE: false # make true in production with HTTPS volumes: - postgres_data:/var/lib/postgresql/data - ./database/schema:/docker-entrypoint-initdb.d # Make other volumes as needed - ./uploads:/app/uploads ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 3 env_file: - .env # Bookhoard Application app: build: context: . dockerfile: ./Dockerfile container_name: bookhoard environment: # Database Configuration DATABASE_HOST: db DATABASE_PORT: 5432 DATABASE_USER: postgres DATABASE_PASSWORD: ${DBPASS} DATABASE_NAME: bookhoard # Application Configuration JWT_SECRET: ${JWT_SECRET} SERVER_PORT: 8765 # IMPORTANT: Device sync requires full URL with protocol # Local: http://localhost:8765 # Local network: http://192.168.1.X:8765 # Domain: https://bookhoard.example.com BASE_URL: http://localhost:${SERVER_PORT} # Rate Limiting Configuration TEST_MODE: ${TEST_MODE:-false} RATE_LIMIT_ENABLED: ${RATE_LIMIT_ENABLED:-true} REQUESTS_PER_MINUTE: ${REQUESTS_PER_MINUTE:-10} # Conversion Service Configuration BOOKHOARD_CONVERSION_CACHE_DIR: ${BOOKHOARD_CONVERSION_CACHE_DIR:-/app/cache/kepub} BOOKHOARD_CONVERSION_TOOL: ${BOOKHOARD_CONVERSION_TOOL:-/usr/bin/kepubify} BOOKHOARD_CONVERSION_CACHE_TTL: ${BOOKHOARD_CONVERSION_CACHE_TTL:-24h} # System timezone (fallback for server-side time operations) TZ: ${TZ:-UTC} ports: - "8765:8765" depends_on: db: condition: service_healthy volumes: - ./uploads:/app/uploads - bookhoard_conversion_cache:/app/cache/kepub healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:8765/health || exit 1"] interval: 10s timeout: 5s retries: 3 start_period: 10s # Integration Tests - runs against containerized app and db tests: build: context: . dockerfile: ./Dockerfile target: test-runner container_name: bookhoard_tests environment: # Database Configuration DATABASE_HOST: db DATABASE_PORT: 5432 DATABASE_USER: postgres DATABASE_PASSWORD: ${DBPASS} DATABASE_NAME: bookhoard COOKIE_SECURE: false # Application Configuration JWT_SECRET: ${JWT_SECRET} SERVER_PORT: 8765 # Test Configuration TEST_MODE: "true" RATE_LIMIT_ENABLED: "false" REQUESTS_PER_MINUTE: 1000 # Conversion Service Configuration BOOKHOARD_CONVERSION_CACHE_DIR: /app/cache/kepub BOOKHOARD_CONVERSION_TOOL: /usr/bin/kepubify BOOKHOARD_CONVERSION_CACHE_TTL: 24h # Test upload path (inside container) TEST_UPLOAD_PATH: /app/uploads depends_on: db: condition: service_healthy app: condition: service_healthy volumes: - ./uploads:/app/uploads - bookhoard_conversion_cache:/app/cache/kepub profiles: - tests # Named Volumes volumes: postgres_data: bookhoard_conversion_cache: