惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
WordPress大学
WordPress大学
V
V2EX
Jina AI
Jina AI
S
Schneier on Security
Cyberwarzone
Cyberwarzone
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
PCI Perspectives
PCI Perspectives
美团技术团队
小众软件
小众软件
L
LangChain Blog
N
Netflix TechBlog - Medium
大猫的无限游戏
大猫的无限游戏
T
Threatpost
T
Tor Project blog
K
Kaspersky official blog
Microsoft Security Blog
Microsoft Security Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
Security Latest
Security Latest
H
Heimdal Security Blog
N
News and Events Feed by Topic
T
Threat Research - Cisco Blogs
J
Java Code Geeks
H
Hackread – Cybersecurity News, Data Breaches, AI and More
T
Tailwind CSS Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
M
MIT News - Artificial intelligence
Apple Machine Learning Research
Apple Machine Learning Research
N
News | PayPal Newsroom
I
Intezer
博客园 - 聂微东
U
Unit 42
Cisco Talos Blog
Cisco Talos Blog
量子位
T
The Exploit Database - CXSecurity.com
Last Week in AI
Last Week in AI
博客园_首页
月光博客
月光博客
Webroot Blog
Webroot Blog
I
InfoQ
The Cloudflare Blog
Attack and Defense Labs
Attack and Defense Labs
人人都是产品经理
人人都是产品经理
Project Zero
Project Zero
Hacker News: Ask HN
Hacker News: Ask HN
IT之家
IT之家
Google DeepMind News
Google DeepMind News
C
Cisco Blogs

山月

在VS Code配置Obsidian風格Markdown編輯環境 – 山月 在Windows通过LM Studio使用Zotero MCP – 山月 禁用WordPress中Jetpack的AI助手按钮 – 山月 WordPress/MCP Adapter安装与维护指南 – 山月 WordPress服务器权限与所有权配置详解 – 山月 在Windows上為GnuCash啟用線上報價 (Finance::Quote) – 山月 Gitea Docker /var/empty 权限问题除错总结 – 山月 用正则表达式修改ruby标签 – 山月 为WordPress Syndication Links插件添加新的站点与图标的实现方法 – 山月 进入不断重启的Docker容器的命令行之方法 – 山月 自建Bookwyrm无法查询远端用户?——开启数据库扩展 – 山月 BookWyrm无法增添书本、作者、阅读进度……?——解决数据库自增序列问题 – 山月 俾Docker容器中的应用访问宿主机上的数据库服务 – 山月 QNAP NAS使用者注意!千万莫对MariaDB做这件事…… – 山月 解决Wikibase手动导入数据后无法新建实体之问题 – 山月 辰年再訪神保町 – 山月 PHP-FPM站点池配置调优以解决WordPress过度占用系统资源之问题 – 山月 如果Linux软件包常规升级失败——以python3-update-manager为例 – 山月 解决站点526报错:SSL证书配置错误 – 山月 風挾着陽光來 – 山月 和A.N.R.GHG插件说bye-bye – 山月 WordPress页面链接末尾出现“?swcfpc=1”后缀,是怎么回事? – 山月 安装、维护Monica PRM的一些笔记 – 山月 清理服务器空间的着手点 – 山月 关于Joplin Server文件上传大小上限 – 山月 如何优化PHP文件上传大小:完整指南 – 山月 WordPress站点部分地出现“严重错误”的一些可能的解法 – 山月 批量更改WordPress媒体URL – 山月 自托管WordPress编辑文章出现问题的排查法 – 山月 於Docker安裝sudo之方法 – 山月 于YunoHost网页版后台装pgAdmin4失败之解决方法 – 山月 解决WordPress多站点网络下异域名子站登录失败的问题 – 山月 Linux的SWAP配置建议与方法 – 山月 如何从一个.sql文件中恢复(导入)数据到MySQL数据库 – 山月 橙色的天,金色的鯉魚 – 山月 設置SoftBank光IP地址固定分配時MAC地址報錯之解決方法 – 山月 解决自托管WordPress与Jetpack通信之不畅 – 山月 解决WordPress上传超过100M文件失败的问题——用Cloudflare作为CDN服务时 – 山月 自托管WordPress迁至新服务器时可能遇到的一些问题 – 山月 Jetpack server port value报错之解决方法 – 山月 Nextcloud服务器目录中/data/updater-(12个英数字)文件夹可删除 – 山月 使WP IndieBlocks、Webmention两插件配合工作 – 山月 导致WordPress钩子(hooks)重复调用的一个可能性——插件重复安装 – 山月 为WordPress自定义贴文类型设置默认格式(post format) – 山月 为Micropub客户端所发内容设置默认post type – 山月 让WordPress的自定义post type支持post formats – 山月 在WordPress通过古腾堡块编辑器验证您的Mastodon身份 – 山月 如何将Mastodon上关注的人导入至Friendica – 山月 在WordPress上发Mastodon的一个选项:Shortnotes+Share on Mastodon – 山月 祝WordPress 20周年快乐!(节译) – 山月 更改IndieBlocks札记(note)、喜欢(like)slug之方法 – 山月 改变Friendica域名之方法 – 山月 爲WordPress添上在線Markdown、HTML互轉工具 – 山月 內排散記 – 山月 长毛象(Mastodon)简介:多中心化、细粒度公开、多样时间轴 – 山月 教ChatGPT讲福州话 – 山月 WordPress项目管理插件使用心得 – 山月 汉字词“地震”之前,日语中表达地震的本土词 – 山月 “幸”与“福”的区别 – 山月 Koha 22.05安装教程(于Ubuntu 20.04 LTS) – 山月 《日本外來語辭典》讀書筆記 – 山月 “传毒”——童年游戏回忆一则 – 山月 WordPress多站点网络分布于不同主域名时登录管理后台出现cookie错误的解决方案 – 山月 如何为WordPress多站点设置不同的子目录、子域名,甚至主域名? – 山月 重温《日语的历史》 – 山月 东京教父:关于爱与救赎 – 山月 2021年末,豆瓣更新了它的条款…… – 山月 WordPress报错“Briefly unavailable for scheduled maintenance.”的解决方法 – 山月 日语里的「原形」「辞书形」「终止形」是什么? – 山月 《福州方言大词典》读后感 – 山月 一種美觀的由Hubzilla分享RSS資訊的方法 – 山月 《我们仨》中与《宋诗选注》相关的记载 – 山月 亂彈文忠公宴番仔事 – 山月 一本清代土腔谜语集引发的回忆 – 山月 迎圣火 – 山月 凝滞在方言里的时光 – 山月 站在新庄园门前 – 山月 长星照耀州府 – 山月 虚拟币与赛博矿难 – 山月 记忆、记录与创造 – 山月 几日来写作微信推文的反思 – 山月 对OKR工作管理法的归纳总结 – 山月 同人誌之夢 – 山月 那里人很爱诗词 – 山月 从语言学看两性语言差异 – 山月 南门兜素菜馆 – 山月 闽海痛史 – 山月 东京的西方建筑遗产 – 山月 真实的华人电影 – 山月 记观《只有野兽知道》 – 山月 记早稻田祭 – 山月 《鬼灭之刃》日语札记 – 山月 颱風前夜的仙草凍 – 山月 首篇博文 – 山月 我到底是转厝了 – 山月 CM96暴走记 – 山月 薄暮逐島 – 山月 人与神的共振 – 山月 逐集罔讲罔听 – 山月 以往不谏 – 山月
Bookwyrm由0.7.5升级至Production(e217a17)完整过程及疑难解答 – 山月
2025-07-06 · via 山月

引言

本教程旨在帮助Bookwyrm用户如何将其部署从v0.7.5升级到(笔者执笔时)最新的production分支(具体到e217a17版本)。截至该版本提交(commit)的诸多代码带来了许多改进,例如对搜索词汇权重的优化设计(能更精准地根据标题、作者、系列等信息进行排序),以及数据导出功能的增强(排除已删除内容)等,这些都会提升用户体验和系统稳定性。

在升级过程中,可能会遇到一些并非普遍存在,但对于特定部署环境至关重要的特殊情况。如果您符合以下条件——

  1. 使用外部(包括宿主机上的)数据库服务,并依赖Docker的host网络模式进行通信;同时,
  2. 通过容器外的服务进行HTTPS管理(而非在容器内部自签)

——那么本教程中的“特殊情况”部分将提供相应的解决方案。

如果您没有这些特殊需求,通常可以直接遵循Bookwyrm官方的升级指南,那将是更简便的路径。

特殊情况概述

本次升级案例中的主要挑战源于以下几个相互关联的部署配置:

  1. 外部数据库与host网络模式: 为了与宿主机上运行的外部PostgreSQL数据库服务进行通信,笔者的Docker Compose配置中将db服务注释掉了,并将webcelery等服务设置为 network_mode: "host"

    • 影响:host网络模式下,Docker容器直接共享宿主机的网络堆栈,容器之间无法通过服务名称进行内部解析。它们必须通过宿主机的IP地址(通常宿主机实际的局域网IP;或者都是host了,干脆127.0.0.1亦可)进行通信。这直接影响了nginx与Web服务之间的通信配置。
  2. Cloudflare Zero Trust与HTTPS管理: 笔者用 Cloudflare Zero Trust来处理HTTPS加密。这意味着服务器端无需强制进行HTTPS,而是由Cloudflare在边缘网络提供SSL/TLS保护。

    • 影响: 如果在服务器端启用自签名或其他免费的HTTPS证书,并与Cloudflare的“严格”HTTPS策略冲突,可能导致Cloudflare阻止流量,认为存在不安全的端到端连接。因此,我们的nginx配置必须避免在服务器端强制HTTPS,而是通过HTTP监听,并由Cloudflare Zero Trust负责转发和加密。这与Bookwyrm官方版本(无论是截至v0.7.5抑是截至本文所提之“最新”版)中可能集成的Certbot自动化HTTPS方案有所冲突,需要进行定制化。
  3. nginx端口冲突: 由于采用host网络模式,nginx容器会尝试直接监听宿主机的端口。在升级过程中,我们发现宿主机的80端口已被一个别的(就诸如nginx这样的)Web服务器占用,导致nginx无法启动。这需要沉下心诊断并解决端口冲突问题。

这些特殊因素叠加,使得简单的拉取(pull)或者复制粘贴新版本docker-compose.yml配置变得不可行,需要对网络、nginx代理和端口管理进行精细调整。

升级教程:从0.7.5到Production (e217a17)

本教程假设您已经有了一个运行正常的Bookwyrm 0.7.5部署,并且熟悉基本的Git和Docker Compose命令。

步骤1:备份数据和配置

关键:在进行任何重大升级之前,请务必备份所有重要数据。

  1. 备份数据库: 如果数据库运行在Docker容器内(假设容器名为bookwyrm-db-1),可以使用docker exec命令进行备份:

    docker exec -t bookwyrm-db-1 pg_dump -U your_db_user your_db_name > db_backup.sql
    

    如果数据库是外部服务,则使用其提供的备份机制。

  2. 备份 Docker Compose 文件和自定义配置: 复制当前的docker-compose.yml文件和所有自定义的配置文件(例如.env文件、nginx配置目录 nginx/ 等)。

    cp docker-compose.yml docker-compose.yml.bak
    cp .env .env.bak
    cp -r nginx/ nginx.bak/
    # 确保备份所有可能包含定制化信息的目录和文件
    

步骤2:更新Bookwyrm代码库

  1. 停止当前运行的Bookwyrm服务:

    docker compose down
    
  2. 拉取最新的production分支代码并回滚:

    (请确保您明白本节在说什么之后,再继续操作!如于不熟悉Git之情况下贸然照搬,会导致可怕后果😱)

    由于过去站点的运行可能会生成很多不需要的变更甚至提交(例如,nginx静态文件目录的权限变更,或者是Windows/Linux之间的换行符差异,皆会被Git一一记录);故此,先回滚到干净的远程production状态,然后只应用您所需的修改。

    git fetch origin                   # 获取远程仓库的最新状态
    git reset --hard origin/production # 强制重置本地分支到远程 production 的最新提交
    

    这将清除您本地所有未推送到origin/production的修改。(或者可能是upstream/production,根据实际情况来。)

步骤3:应用有价值的修改

(本节同样也是,希望您明白下述文字在说什么以后,再考虑要否采纳。)

现在,在干净的origin/production基础上,重新应用希望保留修改:

  1. 重命名docker-compose.ymldocker-compose.example.yml 如果origin/production包含docker-compose.yml文件,执行:

    mv docker-compose.yml docker-compose.example.yml
    

    兹解释一下笔者为什么会需要这么做。笔者以为官方Git库直接提供docker-compose.yml并于每回释出新版本时累次将变更付诸此文件是不优雅的。这样做没有考虑到(包括笔者在内)魔改docker-compose.yml以取消掉部分原生服务(例如容器内的db)的可能性——每次拉取官方更新,若不备份好自己的docker-compose.yml,就会被官方发布的.yml一整个覆盖掉。

    笔者以为,较为优雅的实践,是官方提供一个docker-compose.example.yml,并指导用户去:

    cp docker-compose.example.yml docker-compose.yml
    

    岂不美哉?不过,反馈给官方后,项目的积极维护者所分享的考量也不无道理——

    对于像BookWyrm这样(笔者瞎按:由于处于内测阶段所以会急遽更迭)的项目来说,使用标准并有助于保持一致的环境是非常典型的。一般来说,自定义应该是环境变量。

    (笔者中译)

    官方倒也有提供docker-compose.override.yml这样的维护方式。记入在docker-compose.override.yml的配置如与docker-compose.yml冲突,优先执行的是override的。且override.yml也在.gitignore内,就不会在每次更新时被覆盖了。但是,笔者这种需要注释掉部分服务的做法,override支持不到了

    所以,截至本文执笔时,还是只能自行重命名。可以考虑fork一份Git库,然后把重命名操作应用过去。在这种情况下,我们就可以将upstream指定为官方Git库,origin指定为自己的Git库。

  2. .gitignore中增加临时文件的忽略规则: 打开本地的.gitignore文件,并在文件末尾或其他合适位置添加增加临时文件的忽略规则(笔者例)。如果您像笔者一样,宿主机用的是魔改版的Linux系统,而该系统恰会以自己的方式为一些图片文件生成临时缩略图的话,就需要忽略之。否则,nginx静态文件目录(./static)下面会出现很多临时缩略图待提交——或者在哪次直接不慎提交掉了。

  3. 提交这些更改:

    git add docker-compose.example.yml .gitignore # 根据实际重命名情况调整
    git commit -m "Rename docker-compose.yml to docker-compose.example.yml and add temp files ignore to .gitignore"
    

步骤4:调整docker-compose.yml和nginx配置以适应特殊情况

这是本次升级教程的核心和关键,将根据特殊需求定制docker-compose.yml和nginx配置。

  1. 手动更新 docker-compose.yml 基于docker-compose.example.ymlproduction提供的docker-compose.yml文件,进行以下修改:

    • nginx, web, celery_worker, celery_beat等实际有启用的服务设置 network_mode: "host"

      services:
        nginx:
          # ...
          network_mode: "host"
          # ...
        web:
          # ...
          network_mode: "host"
          # ...
        celery_worker:
          # ...
          network_mode: "host"
          # ...
        celery_beat:
          # ...
          network_mode: "host"
          # ...
      
    • nginx服务volumes调整 (核心): 笔者将放弃官方的default.conf.template模板机制,而是直接挂载一个包含所有自定义nginx配置的文件,并让它直接覆盖容器内nginx的默认配置。

      首先,在本地./nginx/目录中,准备一个名为my-bookwyrm-nginx.conf的文件(或者选择用https.conf也可以),将所有自定的nginx配置内容都放入其中。

      nginx服务volumes部分应类似于:

          volumes:
            # 直接将你的主Nginx配置文件挂载到容器的 /etc/nginx/conf.d/default.conf
            # 确保这个文件包含了所有你需要的Nginx指令,并且是最终版本
            - ./nginx/my-bookwyrm-nginx.conf:/etc/nginx/conf.d/default.conf
      
            # 如果你的 server_config, server_name, locations 是独立的Nginx include文件
            # 并且你希望它们继续被加载,你仍然可以挂载它们。但要确保它们不包含监听指令,
            # 而是被 my-bookwyrm-nginx.conf 文件通过 `include` 指令引用。
            # 示例:
            # - ./nginx/locations:/etc/nginx/conf.d/locations
            # - ./nginx/server_config:/etc/nginx/conf.d/server_config
            # - ./nginx/server_name:/etc/nginx/conf.d/server_name
      
            # 99-autoreload.sh 脚本的挂载
            - ./nginx/99-autoreload.sh:/docker-entrypoint.d/99-autoreload.sh
      
            # 静态文件和媒体文件卷 (改为直接挂载本地目录)
            - ./static:/app/static
            - ./images:/app/images
            - ./exports:/app/exports # 用于导出数据
      

      注意:docker-compose.yml中,如果Nginx服务仍然有ports部分,请确保将其移除或注释掉。network_mode: "host"会让Nginx直接使用宿主机网络,ports映射是多余的。

    • 按需添加redis_activityredis_brokerflower(用于监控Celery)服务。(笔者用了外部的服务,就没开这些个。)

    • web服务的depends_on调整:

      web:
        # ...
        depends_on:
          celery_worker:
            condition: service_started
          redis_activity:
            condition: service_started
          # 以及其他你实际有开启的
      
    • 定义具名卷 (volumes) 在docker-compose.yml底部: 所有在服务中使用的具名卷(例如 redis_activity_dataredis_broker_datapgdatabackups)都需要在这里定义。

      volumes:
        pgdata:
        backups:
        static_volume: # 如果你用具名卷而不是直接挂载目录
        media_volume: # 如果你用具名卷而不是直接挂载目录
        exports_volume:
        redis_broker_data:
        redis_activity_data:
      

      重要: 如果你的webcelerynginx已经使用network_mode: "host"并直接挂载本地目录static, images, exports,那么static_volume, media_volume等具名卷就不需要了。保持一致性,如果挂载本地目录,就不要定义具名卷,反之亦然。

  2. 创建或更新nginx主配置文件 (./nginx/my-bookwyrm-nginx.conf): 这个文件将是nginx容器实际加载的/etc/nginx/conf.d/default.conf

    • 确保upstream web指向127.0.0.1:8000

      upstream web {
          server 127.0.0.1:8000; # 因为web容器在宿主机上也监听这个地址
      }
      
    • 配置nginx监听的端口 (关键步骤): 由于Apache占用80端口,且打算通过Cloudflare Zero Trust处理HTTPS,Nginx应该监听一个未被占用的端口(例如8001),并只提供HTTP服务。

      # 定义一个 Nginx 缓存区域 (可选,但推荐)
      proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=bookwyrm_cache:10m inactive=60m;
      
      server {
          listen [::]:8001; # Nginx 监听宿主机的 8001 端口
          listen 8001;
      
          server_name sanguok.com; # 示例。换成你的域名。下同
      
          # 最大请求体大小,根据需要调整
          client_max_body_size 10M;
      
          # 确保只通过主域名访问
          if ($host != "sanguok.com") {
              return 301 $scheme://sanguok.com$request_uri;
          }
      
          # 主要的反向代理到 web 服务
          location / {
              proxy_pass http://web; # upstream web 已经指向了 127.0.0.1:8000
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header Host $host;
              proxy_redirect off;
      
              # 缓存设置 (与上面 proxy_cache_path 配合使用)
              proxy_cache bookwyrm_cache;
              proxy_cache_valid any 1m;
              add_header X-Cache-Status $upstream_cache_status;
              proxy_ignore_headers Cache-Control Set-Cookie Expires;
              proxy_cache_methods GET HEAD;
              proxy_no_cache $cookie_sessionid;
              proxy_cache_bypass $cookie_sessionid;
          }
      
          # 专门处理登录、密码重置等,通常有限制请求
          location ~ ^/(login[^-/]|password-reset|resend-link|2fa-check) {
              # limit_req zone=loginlimit; # 如果定义了限速区域
              proxy_pass http://web;
          }
      
          # 静态文件服务
          location /static/ {
              root /app; # 对应 docker-compose.yml 中的 ./static:/app/static
              try_files $uri =404;
              add_header X-Cache-Status STATIC;
              access_log off;
          }
      
          # 图像文件服务
          location /images/ {
              location ~ \.(bmp|ico|jpg|jpeg|png|svg|tif|tiff|webp)$ {
                  root /app; # 对应 docker-compose.yml 中的 ./images:/app/images
                  try_files $uri =404;
                  add_header X-Cache-Status STATIC;
                  access_log off;
              }
              return 403; # 阻止非图片文件访问
          }
      
          # favicon.ico 处理
          location /favicon.ico {
              root /app/images/logos; # 假设你的 favicon 在这个路径
              try_files /IMG_5682.ico =404; # 确保指向实际的图标文件
          }
      
          # Flower 监控界面 (如果启用了 flower 服务)
          location /flower/ {
              proxy_pass http://127.0.0.1:8888; # 如果flower也在host模式下监听,并且监听8888端口
              proxy_cache_bypass 1;
          }
      
          # 其他常用的 Nginx 优化设置
          sendfile on;
          tcp_nopush on;
          tcp_nodelay on;
          keepalive_timeout 65;
          types_hash_max_size 2048;
          gzip on;
          gzip_disable "msie6";
          proxy_read_timeout 1800s;
          chunked_transfer_encoding on;
      
          # 错误日志
          error_log /var/log/nginx/error.log debug;
          access_log /var/log/nginx/access.log; # 可以改为 cache_log
      }
      
      # 如果有其他 Nginx 配置 include,确保其内容正确且不会监听 80 端口
      # 例如:
      # include /etc/nginx/conf.d/server_config;
      # include /etc/nginx/conf.d/server_name;
      # include /etc/nginx/conf.d/locations;
      
    • 关于99-autoreload.sh的权限: 再次确认nginx/99-autoreload.sh文件具有执行权限 (chmod +x ./nginx/99-autoreload.sh)。

步骤5:更新.env文件

Bookwyrm和Redis服务会引入新的环境变量。打开.env文件并更新:

  • 数据库连接信息: 确保与你的外部数据库服务匹配。
  • Redis密码和端口:redis_activityredis_broker设置强密码和端口(与你在docker-compose.yml中定义的Redis命令相符)。
    # Redis for Celery Broker
    REDIS_BROKER_PASSWORD=your_broker_redis_password
    REDIS_BROKER_PORT=6379 # 或者你指定的端口
    
    # Redis for Activity Stream/Cache
    REDIS_ACTIVITY_PASSWORD=your_activity_redis_password
    REDIS_ACTIVITY_PORT=6380 # 或者你指定的端口
    
    # Flower (Celery 监控) 用户名和密码
    FLOWER_USER=your_flower_username
    FLOWER_PASSWORD=your_flower_password
    
    # Nginx 相关的环境变量 (如果你的Nginx配置依赖它们)
    DOMAIN=sanguok.com
    # NGINX_SETUP=https # 如果你打算用我的my-bookwyrm-nginx.conf,这一行可以不设置或删除
    
    根据实际的docker-compose.ymlREDIS_BROKER_PORTREDIS_ACTIVITY_PORT的配置来填写端口。

步骤6:构建和启动服务

  1. 构建Docker镜像:

    docker compose build
    

    这会根据更新的Dockerfiledocker-compose.yml来构建所有服务的镜像。

  2. 启动所有服务:

    docker compose up -d
    

    这将以后台模式启动所有容器。

  3. 检查日志以确认服务是否正常运行:

    docker compose logs -f
    

    密切关注nginx、Web和Celery服务的日志,确保它们没有错误并且正常监听。

步骤7:执行数据库迁移和初始化

首次启动新版本时,可能需要执行数据库迁移。

  1. 执行数据库迁移:

    docker compose exec web python manage.py migrate
    
  2. 创建超级用户 (如果还没有):

    docker compose exec web python manage.py createsuperuser
    
  3. 收集静态文件:

    docker compose exec web python manage.py collectstatic --noinput
    

步骤8:配置nginx和Cloudflare Zero Trust

  1. 确保宿主机上没有其他服务占用nginx计划监听的端口。 检查你的宿主机,确保其他服务没有占用8001端口 (如果你按照本教程将其配置为nginx的监听端口)。

    sudo lsof -i :8001 # 检查 8001 端口是否被占用
    

    如果被占用,需要停止占用8001端口的服务,或者将nginx配置为监听另一个空闲端口。

  2. Cloudflare Zero Trust配置: 在Cloudflare Zero Trust控制台,为域名(按前面的示例就是sanguok.com)配置应用程序,使其通过HTTP转发到你的服务器IP地址的8001端口。Cloudflare将负责从客户端到Cloudflare的HTTPS连接。

恭喜!

经过这些详细的步骤和针对特殊情况的调整,您的Bookwyrm实例应该能够成功从0.7.5升级到production分支的e217a17版本,并且在特定的Docker Host网络模式和Cloudflare Zero Trust环境下正常运行。

如果在升级过程中遇到问题,请检查服务日志,并对照本教程中的步骤进行排查。祝君顺利!