Run your instance
Tunecamp is self-hosted. You run the server, you own the music, you control who listens. Follow these steps to go from zero to a live instance on the federated network.
No VPS? Deploy on Railway
~2 minSkip the Docker setup entirely. Railway provisions your instance, attaches a persistent volume, and gives you a public HTTPS URL — all from one click. SSL is included, so federation works out of the box.
TUNECAMP_PUBLIC_URL to enable federation
Want the Docker path instead? Continue with the steps below.
VPS Auto-Installer (Recommended)
~3 minRented a fresh VPS (Ubuntu/Debian)? Run this single command to automatically install Docker, Docker Compose, Nginx, Certbot (SSL), configure your firewall, clone the repository, and spin up your TuneCamp instance:
curl -fsSL https://tunecamp.org/install.sh | sudo bash
Want the manual step-by-step setup instead? Continue with the steps below.
Prerequisites
The fastest path uses Docker. You need:
- Docker 20+ and Docker Compose — install guide
- A folder of audio files (MP3, FLAC, WAV…)
- A domain with DNS pointing at your server (only needed to go public)
Install & run
Clone the repo, point it at your music, start.
# 1. Clone git clone https://github.com/scobru/tunecamp.git cd tunecamp # 2. Edit docker-compose.yml — replace /path/to/your/music # with the actual path to your audio files # 3. Build and start in the background docker-compose up -d --build
When the container is healthy, open http://localhost:1970 in your browser.
First login & security
Tunecamp creates a default admin account on first run:
admin
admin
You can override defaults before first run with env vars: TUNECAMP_ADMIN_USER / TUNECAMP_ADMIN_PASS.
Add your music
- 1.Go to Admin → Library and trigger a Scan.
- 2.Tunecamp reads tags, generates waveforms, and processes cover art automatically.
- 3.Scanned albums land in Draft mode — promote them to a Formal Release from the Admin dashboard to make them publicly visible.
Other ingestion methods
Go public — Nginx + SSL
To expose your instance on a real domain you need a reverse proxy. SSL is required for federation (ActivityPub).
Nginx config
server {
listen 80;
server_name your-domain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name your-domain.com;
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options SAMEORIGIN;
client_max_body_size 500M;
location / {
proxy_pass http://localhost:1970;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
proxy_read_timeout 300s;
}
}
Set your public URL
Add this to your .env (or docker-compose env) — ActivityPub federation won't work without it:
TUNECAMP_PUBLIC_URL=https://your-domain.com
proxy_set_header Upgrade $http_upgrade;, Connection "upgrade";, and set client_max_body_size 512M; + proxy_read_timeout 600s;.
Join the network
Tunecamp discovers peers via HTTP gossip — no central registry. Your instance crawls outward from seed instances and appears to others within ~6 hours. To appear immediately, self-register with a directory instance.
Self-register
POST your URL to any directory instance:
curl -X POST https://directory.example.com/api/community/register \
-H "Content-Type: application/json" \
-d '{"url": "https://your-instance.example.com"}'
The directory probes your NodeInfo, verifies it's a live Tunecamp, and adds you immediately. Or use the form on the Explore page.
| Status | Meaning |
|---|---|
| 200 | Registered — appears in the directory immediately |
| 400 | Missing or invalid URL |
| 422 | Not a reachable Tunecamp instance (NodeInfo check failed) |
| 429 | Rate limited — 1 registration per IP per hour |
Federation seeds
Optionally seed your crawl from known instances to bootstrap discovery faster:
TUNECAMP_FEDERATION_SEEDS=https://seed1.example.com,https://seed2.example.com
Optional integrations
Stripe fiat + crypto onramp, per-track sales, artist payouts via Stripe Connect.
Ingest music by sending audio files to your personal bot.
OpenRouter key for auto-tagging, recommendations, and smart search.
Full Subsonic API — use DSub, Symfonium, Tempo, or any compatible mobile app.
Connect Claude Desktop or any MCP client to your Tunecamp instance.
Fediverse integration — follow artists from Mastodon, Pleroma, Funkwhale.