这份手册按当前服务器上的实际方案记录。ani-rss 负责 RSS 自动追番、下载、重命名、刮削、上传和通知。
核心工作流:
ani-rss定时刷新订阅源- 发现新种子后推送给
qBittorrent - 下载完成后自动重命名
- 自动刮削,生成
nfo/poster/fanart - 通过
OpenList把视频上传到115 - 上传期间只暂停做种任务,不影响 RSS、下载、刮削和后续任务
- 上传结束后恢复之前暂停的做种任务
ani-rss:当前仓库源码自编译镜像qBittorrent:linuxserver/qbittorrent:5.1.4PeerBanHelper:ghostchu/peerbanhelper:v9.2.5OpenList:宿主机部署,当前是v4.1.10
ani-rss:127.0.0.1:7789qB WebUI / API:127.0.0.1:15768OpenList:127.0.0.1:5244PeerBanHelper:127.0.0.1:9898
/root/docker/
├── ani-rss-config/ # ani-rss 配置、缓存、日志、订阅数据
├── qb/
│ ├── config/ # qB 配置
│ └── downloads/ # 实际下载目录
├── peer/data/ # PeerBanHelper 数据目录
└── OpenList/openlist/ # OpenList 程序和数据目录
当前 OpenList 至少需要这 2 个挂载点:
/115:云盘目标目录,ani-rss上传视频到这里/local:把本地下载目录暴露给 OpenList,供上传通知用fs/copy从本地复制到/115
番剧下载模板:
/downloads/${title}/Season ${season}
剧场版下载模板:
/downloads/${title}
对应宿主机路径:
/root/docker/qb/downloads
当前上传模板:
/115/动漫/${year}/${quarterName}/${weekName}/${title}/Season ${season}
剧场版:
/115/动漫/${year}/${quarterName}/${weekName}/${title}
OpenList 当前不跑容器,直接部署在宿主机。
当前本机结构:
/root/docker/OpenList/openlist/openlist
/root/docker/OpenList/openlist/data/config.json
服务要求:
- 监听
127.0.0.1:5244 - 能通过 API Key 调用接口
- 有
/115云盘存储 - 有
/local本地目录存储,指向/root/docker/qb/downloads
/local 很关键:OpenList 上传通知会把容器内的 /downloads/... 映射成 OpenList 内的 /local/...,然后调用 OpenList 的 fs/copy 把文件复制到 /115/...。
当前实际 docker-compose 片段:
qBittorrent:
image: linuxserver/qbittorrent:5.1.4
container_name: qBittorrent
environment:
- PUID=0
- PGID=0
- WEBUI_PORT=15768
- BT_PORT=34567
- QB_USERNAME=你的用户名
- QB_PASSWORD=你的密码
- TZ=Asia/Shanghai
volumes:
- /root/docker/qb/config:/config
- /root/docker/qb/downloads:/downloads
restart: always
network_mode: host关键设置:
- 默认保存路径:
/downloads/ - 临时目录:
/downloads/incomplete/ Session\AddTorrentStopped=falseSession\QueueingSystemEnabled=falseWebUI\Port=15768Session\GlobalMaxRatio=1Session\GlobalMaxSeedingMinutes=60
注意:ani-rss 通过 qB WebAPI 工作,不依赖 qB 自己的 RSS。
当前实际 docker-compose 片段:
peerbanhelper:
image: ghostchu/peerbanhelper:v9.2.5
container_name: peerbanhelper
restart: unless-stopped
volumes:
- ./peer/data:/app/data
network_mode: host
stop_grace_period: 30sPeerBanHelper 接本机 qB:
- 类型:
qbittorrent - 名称:
anime - 地址:
http://127.0.0.1:15768 - 用户名/密码:qB WebUI 账号
当前服务器已有 Maven 镜像:
maven:3.9-eclipse-temurin-25-libatomic
构建命令:
docker run --rm --network host \
-e CI=true \
-v /root/ani-rss:/workspace \
-v /root/.m2:/root/.m2 \
-w /workspace \
maven:3.9-eclipse-temurin-25-libatomic \
mvn -B -DskipTests package --file pom.xmldocker build -f /root/ani-rss/docker/Dockerfile \
-t ani-rss:custom \
/root/ani-rss当前这台机器上实际跑的是 host 网络方案:
version: "3"
services:
ani-rss:
image: ani-rss:custom
container_name: ani-rss
volumes:
- /root/docker/ani-rss-config:/config
- /root/docker/qb/downloads:/downloads
- /root/docker/qb/downloads:/root/docker/qb/downloads
restart: unless-stopped
network_mode: host
environment:
- TZ=Asia/Shanghai
- SERVER_ADDRESS=127.0.0.1
- SERVER_PORT=7789
- CONFIG=/config
- SWAGGER_ENABLED=false
- JAVA_TOOL_OPTIONS=-XX:+IgnoreUnrecognizedVMOptions -XX:+IdleTuningGcOnIdle -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv6Addresses=false
qBittorrent:
image: linuxserver/qbittorrent:5.1.4
container_name: qBittorrent
environment:
- PUID=0
- PGID=0
- WEBUI_PORT=15768
- BT_PORT=34567
- QB_USERNAME=你的用户名
- QB_PASSWORD=你的密码
- TZ=Asia/Shanghai
volumes:
- /root/docker/qb/config:/config
- /root/docker/qb/downloads:/downloads
restart: always
network_mode: host
peerbanhelper:
image: ghostchu/peerbanhelper:v9.2.5
container_name: peerbanhelper
restart: unless-stopped
volumes:
- ./peer/data:/app/data
network_mode: host
stop_grace_period: 30s启动:
docker compose -f /root/docker/docker-compose.yml up -d下载工具: qBittorrent
地址: http://127.0.0.1:15768
qb保存路径: 关闭
保存位置: /downloads/${title}/Season ${season}
剧场版保存位置: /downloads/${title}
自动重命名: 开启
重命名间隔: 10 秒
重命名模板: [${subgroup}] ${title} S${seasonFormat}E${episodeFormat}
失败重试次数: 3
延迟下载: 0
同时下载限制: 0
RSS轮询间隔: 30 分钟
TMDB: 开启
TMDB语言: zh-CN
TMDB标题: 开启
自动刮削: 开启
只下载最新集: 开启
缺集检测只读取当前订阅种子目录下的 .episode 标记,并判断现有最小集到最大集之间是否连续;它不再用 RSS 条目推断缺集,也不会因为缺集检测主动下载旧集。
在 通知设置 里新增一条 OPEN_LIST_UPLOAD:
类型: OPEN_LIST_UPLOAD
启用: 开启
触发状态: DOWNLOAD_END
Host: http://127.0.0.1:5244
ApiKey: 你的 OpenList API Key
上传位置: /115/动漫/${year}/${quarterName}/${weekName}/${title}/Season ${season}
上传位置(剧场版): /115/动漫/${year}/${quarterName}/${weekName}/${title}
本地路径前缀: /downloads
OpenList 本地挂载: /local
上传完成后删除本地文件: 关闭
删除旧的同集文件: 按需开启
这条通知负责把本地下载完成的视频从 /local/... 复制到 /115/...。
当前这套方案实际使用:
- Web 登录用户名密码
- API Key
禁止多端登录 = 开启如果 IP 发生改变登录将失效 = 开启
建议:
- README 里不要保留明文密码或 API Key
- 对外暴露时,至少把
ani-rss、qB、OpenList放在反代后面 - 如果只本机访问,保持
127.0.0.1监听更安全
确认能访问:
http://127.0.0.1:5244
并且根目录能看到:
/115/local
确认能访问:
http://127.0.0.1:15768
并且下载目录是:
/downloads
确认能访问:
http://127.0.0.1:7789
在 下载设置 里测试 qB 登录通过,在 通知设置 里测试 OpenList 上传配置无误。
找一部新番做完整测试,确认:
- RSS 检测到新种子
- qB 出现下载任务
- 下载完成后文件被重命名
- 下载目录出现
nfo/poster/fanart - OpenList
/115/...下出现上传后的视频 - 上传结束后暂停的做种任务恢复
如果 qB 看到的是 /downloads,ani-rss 看到的是别的路径,后续重命名、刮削、上传都会错。
没有 /local,OpenList 上传通知无法把本地文件复制到 /115。
如果模板不保留 S${seasonFormat}E${episodeFormat} 或 S${season}E${episode},很多后续能力都会出问题,包括:
- 刮削识别
- 旧集替换
- 同集判断
ani-rss:
host: http://127.0.0.1:7789
config_dir: /root/docker/ani-rss-config
download_tool: qBittorrent
download_tool_host: http://127.0.0.1:15768
download_path_template: /downloads/${title}/Season ${season}
rename_template: [${subgroup}] ${title} S${seasonFormat}E${episodeFormat}
rss_sleep_minutes: 30
rename_sleep_seconds: 10
tmdb: true
tmdb_language: zh-CN
scrape: true
upload: true
openlist:
host: http://127.0.0.1:5244
root_storages:
- /115
- /local
openlist_upload_notification:
type: OPEN_LIST_UPLOAD
status: DOWNLOAD_END
path: /115/动漫/${year}/${quarterName}/${weekName}/${title}/Season ${season}
ova_path: /115/动漫/${year}/${quarterName}/${weekName}/${title}
local_path_prefix: /downloads
local_openlist_path_prefix: /local
qbittorrent:
host: http://127.0.0.1:15768
save_path: /downloads
temp_path: /downloads/incomplete
peerbanhelper:
host: http://127.0.0.1:9898
downloader_endpoint: http://127.0.0.1:15768
当前方案的核心只有 4 条:
OpenList跑宿主机,不跑容器OpenList挂出/115和/localqB和ani-rss共用同一套/downloads路径ani-rss开启刮削和 OpenList 上传