Black Candy Store ships as a single Docker image. One command gets you streaming.
Pull and run the latest image:
docker run -p 80:80 ghcr.io/ajeskey/blackcandystore:latest
Visit http://localhost in your browser and log in with the default admin account:
⚠️ Change the default admin password immediately after your first login.
For a more permanent setup, use Docker Compose:
version: "3.8"
services:
blackcandystore:
image: ghcr.io/ajeskey/blackcandystore:latest
ports:
- "80:80"
volumes:
- ./storage_data:/rails/storage
- /path/to/your/music:/media_data
environment:
- MEDIA_PATH=/media_data
- SECRET_KEY_BASE=your_generated_secret_here
restart: unless-stopped
All data that needs to persist lives in /rails/storage inside the container. Mount this as a volume to keep your data across container restarts and upgrades:
mkdir storage_data
docker run -v ./storage_data:/rails/storage -p 80:80 ghcr.io/ajeskey/blackcandystore:latest
This directory holds:
Mount your music directory and tell the container where to find it:
docker run \
-v /path/to/music:/media_data \
-e MEDIA_PATH=/media_data \
-v ./storage_data:/rails/storage \
-p 80:80 \
ghcr.io/ajeskey/blackcandystore:latest
You can also set the media path from the Settings page inside the app instead of using the environment variable.
If you run into permission issues with mounted volumes, pass your host UID/GID:
docker run --user $(id -u):$(id -g) \
-v ./storage_data:/rails/storage \
-v /path/to/music:/media_data \
-p 80:80 \
ghcr.io/ajeskey/blackcandystore:latest
The container listens on port 80 internally. Map it to any host port:
# Access on port 3000 instead
docker run -p 3000:80 ghcr.io/ajeskey/blackcandystore:latest
Or change the internal port with the HTTP_PORT environment variable.