这篇文章就介绍使用Docker Compose来打造一个个人的家庭影院。

基本的Workflow是这样的:

  • 本体就是Sonarr和Radarr,Sonarr是找剧的,Radarr是找电影的
  • 他们俩从哪找片呢,从indexers,这个indexer就可以理解为片源,但是indexer多了就需要东西管理,这时引入了Prowlarr,它可以连接Sonarr和Radarr,以后只需要在Prowlarr添加indexers,然后就可以自动同步到Sonarr和Radarr了
  • 找到了片源需要下载器,默认用qBittorrent,我看了下也可以使用Aria2和Transmission
  • 最后一个Bazarr是用来管理字幕的

服务端配置好之后,再使用客户端就可以看电影了。

部署

  • 创建以下文件夹结构

    /media
    ├── config
    │   ├── bazarr
    │   ├── prowlarr
    │   ├── qbittorrent
    │   ├── radarr
    │   └── sonarr
    ├── docker-compose.yml
    ├── downloads
    └── library
        ├── movies
        └── tv
    
  • 创建docker网络media

    docker network create media
    
  • 编辑docker-compose.yml

    services:
      sonarr:
        image: lscr.io/linuxserver/sonarr:latest
        container_name: sonarr
        environment:
          - PUID=1000
          - PGID=1000
          - TZ=America/Toronto
        volumes:
          - ./config/sonarr:/config
          - ./downloads:/downloads
          - ./library/tv:/tv
        ports:
          - "8989:8989"
        networks:
          - media
        restart: unless-stopped
    
      radarr:
        image: lscr.io/linuxserver/radarr:latest
        container_name: radarr
        environment:
          - PUID=1000
          - PGID=1000
          - TZ=America/Toronto
        volumes:
          - ./config/radarr:/config
          - ./downloads:/downloads
          - ./library/movies:/movies
        ports:
          - "7878:7878"
        networks:
          - media
        restart: unless-stopped
    
      prowlarr:
        image: lscr.io/linuxserver/prowlarr:latest
        container_name: prowlarr
        environment:
          - PUID=1000
          - PGID=1000
          - TZ=America/Toronto
        volumes:
          - ./config/prowlarr:/config
        ports:
          - "9696:9696"
        networks:
          - media
        restart: unless-stopped
    
      bazarr:
        image: lscr.io/linuxserver/bazarr:latest
        container_name: bazarr
        environment:
          - PUID=1000
          - PGID=1000
          - TZ=America/Toronto
        volumes:
          - ./config/bazarr:/config
          - ./downloads:/downloads
          - ./library/movies:/movies
          - ./library/tv:/tv
        ports:
          - "6767:6767"
        networks:
          - media
        restart: unless-stopped
    
      flaresolverr:
        image: ghcr.io/flaresolverr/flaresolverr:latest
        container_name: flaresolverr
        environment:
          - PUID=1000
          - PGID=1000
          - LOG_LEVEL=info
          - TZ=America/Toronto
        networks:
          - media
        restart: unless-stopped
    
      qbittorrent:
        image: lscr.io/linuxserver/qbittorrent:latest
        container_name: qbittorrent
        environment:
          - PUID=1000
          - PGID=1000
          - TZ=America/Toronto
          - WEBUI_PORT=8080
        volumes:
          - ./config/qbittorrent:/config
          - ./downloads:/downloads
        ports:
          - "9090:8080"
          - "6881:6881"
          - "6881:6881/udp"
        networks:
          - media
        restart: unless-stopped
    
    networks:
      media:
        external: true
    

配置

qBittorrent

  • 打开qBittorrent,如果显示Unauthorized

    • 由于我的服务是部署在Debian小主机上的,只有命令行,我从Windows上访问qBittorrent的话会收到限制,可能默认设置了不允许外部访问,需要修改配置文件

    • 首先关掉容器

      docker compose down
      
    • 打开/config/qbittorrent/qBittorrent/qBittorrent.conf

      [Preferences]
      WebUI\Address=0.0.0.0
      WebUI\CSRFProtection=false
      WebUI\HostHeaderValidation=false
      WebUI\ServerDomains=*
      WebUI\Username=admin
      

      WebUI\Address改为0.0.0.0

    • 重启容器

      docker compose up -d
      
    • 查看logs,可以得到一个初始密码

      docker logs qbittorrent --tail 50
      
    • 然后在浏览器中输入admin和初始密码即可登录

    • 登陆后在齿轮⚙ → WebUI → Authentication可以修改用户名和密码,然后就不用管配置文件了

Prowlarr

  • 左侧栏第一个Indexers,添加Indexer,可以先添加几个免费的试试,比如EZTV和YTS

  • 添加1337x的时候会显示blocked by CloudFlare Protection,这时候就需要FlareSolverr

    • Settings → Indexers添加Index,使用FlareSolverr,由于在同一个Docker网络下,Host可以填http://flaresolverr:8191/
    • tag填写1337x
    • 再回去添加Indexer,最下面的tag也填写1337x,这样再测试连接就成功了
  • 我们先登录Sonarr和Radarr,设置用户名和密码(就会得到用户的API Key),然后在Prowlarr的Settings → Apps添加Sonarr和Radarr

    Name: Sonarr
    Sync Level: Full Sync
    Prowlarr Server: http://prowlarr:9696
    Sonarr Server: http://sonarr:8989
    API Key: xxx
    
    Name: Radarr
    Sync Level: Full Sync
    Prowlarr Server: http://prowlarr:9696
    Radarr Server: http://radarr:7878
    API Key: xxx
    
  • 在Settings → Download Clients添加qBittorrent下载器

    Name: qBittorrent
    Enable: true
    Host: qbittorrent
    Port: 8080
    Username: xxx
    Password: xxx
    

Sonarr / Radarr

  • 和Prowlarr相同,分别进入Settings → Download Clients,添加刚才的qBittorrent下载器

Bazarr

  • Bazarr好像都不需要身份认证,在Settings可以绑定Sonnar和Radarr,同样地,Address写容器名即可
  • 在Settings → Languages → Language Filter添加简体中文
    • Embedded Tracks Language开启
    • 创建一个简体中文的Profile
    • 默认Profile都设置为简体中文
  • 在Settings → Providers中添加字幕源,可以使用zimukuOpenSubtitles.com(这个需要注册用户)

找电影

全部配置好之后剩下的事情就很简单了,基本步骤就是:

  • 如果想找电影,就去Radarr直接搜电影名称,同理电视剧就去Sonarr找
  • 加入愿望单
  • 加入后就会自动连接qBittorrent帮我们下载
  • 下载完后视频文件就在挂载的文件夹了

看电影

Infuse

  • 目前使用已经不使用了,Infuse来看电影,通过SMB来访问服务器上挂载的文件夹,然后本地观看
  • 优点是本地硬件解码,降低了我的miniPC的硬件压力
  • 缺点是刮削没有Jellyfin强,没有账号管理功能,因此没有观看进度记忆功能
  • 好像只能应用在苹果设备,iPhone,iPad,MacBook或者Apple TV

Jellyfin

  • Jellyfin的好处就是刮削能力比较强,能够显示完整的电影封面,演员信息,还支持多账号,管理每个人不同的观影记录等等

  • 我第一次用Jellyfin的时候看电影非常卡,我以为是至少要需要独立显卡才能撑得起来,后来发现我N100 miniPC带的核显已经完全足够了,可以使用nyanmisaka/jellyfin:latest这个镜像

  • 如果需要添加Jellyfin,可以在config文件夹下先创建jellyfin,然后修改docker-compose.yml,加入

    jellyfin:
      image: nyanmisaka/jellyfin:latest
      container_name: jellyfin
      user: "1000:1000"
      environment:
        - TZ=America/Toronto
      volumes:
        - ./config/jellyfin:/config
        - ./library:/media
      ports:
        - "8096:8096"
      networks:
        - media
      restart: unless-stopped
    
  • 之后在Sonarr / Radarr的Settings → Connections可以添加Jellyfin,主要作用是下载完成后可以通知Jellyfin刷新一遍

  • 配置完成后,整个流程就打通了,在Radarr中搜索电影 → 点击 → qb在后台下载电影本体,Bazarr在后台下载字幕 → 下载完毕后通知Jellyfin,我们直接打开Jellyfin就可以观看了。有时候觉得这一套流程还是很繁琐,要在这干点事儿再去另外的地方干点事儿,有什么办法能把Sonarr和Radarr整合呢?就是JellySeerr

Jellyseerr

  • 我觉得Jellyseerr的前端界面非常精美,他主要作用就是整合了剧和电影,用户点击之后它调用Radarr和Sonarr来下载,Radarr和Sonarr是Jellyseerr的后端

  • 这时候我已经换成k3s部署了,这是Jellyseerr的部署文件

    apiVersion: v1
    kind: Service
    metadata:
      name: jellyseerr
      namespace: media
    spec:
      ports:
        - name: http
          port: 5055
          targetPort: 5055
          protocol: TCP
      selector:
        app: jellyseerr
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: jellyseerr
      namespace: media
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: jellyseerr
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: jellyseerr
        spec:
          containers:
            - name: jellyseerr
              image: fallenbagel/jellyseerr:latest
              env:
                - name: LOG_LEVEL
                  value: "info"
                - name: TZ
                  value: "America/Toronto"
                - name: PUID
                  value: "1000"
                - name: PGID
                  value: "1000"
              ports:
                - containerPort: 5055
              livenessProbe:
                httpGet:
                  path: /status
                  port: 5055
                initialDelaySeconds: 10
                periodSeconds: 30
              readinessProbe:
                httpGet:
                  path: /status
                  port: 5055
                initialDelaySeconds: 10
                periodSeconds: 30
              resources:
                limits:
                  memory: "1Gi"
                requests:
                  memory: "256Mi"
              volumeMounts:
                - name: config
                  mountPath: /app/config
          volumes:
            - name: config
              hostPath:
                path: /home/kyxie/k3s/apps/media/config/jellyseerr 
                type: DirectoryOrCreate
    

Jellyfin Media Player

  • 当然浏览器的解码能力还是比不上电脑自身的,我们可以在电脑上安装jellyfin-media-player,这会使用电脑本地解码,效果比浏览器解码更好

  • MacBook可以使用HomeBrew下载

    brew install --cask jellyfin-media-player
    

    注意不是App Store自带的Jellyfin Mobile