swadhinbiswas Add a Docker Compose deployment anyone can run · 9/14/2026
76836cb
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: