标签 阅读3 下的文章

1.打开docker desktop,打开 PowerShell 或 命令提示符(cmd),输入:

cd D:
cd D:\docker_project
mkdir reader
cd reader

2.部署reader容器:

VPS版本,下面是docker-compose.yml内容:

version: '3.1'
services:
# reader 在线阅读
# 公开服务器(服务器位于日本):[https://reader.nxnow.top](https://reader.nxnow.top) 测试账号/密码分别为guest/guest123,也可自行创建账号添加书源,不定期删除长期未登录账号(2周)
# 书源集合 : [https://legado.aoaostar.com/](https://legado.aoaostar.com/) 点击打开连接,添加远程书源即可
# 公众号汇总 : [https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MjM5MzMyMDgyMA==&action=getalbum&album_id=2397535253763801090#wechat_redirect](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MjM5MzMyMDgyMA==&action=getalbum&album_id=2397535253763801090#wechat_redirect)
# 手动更新方式 : docker-compose pull && docker-compose up -d
  reader:
    # image: hectorqin/reader
    image: hectorqin/reader:openj9-latest #docker镜像,arm64架构或小内存机器优先使用此镜像.启用需删除上一行
    container_name: reader #容器名 可自行修改
    restart: always
    ports:
      - 127.0.0.1:4396:8080 #4396端口映射可自行修改
    networks:
      - share_net
    volumes:
      - /home/reader/logs:/logs #log映射目录 /home/reader/logs 映射目录可自行修改
      - /home/reader/storage:/storage #数据映射目录 /home/reader/storage 映射目录可自行修改
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - READER_APP_USERLIMIT=50 #用户上限,默认50
      - READER_APP_USERBOOKLIMIT=200 #用户书籍上限,默认200
      - READER_APP_CACHECHAPTERCONTENT=true #开启缓存章节内容 V2.0
      # 如果启用远程webview,需要取消注释下面的 remote-webview 服务
      - READER_APP_REMOTEWEBVIEWAPI=http://remote-webview:8050 #开启远程webview
      # 下面都是多用户模式配置
      # - READER_APP_SECURE=true #开启登录鉴权,开启后将支持多用户模式
      # - READER_APP_SECUREKEY=adminpwd  #管理员密码  建议修改
      # - READER_APP_INVITECODE=registercode #注册邀请码 建议修改,如不需要可注释或删除
  remote-webview:
    image: hectorqin/remote-webview
    container_name: remote-webview #容器名 可自行修改
    restart: always
    # ports:
    #   - 8050:8050
    networks:
      - share_net
# 自动更新docker镜像
  # watchtower:
  #   image: containrrr/watchtower
  #   container_name: watchtower
  #   restart: always
  #   # 环境变量,设置为上海时区
  #   environment:
  #       - TZ=Asia/Shanghai
  #   volumes:
  #     - /var/run/docker.sock:/var/run/docker.sock
  #   command: reader watchtower --cleanup --schedule "0 0 4 * * *"
  #   networks:
  #     - share_net
    # 仅更新reader与watchtower容器,如需其他自行添加 '容器名' ,如:reader watchtower nginx
    # --cleanup 更新后清理旧版本镜像
    # --schedule 自动检测更新 crontab定时(限定6位crontab) 此处代表凌晨4点整
networks:
  share_net:
    driver: bridge

Windows版本,下面是docker-compose.yml内容:

version: '3.1'
services:
# reader 在线阅读
# 公开服务器(服务器位于日本):[https://reader.nxnow.top](https://reader.nxnow.top) 测试账号/密码分别为guest/guest123,也可自行创建账号添加书源,不定期删除长期未登录账号(2周)
# 书源集合 : [https://legado.aoaostar.com/](https://legado.aoaostar.com/) 点击打开连接,添加远程书源即可
# 公众号汇总 : [https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MjM5MzMyMDgyMA==&action=getalbum&album_id=2397535253763801090#wechat_redirect](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MjM5MzMyMDgyMA==&action=getalbum&album_id=2397535253763801090#wechat_redirect)
# 手动更新方式 : docker-compose pull && docker-compose up -d
  reader:
    # image: hectorqin/reader
    image: hectorqin/reader:openj9-latest #docker镜像,arm64架构或小内存机器优先使用此镜像.启用需删除上一行
    container_name: reader #容器名 可自行修改
    restart: unless-stopped
    ports:
      - 127.0.0.1:4396:8080 #4396端口映射可自行修改
    networks:
      - share_net
    volumes:
      - ./logs:/logs #log映射目录 /home/reader/logs 映射目录可自行修改
      - ./storage:/storage #数据映射目录 /home/reader/storage 映射目录可自行修改
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - READER_APP_USERLIMIT=50 #用户上限,默认50
      - READER_APP_USERBOOKLIMIT=200 #用户书籍上限,默认200
      - READER_APP_CACHECHAPTERCONTENT=true #开启缓存章节内容 V2.0
      # 如果启用远程webview,需要取消注释下面的 remote-webview 服务
      - READER_APP_REMOTEWEBVIEWAPI=http://remote-webview:8050 #开启远程webview
      # 下面都是多用户模式配置
      # - READER_APP_SECURE=true #开启登录鉴权,开启后将支持多用户模式
      
      # - READER_APP_SECUREKEY=adminpwd  #管理员密码  建议修改
      # - READER_APP_INVITECODE=registercode #注册邀请码 建议修改,如不需要可注释或删除
  remote-webview:
    image: hectorqin/remote-webview
    container_name: remote-webview #容器名 可自行修改
    restart: unless-stopped
    # ports:
    #   - 8050:8050
    networks:
      - share_net
# 自动更新docker镜像
  # watchtower:
  #   image: containrrr/watchtower
  #   container_name: watchtower
  #   restart: unless-stopped
  #   # 环境变量,设置为上海时区
  #   environment:
  #       - TZ=Asia/Shanghai
  #   volumes:
  #     - /var/run/docker.sock:/var/run/docker.sock
  #   command: reader watchtower --cleanup --schedule "0 0 4 * * *"
  #   networks:
  #     - share_net
    # 仅更新reader与watchtower容器,如需其他自行添加 '容器名' ,如:reader watchtower nginx
    # --cleanup 更新后清理旧版本镜像
    # --schedule 自动检测更新 crontab定时(限定6位crontab) 此处代表凌晨4点整
networks:
  share_net:
    driver: bridge
docker compose up -d

1.打开docker desktop,打开 PowerShell 或 命令提示符(cmd),输入:

cd D:
cd D:\docker_project
mkdir fqnovel
cd fqnovel

2.部署fqnovel容器:

VPS版本:

docker run -d --name fqnovel --restart unless-stopped -p 9999:9999 ghcr.io/sffxzzp/fqnovel:latest

Windows版本,下面是docker-compose.yml内容:

services:

  fqnovel:
    image: ghcr.io/sffxzzp/fqnovel:latest
    container_name: fqnovel
    restart: unless-stopped
    ports:
      - "127.0.0.1:9999:9999"
    volumes:
      - ./data:/app/data
docker compose up -d

3.输入如图网址,测试是否搭建成功: 2026-02-09T10:02:53.png 也可以打开reqable,输入如图body,使用post方式测试是否搭建成功:2026-02-09T09:59:20.png

4.搭建成功后,创建如下json文件,打开书源(legado,阅读3.0),在书源管理中导入,注意替换具体的ip:

[
    {
        "bookSourceComment": "FQNovel-unidbg书源",
        "bookSourceGroup": "FQNovel",
        "bookSourceName": "FQNovel-unidbg",
        "bookSourceType": 0,
        "bookSourceUrl": "http://替换为搭建的IP:9999",
        "customOrder": 2,
        "enabled": true,
        "enabledCookieJar": true,
        "enabledExplore": true,
        "exploreUrl": "搜索::http://替换为搭建的IP:9999/api/fqsearch/books?query={{key}}&offset={{(page-1)*20}}&count=20",
        "header": "Content-Type: application/json\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
        "lastUpdateTime": 1754302417608,
        "respondTime": 180000,
        "ruleBookInfo": {
            "author": "$.data.author",
            "coverUrl": "$.data.coverUrl",
            "intro": "$.data.description",
            "kind": "$.data.category",
            "lastChapter": "$.data.lastChapterTitle",
            "name": "$.data.bookName",
            "tocUrl": "http://替换为搭建的IP:9999/api/fqsearch/directory/{{$.data.bookId}}\n<js>\njava.put(\"book_id\", java.getString(\"$.data.bookId\"))\nresult\n</js>",
            "wordCount": "$.data.wordNumber"
        },
        "ruleContent": {
            "content": "$.data.txtContent",
            "title": "$.data.title"
        },
        "ruleExplore": {
            "author": "$.author",
            "bookList": "$.data.books[*]",
            "bookUrl": "http://替换为搭建的IP:9999/api/fqnovel/book/{{$.bookId}}",
            "coverUrl": "$.coverUrl",
            "intro": "$.description",
            "kind": "$.category",
            "lastChapter": "$.lastChapterTitle",
            "name": "$.bookName",
            "wordCount": "$.wordCount"
        },
        "ruleSearch": {
            "author": "$.author",
            "bookList": "$.data.books[*]",
            "bookUrl": "http://替换为搭建的IP:9999/api/fqnovel/book/{{$.bookId}}",
            "coverUrl": "$.coverUrl",
            "intro": "$.description",
            "kind": "$.category",
            "lastChapter": "$.lastChapterTitle",
            "name": "$.bookName\n<js>\n// 第一页时保存searchId\nif (java.get('current_page') == null || java.get('current_page') == '1') {\n    var searchId = java.getString('$..searchId');\n    if (searchId) {\n        java.put('search_id', searchId);\n    }\n}\nresult\n</js>",
            "wordCount": "$.wordCount"
        },
        "ruleToc": {
            "chapterList": "$.data.item_data_list[*]",
            "chapterName": "$.title",
            "chapterUrl": "@js:\nsource.bookSourceUrl + `/api/fqnovel/chapter/${java.get(\"book_id\")}/${java.getString(\"$.item_id\")}`"
        },
        "searchUrl": "http://替换为搭建的IP:9999/api/fqsearch/books?query={{key}}&offset={{(page-1)*20}}&count=20&tabType=3@js:\nvar currentPage = java.get('current_page') || '1';\njava.put('current_page', (parseInt(currentPage) + 1).toString());\nvar searchId = java.get('search_id');\nif (searchId && currentPage != '1') {\n    result + '&searchId=' + encodeURIComponent(searchId);\n} else {\n    result;\n}",
        "weight": 0
    }
]