---
title: "Deploy AdventureLog"
description: "Self-hostable travel tracker and trip planner"
category: "Blogs"
url: https://railway.com/deploy/adventurelog-1
---

# Deploy AdventureLog

Self-hostable travel tracker and trip planner

**[Deploy AdventureLog on Railway](https://railway.com/template/adventurelog-1)**

Machine-readable deploy manifest (JSON, validated by TemplateCI): https://railway.com/deploy/adventurelog-1/manifest.json

- **Creator:** OpenSource Templates
- **Category:** Blogs
- **Total deploys:** 2

## Template content

### Server https://cdn.jsdelivr.net/gh/selfhst/icons/svg/adventurelog.svg

- **Image:** ghcr.io/seanmorley15/adventurelog-backend:v0.13.0

### Db https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/postgresus.svg

- **Image:** ghcr.io/baosystems/postgis:15-3.5

### AdventureLog https://cdn.jsdelivr.net/gh/selfhst/icons/svg/adventurelog.svg

- **Image:** ghcr.io/seanmorley15/adventurelog-frontend:v0.13.0
- **Public domain:** Yes

## Documentation

# Deploy and Host AdventureLog on Railway

AdventureLog is a modern open-source travel companion. Log locations and visits with photos, notes, and trails; build multi-day trip itineraries; mark countries, regions, and cities on an interactive world map; and share plans with the people you travel with - all while keeping your data on infrastructure you control.

[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/lfTlXo)

## About Hosting AdventureLog

Hosting AdventureLog on Railway runs three containers on Railway’s private network:

- **AdventureLog** (frontend) - SvelteKit UI, publicly reachable via Railway’s HTTPS domain
- **Server** (backend) - Django API + media handling
- **Db** - PostGIS 15 for geospatial data (locations, maps, regions)

The frontend talks to the backend over the private network. The backend stores media on a persistent volume and uses PostGIS for map features. After deploy, open the public AdventureLog domain, log in with the auto-generated admin credentials (or the ones you set), and start logging trips.

## Common Use Cases

- Personal travel journal with an interactive world map of everywhere you’ve been
- Collaborative trip planning - share itineraries, packing lists, and daily plans with travel companions
- Track countries, regions, and cities visited and see travel stats on a dashboard
- Store photos, trails, activities, and notes for each location without relying on closed travel apps
- Privacy-focused alternative to commercial travel loggers - your data stays on your Railway project

## Dependencies for AdventureLog Hosting

- **Frontend:** `ghcr.io/seanmorley15/adventurelog-frontend:v0.13.0`
- **Backend (Server):** `ghcr.io/seanmorley15/adventurelog-backend:v0.13.0`
- **Database:** `ghcr.io/baosystems/postgis:15-3.5` (PostGIS-enabled PostgreSQL)
- **Railway private networking** - frontend → backend, backend → database
- **Two persistent volumes** - media files and Postgres data
- Auto-generated admin password and username secrets

Keep the **Db** and **Server** services private; only the **AdventureLog** (frontend) service needs a public domain.

Upstream: [AdventureLog](https://adventurelog.app) · [GitHub](https://github.com/seanmorley15/AdventureLog) · [Docs](https://adventurelog.app/docs)

### Implementation Details

| Service          | Image                                              | Role                              |
|------------------|----------------------------------------------------|-----------------------------------|
| **AdventureLog** | `ghcr.io/seanmorley15/adventurelog-frontend:v0.13.0` | Public web UI (SvelteKit)        |
| **Server**       | `ghcr.io/seanmorley15/adventurelog-backend:v0.13.0`  | Django API + media               |
| **Db**           | `ghcr.io/baosystems/postgis:15-3.5`                  | PostGIS database                 |

Key environment wiring:

- Frontend `PUBLIC_SERVER_URL` → `http://${{Server.RAILWAY_PRIVATE_DOMAIN}}:8000`
- Backend `FRONTEND_URL` / `CSRF_TRUSTED_ORIGINS` → frontend public domain
- Backend `PGHOST` → `${{Db.RAILWAY_PRIVATE_DOMAIN}}`
- Backend media volume at `/code/media/`
- Database uses user `adventure`, password `adventure`, database `database` (change in production if desired)

## Topology

| Service          | Role                    | Volume                          | Public | Notes                          |
|------------------|-------------------------|---------------------------------|--------|--------------------------------|
| **AdventureLog** | Frontend (SvelteKit)    | None                            | Yes    | Public HTTPS domain            |
| **Server**       | Backend (Django)        | `/code/media/`                  | No     | Private, port 8000             |
| **Db**           | PostGIS database        | `/var/lib/postgresql/data/`     | No     | `PGDATA` subdirectory used     |

#### Volumes (drives) - what to mount

Volumes are already defined in the template. They survive redeploys.

| Service    | Mount path                      | What is stored                          |
|------------|---------------------------------|-----------------------------------------|
| **Server** | `/code/media/`                  | Uploaded photos and media files         |
| **Db**     | `/var/lib/postgresql/data/`     | Database files (`PGDATA` subdirectory)  |

Railway: each service → **Settings** → **Volumes**. Do not detach these volumes or media and travel data will be lost.

## Quick Start

1. Click the **Deploy on Railway** button above.
2. Sign in (or create a free Railway account) and deploy.
3. Wait a few minutes for the three services and volumes to come up (first boot may take longer while geography data is prepared).
4. Open the **AdventureLog** service → **Settings** → **Networking** and open the generated public domain.
5. Log in with the admin credentials:
   - Username and password are auto-generated secrets on the **Server** service (`DJANGO_ADMIN_USERNAME` / `DJANGO_ADMIN_PASSWORD`).
   - Find them under **Server → Variables**.
6. Start adding locations, planning trips, and exploring the world map.

## Configuration

### Important variables (Server service)

| Variable                 | Default / Source                          | Notes                                      |
|--------------------------|-------------------------------------------|--------------------------------------------|
| `PUBLIC_URL`             | `https://${{Server.RAILWAY_PUBLIC_DOMAIN}}` | Backend public URL reference              |
| `FRONTEND_URL`           | Frontend public domain                    | Required for CSRF and redirects            |
| `CSRF_TRUSTED_ORIGINS`   | Frontend public domain                    | Must match the frontend HTTPS URL          |
| `PGHOST`                 | `${{Db.RAILWAY_PRIVATE_DOMAIN}}`          | Private network to PostGIS                 |
| `PGUSER` / `PGPASSWORD` / `PGDATABASE` | `adventure` / `adventure` / `database` | Match the Db service                       |
| `SECRET_KEY`             | `adventure` (placeholder)                 | Change for production                      |
| `DJANGO_ADMIN_USERNAME`  | Auto-generated secret                     | First admin login                          |
| `DJANGO_ADMIN_PASSWORD`  | Auto-generated secret                     | First admin login                          |
| `DJANGO_ADMIN_EMAIL`     | `admin@example.com`                       | Can be updated                             |
| `DEBUG`                  | `False`                                   | Keep false in production                   |

### Frontend variables

| Variable             | Default / Source                                      | Notes                          |
|----------------------|-------------------------------------------------------|--------------------------------|
| `ORIGIN`             | `https://${{RAILWAY_PUBLIC_DOMAIN}}`                  | Frontend origin                |
| `PUBLIC_SERVER_URL`  | `http://${{Server.RAILWAY_PRIVATE_DOMAIN}}:8000`      | Private link to backend        |
| `BODY_SIZE_LIMIT`    | `Infinity`                                            | Allows larger media uploads    |

### Database variables

| Variable             | Default     | Notes                          |
|----------------------|-------------|--------------------------------|
| `POSTGRES_USER`      | `adventure` | Matches backend                |
| `POSTGRES_PASSWORD`  | `adventure` | Matches backend                |
| `POSTGRES_DB`        | `database`  | Matches backend                |
| `PGDATA`             | `/var/lib/postgresql/data/pgdata` | Clean subdirectory for Railway volumes |

## Custom Domain

1. AdventureLog (frontend) service → **Settings** → **Networking** → **Custom Domain**.
2. Add your domain and follow Railway’s DNS instructions.
3. Update any frontend-related variables if needed (`ORIGIN`, and on the Server: `FRONTEND_URL`, `CSRF_TRUSTED_ORIGINS`).
4. Redeploy the affected services.

Railway provisions TLS automatically.

## Updating AdventureLog

1. For each service (AdventureLog / Server) → **Settings** → **Source**.
2. Change the image tag (e.g. `v0.13.0` → newer release).
3. Redeploy.

Check the [AdventureLog releases](https://github.com/seanmorley15/AdventureLog/releases) before upgrading. Database migrations are normally handled by the backend on startup.

## Traps

**Ways this still fails:**

- **Wrong `FRONTEND_URL` / `CSRF_TRUSTED_ORIGINS`** - Must be the exact public HTTPS URL of the frontend (including `https://`). Mismatches break login and API calls.
- **Default secrets left in place** - Change `SECRET_KEY`, database password, and consider rotating the auto-generated admin password after first login.
- **Private networking lag** - Frontend or backend may start before the database is fully ready. Wait a minute and restart the Server or AdventureLog service if you see connection errors.
- **Media volume missing** - Photos and uploads will disappear on redeploy if the `/code/media/` volume is not attached.
- **First boot memory** - PostGIS + initial geography data can use more RAM. Give the services adequate memory on first deploy if the project struggles.
- **Renaming services** - If you rename Db or Server, update the corresponding private-domain references (`PGHOST`, `PUBLIC_SERVER_URL`, etc.).

View live logs: select the service → **Deployments** → latest deployment → **View Logs**.

## Why Deploy AdventureLog on Railway?

Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.

By deploying AdventureLog on Railway, you get a full travel tracker and trip planner with private networking, persistent storage, and automatic HTTPS - no servers to maintain.

## Similar templates

- [Pixelfed](https://railway.com/deploy/OZSdEw) — Explore + Share beautiful photos and videos on the Fediverse
- [Hexo](https://railway.com/deploy/hexo) — Hexo — fast static blog framework with admin editor and S3 media storage
- [Bluesky PDS (Atproto Spaces Alpha)](https://railway.com/deploy/bluesky-pds-atproto-spaces-alpha) — "The Atproto Spaces Alpha" version of Bluesky PDS.

Open this page in a browser: https://railway.com/deploy/adventurelog-1
