Tracktor
Overview
Tracktor is an open-source, self-hosted vehicle and fleet management app. For every vehicle you own or run, it keeps a full fuel log with mileage and cost, a service and maintenance history, and a store of compliance documents such as insurance and registration. Each document has a renewal reminder, so nothing lapses.
A dashboard turns that history into running totals and trends for spend, fuel consumption and upcoming renewals. You can see the true cost of keeping each vehicle on the road.
This SecureAnyCloud image ships the free and open-source, MIT licensed Tracktor application on Ubuntu 24.04 on Azure. It is built unmodified from the pinned upstream release and runs natively on Node 22 with an embedded SQLite database. The appliance boots and works standalone, with no external database or service.
Upstream Tracktor creates the first account through an open registration form. It leaves that registration endpoint reachable even after an owner exists, which is a real risk for a VM with a public IP. This image closes that window completely. On first boot, before the public port is ever opened, the instance generates a per-VM encryption secret and claims the owner account itself with a per-VM random password, written to a root-only file. Public registration is then permanently disabled at the reverse proxy.
What you get:
- Tracktor v2.0.1 (the MIT licensed SvelteKit vehicle and fleet manager), built from the pinned upstream source
- Node 22 from the official NodeSource repository, running the app as an unprivileged
tracktorservice account - An embedded SQLite database at
/var/lib/tracktor/tracktor.db, created and migrated automatically on first boot, with no separate database service or host port - Host nginx as the single public listener on port
80, reverse proxying to the app on loopback, with header buffers sized for authenticated responses tracktor-firstboot.service,tracktor.serviceandtracktor-postboot.serviceas systemd units, enabled and active on boot- A per-VM encryption secret and a per-VM owner account password, generated on first boot and never baked into the image
- The owner account claimed during bootstrap while port
80is still closed, so a passer-by can never claim the instance - Public registration permanently disabled:
/registerand/api/auth/registerreturn 404 from the public interface - No default login, no shipped secret, and an empty database on first boot
- Ubuntu 24.04 LTS base with the latest security patches applied at build time
- Azure Linux Agent for cloud integration and SSH key injection
- 24/7 SecureAnyCloud support with guaranteed 24 hour response SLA
Tracktor is a trademark of its respective owner. This image is produced by SecureAnyCloud and is not affiliated with, endorsed by, or sponsored by the Tracktor project. It ships the free and open-source, self-hosted software, unmodified.
Prerequisites
- An active Azure subscription, an SSH public key, and a VNet with a subnet in the target region
- A subscription to the Tracktor listing on the Azure Marketplace
Recommended virtual machine size: Standard_B2s (2 vCPU, 4 GB RAM) is a comfortable fit for a single Node process and an embedded SQLite database. The application idles at well under 100 MB of memory, so this size suits a person, a household or a small fleet. For many concurrent users, 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 app 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 Tracktor 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).
Then select Review + create and Create.
Deploy from the Azure CLI
Create the resource group, network and security rules, accept the Marketplace terms, then create the VM.
RG="tracktor-prod"; LOCATION="eastus"; VM_NAME="tracktor-01" IMAGE_URN="sac1647283583153:tracktor:default:latest" SSH_KEY="$(cat ~/.ssh/id_rsa.pub)" az group create --name "$RG" --location "$LOCATION" az network vnet create -g "$RG" --name tracktor-vnet --address-prefix 10.100.0.0/16 --subnet-name tracktor-subnet --subnet-prefix 10.100.1.0/24 az network nsg create -g "$RG" --name tracktor-nsg az network nsg rule create -g "$RG" --nsg-name tracktor-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 tracktor-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:tracktor: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 tracktor-vnet --subnet tracktor-subnet --nsg tracktor-nsg --public-ip-sku StandardReplace <sub-id> and <version> with your subscription ID and the image version shown on the listing. Replace <your-mgmt-cidr> with the network you administer from.
First boot and per-instance credentials
On the first boot of each VM, Tracktor generates its own per-instance secrets and claims its own owner account before the web port is opened. Nothing is baked into the image.
Give the instance a minute after first boot, then SSH in and read the credentials file (mode 0600 root:root):
sudo cat /root/tracktor-credentials.txtThe file contains everything unique to this instance:
TRACKTOR_USERNAME/TRACKTOR_PASSWORD: the owner login you use in the web UI. The owner has full access to the fleet.TRACKTOR_URL: the web address of this instance, resolved from its public IP on first boot.
Confirm that the services are healthy:
sudo systemctl is-active tracktor-firstboot tracktor tracktor-postboot nginxactive active active activeThe application answers a health check on the loopback port. A successful answer also proves that the SQLite schema migrated on startup:
curl -s http://127.0.0.1/api/health{"success":true,"data":{"timestamp":"2026-08-08T00:00:00.000Z"},"message":"Tracktor API is working"}The security model
Upstream Tracktor creates the first account through an open /register form. The web page closes once an owner exists, but the underlying registration API stays reachable. On a raw deployment, a passer-by could therefore still create an account. On a VM with a public IP that is a real risk, so SecureAnyCloud removes it in two independent ways.
First, tracktor-postboot.service claims the owner account itself, over the loopback port, with a password generated for this VM. It does this before the public listener ever comes up.
Second, host nginx, the only public listener, permanently returns 404 for both /register and /api/auth/register. Public registration is therefore structurally impossible. nginx does not start at all until the owner has been claimed: it is gated on a bootstrap-ready marker that the post-boot service creates only after the owner exists. Port 80 is therefore closed for the whole bootstrap window.
The encryption secret (APP_SECRET, used by Tracktor to encrypt any notification credentials you add) is also generated on first boot. A startup guard refuses to launch the application at all if that secret is empty, too short or a known default. The upstream empty default never runs on your VM.
The app is on loopback only, and nginx is the single public door on port 80. Confirm this:
ss -tln | grep -E ':(80|3000) ' | awk '{print $1, $4}'LISTEN 127.0.0.1:3000 LISTEN 0.0.0.0:80 LISTEN [::]:80Public registration is closed, and anonymous callers cannot read vehicle data. Check both:
curl -s -o /dev/null -w 'public POST /api/auth/register -> %{http_code}\n' -X POST http://127.0.0.1/api/auth/register -H 'Content-Type: application/json' --data '{"username":"passerby","password":"nope123"}'
curl -s -o /dev/null -w 'anonymous GET /api/vehicles -> %{http_code}\n' http://127.0.0.1/api/vehiclespublic POST /api/auth/register -> 404 anonymous GET /api/vehicles -> 401Exactly one account exists on a fresh instance, and it is the owner you were given. Query the database:
sudo sqlite3 /var/lib/tracktor/tracktor.db 'SELECT username FROM users;'adminVerify the end-to-end round-trip
The image ships a script that exercises the whole security model and a real authenticated action through the public front door. It confirms that:
- The app answers
- Public registration is refused
- Anonymous callers are rejected
- A wrong password is rejected
- The per-instance password logs in, then creates and reads back a vehicle and a fuel log
Run it:
sudo /usr/local/sbin/tracktor-roundtrip.shOK round-trip: url=http://<vm-ip>/ user=admin; health 200; anon vehicles 401; public register blocked 404; wrong password 401; login 200; created + read back vehicle and a fuel logSign in to the web app
Open http://<vm-ip>/ in your browser. Sign in with the TRACKTOR_USERNAME and TRACKTOR_PASSWORD from the credentials file.
After you sign in, the dashboard is the home view. It summarises your fleet: the vehicles you have added, recent activity, upcoming reminders and the running costs Tracktor derives from your fuel and service history.
Managing vehicles and logging fuel
Choose Add Vehicle from the dashboard or the Garage, and fill in the make, model, year and registration.
The Garage shows every vehicle you manage, each with its registration, fuel type and current odometer. Each vehicle has its own pages for fuel, maintenance, documents and reminders.
Open Fuel Logs to record a fill-up with its date, odometer reading, quantity and cost. As you add entries, Tracktor tracks consumption and spend over time. The view shows the fuel used, total spent and average mileage across the fleet, with a per-entry table. Each vehicle also holds its service history and its insurance and registration documents with renewal reminders.
Adding other people
This image is a single-owner appliance. Public self-registration is disabled, so nobody can create an account on your instance from the web. The owner account manages the whole fleet.
You can change the owner username or password at any time from the profile menu in the top right of the web UI.
Using your own domain
The instance works whether you reach it by its public IP or by a DNS name that points at it. The reverse proxy forwards the browser's Host header, so no reconfiguration is needed to use a hostname.
If you terminate TLS on a reverse proxy in front of the VM, set HTTP_MODE=https in /etc/tracktor/tracktor.env so the session cookie is marked secure. Then restart the service:
sudo systemctl restart tracktorManaging the service
View recent application logs and restart the app:
# view recent application logs
sudo journalctl -u tracktor.service --no-pager | tail -50
# restart the app
sudo systemctl restart tracktorThe MIT licence text and a note recording the exact upstream release shipped here are on the VM at /usr/share/doc/tracktor/.
Support
SecureAnyCloud provides 24/7 support with a guaranteed 24 hour response SLA. Contact sales@secureanycloud.com for assistance with this image.
Deploy on Azure
Launch Tracktor 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