Docker-based home media server stack optimized for Orange Pi 3B (RK3566), with Jellyfin hardware acceleration via V4L2M2M.
This guide is terminal-only and uses Git + Docker/Docker Compose commands.
| Service | Port(s) | Purpose |
|---|---|---|
| qBittorrent | 5080, 6881/tcp+udp | Torrent client |
| Radarr | 7878 | Movie management |
| Sonarr | 8989 | TV management |
| Prowlarr | 9696 | Indexer manager |
| Bazarr | 6767 | Subtitle management |
| Jellyfin | 8096, 7359/udp, 8920 | Media server |
| Seerr | 5055 | Request management |
| Profilarr | 6868 | Quality profile manager |
| FlareSolverr | 8191 | Cloudflare bypass proxy |
| Nginx | 80, 443 | Reverse proxy |
| Watchtower | - | Automatic image updates |
| Netdata | 19999 (host network) | Host monitoring |
- Linux host with Docker Engine 20.10+
- Docker Compose v2
- Git
- 4 GB RAM or more (recommended)
Quick check:
docker --version
docker compose version
git --versionRun commands on the machine that will host the containers (for example, your OrangePi over SSH).
- Clone the repository:
git clone https://github.com/anibalnet/blackbeard.git
cd blackbeard- Create the external Docker network required by compose:
docker network create jollyroger || true- Create your environment file:
cp .env.example .env- Review key values in
.env:
# Current user/group IDs
id
# GPU groups (commonly 44 and 105 on OrangePi)
getent group video
getent group renderImportant variables to verify:
PUIDandPGIDTZDOWNLOADS_PATHCONFIG_BASE_PATHGPU_VIDEO_GROUPandGPU_RENDER_GROUP
- Create expected directories:
mkdir -p \
config/qbittorrent \
config/radarr \
config/sonarr \
config/prowlarr \
config/bazarr \
config/jellyfin \
config/jellyseerr \
config/profilarr \
config/nginx/logs \
config/nginx/www \
config/netdata/config \
config/netdata/lib \
config/netdata/cache \
backups- Start the stack:
docker compose pull
docker compose up -d
docker compose ps- Follow startup logs (first boot may take a few minutes):
docker compose logs -f --tail=100Check service status:
docker compose psFollow logs for all services:
docker compose logs -f --tail=100Follow logs for one service:
docker compose logs -f --tail=100 radarrStop and start:
docker compose stop
docker compose startRestart all or one service:
docker compose restart
docker compose restart jellyfinValidate compose configuration:
docker compose configManual update flow:
docker compose pull
docker compose up -d --force-recreate
docker compose psNote: Watchtower is also enabled to auto-update labeled containers.
List volumes marked for backup:
docker volume ls --filter label=backup.enable=trueExample backup for radarr-config volume:
mkdir -p backups
docker run --rm \
-v radarr-config:/data:ro \
-v "$(pwd)/backups:/backup" \
alpine \
sh -c 'tar czf /backup/radarr-config-$(date +%Y%m%d-%H%M%S).tar.gz -C /data .'Example restore for radarr-config:
docker compose stop radarr
docker run --rm \
-v radarr-config:/data \
-v "$(pwd)/backups:/backup:ro" \
alpine \
sh -c 'rm -rf /data/* && tar xzf /backup/radarr-config-YYYYMMDD-HHMMSS.tar.gz -C /data'
docker compose start radarrContainers not starting:
docker compose ps
docker compose logs --tail=200Healthcheck still pending during first boot:
docker compose ps
docker inspect bazarr --format '{{json .State.Health}}'Permission issues on config paths:
id
sudo chown -R $(id -u):$(id -g) configJellyfin hardware acceleration issues:
ls -la /dev/dri
ls -la /dev/video*
getent group video
getent group render
docker compose logs --tail=200 jellyfinExternal network error:
docker network ls | grep jollyroger
docker network create jollyroger || true
docker compose up -dPort already in use:
sudo lsof -i :80
sudo lsof -i :443Nginx config file: config/nginx/nginx.conf.
Available routes:
/jellyfin//seerr/radarr/sonarr/bazarr//prowlarr/qbittorrent//assets/(landing page static assets fromconfig/nginx/www/assets/)
After first login, configure base URLs in apps that run behind subpaths (Radarr/Sonarr/Prowlarr/Bazarr).
- Change qBittorrent default password immediately.
- Restrict exposed ports to trusted networks.
- Configure HTTPS in Nginx for external access.
- Keep periodic backups of
config/,.env, andbackups/. - Review Watchtower auto-update behavior regularly.