Dawarich — a self-hosted location-history tracker and Google Timeline / Google Maps Timeline alternative, with map visualisations, stats and imports. Deployed as an all-in-one host-networked Nomad job (PostGIS + Redis + web + Sidekiq).
Needs nomad-pack on PATH. The script only adds the nomploy registry and runs this pack.
Source ↗ Project ↗ ★ 10.5k ⚑ Report an issue
Save as values.hcl, edit, then run:
# The name of the Nomad job.
job_name = "dawarich"
# The Nomad namespace to deploy into.
namespace = "default"
# The datacenters to deploy to.
datacenters = ["*"]
# The Dawarich container image (used for both web and Sidekiq). Pin a tag in production.
image = "freikin/dawarich:latest"
# The PostGIS image for the bundled database. Use imresamu/postgis:17-3.5-alpine on ARM.
postgres_image = "postgis/postgis:17-3.5-alpine"
# The Redis image for the bundled queue backend.
redis_image = "redis:7.4-alpine"
# Host port for the Dawarich web UI.
port = 3000
# Host port for the bundled PostGIS database.
db_port = 5432
# Host port for the bundled Redis.
redis_port = 6379
# Password for the bundled PostGIS database. CHANGE THIS.
db_password = "dawarich_change_me"
# Rails SECRET_KEY_BASE used to sign sessions. CHANGE THIS to a long random value.
secret_key_base = "change_me_to_a_long_random_secret_key_base_at_least_64_hex_chars_0000"
# Application timezone (e.g. Europe/Bratislava).
time_zone = "UTC"
# Named volume for PostGIS data.
db_data_volume = "dawarich_db_data"
# Named volume for Redis data.
redis_data_volume = "dawarich_redis_data"
# Named volume shared by web and Sidekiq for generated public assets (/var/app/public).
public_volume = "dawarich_public"
# Named volume for the watched imports folder (/var/app/tmp/imports/watched).
watched_volume = "dawarich_watched"
# Named volume for uploaded files and storage (/var/app/storage).
storage_volume = "dawarich_storage"
# Placement constraints. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
constraints = []
# Resources for the web (Puma) task.
resources = {
cpu = 1000
memory = 2048
}
# Resources for the Sidekiq worker task.
sidekiq_resources = {
cpu = 1000
memory = 2048
}
# Resources for the bundled PostGIS task.
db_resources = {
cpu = 500
memory = 512
}
# Resources for the bundled Redis task.
redis_resources = {
cpu = 200
memory = 128
}
| Name | Type | Default | Description |
|---|---|---|---|
| job_name | string | "dawarich" | The name of the Nomad job. |
| namespace | string | "default" | The Nomad namespace to deploy into. |
| datacenters | list | ["*"] | The datacenters to deploy to. |
| image | string | "freikin/dawarich:latest" | The Dawarich container image (used for both web and Sidekiq). Pin a tag in production. |
| postgres_image | string | "postgis/postgis:17-3.5-alpine" | The PostGIS image for the bundled database. Use imresamu/postgis:17-3.5-alpine on ARM. |
| redis_image | string | "redis:7.4-alpine" | The Redis image for the bundled queue backend. |
| port | number | 3000 | Host port for the Dawarich web UI. |
| db_port | number | 5432 | Host port for the bundled PostGIS database. |
| redis_port | number | 6379 | Host port for the bundled Redis. |
| db_password set me | string | "dawarich_change_me" | Password for the bundled PostGIS database. CHANGE THIS. |
| secret_key_base set me | string | "change_me_to_a_long_random_secret_key_base_at_least_64_hex_chars_0000" | Rails SECRET_KEY_BASE used to sign sessions. CHANGE THIS to a long random value. |
| time_zone | string | "UTC" | Application timezone (e.g. Europe/Bratislava). |
| db_data_volume | string | "dawarich_db_data" | Named volume for PostGIS data. |
| redis_data_volume | string | "dawarich_redis_data" | Named volume for Redis data. |
| public_volume | string | "dawarich_public" | Named volume shared by web and Sidekiq for generated public assets (/var/app/public). |
| watched_volume | string | "dawarich_watched" | Named volume for the watched imports folder (/var/app/tmp/imports/watched). |
| storage_volume | string | "dawarich_storage" | Named volume for uploaded files and storage (/var/app/storage). |
| constraints | list | [] | Placement constraints. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true". |
| resources | object | {
cpu = 1000
memory = 2048
} | Resources for the web (Puma) task. |
| sidekiq_resources | object | {
cpu = 1000
memory = 2048
} | Resources for the Sidekiq worker task. |
| db_resources | object | {
cpu = 500
memory = 512
} | Resources for the bundled PostGIS task. |
| redis_resources | object | {
cpu = 200
memory = 128
} | Resources for the bundled Redis task. |
No variables match.
This pack stores data in 5 Docker named volumes:
dawarich_db_datadawarich_redis_datadawarich_publicdawarich_watcheddawarich_storage
⚠ This pack bundles a database. A cold copy of the volume can be inconsistent — for a reliable backup, dump the DB (pg_dump / mysqldump) or stop the job while backing up.
restic
# Run on the node hosting this pack. Point restic at your repo first: # export RESTIC_REPOSITORY="s3:https://<account>.r2.cloudflarestorage.com/<bucket>" # export RESTIC_PASSWORD="<repo-password>" # export AWS_ACCESS_KEY_ID=<key> AWS_SECRET_ACCESS_KEY=<secret> restic backup \ /var/lib/docker/volumes/dawarich_db_data/_data \ /var/lib/docker/volumes/dawarich_redis_data/_data \ /var/lib/docker/volumes/dawarich_public/_data \ /var/lib/docker/volumes/dawarich_watched/_data \ /var/lib/docker/volumes/dawarich_storage/_data
rclone (sync to S3/R2)
rclone sync /var/lib/docker/volumes/dawarich_db_data/_data backup:<bucket>/dawarich_db_data rclone sync /var/lib/docker/volumes/dawarich_redis_data/_data backup:<bucket>/dawarich_redis_data rclone sync /var/lib/docker/volumes/dawarich_public/_data backup:<bucket>/dawarich_public rclone sync /var/lib/docker/volumes/dawarich_watched/_data backup:<bucket>/dawarich_watched rclone sync /var/lib/docker/volumes/dawarich_storage/_data backup:<bucket>/dawarich_storage
Paths assume the default Docker volume location (/var/lib/docker/volumes). Restore by stopping the job, restoring files into the same volume, and re-running the pack.
Dawarich is a self-hosted location-history tracker — an open alternative to Google Maps Timeline. It ingests location points from phone apps (Overland, GPSLogger, OwnTracks) or imports from Google Takeout, OwnTracks, GPX and Immich, then shows your history on interactive maps with stats, visited places, trips and heatmaps. Your movement data stays on your own server.
This pack deploys Dawarich all-in-one as a single host-networked Nomad job:
All four share one allocation and talk over 127.0.0.1.
nomad-pack run dawarich --registry=nomploy \
--var db_password=$(openssl rand -hex 16) \
--var secret_key_base=$(openssl rand -hex 64)
Open http://<node-ip>:3000 and register the first account.
| Variable | Default | Description |
|---|---|---|
image |
freikin/dawarich:latest |
App image (web + Sidekiq). |
postgres_image |
postgis/postgis:17-3.5-alpine |
PostGIS image (use imresamu/postgis on ARM). |
redis_image |
redis:7.4-alpine |
Redis image. |
port |
3000 |
Host port for the web UI. |
db_port |
5432 |
Host port for PostGIS. |
redis_port |
6379 |
Host port for Redis. |
db_password |
dawarich_change_me |
PostGIS password — change this. |
secret_key_base |
placeholder | Rails session secret — change this. |
time_zone |
UTC |
Application timezone. |
resources |
1000 MHz / 2048 MB | Web (Puma) resources. |
sidekiq_resources |
1000 MHz / 2048 MB | Sidekiq worker resources. |
Data persists across separate volumes for PostGIS, Redis, public assets, watched imports and storage.