使用Heroku CLI Git部署NodeJS网站:推送前如何同步本地与服务器文件?
解决Heroku部署覆盖用户上传文件的问题
这个问题我之前帮好几个开发者踩过坑,核心其实是Heroku的文件系统特性在搞怪,先给你搞定眼前的同步需求,再说说长期的正确解决方案,省得以后再头疼~
先救急:推送代码前把服务器上的用户文件同步到本地
因为Heroku每次部署都会完全重置dyno的文件系统,所以你得先把服务器上用户上传的images文件夹拉到本地,再推送新代码:
- 第一步:进入Heroku服务器的终端,打包用户上传的图片
heroku run bash -a 你的Heroku应用名字 # 进入服务器后执行打包命令 tar -czf images.tar.gz images/ exit - 第二步:把打包好的压缩包下载到本地
heroku ps:copy images.tar.gz -a 你的Heroku应用名字 - 第三步:本地解压压缩包,把服务器上的图片合并到本地images文件夹
tar -xzf images.tar.gz # 解压完就可以把这个压缩包删掉啦 rm images.tar.gz - 第四步:确认.gitignore里已经添加了
images/,别把用户文件误提交到Git仓库
打开你的.gitignore文件,确保有这一行:images/ - 第五步:正常推送代码到Heroku
git add . git commit -am "你的更新描述" git push heroku master
更关键的长期方案:别用Heroku本地存用户上传内容
上面的同步方法只是临时救急,因为Heroku的dyno文件系统是临时且易失的:
- 每次部署(git push)都会彻底清空dyno里的文件,之前用户上传的内容全没了
- 就算不部署,dyno重启(比如自动扩容、系统维护)后,用户的文件也会丢失
所以正确的做法是把用户上传的图片和内容放到专门的云存储服务:
- 让你的Node.js应用直接把用户上传的文件传到云存储(比如AWS S3、Cloudinary、Google Cloud Storage)
- 应用只需要把这些文件的访问URL存在数据库里,不用存文件本身
- 这样不管你怎么部署Heroku应用,用户的文件都不会丢,也再也不用折腾本地和服务器的文件同步了
这样处理后,以后推送代码就完全不用担心用户内容丢失的问题啦~
内容的提问来源于stack exchange,提问作者Eli Chitrit
相关产品推荐
相关产品推荐

