name: sk1 services: db: image: postgres:16-alpine container_name: sk1-db restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} volumes: - postgres_data:/var/lib/postgresql/data - ./backend/db/init.sql:/docker-entrypoint-initdb.d/init.sql:ro networks: - appnet healthcheck: test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] interval: 10s timeout: 5s retries: 10 backend: build: context: ./backend dockerfile: Dockerfile image: sk1-backend:latest container_name: sk1-backend restart: unless-stopped environment: PORT: "3000" POSTGRES_HOST: db POSTGRES_PORT: "5432" POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} depends_on: db: condition: service_healthy networks: - appnet healthcheck: test: ["CMD-SHELL", "wget -qO- http://localhost:3000/health || exit 1"] interval: 15s timeout: 5s retries: 5 start_period: 10s frontend: build: context: ./frontend dockerfile: Dockerfile image: sk1-frontend:latest container_name: sk1-frontend restart: unless-stopped networks: - appnet depends_on: - backend caddy: image: caddy:2-alpine container_name: sk1-caddy restart: unless-stopped ports: - "80:80" - "443:443" environment: DUCKDNS_DOMAIN: ${DUCKDNS_DOMAIN} LE_EMAIL: ${LE_EMAIL} volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config - ./logs/caddy:/var/log/caddy networks: - appnet depends_on: - frontend - backend networks: appnet: driver: bridge volumes: postgres_data: caddy_data: caddy_config: