Appearance
Local install
Run the published images with the starter Compose stack. Read requirements and limits before starting.
1. Download the stack
sh
mkdir sole && cd sole
curl -fsSL https://raw.githubusercontent.com/poesterlin/sole/v0.1.1/stack.yaml -o compose.yamlThe starter stack uses the matching v0.1.1 web and worker images. PostgreSQL and web start by default; the API worker is enabled explicitly after setup. Only the web app mounts your music folder. The mount is read-only.
2. Set credentials and paths
Create .env next to compose.yaml:
sh
cat > .env <<EOF
POSTGRES_PASSWORD=$(openssl rand -hex 24)
WORKER_TOKEN=$(openssl rand -hex 24)
MUSIC_LIBRARY_PATH=$HOME/Music
MUSIC_HOST=CHANGE_ME
MA_TOKEN=CHANGE_ME
EOF
chmod 600 .env
${EDITOR:-vi} .envReplace CHANGE_ME before starting containers:
- Set
MUSIC_HOSTto your Music Assistant URL, such ashttp://192.168.1.10:8095. - Set
MA_TOKENto an access token from Music Assistant's settings. - Set
MUSIC_LIBRARY_PATHto the existing folder containing your audio files.
For another device, add ORIGIN=http://your-server:3000. Use the exact address you will open in the browser. A mismatch causes login form requests to return 403.
The default port is 3000, bound to loopback. If it is occupied, add WEB_PORT=3010 and open http://127.0.0.1:3010/login. Set ORIGIN to that URL if you have explicitly configured it. For access from another device, also set WEB_BIND_ADDRESS=0.0.0.0 and use that device's reachable hostname in ORIGIN.
To try the account and UI without a library connection, leave MUSIC_HOST and MA_TOKEN empty and point MUSIC_LIBRARY_PATH at an existing empty directory. Scheduled maintenance stays disabled until both Music Assistant values are set.
3. Start containers and create tables
sh
grep -q CHANGE_ME .env && { echo 'Replace CHANGE_ME values in .env first'; exit 1; }
docker compose up -d --wait postgres
docker compose run --rm --entrypoint sh web \
-c 'bun scripts/ensure-pgvector.ts && bunx drizzle-kit migrate'
docker compose up -d --wait webContainer health checks do not verify the schema or Music Assistant connection.
4. Create an account
sh
docker compose run --rm --entrypoint bun web \
web/scripts/create-user.ts --username adminOpen http://127.0.0.1:3000/login with the printed password. Continue with Your first playable vibe.
After configuring Music Assistant and indexing your library, enable automatic embedding with:
sh
docker compose --profile embedding up -d workerThis starts a continuous worker that writes embeddings. Choose the global recipe on Manage before embedding; populated libraries keep their existing recipe.
Reference
After editing .env, run docker compose up -d to recreate affected services. Changing MUSIC_LIBRARY_PATH also requires recreating the named music bind volume. With the default Compose project name, run:
sh
docker compose down
docker volume rm "$(basename "$PWD")_music"
docker compose up -d --waitIf you set a project name with -p or COMPOSE_PROJECT_NAME, use that prefix instead. Remove only the music volume; keep postgres-data. Restart the worker with the profile command above if it was enabled. See Authentication and configuration for account limits, worker settings, and database commands.
Other ways
Upgrade an existing starter installation
Keep .env and the database volume. Set both image versions in .env:
dotenv
WEB_IMAGE=ghcr.io/poesterlin/sole-web:v0.1.1
EMBEDDINGS_IMAGE=ghcr.io/poesterlin/sole-embeddings:v0.1.1Then stop application services, migrate using the new web image, and restart:
sh
docker compose stop web worker
docker compose --profile embedding pull web worker
docker compose up -d --wait postgres
docker compose run --rm --no-deps --entrypoint sh web \
-c 'bun scripts/ensure-pgvector.ts && bunx drizzle-kit migrate'
docker compose up -d --wait webRestart the worker explicitly if you use it. Existing embedded libraries inherit their recorded recipe; fresh libraries default to medium mode and 90-second samples. Upgrade web and worker together: v0.1.1 workers require the server to provide a recipe. Do not recreate your admin account unless you intend to reset its password.
Installer
The installer script automates the main install path:
sh
curl -fsSL https://raw.githubusercontent.com/poesterlin/sole/v0.1.1/setup.sh -o setup.sh
bash setup.sh "$HOME/Music"The script uses stack.yaml. Add -f stack.yaml to later Compose commands. For Traefik and a source checkout, see Public deployment.
