Self-Hosting
import { Steps } from ‘@astrojs/starlight/components’;
br\u016bhi Cloud is packaged as a single Docker image containing all services. Docker Compose is the recommended deployment method.
Quick Deploy
Section titled “Quick Deploy”-
Get the source
Download and extract the brūhi Cloud release package, then navigate to the directory:
Terminal window cd bruhi-cloud -
Create your environment file
Terminal window cp .env.example .envEdit
.envand set at minimum:CORS_ORIGINS=https://yourdomain.com -
Start
Terminal window docker compose up -d -
Verify
Terminal window curl http://localhost:8000/health# {"status":"ok"}
Environment Variables
Section titled “Environment Variables”| Variable | Default | Description |
|---|---|---|
PORT | 8000 | API server port |
LOG_LEVEL | info | Log verbosity: debug, info, warning, error |
CORS_ORIGINS | '' | Space-separated allowed origins for the web dashboard |
S3_ENDPOINT_URL | — | S3-compatible endpoint URL (optional) |
S3_ACCESS_KEY | — | S3 access key |
S3_SECRET_KEY | — | S3 secret key |
S3_BUCKET | — | S3 bucket name |
S3_REGION | us-east-1 | S3 region |
LIQUIDSOAP_TELNET_HOST | 127.0.0.1 | Liquidsoap telnet host |
LIQUIDSOAP_TELNET_PORT | 2000 | Liquidsoap telnet base port |
SMART_PLAYLIST_DB | /tmp/bruhi_smart_playlists.db | Smart playlists database path |
AUTOMATION_DB | /tmp/bruhi_automation.db | Automation rules database path |
OUTPUTS_DB | /tmp/bruhi_outputs.db | Output configurations database path |
Docker Compose File
Section titled “Docker Compose File”The default docker-compose.yml:
services: bruhi: image: ghcr.io/bruhi/bruhi-cloud:latest ports: - "8000:8000" # API + dashboard - "8005:8005" # Icecast - "8100:8100" # Station 1 harbor volumes: - bruhi_audio:/app/audio_files # Recordings + uploads - bruhi_playlists:/app/playlists # Liquidsoap playlist files env_file: .env healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 3 restart: unless-stopped
volumes: bruhi_audio: bruhi_playlists:Volumes
Section titled “Volumes”| Volume | Mount path | Contents |
|---|---|---|
bruhi_audio | /app/audio_files | Uploaded audio files and WAV recordings |
bruhi_playlists | /app/playlists | Liquidsoap .m3u8 playlist files (hot-reloaded) |
Production Checklist
Section titled “Production Checklist”Before exposing br\u016bhi Cloud to the internet:
- Put br\u016bhi behind a reverse proxy (nginx or Caddy) with TLS
- Set
CORS_ORIGINSto your actual domain (not*) - Configure firewall rules: allow ports 80, 443 (HTTPS), 8005 (Icecast), 8100+ (harbors)
- Set up volume backups for
bruhi_audioandbruhi_playlists - Set
LOG_LEVEL=warningfor production (reduces log volume) - Configure S3 for media storage if you need persistence beyond the container lifetime
Nginx Reverse Proxy
Section titled “Nginx Reverse Proxy”server { listen 443 ssl; server_name bruhi.yourdomain.com;
ssl_certificate /etc/ssl/bruhi.crt; ssl_certificate_key /etc/ssl/bruhi.key;
location / { proxy_pass http://localhost:8000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; }}The Upgrade and Connection headers are required for WebSocket support (used by the WebRTC signalling connection).
Updating
Section titled “Updating”docker compose pulldocker compose up -dbr\u016bhi Cloud follows semantic versioning. Check the release notes before upgrading minor or major versions.
Quick Deploy
Section titled “Quick Deploy”curl -sSL https://bruhi.in/install.sh | bashThe install script will:
- Detect your CPU architecture (ARM64 / x86_64)
- Verify Docker and Docker Compose are installed
- Pull the latest verified image from GHCR
- Initialize the config directory at
/etc/bruhi/
Manual Docker Compose
Section titled “Manual Docker Compose”version: "3.9"services: bruhi-engine: image: ghcr.io/bruhi/engine:latest ports: - "8080:8080" # REST API - "50051:50051" # gRPC - "9000:9000" # SRT ingest volumes: - ./config:/etc/bruhi - bruhi-data:/var/lib/bruhi environment: BRUHI_LOG_LEVEL: info BRUHI_DB_URL: postgres://bruhi:secret@db:5432/bruhi depends_on: - db - redis
db: image: postgres:16-alpine environment: POSTGRES_USER: bruhi POSTGRES_PASSWORD: secret POSTGRES_DB: bruhi volumes: - pg-data:/var/lib/postgresql/data
redis: image: redis:7-alpine command: redis-server --appendonly yes
volumes: bruhi-data: pg-data:docker compose up -dVerified Platforms
Section titled “Verified Platforms”| Provider | Service | Status |
|---|---|---|
| AWS | EC2, ECS, EKS | ✅ Verified |
| Google Cloud | GCE, GKE | ✅ Verified |
| DigitalOcean | Droplets, K8s | ✅ Verified |
| Hetzner | Cloud, Dedicated | ✅ Community tested |