Memos 多副本混跑新旧版本升级时,ACCESS 访问策略如何协调切换?

发布时间:2026/9/10 9:20:42
Memos 多副本混跑新旧版本升级时,ACCESS 访问策略如何协调切换? Memos 多副本混跑新旧版本升级时ACCESS 访问策略如何协调切换【免费下载链接】memosOpen-source, self-hosted note-taking tool built for quick capture. Markdown-native, lightweight, and fully yours.项目地址: https://gitcode.com/GitHub_Trending/me/memos多副本部署 Memos 并做滚动升级时会跨越一个版本边界新版本的访问策略由独立持久化的ACCESS设置决定而旧副本仍然按“实例 URL 是否非空”这一遗留规则决定匿名访问是否放行。混跑期间如果两侧副本的有效策略不一致一个存储策略为PRIVATE的实例可能经由旧副本被匿名访问。本文的任务就是在一次多副本滚动升级中让新旧副本的访问策略保持一致并按文档给出的顺序完成ACCESS策略的切换与回滚。相关规则见 docs/configuration-provisioning.md版本行为变化见 CHANGELOG.md。升级前两侧版本各自按什么规则放行协调切换的前提是弄清两侧副本的判断逻辑因为它们不同旧副本引入ACCESS之前的版本忽略ACCESS设置继续使用遗留规则——实例 URL 非空即允许匿名访问。CHANGELOG 同时显示从 0.30.0 起未设置--instance-url或MEMOS_INSTANCE_URL的实例进入 private 模式匿名访客被导向登录页匿名 API 访问被限制在 setup、认证和 shared-memo 路由RSS 不可用。新版本副本访问策略由ACCESS设置显式指定必须是INSTANCE_ACCESS_MODE_PRIVATE或INSTANCE_ACCESS_MODE_PUBLIC之一。实例 URL 是独立的部署属性不再改变“谁可以访问实例”--instance-url或MEMOS_INSTANCE_URL必须是绝对 HTTP(S) URL不能带凭据、query 或 fragment启动时会修剪首尾空白和末尾斜杠。一次性初始化新版本首次启动时如果数据库中没有ACCESS行会根据遗留的启动配置创建遗留配置中规范化实例 URL 非空则记为PUBLIC否则记为PRIVATE。这是一次性的兼容决策——行存在之后再增加、删除或修改实例 URL 都不会改变访问策略。最后一条意味着只要升级前把实例 URL 调整到与目标策略一致新版本副本初始化出的ACCESS行就自然等于目标策略混跑期间两侧副本的有效策略也天然一致。协调原则混跑期间新旧副本的有效策略必须一致docs/configuration-provisioning.md 对多副本场景给出的约束是明确的在修改ACCESS或把流量路由到“策略与遗留规则不同”的副本之前先 drain 掉所有旧副本。不要让旧副本和新副本以不同的有效访问策略同时对外提供流量。如果通过部署文件下发配置同一部署的所有副本必须挂载相同的文件滚动发布可以暂时同时存在新旧两代配置但 Memos 不做跨副本的配置协调或缓存失效readiness 只在新快照校验成功后才上报。按这三条约束最短可行的主路径是确定目标策略PUBLIC或PRIVATE。对齐遗留规则把旧副本的--instance-url设置为与目标一致的值——目标为 public 则保持非空 URL目标为 private 则置空。此时旧副本按遗留规则得出的有效策略即等于目标策略。滚动升级每个新版本副本首次启动时按上述规则初始化ACCESS行与目标策略一致。此阶段新旧副本同时对外服务但有效策略相同满足第 2 条约束。drain 旧副本全部旧副本停止接收流量之后才允许把ACCESS改成与遗留规则不同的值例如 URL 保持非空但策略改为PRIVATE此后实例 URL 与访问策略解耦可以独立调整。反过来操作——先改ACCESS再升级——就会让还在服务旧副本的流量落到策略不一致的副本上正是文档要求避免的状态。可选分支用部署文件固定 ACCESS如果部署侧希望把访问策略做成文件管理的运行时覆盖而非依赖数据库中的存储值可以在/etc/secrets挂载 docs/configuration-provisioning.md 给出的格式文件名需符合memos-instance-setting-label.json模式推荐名为memos-instance-setting-access.json{ key: ACCESS, accessSetting: { accessMode: INSTANCE_ACCESS_MODE_PRIVATE } }使用部署文件时的规则每个文件只能声明一个设置 keyaccessMode必须显式选择PRIVATE或PUBLIC模式缺失或未指定时启动校验失败不会发布部分配置。文件在启动时读取一次构建不可变的运行时快照启动后修改文件重启进程后才生效。文件覆盖的ACCESS分组无法再通过 UI 或 API 修改此类更新会返回codes.FailedPrecondition删除文件并重启后该分组回落到数据库中的存储值存储值本身不会被删除或修改。文件覆盖的设置绕过数据库设置缓存因此某个副本不会用陈旧的缓存值替换部署值。多副本下务必让所有副本挂载同一代文件按上面的协调原则不要向文件代次不同的副本同时路由流量。验证切换结果文档给出的可核对信号有以下几个readiness滚动部署中副本只在新配置快照完整校验成功后才报告 ready任何匹配文件无效时不发布快照、启动失败不会出现部分生效的配置。启动日志日志按资源类型输出匹配到的文件数量文件名拼写错误可以不暴露文件内容即可被发现日志不包含文件内容。有效策略的行为表现策略为 private 时匿名访客被导向登录页匿名 API 访问仅限 setup、认证和 shared-memo 路由RSS 不可用0.30.0 CHANGELOG 对 private 模式的描述。跨副本可见性数据库支撑的ACCESS读取在没有文件覆盖时会绕过通用的十分钟数据库设置缓存因此从 public 改到 private 的变更在每次策略检查时对所有副本可见不会在别的进程里留下过期的 public 授权判定。回滚先对齐 URL 规则再 drain 新副本如果升级后需要回滚到旧版本文档要求的顺序是先把遗留的实例 URL 规则调整到与目标策略一致——public 对应非空 URL、private 对应空 URL——然后 drain 新版本副本完成回滚。否则会出现文档明确指出的风险状态旧副本上实例 URL 非空、而存储的ACCESS策略是PRIVATE旧副本按遗留规则放行匿名访问等于把一个私有实例暴露出去。需要注意的边界Memos 对这套进程本地的部署配置不做分布式协调也不做缓存失效跨版本边界的协调完全依赖上面“先对齐、再切换、旧副本先行 drain、回滚前再对齐 URL”的操作顺序以及 readiness 对新快照校验结果的把关。【免费下载链接】memosOpen-source, self-hosted note-taking tool built for quick capture. Markdown-native, lightweight, and fully yours.项目地址: https://gitcode.com/GitHub_Trending/me/memos创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考