Skip to main content

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

ProfileServicesAffects
(default — no flag)caddy, appThe map page and API surface. Search / routing / POIs return graceful upstream: unavailable until their profile is started.
geocodingphoton, placeholder, libpostal/api/v1/search returns real candidates; /api/v1/whats-here resolves a label.
routingvalhalla/api/v1/route returns walking / cycling / driving routes + elevation.
poisoverpass/api/v1/whats-here and /api/v1/pois return real POIs.
transitotpMultimodal journey planning (needs GTFS feeds — see Data bootstrap).
data-setupwhosonfirstOne-shot Who's-on-First download for Placeholder.
allevery map serviceEverything 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 stackmeta.upstream: "unavailable", empty data502 UPSTREAM_ERROR502 UPSTREAM_ERROR
geocoding onlyReal results502 UPSTREAM_ERRORLabel only, no POIs
geocoding + routingReal resultsReal routeLabel only, no POIs
allReal resultsReal routeLabel + 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

PortHost-exposedService
8484yesCaddy (fronts Atlas + serves PMTiles)
3000 (internal)noDawarich Atlas (Rails)
2322 (internal)noPhoton
3000 (internal)noPlaceholder
4400 (internal)nolibpostal
8002 (internal)noValhalla
80 (internal)noOverpass
8080 (internal)noOpenTripPlanner

For debugging, add a compose.override.yml that publishes the backend ports you need locally.