services: db: image: postgres:17-alpine container_name: shop-db restart: unless-stopped environment: POSTGRES_USER: ${DB_USER:-shop} POSTGRES_PASSWORD: ${DB_PASSWORD:-shop_secret} POSTGRES_DB: ${DB_NAME:-shop} volumes: - pgdata:/var/lib/postgresql/data - ./migrations/001_init.sql:/docker-entrypoint-initdb.d/001_init.sql:ro - ./migrations/002_admins.sql:/docker-entrypoint-initdb.d/002_admins.sql:ro healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-shop} -d ${DB_NAME:-shop}"] interval: 5s timeout: 5s retries: 10 networks: - shop-net app: build: context: . dockerfile: Dockerfile container_name: shop-app restart: unless-stopped environment: DB_HOST: db DB_PORT: "5432" DB_USER: ${DB_USER:-shop} DB_PASSWORD: ${DB_PASSWORD:-shop_secret} DB_NAME: ${DB_NAME:-shop} APP_PORT: "8080" ADMIN_EMAIL: ${ADMIN_EMAIL:-admin@shop.local} ADMIN_PASSWORD: ${ADMIN_PASSWORD:-change_me} SESSION_SECRET: ${SESSION_SECRET:-dev_session_secret} depends_on: db: condition: service_healthy networks: - shop-net caddy: image: caddy:2-alpine container_name: shop-caddy restart: unless-stopped ports: - "80:80" - "443:443" - "2019:2019" environment: DOMAIN: ${DOMAIN:-localhost} volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config depends_on: - app networks: - shop-net volumes: pgdata: caddy_data: caddy_config: networks: shop-net: driver: bridge