Files
warmbly/deploy/docker/docker-compose.yml
T

343 lines
9.3 KiB
YAML

services:
# Infrastructure
postgres:
image: postgres:16-alpine
environment:
POSTGRES_USER: warmbly
POSTGRES_PASSWORD: warmbly
POSTGRES_DB: warmbly_dev
POSTGRES_HOST_AUTH_METHOD: md5
POSTGRES_INITDB_ARGS: "--auth-host=md5"
ports:
- "15432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U warmbly"]
interval: 5s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
ports:
- "16379:6379"
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 5s
retries: 5
zookeeper:
image: confluentinc/cp-zookeeper:7.5.0
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
kafka:
image: confluentinc/cp-kafka:7.5.0
depends_on:
- zookeeper
ports:
- "19092:19092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:29092,PLAINTEXT_HOST://0.0.0.0:19092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:19092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
healthcheck:
test: ["CMD", "kafka-broker-api-versions", "--bootstrap-server", "localhost:29092"]
interval: 10s
timeout: 10s
retries: 10
start_period: 30s
schema-registry:
image: confluentinc/cp-schema-registry:7.5.0
depends_on:
- kafka
ports:
- "18081:8081"
environment:
SCHEMA_REGISTRY_HOST_NAME: schema-registry
SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: kafka:29092
cloud-tasks-emulator:
image: ghcr.io/aertje/cloud-tasks-emulator:latest
command: ["-host", "0.0.0.0", "-port", "8123", "-queue", "projects/local/locations/local/queues/default"]
ports:
- "18123:8123"
mailpit:
image: axllent/mailpit:latest
ports:
- "18025:8025" # Web UI
- "11025:1025" # SMTP
# Application Services
backend:
build:
context: ../..
dockerfile: deploy/docker/backend.Dockerfile
ports:
- "8080:8080"
environment:
# === General ===
APP_ENV: dev
AWS_CONFIG_ENABLED: "false"
AWS_REGION: us-east-1
# === API ===
API_HOST: "0.0.0.0:8080"
GIN_MODE: debug
WEBSOCKET_URL: ws://localhost:14000/socket/websocket
# === Database ===
PRIMARY_DB: postgres://warmbly:warmbly@postgres:5432/warmbly_dev?sslmode=disable
REDIS: redis://redis:6379
GEODB_PATH: /app/data/GeoLite2-City.mmdb
# === Kafka ===
KAFKA_BOOTSTRAP_SERVERS: kafka:29092
KAFKA_CONSUMER_GROUP: consumer-group
KAFKA_TRACKING_TOPIC: tracking-events
# KAFKA_SASL_USERNAME: (not needed for local dev)
# KAFKA_SASL_PASSWORD: (not needed for local dev)
# === Schema Registry ===
SCHEMA_REGISTRY_URL: http://schema-registry:8081
# SCHEMA_REGISTRY_KEY: (not needed for local dev)
# SCHEMA_REGISTRY_SECRET: (not needed for local dev)
# === Auth ===
AUTH_SECRET: local-dev-auth-secret-minimum-32-characters-long
GOOGLE_CLIENT_ID: local-google-client-id
GOOGLE_CLIENT_SECRET: local-google-client-secret
GOOGLE_REDIRECT_URI: http://localhost:13000/auth/google/callback
APPLE_APP_ID: local-apple-app-id
APPLE_TEAM_ID: local-apple-team-id
APPLE_KEY_ID: local-apple-key-id
APPLE_KEY_SECRET: local-apple-key-secret-base64
TURNSTILE_SECRET: 1x0000000000000000000000000000000AA
TURNSTILE_BYPASS_TOKEN: warmbly-local-turnstile-bypass
# === Stripe ===
STRIPE_SECRET_KEY: sk_test_local
STRIPE_WEBHOOK_SECRET: whsec_local
STRIPE_PUBLISHABLE_KEY: pk_test_local
# === Email ===
EMAIL_NAME: Warmbly Dev
EMAIL_ADDRESS: dev@warmbly.local
TRACKING_DOMAIN: localhost:13000
# === SMTP (local mail catcher) ===
SMTP_HOST: mailpit
SMTP_PORT: "1025"
# === GCP (optional) ===
GCP_PROJECT_ID: ""
GOOGLE_APPLICATION_CREDENTIALS_JSON: "dev@local.iam.gserviceaccount.com"
# === Cloud Tasks ===
CLOUD_TASKS_EMULATOR_HOST: cloud-tasks-emulator:8123
CLOUD_TASKS_QUEUE_NAME: projects/local/locations/local/queues/default
CLOUD_TASKS_WEBHOOK_URL: http://backend:8080/webhook/email
# === Cassandra/Astra (dev stubs) ===
ASTRA_DB_ID: local-astra-db-id
ASTRA_DB_REGION: local-region
ASTRA_KEYSPACE_NAME: warmbly_dev
ASTRA_APPLICATION_TOKEN: local-astra-token
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
kafka:
condition: service_healthy
schema-registry:
condition: service_started
cloud-tasks-emulator:
condition: service_started
consumer:
build:
context: ../..
dockerfile: deploy/docker/consumer.Dockerfile
environment:
# === General ===
APP_ENV: dev
AWS_CONFIG_ENABLED: "false"
AWS_REGION: us-east-1
# === Database ===
PRIMARY_DB: postgres://warmbly:warmbly@postgres:5432/warmbly_dev?sslmode=disable
REDIS: redis://redis:6379
# === Kafka ===
KAFKA_BOOTSTRAP_SERVERS: kafka:29092
KAFKA_CONSUMER_GROUP: consumer-group
# === Schema Registry ===
SCHEMA_REGISTRY_URL: http://schema-registry:8081
# === Cassandra/Astra (dev stubs) ===
ASTRA_DB_ID: local-astra-db-id
ASTRA_DB_REGION: local-region
ASTRA_KEYSPACE_NAME: warmbly_dev
ASTRA_APPLICATION_TOKEN: local-astra-token
# === GCP (optional) ===
GCP_PROJECT_ID: ""
depends_on:
backend:
condition: service_started
kafka:
condition: service_healthy
schema-registry:
condition: service_started
worker:
build:
context: ../..
dockerfile: deploy/docker/worker.Dockerfile
environment:
# === General ===
APP_ENV: dev
AWS_CONFIG_ENABLED: "false"
AWS_REGION: us-east-1
# === Database ===
REDIS: redis://redis:6379
# === Kafka ===
KAFKA_BOOTSTRAP_SERVERS: kafka:29092
# === Schema Registry ===
SCHEMA_REGISTRY_URL: http://schema-registry:8081
depends_on:
kafka:
condition: service_healthy
schema-registry:
condition: service_started
redis:
condition: service_healthy
tracking:
build:
context: ../../tracking
dockerfile: Dockerfile
ports:
- "13000:3000"
environment:
# === General ===
APP_ENV: dev
AWS_CONFIG_ENABLED: "false"
AWS_REGION: us-east-1
# === Tracking ===
TRACKING_HOST: "0.0.0.0"
TRACKING_PORT: "3000"
# === Kafka ===
KAFKA_BOOTSTRAP_SERVERS: kafka:29092
KAFKA_TRACKING_TOPIC: tracking-events
# === Schema Registry ===
SCHEMA_REGISTRY_URL: http://schema-registry:8081
depends_on:
kafka:
condition: service_healthy
schema-registry:
condition: service_started
realtime:
build:
context: ../..
dockerfile: deploy/docker/realtime.Dockerfile
ports:
- "14000:4000"
environment:
# === General ===
PHX_HOST: localhost
PORT: 4000
# === Database ===
DATABASE_URL: postgres://warmbly:warmbly@postgres:5432/warmbly_dev?sslmode=disable
DATABASE_SSL: "false"
DATABASE_POOL_SIZE: "10"
REDIS_URL: redis://redis:6379
# === Auth ===
JWT_SECRET: local-dev-auth-secret-minimum-32-characters-long
SECRET_KEY_BASE: local-development-secret-key-base-minimum-64-characters-for-phoenix
# === Realtime ===
PUBSUB_ENABLED: "false"
CHECK_ORIGIN: "false"
MAX_CONNECTIONS_PER_USER: "10"
MAX_CONNECTIONS_PER_IP: "50"
MAX_CONNECTIONS_GLOBAL: "100000"
RATE_LIMIT_WS_MESSAGE: "120"
RATE_LIMIT_WS_JOIN: "30"
RATE_LIMIT_WS_EVENT: "60"
# === GCP (optional) ===
GCP_PROJECT_ID: ""
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
web:
image: node:22-alpine
working_dir: /app
volumes:
- ../../web:/app
- web_node_modules:/app/node_modules
ports:
- "5173:5173"
- "15173:5173"
command: >
sh -c '
until corepack enable; do echo "corepack retry..."; sleep 2; done;
until pnpm install; do echo "pnpm install retry..."; sleep 3; done;
pnpm dev --host
'
environment:
VITE_APP_URL: "http://localhost:15173"
VITE_API_URL: "http://localhost:18080"
VITE_TRACKING_DOMAIN: "localhost:13000"
VITE_TURNSTILE_KEY: "1x00000000000000000000AA"
VITE_TURNSTILE_BYPASS_TOKEN: "warmbly-local-turnstile-bypass"
depends_on:
backend:
condition: service_healthy
# One-off: seed dev database with sample user
seed:
build:
context: ../..
dockerfile: deploy/docker/backend.Dockerfile
entrypoint: ["/app/seed"]
environment:
PRIMARY_DB: postgres://warmbly:warmbly@postgres:5432/warmbly_dev?sslmode=disable
depends_on:
backend:
condition: service_healthy
profiles:
- seed
volumes:
postgres_data:
redis_data:
web_node_modules: