# LogTide Docker Compose Configuration # # Quick Start (basic - TimescaleDB only): # docker compose up -d # # With ClickHouse (high-volume logs/spans/traces storage): # docker compose --profile clickhouse up -d # # With Docker log collection: # docker compose --profile logging up -d # # With system metrics (CPU, memory, disk, network): # docker compose --profile metrics up -d # # With MongoDB (alternative storage backend): # docker compose --profile mongodb up -d # # Combine profiles: # docker compose --profile logging --profile metrics up -d # docker compose --profile clickhouse --profile logging up -d # docker compose --profile mongodb --profile logging up -d # # IMPORTANT: Check .env configuration before starting! # - API_KEY_SECRET must be at least 32 characters # - DB_PASSWORD, REDIS_PASSWORD should be secure values # - Set STORAGE_ENGINE=clickhouse in .env when using the clickhouse profile # - Set STORAGE_ENGINE=mongodb in .env when using the mongodb profile services: postgres: image: timescale/timescaledb:latest-pg16 container_name: logtide-postgres environment: POSTGRES_DB: ${DB_NAME} POSTGRES_USER: ${DB_USER} POSTGRES_PASSWORD: ${DB_PASSWORD} ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data command: - "postgres" - "-c" - "max_connections=100" - "-c" - "shared_buffers=256MB" - "-c" - "effective_cache_size=768MB" - "-c" - "work_mem=16MB" - "-c" - "maintenance_work_mem=128MB" # Parallel query settings for faster aggregations - "-c" - "max_parallel_workers_per_gather=4" - "-c" - "max_parallel_workers=8" - "-c" - "parallel_tuple_cost=0.01" - "-c" - "parallel_setup_cost=100" - "-c" - "min_parallel_table_scan_size=8MB" # Write-ahead log tuning for ingestion - "-c" - "wal_buffers=16MB" - "-c" - "checkpoint_completion_target=0.9" # Logging for slow queries (>100ms) - "-c" - "log_min_duration_statement=100" healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER}"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped networks: - logtide-network redis: image: redis:7-alpine container_name: logtide-redis command: redis-server --requirepass ${REDIS_PASSWORD} ports: - "6379:6379" volumes: - redis_data:/data healthcheck: test: ["CMD", "sh", "-c", "redis-cli -a ${REDIS_PASSWORD} ping | grep -q PONG"] interval: 10s timeout: 3s retries: 5 restart: unless-stopped networks: - logtide-network backend: image: ${LOGTIDE_BACKEND_IMAGE:-logtide/backend:latest} container_name: logtide-backend ports: - "8080:8080" environment: NODE_ENV: production TRUST_PROXY: ${TRUST_PROXY:-false} FRONTEND_URL: ${FRONTEND_URL:-http://localhost:3000} DATABASE_URL: postgresql://${DB_USER}:${DB_PASSWORD}@postgres:5432/${DB_NAME} DATABASE_HOST: postgres DB_USER: ${DB_USER} REDIS_URL: redis://:${REDIS_PASSWORD}@redis:6379 API_KEY_SECRET: ${API_KEY_SECRET} PORT: 8080 HOST: 0.0.0.0 SMTP_HOST: ${SMTP_HOST:-} SMTP_PORT: ${SMTP_PORT:-587} SMTP_USER: ${SMTP_USER:-} SMTP_PASS: ${SMTP_PASS:-} SMTP_FROM: ${SMTP_FROM:-noreply@logtide.local} INTERNAL_LOGGING_ENABLED: ${INTERNAL_LOGGING_ENABLED:-false} INTERNAL_API_KEY: ${INTERNAL_API_KEY:-} INTERNAL_DSN: ${INTERNAL_DSN:-} DOCKER_CONTAINER: "true" SERVICE_NAME: logtide-backend STORAGE_ENGINE: ${STORAGE_ENGINE:-timescale} CLICKHOUSE_HOST: ${CLICKHOUSE_HOST:-clickhouse} CLICKHOUSE_PORT: ${CLICKHOUSE_PORT:-8123} CLICKHOUSE_DATABASE: ${CLICKHOUSE_DATABASE:-logtide} CLICKHOUSE_USERNAME: ${CLICKHOUSE_USERNAME:-default} CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD:-} MONGODB_HOST: ${MONGODB_HOST:-mongodb} MONGODB_PORT: ${MONGODB_PORT:-27017} MONGODB_DATABASE: ${MONGODB_DATABASE:-logtide} MONGODB_USERNAME: ${MONGODB_USERNAME:-} MONGODB_PASSWORD: ${MONGODB_PASSWORD:-} MONGODB_AUTH_SOURCE: ${MONGODB_AUTH_SOURCE:-} depends_on: postgres: condition: service_healthy redis: condition: service_healthy healthcheck: test: ["CMD", "node", "-e", "require('http').get('http://localhost:8080/health', (r) => process.exit(r.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))"] interval: 30s timeout: 5s retries: 3 start_period: 40s restart: unless-stopped networks: - logtide-network worker: image: ${LOGTIDE_BACKEND_IMAGE:-logtide/backend:latest} container_name: logtide-worker command: ["worker"] healthcheck: disable: true environment: NODE_ENV: production TRUST_PROXY: ${TRUST_PROXY:-false} FRONTEND_URL: ${FRONTEND_URL:-http://localhost:3000} DATABASE_URL: postgresql://${DB_USER}:${DB_PASSWORD}@postgres:5432/${DB_NAME} DATABASE_HOST: postgres DB_USER: ${DB_USER} REDIS_URL: redis://:${REDIS_PASSWORD}@redis:6379 API_KEY_SECRET: ${API_KEY_SECRET} PORT: 8080 HOST: 0.0.0.0 SMTP_HOST: ${SMTP_HOST:-} SMTP_PORT: ${SMTP_PORT:-587} SMTP_USER: ${SMTP_USER:-} SMTP_PASS: ${SMTP_PASS:-} SMTP_FROM: ${SMTP_FROM:-noreply@logtide.local} INTERNAL_LOGGING_ENABLED: ${INTERNAL_LOGGING_ENABLED:-false} INTERNAL_API_KEY: ${INTERNAL_API_KEY:-} INTERNAL_DSN: ${INTERNAL_DSN:-} DOCKER_CONTAINER: "true" SERVICE_NAME: logtide-worker STORAGE_ENGINE: ${STORAGE_ENGINE:-timescale} CLICKHOUSE_HOST: ${CLICKHOUSE_HOST:-clickhouse} CLICKHOUSE_PORT: ${CLICKHOUSE_PORT:-8123} CLICKHOUSE_DATABASE: ${CLICKHOUSE_DATABASE:-logtide} CLICKHOUSE_USERNAME: ${CLICKHOUSE_USERNAME:-default} CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD:-} MONGODB_HOST: ${MONGODB_HOST:-mongodb} MONGODB_PORT: ${MONGODB_PORT:-27017} MONGODB_DATABASE: ${MONGODB_DATABASE:-logtide} MONGODB_USERNAME: ${MONGODB_USERNAME:-} MONGODB_PASSWORD: ${MONGODB_PASSWORD:-} MONGODB_AUTH_SOURCE: ${MONGODB_AUTH_SOURCE:-} depends_on: backend: condition: service_healthy redis: condition: service_healthy restart: unless-stopped networks: - logtide-network frontend: image: ${LOGTIDE_FRONTEND_IMAGE:-logtide/frontend:latest} container_name: logtide-frontend ports: - "3000:3000" environment: NODE_ENV: production PUBLIC_API_URL: ${PUBLIC_API_URL:-http://localhost:8080} LOGTIDE_DSN: ${LOGTIDE_DSN} PUBLIC_LOGTIDE_DSN: ${PUBLIC_LOGTIDE_DSN} depends_on: - backend restart: unless-stopped networks: - logtide-network clickhouse: image: clickhouse/clickhouse-server:24.1 container_name: logtide-clickhouse profiles: - clickhouse environment: CLICKHOUSE_DB: ${CLICKHOUSE_DATABASE:-logtide} CLICKHOUSE_USER: ${CLICKHOUSE_USERNAME:-default} CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD:-} CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: 1 ports: - "${CLICKHOUSE_PORT:-8123}:8123" - "9000:9000" volumes: - clickhouse_data:/var/lib/clickhouse healthcheck: test: ["CMD", "clickhouse-client", "--query", "SELECT 1"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped networks: - logtide-network mongodb: image: mongo:7.0 container_name: logtide-mongodb profiles: - mongodb environment: MONGO_INITDB_DATABASE: ${MONGODB_DATABASE:-logtide} ports: - "${MONGODB_PORT:-27017}:27017" volumes: - mongodb_data:/data/db healthcheck: test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped networks: - logtide-network fluent-bit: image: ${FLUENT_BIT_IMAGE:-fluent/fluent-bit:4.2.2} container_name: logtide-fluent-bit profiles: - logging ports: # Syslog ports - uncomment to receive syslog from external devices - "514:514/udp" - "514:514/tcp" volumes: - ./fluent-bit.conf:/fluent-bit/etc/fluent-bit.conf:ro - ./parsers.conf:/fluent-bit/etc/parsers.conf:ro - ./extract_container_id.lua:/fluent-bit/etc/extract_container_id.lua:ro - ./map_syslog_level.lua:/fluent-bit/etc/map_syslog_level.lua:ro - ./wrap_logs.lua:/fluent-bit/etc/wrap_logs.lua:ro - /var/lib/docker/containers:/var/lib/docker/containers:ro - /var/run/docker.sock:/var/run/docker.sock:ro environment: LOGTIDE_API_KEY: ${FLUENT_BIT_API_KEY:-} LOGTIDE_API_HOST: backend # Timezone offset for RFC3164 syslog (hours from UTC) # Examples: 1 for CET, 2 for CEST, -5 for EST SYSLOG_TZ_OFFSET: ${SYSLOG_TZ_OFFSET:-0} depends_on: - backend restart: unless-stopped networks: - logtide-network fluent-bit-metrics: image: ${FLUENT_BIT_IMAGE:-fluent/fluent-bit:4.2.2} container_name: logtide-fluent-bit-metrics profiles: - metrics volumes: - ./fluent-bit-metrics.conf:/fluent-bit/etc/fluent-bit.conf:ro - ./format_metrics.lua:/fluent-bit/etc/format_metrics.lua:ro - /proc:/host/proc:ro environment: LOGTIDE_API_KEY: ${FLUENT_BIT_API_KEY:-} LOGTIDE_API_HOST: backend depends_on: - backend restart: unless-stopped networks: - logtide-network volumes: postgres_data: driver: local redis_data: driver: local clickhouse_data: driver: local mongodb_data: driver: local networks: logtide-network: