diff --git a/captain-definition b/captain-definition index 0e14f82..b744ace 100644 --- a/captain-definition +++ b/captain-definition @@ -1,4 +1,4 @@ { "schemaVersion": 2, - "dockerfilePath": "./Dockerfile" + "dockerfilePath": "./docker-compose.yml" } diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..2cbd1b2 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,82 @@ +version: "3.9" + +services: + postgis: + image: postgis/postgis:16-3.4 + restart: unless-stopped + environment: + POSTGRES_DB: planner + POSTGRES_USER: planner + POSTGRES_PASSWORD: change-me + volumes: + - postgis_data:/var/lib/postgresql/data + + osm-importer: + build: + context: ./services/osm-importer + dockerfile: Dockerfile + restart: unless-stopped + depends_on: + - postgis + environment: + PBF_URL: https://download.geofabrik.de/europe-latest.osm.pbf + PGHOST: postgis + PGPORT: "5432" + PGDATABASE: planner + PGUSER: planner + PGPASSWORD: change-me + UPDATE_INTERVAL_SECONDS: "86400" + volumes: + - osm_data:/osm + + martin: + image: ghcr.io/maplibre/martin:latest + restart: unless-stopped + environment: + DATABASE_URL: postgres://planner:change-me@postgis:5432/planner + depends_on: + - postgis + + valhalla: + image: ghcr.io/valhalla/valhalla-scripted:latest + restart: unless-stopped + environment: + tile_urls: https://download.geofabrik.de/europe/germany-latest.osm.pbf + volumes: + - valhalla_data:/custom_files + + traccar: + image: traccar/traccar:latest + restart: unless-stopped + ports: + - "8082:8082" + - "5000-5150:5000-5150" + - "5000-5150:5000-5150/udp" + volumes: + - traccar_data:/opt/traccar/data + - traccar_logs:/opt/traccar/logs + + planner-api: + build: . + restart: unless-stopped + depends_on: + - postgis + - martin + - valhalla + - traccar + + ev-battery-tracker: + image: alpine:3.20 + command: ["sh", "-c", "sleep infinity"] + restart: unless-stopped + + traffic-fetcher: + image: alpine:3.20 + command: ["sh", "-c", "sleep infinity"] + restart: unless-stopped + +volumes: + postgis_data: + valhalla_data: + traccar_data: + traccar_logs: diff --git a/services/osm-importer/Dockerfile b/services/osm-importer/Dockerfile new file mode 100644 index 0000000..80744de --- /dev/null +++ b/services/osm-importer/Dockerfile @@ -0,0 +1,8 @@ +FROM iboates/osm2pgsql:latest + +WORKDIR /app + +COPY osm-import.sh /osm-import.sh +RUN chmod +x /osm-import.sh + +CMD ["sh", "/osm-import.sh"] diff --git a/services/osm-importer/osm-import.sh b/services/osm-importer/osm-import.sh new file mode 100644 index 0000000..206158c --- /dev/null +++ b/services/osm-importer/osm-import.sh @@ -0,0 +1,61 @@ +#!/bin/sh +set -eu + +PBF_URL="${PBF_URL:-https://download.geofabrik.de/europe/germany-latest.osm.pbf}" +PBF_FILE="${PBF_FILE:-/osm/region.osm.pbf}" + +PGHOST="${PGHOST:-postgis}" +PGPORT="${PGPORT:-5432}" +PGDATABASE="${PGDATABASE:-planner}" +PGUSER="${PGUSER:-planner}" +PGPASSWORD="${PGPASSWORD:-change-me}" +export PGPASSWORD + +UPDATE_INTERVAL_SECONDS="${UPDATE_INTERVAL_SECONDS:-86400}" + +echo "OSM importer starting..." + +if [ ! -f "$PBF_FILE" ]; then + echo "Downloading initial extract from $PBF_URL" + wget -O "$PBF_FILE" "$PBF_URL" +fi + +if ! psql -h "$PGHOST" -p "$PGPORT" -U "$PGUSER" -d "$PGDATABASE" -tAc \ + "SELECT 1 FROM pg_tables WHERE tablename = 'planet_osm_point'" | grep -q 1; then + echo "Initial osm2pgsql import..." + osm2pgsql \ + --create \ + --slim \ + --database "$PGDATABASE" \ + --host "$PGHOST" \ + --port "$PGPORT" \ + --username "$PGUSER" \ + "$PBF_FILE" +else + echo "OSM tables already exist, skipping initial import." +fi + +if ! psql -h "$PGHOST" -p "$PGPORT" -U "$PGUSER" -d "$PGDATABASE" -tAc \ + "SELECT 1 FROM pg_tables WHERE tablename = 'planet_osm_replication_status'" | grep -q 1; then + echo "Initializing replication..." + osm2pgsql-replication init \ + --database "$PGDATABASE" \ + --host "$PGHOST" \ + --port "$PGPORT" \ + --username "$PGUSER" \ + --osm-file "$PBF_FILE" +else + echo "Replication already initialized." +fi + +while true; do + echo "Running replication update..." + osm2pgsql-replication update \ + --database "$PGDATABASE" \ + --host "$PGHOST" \ + --port "$PGPORT" \ + --username "$PGUSER" + + echo "Sleeping for $UPDATE_INTERVAL_SECONDS seconds..." + sleep "$UPDATE_INTERVAL_SECONDS" +done