Reitti
Overview
Reitti is an open source personal location tracking and analysis application. It ingests the location history you already produce (live positions from the OwnTracks phone app, GPX track files and a Google Takeout export of your Maps timeline) and turns the raw points into detected visits, the trips between them and the significant places you return to. You read the result on an interactive map and a day-by-day timeline. The name comes from the Finnish word for route or path.
This SecureAnyCloud image runs the free, open source, AGPL-3.0 licensed Reitti application the officially supported way, as upstream containers pinned by image digest: the Reitti Spring Boot app, a PostgreSQL 17 + PostGIS 3.5 spatial database, a Redis cache and a map tile cache. The tile cache proxies map tiles so that browsing your history does not hammer a public tile service. All images are captured into the VM, so your instance starts in seconds.
Reitti ships upstream with a built-in admin / admin login, so this image ships with no working default. The admin password is rotated to a unique random value on the first boot of each VM, a unique database password and cache password are generated, and the public web door stays closed until the rotation has completed and been proven.
Reitti is a trademark of its respective owner. This image is produced by SecureAnyCloud and is not affiliated with, endorsed by, or sponsored by the Reitti project or dedicatedcode. It ships the free, open source, AGPL-3.0 licensed self-hosted software, unmodified.
What you get:
- Reitti v5.1.0 (the AGPL-3.0 licensed Spring Boot application), pinned by image digest
- PostgreSQL 17 with the PostGIS 3.5 spatial extension, pinned by image digest, for the location database
- Redis for the application cache and distributed locks, pinned by image digest
- A map tile cache that proxies and caches OpenStreetMap tiles, pinned by image digest
- Docker Engine with the app, database, cache and tile cache published to the loopback interface only, fronted by nginx on port
80 reitti-firstboot.service,reitti.service,reitti-postboot.serviceandnginx.serviceas systemd units, enabled and active on boot- A per-instance
adminpassword (rotated away from the upstream admin default), a unique database password and a unique cache password, generated per VM on first boot and never baked into the image - A public web door that stays closed until the per-instance admin rotation is proven, an empty database on first boot, and no working default login
- An Ubuntu 24.04 LTS base with the latest security patches applied at build time
- The Azure Linux Agent for cloud integration and SSH key injection
- 24/7 SecureAnyCloud support with guaranteed 24 hour response SLA
Prerequisites
- An active Azure subscription, an SSH public key, and a VNet with a subnet in the target region
- A subscription to the Reitti listing on Azure Marketplace
Recommended VM size: Standard_B2s (2 vCPU, 4 GB RAM) is a sensible starting size for a personal timeline. For large imports (years of history or a full Google Takeout) or heavier processing, use Standard_D2s_v5 or larger.
Configure the network security group (NSG) to allow inbound 22/tcp from your management network and 80/tcp for the web UI from the networks that use it.
Deploy from the Azure Portal
Sign in to the Azure Portal, choose Create a resource, search the Marketplace for Reitti by SecureAnyCloud, and select Create.
On the Basics tab, pick your subscription, resource group, region and size. Under Administrator account, choose SSH public key and paste your key. Under Inbound port rules, allow SSH (22) and HTTP (80).
Select Review + create, then Create.
Deploy from the Azure CLI
RG="reitti-prod"; LOCATION="eastus"; VM_NAME="reitti-01" IMAGE_URN="sac1647283583153:reitti-ubuntu-24-04:default:latest" SSH_KEY="$(cat ~/.ssh/id_rsa.pub)" az group create --name "$RG" --location "$LOCATION" az network vnet create -g "$RG" --name reitti-vnet --address-prefix 10.100.0.0/16 --subnet-name reitti-subnet --subnet-prefix 10.100.1.0/24 az network nsg create -g "$RG" --name reitti-nsg az network nsg rule create -g "$RG" --nsg-name reitti-nsg --name allow-ssh --priority 100 \
--source-address-prefixes "<your-mgmt-cidr>" --destination-port-ranges 22 --access Allow --protocol Tcp az network nsg rule create -g "$RG" --nsg-name reitti-nsg --name allow-http --priority 110 \
--destination-port-ranges 80 --access Allow --protocol Tcp
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:reitti-ubuntu-24-04:default:latest
az vm create -g "$RG" --name "$VM_NAME" --image "$IMAGE_URN" \
--size Standard_B2s --storage-sku StandardSSD_LRS \
--admin-username azureuser --ssh-key-values "$SSH_KEY" \
--vnet-name reitti-vnet --subnet reitti-subnet --nsg reitti-nsg --public-ip-sku StandardConnect to your VM
ssh azureuser@<vm-ip>Confirm the services are running
The stack runs as four containers (the Reitti app, PostGIS, Redis and the map tile cache) under one reitti.service, fronted by nginx. Confirm that the services are active and list the containers:
sudo systemctl is-active docker reitti nginx
sudo docker ps --format 'table {{.Names}}\t{{.Status}}'The services report active and the four containers report healthy. Only the Reitti app is published, to 127.0.0.1:8090. PostGIS, Redis and the tile cache have no host port at all.
nginx on :80 is the single public front door. It proxies to the app, including the WebSocket/SSE live location stream.
Read the per-instance credentials
Reitti ships upstream with a built-in admin account whose password is the well-known default admin. On the first boot of this VM, that password was rotated to a unique random value. A unique database password and cache password were also generated, and all the values were written to a root-only file.
The public :80 door stays closed until the rotation completes, so the default is never reachable over the network. Read the credentials:
sudo cat /root/reitti-credentials.txtThe file (mode 0600 root:root) holds ADMIN_USERNAME and ADMIN_PASSWORD, the account you sign in to the web UI with, plus WEB_URL and VM_IP. None of these values ship in the image. Every value is unique to this VM, so no two instances share a credential and there is no working default login.
Verify the security model
The login page and the health endpoint are reachable without authentication. Every application page requires a logged-in session, and the upstream default admin / admin no longer works.
Run the following checks. They confirm that the login page and health endpoint are live, that the app root is protected when unauthenticated, that the default login is rejected, and that the per-instance admin credential authenticates:
ADMIN_PASSWORD=$(sudo grep '^ADMIN_PASSWORD=' /root/reitti-credentials.txt | cut -d= -f2-)
curl -s -o /dev/null -w 'login page (no auth): %{http_code}\n' http://localhost/login
curl -s -o /dev/null -w 'health (no auth): %{http_code}\n' http://localhost/actuator/health
curl -s -o /dev/null -w 'app root (no auth): %{http_code}\n' http://localhost/ jar=$(mktemp);
curl -s -o /dev/null -c "$jar" --data-urlencode username=admin --data-urlencode password=admin http://localhost/login
curl -s -o /dev/null -w 'default admin/admin (authed root): %{http_code}\n' -b "$jar" http://localhost/ jar2=$(mktemp);
curl -s -o /dev/null -c "$jar2" --data-urlencode username=admin --data-urlencode "password=$ADMIN_PASSWORD" http://localhost/login
curl -s -o /dev/null -w 'per instance admin (authed root): %{http_code}\n' -b "$jar2" http://localhost/ rm -f "$jar" "$jar2"The login page and health endpoint return 200. The app root returns 302, a redirect to the login page, so it is protected. The default admin / admin session is still redirected with 302, which means it is rejected. Only the per-instance admin session reaches the app root with 200.
This is the security model: no working default login, and the public door opens only after the per-instance admin password is set.
The same round trip is bundled as a single script on the image. It proves that the credential works end to end:
sudo /usr/local/sbin/reitti-roundtrip.shOpen the web UI and sign in
Browse to http://<vm-ip>/. Sign in with the ADMIN_USERNAME (admin) and the per-instance ADMIN_PASSWORD from Step 5.
See your location history on the map
The main view is an interactive map with a day timeline. After you connect a data source (next step) and Reitti processes the incoming points, your movements appear as a track for the selected day. The detected visits and trips are laid out along the timeline.
Use the date strip to move between days and the time slider to scrub through a day.
Connect a data source
Open Settings then Integrations to connect the sources of your location data. Reitti accepts live data from the OwnTracks and GPSLogger phone apps, the Overland app, and an OwnTracks Recorder or MQTT feed. For one-off imports of GPX files or a Google Takeout export, open Settings then Import Data.
Each integration shows a ready-made setup URL that already contains this instance's address and the selected API token, so your phone can start sending points in minutes.
Manage devices
Open Settings then Devices to manage the devices that send you location data. Each device has a name, an accent color used to draw its track on the map, and a show-on-map toggle. A multi-device household can see each person's movements in their own color.
Add a device to get a token for a new phone, or set a default device for imports.
How data is processed
Reitti waits a short grace period after the last incoming point, then processes unprocessed data in batches. It filters implausible points, clusters stays into visits, connects them into trips, and reverse geocodes them into significant places.
You can tune visit sensitivity, transportation modes and the geocoding service under Settings. Larger imports are processed in the background, and the Job Status page under Settings shows progress.
Data location and backup
All location data lives in the PostGIS database on a Docker volume. Uploaded files live on the Reitti data volume. Both volumes are on the VM's OS disk.
To back up, snapshot the disk from Azure or dump the database:
sudo docker exec reitti-postgis-1 pg_dump -U reitti reittidb | gzip > reitti-backup-$(date +%F).sql.gzTo export your own history, open Settings then Export Data. It produces GPX or GeoJSON that you can take elsewhere.
Server components
The image includes these components:
Application Reitti v5.1.0 (Spring Boot, AGPL-3.0, pinned by image digest)
Database PostgreSQL 17 + PostGIS 3.5 (pinned by image digest)
Cache Redis 7.2 (pinned by image digest)
Tile cache Reitti tile cache v5.1.0 (nginx OSM proxy, pinned by image digest)
Reverse proxy nginx on port 80 (single public front door)
Base image Ubuntu 24.04 LTS, fully patched at build time
Security model
- No working default login. Reitti's built-in
admin/adminis rotated to a unique random password on the first boot of every VM and written to/root/reitti-credentials.txt(0600 root:root). The public:80door stays closed (nginx is ordered after the rotation) until the per-instance admin password is set and proven, so the default is never reachable over the network. - Unique per-instance secrets. The database password and the Redis cache password are generated fresh on first boot. Nothing is baked into the image.
- Loopback-only backends. Only the Reitti app is published, to
127.0.0.1:8090. PostGIS, Redis and the tile cache have no host port. nginx on:80is the single public front door. - Empty on first boot. The database and data volumes are captured empty, so no location data from the build ever ships. Every VM starts clean.
- Restrict access. Keep port
80restricted to the networks that need it. If you expose Reitti beyond a trusted network, put it behind your own TLS-terminating proxy or the Azure Application Gateway.
Support
Every SecureAnyCloud deployment includes 24/7 support with a guaranteed 24 hour response SLA. For questions about this Reitti image or help with your deployment, contact sales@secureanycloud.com.
Reitti is a trademark of its respective owner. This image is produced by SecureAnyCloud and is not affiliated with, endorsed by, or sponsored by the Reitti project or dedicatedcode.
Deploy on Azure
Launch Reitti on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com