Quote DATABASE_PORT and SERVER_PORT ("5432", "8765") in docker-compose.yml so they are treated as strings rather than YAML integers, avoiding type-coercion warnings from compose runtimes.
126 lines
3.4 KiB
YAML
126 lines
3.4 KiB
YAML
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: 30s
|
|
timeout: 5s
|
|
retries: 3
|
|
start_period: 10s
|
|
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: 30s
|
|
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:
|