#version: '3.8' # # More info: https://arnaucube.com/media-setup/ # # # Usage # ----- # - All commands from inside the same directory where this file is placed. # - Replace the `/mnt/usb` to your custom location, usually an external hard # drive. # # Before running: mount the external hard drive!! # > sudo mount /dev/sda /mnt/usb # # Run: # > sudo docker compose up -d # # Stop: # > sudo docker compose stop # # Remove containers (since the volumes are mapped to local directories, they # will persist): # > sudo docker compose down # # # NOTE: the configurations is in the SSD disk, while the movies, shows, music are in the HHD # # Port of each service: # - jellyfin: 8096 # - # emby: 8097 # - wallabag: 8098 # - slskd: 8099 # - metube: 8100 # - sonarr: 8101 # - prowlarr: 8102 # - bazarr: 8103 # - radarr: 8104 # - qui: 8105 # - jellystat: 8106 # - lingarr: 8107 # - libretranslate: 8108 # - lidarr: 8109 # - swiparr: 8110 # - jellyfin-news: 8111 # - qbittorrent: 8080 # - homepage: 8000 # - grafana: 3000 services: jellyfin: image: jellyfin/jellyfin container_name: jellyfin ports: - "8096:8096" volumes: - /home/beelink/configurations/jellyfin:/config - /mnt/usb:/media restart: unless-stopped environment: - JELLYFIN_PublishedServerUrl=https://jellyfin.myserver.com devices: - /dev/dri/renderD128:/dev/dri/renderD128 # hardware accelerated transcoding group_add: - "993" # obtained from `getent group render | cut -d: -f3` networks: - cloudflared_net wallabag: image: wallabag/wallabag container_name: wallabag ports: - "8098:80" volumes: - /home/beelink/configurations/wallabag/data:/var/www/wallabag/data - /home/beelink/configurations/wallabag/images:/var/www/wallabag/web/assets/images environment: - SYMFONY__ENV__DOMAIN_NAME=http://192.168.1.155:8098 restart: unless-stopped slskd: image: slskd/slskd container_name: slskd ports: - "8099:5030" - "50300:50300" volumes: - /home/beelink/configurations/slskd:/app - /mnt/usb/audio/slskd-downloads:/downloads # isolate it in a subdir, since slskd removes arbitrary files on that dir environment: - SLSKD_REMOTE_CONFIGURATION=true restart: unless-stopped metube: image: ghcr.io/alexta69/metube container_name: metube ports: - "8100:8081" volumes: - /mnt/usb/audio/from-youtube:/downloads restart: unless-stopped sonarr: image: lscr.io/linuxserver/sonarr:latest container_name: sonarr environment: - PUID=1000 - PGID=1000 - TZ=Europe/Amsterdam volumes: - /home/beelink/configurations/sonarr:/config - /mnt/usb/torrent-downloads:/downloads - /mnt/usb/shows:/data/shows ports: - 8101:8989 restart: unless-stopped radarr: image: lscr.io/linuxserver/radarr:latest container_name: radarr environment: - PUID=1000 - PGID=1000 - TZ=Europe/Amsterdam volumes: - /home/beelink/configurations/radarr:/config - /mnt/usb/torrent-downloads:/downloads - /mnt/usb/movies:/movies ports: - 8104:7878 restart: unless-stopped lidarr: image: lscr.io/linuxserver/lidarr:latest container_name: lidarr environment: - PUID=1000 - PGID=1000 - TZ=Europe/Amsterdam volumes: - /home/beelink/configurations/lidarr/config:/config - /mnt/usb/audio:/music - /mnt/usb/torrent-downloads:/downloads ports: - 8109:8686 restart: unless-stopped bazarr: image: lscr.io/linuxserver/bazarr:latest container_name: bazarr environment: - PUID=1000 - PGID=1000 - TZ=Europe/Amsterdam volumes: - /home/beelink/configurations/bazarr:/config - /mnt/usb/shows:/data/shows - /mnt/usb/movies:/movies ports: - 8103:6767 restart: unless-stopped lingarr: image: ghcr.io/lingarr-translate/lingarr:latest # or lingarr/lingarr:latest container_name: lingarr restart: unless-stopped environment: - ASPNETCORE_URLS=http://+:9876 - DB_CONNECTION=mysql - DB_HOST=lingarr-db - DB_PORT=3306 - DB_DATABASE=lingarr - DB_USERNAME=lingarr - DB_PASSWORD=YOUR_DB_PASSW_HERE ports: - "8107:9876" volumes: - /mnt/usb/movies:/movies - /mnt/usb/shows:/tv - /home/beelink/configurations/lingarr:/app/config # networks: # - lingarr depends_on: lingarr-db: condition: service_healthy lingarr-db: image: mariadb:latest container_name: lingarr-db restart: unless-stopped environment: - MYSQL_DATABASE=lingarr - MYSQL_USER=lingarr - MYSQL_PASSWORD=YOUR_DB_PASSW_HERE - MYSQL_ROOT_PASSWORD=YOUR_DB_PASSW_HERE volumes: - /home/beelink/configurations/lingarr:/var/lib/mysql # networks: # - lingarr healthcheck: test: "mariadb $$MYSQL_DATABASE -u$$MYSQL_USER -p$$MYSQL_PASSWORD -e 'SELECT 1;'" interval: 10s timeout: 5s retries: 5 LibreTranslate: container_name: LibreTranslate image: libretranslate/libretranslate:latest restart: unless-stopped environment: - LT_LOAD_ONLY=en,es,ca - LT_WORKERS=2 user: "1000:1000" ports: - 8108:5000 volumes: # NOTE: on first run, needs: # rm -rf ./libretranslate # mkdir ./libretranslate/.config # sudo chown -R 1000:1000 ./libretranslate/.config # sudo chmod -R 755 ./libretranslate/.config # - /home/beelink/configurations/libretranslate:/home/libretranslate/.local - /home/beelink/configurations/libretranslate/.config:/home/libretranslate/.config healthcheck: test: ["CMD-SHELL", "./venv/bin/python scripts/healthcheck.py"] prowlarr: container_name: prowlarr image: ghcr.io/hotio/prowlarr ports: - "8102:9696" environment: - PUID=1000 - PGID=1000 - UMASK=002 - TZ=Europe/Amsterdam volumes: - /home/beelink/configurations/prowlarr:/config restart: unless-stopped qbittorrent-nox: image: qbittorrentofficial/qbittorrent-nox:latest container_name: qbittorrent-nox ports: - "8080:8080" - "6881:6881/tcp" # Torrent listening port - "6881:6881/udp" volumes: - /home/beelink/configurations/qbittorrent:/config - /mnt/usb/torrent-downloads:/downloads environment: - QBT_LEGAL_NOTICE=confirm - WEBUI_PORT=8080 restart: unless-stopped qui: image: ghcr.io/autobrr/qui:latest container_name: qui restart: unless-stopped ports: - "8105:7476" volumes: - ./qui:/config jellystat-db: image: 'postgres:15.2' shm_size: 1gb container_name: jellystat-db restart: unless-stopped environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: YOUR_DB_PASSW_HERE volumes: - '/home/beelink/configurations/postgres:/var/lib/postgresql/data' jellystat: image: 'cyfershepard/jellystat:latest' container_name: jellystat restart: unless-stopped environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: YOUR_DB_PASSW_HERE POSTGRES_IP: jellystat-db POSTGRES_PORT: 5432 JWT_SECRET: YOUR_JWT_SECRET_HERE TZ: Europe/Madrid MINIMUM_SECONDS_TO_INCLUDE_PLAYBACK: 300 volumes: - '/home/beelink/configurations/jellystat-backup-data:/app/backend/backup-data' ports: - '8106:3000' depends_on: - jellystat-db swiparr: image: ghcr.io/m3sserstudi0s/swiparr:latest container_name: swiparr restart: unless-stopped environment: - PROVIDER=jellyfin - JELLYFIN_URL=http://192.168.1.155:8096 - JELLYFIN_PUBLIC_URL=https://jellyfin.myserver.com volumes: - /home/beelink/configurations/swiparr:/app/data ports: - 8110:4321 jellyfin-news: build: ./jellyfin-tools/jellyfin-news restart: unless-stopped env_file: ./jellyfin-tools/jellyfin-news/.env ports: - "8111:8080" homepage: image: ghcr.io/gethomepage/homepage:latest container_name: homepage environment: HOMEPAGE_ALLOWED_HOSTS: 192.168.1.155:8000 # required, may need port. See gethomepage.dev/installation/#homepage_allowed_hosts sysctls: - net.ipv6.conf.all.disable_ipv6=1 ports: - 8000:3000 volumes: - /home/beelink/configurations/homepage:/app/config - /mnt/usb:/mnt/usb:ro restart: unless-stopped # metrics related: prometheus: image: prom/prometheus:latest container_name: prometheus ports: - "9090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus networks: - monitoring restart: unless-stopped node-exporter: image: prom/node-exporter:latest container_name: node-exporter ports: - "9100:9100" volumes: - /:/host:ro networks: - monitoring restart: unless-stopped grafana: image: grafana/grafana:latest container_name: grafana ports: - "3000:3000" environment: - GF_SECURITY_ADMIN_PASSWORD=YOURPASSWORDHERE volumes: - grafana_data:/var/lib/grafana networks: - monitoring depends_on: - prometheus restart: unless-stopped cloudflared: image: cloudflare/cloudflared:latest container_name: cloudflared restart: unless-stopped command: tunnel run volumes: - /home/beelink/server-dockers/cloudflared:/etc/cloudflared - /home/beelink/server-dockers/cloudflared/config:/home/nonroot/.cloudflared networks: - cloudflared_net extra_hosts: - "host.docker.internal:host-gateway" networks: cloudflared_net: driver: bridge monitoring: driver: bridge # lingarr: # external: true volumes: prometheus_data: driver: local grafana_data: driver: local