Compose profiles
Each map-service group is gated by a Docker Compose profile so you only spin up — and download data for — what you need.
Profile reference
| Profile | Services | Affects |
|---|---|---|
| (default — no flag) | caddy, app | The map page and API surface. Search / routing / POIs return graceful upstream: unavailable until their profile is started. |
geocoding | photon, placeholder, libpostal | /api/v1/search returns real candidates; /api/v1/whats-here resolves a label. |
routing | valhalla | /api/v1/route returns walking / cycling / driving routes + elevation. |
pois | overpass | /api/v1/whats-here and /api/v1/pois return real POIs. |
transit | otp | Multimodal journey planning (needs GTFS feeds — see Data bootstrap). |
data-setup | whosonfirst | One-shot Who's-on-First download for Placeholder. |
all | every map service | Everything except data-setup. |
Activation
# Bare stack
docker compose up -d
# Add one profile
docker compose --profile geocoding up -d
# Add multiple
docker compose --profile geocoding --profile routing up -d
# Everything except data-setup
COMPOSE_PROFILES=all docker compose up -d
You can also flip profiles on/off interactively from the admin panel — open the Atlas UI at http://localhost:8484, click the Settings tab, toggle services, and hit Save & apply.
Graceful degradation
Dawarich Atlas is designed so the map page is always live, regardless of which data services are running. Atlas returns structured upstream metadata so clients can detect what's available:
| Profile state | /api/v1/search | /api/v1/route | /api/v1/whats-here |
|---|---|---|---|
| Bare stack | meta.upstream: "unavailable", empty data | 502 UPSTREAM_ERROR | 502 UPSTREAM_ERROR |
geocoding only | Real results | 502 UPSTREAM_ERROR | Label only, no POIs |
geocoding + routing | Real results | Real route | Label only, no POIs |
all | Real results | Real route | Label + POIs |
The error code lets you wire a clean fallback UI: "Routing service is warming up — try again in a minute" beats a generic 500.
Tearing down + reclaiming disk
# Stop a profile but keep its data
docker compose --profile pois down
# Drop a service's data (irreversible — rebuilds on next start)
docker compose down overpass
rm -rf data/overpass/*
Per-service disk: du -sh data/* for a quick overview.
What runs where
| Port | Host-exposed | Service |
|---|---|---|
| 8484 | yes | Caddy (fronts Atlas + serves PMTiles) |
| 3000 (internal) | no | Dawarich Atlas (Rails) |
| 2322 (internal) | no | Photon |
| 3000 (internal) | no | Placeholder |
| 4400 (internal) | no | libpostal |
| 8002 (internal) | no | Valhalla |
| 80 (internal) | no | Overpass |
| 8080 (internal) | no | OpenTripPlanner |
For debugging, add a compose.override.yml that publishes the backend ports you need locally.