name: bonsai services: db: image: postgres:16-alpine container_name: bonsai-db restart: unless-stopped environment: POSTGRES_DB: bonsai POSTGRES_USER: bonsai POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} TZ: Europe/Paris healthcheck: test: ["CMD-SHELL", "pg_isready -U bonsai -d bonsai"] interval: 10s timeout: 5s retries: 5 volumes: - ~/Applications/data/bonsai/db_data:/var/lib/postgresql/data networks: - bonsai-net api: build: context: . dockerfile: Dockerfile.api secrets: - ssh_key container_name: bonsai-api restart: unless-stopped depends_on: db: condition: service_healthy environment: DATASOURCE_URL: jdbc:postgresql://db:5432/bonsai DATASOURCE_USERNAME: bonsai DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD} KEYCLOAK_JWKS_URI: https://auth.goutailler-olivier.com/realms/bonsai/protocol/openid-connect/certs CORS_ALLOWED_ORIGIN_PROD: https://bonsai.goutailler-olivier.com SERVER_SERVLET_CONTEXT_PATH: /api TZ: Europe/Paris volumes: - ~/Applications/data/bonsai/uploads:/app/uploads networks: - bonsai-net - proxy labels: - traefik.enable=true - traefik.http.routers.bonsai-api.rule=Host(`bonsai.goutailler-olivier.com`) && PathPrefix(`/api`) - traefik.http.routers.bonsai-api.entrypoints=websecure - traefik.http.routers.bonsai-api.tls.certresolver=le - traefik.http.services.bonsai-api.loadbalancer.server.port=8080 - traefik.docker.network=proxy webapp: build: context: . dockerfile: Dockerfile.webapp secrets: - ssh_key container_name: bonsai-webapp restart: unless-stopped depends_on: - api environment: TZ: Europe/Paris networks: - bonsai-net - proxy labels: - traefik.enable=true - traefik.http.routers.bonsai-webapp.rule=Host(`bonsai.goutailler-olivier.com`) - traefik.http.routers.bonsai-webapp.entrypoints=websecure - traefik.http.routers.bonsai-webapp.tls.certresolver=le - traefik.http.services.bonsai-webapp.loadbalancer.server.port=80 - traefik.docker.network=proxy networks: bonsai-net: driver: bridge proxy: external: true name: proxy secrets: ssh_key: file: ${SSH_KEY_PATH}