# ============================================================================= # feature-container-runtime-contract — local infrastructure override # # Merge with base (and optionally dev): # docker compose -f docker-compose.yml -f docker-compose.local.yml up # # Local intent: # - Starts a local PostgreSQL database for integration testing without Testcontainers. # - Wires the app environment to point at the local DB. # - Keeps read-only filesystem and memory limits from the base compose. # - Does NOT expose the DB port publicly; app and db communicate on the # internal `caskeleton-local` network only. # ============================================================================= services: app: env_file: - ./src/.env # Wire the app to the local Postgres service on the internal network. environment: TZ: "UTC" LANG: "C.UTF-8" LC_ALL: "C.UTF-8" # fallback matches env-keys.yaml SSOT default (30s); base compose grace is 40s. APP_SERVER_SHUTDOWN_TIMEOUT: "${APP_SERVER_SHUTDOWN_TIMEOUT:-30s}" APP_SERVER_SHUTDOWN: "graceful" # Database connection — points to the local `db` service below. # Override with your actual DB credentials in a local .env file. APP_DATASOURCE_URL: "jdbc:postgresql://db:5432/${POSTGRES_DB:-ca_skeleton}" APP_DATASOURCE_USERNAME: "${APP_DATASOURCE_USERNAME:-ca_skeleton}" APP_DATASOURCE_PASSWORD: "${APP_DATASOURCE_PASSWORD:-ca_skeleton}" depends_on: db: condition: service_healthy healthcheck: test: - "CMD" - "wget" - "--no-verbose" - "--tries=1" - "--spider" - "http://localhost:8080/api/healthcheck" interval: 5s timeout: 3s start_period: 20s retries: 12 networks: - caskeleton-local db: image: postgres:16-alpine environment: POSTGRES_DB: "${POSTGRES_DB:-ca_skeleton}" POSTGRES_USER: "${APP_DATASOURCE_USERNAME:-ca_skeleton}" POSTGRES_PASSWORD: "${APP_DATASOURCE_PASSWORD:-ca_skeleton}" TZ: "UTC" # Persist data between restarts; remove the volume to start fresh. volumes: - type: volume source: caskeleton-db-data target: /var/lib/postgresql/data # No host port: startup Flyway runs in the app container over the internal network. networks: - caskeleton-local healthcheck: test: [ "CMD-SHELL", "pg_isready -U ${APP_DATASOURCE_USERNAME:-ca_skeleton} -d ${POSTGRES_DB:-ca_skeleton}", ] interval: 10s timeout: 5s retries: 5 start_period: 30s restart: unless-stopped networks: caskeleton-local: driver: bridge volumes: caskeleton-db-data: driver: local