name: ${COMPOSE_PROJECT_NAME} services: # --- Infrastructure --- postgres: image: postgres:17-alpine container_name: ${COMPOSE_PROJECT_NAME}_db environment: - POSTGRES_PASSWORD=${DB_PASSWORD} ports: - "${DB_PORT}:5432" volumes: - db_data_${INSTANCE_NAME}:/var/lib/postgresql/data networks: [app_net] healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s redis: image: redis:7-alpine container_name: ${COMPOSE_PROJECT_NAME}_redis ports: - "${REDIS_PORT}:6379" networks: [app_net] clickhouse: image: clickhouse/clickhouse-server:latest container_name: ${COMPOSE_PROJECT_NAME}_clickhouse environment: - CLICKHOUSE_USER=baron - CLICKHOUSE_PASSWORD=${CLICKHOUSE_PASSWORD} ports: - "${CLICKHOUSE_PORT_HTTP}:8123" - "${CLICKHOUSE_PORT_NATIVE}:9000" volumes: - clickhouse_data_${INSTANCE_NAME}:/var/lib/clickhouse networks: [app_net] # --- Ory Stack --- postgres_ory: image: postgres:17-alpine container_name: ${COMPOSE_PROJECT_NAME}_ory_db environment: - POSTGRES_USER=${ORY_POSTGRES_USER} - POSTGRES_PASSWORD=${ORY_POSTGRES_PASSWORD} volumes: - ory_db_data_${INSTANCE_NAME}:/var/lib/postgresql/data networks: [app_net] healthcheck: test: ["CMD-SHELL", "pg_isready -U ${ORY_POSTGRES_USER}"] interval: 5s kratos: image: oryd/kratos:v25.4.0 container_name: ${COMPOSE_PROJECT_NAME}_kratos env_file: .env volumes: - ./ory/kratos:/etc/config/kratos:ro command: serve -c /etc/config/kratos/kratos.yml --dev networks: [app_net] depends_on: postgres_ory: { condition: service_healthy } oathkeeper: image: oryd/oathkeeper:v25.4.0 container_name: ${COMPOSE_PROJECT_NAME}_oathkeeper env_file: .env ports: - "${OATHKEEPER_PROXY_PORT}:4455" volumes: - ./ory/oathkeeper:/etc/config/oathkeeper:ro networks: [app_net] # --- Application Services --- backend: image: baron-backend:latest container_name: ${COMPOSE_PROJECT_NAME}_backend env_file: .env environment: - PORT=${BACKEND_PORT} - DB_HOST=postgres - REDIS_ADDR=redis:6379 - CLICKHOUSE_HOST=clickhouse ports: - "${BACKEND_PORT}:${BACKEND_PORT}" networks: [app_net] depends_on: postgres: { condition: service_healthy } redis: { condition: service_started } gateway: image: nginx:alpine container_name: ${COMPOSE_PROJECT_NAME}_gateway ports: - "${USERFRONT_PORT}:80" volumes: - ./gateway/nginx.conf:/etc/nginx/nginx.conf:ro networks: [app_net] adminfront: image: node:20-alpine container_name: ${COMPOSE_PROJECT_NAME}_adminfront working_dir: /app env_file: .env ports: - "${ADMINFRONT_PORT}:5173" volumes: - ../../adminfront:/app - ./adminfront/vite.config.ts:/app/vite.config.ts:ro - ./adminfront/auth.ts:/app/src/lib/auth.ts:ro command: npm run dev -- --host 0.0.0.0 networks: [app_net] devfront: image: node:20-alpine container_name: ${COMPOSE_PROJECT_NAME}_devfront working_dir: /app env_file: .env ports: - "${DEVFRONT_PORT}:5173" volumes: - ../../devfront:/app - ./devfront/vite.config.ts:/app/vite.config.ts:ro - ./devfront/auth.ts:/app/src/lib/auth.ts:ro command: npm run dev -- --host 0.0.0.0 networks: [app_net] networks: app_net: name: ${COMPOSE_PROJECT_NAME}_net volumes: db_data_${INSTANCE_NAME}: ory_db_data_${INSTANCE_NAME}: clickhouse_data_${INSTANCE_NAME}: