|
楼主 |
发表于 2022-9-16 12:47:23
|
显示全部楼层
无中生有
当我们确定了需要的内容后,我们就需要软件来从网络中下载需要的资源到本地。因此我们就有了 qBittorrent(BT/PT) 以及 NZBGet(Usenet)。
qbt
qBittorrent 是一个用 C++/Qt 编程的 bittorrent 客户端,它使用 Arvid Norberg 的 libtorrent(有时称为 libtorrent-rasterbar)。它旨在成为所有其他 bittorrent 客户端的良好替代品。 qBittorrent 快速、稳定并提供 unicode 支持以及许多功能。 – 来自 qBittorrent Github Repo
NZBGet
NZBGet 是一个二进制下载器,它根据 nzb-files 中给出的信息从 Usenet 下载文件。NZBGet 是用 C++ 编写的,以其性能和效率而闻名。 – 来自 NZBGet Github Repo
锦上添花
在拿到了需要的资源后,很多时候它们并没有附带我们所需要的字幕,因此我们就需要从网络中下载字幕的软件。于是就有了 Bazarr 以及 Chinesesubfinder。
bazarr
Bazarr 是 Sonarr 和 Radarr 的配套应用程序。 它根据您的要求管理和下载字幕。 您可以通过电视节目或电影定义您的偏好,Bazarr 会为您处理一切。 – 来自 Bazarr Github Repo
chinesesubfinder
本项目的初衷仅仅是想自动化搞定限定条件下 中文 字幕下载。 – 来自 Chinesesubfinder Github Repo
放飞自我
一切都就绪了,是时候开始享受了。拿瓶快乐水,躺在沙发上,打开 Emby 。远离现实的嘈杂,开始欣赏属于另一个世界的故事吧!
emby
流程总结
那么现在让我们换个角度,从我们作为用户的角度出发总结一下发生了什么。
我们在Ombi(或者Sonarr等)中搜索了想要的内容,点击了添加至库存,等了一段时间,哇,Emby里面出现了!是不是很神奇?
千里之行始于足下
工作是为了躺平,现在让我们开始搭建吧。
以下案例中所有的代码均可在 这里 找到并复制黏贴。
本文使用 Debian Linux 操作系统以及 root 用户作为示范。默认用户名为admin,密码为adminadmin。
文件架构
所有文件都需要放在同一个/data目录下以启用硬链接,更多内容请看 这个链接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
data
├── torrents
│ ├── Movies
│ ├── Series
│ ├── Music
│ └── Books
│ └── Others
├── usenet
│ ├── Movies
│ ├── Series
│ ├── Music
│ └── Books
│ └── Others
└── media
├── Movies
├── Series
├── Music
├── Books
└── Others
新建文件夹
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
## 一级子目录(sonarr,radarr,lidarr,readarr Docker卷)
mkdir /data/
## 二级子目录(qbt,emby,bazarr Docker卷)
mkdir /data/torrents/
mkdir /data/usenet/
mkdir /data/media/
## BT/PT qBittorrent 下载位置
mkdir /data/torrents/Movies/
mkdir /data/torrents/Series/
mkdir /data/torrents/Music/
mkdir /data/torrents/Books/
mkdir /data/torrents/XXX/
mkdir /data/torrents/Others/
## Usenet NZBGet 下载位置
mkdir /data/usenet/Movies/
mkdir /data/usenet/Series/
mkdir /data/usenet/Music/
mkdir /data/usenet/Books/
mkdir /data/usenet/XXX/
mkdir /data/usenet/Others/
## Sonarr Radarr Lidarr Readarr Rootfolder
mkdir /data/media/Movies/
mkdir /data/media/Series/
mkdir /data/media/Music/
mkdir /data/media/Books/
mkdir /data/media/XXX/
mkdir /data/media/Others/
## 安装后面配置需要的软件
apt-get install xml-twig-tools lsb-release unzip sqlite3 jq sudo -y
## 新建软件配置文件夹
mkdir /usr/share/nginx/nzbget
mkdir /usr/share/nginx/nzbget/config
mkdir /usr/share/nginx/sonarr
mkdir /usr/share/nginx/sonarr/config
mkdir /usr/share/nginx/radarr
mkdir /usr/share/nginx/radarr/config
mkdir /usr/share/nginx/lidarr
mkdir /usr/share/nginx/lidarr/config
mkdir /usr/share/nginx/readarr
mkdir /usr/share/nginx/readarr/config
mkdir /usr/share/nginx/prowlarr
mkdir /usr/share/nginx/prowlarr/config
mkdir /usr/share/nginx/jackett
mkdir /usr/share/nginx/jackett/config
mkdir /usr/share/nginx/bazarr
mkdir /usr/share/nginx/bazarr/config
mkdir /usr/share/nginx/chinesesubfinder
mkdir /usr/share/nginx/chinesesubfinder/app/
mkdir /usr/share/nginx/chinesesubfinder/app/cache
mkdir /usr/share/nginx/chinesesubfinder/config
mkdir /usr/share/nginx/ombi
mkdir /usr/share/nginx/ombi/config
Nginx
因为没有人会想去记各个应用的端口号,因此我们需要安装Nginx并配置子目录以及反向代理。
安装Nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
apt-get update
apt-get install ca-certificates lsb-release -y
apt-get install gnupg2 -y
touch /etc/apt/sources.list.d/nginx.list
cat > '/etc/apt/sources.list.d/nginx.list' << EOF
deb https://nginx.org/packages/mainline/debian/ $(lsb_release -cs) nginx
EOF
curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add -
apt-get update
apt-get install nginx -y
cat > '/lib/systemd/system/nginx.service' << EOF
[Unit]
Description=The NGINX HTTP and reverse proxy server
Before=netdata.service trojan.service
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT \$MAINPID
PrivateTmp=true
LimitNOFILE=65536
Restart=always
RestartSec=3s
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
配置NGINX主配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
cat > '/etc/nginx/nginx.conf' << EOF
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 65536;
use epoll;
multi_accept on;
}
http {
autoindex_exact_size off;
http2_push_preload on;
aio threads;
charset UTF-8;
tcp_nodelay on;
tcp_nopush on;
server_tokens off;
proxy_intercept_errors on;
proxy_http_version 1.1;
proxy_ssl_protocols TLSv1.2 TLSv1.3;
proxy_set_header Host \$http_host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
log_format main '\$remote_addr - \$remote_user [\$time_local] "\$request" '
'\$status \$body_bytes_sent "\$http_referer" '
'"\$http_user_agent" "\$http_x_forwarded_for"';
sendfile on;
gzip on; # 本地Nas可以考虑把这个关掉节省CPU资源
gzip_proxied any;
gzip_types *;
gzip_comp_level 1;
include /etc/nginx/conf.d/default.conf;
}
EOF
启动Nginx
1
systemctl enable nginx --now
配置子目录以及反向代理
新建NGINX配置
1
2
rm /etc/nginx/conf.d/*.conf # 删除旧配置
touch /etc/nginx/conf.d/default.conf
写入新配置
1
nano /etc/nginx/conf.d/default.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
server {
listen 80 fastopen=20 reuseport default_server so_keepalive=on;
server_name _;
location / {
root /usr/share/nginx/html/;
}
location /qbt/ {
#access_log off;
proxy_pass http://127.0.0.1:8080/;
proxy_set_header X-Forwarded-Host $http_host;
}
location /emby/ {
#access_log off;
proxy_pass http://127.0.0.1:8096/;
proxy_pass_request_headers on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_buffering off;
}
location /sonarr/ {
#access_log off;
proxy_pass http://127.0.0.1:8989/sonarr/;
proxy_pass_request_headers on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
#proxy_buffering off;
}
location /radarr/ {
#access_log off;
proxy_pass http://127.0.0.1:7878/radarr/;
proxy_pass_request_headers on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
#proxy_buffering off;
}
location /lidarr/ {
#access_log off;
proxy_pass http://127.0.0.1:8686/lidarr/;
proxy_pass_request_headers on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
#proxy_buffering off;
}
location /readarr/ {
#access_log off;
proxy_pass http://127.0.0.1:8787/readarr/;
proxy_pass_request_headers on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
#proxy_buffering off;
}
location /bazarr/ {
#access_log off;
proxy_pass http://127.0.0.1:6767/bazarr/;
proxy_pass_request_headers on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
#proxy_buffering off;
}
location /chinesesubfinder/ {
#access_log off;
proxy_pass http://127.0.0.1:19035/;
proxy_pass_request_headers on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
#proxy_buffering off;
}
location /prowlarr/ {
#access_log off;
proxy_pass http://127.0.0.1:9696/prowlarr/;
proxy_pass_request_headers on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
#proxy_buffering off;
}
location /jackett/ {
#access_log off;
proxy_pass http://127.0.0.1:9117/jackett/;
proxy_pass_request_headers on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
#proxy_buffering off;
}
location /ombi/ {
#access_log off;
proxy_pass http://127.0.0.1:3579/ombi/;
proxy_pass_request_headers on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
#proxy_buffering off;
}
location /nzbget/ {
#access_log off;
proxy_pass http://127.0.0.1:6789/;
proxy_pass_request_headers on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
#proxy_buffering off;
}
location /rsshub/ {
proxy_redirect off;
proxy_pass http://127.0.0.1:1200/;
}
}
修改NGINX默认前端页面以方便进入
1
nano /usr/share/nginx/html/index.html
写入以下配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<h>前端</h2>
<a href="http://10.0.0.1:80/emby/" target="_blank" rel="noreferrer">emby</a>
<a href="http://10.0.0.1:80/ombi/" target="_blank" rel="noreferrer">ombi</a>
<h2>中间层</h2>
<a href="http://10.0.0.1:80/sonarr/" target="_blank" rel="noreferrer">sonarr</a>
<a href="http://10.0.0.1:80/radarr/" target="_blank" rel="noreferrer">radarr</a>
<a href="http://10.0.0.1:80/lidarr/" target="_blank" rel="noreferrer">lidarr</a>
<a href="http://10.0.0.1:80/readarr/" target="_blank" rel="noreferrer">readarr</a>
<h2>字幕</h2>
<a href="http://10.0.0.1:80/bazarr/" target="_blank" rel="noreferrer">bazarr</a>
<a href="http://10.0.0.1:80/chinesesubfinder/" target="_blank" rel="noreferrer">chinesesubfinder</a>
<h2>索引器</h2>
<a href="http://10.0.0.1:80/prowlarr/" target="_blank" rel="noreferrer">prowlarr</a>
<a href="http://10.0.0.1:80/jackett/" target="_blank" rel="noreferrer">jackett</a>
<a href="http://10.0.0.1:80/rsshub/" target="_blank" rel="noreferrer">rsshub</a>
<h2>下载器</h2>
<a href="http://10.0.0.1:80/qbt/" target="_blank" rel="noreferrer">qbt</a>
<a href="http://10.0.0.1:80/nzbget/" target="_blank" rel="noreferrer">nzbget</a>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
10.0.0.1 替换成你自己 Nas/VPS 的IP,效果图如下
nginx
使配置生效
1
nginx -t && nginx -s reload
VPS请记得去自行配置SSL证书并修改NGINX配置。
Docker
安装Docker
1
2
3
4
5
6
apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
#apt-key fingerprint 0EBFCD88
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io -y
安装Docker-compose
1
2
3
dockerver=$(curl --retry 5 -s "https://api.github.com/repos/docker/compose/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') # 获取最新版Docker-compose
sudo curl --retry 5 -L "https://github.com/docker/compose/releases/download/${dockerver}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Emby
安装Emby
1
2
3
4
apt install -y apt-transport-https
curl --retry 5 -LO https://github.com/MediaBrowser/ ... b_4.6.7.0_amd64.deb
dpkg -i emby-server-deb_4.6.7.0_amd64.deb
rm emby-server-deb_4.6.7.0_amd64.deb
qBittorrent
安装 qBittorrent 加强版
有些 PT 站可能指名不得使用这个版本,如遇此情况,请用原版。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
mkdir /root/qbt
cd /root/qbt
qbtver=$(curl --retry 5 -s "https://api.github.com/repos/c0re100/qBittorrent-Enhanced-Edition/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
curl --retry 5 -LO https://github.com/c0re100/qBitt ... /releases/download/${qbtver}/qbittorrent-enhanced-nox_x86_64-linux-musl_static.zip
unzip -o qb*.zip
rm qb*.zip
cp -f qb* /usr/bin/
chmod +x /usr/bin/qbittorrent-nox
cd /root
rm -rf /root/qbt
cat > '/etc/systemd/system/qbittorrent.service' << EOF
[Unit]
Description=qBittorrent Daemon Service
Documentation=https://github.com/c0re100/qBittorrent-Enhanced-Edition
Wants=network-online.target
After=network-online.target nss-lookup.target
[Service]
Type=simple
User=root
RemainAfterExit=yes
ExecStart=/usr/bin/qbittorrent-nox --profile=/usr/share/nginx/
TimeoutStopSec=infinity
LimitNOFILE=65536
Restart=always
RestartSec=3s
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable qbittorrent.service
下载mmdb这样peer的国旗才会显示
1
2
3
4
5
6
mkdir /usr/share/nginx/qBittorrent/
mkdir /usr/share/nginx/qBittorrent/data/
mkdir /usr/share/nginx/qBittorrent/data/GeoIP/
cd /usr/share/nginx/qBittorrent/data/GeoIP/
curl -LO --progress-bar https://raw.githubusercontent.co ... oLite2-Country.mmdb
systemctl restart qbittorrent
修改性能设置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
cpu_thread_count=$(nproc --all)
io_thread=$((${cpu_thread_count}*4))
qbtcookie=$(curl -i --header 'Referer: http://127.0.0.1:8080' --data 'username=admin&password=adminadmin' http://127.0.0.1:8080/api/v2/auth/login | grep -i set-cookie | cut -c13-48) # adminadmin 为 webui 默认密码
curl http://127.0.0.1:8080/api/v2/app ... delete_mode%22:1%7D --cookie "${qbtcookie}"
curl http://127.0.0.1:8080/api/v2/app ... sync_io_threads%22:${io_thread}%7D --cookie "${qbtcookie}"
curl http://127.0.0.1:8080/api/v2/app ... cate_all%22:true%7D --cookie "${qbtcookie}"
curl http://127.0.0.1:8080/api/v2/app ... com%2fall.txt%22%7D --cookie "${qbtcookie}"
curl http://127.0.0.1:8080/api/v2/app ... _enabled%22:true%7D --cookie "${qbtcookie}"
curl http://127.0.0.1:8080/api/v2/app ... _enabled%22:true%7D --cookie "${qbtcookie}"
curl http://127.0.0.1:8080/api/v2/app ... _same_ip%22:true%7D --cookie "${qbtcookie}"
curl http://127.0.0.1:8080/api/v2/app ... _enabled%22:true%7D --cookie "${qbtcookie}"
curl http://127.0.0.1:8080/api/v2/app ... ll_tiers%22:true%7D --cookie "${qbtcookie}"
curl http://127.0.0.1:8080/api/v2/app ... trackers%22:true%7D --cookie "${qbtcookie}"
curl http://127.0.0.1:8080/api/v2/app ... trackers%22:true%7D --cookie "${qbtcookie}"
curl http://127.0.0.1:8080/api/v2/app ... utp_rate%22:true%7D --cookie "${qbtcookie}"
curl http://127.0.0.1:8080/api/v2/app ... overhead%22:true%7D --cookie "${qbtcookie}"
curl http://127.0.0.1:8080/api/v2/app ... n_peers%22:false%7D --cookie "${qbtcookie}"
curl http://127.0.0.1:8080/api/v2/app ... s_cache%22:false%7D --cookie "${qbtcookie}"
curl http://127.0.0.1:8080/api/v2/app ... enabled%22:false%7D --cookie "${qbtcookie}"
curl http://127.0.0.1:8080/api/v2/app ... ui_upnp%22:false%7D --cookie "${qbtcookie}"
curl http://127.0.0.1:8080/api/v2/app ... rent%2fweb%2f%22%7D --cookie "${qbtcookie}"
curl http://127.0.0.1:8080/api/v2/app ... max_connec%22:-1%7D --cookie "${qbtcookie}"
curl http://127.0.0.1:8080/api/v2/app ... er_torrent%22:-1%7D --cookie "${qbtcookie}"
curl http://127.0.0.1:8080/api/v2/app ... :%22127.0.0.1%22%7D --cookie "${qbtcookie}"
curl http://127.0.0.1:8080/api/v2/app ... ificate%22:false%7D --cookie "${qbtcookie}"
curl http://127.0.0.1:8080/api/v2/app ... %22peer_tos%22:0%7D --cookie "${qbtcookie}"
## 设置自动管理以及默认下载位置
curl http://127.0.0.1:8080/api/v2/app ... _enabled%22:true%7D --cookie "${qbtcookie}"
curl http://127.0.0.1:8080/api/v2/app ... ta%2fmedia%2f%22%7D --cookie "${qbtcookie}"
新增分类及对应的下载位置
1
2
3
4
5
6
curl -X POST -F 'category=Series' -F 'savePath=/data/torrents/Series/' http://127.0.0.1:8080/api/v2/torrents/createCategory --cookie "${qbtcookie}"
curl -X POST -F 'category=Movies' -F 'savePath=/data/torrents/Movies/' http://127.0.0.1:8080/api/v2/torrents/createCategory --cookie "${qbtcookie}"
curl -X POST -F 'category=Music' -F 'savePath=/data/torrents/Music/' http://127.0.0.1:8080/api/v2/torrents/createCategory --cookie "${qbtcookie}"
curl -X POST -F 'category=Bookes' -F 'savePath=/data/torrents/Books/' http://127.0.0.1:8080/api/v2/torrents/createCategory --cookie "${qbtcookie}"
curl -X POST -F 'category=XXX' -F 'savePath=/data/torrents/XXX/' http://127.0.0.1:8080/api/v2/torrents/createCategory --cookie "${qbtcookie}"
curl -X POST -F 'category=Others' -F 'savePath=/data/torrents/Others/' http://127.0.0.1:8080/api/v2/torrents/createCategory --cookie "${qbtcookie}"
Docker-compose配置文件及命令行配置
Rsshub为可选项,主要用于爬取不提供RSS/API的网站。
写入Docker-compose配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
cd /data/ # 放在同一个目录下方便管理
cat > "docker-compose.yml" << EOF
version: "3.8"
services:
nzbget: # 6789
network_mode: host
image: lscr.io/linuxserver/nzbget
container_name: nzbget
environment:
- PUID=0
- PGID=0
- TZ=Asia/Shanghai
volumes:
- /usr/share/nginx/nzbget/config:/config
- /data/usenet:/data/usenet:rw
- /ssd:/ssd:rw # 写入缓存
restart: unless-stopped
sonarr: # 8989
network_mode: host
image: lscr.io/linuxserver/sonarr
container_name: sonarr
environment:
- PUID=0
- PGID=0
- TZ=Asia/Shanghai
volumes:
- /usr/share/nginx/sonarr/config:/config
- /data:/data
restart: unless-stopped
radarr: # 7878
network_mode: host
image: lscr.io/linuxserver/radarr
container_name: radarr
environment:
- PUID=0
- PGID=0
- TZ=Asia/Shanghai
volumes:
- /usr/share/nginx/radarr/config:/config
- /data:/data
restart: unless-stopped
lidarr: # 8686
network_mode: host
image: lscr.io/linuxserver/lidarr
container_name: lidarr
environment:
- PUID=0
- PGID=0
- TZ=Asia/Shanghai
volumes:
- /usr/share/nginx/lidarr/config:/config
- /data:/data
restart: unless-stopped
readarr: # 8787
network_mode: host
image: lscr.io/linuxserver/readarr:develop
container_name: readarr
environment:
- PUID=0
- PGID=0
- TZ=Asia/Shanghai
volumes:
- /usr/share/nginx/readarr/config:/config
- /data:/data
restart: unless-stopped
prowlarr: # 9696
network_mode: host
image: lscr.io/linuxserver/prowlarr:develop
container_name: prowlarr
environment:
- PUID=0
- PGID=0
- TZ=Asia/Shanghai
volumes:
- /usr/share/nginx/prowlarr/config:/config
restart: unless-stopped
jackett: #9117
network_mode: host
image: lscr.io/linuxserver/jackett
container_name: jackett
environment:
- PUID=0
- PGID=0
- TZ=Asia/Shanghai
volumes:
- /usr/share/nginx/jackett/config:/config
restart: unless-stopped
rsshub: # 1200
image: diygod/rsshub
container_name: rsshub
ports:
- '1200:1200'
environment:
# PROXY_URI: 'http://127.0.0.1:8080'
NODE_ENV: production
CACHE_TYPE: redis
REDIS_URL: 'redis://redis:6379/'
PUPPETEER_WS_ENDPOINT: 'ws://browserless:3000'
depends_on:
- browserless
- redis
restart: unless-stopped
browserless: # 3000
image: browserless/chrome
container_name: browserless
restart: unless-stopped
ports:
- 127.0.0.1:3000:3000
redis: # 6379
image: "redis:latest"
container_name: redis
ports:
- "6379:6379"
volumes:
- "/data/redis:/data"
flaresolverr: # 8191
network_mode: host
image: flaresolverr/flaresolverr
container_name: flaresolverr
environment:
- LOG_LEVEL=\${LOG_LEVEL:-info}
- LOG_HTML=\${LOG_HTML:-false}
- CAPTCHA_SOLVER=\${CAPTCHA_SOLVER:-none}
- TZ=Asia/Shanghai
restart: unless-stopped
bazarr: # 6767
network_mode: host
image: lscr.io/linuxserver/bazarr
container_name: bazarr
environment:
- PUID=0
- PGID=0
- TZ=Asia/Shanghai
volumes:
- /usr/share/nginx/bazarr/config:/config
- /data/media/:/data/media
restart: unless-stopped
chinesesubfinder: # 19035
network_mode: host
image: allanpk716/chinesesubfinder:latest
container_name: chinesesubfinder
environment:
- PUID=0
- PGID=0
- TZ=Asia/Shanghai
volumes:
- /usr/share/nginx/chinesesubfinder/app/cache:/app/cache
- /usr/share/nginx/chinesesubfinder/config:/config
- /data:/data
restart: unless-stopped
ombi: # 3579
network_mode: host
image: lscr.io/linuxserver/ombi
container_name: ombi
environment:
- PUID=0
- PGID=0
- TZ=Asia/Shanghai
- BASE_URL=/ombi
volumes:
- /usr/share/nginx/ombi/config:/config
restart: unless-stopped
watchtower:
image: containrrr/watchtower
container_name: watchtower
environment:
- TZ=Asia/Shanghai
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: nzbget sonarr radarr lidarr readarr prowlarr jackett rsshub browserless redis flaresolverr bazarr chinesesubfinder ombi watchtower --cleanup --schedule "0 0 3 * * *"
restart: unless-stopped
我不想管烦人的权限问题,所以全部用 root (PUID=0) 运行。
拉取Docker images并等待60秒让程序初始化。
1
docker-compose up -d && sleep 60s
关闭所有程序进行配置
1
docker-compose down
配置 NZBGet
2022.3.20 更新:修改 NZBGet 可用下载队列为最大值;新增程序写入缓存配置。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 修改下载位置
sed -i "s/MainDir=\/downloads/MainDir=\/data\/usenet\//g" /usr/share/nginx/nzbget/config/nzbget.conf
sed -i "s/DestDir=\${MainDir}\/completed/DestDir=\${MainDir}/g" /usr/share/nginx/nzbget/config/nzbget.conf
sed -i "s/ControlIP=0.0.0.0/ControlIP=127.0.0.1/g" /usr/share/nginx/nzbget/config/nzbget.conf
sed -i "s/ControlUsername=nzbget/ControlUsername=admin/g" /usr/share/nginx/nzbget/config/nzbget.conf
sed -i "s/FormAuth=no/FormAuth=yes/g" /usr/share/nginx/nzbget/config/nzbget.conf
sed -i "s/AuthorizedIP=127.0.0.1/AuthorizedIP=/g" /usr/share/nginx/nzbget/config/nzbget.conf
sed -i "s/ControlPassword=tegbzn6789/ControlPassword=${password1}/g" /usr/share/nginx/nzbget/config/nzbget.conf
# 修改Usenet Server相关信息
sed -i "s/Server1.Port=119/Server1.Port=563/g" /usr/share/nginx/nzbget/config/nzbget.conf
sed -i "s/Server1.Cipher=/Server1.Cipher=AES128-SHA/g" /usr/share/nginx/nzbget/config/nzbget.conf
sed -i "s/Server1.Encryption=no/Server1.Encryption=yes/g" /usr/share/nginx/nzbget/config/nzbget.conf
sed -i "s/Server1.Connections=4/Server1.Connections=50/g" /usr/share/nginx/nzbget/config/nzbget.conf
# 单文件连接数上限,建议为 2。
sed -i "s/UrlConnections=4/UrlConnections=2/g" /usr/share/nginx/nzbget/config/nzbget.conf
# 新增分类
sed -i "s/Category4.Name=Software/Category4.Name=Books/g" /usr/share/nginx/nzbget/config/nzbget.conf
sed -i '/^Category4.Name=Books/a Category5.Name=XXX' /usr/share/nginx/nzbget/config/nzbget.conf
sed -i '/^Category5.Name=XXX/a Category6.Name=Others' /usr/share/nginx/nzbget/config/nzbget.conf
# 修改可用下载队列为最大值。
sed -i "s/PostStrategy=sequential/PostStrategy=rocket/g" /usr/share/nginx/nzbget/config/nzbget.conf
sed -i "s/PostStrategy=balanced/PostStrategy=rocket/g" /usr/share/nginx/nzbget/config/nzbget.conf
sed -i "s/PostStrategy=aggressive/PostStrategy=rocket/g" /usr/share/nginx/nzbget/config/nzbget.conf
# 修改写入缓存大小(程序缓存)
sed -i "s/ArticleCache=0/ArticleCache=200/g" /usr/share/nginx/nzbget/config/nzbget.conf
sed -i "s/WriteBuffer=0/WriteBuffer=1024/g" /usr/share/nginx/nzbget/config/nzbget.conf
配置 Sonarr
配置项目及内容大同小异,因此雷同注释仅标注一次。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# 修改baseurl
sed -i "s/<UrlBase><\/UrlBase>/<UrlBase>\/sonarr\/<\/UrlBase>/g" /usr/share/nginx/sonarr/config/config.xml
sed -i '$d' /usr/share/nginx/sonarr/config/config.xml
# 关闭信息收集
echo ' <AnalyticsEnabled>False</AnalyticsEnabled>' >> /usr/share/nginx/sonarr/config/config.xml
echo '</Config>' >> /usr/share/nginx/sonarr/config/config.xml
# 新增根目录
sqlite3 /usr/share/nginx/sonarr/config/sonarr.db "insert into RootFolders values ('1','/data/media/Series/');"
# 开启刮削
sqlite3 /usr/share/nginx/sonarr/config/sonarr.db "DELETE FROM Metadata WHERE Id = 1;"
sqlite3 /usr/share/nginx/sonarr/config/sonarr.db "insert into Metadata values ('1','1','Kodi (XBMC) / Emby','XbmcMetadata','{
\"seriesMetadata\": true,
\"seriesMetadataUrl\": false,
\"episodeMetadata\": true,
\"seriesImages\": true,
\"seasonImages\": true,
\"episodeImages\": true,
\"isValid\": true
}','XbmcMetadataSettings');"
# 修改语言为简体中文,繁体中文以及英文
sqlite3 /usr/share/nginx/sonarr/config/sonarr.db "DELETE FROM LanguageProfiles WHERE Id = 1;"
sqlite3 /usr/share/nginx/sonarr/config/sonarr.db "insert into LanguageProfiles values ('1','Chinese','[
{
\"language\": 0,
\"allowed\": false
},
{
\"language\": 13,
\"allowed\": false
},
{
\"language\": 17,
\"allowed\": false
},
{
\"language\": 14,
\"allowed\": false
},
{
\"language\": 3,
\"allowed\": false
},
{
\"language\": 11,
\"allowed\": false
},
{
\"language\": 18,
\"allowed\": false
},
{
\"language\": 12,
\"allowed\": false
},
{
\"language\": 15,
\"allowed\": false
},
{
\"language\": 24,
\"allowed\": false
},
{
\"language\": 21,
\"allowed\": false
},
{
\"language\": 5,
\"allowed\": false
},
{
\"language\": 9,
\"allowed\": false
},
{
\"language\": 22,
\"allowed\": false
},
{
\"language\": 27,
\"allowed\": false
},
{
\"language\": 23,
\"allowed\": false
},
{
\"language\": 20,
\"allowed\": false
},
{
\"language\": 4,
\"allowed\": false
},
{
\"language\": 2,
\"allowed\": false
},
{
\"language\": 19,
\"allowed\": false
},
{
\"language\": 16,
\"allowed\": false
},
{
\"language\": 7,
\"allowed\": false
},
{
\"language\": 6,
\"allowed\": false
},
{
\"language\": 25,
\"allowed\": false
},
{
\"language\": 28,
\"allowed\": false
},
{
\"language\": 26,
\"allowed\": false
},
{
\"language\": 8,
\"allowed\": true
},
{
\"language\": 1,
\"allowed\": true
},
{
\"language\": 10,
\"allowed\": true
}
]','10','0');"
# 开启重命名
sqlite3 /usr/share/nginx/sonarr/config/sonarr.db "DELETE FROM NamingConfig WHERE Id = 1;"
sqlite3 /usr/share/nginx/sonarr/config/sonarr.db "insert into NamingConfig values ('1','0','1','{Series Title} - S{season:00}E{episode:00} - {Episode Title} {Quality Full}','{Series Title} - {Air-Date} - {Episode Title} {Quality Full}','Season {season}','{Series Title}','{Series Title} - S{season:00}E{episode:00} - {Episode Title} {Quality Full}','1','Specials');"
# 新增qBittorrent 下载客户端
sqlite3 /usr/share/nginx/sonarr/config/sonarr.db "insert into DownloadClients values ('1','1','qBittorrent_Series','QBittorrent','{
\"host\": \"127.0.0.1\",
\"port\": 8080,
\"useSsl\": false,
\"username\": \"admin\",
\"password\": \"adminadmin\",
\"tvCategory\": \"Series\",
\"recentTvPriority\": 0,
\"olderTvPriority\": 0,
\"initialState\": 0,
\"sequentialOrder\": false,
\"firstAndLast\": false
}','QBittorrentSettings','1','1','1');"
# 新增NZBGet 下载客户端
sqlite3 /usr/share/nginx/sonarr/config/sonarr.db "insert into DownloadClients values ('2','1','NZBGet_Series','Nzbget','{
\"host\": \"127.0.0.1\",
\"port\": 6789,
\"useSsl\": false,
\"username\": \"admin\",
\"password\": \"adminadmin\",
\"tvCategory\": \"Series\",
\"recentTvPriority\": 0,
\"olderTvPriority\": 0,
\"addPaused\": false
}','NzbgetSettings','1','1','1');"
# 获取Sonarr api,后面要用到
sonarr_api=$(xml_grep 'ApiKey' /usr/share/nginx/sonarr/config/config.xml --text_only)
配置 Radarr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
sed -i "s/<UrlBase><\/UrlBase>/<UrlBase>\/radarr\/<\/UrlBase>/g" /usr/share/nginx/radarr/config/config.xml
sed -i '$d' /usr/share/nginx/radarr/config/config.xml
echo ' <AnalyticsEnabled>False</AnalyticsEnabled>' >> /usr/share/nginx/radarr/config/config.xml
echo '</Config>' >> /usr/share/nginx/radarr/config/config.xml
sqlite3 /usr/share/nginx/radarr/config/radarr.db "insert into RootFolders values ('1','/data/media/Movies/');"
sqlite3 /usr/share/nginx/radarr/config/radarr.db "insert into Config values ('6','movieinfolanguage','10');"
sqlite3 /usr/share/nginx/radarr/config/radarr.db "insert into Config values ('7','uilanguage','10');"
sqlite3 /usr/share/nginx/radarr/config/radarr.db "UPDATE Metadata SET Enable = 1 WHERE Id = 1;"
sqlite3 /usr/share/nginx/radarr/config/radarr.db "DELETE FROM Metadata WHERE Id = 1;"
sqlite3 /usr/share/nginx/radarr/config/radarr.db "insert into Metadata values ('1','1','Kodi (XBMC) / Emby','XbmcMetadata','{
\"movieMetadata\": true,
\"movieMetadataURL\": false,
\"movieMetadataLanguage\": 10,
\"movieImages\": true,
\"useMovieNfo\": false,
\"isValid\": true
}','XbmcMetadataSettings');"
sqlite3 /usr/share/nginx/radarr/config/radarr.db "DELETE FROM NamingConfig WHERE Id = 1;"
sqlite3 /usr/share/nginx/radarr/config/radarr.db "insert into NamingConfig values ('1','0','1','{Movie Title} ({Release Year}) {Quality Full}','{Movie Title} ({Release Year})','0','1');"
sqlite3 /usr/share/nginx/radarr/config/radarr.db "insert into DownloadClients values ('1','1','qBittorrent','QBittorrent','{
\"host\": \"127.0.0.1\",
\"port\": 8080,
\"useSsl\": false,
\"username\": \"admin\",
\"password\": \"adminadmin\",
\"movieCategory\": \"Movies\",
\"recentTvPriority\": 0,
\"olderTvPriority\": 0,
\"initialState\": 0
}','QBittorrentSettings','1','1','1');"
sqlite3 /usr/share/nginx/radarr/config/radarr.db "insert into DownloadClients values ('2','1','NZBGet','Nzbget','{
\"host\": \"127.0.0.1\",
\"port\": 6789,
\"useSsl\": false,
\"username\": \"admin\",
\"password\": \"adminadmin\",
\"movieCategory\": \"Movies\",
\"recentMoviePriority\": 0,
\"olderMoviePriority\": 0,
\"addPaused\": false
}','NzbgetSettings','1','1','1');"
radarr_api=$(xml_grep 'ApiKey' /usr/share/nginx/radarr/config/config.xml --text_only)
配置Lidarr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
sed -i "s/<UrlBase><\/UrlBase>/<UrlBase>\/lidarr\/<\/UrlBase>/g" /usr/share/nginx/lidarr/config/config.xml
sed -i '$d' /usr/share/nginx/lidarr/config/config.xml
echo ' <AnalyticsEnabled>False</AnalyticsEnabled>' >> /usr/share/nginx/lidarr/config/config.xml
echo '</Config>' >> /usr/share/nginx/lidarr/config/config.xml
sqlite3 /usr/share/nginx/lidarr/config/lidarr.db "insert into RootFolders values ('1','/data/media/Music/','music','1','1','0','[]');"
sqlite3 /usr/share/nginx/lidarr/config/lidarr.db "DELETE FROM Metadata WHERE Id = 1;"
sqlite3 /usr/share/nginx/lidarr/config/lidarr.db "insert into Metadata values ('1','1','Kodi (XBMC) / Emby','XbmcMetadata','{
\"artistMetadata\": true,
\"albumMetadata\": true,
\"artistImages\": true,
\"albumImages\": true,
\"isValid\": true
}','XbmcMetadataSettings');"
sqlite3 /usr/share/nginx/lidarr/config/lidarr.db "DELETE FROM NamingConfig WHERE Id = 1;"
sqlite3 /usr/share/nginx/lidarr/config/lidarr.db "insert into NamingConfig values ('1','1','{Artist Name}','1','{Album Title} ({Release Year})/{Artist Name} - {Album Title} - {track:00} - {Track Title}','{Album Title} ({Release Year})/{Medium Format} {medium:00}/{Artist Name} - {Album Title} - {track:00} - {Track Title}');"
sqlite3 /usr/share/nginx/lidarr/config/lidarr.db "insert into DownloadClients values ('1','1','qBittorrent','QBittorrent','{
\"host\": \"127.0.0.1\",
\"port\": 8080,
\"username\": \"admin\",
\"password\": \"adminadmin\",
\"musicCategory\": \"Music\",
\"recentTvPriority\": 0,
\"olderTvPriority\": 0,
\"initialState\": 0,
\"useSsl\": false
}','QBittorrentSettings','1');"
sqlite3 /usr/share/nginx/lidarr/config/lidarr.db "insert into DownloadClients values ('2','1','NZBGet','Nzbget','{
\"host\": \"127.0.0.1\",
\"port\": 6789,
\"username\": \"admin\",
\"password\": \"adminadmin\",
\"musicCategory\": \"Music\",
\"recentTvPriority\": 0,
\"olderTvPriority\": 0,
\"addPaused\": false,
\"useSsl\": false
}','NzbgetSettings','1');"
lidarr_api=$(xml_grep 'ApiKey' /usr/share/nginx/lidarr/config/config.xml --text_only)
配置 Readarr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
sed -i "s/<UrlBase><\/UrlBase>/<UrlBase>\/readarr\/<\/UrlBase>/g" /usr/share/nginx/readarr/config/config.xml
sed -i '$d' /usr/share/nginx/readarr/config/config.xml
echo ' <AnalyticsEnabled>False</AnalyticsEnabled>' >> /usr/share/nginx/readarr/config/config.xml
echo '</Config>' >> /usr/share/nginx/readarr/config/config.xml
# sqlite3 /usr/share/nginx/readarr/config/readarr.db "insert into RootFolders values ('1','/data/media/Books/','Books','1','1','0','[]','0','','0');"
sqlite3 /usr/share/nginx/readarr/config/readarr.db "DELETE FROM NamingConfig WHERE Id = 1;"
sqlite3 /usr/share/nginx/readarr/config/readarr.db "insert into NamingConfig values ('1','1','{Author Name}','1','{Book Title}/{Author Name} - {Book Title}{ (PartNumber)}');"
sqlite3 /usr/share/nginx/readarr/config/readarr.db "insert into Config values ('6','uilanguage','10');"
sqlite3 /usr/share/nginx/readarr/config/readarr.db "insert into DownloadClients values ('1','1','qBittorrent','QBittorrent','{
\"host\": \"127.0.0.1\",
\"port\": 8080,
\"useSsl\": false,
\"username\": \"admin\",
\"password\": \"adminadmin\",
\"musicCategory\": \"Books\",
\"recentTvPriority\": 0,
\"olderTvPriority\": 0,
\"initialState\": 0
}','QBittorrentSettings','1');"
sqlite3 /usr/share/nginx/readarr/config/readarr.db "insert into DownloadClients values ('2','1','NZBGet','Nzbget','{
\"host\": \"127.0.0.1\",
\"port\": 6789,
\"useSsl\": false,
\"username\": \"admin\",
\"password\": \"adminadmin\",
\"musicCategory\": \"Books\",
\"recentTvPriority\": 0,
\"olderTvPriority\": 0,
\"addPaused\": false
}','NzbgetSettings','1');"
readarr_api=$(xml_grep 'ApiKey' /usr/share/nginx/readarr/config/config.xml --text_only)
配置 prowlarr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
sed -i "s/<UrlBase><\/UrlBase>/<UrlBase>\/prowlarr\/<\/UrlBase>/g" /usr/share/nginx/prowlarr/config/config.xml
sed -i '$d' /usr/share/nginx/prowlarr/config/config.xml
echo ' <AnalyticsEnabled>False</AnalyticsEnabled>' >> /usr/share/nginx/prowlarr/config/config.xml
echo '</Config>' >> /usr/share/nginx/prowlarr/config/config.xml
# 将prowlarr与Sonarr等链接以实现indexers同步
sqlite3 /usr/share/nginx/prowlarr/config/prowlarr.db "insert into Applications values ('1','Sonarr','Sonarr','{
\"prowlarrUrl\": \"http://127.0.0.1:9696\",
\"baseUrl\": \"http://127.0.0.1:8989/sonarr\",
\"apiKey\": \"adminadmin\",
\"syncCategories\": [
5000,
5010,
5020,
5030,
5040,
5045,
5050
],
\"animeSyncCategories\": [
5070
]
}','SonarrSettings','2','[]');"
sqlite3 /usr/share/nginx/prowlarr/config/prowlarr.db "insert into Applications values ('2','Radarr','Radarr','{
\"prowlarrUrl\": \"http://127.0.0.1:9696\",
\"baseUrl\": \"http://127.0.0.1:7878/radarr\",
\"apiKey\": \"adminadmin\",
\"syncCategories\": [
2000,
2010,
2020,
2030,
2040,
2045,
2050,
2060,
2070,
2080
]
}','RadarrSettings','2','[]');"
sqlite3 /usr/share/nginx/prowlarr/config/prowlarr.db "insert into Applications values ('3','Lidarr','Lidarr','{
\"prowlarrUrl\": \"http://127.0.0.1:9696\",
\"baseUrl\": \"http://127.0.0.1:8686/lidarr\",
\"apiKey\": \"adminadmin\",
\"syncCategories\": [
3000,
3010,
3030,
3040,
3050,
3060
]
}','LidarrSettings','2','[]');"
sqlite3 /usr/share/nginx/prowlarr/config/prowlarr.db "insert into Applications values ('4','Readarr','Readarr','{
\"prowlarrUrl\": \"http://127.0.0.1:9696\",
\"baseUrl\": \"http://127.0.0.1:8787/readarr\",
\"apiKey\": \"adminadmin\",
\"syncCategories\": [
3030,
7000,
7010,
7020,
7030,
7040,
7050,
7060
]
}','ReadarrSettings','2','[]');"
sqlite3 /usr/share/nginx/prowlarr/config/prowlarr.db "insert into Tags values ('1','flaresolverr');"
sqlite3 /usr/share/nginx/prowlarr/config/prowlarr.db "insert into IndexerProxies values ('1','FlareSolverr','{
\"host\": \"http://127.0.0.1:8191/\",
\"requestTimeout\": 60
}','FlareSolverr','FlareSolverrSettings','[
1
]');"
sqlite3 /usr/share/nginx/prowlarr/config/prowlarr.db "insert into Config values ('6','uilanguage','10');"
sqlite3 /usr/share/nginx/prowlarr/config/prowlarr.db "insert into DownloadClients values ('1','1','qBittorrent','QBittorrent','{
\"host\": \"127.0.0.1\",
\"port\": 8080,
\"useSsl\": false,
\"username\": \"admin\",
\"password\": \"adminadmin\",
\"category\": \"Others\",
\"priority\": 0,
\"initialState\": 0
}','QBittorrentSettings','1');"
sqlite3 /usr/share/nginx/prowlarr/config/prowlarr.db "insert into DownloadClients values ('2','1','NZBGet','Nzbget','{
\"host\": \"127.0.0.1\",
\"port\": 6789,
\"useSsl\": false,
\"username\": \"admin\",
\"password\": \"adminadmin\",
\"category\": \"Others\",
\"priority\": 0,
\"addPaused\": false
}','NzbgetSettings','1');"
配置 Jackett
1
2
3
4
5
6
7
8
9
10
cat '/usr/share/nginx/jackett/config/Jackett/ServerConfig.json' | jq '.BasePathOverride |= "/jackett/"' >> /usr/share/nginx/jackett/config/Jackett/tmp.json
cp -f /usr/share/nginx/jackett/config/Jackett/tmp.json /usr/share/nginx/jackett/config/Jackett/ServerConfig.json
rm /usr/share/nginx/jackett/config/Jackett/tmp.json
# 因为我们用反向代理,所以关掉这个选项不会有事情
cat '/usr/share/nginx/jackett/config/Jackett/ServerConfig.json' | jq '.AllowExternal |= false' >> /usr/share/nginx/jackett/config/Jackett/tmp.json
cp -f /usr/share/nginx/jackett/config/Jackett/tmp.json /usr/share/nginx/jackett/config/Jackett/ServerConfig.json
rm /usr/share/nginx/jackett/config/Jackett/tmp.json
cat '/usr/share/nginx/jackett/config/Jackett/ServerConfig.json' | jq '.FlareSolverrUrl |= "http://127.0.0.1:8191"' >> /usr/share/nginx/jackett/config/Jackett/tmp.json
cp -f /usr/share/nginx/jackett/config/Jackett/tmp.json /usr/share/nginx/jackett/config/Jackett/ServerConfig.json
rm /usr/share/nginx/jackett/config/Jackett/tmp.json
配置 Bazarr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sed -i "0,/base_url \=/s//base_url \= \/bazarr/g" /usr/share/nginx/bazarr/config/config/config.ini
sed -i '/^\[sonarr\]$/,/^\[/ s/^base_url = \//base_url = \/sonarr\//' /usr/share/nginx/bazarr/config/config/config.ini
# 将Sonarr,Radarr与Bazarr链接
sed -i "/^\[sonarr\]$/,/^\[/ s/^apikey =/apikey = ${sonarr_api}/" /usr/share/nginx/bazarr/config/config/config.ini
sed -i '/^\[radarr\]$/,/^\[/ s/^base_url = \//base_url = \/radarr\//' /usr/share/nginx/bazarr/config/config/config.ini
sed -i "/^\[radarr\]$/,/^\[/ s/^apikey =/apikey = ${radarr_api}/" /usr/share/nginx/bazarr/config/config/config.ini
sed -i '/^\[analytics\]$/,/^\[/ s/^enabled = True/enabled = False/' /usr/share/nginx/bazarr/config/config/config.ini
sed -i "s/use_sonarr = False/use_sonarr = True/g" /usr/share/nginx/bazarr/config/config/config.ini
sed -i "s/use_radarr = False/use_radarr = True/g" /usr/share/nginx/bazarr/config/config/config.ini
sed -i "s/serie_default_enabled = False/serie_default_enabled = True/g" /usr/share/nginx/bazarr/config/config/config.ini
sed -i "s/serie_default_profile =/serie_default_profile = 1/g" /usr/share/nginx/bazarr/config/config/config.ini
sed -i "s/movie_default_enabled = False/movie_default_enabled = True/g" /usr/share/nginx/bazarr/config/config/config.ini
sed -i "s/movie_default_profile =/movie_default_profile = 1/g" /usr/share/nginx/bazarr/config/config/config.ini
sed -i '/^\[assrt\]$/,/^\[/ s/^token =/token = oHwtSNdY1aQe1qwRSZVo70SqNW0Pu1AM/' /usr/share/nginx/bazarr/config/config/config.ini # Assrt站API 5次/分钟
sed -i '/^\[betaseries\]$/,/^\[/ s/^token =/token = ecd1f45f3036/' /usr/share/nginx/bazarr/config/config/config.ini # Betaseries API
# 设置开启的字幕源
sed -i "s/enabled_providers = \[\]/enabled_providers = \['zimuku', 'assrt', 'yifysubtitles', 'betaseries', 'opensubtitlescom', 'supersubtitles', 'tvsubtitles', 'subscenter'\]/g" /usr/share/nginx/bazarr/config/config/config.ini
# 设置字幕语言为简体中文,繁体中文以及英文
sqlite3 /usr/share/nginx/bazarr/config/db/bazarr.db "insert into table_languages_profiles values ('1','','[{\"id\": 1, \"language\": \"zh\", \"audio_exclude\": \"False\", \"hi\": \"False\", \"forced\": \"False\"}, {\"id\": 2, \"language\": \"zt\", \"audio_exclude\": \"False\", \"hi\": \"False\", \"forced\": \"False\"}, {\"id\": 3, \"language\": \"en\", \"audio_exclude\": \"False\", \"hi\": \"False\", \"forced\": \"False\"}]','Chinese','[]','[]');"
Ombi
配置 Ombi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
add_sonarr_ombi(){
cat > "add.sh" << "EOF"
#!/usr/bin/env bash
sqlite3 /usr/share/nginx/ombi/config/OmbiSettings.db "insert into GlobalSettings values ('2','{\"Enabled\":true,\"ApiKey\":\"adminadmin\",\"QualityProfile\":\"1\",\"SeasonFolders\":false,\"RootPath\":\"1\",\"QualityProfileAnime\":\"1\",\"RootPathAnime\":\"2\",\"AddOnly\":false,\"V3\":true,\"LanguageProfile\":2,\"LanguageProfileAnime\":2,\"ScanForAvailability\":false,\"Ssl\":false,\"SubDir\":\"/sonarr\",\"Ip\":\"127.0.0.1\",\"Port\":8989,\"Id\":0}','SonarrSettings');"
EOF
sed -i "s/adminadmin/${sonarr_api}/g" add.sh
bash add.sh
rm add.sh
}
add_radarr_ombi(){
cat > "add.sh" << "EOF"
#!/usr/bin/env bash
sqlite3 /usr/share/nginx/ombi/config/OmbiSettings.db "insert into GlobalSettings values ('3','{\"Enabled\":true,\"ApiKey\":\"adminadmin\",\"DefaultQualityProfile\":\"1\",\"DefaultRootPath\":\"/data/media/movies\",\"AddOnly\":false,\"MinimumAvailability\":\"Announced\",\"ScanForAvailability\":false,\"Ssl\":false,\"SubDir\":\"/radarr\",\"Ip\":\"127.0.0.1\",\"Port\":7878,\"Id\":0}','RadarrSettings');"
EOF
sed -i "s/adminadmin/${radarr_api}/g" add.sh
bash add.sh
rm add.sh
}
add_lidarr_ombi(){
cat > "add.sh" << "EOF"
#!/usr/bin/env bash
sqlite3 /usr/share/nginx/ombi/config/OmbiSettings.db "insert into GlobalSettings values ('4','{\"Enabled\":true,\"ApiKey\":\"adminadmin\",\"DefaultQualityProfile\":\"1\",\"DefaultRootPath\":\"/data/media/Music/\",\"AlbumFolder\":true,\"MetadataProfileId\":1,\"AddOnly\":false,\"Ssl\":false,\"SubDir\":\"/lidarr\",\"Ip\":\"127.0.0.1\",\"Port\":8686,\"Id\":0}','LidarrSettings');"
EOF
sed -i "s/adminadmin/${lidarr_api}/g" add.sh
bash add.sh
rm add.sh
}
# 将Sonarr Radarr Lidarr与Ombi链接
add_sonarr_ombi
add_radarr_ombi
add_lidarr_ombi
# 关闭信息收集并设置语言为中文
sqlite3 /usr/share/nginx/ombi/config/OmbiSettings.db "DELETE FROM GlobalSettings WHERE Id = 1;"
sqlite3 /usr/share/nginx/ombi/config/OmbiSettings.db "insert into GlobalSettings values ('1','{\"BaseUrl\":\"/ombi\",\"CollectAnalyticData\":false,\"Wizard\":false,\"ApiKey\":\"dfbcab4789604b4289b3cdc71aa41bf6\",\"DoNotSendNotificationsForAutoApprove\":false,\"HideRequestsUsers\":false,\"DisableHealthChecks\":false,\"DefaultLanguageCode\":\"zh\",\"AutoDeleteAvailableRequests\":false,\"AutoDeleteAfterDays\":0,\"Branch\":0,\"HasMigratedOldTvDbData\":false,\"Set\":false,\"Id\":1}','OmbiSettings');"
启动系统
命令行配置已完成,是时候启动系统进行图形界面配置了。
1
2
cd /data
docker-compose up -d
等待几秒钟,然后使用浏览器,访问 VPS/NAS 的 IP/域名,逐一访问页面中的链接,确定都能打开再继续。
nginx
配置 Emby
打开链接,进行初始化,文件夹路径按照图中设置即可。
建议电视节目文件夹将 The Movie DB 设为首选。
emby_db
启用 NFO
emby_nfo
勾选这个选项
emby_check
新建 电视节目 文件夹
emby_serise
新建 电影 文件夹
emby_movies
新建 音乐 文件夹
emby_music
新建 书籍 文件夹
emby_books
新建 Emby API
emby_api
配置 Ombi
打开链接,进行初始化,Emby API复制黏贴即可,其余设置如图所示。
ombi_emby
检查 Sonarr 配置
逐一检查配置是否正确,以下图片为正确配置。
重命名配置
sonarr_naming
根目录配置
sonarr_rootfolder
下载客户端配置
sonarr_download
刮削配置
sonarr_metadata
检查 Radarr 配置
逐一检查配置是否正确,以下图片为正确配置。
重命名配置
radarr_naming
根目录配置
radarr_rootfolder
下载客户端配置
radarr_download
刮削配置
radarr_metadata
检查 Lidarr 配置
逐一检查配置是否正确,以下图片为正确配置。
重命名以及根目录配置
lidarr_naming
下载客户端配置
lidarr_download
刮削配置
lidarr_metadata
检查 Readarr 配置
逐一检查配置是否正确,以下图片为正确配置。
Readarr根目录有Bug,无法命令行配置,请手动配置。
重命名以及根目录配置
Readarr_naming
仅需填入名称以及路径,其他不用改。
readarr_config
下载客户端配置
readarr_download
检查 Bazarr 配置
逐一检查配置是否正确,以下图片为正确配置。
字幕语言配置
bazarr_chinese
默认字幕语言配置
bazarr_default
下载字幕源
bazarr_providers
检查 Chinesesubfinder 配置
逐一检查配置是否正确,以下图片为正确配置。
2022.3.19更新:测试证明 Chinesesubfinder 也需要在 Docker-compose 配置文件中将卷目录挂载为 /data 才能正常工作(上文已修正)。
基础配置
chinesesubfinder_basic
电影目录 /data/media/Movies
连续剧目录 /data/media/Series
Emby以及目录映射配置
chinesesubfinder2
Prowlarr / Jackett 配置 indexers
Jackett 同理,不再重复写。
点击Add indexer
prowlarr_index
选择 Base Url ,点击保存。
prowlarr2
有 Cloudflare DDOS 的要加一个 flaresolverr Tag
prowlarr3
检查 qBittorrent 配置
逐一检查配置是否正确,以下图片为正确配置。
检查分类是否正确显示
qbt1
检查公开追踪器是否正常获取
qbt2
检查默认下载位置以及下载模式
qbt3
配置 NZBGet 服务器
输入 Usenet Provider 域名,端口号,用户名以及密码等信息。
请严格按照你的 Usenet Provider的指示填写,图片仅供参考
nzb1
检查分类是否正确
nzb2
2022.3.20 更新:此数值经测试为单个文件的下载连接数,建议不超过 5。
这里的 UrlConnections 请填写与第一张图中 Connections 一样的数值。
nzb3
检查下载位置是否正确
nzb4
检查 Rsshub 配置
如看见下图,则Rsshub已可用。
rsshub
配置 XRAY 透明代理
一个个应用程序配置 http 代理设置太麻烦了(并且不可靠),所以我选择透明代理。
本文仅代理 80 443 563 端口。
总不能有人看到这里了还不会自己下载github release吧?
1
https://github.com/XTLS/Xray-core/releases/
参考systemd配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
Description=Xray Service
Wants=network-online.target
After=network-online.target nss-lookup.target
[Service]
Type=simple
User=root
ExecStart=/etc/xray/xray -c /etc/xray/config.json
TimeoutStopSec=infinity
LimitNOFILE=65536
Restart=always
RestartSec=3s
[Install]
WantedBy=multi-user.target
iptables配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
iptables -t nat -N XRAY
# 直连内网 ip
iptables -t nat -A XRAY -d 192.168.0.0/16 -j RETURN
iptables -t nat -A XRAY -d 10.0.0.0/16 -j RETURN
# 直连 vps ip
iptables -t nat -A XRAY -d {vps ip} -j RETURN
iptables -t nat -A XRAY -p tcp -j RETURN -m mark --mark 0xff
# 仅透明代理 80 443 563 端口
iptables -t nat -A XRAY -p tcp --dport 80 -j REDIRECT --to-ports 12345
iptables -t nat -A XRAY -p tcp --dport 443 -j REDIRECT --to-ports 12345
iptables -t nat -A XRAY -p tcp --dport 563 -j REDIRECT --to-ports 12345
# 其余TCP流量直连
iptables -t nat -A XRAY -p tcp -j RETURN
# 对局域网其他设备进行透明代理
iptables -t nat -A PREROUTING -p tcp -j XRAY
# 对本机进行透明代理
iptables -t nat -A OUTPUT -p tcp -j XRAY
查看iptables情况
1
iptables -t nat -L -v -n
安装 iptables-persistent 使 iptables 重启可用
全选 yes
1
apt-get install iptables-persistent -y
Xray配置
1
2
mkdir /etc/xray
sudo nano /etc/xray/config.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
{
"log": {
"loglevel": "info"
},
"inbounds": [
{
"listen": "127.0.0.1",
"port": 6666,
"protocol": "http", // http 代理
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
],
"metadataOnly": false
},
"allocate": {
"strategy": "always",
"refresh": 5,
"concurrency": 3
}
},
{
"listen": "127.0.0.1",
"port": 1080,
"protocol": "socks", // socks 代理
"udp": true,
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
],
"metadataOnly": false
},
"allocate": {
"strategy": "always",
"refresh": 5,
"concurrency": 3
}
},
{
"port": 12345,
"protocol": "dokodemo-door", // 透明代理
"settings": {
"network": "tcp,udp",
"followRedirect": true
},
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
},
"allocate": {
"strategy": "always",
"refresh": 5,
"concurrency": 3
}
}
],
"outbounds": [
{
"protocol": "trojan", //你的服务器协议
"settings": {
"servers": [
{
"address": "1.1.1.", //你的服务器ip
"port": 443, // 你的服务器端口号
"password": "adminadmin", //你的服务器密码
"level": 0
}]
},
"tag": "proxy",
"streamSettings": {
"network": "tcp", // 你的服务器底层协议
"security": "tls",
"tlsSettings": {
"serverName": "adminadmin.com", //你的服务器域名
"rejectUnknownSni": false,
"allowInsecure": false,
"alpn": ["h2", "http/1.1"],
"minVersion": "1.2",
"maxVersion": "1.3",
"disableSystemRoot": false,
"enableSessionResumption": false
},
"sockopt": {
"mark": 255
}
}
},
{
"protocol": "freedom",
"settings": {},
"tag": "direct",
"streamSettings": {
"sockopt": {
"mark": 255
}
}
},
{
"tag": "blocked",
"protocol": "blackhole",
"settings": {},
"streamSettings": {
"sockopt": {
"mark": 255
}
}
}],
"routing": {
"domainStrategy": "IPIfNonMatch",
"domainMatcher": "mph",
"rules": [
{
"type": "field",
"domain": ["geosite:category-ads"], // 屏蔽广告
"outboundTag": "blocked"
},
{
"type": "field",
"outboundTag": "direct",
"domain": ["geosite:cn"] // 国内直连
},
{
"type": "field",
"outboundTag": "direct",
"ip": ["geoip:cn","geoip:private"] // 内网直连
}
]
}
}
启动 XRAY
1
systemctl enable xray --now
设置 DNS 域名为 1.1.1.1 以及 1.0.0.1
1
2
echo "nameserver 1.1.1.1" > /etc/resolv.conf
echo "nameserver 1.0.0.1" >> /etc/resolv.conf
测试透明代理是否成功
见到如下返回则已成功
1
2
3
4
5
6
7
8
root@debian:~# curl google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
root@debian:~#
配置 Overture 以实现 DNS 国内分流
因为GFWlist以及cniplist太长,写不下,直接放结果,想看的自己去看src。
1
https://raw.githubusercontent.co ... install/overture.sh
安装Overture
1
2
3
curl -LO https://raw.githubusercontent.co ... install/overture.sh
source overture.sh
install_overture
主配置文件 /etc/overture/config.yml
默认走 Cloudflare DOH,国内IP及域名走 DNSPOD DOH。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
bindAddress: :53
debugHTTPAddress: 127.0.0.1:5555
dohEnabled: false
primaryDNS:
- name: Cloudflare
address: https://1.1.1.1/dns-query
protocol: https
socks5Address: 127.0.0.1:1080
timeout: 60
ednsClientSubnet:
policy: disabled
externalIP:
noCookie: true
alternativeDNS:
- name: Dnspod
address: https://doh.pub/dns-query
protocol: https
socks5Address:
timeout: 6
ednsClientSubnet:
policy: disabled
externalIP:
noCookie: true
onlyPrimaryDNS: false
ipv6UseAlternativeDNS: false
alternativeDNSConcurrent: false
whenPrimaryDNSAnswerNoneUse: alternativeDNS
ipNetworkFile:
primary: /etc/overture/ip_network_alternative_sample
alternative: /etc/overture/china_ip_list.txt
domainFile:
primary: /etc/overture/gfw_all_domain.txt
alternative: /etc/overture/chnlist.txt
matcher: /etc/overture/suffix-tree
hostsFile:
hostsFile: /etc/overture/hosts_sample
finder: /etc/overture/full-map
minimumTTL: 0
domainTTLFile: /etc/overture/domain_ttl_sample
cacheSize: 10000
cacheRedisUrl:
cacheRedisConnectionPoolSize:
rejectQType:
- 255
启用分流
1
echo "nameserver 127.0.0.1" > /etc/resolv.conf
测试是否成功
出现以下显示则成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
root@debian:~# nslookup baidu.com
Server: 127.0.0.1
Address: 127.0.0.1#53
Non-authoritative answer:
Name: baidu.com
Address: 220.181.38.148
Name: baidu.com
Address: 220.181.38.251
root@debian:~# nslookup google.com
Server: 127.0.0.1
Address: 127.0.0.1#53
Non-authoritative answer:
Name: google.com
Address: 172.217.31.174
Name: google.com
Address: 2404:6800:4004:824::200e
root@debian:~#
设置 CPU 策略为最佳性能
1
2
apt install cpupower -y
sudo cpupower frequency-set -g performance
查看当前策略
1
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
挂载 SSD 并设置写入缓存
建议使用大容量固态硬盘作为 qBittorrent 以及 NZBGet 的写入缓存。
新增挂载点
1
mkdir /ssd
查看硬件信息,记下 /dev/sda
1
fdisk -l
1
2
3
4
5
Disk /dev/sda: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: ************
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
新增分区
1
cfdisk /dev/sda
选择 gpt
1
2
3
> New -> Primary -> 回车
> Write -> yes
> Quit
使用 Ext4 文件系统格式化
1
mkfs.ext4 /dev/sda
获取硬件 UUID
1
blkid
1
/dev/sda: UUID="8168d321-c245-4846-82dd-a5d79a04550a" BLOCK_SIZE="4096" TYPE="ext4"
修改 /etc/fstab,新增以下内容
1
UUID=359d90df-f17a-42f6-ab13-df13bf356de7 /ssd ext4 errors=remount-ro 0 1
挂载 SSD 至挂载点
1
mount /ssd
查看挂载是否成功
1
2
3
4
root@debian:~# df -hl
...
/dev/sda 916G 20K 916G 1% /ssd # 出现这行就代表成功
...
qBittorrent 配置
qbt4
NZBGet 配置
nzb5
最大化可用空间
ext4 默认有 5% 的预留空间,我们的数据盘和缓存盘不需要这种东西,只有系统盘会需要。
取消预留空间
1
tune2fs -m 0 /dev/sda
开启 BBR 提升网络质量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
cat > '/etc/sysctl.d/99-sysctl.conf' << EOF
net.ipv4.conf.all.route_localnet=1
net.ipv4.ip_forward = 1
net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.default.forwarding = 1
################################
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.default.forwarding = 1
net.ipv6.conf.lo.forwarding = 1
################################
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
################################
net.ipv6.conf.all.accept_ra = 2
net.ipv6.conf.default.accept_ra = 2
################################
net.core.netdev_max_backlog = 100000
net.core.netdev_budget = 50000
net.core.netdev_budget_usecs = 5000
#fs.file-max = 51200
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.core.rmem_default = 67108864
net.core.wmem_default = 67108864
net.core.optmem_max = 65536
net.core.somaxconn = 10000
################################
net.ipv4.icmp_echo_ignore_all = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_rfc1337 = 0
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_max_tw_buckets = 2000000
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
net.ipv4.udp_rmem_min = 8192
net.ipv4.udp_wmem_min = 8192
net.ipv4.tcp_mtu_probing = 0
net.ipv4.tcp_autocorking = 0
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_max_syn_backlog = 30000
net.ipv4.tcp_notsent_lowat = 16384
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_ecn = 2
net.ipv4.tcp_ecn_fallback = 1
net.ipv4.tcp_frto = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
net.ipv4.neigh.default.gc_thresh3=8192
net.ipv4.neigh.default.gc_thresh2=4096
net.ipv4.neigh.default.gc_thresh1=2048
net.ipv6.neigh.default.gc_thresh3=8192
net.ipv6.neigh.default.gc_thresh2=4096
net.ipv6.neigh.default.gc_thresh1=2048
net.ipv4.tcp_max_syn_backlog = 262144
##############################
vm.swappiness = 1
vm.overcommit_memory = 1
#vm.nr_hugepages=1280
kernel.pid_max=64000
net.netfilter.nf_conntrack_max = 262144
net.nf_conntrack_max = 262144
## Enable bbr
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
EOF
sysctl -p
修改最大开启文件数上限
主要是为了避免 Too much open files 的错误。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
cat > '/etc/systemd/system.conf' << EOF
[Manager]
#DefaultTimeoutStartSec=90s
DefaultTimeoutStopSec=30s
#DefaultRestartSec=100ms
DefaultLimitCORE=infinity
DefaultLimitNOFILE=1000000
EOF
cat > '/etc/security/limits.conf' << EOF
root soft nofile 1000000
root hard nofile 1000000
root soft nproc unlimited
root hard nproc unlimited
root soft core unlimited
root hard core unlimited
root hard memlock unlimited
root soft memlock unlimited
* soft nofile 1000000
* hard nofile 1000000
* soft nproc unlimited
* hard nproc unlimited
* soft core unlimited
* hard core unlimited
* hard memlock unlimited
* soft memlock unlimited
EOF
sed -i '/ulimit -SHn/d' /etc/profile
echo "ulimit -SHn 1000000" >> /etc/profile
echo "session required pam_limits.so" >> /etc/pam.d/common-session
systemctl daemon-reload
开启 Upnp/DMZ
开启 Upnp/DMZ 可以极大地加速 BT/PT 下载上传(前提是你有公网IP)。
dmz
DMZ主机IP地址请填你的 NAS 内网地址。
开启 Emby 硬解
Emby 硬解需要 Emby 会员订阅。
emby_tran
我的机器是 Intel 核显,所以把 QuickSync Intel 设为首选。
结语
这个项目花费了我一周的时间才搞定,但是最终的结果确实是值得的。我终于不再需要忍受 Netflix 有限的片源以及 IP 限制啦!
参考资料
利用NAS实现全自动观影追剧
使用jeckett,sonarr,iyuu,qt,emby打造全自动追剧流程
高阶教程-追剧全流程自动化
硬链接教程
使用Sonarr+Jackett+qb/tr+emby实现(基本)全自动追新番
伪射手网
用豆瓣挑电影-你的最佳私人影音助理,订阅追剧满足你的所有幻想
JELLYFIN EMBY PLEX如何打造完美动漫番剧库!
什么是透明代理
Openwrt homelede 3865U开启emby 4K硬解
NEWSGROUP NINJA
RSSHUB文档
Windows最佳动画观看环境配置指南(MPC-HC, madvr, SVP, Anime4K)
最佳私人影音实践教程
从pt到家庭媒体中心全攻略(补充)(用Emby看电视直播,居然比用电视看电视还爽)
第一篇万字长文:围绕透明代理的又一次探究
NZBGet文档
Sonarr Github
Radarr Github
Lidarr Github
Readarr Github
Jackett Github
Prowlarr Github
qBittorrent Github
NZBGet Github
Bazarr Github
Chinesesubfiner Github
原文地址:https://johnrosen1.com/2022/03/18/media/ |
|