Requirements
- A machine with Docker and the Compose plugin. That is the only dependency.
- About 512 MB of RAM is plenty. Disk usage grows with the photos you upload.
Install Docker
You only need Docker itself. Pick your operating system.
Linux
Install Docker with the official script, then allow your user to run it without sudo:
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker "$USER"
newgrp docker
Compose ships as docker compose. Check it with docker compose version.
macOS
Install Docker Desktop (Apple Silicon and Intel are both supported), or use Homebrew:
brew install --cask docker
Open Docker Desktop once so the engine starts, then use Terminal for the next steps.
Windows
Install Docker Desktop. It sets up the WSL 2 backend for you. Run the commands from PowerShell, using curl.exe in place of curl.
Start Wayfare
On Linux or macOS (or Windows via WSL), one command sets everything up in a wayfare folder:
curl -fsSL https://wayfare.wiki/install | sh
Wayfare is now at http://localhost:3151. Open it and start a journal.
data/ folder inside wayfare/. Keep that folder and you keep your journals.Prefer to do it by hand, or on Windows PowerShell
mkdir wayfare && cd wayfare
curl -O https://codeberg.org/srtk/wayfare/raw/branch/main/docker-compose.yml
curl -o .env https://codeberg.org/srtk/wayfare/raw/branch/main/.env.example
docker compose up -d
On Windows PowerShell, use curl.exe in place of curl.
Configure
Settings live in the .env file next to docker-compose.yml.
| Variable | Default | What it does |
|---|---|---|
| WAYFARE_PORT | 3151 | Host port the app listens on. |
| DISABLE_SIGNUP | unset | Set to 1 to stop new accounts being created. Existing accounts keep working. Good for a personal instance. |
| SESSION_SECRET | auto | Secret for signing session and share cookies. Left unset, one is generated on first run and stored with your data. |
The data directory is set by the volume mount in docker-compose.yml. Change the left side of ./data:/app/data to store it elsewhere.
Domain and HTTPS
Run a reverse proxy in front of Wayfare to add TLS and serve it on your own domain. Point the proxy at the port above.
Caddy is the shortest path because it gets certificates automatically:
journal.example.com {
reverse_proxy 127.0.0.1:3151
}
With nginx and a certificate from certbot:
server {
listen 443 ssl;
server_name journal.example.com;
ssl_certificate /etc/letsencrypt/live/journal.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/journal.example.com/privkey.pem;
client_max_body_size 30m; # photo uploads
location / {
proxy_pass http://127.0.0.1:3151;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
docker-compose.yml to "127.0.0.1:3151:3151".Backups
Everything lives in data/. To back up, stop the container and copy the folder:
docker compose stop
tar czf wayfare-backup-$(date +%F).tar.gz data
docker compose start
Restore by putting the data/ folder back and running docker compose up -d.
Updating
docker compose pull
docker compose up -d
Your data/ folder is untouched by updates.
Build from source
To build the image yourself instead of pulling it, clone the repository, switch the compose file to build locally, and start it:
git clone https://codeberg.org/srtk/wayfare.git
cd wayfare
# In docker-compose.yml, comment out the image line and uncomment build: .
docker compose up -d --build
Security
- Accounts use email and password. Passwords are stored only as salted scrypt hashes, and sessions are signed httpOnly cookies. Terminate TLS at your reverse proxy so those cookies travel encrypted.
- Public journals, and their photos, are readable by anyone with the link. Do not make a journal public if it holds anything private.
- Each journal has one link and three access levels: private, password protected, or public. Photos follow the same rule, so a leaked image URL is useless once the journal is private. Images are served with revalidation so a change of access takes effect immediately.
- A link set to "can edit" grants full edit rights to whoever opens it, and editing requires a signed-in account. Change the password or set the journal back to private to cut off access.
- Set
DISABLE_SIGNUP=1to keep your instance to a fixed set of accounts.
Questions or issues? The source and issue tracker live on Codeberg.