Strapi应用部署到Heroku后每次本地更新推送就丢失数据是什么原因?
Strapi部署Heroku推送更新后数据丢失原因及修复方案
可能的核心原因
1. 未关闭生产环境自动数据迁移配置
- Strapi v4及以上版本默认开启自动Schema迁移,如果你没有在
config/env/production/database.js中显式设置autoMigration: false,每次部署重启服务时,只要你本地修改了内容类型结构,服务启动会自动重建对应数据库表,直接清空原有表内的全部业务数据。 - 管理员账号密码默认存储在
strapi_administrator相关表中,自动迁移也会重置这部分表结构,最终导致管理员账号被清空。
2. 未正确绑定Heroku Postgres数据库
- 如果你本地开发用的是默认SQLite数据库,且没有配置Strapi生产环境读取Heroku的Postgres数据库参数,那么Strapi在Heroku上实际还是运行在临时文件系统的SQLite数据库上:Heroku的临时文件系统每次部署、重启都会被完全重置,所有存储在SQLite里的数据自然会全部丢失,哪怕你已经在Heroku后台创建了Postgres数据库也不会生效。
- 排查方式:进入Heroku应用后台的「Settings」页面,查看Config Vars中是否存在
DATABASE_URL变量,再确认你的Strapi生产环境数据库配置是读取该环境变量,而非写死的本地SQLite路径。
3. 构建脚本包含清空数据库的命令
- 如果你在
package.json的build或heroku-postbuild脚本中配置了strapi reset、strapi db:drop之类的命令,每次推送部署执行构建流程时,会主动清空数据库全部数据。 - 若开启了Strapi的初始化种子功能且种子文件配置逻辑错误,也可能在每次服务启动时覆盖原有数据。
快速修复步骤
- 修改Strapi生产环境数据库配置,关闭自动迁移,参考配置如下:
module.exports = ({ env }) => ({ connection: { client: 'postgres', connection: { connectionString: env('DATABASE_URL'), ssl: { rejectUnauthorized: false }, }, useNullAsDefault: true, autoMigration: false, // 新增该行,禁止自动重置表结构 }, });
- 确认所有生产环境数据库配置读取的是Heroku提供的
DATABASE_URL环境变量,删除所有硬编码的本地数据库参数。 - 检查
package.json的所有脚本配置,删除会清空数据库的相关命令。 - 首次修复部署后手动重新创建管理员账号,后续推送更新不会再出现数据清空问题。
内容的提问来源于stack exchange,提问作者morteza mortezaie
相关产品推荐
相关产品推荐

