x-logging: &logging logging: driver: json-file options: max-size: "10m" max-file: "3" services: postgres: image: postgres:17-alpine container_name: databuddy-postgres environment: POSTGRES_DB: ${POSTGRES_DB:-databuddy} POSTGRES_USER: ${POSTGRES_USER:-databuddy} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in your environment} ports: - "127.0.0.1:${POSTGRES_PORT:-5432}:5432" volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: [ "CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-databuddy} -d ${POSTGRES_DB:-databuddy}" ] interval: 10s timeout: 5s retries: 5 restart: unless-stopped networks: - databuddy <<: *logging clickhouse: image: clickhouse/clickhouse-server:25.5.1-alpine container_name: databuddy-clickhouse environment: CLICKHOUSE_DB: ${CLICKHOUSE_DB:-databuddy_analytics} CLICKHOUSE_USER: ${CLICKHOUSE_USER:-default} CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD:?Set CLICKHOUSE_PASSWORD in your environment} CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: 1 ports: - "127.0.0.1:${CLICKHOUSE_PORT:-8123}:8123" volumes: - clickhouse_data:/var/lib/clickhouse ulimits: nofile: soft: 262144 hard: 262144 healthcheck: test: [ "CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8123/ping" ] interval: 10s timeout: 5s retries: 5 restart: unless-stopped networks: - databuddy <<: *logging redis: image: redis:7-alpine container_name: databuddy-redis ports: - "127.0.0.1:${REDIS_PORT:-6379}:6379" volumes: - redis_data:/data environment: REDISCLI_AUTH: ${REDIS_PASSWORD:?Set REDIS_PASSWORD in your environment} command: > redis-server --appendonly yes --maxmemory 512mb --maxmemory-policy noeviction --requirepass ${REDIS_PASSWORD:?Set REDIS_PASSWORD in your environment} healthcheck: test: [ "CMD", "redis-cli", "ping" ] interval: 10s timeout: 5s retries: 5 restart: unless-stopped networks: - databuddy <<: *logging api: image: ghcr.io/databuddy-analytics/databuddy-api:${IMAGE_TAG:?Set IMAGE_TAG to a release tag, for example v1.0.0} container_name: databuddy-api ports: - "${API_PORT:-3001}:3001" environment: NODE_ENV: production PORT: "3001" DATABASE_URL: "postgres://${POSTGRES_USER:-databuddy}:${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in your environment}@postgres:5432/${POSTGRES_DB:-databuddy}" DB_POOL_MAX: ${DB_POOL_MAX:-10} SERVICE_NAME: databuddy-api REDIS_URL: "redis://:${REDIS_PASSWORD:?Set REDIS_PASSWORD in your environment}@redis:6379" BULLMQ_REDIS_URL: "redis://:${REDIS_PASSWORD:?Set REDIS_PASSWORD in your environment}@redis:6379" CLICKHOUSE_URL: "http://${CLICKHOUSE_USER:-default}:${CLICKHOUSE_PASSWORD:?Set CLICKHOUSE_PASSWORD in your environment}@clickhouse:8123/${CLICKHOUSE_DB:-databuddy_analytics}" BETTER_AUTH_URL: ${DASHBOARD_URL:?Set DASHBOARD_URL in your environment} BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET:?Set BETTER_AUTH_SECRET in your environment} DATABUDDY_ENCRYPTION_KEY: ${DATABUDDY_ENCRYPTION_KEY:?Set DATABUDDY_ENCRYPTION_KEY in your environment} SELFHOST: "true" DASHBOARD_URL: ${DASHBOARD_URL:?Set DASHBOARD_URL in your environment} API_URL: ${API_URL:?Set API_URL in your environment} BASKET_URL: ${BASKET_URL:?Set BASKET_URL in your environment} EMAIL_FROM: ${EMAIL_FROM:-} ALERTS_EMAIL_FROM: ${ALERTS_EMAIL_FROM:-} AI_GATEWAY_API_KEY: ${AI_GATEWAY_API_KEY:-} FIRECRAWL_API_KEY: ${FIRECRAWL_API_KEY:-} SUPERMEMORY_API_KEY: ${SUPERMEMORY_API_KEY:-} SUPERLOG_API_KEY: ${SUPERLOG_API_KEY:-} RESEND_API_KEY: ${RESEND_API_KEY:-} healthcheck: test: [ "CMD", "bun", "-e", "fetch('http://localhost:3001/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))" ] interval: 30s timeout: 3s start_period: 10s retries: 3 depends_on: postgres: condition: service_healthy clickhouse: condition: service_healthy redis: condition: service_healthy restart: unless-stopped networks: - databuddy <<: *logging basket: image: ghcr.io/databuddy-analytics/databuddy-basket:${IMAGE_TAG:?Set IMAGE_TAG to a release tag, for example v1.0.0} container_name: databuddy-basket ports: - "${BASKET_PORT:-4000}:4000" environment: NODE_ENV: production PORT: "4000" DATABASE_URL: "postgres://${POSTGRES_USER:-databuddy}:${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in your environment}@postgres:5432/${POSTGRES_DB:-databuddy}" DB_POOL_MAX: ${DB_POOL_MAX:-10} SERVICE_NAME: databuddy-basket REDIS_URL: "redis://:${REDIS_PASSWORD:?Set REDIS_PASSWORD in your environment}@redis:6379" CLICKHOUSE_URL: "http://${CLICKHOUSE_USER:-default}:${CLICKHOUSE_PASSWORD:?Set CLICKHOUSE_PASSWORD in your environment}@clickhouse:8123/${CLICKHOUSE_DB:-databuddy_analytics}" DATABUDDY_ENCRYPTION_KEY: ${DATABUDDY_ENCRYPTION_KEY:?Set DATABUDDY_ENCRYPTION_KEY in your environment} IP_HASH_SALT: ${IP_HASH_SALT:?Set IP_HASH_SALT in your environment} SUPERLOG_API_KEY: ${SUPERLOG_API_KEY:-} SELFHOST: "true" healthcheck: test: [ "CMD", "bun", "-e", "fetch('http://localhost:4000/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))" ] interval: 30s timeout: 3s start_period: 10s retries: 3 depends_on: postgres: condition: service_healthy clickhouse: condition: service_healthy redis: condition: service_healthy restart: unless-stopped networks: - databuddy <<: *logging insights: image: ghcr.io/databuddy-analytics/databuddy-insights:${IMAGE_TAG:?Set IMAGE_TAG to a release tag, for example v1.0.0} container_name: databuddy-insights ports: - "${INSIGHTS_PORT:-4002}:4002" environment: NODE_ENV: production PORT: "4002" DATABASE_URL: "postgres://${POSTGRES_USER:-databuddy}:${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in your environment}@postgres:5432/${POSTGRES_DB:-databuddy}" DB_POOL_MAX: ${DB_POOL_MAX:-10} SERVICE_NAME: databuddy-insights REDIS_URL: "redis://:${REDIS_PASSWORD:?Set REDIS_PASSWORD in your environment}@redis:6379" BULLMQ_REDIS_URL: "redis://:${REDIS_PASSWORD:?Set REDIS_PASSWORD in your environment}@redis:6379" INSIGHTS_WORKER_CONCURRENCY: ${INSIGHTS_WORKER_CONCURRENCY:-2} INSIGHTS_WORKER_ENABLED: "true" AI_GATEWAY_API_KEY: ${AI_GATEWAY_API_KEY:?Set AI_GATEWAY_API_KEY in your environment} FIRECRAWL_API_KEY: ${FIRECRAWL_API_KEY:-} SUPERMEMORY_API_KEY: ${SUPERMEMORY_API_KEY:-} SUPERLOG_API_KEY: ${SUPERLOG_API_KEY:-} CLICKHOUSE_URL: "http://${CLICKHOUSE_USER:-default}:${CLICKHOUSE_PASSWORD:?Set CLICKHOUSE_PASSWORD in your environment}@clickhouse:8123/${CLICKHOUSE_DB:-databuddy_analytics}" DASHBOARD_URL: ${DASHBOARD_URL:?Set DASHBOARD_URL in your environment} DATABUDDY_ENCRYPTION_KEY: ${DATABUDDY_ENCRYPTION_KEY:?Set DATABUDDY_ENCRYPTION_KEY in your environment} BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET:?Set BETTER_AUTH_SECRET in your environment} healthcheck: test: [ "CMD", "bun", "-e", "fetch('http://localhost:4002/health/status').then(async r=>process.exit(r.ok&&(await r.json()).status==='ok'?0:1)).catch(()=>process.exit(1))" ] interval: 30s timeout: 3s start_period: 10s retries: 3 depends_on: postgres: condition: service_healthy clickhouse: condition: service_healthy redis: condition: service_healthy restart: unless-stopped networks: - databuddy <<: *logging links: image: ghcr.io/databuddy-analytics/databuddy-links:${IMAGE_TAG:?Set IMAGE_TAG to a release tag, for example v1.0.0} container_name: databuddy-links ports: - "${LINKS_PORT:-2500}:2500" environment: NODE_ENV: production DATABASE_URL: "postgres://${POSTGRES_USER:-databuddy}:${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in your environment}@postgres:5432/${POSTGRES_DB:-databuddy}" DB_POOL_MAX: ${DB_POOL_MAX:-10} SERVICE_NAME: databuddy-links REDIS_URL: "redis://:${REDIS_PASSWORD:?Set REDIS_PASSWORD in your environment}@redis:6379" CLICKHOUSE_URL: "http://${CLICKHOUSE_USER:-default}:${CLICKHOUSE_PASSWORD:?Set CLICKHOUSE_PASSWORD in your environment}@clickhouse:8123/${CLICKHOUSE_DB:-databuddy_analytics}" DASHBOARD_URL: ${DASHBOARD_URL:?Set DASHBOARD_URL in your environment} SUPERLOG_API_KEY: ${SUPERLOG_API_KEY:-} LINKS_ROOT_REDIRECT_URL: ${LINKS_ROOT_REDIRECT_URL:-https://databuddy.cc} GEOIP_DB_URL: ${GEOIP_DB_URL:-https://cdn.databuddy.cc/mmdb/GeoLite2-City.mmdb} healthcheck: test: [ "CMD", "bun", "-e", "fetch('http://localhost:2500/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))" ] interval: 30s timeout: 3s start_period: 10s retries: 3 depends_on: postgres: condition: service_healthy redis: condition: service_healthy clickhouse: condition: service_healthy restart: unless-stopped networks: - databuddy <<: *logging volumes: postgres_data: clickhouse_data: redis_data: networks: databuddy: driver: bridge