You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 16:01:28