Skip to content

feat(storage): 支持通过环境变量配置文件存储目录 - #228

Merged
ThaddeusJiang merged 8 commits into
mainfrom
feat/storage-dir-env-config
Jul 2, 2026
Merged

ThaddeusJiang merged 8 commits into
mainfrom
feat/storage-dir-env-config

Conversation

@ThaddeusJiang

@ThaddeusJiang ThaddeusJiang commented Jul 1, 2026 •

Copy link
Copy Markdown
Owner

背景

旧 PR #219 对应分支已经明显落后 main,已关闭。本 PR 基于最新 main 重新实现 storage dir 配置,并已 rebase 到当前 origin/main。

当前默认值模型:dev/test 使用源码目录下的 data/storage,prod 使用 VMEMO_STORAGE_DIR 或 /data/storage。

变更

  • 新增 VMEMO_STORAGE_DIR 生产环境运行时配置
  • config/dev.exs 和 config/test.exs 默认 storage root 为 data/storage
  • config/runtime.exs 只在 prod 中读取 VMEMO_STORAGE_DIR,未设置或为空时默认 /data/storage
  • 配置文件中不使用 Path.expand 推导 storage root;路径规范化保留在 Vmemo.Storage 边界
  • Docker image 默认 VMEMO_STORAGE_DIR=/data/storage,entrypoint 启动前确保 VMEMO_STORAGE_DIR/v1 存在
  • 保持最新 main 的固定媒体路由:浏览器展示走 /media/images/:id/:variant
  • 继续兼容记录中的 /storage/v1/... 存储 URL,并将物理文件解析到配置的 storage root 下 v1/...
  • 图片上传现在在展示变体生成失败时返回错误,避免保存不可展示的损坏图片
  • 更新图片存储、导入导出、头像、后台任务、文档、gettext 和相关测试

Rebase / Review

  • 已 rebase 到 origin/main 最新提交 bec0777f
  • 解决了 image route、Zeabur、job notification 文案相关冲突
  • Review 时发现并移除了 rebase 后夹带回来的无用 Nginx template/sed 替换逻辑

验证

  • mise exec -- mix format --check-formatted
  • git diff --check
  • MIX_ENV=test mise exec -- mix compile --warnings-as-errors --no-listeners --ignore-module-conflict
  • MIX_ENV=test mise exec -- mix test test/vmemo/memo/image_storage_test.exs test/vmemo_web/api/v1/image_controller_test.exs,37 tests, 0 failures
  • MIX_ENV=test mise exec -- mix check,退出码 0
  • sh -n rel/entrypoint.sh
  • docker run ... nginx -t 验证 dev / prod Nginx 配置
  • docker compose config 验证根 compose、e2e compose、本机自托管 compose
  • mix eval 验证 dev/test 默认输出仓库内 data/storage
  • MIX_ENV=prod VMEMO_STORAGE_DIR='' mix eval 输出 /data/storage
  • MIX_ENV=prod VMEMO_STORAGE_DIR='/tmp/vmemo-prod-storage' mix eval 输出自定义路径

备注

mix check 会输出项目既有 Sobelow / Credo 提示,但本次退出码为 0。

@ThaddeusJiang ThaddeusJiang self-assigned this Jul 1, 2026
@ThaddeusJiang

Copy link
Copy Markdown
Owner Author

已根据 review 更新:开发环境默认 storage root 移到 config/dev.exs;test/prod 中 VMEMO_STORAGE_DIR 未设置或为空时默认使用 /data/storage;同步调整 entrypoint、文档和 storage 测试。

@ThaddeusJiang

Copy link
Copy Markdown
Owner Author

已根据新的 review feedback 简化 storage 配置:\n\n- dev/test 直接配置为 data/storage,不在配置文件里做 Path.expand\n- runtime.exs 移除全环境 default_storage_dir 分支,只在 prod 中读取 VMEMO_STORAGE_DIR\n- prod 中 VMEMO_STORAGE_DIR 未设置或为空时默认 /data/storage,非空时使用该值\n- 同步更新 .env.example、开发文档、spec 和 storage 测试\n\n本地已验证 dev/test 输出源码目录 data/storage,prod 空值输出 /data/storage,prod 自定义值可覆盖。

@ThaddeusJiang
ThaddeusJiang marked this pull request as ready for review July 1, 2026 14:43
@ThaddeusJiang
ThaddeusJiang force-pushed the feat/storage-dir-env-config branch from bbcff7b to 7e16160 Compare July 1, 2026 14:59
@ThaddeusJiang

Copy link
Copy Markdown
Owner Author

已按要求 rebase 到最新 origin/main,并完成 PR review。冲突解决时保留最新 main 的固定媒体路由、Zeabur 和 job 文案改动;review 中发现 rebase 带回了无用的 Nginx template/sed 替换逻辑,已移除。\n\n本地验证:format、warnings-as-errors 编译、focused tests(88 tests, 0 failures)、entrypoint shell 检查、Nginx 配置、root/e2e/local-machine compose config、dev/test/prod storage root eval 均通过。\n\n备注:mix check 在最新 main 上也因 priv/gettext/default.pot 过期失败,未将该 main 侧 gettext 变更混入本 storage PR。

@ThaddeusJiang

Copy link
Copy Markdown
Owner Author

已 push 最新 3 个提交:\n\n- fix(storage): 上传变体生成失败时返回错误\n- fix(test): 使用真实图片构造大文件上传用例\n- chore(gettext): 同步 gettext 文案模板\n\npush 前已验证 format、diff check、warnings-as-errors 编译、相关测试(37 tests, 0 failures)和 mix check,均通过。

@ThaddeusJiang
ThaddeusJiang merged commit 7720a94 into main Jul 2, 2026
3 checks passed
@ThaddeusJiang
ThaddeusJiang deleted the feat/storage-dir-env-config branch July 2, 2026 14:54
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