Installation

Black Candy Store ships as a single Docker image. One command gets you streaming.

Quick Start

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.

Docker Compose

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

Persistent Storage

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:

Media Files

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.

Running as a Specific User

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

Port Mapping

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.

Next Steps