Skip to content

fix(storage): preflight auto configuration and preserve legacy routing - #25

Merged
opendev9 merged 4 commits into
devfrom
fix/storage-config-20261020
Oct 20, 2026
Merged

opendev9 merged 4 commits into
devfrom
fix/storage-config-20261020

Conversation

@opendev9

@opendev9 opendev9 commented Oct 20, 2026 •

Copy link
Copy Markdown

当前存储 overlay 仍通过旧 S3 开关生成 multi 类;如果直接替换为 V2 配置,会把已有实例的路由切换与镜像升级绑在一起。本次统一容器内 /shared/seafile/library-storage,仅新安装默认 auto;已有实例保留原模式,显式 auto 时先盘点原配置,预检和登记成功后才改写 filesystem 配置。

基线:origin/dev a7e8c2bf1e4e7630dfa2e54427c1c03d98ad667e。
提交:0f3c5717d5364ad9ff2eaaec11808fa953baea49。
依赖:Hub #38 的 storage-reconcile CLI;必须与含该 CLI 的 Hub 源码组装,旧 Hub 会拒绝预检。

改动:

  • 新 .env.example 显式 CF_LIBRARY_STORAGE=auto。旧 overlay 不再硬编码 S3/multiple,unset 透传空值,bootstrap 在 S3=false 或 S3=true但 storage_type为空时均保留已落盘旧 multi/S3 后端,避免旧 .env 因 overlay 默认值变化被静默切换。
  • 标准 CE 的 conf/seafile-data 符号链接通过只读 realpath 传真实原生目录给 CLI;托管 root 禁止符号链接的边界不变。
  • 新装默认 auto;初始化中断通过既有 fresh-schema marker 保持意图。显式旧 S3/multiple 安装继续旧模式;已有 V2 root 重启保持 V2。
  • Compose 两个进程挂载同一父目录,create_host_path=false;根不存在、非目录、根或任级祖先为 symlink 均拒绝,不 mkdir。
  • auto 写 [cloudfile_v2] auto_local_root=/shared/seafile/library-storage、禁用 storage classes、三个后端 name=filesystem,不再生成 multi 类。显式 auto 独立于旧 S3 变量。
  • Compose cloudfile/cf-worker 实际容器环境均设置 SEAFILE_DATA_DIR=/shared/seafile/seafile-data 与 SEAFILE_CENTRAL_CONF_DIR=/shared/seafile/conf;真实 compose config 对新装 overlay 和不带 overlay 的旧装两种组合均验证环境值。
  • CLI 显式覆盖 SEAFILE_DATA_DIR 和 SEAFILE_CENTRAL_CONF_DIR 为当前实例真实原生目录;dry-run 严格只读,SCHEMA_MISSING/STATE_DRIFT 非业务阻塞,预检通过后 apply 才补表登记。
  • 临时候选配置保留原 backend/classes JSON,先调用 Hub CLI dry-run,再 apply;连接使用原数据库变量,密码通过环境传递,无独立 cfv2_* 数据库。stdout 完整 JSON 原样输出。
  • BLOCKED、执行错误、畸形报告,以及 NATIVE_CLASS_PINNED 都拒绝切换;PINNED 须由运维明确 normalize 类 ID,不自动删 RepoStorageId。dry-run/apply 失败保留原 seafile.conf;成功后原子替换,apply 可幂等重试。旧 cf_library_storage_key 不读、不改、不删。
  • T5 ecedbc6 仍适用于现行 bootstrap,按当前 dev 重新实现生成块原位置替换,保留本地引用/覆盖并拒绝畸形 marker;没有整枝或旧接口合并。bootstrap 已在现行上游改动清单登记,无新增上游改动文件。
  • build/v2/start-dev.py 属 T1 历史入口归档范围,本 PR 不触碰构建收据或 T1 文件。

验证命令与输出:

python3 -m unittest discover -s tests -p test_library_storage_config.py -v
Ran 15 tests in 0.050s
OK
python3 -m unittest discover -s tests -p test_settings_block_order.py -v
Ran 3 tests in 0.005s
OK
python3 -m unittest discover -s tests -p test_v06_default_library_storage.py -v
Ran 4 tests in 0.373s
OK
python3 -m unittest discover -s tests -p test_storage_class_config.py -v
Ran 6 tests in 0.246s
OK
python3 tools/test-bootstrap-settings.py
99 checks; 全部通过
(cd deploy/compose && docker compose --env-file .env.example config --quiet)
exit 0, no output
PYTHONPYCACHEPREFIX=/private/tmp/cloudfile-storage-pycache python3 -m py_compile scripts/scripts_14.0/library_storage.py scripts/scripts_14.0/bootstrap.py
git diff --check
exit 0, no output
python3 tests/check_storage_config_native.py /Users/bobo/workspace/openfile/cloudfile-server-native-build
Current Server guard accepts generated filesystem backends and rejects fs
# Server source: 1852ba439da2cf6c4200d2f170d81247099d15e7; compiled actual production C guard

原生对象后端使用 name=filesystem;存储类 JSON 内 backend: fs 的既有格式保持不变。跨仓检查直接编译/执行当前 Server C guard,用真实生成配置确认 filesystem 接受、fs 拒绝。

测试执行真实配置渲染、原文件写入/原子替换及 Compose 解析;Hub CLI 是显式替身,覆盖新装/旧装、预检原配置、BLOCKED/PINNED 拒绝、apply 失败、配置不变、根校验、重启幂等和 fresh 初始化重试。

未覆盖:完整镜像、真实 Hub CLI+SQL 的启动链、旧数据副本 dry-run/apply、C/Go 跨挂载字节流、历史/恢复/GC/fsck;由 T6 统一集成验证。未部署 DEV/生产,未合并 PR。存储迁移/发布仍须环境审批;运行 CLI apply 跨库部分成功可能已登记,失败时原配置保留且可幂等重试,不自动回滚记录。

@opendev9
opendev9 merged commit f0cb6fb into dev Oct 20, 2026
1 check passed
@opendev9
opendev9 deleted the fix/storage-config-20261020 branch October 21, 2026 00:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant