资讯动态

Zulip 如何把文件上传后端迁移到 S3 并迁移已有本地上传

发布时间:2026/9/14 3:41:57 来源:尧图企业网站定制
Zulip 如何把文件上传后端迁移到 S3 并迁移已有本地上传【免费下载链接】zulipZulip server and web application. Open-source team chat that helps teams stay productive and focused.项目地址: https://gitcode.com/GitHub_Trending/zu/zulipZulip 生产服务器默认使用LOCAL_UPLOADS_DIR后端存储用户上传的文件消息附件、用户头像、组织图标、自定义 emoji 等文件直接放在服务器磁盘上。这个后端无法在多服务器部署下共享也不具备扩展能力官方文档给出的出路是迁移到 S3或boto库支持的任意 S3 兼容块存储。本文覆盖完整迁移路径先把上传后端配置为 S3再用官方迁移命令把本地已有的上传文件传到 S3最后关闭本地后端。前提条件已按标准流程安装 Zulip 生产服务器配置文件位于/etc/zulip/settings.py和/etc/zulip/zulip-secrets.conf拥有可用的 AWS 控制台或对应 S3 兼容存储服务商的控制台权限执行重启等命令需要 rootsudo权限。创建 IAM 账号与两个 S3 bucket在 AWS 管理控制台中为 Zulip 服务器创建一个专用的 IAM 账号API user并创建两个 bucket一个用于消息中上传的文件S3_AUTH_UPLOADS_BUCKET这个 bucket 不应是世界可读的一个用于用户头像S3_AVATAR_BUCKET这个 bucket 一般配置为世界可读。需要两个 bucket 的原因正是上面两者的公开程度不同。头像 bucket 世界可读、文件 bucket 不公开是文档明确给出的安全模型要求详见docs/production/securing-your-zulip-server.md。配置 S3 后端以下配置都在服务器上操作。1. 写入访问密钥把 IAM 账号的 S3 access key 和 secret key 写入/etc/zulip/zulip-secrets.confs3_key 你的 access key s3_secret_key 你的 secret key替代方案如果 Zulip 服务器本身运行在 EC2 实例上可以改为给该实例绑定前面创建的 IAM role这样无需在 secrets 文件中填写密钥。2. 修改 /etc/zulip/settings.pyS3_AUTH_UPLOADS_BUCKET exampleinc-zulip-uploads S3_AVATAR_BUCKET exampleinc-zulip-avatars LOCAL_UPLOADS_DIR /home/zulip/uploadsexampleinc-zulip-uploads等是文档中的示例名替换为你实际创建的 bucket 名。注意这一步保留LOCAL_UPLOADS_DIR不要注释掉迁移工具需要这个值来定位本地上传文件。本地目录的默认值是/home/zulip/uploads。按环境补充以下设置非 AWS 块存储服务商设置S3_ENDPOINT_URL为你的 endpoint 地址文档示例值为https://s3.eu-central-1.amazonaws.com某些 AWS region需要把S3_REGION设置为该 region 的代码示例值eu-central-1非 AWS 服务商如果上传时看到涉及XAmzContentSHA256Mismatch的异常设置S3_SKIP_CHECKSUM True。文档建议先不加这一项遇到异常再启用使用 Google Cloud Platform 的读者除上述配置外还需要一个包含Storage Object Admin权限的服务账号密钥文件/etc/zulip/gcp_key.json供分块上传服务tusd使用细节见 docs/production/upload-backends.md 的 Google Cloud Platform 小节。3. 配置 bucket 策略两个 bucket 的 S3 bucket policy 不同。文件上传 bucket 的 policy文档示例将ARN_PRINCIPAL_HERE替换为你的 IAM principal ARN、BUCKET_NAME_HERE替换为 bucket 名{ Version: 2012-10-17, Id: Policy1468991802320, Statement: [ { Sid: Stmt1468991795370, Effect: Allow, Principal: { AWS: ARN_PRINCIPAL_HERE }, Action: [ s3:GetObject, s3:DeleteObject, s3:PutObject ], Resource: arn:aws:s3:::BUCKET_NAME_HERE/* }, { Sid: Stmt1468991795371, Effect: Allow, Principal: { AWS: ARN_PRINCIPAL_HERE }, Action: s3:ListBucket, Resource: arn:aws:s3:::BUCKET_NAME_HERE } ] }头像 bucket 的 policy 在此基础上多一条世界可读的s3:GetObject授权{ Version: 2012-10-17, Id: Policy1468991802321, Statement: [ { Sid: Stmt1468991795380, Effect: Allow, Principal: { AWS: ARN_PRINCIPAL_HERE }, Action: [ s3:GetObject, s3:DeleteObject, s3:PutObject ], Resource: arn:aws:s3:::BUCKET_NAME_HERE/* }, { Sid: Stmt1468991795381, Effect: Allow, Principal: { AWS: ARN_PRINCIPAL_HERE }, Action: s3:ListBucket, Resource: arn:aws:s3:::BUCKET_NAME_HERE }, { Sid: Stmt1468991795382, Effect: Allow, Principal: { AWS: * }, Action: s3:GetObject, Resource: arn:aws:s3:::BUCKET_NAME_HERE/* } ] }4. 重启服务器使配置生效sudo /home/zulip/deployments/current/scripts/restart-server官方建议是在生产环境首次设置时就完成 S3 配置这样从第一天起新上传就直接进 S3。对已有本地上传的服务器则继续下面的迁移步骤。迁移已有的本地上传文件1. 确认 LOCAL_UPLOADS_DIR 仍然启用这是迁移工具定位本地文件的前提。如果settings.py中LOCAL_UPLOADS_DIR被注释掉迁移命令会直接报错Please set the value of LOCAL_UPLOADS_DIR.。2. 运行迁移命令在/home/zulip/deployments/current目录下执行./manage.py transfer_uploads_to_s3该命令把本地上传目录中的文件全部上传到 S3默认使用 6 个并行进程文档说明上传是对时延敏感的操作因此默认并行执行。需要调整并行度时使用--processes参数./manage.py transfer_uploads_to_s3 --processes 4--processes至少为 1否则命令会报错You must have at least one process.。3. 确认迁移完成命令成功时的输出来自迁移命令本身Transfer to S3 completed successfully.命令还会为每个已上传的对象记录日志例如Uploaded message file in path ...、Uploaded avatar for ...、Uploaded emoji file in path ...。迁移完成后在 S3 控制台确认文件上传 bucket 中能看到与本地LOCAL_UPLOADS_DIR对应的对象。4. 关闭本地后端并重启迁移完成后回到/etc/zulip/settings.py注释掉LOCAL_UPLOADS_DIR在行首加#然后再次执行重启命令sudo /home/zulip/deployments/current/scripts/restart-server至此 S3 成为唯一的上传存储后端新上传的文件直接写入 S3本地磁盘不再参与存储。迁移的限制与后续注意事项不迁移组织头像/logo文档明确说明当前版本的迁移工具不会迁移已上传的组织头像或 logoorganization avatar or logo。如果你使用了组织头像或 logo迁移后需要重新上传一次。本地文件不会被删除迁移命令只把文件复制到 S3本地LOCAL_UPLOADS_DIR中的文件仍在磁盘上。文档没有给出自动清理流程是否保留由你自行决定。缓存与 DNS启用 S3 后端后Zulip 会在本地用 nginx 维护近期上传文件的缓存相关参数为s3_memory_cache_size默认 1MB、s3_disk_cache_size默认 200MB、s3_cache_inactive_time默认 30 天大型或图片密集型部署可能需要调大s3_disk_cache_size。nginx 解析 S3 主机名需要显式 DNS nameserver默认取/etc/resolv.conf中的第一个如需在/etc/zulip/zulip.conf中调整nameserver项见docs/production/system-configuration.md调整后要运行/home/zulip/deployments/current/scripts/zulip-puppet-apply更新 nginx 配置。数据导出文件的去向使用 S3 后端时从 UI 或命令行--upload触发的数据导出默认上传到世界可读的头像 bucketS3_AVATAR_BUCKET。如果希望导出文件存放在专用 bucket可设置S3_EXPORT_BUCKETbucket 策略与文件上传 bucket 相同链接有效期 1 周并用aws s3 sync把旧 bucket 中exports/目录下的已有导出复制到新 bucket。存储类别可选上传文件一般先频繁访问、然后逐渐冷下来可在settings.py设置S3_UPLOADS_STORAGE_CLASS如INTELLIGENT_TIERING降低存储成本。该设置只影响新对象要改变已有对象的存储类别需要用aws s3 cp --recursive做原地复制且一次性生命周期转换会产生费用文档示例命令aws s3 cp --storage-class INTELLIGENT_TIERING --recursive \ s3://your-bucket-name/ s3://your-bucket-name/单服务器小规模部署可以继续留在本地后端不动当你需要多服务器共享上传或磁盘规模已到瓶颈时按上面的路径一次性完成切换即可。【免费下载链接】zulipZulip server and web application. Open-source team chat that helps teams stay productive and focused.项目地址: https://gitcode.com/GitHub_Trending/zu/zulip创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价