Skip to main content
Deploy BitBonsai using Docker containers for simplified installation and updates.

Prerequisites

Before installing, ensure you have:
RequirementMinimum VersionCheck Command
Docker20.10+docker --version
Docker Compose2.0+docker compose version
Disk Space100GB+For temporary encoding files
RAM8GB+For parallel encoding jobs
BitBonsai requires access to your video library via volume mounts. Plan your directory structure before installation.

Quick Start

1

Create Configuration Directory

mkdir -p ~/bitbonsai
cd ~/bitbonsai
2

Create docker-compose.yml

Create a docker-compose.yml file with the following configuration:
docker-compose.yml
version: '3.8'

services:
  postgres:
    image: postgres:15
    container_name: bitbonsai-postgres
    restart: unless-stopped
    environment:
      POSTGRES_DB: bitbonsai
      POSTGRES_USER: bitbonsai
      POSTGRES_PASSWORD: changeme
    volumes:
      - postgres-data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U bitbonsai"]
      interval: 10s
      timeout: 5s
      retries: 5

  bitbonsai-backend:
    image: ghcr.io/bitbonsai/backend:latest
    container_name: bitbonsai-backend
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy
    environment:
      DATABASE_URL: postgresql://bitbonsai:changeme@postgres:5432/bitbonsai
      PORT: 3100
      NODE_ENV: production
    volumes:
      - /path/to/your/videos:/videos
      - /path/to/temp:/tmp/bitbonsai
    ports:
      - "3100:3100"

  bitbonsai-frontend:
    image: ghcr.io/bitbonsai/frontend:latest
    container_name: bitbonsai-frontend
    restart: unless-stopped
    depends_on:
      - bitbonsai-backend
    environment:
      API_URL: http://bitbonsai-backend:3100
    ports:
      - "4210:4210"

volumes:
  postgres-data:
Replace /path/to/your/videos and /path/to/temp with actual paths on your host system.
3

Configure Environment

Edit the docker-compose.yml file to set:
  1. POSTGRES_PASSWORD: Change changeme to a secure password
  2. DATABASE_URL: Update password in connection string to match
  3. Volume paths: Point to your actual video library and temp directory
4

Start Services

docker compose up -d
This will:
  • Pull Docker images from GitHub Container Registry
  • Create PostgreSQL database
  • Start backend API and frontend UI
  • Apply database migrations automatically
5

Verify Installation

Check service health:
docker compose ps
All services should show Up (healthy) or Up status.

Access the UI

Open your browser to: Default setup includes:

Environment Variables

Backend Configuration

VariableDescriptionDefaultRequired
DATABASE_URLPostgreSQL connection string-Yes
PORTAPI server port3100No
NODE_ENVEnvironment modeproductionNo
LOG_LEVELLogging verbosity (error, warn, info, debug)infoNo

Frontend Configuration

VariableDescriptionDefaultRequired
API_URLBackend API URL (internal Docker network)-Yes

Database Configuration

VariableDescriptionDefaultRequired
POSTGRES_DBDatabase namebitbonsaiYes
POSTGRES_USERDatabase userbitbonsaiYes
POSTGRES_PASSWORDDatabase password-Yes
For production deployments, use Docker secrets or environment files instead of hardcoding credentials.

Volume Mounts

Video Library Mount

volumes:
  - /path/to/your/videos:/videos
Purpose: Provides read/write access to your video files for scanning and encoding. Requirements:
  • Must be an absolute path on the host system
  • User inside container must have read/write permissions
  • Sufficient free space for encoded outputs (typically 50-70% of original size)
Examples:
# Single library
- /mnt/media/movies:/videos

# Multiple libraries (mount parent directory)
- /mnt/media:/videos
  # BitBonsai will scan subdirectories: /videos/movies, /videos/tv, etc.

Temporary Files Mount

volumes:
  - /path/to/temp:/tmp/bitbonsai
Purpose: Stores temporary encoding files during transcoding operations. Requirements:
  • Fast storage recommended (SSD/NVMe preferred)
  • Minimum free space: 2× largest video file size
  • Cleared automatically after successful encoding
Do not use /tmp on the host if it’s a tmpfs (RAM disk). Encoding generates large temporary files.

PostgreSQL Data

volumes:
  - postgres-data:/var/lib/postgresql/data
Purpose: Persistent storage for database files. Backup: Use docker compose exec postgres pg_dump for database backups.

Advanced Configuration

Change external ports without modifying container ports:
services:
  bitbonsai-frontend:
    ports:
      - "8080:4210"  # Access on host port 8080

  bitbonsai-backend:
    ports:
      - "8081:3100"  # API on host port 8081

First Startup

After starting BitBonsai for the first time:
1

Database Migrations

Backend automatically applies database migrations on startup. Check logs:
docker compose logs bitbonsai-backend
Look for:
[Nest] INFO [Database] Migrations applied successfully
[Nest] INFO [Bootstrap] Application listening on port 3100
2

Add Video Library

Navigate to Settings → Libraries in the UI and add your first library:
  • Name: Movies
  • Path: /videos/movies (relative to container mount)
  • Type: Movies or TV Shows
Use the /videos prefix since that’s the container mount point, not your host path.
3

Run Initial Scan

Click Scan Library to index your video files. Monitor progress in the Jobs tab.

Updating BitBonsai

Pull latest images and restart containers:
docker compose pull
docker compose up -d
Database migrations apply automatically on startup.
Always backup your database before updating:
docker compose exec postgres pg_dump -U bitbonsai bitbonsai > backup.sql

Troubleshooting

Container Won’t Start

Check logs for errors:
docker compose logs bitbonsai-backend
docker compose logs bitbonsai-frontend

Cannot Access UI

Verify container is running and port mapping:
docker compose ps
curl http://localhost:4210

Database Connection Errors

Ensure PostgreSQL is healthy:
docker compose exec postgres pg_isready -U bitbonsai
If connection fails, check DATABASE_URL matches PostgreSQL credentials.

Permission Errors

Fix volume mount permissions:
# Find container user ID
docker compose exec bitbonsai-backend id

# Adjust host directory ownership
sudo chown -R 1000:1000 /path/to/your/videos

Out of Disk Space

Check temporary directory usage:
du -sh /path/to/temp
Clear old temporary files:
docker compose exec bitbonsai-backend rm -rf /tmp/bitbonsai/*

Next Steps