DigitalOcean App Platform部署Strapi未加载生产配置仍使用SQLite
按出现概率从高到低依次排查:
配置文件语法/导出规范错误
Strapi v4默认项目采用CommonJS模块规范,如果你在/config/env/production/database.js里用了ESM的export default写法导出配置,文件会静默加载失败,直接回退到根目录的默认SQLite配置。
正确的配置写法参考:const { parse } = require('pg-connection-string'); module.exports = ({ env }) => { const dbConfig = parse(env('DATABASE_URL')); return { connection: { client: 'postgres', connection: { host: dbConfig.host, port: dbConfig.port, database: dbConfig.database, user: dbConfig.user, password: dbConfig.password, ssl: { rejectUnauthorized: false }, // DO托管Postgres必须加该SSL配置 }, debug: false, }, }; };注意路径是
/config/env/production/database.js,不是envs(多写一个s是最高发的手滑错误),Linux运行环境对文件名大小写敏感,不要把database.js写成Database.js。排查时可以在配置文件里加一行console.log('>>> Production postgres config loaded'),部署后看运行日志有没有打印这行,没打印就说明文件根本没被加载,优先检查路径拼写、文件名大小写、导出语法。Postgres客户端依赖缺失
Strapi默认不带Postgres连接驱动,必须手动安装pg包:在本地项目根目录执行npm install pg --save,确认package.json的dependencies里有pg的版本记录后再提交代码部署。
缺少该依赖时,Strapi加载Postgres配置会抛出warn级别的错误,很容易在构建日志里被忽略,之后自动回退到默认SQLite配置。环境变量作用域配置错误
检查DigitalOcean App Platform上的DATABASE_URL变量配置:- 确认变量值正确绑定了托管Postgres的完整连接串,不是拆分成的主机、端口、名单独变量
- 确认变量同时勾选了「构建时可用」和「运行时可用」,如果只配置了运行时变量,构建阶段Strapi读不到数据库配置,会直接用SQLite生成构建产物,后续运行阶段就算拿到变量也不会切换数据库客户端。
根目录配置覆盖/缓存问题
- 检查根目录
/config/database.js,如果文件里硬编码了SQLite配置,部分低版本Strapi存在配置合并bug,会把SQLite的client配置优先级提得比环境配置高,可以临时把根目录的数据库配置改成和生产环境一致的逻辑,排除覆盖问题 - 排除旧构建缓存影响:在DO App Platform控制台选择「清除缓存后重新部署」,旧的SQLite版本构建缓存可能会导致新配置不生效。
- 检查根目录
所有排查步骤做完后,正常部署的运行日志里会明确打印使用postgres客户端的记录,不会再生成本地SQLite数据库文件。
内容的提问来源于stack exchange,提问作者Keith Petrillo

