个人项目中 Monorepo, pnpm workspace, Turborepo, prisma 和 Docker 如何协作?

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
         - 健康检查
         - 失败则回滚

服务器端更新脚本

两种部署优缺点

相关推荐
duyacode2 天前
FastAPI为什么成为默认答案
程序员
Java_AI工程师2 天前
90%的人写Function Calling,只写了"把参数传给工具执行"这一步,剩下的参数校验、错误重试、超时控制、结果格式化,全是空白。
java·人工智能·程序员
Hilaku2 天前
为什么死磕 1px 的团队,用户体验反而更差?
前端·javascript·程序员
codigger2 天前
我用 AI 做完整项目后,总结出一套把需求钉死的工作流
ai·程序员·编程·ai编程·#人工智能
SimonKing2 天前
SpringBoot 集成 SSE 实现服务端推送或可代替Websocket
java·后端·程序员
挖掘狂人2 天前
用 AI 写代码别只甩一句指令,这套工作流救过我的项目
程序员·ai编程·codebuddy
Sam_Deep_Thinking2 天前
关于java final关键字的可见性
java·后端·面试·程序员
狂师2 天前
cloudflared,不需要服务器和公网 IP 的免费内网穿透,一条命令上手
服务器·程序员·开源
demo007x2 天前
我用 AI 做了一个跨平台的PopClip:拾趣Magpie
程序员·github·ai编程
zzzzzz3102 天前
每日一条技术记录:把碎片学习变成可复盘的知识卡片
程序员·markdown·沸点