JAVClub / core

🔞 JAVClub - 让你的大姐姐不再走丢

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

希望更详细一点的 Workers & Fetcher 配置描述

monsterxcn opened this issue · comments

折腾了一天将全套系统部署完了,fetch 了 OneJAV 的几部影片到本地后成功 move 到 rclone 挂载的 Google Drive ,网页登陆也可以看到云端硬盘中的文件,可 WebUI 显示有一个硬盘但是没有视频。

不知道是因为我用的是云端共享硬盘还是因为配置错了 QAQ 。fetcher lemp core 全部使用 Docker 部署,以下是我的部分配置过程:

core

关于 core 中说要用到 client_id client_secret access_token refresh_token ,但是我并不知道是在哪里用的... rclone 在服务器挂载硬盘时倒是有需要 client_id client_secret ,然后点链接授权之后返回了 access_token refresh_token 。之后本地挂载和文件 move 都正常。

然后在数据库导入 drives 表数据时说明是这样的:

INSERT INTO `drivers` (`id`, `name`, `driverType`, `driverData`, `isEnable`, `createTime`, `updateTime`) VALUES
(1, '1', 'gd', 
'{\"oAuth\":
    {\"client_id\":\"【your_client_here】\",
    \"client_secret\":\"【your_client_secret_here】\",
    \"redirect_uri\":\"urn:ietf:wg:oauth:2.0:oob\",
    \"token\":
        {\"access_token\":\"【your_access_token_here_optional】\", 
        \"refresh_token\":\"【your_refresh_token_here】\",
        \"scope\":\"https://www.googleapis.com/auth/drive\",
        \"token_type\":\"Bearer\",
        \"expiry_date\":1583679345619}},
    \"drive\":{\"driveId\":\"【your_drive_or_folder_id_here】\"},
    \"encryption\":
        {\"secret\":\"【path_ase_secret】\",
        \"server\":\"【your_gd_proxy_server_here】"}}',
1, '【timestanp_in_ms_here】', '【timestanp_in_ms_here】');

嗯,好的,我按照 rclone 挂载时的 client_id client_secret access_token refresh_token 填好了,后面的 driveId 我填的是 https://drive.google.com/drive/folders/【id】 这里后面的文件夹 id 。

然后 secret 我就不知道是什么了 QAQ 。我将部署 google drive workers 时要填的 aes_password 填了进去。

workers

workers 里面的 gd-config.js 中要填 aes_password client_id client_secret refresh_token ,后三个我将 rclone 挂载的时候那几个对应 client_id client_secret refresh_token 填进去了, aes_password emmm... 不知道是啥,我就把 access_token 填了进去,webpack 构建完后部署到 workers.dev 了。

以上就是我认为可能出错的地方了,如果还有什么要补充的细节请提。霖大有时间的话救救孩子!蟹蟹了


我尝试将 AES 加密的密码填在 workers gd-config.js 的 aes_password ,修改 drivers 数据表中的 【path_ase_secret】 为 AES 加密后的谷歌盘文件夹 id ,然后更新 core 容器编排,但是好像也不对 QAQ

首先感谢能花费那么多时间来踩坑

  • 没有视频显示
    在 core 的配置中有没有设定定时任务呢?(就是 importer 中 cron那项

  • secret 和 aes_password
    这里可能的确有点误导,这两个是同一个东西,后续会考虑统一说法

别的步骤看起来都没有什么问题,如果还有什么问题可以把 log level 开到 debug 将错误日志附上来

core 的 dev.json 是按照默认的:

"cron": [
    {
        "driveId": 1,
        "interval": 36000000,
        "doFull": true
    }
]

文件我都是手动 rclone move 到谷歌盘,不知道这个自动任务是怎么用 ...

docker loglevel 一直是 debug ,日志写了一大堆 233 ,core 的日志:

{"log":"\u001b[36m[2020-05-02T16:44:23.094] [DEBUG] Module: Cache - \u001b[39m[api_checktoken_sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:23.095020795Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.095] [DEBUG] Module: User - \u001b[39mChecking token sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5\n","stream":"stdout","time":"2020-05-02T08:44:23.153415678Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.099] [DEBUG] Module: Cache - \u001b[39m[api_checktoken_sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:23.153443417Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.099] [DEBUG] Module: User - \u001b[39mChecking token sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5\n","stream":"stdout","time":"2020-05-02T08:44:23.153447963Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.136] [DEBUG] Module: Cache - \u001b[39m[api_checktoken_sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:23.15345172Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.136] [DEBUG] Module: User - \u001b[39mChecking token sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5\n","stream":"stdout","time":"2020-05-02T08:44:23.153455416Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.541] [DEBUG] Module: Cache - \u001b[39m[api_checktoken_sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:23.541665679Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.541] [DEBUG] Module: User - \u001b[39mChecking token sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5\n","stream":"stdout","time":"2020-05-02T08:44:23.541793979Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.542] [DEBUG] Module: Cache - \u001b[39m[api_checktoken_sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:23.543192844Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.543] [DEBUG] Module: User - \u001b[39mChecking token sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5\n","stream":"stdout","time":"2020-05-02T08:44:23.543218593Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.658] [DEBUG] API: Main - \u001b[39m[UID: 1] GET /api/statistic/getData\n","stream":"stdout","time":"2020-05-02T08:44:23.65903812Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.659] [DEBUG] Module: Cache - \u001b[39m[api_statistic] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:23.659307678Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.661] [DEBUG] API: Main - \u001b[39m[UID: 1] GET /api/metadata/getList/1/20\n","stream":"stdout","time":"2020-05-02T08:44:23.661275559Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.661] [DEBUG] API: Metadata - \u001b[39mPage 1, size 20\n","stream":"stdout","time":"2020-05-02T08:44:23.66155576Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.661] [DEBUG] Module: Cache - \u001b[39m[api_metadata_list_1_20] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:23.661648199Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.665] [DEBUG] API: Main - \u001b[39m[UID: 1] GET /api/auth/check\n","stream":"stdout","time":"2020-05-02T08:44:23.666047909Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.671] [DEBUG] API: Main - \u001b[39m[UID: 1] GET /api/statistic/getData\n","stream":"stdout","time":"2020-05-02T08:44:23.671827449Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.671] [DEBUG] Module: Cache - \u001b[39m[api_statistic] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:23.67198189Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.677] [DEBUG] API: Main - \u001b[39m[UID: 1] GET /api/auth/check\n","stream":"stdout","time":"2020-05-02T08:44:23.677995665Z"}
{"log":"\u001b[36m[2020-05-02T16:44:30.051] [DEBUG] API: Main - \u001b[39m[UID: 1] GET /api/metadata/getMetaList/series/1/50\n","stream":"stdout","time":"2020-05-02T08:44:30.051452161Z"}
{"log":"\u001b[36m[2020-05-02T16:44:30.051] [DEBUG] API: Metadata - \u001b[39mType series, page 1, size 50\n","stream":"stdout","time":"2020-05-02T08:44:30.051640628Z"}
{"log":"\u001b[36m[2020-05-02T16:44:30.051] [DEBUG] Module: Cache - \u001b[39m[api_meta_list_series_1_50] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:30.05172411Z"}
{"log":"\u001b[36m[2020-05-02T16:44:32.825] [DEBUG] API: Main - \u001b[39m[UID: 1] GET /api/metadata/getMetaList/star/1/50\n","stream":"stdout","time":"2020-05-02T08:44:32.825485242Z"}
{"log":"\u001b[36m[2020-05-02T16:44:32.825] [DEBUG] API: Metadata - \u001b[39mType star, page 1, size 50\n","stream":"stdout","time":"2020-05-02T08:44:32.825633323Z"}
{"log":"\u001b[36m[2020-05-02T16:44:32.825] [DEBUG] Module: Cache - \u001b[39m[api_meta_list_stars_1_50] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:32.825786876Z"}
{"log":"\u001b[36m[2020-05-02T16:44:33.723] [DEBUG] API: Main - \u001b[39m[UID: 1] GET /api/metadata/getMetaList/tag/1/50\n","stream":"stdout","time":"2020-05-02T08:44:33.723378189Z"}
{"log":"\u001b[36m[2020-05-02T16:44:33.723] [DEBUG] API: Metadata - \u001b[39mType tag, page 1, size 50\n","stream":"stdout","time":"2020-05-02T08:44:33.723482056Z"}
{"log":"\u001b[36m[2020-05-02T16:44:33.723] [DEBUG] Module: Cache - \u001b[39m[api_meta_list_tags_1_50] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:33.72349004Z"}
{"log":"\u001b[36m[2020-05-02T16:44:34.403] [DEBUG] API: Main - \u001b[39m[UID: 1] GET /api/bookmark/getList\n","stream":"stdout","time":"2020-05-02T08:44:34.40339052Z"}
{"log":"\u001b[36m[2020-05-02T16:44:35.017] [DEBUG] API: Main - \u001b[39m[UID: 1] GET /api/metadata/getList/1/20\n","stream":"stdout","time":"2020-05-02T08:44:35.01784188Z"}
{"log":"\u001b[36m[2020-05-02T16:44:35.017] [DEBUG] API: Metadata - \u001b[39mPage 1, size 20\n","stream":"stdout","time":"2020-05-02T08:44:35.017994494Z"}
{"log":"\u001b[36m[2020-05-02T16:44:40.257] [DEBUG] API: Main - \u001b[39m[UID: 1] GET /api/statistic/getData\n","stream":"stdout","time":"2020-05-02T08:44:40.258310593Z"}
{"log":"\u001b[36m[2020-05-02T16:44:40.258] [DEBUG] Module: Cache - \u001b[39m[api_statistic] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:40.258436294Z"}
{"log":"\u001b[36m[2020-05-02T16:44:58.041] [DEBUG] Module: Cache - \u001b[39mExpired cache api_statistic cleared\n","stream":"stdout","time":"2020-05-02T08:44:58.042538495Z"}
{"log":"\u001b[36m[2020-05-02T16:45:58.043] [DEBUG] Module: Cache - \u001b[39mExpired cache api_checktoken_sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5 cleared\n","stream":"stdout","time":"2020-05-02T08:45:58.047838368Z"}
{"log":"\u001b[36m[2020-05-02T16:45:58.047] [DEBUG] Module: Cache - \u001b[39mExpired cache api_metadata_list_1_20 cleared\n","stream":"stdout","time":"2020-05-02T08:45:58.048441297Z"}
{"log":"\u001b[36m[2020-05-02T16:45:58.048] [DEBUG] Module: Cache - \u001b[39mExpired cache api_meta_list_series_1_50 cleared\n","stream":"stdout","time":"2020-05-02T08:45:58.048505121Z"}
{"log":"\u001b[36m[2020-05-02T16:45:58.048] [DEBUG] Module: Cache - \u001b[39mExpired cache api_meta_list_stars_1_50 cleared\n","stream":"stdout","time":"2020-05-02T08:45:58.048747348Z"}
{"log":"\u001b[36m[2020-05-02T16:45:58.048] [DEBUG] Module: Cache - \u001b[39mExpired cache api_meta_list_tags_1_50 cleared\n","stream":"stdout","time":"2020-05-02T08:45:58.048795901Z"}

说起看日志我想起来 fetcher 一直在不停的 restart ,我删掉了 mt rss 的源只留了 OneJAV 的源,毕竟 mt 账号看起来... fetcher 配置这块是这样写的,其他地方没有修改:

    "remote": [
        {
            "driver": "OneJAV",
            "url": "https://onejav.com/new/"
        },{
            "driver": "OneJAV",
            "url": "https://onejav.com/popular/"
        },{
            "driver": "OneJAV",
            "url": "https://onejav.com/random/"
        }
    ]

qBittorrent WebUI 正常,自动抓取 OneJAV 好像失败了,我在 8585 端口的面板上手动添加 .torrent 地址下载。附上 fetcher 的日志:

{"log":"    ^\n","stream":"stderr","time":"2020-05-02T09:33:52.742082913Z"}
{"log":"\n","stream":"stderr","time":"2020-05-02T09:33:52.742087279Z"}
{"log":"Error: Configuration property \"system.logLevel\" is not defined\n","stream":"stderr","time":"2020-05-02T09:33:52.742091512Z"}
{"log":"    at Config.get (/usr/app/node_modules/config/lib/config.js:182:11)\n","stream":"stderr","time":"2020-05-02T09:33:52.742096032Z"}
{"log":"    at module.exports (/usr/app/src/module/logger.js:6:27)\n","stream":"stderr","time":"2020-05-02T09:33:52.742100539Z"}
{"log":"    at Object.\u003canonymous\u003e (/usr/app/src/module/qbittorrent.js:2:35)\n","stream":"stderr","time":"2020-05-02T09:33:52.742104866Z"}
{"log":"    at Module._compile (internal/modules/cjs/loader.js:1151:30)\n","stream":"stderr","time":"2020-05-02T09:33:52.742109839Z"}
{"log":"    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1171:10)\n","stream":"stderr","time":"2020-05-02T09:33:52.74211435Z"}
{"log":"    at Module.load (internal/modules/cjs/loader.js:1000:32)\n","stream":"stderr","time":"2020-05-02T09:33:52.74211899Z"}
{"log":"    at Function.Module._load (internal/modules/cjs/loader.js:899:14)\n","stream":"stderr","time":"2020-05-02T09:33:52.742123395Z"}
{"log":"    at Module.require (internal/modules/cjs/loader.js:1040:19)\n","stream":"stderr","time":"2020-05-02T09:33:52.742127799Z"}
{"log":"    at require (internal/modules/cjs/helpers.js:72:18)\n","stream":"stderr","time":"2020-05-02T09:33:52.742132051Z"}
{"log":"    at Object.\u003canonymous\u003e (/usr/app/src/handle/init.js:5:12)\n","stream":"stderr","time":"2020-05-02T09:33:52.742136205Z"}
{"log":"WARNING: NODE_ENV value of 'dev' did not match any deployment config file names.\n","stream":"stderr","time":"2020-05-02T09:34:54.2248761Z"}
{"log":"WARNING: See https://github.com/lorenwest/node-config/wiki/Strict-Mode\n","stream":"stderr","time":"2020-05-02T09:34:54.225272509Z"}
{"log":"WARNING: No configurations found in configuration directory:/usr/app/config/\n","stream":"stderr","time":"2020-05-02T09:34:54.225369699Z"}
{"log":"WARNING: To disable this warning set SUPPRESS_NO_CONFIG_WARNING in the environment.\n","stream":"stderr","time":"2020-05-02T09:34:54.225377256Z"}
{"log":"/usr/app/node_modules/config/lib/config.js:182\n","stream":"stderr","time":"2020-05-02T09:34:54.322909029Z"}
{"log":"    throw new Error('Configuration property \"' + property + '\" is not defined');\n","stream":"stderr","time":"2020-05-02T09:34:54.322951291Z"}
{"log":"    ^\n","stream":"stderr","time":"2020-05-02T09:34:54.322955051Z"}
{"log":"\n","stream":"stderr","time":"2020-05-02T09:34:54.322957721Z"}
{"log":"Error: Configuration property \"system.logLevel\" is not defined\n","stream":"stderr","time":"2020-05-02T09:34:54.322960108Z"}
{"log":"    at Config.get (/usr/app/node_modules/config/lib/config.js:182:11)\n","stream":"stderr","time":"2020-05-02T09:34:54.32296269Z"}
{"log":"    at module.exports (/usr/app/src/module/logger.js:6:27)\n","stream":"stderr","time":"2020-05-02T09:34:54.322965293Z"}
{"log":"    at Object.\u003canonymous\u003e (/usr/app/src/module/qbittorrent.js:2:35)\n","stream":"stderr","time":"2020-05-02T09:34:54.322978267Z"}
{"log":"    at Module._compile (internal/modules/cjs/loader.js:1151:30)\n","stream":"stderr","time":"2020-05-02T09:34:54.322981421Z"}
{"log":"    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1171:10)\n","stream":"stderr","time":"2020-05-02T09:34:54.322983868Z"}
{"log":"    at Module.load (internal/modules/cjs/loader.js:1000:32)\n","stream":"stderr","time":"2020-05-02T09:34:54.322993614Z"}
{"log":"    at Function.Module._load (internal/modules/cjs/loader.js:899:14)\n","stream":"stderr","time":"2020-05-02T09:34:54.322998876Z"}
{"log":"    at Module.require (internal/modules/cjs/loader.js:1040:19)\n","stream":"stderr","time":"2020-05-02T09:34:54.323002249Z"}
{"log":"    at require (internal/modules/cjs/helpers.js:72:18)\n","stream":"stderr","time":"2020-05-02T09:34:54.323004759Z"}
{"log":"    at Object.\u003canonymous\u003e (/usr/app/src/handle/init.js:5:12)\n","stream":"stderr","time":"2020-05-02T09:34:54.32300726Z"}

日志很多都是重复的我就截取了重复的部分,应该没有遗漏什么

core的日志你截取的都是网站的访问日志而不是importer的日志,可以试试加上 grep Importer 试试,可以先关闭再启动并等待一分钟左右即可看到相关日志

然后fetcher不启动的原因看起来是找不到配置文件,可以检查一下是否已经改名成dev.json并在启动语句前加上 NODE_ENV=dev来让程序寻找到dev.json

关于定时任务的作用就是从Google Drive中读取视频信息并导入到core的数据库中

另外想问一句你上传到网盘的数据有没有经过fetcher处理.... (毕竟看你fetcher都没正常运行
core导入的一定是要fetcher处理过的才行,不是随便一个视频都可以的

啊,那原来是我没有 fetcher 处理就上传到网盘了(逃...

fetcher 找不到那个可能是我按照教程复制 dev.json 文件的位置错了吗我看看,docker fetcher 的说明:

cp config/dev.example.json dev.json

我试试在 config 文件夹创建 dev.json

不太熟悉 Docker,emmm... Importer 日志像这样,这是没连接上数据库🐎:

root@msvultr2020:~/JAVClub_core# docker logs e928dcbda9fa | grep Importer
This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason:
Error: ER_BAD_DB_ERROR: Unknown database 'javclub'
    at Handshake.Sequence._packetToError (/usr/app/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)
    at Handshake.ErrorPacket (/usr/app/node_modules/mysql/lib/protocol/sequences/Handshake.js:123:18)
    at Protocol._parsePacket (/usr/app/node_modules/mysql/lib/protocol/Protocol.js:291:23)
    at Parser._parsePacket (/usr/app/node_modules/mysql/lib/protocol/Parser.js:433:10)
    at Parser.write (/usr/app/node_modules/mysql/lib/protocol/Parser.js:43:10)
    at Protocol.write (/usr/app/node_modules/mysql/lib/protocol/Protocol.js:38:16)
    at Socket.<anonymous> (/usr/app/node_modules/mysql/lib/Connection.js:88:28)
    at Socket.<anonymous> (/usr/app/node_modules/mysql/lib/Connection.js:526:10)
    at Socket.emit (events.js:321:20)
    at Socket.EventEmitter.emit (domain.js:485:12)
    --------------------
    at Protocol._enqueue (/usr/app/node_modules/mysql/lib/protocol/Protocol.js:144:48)
    at Protocol.handshake (/usr/app/node_modules/mysql/lib/protocol/Protocol.js:51:23)
    at Connection.connect (/usr/app/node_modules/mysql/lib/Connection.js:116:18)
    at /usr/app/node_modules/knex/lib/dialects/mysql/index.js:68:18
[2020-05-02T11:41:57.960] [DEBUG] Importer: Main - Config: [ { driveId: 1, interval: 36000000, doFull: true } ]
    at new Promise (<anonymous>)
    at Client_MySQL.acquireRawConnection (/usr/app/node_modules/knex/lib/dialects/mysql/index.js:63:12)
    at create (/usr/app/node_modules/knex/lib/client.js:289:39)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)

我去试了下,好像还真是 dev.json 位置不对,教程把 dev.json 复制到 fetcher 根目录去了 233

现在 fetcher 日志:

[2020-05-02T10:43:46.494] [DEBUG] Handle: Init - [Check torrent status] Starting job
[2020-05-02T10:43:46.494] [INFO] Module: Qbittorrent - Getting torrent list
[2020-05-02T10:43:46.494] [DEBUG] Module: Qbittorrent - GET /api/v2/torrents/info?limit=5&category=JAVClub&filter=paused&sort=completion_on&reverse=true
[2020-05-02T10:43:46.494] [DEBUG] Module: Qbittorrent - GET data:  {
  method: 'GET',
  headers: { Cookie: 'SID=DbuXc2TO8HDajgFE2edemARvVJ48G7W8' }
}
[2020-05-02T10:43:46.499] [DEBUG] Module: Qbittorrent - POST response body Response {
  size: 0,
  timeout: 0,
  [Symbol(Body internals)]: {
    body: PassThrough {
      _readableState: [ReadableState],
      readable: true,
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      _writableState: [WritableState],
      writable: false,
      allowHalfOpen: true,
      _transformState: [Object],
      [Symbol(kCapture)]: false
    },
    disturbed: false,
    error: null
  },
  [Symbol(Response internals)]: {
    url: 'http://qbittorrent:8585/api/v2/torrents/createCategory',
    status: 409,
    statusText: 'Conflict',
    headers: Headers { [Symbol(map)]: [Object: null prototype] },
    counter: 0
  }
}
[2020-05-02T10:43:46.499] [INFO] Pull: Init - [Download queue] Job finished, setting timer
[2020-05-02T10:43:46.500] [DEBUG] Module: Qbittorrent - GET response body []
[2020-05-02T10:43:46.500] [INFO] Handle: Init - [Check torrent status] Job finished, setting timer

core 日志:

[2020-05-02T18:13:11.480] [INFO] Stack - Stack created
[2020-05-02T18:13:11.500] [DEBUG] Importer: Main - Config: [ { driveId: 1, interval: 36000000, doFull: true } ]
[2020-05-02T18:13:11.500] [INFO] Stack - Creating Instance 1
[2020-05-02T18:13:11.502] [INFO] API: Main - JAVClub core is listening on port 3000!
[2020-05-02T18:13:11.604] [DEBUG] Stack - RowDataPacket {
  id: 1,
  name: '1',
  driverType: 'gd',
  driverData: '{"oAuth":{"client_id":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","client_secret":"xxxxxxxxxxxxxxxxxxxxx","redirect_uri":"urn:ietf:wg:oauth:2.0:oob","token":{"access_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","refresh_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","scope":"https://www.googleapis.com/auth/drive","token_type":"Bearer","expiry_date":1583679345619}},"drive":{"driveId":"xxxxxxxxxxx"},"encryption":{"secret":"xxxxxxxxxxxxxx","server":"https://mv-gd.msx.workers.dev"}}',
  isEnable: 1,
  createTime: '1588363401',
  updateTime: '1588363401'
}
[2020-05-02T18:13:11.606] [DEBUG] Driver[1]: Google Drive - Token expiry date 1583679345619
[2020-05-02T18:13:11.606] [INFO] Driver[1]: Google Drive - Refreshing access token
(node:1) [google-auth-library:DEP007] DeprecationWarning: The `refreshAccessToken` method has been deprecated, and will be removed in the 3.0 release of google-auth-library. Please use the `getRequestHeaders` method instead.
[2020-05-02T18:13:11.765] [INFO] Driver[1]: Google Drive - Got access token
[2020-05-02T18:13:11.766] [DEBUG] Driver[1]: Google Drive - {
  access_token: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  scope: 'https://www.googleapis.com/auth/drive',
  token_type: 'Bearer',
  expiry_date: 1588417990765,
  refresh_token: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
}
[2020-05-02T18:13:11.766] [INFO] Importer: GD 1 - Got drive instance
[2020-05-02T18:13:11.774] [INFO] Importer: Main - [1] Ready in 32 seconds
[2020-05-02T18:13:43.777] [INFO] Importer: Main - [1] Starting first time import process
[2020-05-02T18:13:43.778] [INFO] Importer: GD 1 - Starting process of import, full = true
[2020-05-02T18:13:43.778] [INFO] Driver[1]: Google Drive - Getting full file list of keyword name='info.json'
[2020-05-02T18:13:43.779] [DEBUG] Driver[1]: Google Drive - Getting page 1
[2020-05-02T18:13:44.102] [INFO] Driver[1]: Google Drive - Got 0 files' metadatas
[2020-05-02T18:13:44.102] [INFO] Importer: GD 1 - Got info.json file list
[2020-05-02T18:13:44.102] [INFO] Importer: GD 1 - All Promise settled
[2020-05-02T18:13:44.102] [INFO] Importer: Main - [1] First time import process fininshed
[2020-05-02T18:13:44.102] [DEBUG] Importer: Main - [1] Cron set, 36000000ms
[2020-05-02T18:18:52.141] [DEBUG] Module: Cache - [api_checktoken_sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5] Cache missed, creating one
[2020-05-02T18:18:52.142] [DEBUG] Module: User - Checking token sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5
[2020-05-02T18:18:52.166] [DEBUG] API: Main - [UID: 1] GET /api/auth/check
[2020-05-02T18:18:52.310] [DEBUG] API: Main - [UID: 1] GET /api/statistic/getData
[2020-05-02T18:18:52.311] [DEBUG] Module: Cache - [api_statistic] Cache missed, creating one
[2020-05-02T18:19:10.566] [DEBUG] Module: Cache - Expired cache api_statistic cleared
[2020-05-02T18:20:10.567] [DEBUG] Module: Cache - Expired cache api_checktoken_sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5 cleared

我觉得我需要等几天再看有没有数据了

Unknown database 'javclub' 写得挺明白了的吧...

数据的话你就等fetcher处理完第一个种子然后把sync目录里面的所有东西上传到网盘里就可以了

数据库的问题我已经检查了,那个找不到数据库应该是之前启动的时候没有先启动 lemp ,日志也记录了我没删。后来我清空日志重新编排了容器,core 日志中没有数据库的报错了。现在数据库是没问题的了,但 fetcher 对 http://qbittorrent:8585/api/v2/torrents/createCategory 发起请求的响应一直都是 409 错误。fetcher/tmp 的 downloads sync 目录下无内容。fetcher 的日志内容如下:

2020-05-04T03:14:33.511655019Z [2020-05-04T03:14:33.511] [DEBUG] Handle: Init - [Check torrent status] Starting job
2020-05-04T03:14:33.511721393Z [2020-05-04T03:14:33.511] [INFO] Module: Qbittorrent - Getting torrent list
2020-05-04T03:14:33.511946559Z [2020-05-04T03:14:33.511] [DEBUG] Module: Qbittorrent - GET /api/v2/torrents/info?limit=5&category=JAVClub&filter=paused&sort=completion_on&reverse=true
2020-05-04T03:14:33.512026522Z [2020-05-04T03:14:33.511] [DEBUG] Module: Qbittorrent - GET data:  {
2020-05-04T03:14:33.512043878Z   method: 'GET',
2020-05-04T03:14:33.512048181Z   headers: { Cookie: 'SID=RLNLgyGTTFfwgbhrwK1mxm/WD8o520p1' }
2020-05-04T03:14:33.512051822Z }
2020-05-04T03:14:33.512673306Z [2020-05-04T03:14:33.512] [DEBUG] Pull: Init - [Download queue] Starting job
2020-05-04T03:14:33.512932456Z [2020-05-04T03:14:33.512] [INFO] Module: Qbittorrent - Adding category JAVClub
2020-05-04T03:14:33.512945841Z [2020-05-04T03:14:33.512] [DEBUG] Module: Qbittorrent - POST /api/v2/torrents/createCategory
2020-05-04T03:14:33.512949872Z [2020-05-04T03:14:33.512] [DEBUG] Module: Qbittorrent - POST data:  {
2020-05-04T03:14:33.512953383Z   method: 'POST',
2020-05-04T03:14:33.512956633Z   body: URLSearchParams { 'category' => 'JAVClub', 'savePath' => 'JAVClub' },
2020-05-04T03:14:33.512960156Z   headers: { Cookie: 'SID=RLNLgyGTTFfwgbhrwK1mxm/WD8o520p1' }
2020-05-04T03:14:33.512963567Z }
2020-05-04T03:14:33.514702086Z [2020-05-04T03:14:33.514] [DEBUG] Module: Qbittorrent - GET response body []
2020-05-04T03:14:33.514733031Z [2020-05-04T03:14:33.514] [INFO] Handle: Init - [Check torrent status] Job finished, setting timer
2020-05-04T03:14:33.515114865Z [2020-05-04T03:14:33.514] [DEBUG] Module: Qbittorrent - POST response body Response {
2020-05-04T03:14:33.515130150Z   size: 0,
2020-05-04T03:14:33.515133741Z   timeout: 0,
2020-05-04T03:14:33.515136768Z   [Symbol(Body internals)]: {
2020-05-04T03:14:33.515139857Z     body: PassThrough {
2020-05-04T03:14:33.515143100Z       _readableState: [ReadableState],
2020-05-04T03:14:33.515146238Z       readable: true,
2020-05-04T03:14:33.515149235Z       _events: [Object: null prototype],
2020-05-04T03:14:33.515152063Z       _eventsCount: 2,
2020-05-04T03:14:33.515155032Z       _maxListeners: undefined,
2020-05-04T03:14:33.515157889Z       _writableState: [WritableState],
2020-05-04T03:14:33.515160789Z       writable: false,
2020-05-04T03:14:33.515163850Z       allowHalfOpen: true,
2020-05-04T03:14:33.515166993Z       _transformState: [Object],
2020-05-04T03:14:33.515183965Z       [Symbol(kCapture)]: false
2020-05-04T03:14:33.515186803Z     },
2020-05-04T03:14:33.515189282Z     disturbed: false,
2020-05-04T03:14:33.515191784Z     error: null
2020-05-04T03:14:33.515194301Z   },
2020-05-04T03:14:33.515196867Z   [Symbol(Response internals)]: {
2020-05-04T03:14:33.515199464Z     url: 'http://qbittorrent:8585/api/v2/torrents/createCategory',
2020-05-04T03:14:33.515202315Z     status: 409,
2020-05-04T03:14:33.515204848Z     statusText: 'Conflict',
2020-05-04T03:14:33.515207521Z     headers: Headers { [Symbol(map)]: [Object: null prototype] },
2020-05-04T03:14:33.515210292Z     counter: 0
2020-05-04T03:14:33.515212858Z   }
2020-05-04T03:14:33.515215354Z }
2020-05-04T03:14:33.515219700Z [2020-05-04T03:14:33.515] [INFO] Pull: Init - [Download queue] Job finished, setting timer

不知道是否和我的容器网络桥接有关,此时我的 fetcher 和 qbittorrent 同时存在于 javclub_lemp_defaultjavclub_fetcher_default 网络中, docker network 如下:

root@msvultr2020:~# docker network ls
NETWORK ID          NAME                      DRIVER              SCOPE
a5eb30cf6dee        bridge                    bridge              local
732bcdad4481        host                      host                local
4f07216d6714        javclub_fetcher_default   bridge              local
e67609173e19        javclub_lemp_default      bridge              local
3a4e5788bcb4        none                      null                local
root@msvultr2020:~# docker network inspect javclub_fetcher_default
[
    {
        "Name": "javclub_fetcher_default",
        "Id": "4f07216d671467e46919eb16d5b21981e38afc0d8d070c7ea92ee6c7f7b80f4d",
        "Created": "2020-05-01T11:51:27.505918288Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "186de75ba4d8ad8be838c7abfa1635ffd870928ab25196ea9aec7b4f358c54f9": {
                "Name": "fetcher",
                "EndpointID": "aba7bd94f378ef481043ac75b2acede8b1109e50767aa448f7ef54b02959522f",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "8829e3f2dcc97a77fd415a9fbe892ce25ca0b5302b4292754a026bae2607a769": {
                "Name": "qbittorrent",
                "EndpointID": "d6b9e07b5e440d4ad1f9a5636f8b57d61f9f52734b5a40febf90fc0b3e520df7",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]
root@msvultr2020:~# docker network inspect javclub_lemp_default
[
    {
        "Name": "javclub_lemp_default",
        "Id": "e67609173e191ed009190f3692c1eb9ec2377492c009fe3440fc709df97fed3a",
        "Created": "2020-05-01T12:25:23.425133701Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "0920253567cad31a1a4538b3f392813d2385daaf75b0c7af2596963e79895f4a": {
                "Name": "javclub_lemp_php-fpm_1",
                "EndpointID": "e3e28dbc001c1e2223374fdf24c034aed5ad944d350a0551c1e97dd914d91266",
                "MacAddress": "02:42:ac:13:00:06",
                "IPv4Address": "172.19.0.6/16",
                "IPv6Address": ""
            },
            "186de75ba4d8ad8be838c7abfa1635ffd870928ab25196ea9aec7b4f358c54f9": {
                "Name": "fetcher",
                "EndpointID": "e66fdb9adcadc36b7d93b0a08b78403d6dd210c80a8658470a663c66692a19ba",
                "MacAddress": "02:42:ac:13:00:02",
                "IPv4Address": "172.19.0.2/16",
                "IPv6Address": ""
            },
            "41556a6d0a3e53e37c0923f6089f42088e6892fb58f940f179641ba49b63cdef": {
                "Name": "javclub_lemp_nginx_1",
                "EndpointID": "abf62e1f5ffeb53363814fd7a9cb988eb01b715d2dfb63c0fd8b65bf7b9e8445",
                "MacAddress": "02:42:ac:13:00:07",
                "IPv4Address": "172.19.0.7/16",
                "IPv6Address": ""
            },
            "607adedbb599b34c4c678a1e02bbd8efb051cd571d605c1a85d71205acfb9bfa": {
                "Name": "javclub_lemp_redis_1",
                "EndpointID": "a0d97fe555af900c1debcc51992b15fb5d3b9215b0b8fec2c9d3687282eddc86",
                "MacAddress": "02:42:ac:13:00:08",
                "IPv4Address": "172.19.0.8/16",
                "IPv6Address": ""
            },
            "8829e3f2dcc97a77fd415a9fbe892ce25ca0b5302b4292754a026bae2607a769": {
                "Name": "qbittorrent",
                "EndpointID": "bd5dc1e32df48cb046d52ce9d726a616c406011e09fdc900cc643bab3c5eb1e2",
                "MacAddress": "02:42:ac:13:00:04",
                "IPv4Address": "172.19.0.4/16",
                "IPv6Address": ""
            },
            "962e1c888897ac6bef0327203875820a2ab2e2e091ecc839a5146c28d338ae9a": {
                "Name": "javclub_lemp_mysql_1",
                "EndpointID": "9ae7b1f317bfabbe7b4afcfbaa534de54b6af7e9f51ae3d7a4ec614b68fca93f",
                "MacAddress": "02:42:ac:13:00:05",
                "IPv4Address": "172.19.0.5/16",
                "IPv6Address": ""
            },
            "c45050da45070bebea7d089812db4ebef6290dd7f15642876fbd7e0902febe5d": {
                "Name": "javclub_lemp_phpmyadmin_1",
                "EndpointID": "eeeb39627228ebfcb1826d21c4a98f1a39084fa21f9a5e27c3b8ab22c37c013b",
                "MacAddress": "02:42:ac:13:00:09",
                "IPv4Address": "172.19.0.9/16",
                "IPv6Address": ""
            },
            "e928dcbda9fad17296a33ba54c6c1a697a01631fd10a788765158c76cc0f6b50": {
                "Name": "javclub_core_core_1",
                "EndpointID": "6d1934faa8bf7677ac072f90768f7c116a277c3b820146b247d8470a1bad9ec8",
                "MacAddress": "02:42:ac:13:00:03",
                "IPv4Address": "172.19.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "default",
            "com.docker.compose.project": "javclub_lemp",
            "com.docker.compose.version": "1.25.4"
        }
    }
]

我尝试将 fetcher 和 qbittorrent 容器从 javclub_lemp_default 网络中剥离,让他俩只存在于 javclub_fetcher_default 网络中,但是依旧失败,刚开始日志报了一个 409 ,后来都是 403 响应,fetcher 日志如下:

[2020-05-04T03:34:32.528] [DEBUG] Handle: Init - [Check torrent status] Starting job
[2020-05-04T03:34:32.534] [INFO] Module: Qbittorrent - Getting torrent list
[2020-05-04T03:34:32.534] [DEBUG] Module: Qbittorrent - GET /api/v2/torrents/info?limit=5&category=JAVClub&filter=paused&sort=completion_on&reverse=true
[2020-05-04T03:34:32.575] [DEBUG] Pull: Init - [Download queue] Starting job
[2020-05-04T03:34:32.576] [INFO] Module: Qbittorrent - Adding category JAVClub
[2020-05-04T03:34:32.577] [DEBUG] Module: Qbittorrent - POST /api/v2/torrents/createCategory
[2020-05-04T03:34:32.630] [DEBUG] Pull: Init - Remote list [
  { driver: 'OneJAV', url: 'https://onejav.com/new/' },
  { driver: 'OneJAV', url: 'https://onejav.com/popular/' },
  { driver: 'OneJAV', url: 'https://onejav.com/random/' }
]
[2020-05-04T03:34:32.859] [DEBUG] Module: Qbittorrent - Auth body: Ok.
[2020-05-04T03:34:32.860] [INFO] Module: Qbittorrent - Cookie: SID=Ys3jgOC0uEuC/Kzgz3mtVbQt4Rr0HQkP
[2020-05-04T03:34:32.860] [DEBUG] Module: Qbittorrent - GET data:  {
  method: 'GET',
  headers: { Cookie: 'SID=Ys3jgOC0uEuC/Kzgz3mtVbQt4Rr0HQkP' }
}
[2020-05-04T03:34:32.862] [DEBUG] Module: Qbittorrent - Auth body: Ok.
[2020-05-04T03:34:32.863] [INFO] Module: Qbittorrent - Cookie: SID=TOhsOgyGUOfPB+Ra0qvdyw57AKuuIW01
[2020-05-04T03:34:32.863] [DEBUG] Module: Qbittorrent - POST data:  {
  method: 'POST',
  body: URLSearchParams { 'category' => 'JAVClub', 'savePath' => 'JAVClub' },
  headers: { Cookie: 'SID=TOhsOgyGUOfPB+Ra0qvdyw57AKuuIW01' }
}
[2020-05-04T03:34:32.867] [DEBUG] Module: Qbittorrent - GET response body []
[2020-05-04T03:34:32.868] [INFO] Handle: Init - [Check torrent status] Job finished, setting timer
[2020-05-04T03:34:32.869] [DEBUG] Module: Qbittorrent - POST response body Response {
  size: 0,
  timeout: 0,
  [Symbol(Body internals)]: {
    body: PassThrough {
      _readableState: [ReadableState],
      readable: true,
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      _writableState: [WritableState],
      writable: false,
      allowHalfOpen: true,
      _transformState: [Object],
      [Symbol(kCapture)]: false
    },
    disturbed: false,
    error: null
  },
  [Symbol(Response internals)]: {
    url: 'http://qbittorrent:8585/api/v2/torrents/createCategory',
    status: 409,
    statusText: 'Conflict',
    headers: Headers { [Symbol(map)]: [Object: null prototype] },
    counter: 0
  }
}
[2020-05-04T03:34:32.870] [INFO] Pull: Init - [Download queue] Job finished, setting timer
[2020-05-04T03:35:32.915] [DEBUG] Handle: Init - [Check torrent status] Starting job
[2020-05-04T03:35:32.915] [INFO] Module: Qbittorrent - Getting torrent list
[2020-05-04T03:35:32.915] [DEBUG] Module: Qbittorrent - GET /api/v2/torrents/info?limit=5&category=JAVClub&filter=paused&sort=completion_on&reverse=true
[2020-05-04T03:35:32.916] [DEBUG] Module: Qbittorrent - GET data:  {
  method: 'GET',
  headers: { Cookie: 'SID=TOhsOgyGUOfPB+Ra0qvdyw57AKuuIW01' }
}
[2020-05-04T03:35:32.917] [DEBUG] Pull: Init - [Download queue] Starting job
[2020-05-04T03:35:32.917] [INFO] Module: Qbittorrent - Adding category JAVClub
[2020-05-04T03:35:32.917] [DEBUG] Module: Qbittorrent - POST /api/v2/torrents/createCategory
[2020-05-04T03:35:32.917] [DEBUG] Module: Qbittorrent - POST data:  {
  method: 'POST',
  body: URLSearchParams { 'category' => 'JAVClub', 'savePath' => 'JAVClub' },
  headers: { Cookie: 'SID=TOhsOgyGUOfPB+Ra0qvdyw57AKuuIW01' }
}
[2020-05-04T03:35:32.921] [ERROR] Handle: Init - [Check torrent status] Job threw an error FetchError: invalid json response body at http://qbittorrent:8585/api/v2/torrents/info?limit=5&category=JAVClub&filter=paused&sort=completion_on&reverse=true reason: Unexpected end of JSON input
    at /usr/app/node_modules/node-fetch/lib/index.js:272:32
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
    at async Qbittorrent.sendRequest (/usr/app/src/module/qbittorrent.js:57:31)
    at async Qbittorrent.getTorrentList (/usr/app/src/module/qbittorrent.js:69:24)
    at async process (/usr/app/src/handle/init.js:25:25)
    at async /usr/app/src/handle/init.js:128:5
    at async runAndSetInterval (/usr/app/src/handle/init.js:13:9) {
  message: 'invalid json response body at http://qbittorrent:8585/api/v2/torrents/info?limit=5&category=JAVClub&filter=paused&sort=completion_on&reverse=true reason: Unexpected end of JSON input',
  type: 'invalid-json'
}
[2020-05-04T03:35:32.922] [INFO] Handle: Init - [Check torrent status] Job finished, setting timer
[2020-05-04T03:35:32.915] [DEBUG] Handle: Init - [Check torrent status] Starting job
[2020-05-04T03:35:32.915] [INFO] Module: Qbittorrent - Getting torrent list
[2020-05-04T03:35:32.915] [DEBUG] Module: Qbittorrent - GET /api/v2/torrents/info?limit=5&category=JAVClub&filter=paused&sort=completion_on&reverse=true
[2020-05-04T03:35:32.916] [DEBUG] Module: Qbittorrent - GET data:  {
  method: 'GET',
  headers: { Cookie: 'SID=TOhsOgyGUOfPB+Ra0qvdyw57AKuuIW01' }
}
[2020-05-04T03:35:32.917] [DEBUG] Pull: Init - [Download queue] Starting job
[2020-05-04T03:35:32.917] [INFO] Module: Qbittorrent - Adding category JAVClub
[2020-05-04T03:35:32.917] [DEBUG] Module: Qbittorrent - POST /api/v2/torrents/createCategory
[2020-05-04T03:35:32.917] [DEBUG] Module: Qbittorrent - POST data:  {
  method: 'POST',
  body: URLSearchParams { 'category' => 'JAVClub', 'savePath' => 'JAVClub' },
  headers: { Cookie: 'SID=TOhsOgyGUOfPB+Ra0qvdyw57AKuuIW01' }
}
[2020-05-04T03:35:32.921] [ERROR] Handle: Init - [Check torrent status] Job threw an error FetchError: invalid json response body at http://qbittorrent:8585/api/v2/torrents/info?limit=5&category=JAVClub&filter=paused&sort=completion_on&reverse=true reason: Unexpected end of JSON input
    at /usr/app/node_modules/node-fetch/lib/index.js:272:32
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
    at async Qbittorrent.sendRequest (/usr/app/src/module/qbittorrent.js:57:31)
    at async Qbittorrent.getTorrentList (/usr/app/src/module/qbittorrent.js:69:24)
    at async process (/usr/app/src/handle/init.js:25:25)
    at async /usr/app/src/handle/init.js:128:5
    at async runAndSetInterval (/usr/app/src/handle/init.js:13:9) {
  message: 'invalid json response body at http://qbittorrent:8585/api/v2/torrents/info?limit=5&category=JAVClub&filter=paused&sort=completion_on&reverse=true reason: Unexpected end of JSON input',
  type: 'invalid-json'
}
[2020-05-04T03:35:32.922] [INFO] Handle: Init - [Check torrent status] Job finished, setting timer
[2020-05-04T03:35:32.922] [DEBUG] Module: Qbittorrent - POST response body Response {
  size: 0,
  timeout: 0,
  [Symbol(Body internals)]: {
    body: PassThrough {
      _readableState: [ReadableState],
      readable: true,
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      _writableState: [WritableState],
      writable: false,
      allowHalfOpen: true,
      _transformState: [Object],
      [Symbol(kCapture)]: false
    },
    disturbed: false,
    error: null
  },
  [Symbol(Response internals)]: {
    url: 'http://qbittorrent:8585/api/v2/torrents/createCategory',
    status: 403,
    statusText: 'Forbidden',
    headers: Headers { [Symbol(map)]: [Object: null prototype] },
    counter: 0
  }
}
[2020-05-04T03:35:32.923] [INFO] Pull: Init - [Download queue] Job finished, setting timer

不知道是哪里的问题...

因为没法判断是否已存在分类 JAVClub 所以每次都会尝试创建一个分类, 如果已存在就会返回 409, 这个不用在意
以及 fetcher/qBittorrent 和 core 是完全没有关系的, 可以当两个东西来看, 不需要放在同一个网络里面

看日志的话应该是 qBittorrent 端的相应不符合预期, 可以检查一下 qBittorrent 里面是否存在 JAVClub 这个分类以及贴一下你拉取的 qBittorrent 版本吗


发现文档中漏了一个很重要的东西, 可以加上再试试

{
            "driver": "RSS",
            "type": "MT",
            "url": "https://pt.m-team.cc/torrentrss.php?https=1&rows=30&cat410=1&isize=1&search=-&search_mode=1&linktype=dl&passkey=",
            "interval": 300
}

interval 是轮询延时, 以秒为单位

参照 JAVClub/fetcher@2aa57c0

因为 qBittorrent 还在快速迭代期, 所以 API 在疯狂变动, 为了避免麻烦这里钦定 4.2.1 版本(即 web API 版本为 2.4 的版本), 请升/降级到指定版本使用

如果使用 Docker 部署可以拉取最新的 docker-compose.yaml

之前拉取的是 qbittorrent 是最新版本的。

root@msvultr2020:~# docker image ls
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
linuxserver/qbittorrent   latest              c77db2e3af22        5 days ago          333MB

检查一下 qBittorrent 里面是否存在 JAVClub 这个分类

这个分类如果是个叫 JAVClub 的文件夹的话,那没有


nice! 换了版本现在看起来没什么问题了。fetcher 日志中只有 409 了。

好的,要是成功部署的话还请发个喜报(不是)让我知道这玩意儿能用hhhh

会的 嘿嘿 (怎么会不能用呢