Nomploy Nomad Packs

← All packs

dawarich v0.1.0

Productivity

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).

nomad-pack run dawarich --registry nomploy
…or one line (add registry + run)
curl -fsSL https://packs.nomploy.com/install.sh | sh -s -- dawarich

Needs nomad-pack on PATH. The script only adds the nomploy registry and runs this pack.

4 tasks http 3000db 5432redis 6379 5 volumes image freikin/dawarich:latest tracks :latest image bumped today
Variables 22
values.hcl

Save as values.hcl, edit, then run:

nomad-pack run dawarich -f values.hcl --registry nomploy
# 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
  }
NameTypeDefaultDescription
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.
Back up this pack

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.

Readme

dawarich

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.

Deploy

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.

Configuration

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.