使用Træfik(Traefik)与AutoBangumi搭建动画站

发布于 2022-09-10  590 次阅读


Træfik(Traefik)是云原生的反向代理和负载均衡器,比Nginx更适用于云环境,可以与各种容器编排和集群结合,并且支持动态配置。除此之外还提供诸如证书管理等许多功能以及支持各种插件。

AutoBangumi是从蜜柑计划的RSS订阅链接中抓取下载链接并通过qBittorrent进行下载和重命名的工具。和使用Jackett+Sonarr的方案相比,AutoBangumi几乎只有蜜柑计划一个来源可用,这意味着只能用于下载当季的新动画,此外过滤功能也不够完善,不过其使用也更为简单。

本次使用Docker Compose来进行配置。

准备

首先注册蜜柑计划的账号,注册完成后点击账号设置,打开高级订阅选项并保存。回到蜜柑计划的主页。此时不要点击动画右下的订阅按钮,如果直接点击该订阅按钮,则会直接将所有字幕组的下载地址都加入下载列表。为了避免重续下载,应点击动画的图片,会弹出选择字幕组的选项。然后选择想要订阅的字幕组并点击右侧的订字,在打开高级订阅后,此时会弹出选择字幕语言的选项,选择需要的语言并点击订阅即可。

除此之外,也可以点击动画的名字进入详细界面,可以进一步看到更新时间、大小、以及字幕组的命名规范。

在订阅后,点击最上方的订阅,进入已订阅的列表,在上方会有订阅更新列表,点击右下角的RSS订阅即可得到已订阅动画的RSS链接。由于只有在有更新的情况下才会显示RSS订阅按钮,所以如果没看到RSS订阅按钮,可能需要在上面选择不同的时间范围才会出现。

由于蜜柑计划现在只提供简繁字幕的选项,并不提供诸如清晰度/内封内嵌等选项,所以需要在订阅后通过AutoBangumi和qBittorrent来进一步过滤。

部署

首先确保系统内安装了docker和docker-compose-plugin。

新建一个文件夹,并在其中创建docker-compose.yml文件。

配置Traefik

在docker-compose.yml文件中填入如下内容:

version: '3'

services:
  reverse_proxy:
    image: traefik
      container_name: reverse_proxy
        command:
          - --providers.docker=true
          #监听80端口
          - --entrypoints.web.address=:80
          #将http重定向至https
          - --entrypoints.web.http.redirections.entryPoint.to=websecure
          - --entrypoints.web.http.redirections.entryPoint.scheme=https
          #监听443端口
          - --entrypoints.websecure.address=:443
          #配置证书信息,如联络邮箱、储存路径、挑战类型、服务器等
          #其中ab为证书解析器的名称,可以任取
          #如果需要通过不同方式取得不同证书时,可以设置多个证书解析器,这里只用一个
          - [email protected]
          - --certificatesresolvers.ab.acme.storage=/letsencrypt/acme.json
          - --certificatesresolvers.ab.acme.tlschallenge=true
          - --certificatesresolvers.ab.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory
          #上面的服务器为测试服务器,测试无误后,将其更换为https://acme-v02.api.letsencrypt.org/directory
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          #挂载证书保存路径,如果不挂载,重启traefik后会申请新证书
          - ./letsencrypt:/letsencrypt
        networks:
          - auto_bangumi
        restart: unless-stopped

配置qBittorrent

AutoBangumi使用的下载器为qBittorrent,如果已经安装了,可以跳过。

在docker-compose.yml中继续填入如下内容:

  downloader:
    image: lscr.io/linuxserver/qbittorrent
    container_name: downloader
    environment:
      - TA=Asia/Shanghai
      - TemPath=/downloads
      - SavePath=/downloads
      #若不想配置.env文件,以下也可以直接填内容,例如GID和UID填1000,QB_PORT填8080
      - PGID=${GID}
      - PUID=${UID}
      - QB_WEBUI_PORT=${QB_PORT}
    volumes:
      #冒号前为本地路径,可直接填写,支持相对路径,如./downloads
      #冒号后为容器内路径,不要修改
      - ${DOWNLOAD_PATH}:/downloads
      - ./qb:/config
    ports:
      #默认的Torrent通信端口,一般不用改
      - 6881:6881
      - 6881:6881/udp
    labels:
      #以下填写域名、证书解析器和端口,如果上面端口写的数字,下面也写数字
      - traefik.http.routers.downloader.rule=Host(`qb.example.com`)
      - traefik.http.routers.downloader.tls.certresolver=ab
      - traefik.http.services.downloader.loadbalancer.server.port=${QB_PORT}
    networks:
      - auto_bangumi
    restart: unless-stopped

配置AutoBangumi

由于AutoBangumi的面板没有认证,这里使用Traefik的BasicAuth添加一个认证功能。

由于BasicAuth需要使用MD5、SHA1和BCrypt散列后的密码,有许多种工具可以将密码散列,但在docker-compose.yml文件中,还需要对散列后的结果转义,所以这里直接生成转义后的结果。

首先在一台电脑中安装apache2-utils,然后执行如下命令:

echo $(htpasswd -nb username password) | sed -e s/\\$/\\$\\$/g

其中username和password分别为用户名和密码,执行后记下结果备用

继续在docker-compose.yml中填写如下内容:

  auto_bangumi:
    image: estrellaxd/auto_bangumi
    container_name: AutoBangumi
    environment:
      - TZ=Asia/Shanghai
      - AB_INTERVAL_TIME=1800
      #下面填qbittorrent的容器名和端口,以及用户名和密码,这里已填写默认密码
      - AB_DOWNLOADER_HOST=downloader:${QB_PORT}
      - AB_DOWNLOADER_USERNAME=admin
      - AB_DOWNLOADER_PASSWORD=adminadmin
      - AB_METHOD=pn
      - AB_GROUP_TAG=True
      #适用于整个订阅的正则表达式,符合条件的将被排除
      - AB_NOT_CONTAIN=720
      #下载路径,Shin_Bangumi的名字也可以改为其他名称
      - AB_DOWNLOAD_PATH=/downloads/Shin_Bangumi
      #可以直接填下蜜柑计划的RSS订阅地址,也可以使用.env文件
      - AB_RSS=${RSS}
      - AB_DEBUG_MODE=False
      - AB_EP_COMPLETE=False
      - AB_SEASON_ONE=True
    volumes:
      - ./autoBangumi:/config
    labels:
      #由于该容器内只监听一个端口,可以省略对端口的指定
      - traefik.http.routers.auto_bangumi.=Host(`ab.example.com`)
      - traefik.http.routers.auto_bangumi.tls.certresolver=ab
      #启用BasicAuth并配置密码,user:hash_password替换为之前生成的散列并转义的结果
      - traefik.http.routers.auto_bangumi.middlewares=auth
      - traefik.http.middlewares.auth.basicauth.users=user:hash_password
    networks:
      - auto_bangumi
    restart: unless-stopped
    depends_on
      #位于qBittorrent之后启动
      - downloader

其中环境变量可参考AutoBangumi的使用说明来修改。

配置媒体服务器

常用的媒体服务器有Plex、Emby、Jellyfin、Synology Video Station等,其中Plex对于动画效果较差,Sinology Video Station只能用于群晖NAS,剩下的Jellyfin为Emby的开源分支,这里先给出Emby的配置:

  media_server
    image: emby/embyserver
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./emby:/config
      - ${DOWNLOAD_PATH}/Shin_Bangumi:/media/Shin_Bangumi
    labels:
      - traefik.http.routers.media_server.rule=Host(`anime.example.com`)
      - traefik.http.routers.media_server.tls.certresolver=ab
      - traefik.http.services.media_server.loadbalancer.server.port=8096
    networks:
      - auto_bangumi
    restart: unless-stopped

如果打算使用Jellyfin的话,可以使用如下配置:

  media_server:
    image: jellyfin/jellyfin
    container_name: media_server
    #Jellyfin需要填写UID和GID,可填写数字如1000:1000
    user uid:gid
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./jellyfin:/config
      #jellyfin缓存,这里装入持久卷中
      - media_server_cache:/cache
      - ${DOWNLOAD_PATH}/Shin_Bangumi:/media/Shin_Bangumi
    labels:
      - traefik.http.routers.media_server.rule=Host(`anime.example.com`)
      - traefik.http.routers.media_server.tls.certresolver=ab
      - traefik.http.services.media_server.loadbalancer.server.port=8096
    networks:
      - auto_bangumi
    restart: unless-stopped

结尾及环境变量

如果为Jellyfin配置了持久卷缓存,则填写以下内容:

volumes:
  media_server_cache

最后填写网络

networks:
  auto_bangumi:
    driver: bridge

如果以上的${VARIABLE}没有全都改为实际参数的话,则需要创建.env文件并填写以下内容

export \
DOWNLOAD_PATH=下载路径的绝对路径
RSS=<RSS链接>
QB_PORT=<qBittorrent端口号>

全部文件创建完成后,拉起容器并等待完全启动即可:

docker compose up -d

番外:添加弹幕

RyoLee/emby-danmaku是基于spsundingkai/emby-danmaku所改进的JavaScript弹幕插件,可以通过弹弹Play获取各大弹幕网站的数据,目前仅适用于Emby,除了使用用户脚本以外,也可以通过修改Emby服务端或客户端的方式来启用:

进入Emby的Docker并修改/system/dashboard-ui/index.html,在</body>前添加:

<script src="https://cdn.jsdelivr.net/gh/RyoLee/emby-danmaku@gh-pages/ede.user.js" defer></script>

但使用容器部署时修改无法持久化,故推荐使用油猴加载用户脚本。

至于Jellyfin,只找到std4453/jfdmk的弹幕插件,使用更为繁琐,每一部作品都要分别配置。但Jellyfin是开源的,可以自动修改Jellfyin的/usr/share/jellyfin/web/index.html文件并构建镜像。

参考

AutoBangumi:自动追番,解放双手

AutoBangumi Wiki

Traefik Proxy 2.x and TLS 101

Traefik Proxy Documentation

Secure your traefik dashboard with HTTPS and Basic Auth