version: "3.9" services: ######################################################################## # POSTGRES DATABASE (Development) ######################################################################## db_postgres: image: "postgres:17-alpine" container_name: "shipment_db_dev" restart: always healthcheck: test: ["CMD-SHELL", "pg_isready", "-d", "zitadel", "-U", "postgres"] interval: 10s timeout: 30s retries: 5 start_period: 20s environment: POSTGRES_USER: "${POSTGRES_USER}" POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}" POSTGRES_DB: "${POSTGRES_DB}" APP_DB_NAME: "${APP_DB_NAME}" ZITADEL_DB_NAME: "${ZITADEL_DB_NAME}" networks: - "web" volumes: - "db_data:/var/lib/postgresql/data" - "./init-scripts/:/docker-entrypoint-initdb.d/" ports: - "5432:5432" logging: driver: "json-file" options: max-size: "10m" max-file: "14" ######################################################################## # NEXT.JS APPLICATION (Development) ######################################################################## app: build: context: . dockerfile: Dockerfile container_name: "shipment_app_dev" restart: always environment: NEXTAUTH_URL: "${NEXTAUTH_URL:-http://localhost:3000}" DATABASE_URL: "${DATABASE_URL:-postgresql://shipment_admin:password@db_postgres:5432/shipment}" AUTH_SECRET: "${AUTH_SECRET}" RESEND_API_KEY: "${RESEND_API_KEY}" NEXT_PUBLIC_URL: "${NEXT_PUBLIC_URL}" # Zitadel OAuth credentials ZITADEL_CLIENT_ID: "${ZITADEL_CLIENT_ID}" ZITADEL_CLIENT_SECRET: "${ZITADEL_CLIENT_SECRET}" ZITADEL_ISSUER: "http://localhost:8080" NODE_ENV: "development" ports: - "3000:3000" networks: - "web" depends_on: - db_postgres logging: driver: "json-file" options: max-size: "10m" max-file: "14" ######################################################################## # ZITADEL SERVICE (Development) - Using direct command approach ######################################################################## zitadel: image: "ghcr.io/zitadel/zitadel:latest" container_name: "shipment_zitadel_dev" command: 'start-from-init --config /etc/zitadel/zitadel.yaml --masterkey 9c1bf1auuoqAMpd9A3FiBuhRKbB1tEub' restart: always ports: - "8080:8080" volumes: - "./zitadel.yaml:/etc/zitadel/zitadel.yaml" environment: ZITADEL_DATABASE_POSTGRES_HOST: "${ZITADEL_DATABASE_POSTGRES_HOST:-db_postgres}" ZITADEL_DATABASE_POSTGRES_PORT: "${ZITADEL_DATABASE_POSTGRES_PORT}" ZITADEL_DATABASE_POSTGRES_DATABASE: "${ZITADEL_DATABASE_POSTGRES_DATABASE}" ZITADEL_DATABASE_POSTGRES_USER_USERNAME: "${ZITADEL_DATABASE_POSTGRES_USER_USERNAME}" ZITADEL_DATABASE_POSTGRES_USER_PASSWORD: "${ZITADEL_DATABASE_POSTGRES_USER_PASSWORD}" ZITADEL_DATABASE_POSTGRES_USER_SSL_MODE: "${ZITADEL_DATABASE_POSTGRES_USER_SSL_MODE:-disable}" ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME: "${ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME:-shipment_admin}" ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD: "${ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD}" ZITADEL_DATABASE_POSTGRES_ADMIN_SSL_MODE: "${ZITADEL_DATABASE_POSTGRES_ADMIN_SSL_MODE:-disable}" ZITADEL_EXTERNALSECURE: "${ZITADEL_EXTERNALSECURE:-false}" ZITADEL_EXTERNALPORT: "${ZITADEL_EXTERNALPORT:-8080}" networks: - "web" depends_on: db_postgres: condition: "service_healthy" logging: driver: "json-file" options: max-size: "10m" max-file: "14" ######################################################################## # NETWORKS & VOLUMES ######################################################################## networks: web: volumes: db_data: