pnpm workspace + Turborepo 负责定义管理共享包和编排脚本调度任务;Prisma 负责数据层;Docker 负责在本地提供 PostgreSQL 数据库;生产环境还是【源码构建 + PM2 + Nginx】部署,不是 Docker 容器化部署。
五者职责一览

本地开发协作流程
启动本地数据库 Docker
bash
cd apps/server
docker compose up -d // 根据当前目录下的 docker-compose.yml,创建并启动其中定义的所有服务,并在后台运行。
apps/server/docker-compose.yml 只定义了一个服务:
yaml
services:
postgres:
image: postgres:15-alpine
container_name: wristellar-postgres
environment:
POSTGRES_USER: ${POSTGRES_USER:-wristellar}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-wristellar}
POSTGRES_DB: ${POSTGRES_DB:-wristellar}
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-wristellar} -d
${POSTGRES_DB:-wristellar}"]
本地开发时,Docker 的唯一作用就是提供这个 PostgreSQL 实例(这个示例是干嘛的)apps/server/.env 中的 DATABASE_URL 指向它:
env
DATABASE_URL=postgresql://wristellar:wristellar@localhost:5432/wristellar?schema=public
安装依赖
pnpm 会:
- 根据 pnpm-workspace.yaml 配置将指定目录纳入 workspace
- 把 @wristellar/types 通过 workspace:* 链接到不同应用的 node_modules 中
- 再安装所有共享/独立依赖
开发运行
bash
pnpm dev # turbo run dev
# 或
pnpm dev:server # turbo run dev --filter=server
Turborepo 会:
- dev 命令设置了 persistent: true,Turborepo 会保持进程运行,若启动多个包, server 和 web 会并行运行
- @wristellar/types 的 dev 设置了 tsc --watch,修改类型定义会实时重新编译
数据库模型迭代
开发中修改表结构时,在 app/server 下执行:
bash
# 根据 schema.prisma 生成新的迁移 SQL 文件到 prisma/migrations/
pnpm db:migrate # prisma migrate dev
# 生成 @prisma/client 的运行时代码和 TypeScript 类型
pnpm db:generate # prisma generate
# 打开可视化数据库管理界面
pnpm db:studio # prisma studio
生产部署协作流程
生产环境使用以下流程:
js
git pull → pnpm install → pnpm build → prisma migrate deploy → pm2 restart
具体由 scripts/update-server.sh 和 GitHub Actions 的 .github/workflows/deploy.yml 共同完成。
GitHub Actions 自动部署
yaml
jobs:
lint:
- pnpm install
- pnpm lint
typecheck:
- pnpm install
- pnpm typecheck
build-and-deploy:
needs: [lint, typecheck]
- pnpm install
- NODE_OPTIONS="--max-old-space-size=8192" pnpm build
- 通过 SSH 在服务器上执行 scripts/update-server.sh
- 健康检查
- 失败则回滚
服务器端更新脚本

两种部署优缺点


