3.6 KiB
PotatoMesh Docker Guide
PotatoMesh publishes ready-to-run container images to the GitHub Packages container registry (GHCR). You do not need to clone the repository to deploy them—Compose will pull the latest release images for you.
Prerequisites
- Docker Engine 24+ or Docker Desktop with the Compose plugin
- Access to
/dev/ttyACM*(or equivalent) if you plan to attach a Meshtastic device to the ingestor container - An API token that authorises the ingestor to post to your PotatoMesh instance
Images on GHCR
| Service | Image |
|---|---|
| Web UI | ghcr.io/l5yth/potato-mesh-web-linux-amd64:latest |
| Ingestor | ghcr.io/l5yth/potato-mesh-ingestor-linux-amd64:latest |
Images are published for every tagged release. Replace latest with a
specific version tag if you prefer pinned deployments.
Configure environment
Create a .env file alongside your Compose file and populate the variables you
need. At a minimum you must set API_TOKEN so the ingestor can authenticate
against the web API.
API_TOKEN=replace-with-a-strong-token
SITE_NAME=PotatoMesh Demo
CONNECTION=/dev/ttyACM0
INSTANCE_DOMAIN=mesh.example.org
Additional environment variables are optional:
CHANNEL,FREQUENCY,MAP_CENTER,MAX_DISTANCE, andCONTACT_LINKcustomise the UI.POTATOMESH_INSTANCE(defaults tohttp://web:41447) lets the ingestor post to a remote PotatoMesh instance if you do not run both services together.CONNECTIONoverrides the default serial device or network endpoint used by the ingestor.CHANNEL_INDEXselects the LoRa channel when using serial or Bluetooth connections.INSTANCE_DOMAINpins the public hostname advertised by the web UI and API responses, bypassing reverse DNS detection when set.DEBUGenables verbose logging across the stack.
Docker Compose file
Use the docker-compose.yml file provided in the repository (or download the
raw file from GitHub).
It already references the published GHCR images, defines persistent volumes for
data, configuration, and logs, and includes optional bridge-profile services for
environments that require classic port mapping. Place this file in the same
directory as your .env file so Compose can pick up both.
The dedicated configuration volume binds to /app/.config/potato-mesh inside
the container. This path stores the instance private key and staged
/.well-known/potato-mesh documents. Because the volume persists independently
of container lifecycle events, generated credentials are not replaced on reboot
or re-deploy.
Start the stack
From the directory containing the Compose file:
docker compose up -d
Docker automatically pulls the GHCR images when they are not present locally.
The dashboard becomes available at http://127.0.0.1:41447. Use the bridge
profile when you need to map the port explicitly:
COMPOSE_PROFILES=bridge docker compose up -d
Updating
docker compose pull
docker compose up -d
Troubleshooting
- Serial device permissions (Linux/macOS): grant access with
sudo chmod 666 /dev/ttyACM0or add your user to thedialoutgroup. - Port already in use: identify the conflicting service with
sudo lsof -i :41447. - Viewing logs:
docker compose logs -ftails output from both services.
For general Docker support, consult the Docker Compose documentation.