如何防止Heroku部署时用户数据JSON文件被git提交意外覆盖
Heroku 的 Dyno 采用临时性文件系统设计:所有应用运行时写入本地磁盘的文件,都会在 Dyno 重启、重新部署、平台自动替换实例时被完全清空。你当前将用户提交数据存储在本地 JSON 文件的方案本身就存在固有数据丢失风险,和是否提交覆盖该文件无关。如果是生产环境的业务数据,建议优先替换为 Heroku 托管数据库(如 PostgreSQL、Redis)或第三方对象存储存储,从根本上解决数据丢失问题。
将数据 JSON 加入
.gitignore
直接把存储用户数据的 JSON 文件路径写入项目根目录的.gitignore配置中,Git 会默认停止追踪该文件的变动,哪怕你本地误修改了该文件,git add、git commit操作也不会将其纳入提交范围,自然不会在git push heroku master时覆盖线上版本。
示例配置:如果你的数据文件路径为db/submissions.json,在.gitignore中添加一行db/submissions.json即可。使用 Git
assume-unchanged标记锁定文件
如果你已经将该 JSON 文件的初始版本提交到了 Git 仓库,不想删除仓库中的初始模板,又希望后续本地对该文件的修改不会被 Git 识别提交,可以给文件添加假定不变标记:
执行命令:git update-index --assume-unchanged <你的JSON文件相对路径>
后续如果需要更新该文件的初始版本并提交,执行git update-index --no-assume-unchanged <你的JSON文件相对路径>即可解除锁定。配置 Heroku 构建钩子备份恢复数据
你可以在 Heroku 构建流程中添加后置钩子,部署时先备份线上正在使用的 JSON 文件,部署完成后再自动恢复,完全避免部署操作覆盖线上数据:在项目根目录新建bin/post_compile脚本,写入对应备份恢复逻辑即可,Heroku 构建完成后会自动执行该脚本。注意该方案仅能解决部署覆盖问题,无法解决 Dyno 重启导致的本地文件丢失问题。
内容的提问来源于stack exchange,提问作者fullstackplus

