/ eu-air-traffic / docker-compose.yml
swadhinbiswas Add a Docker Compose deployment anyone can run · 9/14/2026
76836cb
65 lines · 1.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# Full platform in containers: collector + live API, the lake cycle on a timer,
# and an optional Caddy TLS front. Point .env at real services (Aiven Kafka,
# Hugging Face, MotherDuck, Turso) — nothing here needs a local Kafka.
name: eu-air-traffic

services:
  collector:
    build:
      context: .
      dockerfile: docker/Dockerfile.collector
    env_file: .env
    environment:
      LIVE_API_HOST: 0.0.0.0
    volumes:
      - ./warehouse:/app/warehouse
      - ./secrets:/app/secrets:ro
    ports:
      - "8090:8090"
    restart: unless-stopped

  lake:
    build:
      context: .
      dockerfile: docker/lake-job.Dockerfile
    env_file: .env
    environment:
      # One cycle per interval; the runner keeps its own DuckDB state on disk.
      LAKE_INTERVAL_SECONDS: ${LAKE_INTERVAL_SECONDS:-900}
      HF_SYNC: ${HF_SYNC:-1}
      AIR_TRAFFIC_DUCKDB_PATH: /app/warehouse/air_traffic.duckdb
    entrypoint:
      - bash
      - -c
      - |
        while true; do
          echo "[lake] cycle starting $(date -u +%FT%TZ)"
          bash scripts/run_lake.sh || echo "[lake] cycle failed — retrying next interval"
          sleep "$$LAKE_INTERVAL_SECONDS"
        done
    volumes:
      - ./warehouse:/app/warehouse
      - ./secrets:/app/secrets:ro
    depends_on:
      collector:
        condition: service_healthy
    restart: unless-stopped

  caddy:
    image: caddy:2-alpine
    profiles: ["tls"]
    environment:
      SITE_ADDRESS: ${SITE_ADDRESS:-localhost}
    volumes:
      - ./docker/Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - collector
    restart: unless-stopped

volumes:
  caddy_data: