如何在自建VPS生产环境用Drizzle ORM&Remix执行SQLite生成与迁移
解决方案
1. 给prestart加条件判断,只跑一次初始化
直接修改prestart脚本,通过检查SQLite数据库文件是否存在,只有当文件不存在时才执行数据库初始化命令。你的生产环境是Linux VPS,用bash的条件判断就行:
把package.json里的scripts改成这样:
"scripts": { "build": "remix build", "dev": "remix dev --manual", "lint": "eslint --ignore-path .gitignore --cache --cache-location ./node_modules/.cache/eslint .", "prestart": "if [ ! -f ./sqlite.db ]; then npm run db:generate && npm run db:push; fi", "start": "remix-serve ./build/index.js", "clean": "rimraf .cache/ build/ public/build/", "db:push": "drizzle-kit push:sqlite --config drizzle.config.ts", "db:generate": "drizzle-kit generate:sqlite --config drizzle.config.ts", "db:studio": "drizzle-kit studio --host localhost --port 3002 --verbose --config drizzle.config.ts", "db:seed": "cross-env NODE_ENV=development tsx ./app/seed/index.ts", "typecheck": "tsc", "prettier": "prettier --write app/**/*.{ts,tsx}" }
这里用db:push是因为它能直接把schema同步到数据库,适合生产环境快速初始化。如果你习惯用迁移文件执行,把npm run db:push换成你开发时用的db:migrate就行——要是脚本里没这个命令,记得补充(比如用drizzle-orm的migrate命令)。
2. 必须做:让数据库文件持久化
在Easypanel部署时,一定要把./sqlite.db所在的目录挂载成持久化卷。不然容器重启或者重新部署的时候,数据库文件会被清空,每次启动都会重新初始化,之前的数据全丢。
操作大概是:
- 打开Easypanel的应用配置,找到「Volumes」选项
- 添加一个卷,把容器内的
./sqlite.db路径(或者它所在的整个目录)映射到VPS主机上的持久化目录
3. 备选方案:手动跑一次初始化
要是不想依赖prestart脚本,也可以在首次部署的时候,用Easypanel的终端功能手动执行一次:
npm run db:generate && npm run db:push
之后启动应用就行,后续再启动不需要重复执行。这种方式更可控,但得手动操作一遍。
内容的提问来源于stack exchange,提问作者deadcoder0904
相关产品推荐
相关产品推荐

