Nomploy Nomad Packs

← All packs

owntracks-recorder v0.1.0

Apps

OwnTracks Recorder — a self-hosted store and web map for your location history. The OwnTracks phone apps publish your positions to it (over HTTP), and you keep a private timeline of where you've been, queryable via a REST API and a built-in map. Deployed as a host-networked Nomad service (HTTP mode, no MQTT broker required) with a persistent data volume.

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

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

1 task http 8083 1 volume image owntracks/recorder:latest tracks :latest image bumped today
Variables 8
values.hcl

Save as values.hcl, edit, then run:

nomad-pack run owntracks-recorder -f values.hcl --registry nomploy
# The name of the Nomad job.
job_name = "owntracks-recorder"

# The Nomad namespace to deploy into.
namespace = "default"

# The datacenters to deploy to.
datacenters = ["*"]

# The OwnTracks Recorder container image. Pin a tag in production.
image = "owntracks/recorder:latest"

# Host port for the Recorder web UI / API. The container listens on 8083.
port = 8083

# Named volume for recorded location data (/store): the .rec history and last-position store.
data_volume = "owntracks_store"

# Placement constraints. Pin to the node holding the volume. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
constraints = []

# Resources for the Recorder task.
resources = {
    cpu    = 300
    memory = 128
  }
NameTypeDefaultDescription
job_name string
"owntracks-recorder"
The name of the Nomad job.
namespace string
"default"
The Nomad namespace to deploy into.
datacenters list
["*"]
The datacenters to deploy to.
image string
"owntracks/recorder:latest"
The OwnTracks Recorder container image. Pin a tag in production.
port number
8083
Host port for the Recorder web UI / API. The container listens on 8083.
data_volume string
"owntracks_store"
Named volume for recorded location data (/store): the .rec history and last-position store.
constraints list
[]
Placement constraints. Pin to the node holding the volume. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
resources object
{
    cpu    = 300
    memory = 128
  }
Resources for the Recorder task.
Back up this pack

This pack stores data in one Docker named volume: owntracks_store

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/owntracks_store/_data

rclone (sync to S3/R2)

rclone sync /var/lib/docker/volumes/owntracks_store/_data backup:<bucket>/owntracks_store

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

owntracks-recorder

OwnTracks Recorder — a self-hosted store and web map for your own location history. The OwnTracks iOS/Android apps publish your positions to it, and you keep a private, queryable timeline (REST API + built-in map) instead of handing your movements to a cloud service.

Single host-networked Nomad service in HTTP mode (no MQTT broker needed) with a persistent data volume.

Deploy

nomad-pack registry add nomploy https://github.com/Nomploy/nomad-packs
nomad-pack run owntracks-recorder --registry=nomploy

Configure

Variable Default Description
port 8083 Web UI / API port. The container listens on 8083.
data_volume owntracks_store /store — the recorded location history.
image owntracks/recorder:latest Container image. Pin a tag in production.
resources { cpu = 300, memory = 128 } Task resources.

MQTT is disabled (OTR_PORT=0) so this runs standalone over HTTP. In the OwnTracks app, set Mode = HTTP and point it at http://<node-ip>:8083/pub?u=<user>&d=<device>.

The Recorder has no built-in authentication and stores sensitive location data — keep it on an internal network or front it with an authenticating reverse proxy. Pin the job to the node holding the volume with constraints.