Docker搭建自动下载器

自动寻找并下载影视

最近买的12TB的硬盘到手了,测试过后没问题就把它接到了我的小服务器上
于是立马开始搭建我期待已久的自动下载器
在用 Docker 搭建的过程中,也碰到了许多没碰到过的问题,最后也都解决了这些问题
把搭建的过程记录一下,这样以后也能少走点弯路,少踩点坑

jackett 搭建

jackett 是一个索引器,它可以提供各种资源网站的检索 api,后面 sonarr 可以使用它提供的 api 去对应的资源网站寻找我们需要的资源
用 Docker 搭建起来也很简单,建议使用普通用户来使用 Docker,这样更方便和安全

1
usermod -a -G docker <uername>

拉取镜像

1
docker pull linuxserver/jackett:latest

创建容器

1
2
3
4
5
6
7
8
9
docker create \
--name=jackett \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Asia/Shanghai \
-p 9117:9117 \
-v path-to-jackett-config:/config \
--restart unless-stopped \
linuxserver/jackett:latest

PUID 和 PGID 设置为用 Docker 权限的用户的 PUID 和 PGID,使用 id 命令就可以知道了
path-to-jackett-config文件是 jackett 的配置文件映射,不做也行,但是容器更新的时候,配置也会重置,jackett 的更新特别频繁

创建好后,运行容器,浏览器打开 服务器ip:9117
在打开的网页中,点击 Add indexer 来添加资源网站,我经常看番,所以我添加了dmhy(动漫花园)等番剧资源多的网站
如果有 pt 等网站的会员,也可以在里面寻找并添加进来

qBittorrent 搭建

搭建好 jackett 后,继续搭建下载器,这里我使用的是 qBittorrent
虽然可以直接用命令自动安装,但我在使用的过程中还是碰到了一些问题,最后我还是选择了用 Docker 搭建一个

拉取镜像

1
docker pull linuxserver/qbittorrent:latest

选择一个目录用来存放下载的文件,在里面新建一个 downloads 目录,别的名字也行,按个人喜好,我直接用挂载的硬盘来存放下载的文件
现在的目录结构如下

1
2
disk
└── downloads

disk是我挂载的硬盘的位置,其实就是一个目录
记得将该目录所有者设置为拥有 Docker 权限的用户

1
2
chown -R 1000:1000 /disk
chmod -R a=,a+rX,u+w,g+w /disk

创建容器

1
2
3
4
5
6
7
8
9
10
11
12
13
docker create  \
--name=qbittorrent \
-e WEBUI_PORT=8080 \
-e TZ=Asia/Shanghai \
-e PUID=1000 \
-e PGID=1000 \
-p 6881:6881 \
-p 6881:6881/udp \
-p 8080:8080 \
-v path-to-qbittorrent-config:/config \
-v /disk/downloads:/downloads \
--restart unless-stopped \
linuxserver/qbittorrent:latest

启动容器后,浏览器打开 服务器ip:8080 默认账户 admin,密码 adminadmin
设置默认下载位置为 /downloads ,这里设置的是 Docker 容器里面的路径,不是真实的路径
如下所示

注意 此处的默认 Torrent 管理模式要设置为 Automatic(自动)

sonarr 搭建

sonarr 如其名,声纳,是一个拿来搜索资源的工具,它可以用来寻找资源,找到后调用下载器下载,下载好后会自动整理文件,非常方便
这里也是我踩坑最多的地方,一个不小心就会碰到各种问题

在用来存放下载文件的目录的同级目录下,创建各种目录,这些目录是用来后面分类用到,随自己喜欢
我比较懒,分类就分了三个大类 anime(动画),tv(电视剧),movie(电影)
当前目录结构如下

1
2
3
4
5
disk
├── anime
├── downloads
├── movie
└── tv

注意 创建新的目录后,记得修改它的权限,否则可能会有无法挂载或无法移动文件的情况发生

1
2
chown -R 1000:1000 /disk
chmod -R a=,a+rX,u+w,g+w /disk
  • -R 递归修改,简单粗暴,一次性全部修改

拉取镜像

1
docker pull linuxserver/sonarr:latest

创建容器

1
2
3
4
5
6
7
8
9
10
11
docker create \
--name=sonarr \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Asia/Shanghai \
-p 8989:8989 \
-v path-to-sonarr-config:/config \
-v /disk:/disk \
-v /disk/downloads:/downloads \
--restart unless-stopped \
linuxserver/sonarr:latest

此处挂载了 /disk 后,又挂载了 /disk/downloads 不是错误,一定要挂载,这里我踩了个大坑,如果不挂载,会发生没有权限移动文件的错误,一定要挂载

启动容器后,浏览器打开 服务器ip:8989,开始配置一些必要的设置

Media Management

Settings -> Media Management,开启重命名

开启硬链接,如果不开启硬链接,那么 downloads 下会有一份你下载的文件,分类的目录下也会有一份,相当于拷贝了一份过去

如果设置了硬链接,那么在分类的目录下就只是一个指向 downloads 中文件的指针,想了解更多,可以去看看 Linux 的硬链接
https://www.runoob.com/note/29134

挂载刚才创建各目录

Profiles

Profiles -> Quality Profiles -> Any 设置视频的清晰度,只有勾选了该清晰度,才会被下载
Upgrades Allowed 勾选后,如果视频有更高的清晰度时,是否自动更新
Upgrade Until 直到这个清晰度为止,都会尝试去升级清晰度

Language Profiles 添加中文

Indexer

点击添加,选择 Torznab

URL 是 jackett 那边提供的 indexer 地址

API Key 是 jackett 右上角的 API

Categories 选择想要的类型就可以了,如果不想选择,可以全都要

Download Clients

添加 qBittorrent

Host 设置为服务器的 IP 地址
Port 设置为 8080
Username 如果没有修改 qBittorrent 的账户名就设置为 admin
Password 设置为 adminadmin

添加一个 Remote Path Mappings
Host 为 qBittorrent
Remote Path 为 /downloads/
Local Path 为 /disk/downloads/

  • Remote Path 是 qBittorrent 的路径,把它看作 qBittorrent的IP地址:/downloads 就容易理解了,注意这里用的是 Docker 容器内的路径,不是真实的
  • Local Path 是 sonarr 的 docker 容器内的地址

开始找剧集

搭建完成,可以开启自动找番剧了,最上方输入想要找的名字,英文的

搜索到后,选择并添加,动画的 Series Type 记得选择 Anime,否则可能找不到

添加后就可以在 Series 里面看到了,点击进去可以看到每一季的信息
点击放大镜是开始检索,旁边的人像是有多种选择的情况下,手动选择

运行成功的结果如下
找到了番剧并自动下载

qBittorrent下载完成

自动硬链接,可以看到disk的总大小等于anime和download,说明download和anime中文件只存储了一次

自动更新 Docker 镜像

由于镜像会更新,而且有的更新的还很频繁,这就是为什么要把配置文件映射出来了,这样更新镜像的时候,配置不会消失
除了手动更新外,还可以自动更新

Watchtower 搭建

Watchtower 可以自动检测镜像是否有更新,如果有就会自动拉取新的镜像

拉取镜像

1
docker pull containrrr/watchtower

运行容器

1
2
3
4
5
6
7
docker run -d \
--name watchtower \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--cleanup \
--schedule '0 0 4 * * *'
  • –cleanup 表示拉取新的镜像后删除旧的镜像
  • –schedule 使用 Cron 类似的配置,但是有六个参数(cron是5个) 分别代表 秒 分 时 日 月 周

这样所有的容器就会自动更新了 []~( ̄▽ ̄)~*

如果等不及,可以直接运行一次 watchtower,更新完成后,这个容器会自动删除

1
2
3
4
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower -c \
--run-once

想搭建一个自动追番的工具很久了,但是苦于硬盘容量太小,搭不搭的意义不大,所以就搁置了
但现在不一样了,我的 12TB 硬盘到货了,可以搞起来了 (=^-ω-^=)
现在还只是搭建了一个下载器,再配一个播放器就大功告成了 ╮/(>▽<)人(>▽<)╭