services: postgres: image: postgres:17 environment: POSTGRES_DB: yeschef POSTGRES_USER: yeschef POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - yeschef-pgdata:/var/lib/postgresql/data expose: - "5432" restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U yeschef"] interval: 10s timeout: 5s retries: 5 backend: build: context: ./src/backend/YesChef.Api dockerfile: Dockerfile environment: ConnectionStrings__DefaultConnection: "Host=postgres;Database=yeschef;Username=yeschef;Password=${POSTGRES_PASSWORD}" Jwt__Secret: ${JWT_SECRET} FamilyCode: ${FAMILY_CODE} expose: - "5000" depends_on: postgres: condition: service_healthy restart: unless-stopped labels: - "traefik.enable=true" - "traefik.http.routers.yeschef-api.rule=Host(`${DOMAIN}`) && (PathPrefix(`/api`) || PathPrefix(`/hubs`) || Path(`/health`))" - "traefik.http.routers.yeschef-api.entrypoints=websecure" - "traefik.http.routers.yeschef-api.tls.certresolver=letsencrypt" - "traefik.http.services.yeschef-api.loadbalancer.server.port=5000" frontend: build: context: ./src/frontend dockerfile: Dockerfile environment: ORIGIN: https://${DOMAIN} expose: - "3000" depends_on: - backend restart: unless-stopped labels: - "traefik.enable=true" - "traefik.http.routers.yeschef-web.rule=Host(`${DOMAIN}`)" - "traefik.http.routers.yeschef-web.entrypoints=websecure" - "traefik.http.routers.yeschef-web.tls.certresolver=letsencrypt" - "traefik.http.routers.yeschef-web.priority=1" - "traefik.http.services.yeschef-web.loadbalancer.server.port=3000" volumes: yeschef-pgdata: