分类 默认分类 下的文章

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 pull openlistteam/openlist:latest
docker stop openlist
docker rm openlist
docker run --user $(id -u):$(id -g) -d --restart=unless-stopped -v /etc/openlist:/opt/openlist/data -p 127.0.0.1:5244:5244 -e UMASK=022 --name="openlist" openlistteam/openlist:latest

2.清理旧镜像: 参照Windows电脑安装Docker Desktop并构建、运行、打包NotionNext镜像全过程

迁移:

1.旧 VPS 暂时停止openlist,打包 Docker 的Openlist环境到root,手动下载压缩包:

docker stop openlist
tar -czvf /root/openlist-data.tar.gz -C /etc/openlist .
docker restart openlist

2.上传压缩包到/root,创建目标目录,然后将压缩包从 /root 解压到目标目录:

mkdir -p /etc/openlist
tar -xzvf openlist-data.tar.gz -C /etc/openlist

3.启动 Docker 容器:

docker run --user $(id -u):$(id -g) -d --restart=unless-stopped -v /etc/openlist:/opt/openlist/data -p 127.0.0.1:5244:5244 -e UMASK=022 --name="openlist" openlistteam/openlist:latest

4.删除多余的压缩包:

rm -f /root/openlist-data.tar.gz

更新:

1.拉取typecho新程序文件并解压:

cd /opt
wget https://github.com/typecho/typecho/releases/latest/download/typecho.zip
unzip typecho.zip

2.覆盖旧程序文件并重启docker:

cd /opt/typecho-docker/typecho
rm -rf admin var index.php install.php
cp -r /opt/admin /opt/typecho-docker/typecho/
cp -r /opt/var /opt/typecho-docker/typecho/
cp /opt/index.php /opt/typecho-docker/typecho/
cp /opt/install.php /opt/typecho-docker/typecho/
docker restart typecho

3.清理下载文件:

rm -rf /opt/typecho.zip
rm -rf /opt/admin /opt/var /opt/index.php /opt/install.php /opt/usr

迁移:

1.旧 VPS 打包 Docker 博客环境到root,手动下载压缩包:

tar -czvf /root/typecho-docker-backup.tar.gz /opt/typecho-docker

2.上传压缩包到/root,然后从 /root 解压到目标目录:

tar -xzvf /root/typecho-docker-backup.tar.gz -C /opt/

3.启动 Docker 容器(默认已经安装了compose 插件):

cd /opt/typecho-docker
docker compose up -d

4.删除多余的压缩包:

rm -f /root/typecho-docker-backup.tar.gz

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
    }
]

桌面新建文本文件->复制下方的代码->粘贴进文本内->保存->修改文件后缀为:bat(txt->bat)->右键:管理员方式运行->重启电脑->成功运行软件。

@echo off
:: 将以下命令转换为管理员权限运行
powershell.exe -Command "Start-Process cmd.exe -ArgumentList '/c reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v EnableLUA /t REG_DWORD /d 0 /f' -Verb RunAs"

1.服务器部署docker

使用下面这行命令一般任何系统都能自动安装docker成功,如果无法安装正常安装再分系统尝试后面的命令:

curl -fsSL https://get.docker.com | sh

Ubuntu:

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
printf "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\n" | sudo dd of=/etc/apt/sources.list.d/docker.list bs=1 status=none
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

Debian12:

apt update
apt install -y gnupg
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bookworm stable" > /etc/apt/sources.list.d/docker.list
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Debian13:

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian trixie stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

2.验证Docker安装

docker -v

运行这个命令,能看到docker版本则安装成功。

1. Play商店不能正常安装应用的来龙去脉:国内安卓设备的谷歌服务差异与域名解析问题

2016年有消息称“谷歌要推出 Google Play China版”,虽然后来没有大范围推广,但这一尝试仍然对国内安卓设备的谷歌服务产生了影响。至今,许多国内安卓手机出厂时自带的谷歌服务(Google Play Service)软件与国际版本存在差异。例如,本人手中的小米、OnePlus 手机自带谷歌服务,在 apkpure 上更新 Google Play Service 时,会提示“安装失败,已安装了签名冲突的应用”。这说明国内安卓手机自带的谷歌服务与国际版本并不一致。

谷歌服务的 API 请求域名也存在差异:

  • 国际版的域名为 "services.googleapis.com"
  • 国内版的域名为 "services.googleapis.cn"

然而,在一部分代理软件中,默认情况下国内设备会优先使用 "services.googleapis.cn" 域名,并不会将其重定向到 "services.googleapis.com" 域名,这种情况下,代理软件会解析该域名为国内 IP地址。在"services.googleapis.cn"解析为国内地址时,会返回国内cdn的下载地址,其域名形式为"[xxxx].xn--ngstr-lra8j.com",而国内cdn会阻止国外ip的访问,若此时域名"[xxxx].xn--ngstr-lra8j.com"走代理,请求无效,即表现为无法下载;但若在使用nekobox下载play商店应用过程中,在提示"等待中"时关闭代理,则又可以正常下载应用。


2. 进一步分析:Google Play 应用下载地址解析机制与代理问题

在 Play 商店下载应用时,谷歌商店会根据以下因素判断应用的下载地址是 "services.googleapis.cn" 还是 "services.googleapis.com"

  • 谷歌账号区域
  • 使用者 IP 地址
  • 手机系统 ROM

随后,下载地址会通过 302 跳转 转到真正的谷歌全球 CDN 下载地址,其中国内的 CDN 下载地址形式为 "[xxxx].xn--ngstr-lra8j.com"

特别说明

国产 ROM 系统不会考虑谷歌账号区域或使用者 IP,默认使用 "services.googleapis.cn"。从 v2rayNG 的日志可以发现,在下载应用时,v2rayNG 会将 "services.googleapis.cn" 重写为 "services.googleapis.com",因此 v2rayNG 可以正常下载谷歌商店应用。但 nekobox 并没有这一配置,所以无法正常安装应用。

此外,国区账号、国内 IP 或部分香港 IP 也很可能被指定为 "services.googleapis.cn"。此时,如果 "services.googleapis.cn""[xxxx].xn--ngstr-lra8j.com" 没有 “同时直连” ,就无法正常下载安装谷歌商店的应用。


3. 问题解决方案

  1. 转圈时断开代理或关闭 WiFi,直接用数据下载

    • 缺点:每次都需要手动切换代理或 WiFi,操作较为繁琐。
  2. ※推荐方案:设置谷歌商店相关域名的直连规则
    在 nekobox 的路由配置中,修改 “中国Play商店规则” 如下并启用该规则:

    • 优点:精准解决问题,无需影响其他流量,且一劳永逸。
domain:
googleapis.cn
xn--ngstr-lra8j.com
outbound:
绕过