# Local-first stack for Apple Silicon (arm64 images). `docker compose up -d db redis` then run api/worker/web natively, # or `docker compose --profile app up` to run everything in containers. services: db: image: timescale/timescaledb:latest-pg17 environment: POSTGRES_USER: ktrade POSTGRES_PASSWORD: ktrade POSTGRES_DB: ktrade ports: ["5432:5432"] volumes: ["pgdata:/var/lib/postgresql/data"] healthcheck: { test: ["CMD-SHELL", "pg_isready -U ktrade"], interval: 5s, timeout: 3s, retries: 20 } redis: image: redis:7-alpine ports: ["6379:6379"] command: ["redis-server", "--save", "60", "1", "--appendonly", "no"] api: profiles: ["app"] build: { context: ./apps/api } env_file: .env environment: KTRADE_DATABASE_URL: postgresql://ktrade:ktrade@db:5432/ktrade KTRADE_REDIS_URL: redis://redis:6379/3 KTRADE_API_HOST: 0.0.0.0 command: ["sh", "-c", "ktrade migrate && ktrade api"] ports: ["8470:8470"] depends_on: { db: { condition: service_healthy }, redis: { condition: service_started } } worker: profiles: ["app"] build: { context: ./apps/api } env_file: .env environment: KTRADE_DATABASE_URL: postgresql://ktrade:ktrade@db:5432/ktrade KTRADE_REDIS_URL: redis://redis:6379/3 command: ["ktrade", "worker"] depends_on: [api] web: profiles: ["app"] build: { context: ./apps/web } environment: { API_UPSTREAM: http://api:8470, PORT: "8471" } ports: ["8471:8471"] depends_on: [api] prometheus: profiles: ["monitoring"] image: prom/prometheus:latest volumes: ["./deploy/prometheus.yml:/etc/prometheus/prometheus.yml:ro"] ports: ["9090:9090"] grafana: profiles: ["monitoring"] image: grafana/grafana:latest ports: ["3001:3000"] volumes: ["./deploy/grafana:/etc/grafana/provisioning:ro"] volumes: pgdata: {}