Files
order_site/docs/部署启动与数据库重建.md
T

6.2 KiB
Raw Blame History

部署启动与数据库重建

本文记录本地开发、数据库重建和 Ubuntu 服务器部署的常用命令。

项目当前数据库迁移以新库初始化为主,主要结构在:

apps/backend/src/db/migrations/001_init.sql

后端启动时会自动执行数据库迁移。迁移记录保存在数据库表 schema_migrations

本地开发启动

首次启动:

cp .env.mac-docker.example .env
docker compose -f docker-compose.dev.yml up -d --build

日常启动:

docker compose -f docker-compose.dev.yml up -d

查看服务状态:

docker compose -f docker-compose.dev.yml ps

查看日志:

docker compose -f docker-compose.dev.yml logs -f backend
docker compose -f docker-compose.dev.yml logs -f frontend

本地访问入口:

  • 前端、后台、领取页:http://localhost
  • 后端健康检查:http://localhost/health
  • 后端就绪检查:http://localhost/health/ready

本地重建数据库

如果迁移基线变化,或者需要清空本地测试数据,可以重建本地开发库。

只重建开发数据库,保留源码文件:

docker compose -f docker-compose.dev.yml down
docker volume rm order_site_postgres_dev_data
docker compose -f docker-compose.dev.yml up -d --build

如果提示 volume 不存在,说明本地数据库 volume 名称可能不同,可以先查看:

docker volume ls | grep postgres_dev_data

也可以直接删除当前 dev compose 创建的所有 volume

docker compose -f docker-compose.dev.yml down -v
docker compose -f docker-compose.dev.yml up -d --build

注意:down -v 会同时删除开发环境里的 postgres_dev_databackend_node_modulesfrontend_node_modules 等 volume。下次启动会重新安装依赖。

确认迁移结果:

docker compose -f docker-compose.dev.yml exec -T backend node --input-type=module -e '
const { query, closeDb } = await import("./src/db/client.ts");
try {
  const result = await query("SELECT filename FROM schema_migrations ORDER BY filename");
  console.log(result.rows.map((row) => row.filename).join("\n"));
} finally {
  await closeDb();
}
'

本地验证

后端:

docker compose -f docker-compose.dev.yml exec -T backend npm test
docker compose -f docker-compose.dev.yml exec -T backend npm run typecheck
docker compose -f docker-compose.dev.yml exec -T backend npm run build

前端:

docker compose -f docker-compose.dev.yml exec -T frontend npm run typecheck
docker compose -f docker-compose.dev.yml exec -T frontend npm run lint
docker compose -f docker-compose.dev.yml exec -T frontend npm run build

手动执行迁移:

docker compose -f docker-compose.dev.yml exec -T backend npm run db:migrate

服务器首次部署

服务器建议使用 Ubuntu + Docker Compose。

进入项目目录后执行:

cp .env.server.example .env

编辑 .env,至少替换这些值:

CADDY_SITE_ADDR
CLAIM_BASE_URL
POSTGRES_PASSWORD
DATABASE_URL
ADMIN_SESSION_SECRET
ADMIN_DEFAULT_USERS_JSON

生产 Docker 部署时,DATABASE_URL 如果连接 compose 内置 PostgreSQL,主机名应使用 postgres

DATABASE_URL=postgres://postgres:你的数据库密码@postgres:5432/order_site

不要写成:

DATABASE_URL=postgres://postgres:你的数据库密码@127.0.0.1:5432/order_site

因为后端运行在容器内,容器内的 127.0.0.1 指向后端容器自己,不是 PostgreSQL 容器。

执行部署:

bash deploy/ubuntu-deploy.sh

脚本会自动:

  • 检查 Docker 和 Docker Compose
  • 检查 .env 是否仍有占位值
  • 检查容器部署时 DATABASE_URL 是否误写成本机地址
  • 修正 apps/backend/data 目录权限
  • 构建并启动服务
  • 等待健康检查通过
  • 打印已应用数据库迁移

部署完成后查看服务:

docker compose ps

查看后端日志:

docker compose logs -f backend

服务器日常更新

拉取或上传新代码后,在项目目录执行:

bash deploy/ubuntu-deploy.sh

后端容器启动时会自动执行迁移,不需要单独手动跑迁移。

确认迁移记录:

docker compose exec -T backend node --input-type=module -e '
const { query, closeDb } = await import("./dist/db/client.js");
try {
  const result = await query("SELECT filename FROM schema_migrations ORDER BY filename");
  console.log(result.rows.map((row) => row.filename).join("\n"));
} finally {
  await closeDb();
}
'

服务器重建数据库

下面命令会删除生产数据库数据。只适合新开发、测试服务器或确认不需要保留数据的场景。

停止服务:

docker compose down

只删除 PostgreSQL 数据 volume,保留 Caddy 证书和配置 volume

docker volume rm order_site_postgres_data

重新部署:

bash deploy/ubuntu-deploy.sh

如果 volume 名称不确定,可以查看:

docker volume ls | grep postgres_data

不建议在生产服务器随手执行:

docker compose down -v

因为它会同时删除 postgres_datacaddy_datacaddy_config。这会清空数据库,并可能让 Caddy 重新申请证书。

常见问题

后端一直未 ready

查看诊断:

docker compose ps
docker compose logs --tail=120 backend

常见原因:

  • .env 仍有 change-me 占位值
  • DATABASE_URL 密码和已有 PostgreSQL volume 初始化密码不一致
  • DATABASE_URL 在容器部署中误写成 127.0.0.1
  • 后端迁移失败

修改了 001_init.sql 但旧库没有变化

schema_migrations 只记录迁移文件是否执行过。已经执行过 001_init.sql 的数据库,不会因为文件内容变化自动重跑。

新开发阶段如果不需要保留数据,直接重建数据库即可。

宿主机手动跑迁移连不上 postgres

.env 里的 postgres 主机名只在 Docker 网络里有效。宿主机直接跑迁移时需要临时使用宿主机地址:

cd apps/backend
DATABASE_URL=postgres://postgres:postgres@127.0.0.1:5432/order_site npm run db:migrate

容器内执行迁移时继续使用 .env 中的 postgres 服务名即可。