~10 min Docker Federated

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 min

Skip 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.

Deploy on Railway
HTTPS automatic — no Nginx or Certbot needed
Persistent volume for DB and media files
Set TUNECAMP_PUBLIC_URL to enable federation

Want the Docker path instead? Continue with the steps below.

VPS Auto-Installer (Recommended)

~3 min

Rented 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
Interactive prompt maps your music folder and custom admin credentials
Automatic Let's Encrypt SSL certificate registration for your domain
Configures Nginx reverse proxy with websocket support automatically

Want the manual step-by-step setup instead? Continue with the steps below.

1

Prerequisites

The fastest path uses Docker. You need:

  • Docker 20+ and Docker Composeinstall guide
  • A folder of audio files (MP3, FLAC, WAV…)
  • A domain with DNS pointing at your server (only needed to go public)
Prefer running from source? See the Development Guide.
2

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.

3

First login & security

Tunecamp creates a default admin account on first run:

Username admin
Password admin
Change the admin password immediately after logging in — go to Admin → Settings. The server logs a security warning at startup until the default credentials and auto-generated JWT secret are replaced.

You can override defaults before first run with env vars: TUNECAMP_ADMIN_USER / TUNECAMP_ADMIN_PASS.

4

Add your music

  1. 1.Go to Admin → Library and trigger a Scan.
  2. 2.Tunecamp reads tags, generates waveforms, and processes cover art automatically.
  3. 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

Telegram bot Torrents Google Drive Soulseek
5

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
CapRover? In Edit Default Nginx Config add proxy_set_header Upgrade $http_upgrade;, Connection "upgrade";, and set client_max_body_size 512M; + proxy_read_timeout 600s;.
6

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
200Registered — appears in the directory immediately
400Missing or invalid URL
422Not a reachable Tunecamp instance (NodeInfo check failed)
429Rate 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

Instance running?

Register it to appear in the network directory immediately.

View on GitHub