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

服务器端更新脚本

两种部署优缺点

相关推荐
深蓝AI2 小时前
无头浏览器不必从 Chrome 改:Lightpanda 用 Zig 从零造,100 个页面只占 123MB 内存
人工智能·程序员
深蓝AI8 小时前
桌面 Agent 缺的不是视觉:Vercel 开源 agent-desktop,用无障碍树 ref 替代截图坐标
人工智能·程序员
高晶13 小时前
SPMI 控制器 RTL 设计与验证新手入门
设计模式·程序员·架构
kyriewen13 小时前
我验了 7 种 sticky 失效说法:3 种根本不成立
前端·javascript·程序员
深蓝AI18 小时前
编码 Agent 的界面味靠提示词压不住:Impeccable 用无模型规则拦同一套模板
前端·程序员
Fox爱分享19 小时前
都问程序员双十一买什么,我的答案一定是这块专业编程显示器
后端·程序员·ai编程
SimonKing21 小时前
素笺( local-notes)全面优化,新增功能体验不一样的笔记
java·后端·程序员
codigger21 小时前
Redis 为什么快?把 "存内存" 这句话拆开看
redis·后端·性能优化·程序员
狂师1 天前
GitHub 上最值得装的 8 个 Agent Skill 仓库,亲测好用!
程序员·github·ai编程
kyriewen2 天前
我测了 6 种防请求竞态的写法:只有 1 种真能打
前端·javascript·程序员