Deployment guide

Adventurelog

Overview

AdventureLog is a self-hosted travel companion. You log the countries and regions you have visited, plan future trips, pin adventures on an interactive world map and keep your travel photos in one private place.

This SecureAnyCloud image installs the official AdventureLog self-host Docker Compose stack, pinned to v0.12.1. The stack has a SvelteKit frontend (the web UI), a Django/GeoDjango + Gunicorn backend (the REST API, media and Django admin) and a PostgreSQL 16 database with the PostGIS extension for geospatial features. Every secret is generated uniquely on the first boot of every VM, and a fresh admin account is seeded on a clean database.

What you get:

  • The official AdventureLog v0.12.1 self-host stack running under Docker (the web frontend, the server backend and a PostgreSQL 16 + PostGIS db), pinned so it never silently upgrades
  • The SvelteKit frontend published on port 80 and the backend (REST API, media and Django admin) on port 8016
  • A per-VM admin account generated on first boot, with a unique password recorded in a root-only file, so every VM is secured independently
  • The customer-facing URLs (ORIGIN, PUBLIC_URL, CSRF_TRUSTED_ORIGINS) resolved to your VM's reachable address at first boot, so sign-in and CSRF work out of the box
  • The whole stack managed as one adventurelog.service systemd unit, plus docker.service, both enabled
  • PostgreSQL bound to the internal Docker network only. Just 22/tcp (SSH), 80/tcp (UI) and 8016/tcp (backend, media and API) are exposed
  • A unique PostgreSQL password, Django SECRET_KEY and admin password for every VM
  • 24/7 SecureAnyCloud support

Prerequisites

You need an active Azure subscription, an SSH key pair, and a VNet with a subnet in the target region.

Standard_B2s (2 vCPU / 4 GiB RAM) is a comfortable starting size for the three-container stack.

Configure the network security group (NSG) to allow inbound 22/tcp from your management network, and 80/tcp and 8016/tcp from the clients that will use AdventureLog. The app serves plain HTTP, so for production put it behind your own domain and TLS.

Step 1 - Deploy from the Azure Marketplace

Sign in to the Azure Portal, choose Create a resource, search the Marketplace for AdventureLog 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). Add ports 80 and 8016 after deployment.

Select Review + create, then Create.

Step 2 - Deploy from the Azure CLI

# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:adventurelog-ubuntu-24-04:default:latest
az vm create \
  --resource-group <your-rg> \
  --name adventurelog \
  --image sac1647283583153:adventurelog-ubuntu-24-04:default:latest \
  --size Standard_B2s \
  --admin-username azureuser \
  --ssh-key-values ~/.ssh/id_ed25519.pub \
  --vnet-name <your-vnet> --subnet <your-subnet> \
  --public-ip-sku Standard
az vm open-port --resource-group <your-rg> --name adventurelog --port 80 --priority 1010
az vm open-port --resource-group <your-rg> --name adventurelog --port 8016 --priority 1020

Step 3 - Connect to your VM

Connect to the VM over SSH:

ssh azureuser@<vm-public-ip>

Step 4 - Confirm the stack is running

AdventureLog runs as a Docker Compose stack managed by a single systemd unit. On first boot the stack rotates every secret and re-points its URLs at your VM's address. It then recreates itself on a fresh database and seeds the admin account.

The multi-container stack can take a minute or two to become fully healthy after the VM is created. Check the unit:

systemctl is-active adventurelog.service

The command reports active. List the running containers with:

sudo docker compose -f /var/lib/adventurelog/docker-compose.yml ps

The whole stack is managed as one systemd unit. Use sudo systemctl status adventurelog and sudo systemctl restart adventurelog to control every container together.

Step 5 - Retrieve your per-VM admin credentials

The admin password is generated uniquely on the first boot of your VM and written to a root-only file. Confirm that the file exists. It is mode 0600, root-only:

sudo ls -l /root/adventurelog-credentials.txt

Then read the file to get your credentials:

sudo cat /root/adventurelog-credentials.txt

The file contains adventurelog.url (the address to browse to), adventurelog.admin.username (admin), adventurelog.admin.email and DJANGO_ADMIN_PASSWORD (for the web UI). Store them somewhere safe.

Step 6 - Confirm the endpoints are healthy

The SvelteKit frontend answers on port 80, and the Django backend answers on port 8016. Check the frontend first:

curl -s -o /dev/null -w 'frontend -> HTTP %{http_code}\n' http://localhost/

It returns HTTP 200. Now check the backend REST API on port 8016:

curl -s -o /dev/null -w 'backend -> HTTP %{http_code}\n' http://localhost:8016/api/

It also returns HTTP 200. Finally, confirm which ports are published. PostgreSQL is deliberately not among them, because it stays on the internal Docker network:

sudo ss -tlnp | grep -E ':80 |:8016 ' | awk '{print $1, $4}'

Step 7 - Confirm the pinned release

The images are pinned to AdventureLog v0.12.1 so the appliance never silently upgrades:

sudo docker compose -f /var/lib/adventurelog/docker-compose.yml images

Step 8 - Sign in to the web UI

Browse to http://<vm-public-ip>/ and sign in with the username admin and the password from Step 5.

The dashboard summarises your travels: the number of adventures logged, the countries and regions visited, and your most recent entries.

Step 9 - Log adventures and explore the map

Open Locations to see every adventure you have logged, with its category, rating and whether you have visited it or still plan to.

Open Map to see each adventure plotted on an interactive world map. The map also tracks your progress across the places you want to see.

Logging your first adventure

AdventureLog groups your travels into collections and pins individual adventures on the map. In the web UI, select Add New Location. Give the location a name, a place (city and country) and coordinates so that it appears on the map. Set a rating, mark it visited or planned, and optionally add it to a collection, for example a specific trip.

Under World Travel, mark the countries and regions you have visited to build up your world map. Everything you create is stored in PostgreSQL with PostGIS on your own VM.

You can also use the REST API. The backend is served on port 8016 and uses session authentication. Sign in at /accounts/login/ to obtain a session, then create objects under /api/collections/ and /api/locations/:

# Illustrative - substitute your admin password for <DJANGO_ADMIN_PASSWORD> BASE=http://<vm-public-ip>:8016
# 1. Get a CSRF cookie, 2. sign in, 3. create a collection with the session cookie curl -c cj -b cj "$BASE/accounts/login/" -o /dev/null
# ... POST login=admin, password=<DJANGO_ADMIN_PASSWORD>, csrfmiddlewaretoken to /accounts/login/
# ... POST {"name":"European Summer 2026"} to /api/collections/ with the X-CSRFToken header

The AdventureLog documentation has the full API and feature reference.

Maintenance

  • Admin credentials. The per-VM admin account is in /root/adventurelog-credentials.txt. Change the password from your profile settings in the web UI after your first sign-in.
  • Custom domain. The URLs are pinned to the VM's address at first boot. If you reach the VM by a DNS name or a different IP, update ORIGIN, FRONTEND_URL, PUBLIC_URL and CSRF_TRUSTED_ORIGINS in /var/lib/adventurelog/.env, then run sudo systemctl restart adventurelog.
  • Data and backups. The PostgreSQL database and your uploaded media live in the postgres_data and adventurelog_media Docker volumes. For backups, snapshot the OS disk or run pg_dump against the db container.
  • Stack control. Manage the whole stack with sudo systemctl <status|restart|stop> adventurelog. Manage individual containers with sudo docker compose -f /var/lib/adventurelog/docker-compose.yml <ps|logs|restart>.
  • TLS. AdventureLog serves plain HTTP. Front it with your own domain and TLS before you run it in production.
  • Security patches. Unattended upgrades remain enabled, so the OS keeps receiving security updates automatically.

Support

SecureAnyCloud provides 24/7 expert support for this image. Contact sales@secureanycloud.com.

Deploy on Azure

Launch AdventureLog 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

Deploy on Azure