name: greenfield-siem services: postgres: image: ${POSTGRES_IMAGE:-postgres:18.4-alpine} environment: POSTGRES_DB: ${POSTGRES_DB:-siem} POSTGRES_USER: ${POSTGRES_USER:-siem} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - postgres_data:/var/lib/postgresql - ./deploy/postgres/init.sql:/docker-entrypoint-initdb.d/001-init.sql:ro healthcheck: test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] interval: 5s timeout: 3s retries: 30 start_period: 5s restart: unless-stopped ports: - "${POSTGRES_BIND:-127.0.0.1}:${POSTGRES_PORT:-5432}:5432" postgres-schema: image: ${POSTGRES_IMAGE:-postgres:18.4-alpine} depends_on: postgres: condition: service_healthy environment: PGHOST: postgres PGPORT: "5432" PGDATABASE: ${POSTGRES_DB:-siem} PGUSER: ${POSTGRES_USER:-siem} PGPASSWORD: ${POSTGRES_PASSWORD} volumes: - ./deploy/postgres/init.sql:/schema/init.sql:ro entrypoint: ["/bin/sh", "-ec"] command: ["psql -v ON_ERROR_STOP=1 -f /schema/init.sql"] restart: "no" clickhouse: image: ${CLICKHOUSE_IMAGE:-clickhouse/clickhouse-server:26.3.17.56} environment: CLICKHOUSE_DB: ${CLICKHOUSE_DB:-siem} CLICKHOUSE_USER: ${CLICKHOUSE_USER:-siem} CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD} CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: "1" volumes: - clickhouse_data:/var/lib/clickhouse - clickhouse_logs:/var/log/clickhouse-server - ./deploy/clickhouse/prometheus.xml:/etc/clickhouse-server/config.d/prometheus.xml:ro ulimits: nofile: soft: 262144 hard: 262144 healthcheck: test: ["CMD-SHELL", "clickhouse-client --host 127.0.0.1 --user $${CLICKHOUSE_USER} --password $${CLICKHOUSE_PASSWORD} --query 'SELECT 1' >/dev/null"] interval: 5s timeout: 5s retries: 40 start_period: 10s restart: unless-stopped ports: - "${CLICKHOUSE_HTTP_BIND:-127.0.0.1}:${CLICKHOUSE_HTTP_PORT:-8123}:8123" - "${CLICKHOUSE_NATIVE_BIND:-127.0.0.1}:${CLICKHOUSE_NATIVE_PORT:-9000}:9000" clickhouse-schema: image: ${CLICKHOUSE_IMAGE:-clickhouse/clickhouse-server:26.3.17.56} depends_on: clickhouse: condition: service_healthy entrypoint: ["/bin/bash", "-ec"] environment: CLICKHOUSE_DB: ${CLICKHOUSE_DB:-siem} CLICKHOUSE_USER: ${CLICKHOUSE_USER:-siem} CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD} CLICKHOUSE_GRAFANA_PASSWORD: ${CLICKHOUSE_GRAFANA_PASSWORD} EVENT_RETENTION_DAYS: ${EVENT_RETENTION_DAYS:-90} ROLLUP_RETENTION_DAYS: ${ROLLUP_RETENTION_DAYS:-730} volumes: - ./deploy/clickhouse/init.sql.template:/schema/init.sql.template:ro command: - | sed \ -e "s/__CLICKHOUSE_DB__/$${CLICKHOUSE_DB}/g" \ -e "s/__EVENT_RETENTION_DAYS__/$${EVENT_RETENTION_DAYS}/g" \ -e "s/__ROLLUP_RETENTION_DAYS__/$${ROLLUP_RETENTION_DAYS}/g" \ -e "s/__GRAFANA_CLICKHOUSE_PASSWORD__/$${CLICKHOUSE_GRAFANA_PASSWORD}/g" \ /schema/init.sql.template > /tmp/init.sql clickhouse-client --host clickhouse --user "$${CLICKHOUSE_USER}" --password "$${CLICKHOUSE_PASSWORD}" --multiquery < /tmp/init.sql clickhouse-client --host clickhouse --user "$${CLICKHOUSE_USER}" --password "$${CLICKHOUSE_PASSWORD}" --query \ "ALTER TABLE $${CLICKHOUSE_DB}.events MODIFY TTL event_time + INTERVAL $${EVENT_RETENTION_DAYS} DAY DELETE" clickhouse-client --host clickhouse --user "$${CLICKHOUSE_USER}" --password "$${CLICKHOUSE_PASSWORD}" --query \ "ALTER TABLE $${CLICKHOUSE_DB}.events_5m MODIFY TTL bucket + INTERVAL $${ROLLUP_RETENTION_DAYS} DAY DELETE" restart: "no" redpanda: image: ${REDPANDA_IMAGE:-docker.redpanda.com/redpandadata/redpanda:v26.1.13} command: - redpanda - start - --kafka-addr - internal://0.0.0.0:9092,external://0.0.0.0:19092 - --advertise-kafka-addr - internal://redpanda:9092,external://localhost:19092 - --pandaproxy-addr - internal://0.0.0.0:8082,external://0.0.0.0:18082 - --advertise-pandaproxy-addr - internal://redpanda:8082,external://localhost:18082 - --schema-registry-addr - internal://0.0.0.0:8081,external://0.0.0.0:18081 - --rpc-addr - 0.0.0.0:33145 - --advertise-rpc-addr - redpanda:33145 - --mode - dev-container - --smp - "${REDPANDA_SMP:-2}" - --default-log-level=${REDPANDA_LOG_LEVEL:-info} volumes: - redpanda_data:/var/lib/redpanda/data healthcheck: test: ["CMD-SHELL", "RPK_BROKERS=localhost:9092 rpk cluster health | grep -q 'Healthy:.*true'"] interval: 5s timeout: 5s retries: 40 start_period: 10s restart: unless-stopped ports: - "${REDPANDA_BIND:-127.0.0.1}:${REDPANDA_KAFKA_PORT:-19092}:19092" - "${REDPANDA_BIND:-127.0.0.1}:${REDPANDA_ADMIN_PORT:-19644}:9644" redpanda-init: image: ${REDPANDA_IMAGE:-docker.redpanda.com/redpandadata/redpanda:v26.1.13} depends_on: redpanda: condition: service_healthy entrypoint: ["/bin/sh", "-ec"] environment: RPK_BROKERS: redpanda:9092 KAFKA_PARTITIONS: ${KAFKA_PARTITIONS:-6} KAFKA_RETENTION_MS: ${KAFKA_RETENTION_MS:-86400000} KAFKA_TOPIC: ${KAFKA_TOPIC:-siem-events} command: - | rpk topic create --if-not-exists -p "$${KAFKA_PARTITIONS}" -r 1 \ -c retention.ms="$${KAFKA_RETENTION_MS}" "$${KAFKA_TOPIC}" restart: "no" redpanda-console: image: ${REDPANDA_CONSOLE_IMAGE:-docker.redpanda.com/redpandadata/console:v3.8.0} depends_on: redpanda: condition: service_healthy entrypoint: /bin/sh command: -c 'printf "%s" "$$CONSOLE_CONFIG_FILE" > /tmp/config.yml; /app/console' environment: CONFIG_FILEPATH: /tmp/config.yml CONSOLE_CONFIG_FILE: | kafka: brokers: ["redpanda:9092"] schemaRegistry: enabled: true urls: ["http://redpanda:8081"] redpanda: adminApi: enabled: true urls: ["http://redpanda:9644"] restart: unless-stopped ports: - "${REDPANDA_CONSOLE_BIND:-127.0.0.1}:${REDPANDA_CONSOLE_PORT:-8081}:8080" garage-config: image: ${ALPINE_IMAGE:-alpine:3.22} environment: GARAGE_RPC_SECRET: ${GARAGE_RPC_SECRET} GARAGE_ADMIN_TOKEN: ${GARAGE_ADMIN_TOKEN} GARAGE_METRICS_TOKEN: ${GARAGE_METRICS_TOKEN} volumes: - garage_config:/config entrypoint: ["/bin/sh", "-ec"] command: - | umask 077 cat > /config/garage.toml <