Skip to content

Manual Docker Setup

You can install wanderer components either via Docker (Quick Setup or Manual Setup) or from source.

wanderer uses encrypted secrets such as passwords and private keys. To support this, you must set an encryption key using the POCKETBASE_ENCRYPTION_KEY environment variable. You can generate one using:

Terminal window
openssl rand -hex 16
# Example output: ce7f0ddb97100c42e6409a8537c11e23

Once you have set the encryption key, you can proceed to install wanderer.

After cloning the repository, you will find a docker-compose.yml file in the root directory. This file sets up all necessary components. Start everything by running:

Terminal window
docker compose up -d

If you’re not hosting wanderer at http://localhost:3000, update the ORIGIN environment variable accordingly:

ORIGIN=http(s)://<your_domain>:<your_port>

If this is not set correctly, you may encounter CORS-related issues.

Here’s a minimal docker-compose.yml example with explanations:

version: '3'
x-common-env: &cenv
MEILI_URL: http://search:7700
MEILI_MASTER_KEY: vODkljPcfFANYNepCHyDyGjzAMPcdHnrb6X5KyXQPWo
services:
search:
container_name: wanderer-search
image: getmeili/meilisearch:v1.11.3
environment:
<<: *cenv
MEILI_NO_ANALYTICS: "true"
ports:
- 7700:7700
networks:
- wanderer
volumes:
- ./data/data.ms:/meili_data/data.ms
restart: unless-stopped
healthcheck:
test: curl --fail http://localhost:7700/health || exit 1
interval: 15s
retries: 10
start_period: 20s
timeout: 10s
db:
container_name: wanderer-db
image: flomp/wanderer-db
depends_on:
search:
condition: service_healthy
environment:
<<: *cenv
POCKETBASE_ENCRYPTION_KEY: <YOUR_ENCRYPTION_KEY_HERE>
ORIGIN: http://localhost:3000
ports:
- "8090:8090"
networks:
- wanderer
restart: unless-stopped
volumes:
- ./data/pb_data:/pb_data
healthcheck:
test: ["CMD", "/curl", "--fail", "http://localhost:8090/health"]
interval: 15s
retries: 10
start_period: 20s
timeout: 10s
web:
container_name: wanderer-web
image: flomp/wanderer-web
depends_on:
search:
condition: service_healthy
db:
condition: service_healthy
environment:
<<: *cenv
ORIGIN: http://localhost:3000
BODY_SIZE_LIMIT: Infinity
PUBLIC_POCKETBASE_URL: http://db:8090
PUBLIC_DISABLE_SIGNUP: "false"
UPLOAD_FOLDER: /app/uploads
UPLOAD_USER:
UPLOAD_PASSWORD:
PUBLIC_OVERPASS_API_URL: https://overpass-api.de
PUBLIC_VALHALLA_URL: https://valhalla1.openstreetmap.de
PUBLIC_NOMINATIM_URL: https://nominatim.openstreetmap.org
volumes:
- ./data/uploads:/app/uploads
# - ./data/about.md:/app/build/client/md/about.md
ports:
- "3000:3000"
networks:
- wanderer
restart: unless-stopped
healthcheck:
test: ["CMD", "/curl", "--fail", "http://localhost:3000/"]
interval: 15s
retries: 10
start_period: 20s
timeout: 10s
networks:
wanderer:
driver: bridge

All services must be part of the same Docker network. This is handled by the default wanderer network in the configuration above.

Make sure to set the ORIGIN environment variable to the full public URL (including port) where your instance is reachable. If misconfigured, the frontend will show this error:

Cross-site POST form submissions are forbidden

By default, two volumes are mounted:

  • Meilisearch index data: ./data/data.ms
  • PocketBase data: ./data/pb_data

These can be changed to bind mounts or other volume strategies if needed.

The default Docker configuration defines all necessary environment variables. You can extend or override them as needed. For advanced options, refer to the environment configuration documentation.

To update your instance to the latest version:

Terminal window
docker compose pull
docker compose up -d

Always consult the changelog before updating, in case of breaking changes.

Regardless of the installation method, once everything is running you should be able to access wanderer at:

http://localhost:3000

If you see the UI and no errors in the logs, you’re all set!