个人项目中 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
         - 健康检查
         - 失败则回滚

服务器端更新脚本

两种部署优缺点

相关推荐
newerp1 小时前
Golang 接口的两副面孔:eface、iface 与动态派发之谜
后端·程序员·go
morn_venus1 小时前
上位机业务卡死问题windbg分析
程序员
SimonKing3 小时前
Java 图片处理还在用 ImageIO?这个库让你代码从 30 行变 3 行
java·后端·程序员
涛涛ing3 小时前
一周之内,前端 AI 编程的格局被彻底改写了三次
前端·程序员
学不可以已18 小时前
Windows 开启/禁用 ping/icmp 回显服务
程序员
AskHarries18 小时前
Twitter 增长技巧
程序员
AIOps打工人20 小时前
【AIOPS】当运维 Agent 开始自己学:证据补全才是自学习的真门槛
程序员·架构
SimonKing1 天前
GenOffice上手指南:免费替代Word+PPT+Excel的AI办公神器
java·后端·程序员
Hilaku1 天前
Bun 真的能取代 Node.js 吗?
前端·javascript·程序员