🚀 部署指南

本文覆盖 lhx-kit 模板生成的项目在前端静态部署后端服务部署容器化k8s 微服务四个场景下的部署方案。


一、前端静态部署

1.1 构建产物

pnpm build          # lhx-cli build → Vite 构建 → dist/

dist/ 目录包含若干 HTML 入口(每个 MPA page 对应一个),以及 assets/。

1.2 Nginx

nginx.conf
server {
    listen 80;
    server_name yourdomain.com;
    root /var/www/my-app/dist;
    index home.html;

    # 每个 MPA 页面独立 try_files
    location /home {
        try_files /home.html =404;
    }
    location /settings {
        try_files /settings.html =404;
    }

    # 静态资源长缓存
    location /assets/ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    # gzip
    gzip on;
    gzip_types text/plain text/css application/javascript application/json image/svg+xml;
}

1.3 Docker(模板自带 Dockerfile)

所有前端模板内置多阶段 Dockerfile(node 构建 → nginx 产出):

docker build -t my-app:latest .
docker run -p 80:80 my-app:latest

1.4 GitHub Pages

.github/workflows/deploy.yml
name: Deploy to GitHub Pages
on:
  push:
    branches: [master]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: pnpm/action-setup@v4
        with: {version: 10}
      - uses: actions/setup-node@v4
        with: {node-version: '20', cache: 'pnpm'}
      - run: pnpm install --frozen-lockfile
      - run: pnpm build
      - uses: actions/upload-pages-artifact@v3
        with: {path: dist}
      - uses: actions/deploy-pages@v4

1.5 Vercel / Netlify

Framework Preset 设为 Vite,构建命令改为 pnpm build,发布目录 dist


二、Offline 离线包发布

构建完成后,运行离线打包:

pnpm build
pnpm offline:build   # → dist-offline/offline.zip

offline.zip 上传到你的 CDN 或原生 App 的资产服务器。原生 App 侧读取清单(offline.zip 内的 manifest.json)比对版本号,按需下载差量包。


三、后端服务部署(express / koa / fastify)

3.1 生产构建

pnpm build        # tsc → dist/
pnpm start        # node dist/server.js

3.2 PM2 Cluster(内置 feature)

模板内置 pm2 feature(--features=pm2)生成 ecosystem.config.cjs

pnpm start:pm2    # pm2 start ecosystem.config.cjs
pnpm reload:pm2   # 零停机热更新
pnpm logs:pm2     # 查看日志
pnpm stop:pm2     # 停止所有进程

ecosystem.config.cjs 默认配置:

module.exports = {
  apps: [{
    name: 'my-app',
    script: 'dist/server.js',
    instances: 'max',          // 使用所有 CPU 核心
    exec_mode: 'cluster',
    max_memory_restart: '512M',
    env: {NODE_ENV: 'production'}
  }]
};

3.3 Docker Compose

所有后端模板自带 docker-compose.yml(含 postgres / redis / app services):

# 开发环境:只启动依赖服务
docker compose up postgres redis -d

# 生产环境:完整部署
docker compose up -d

3.4 多阶段 Dockerfile

docker build -t my-api:latest .
docker run -p 3000:3000 \
  -e DATABASE_URL=postgres://... \
  -e REDIS_URL=redis://... \
  my-api:latest

3.5 数据库迁移(db-migrate feature)

部署前执行迁移(--features=db-migrate 生成的脚本):

pnpm db:migrate    # 执行所有待应用的 up 迁移
pnpm db:status     # 查看迁移状态
pnpm db:rollback   # 回滚最后一批迁移

推荐在 CI/CD 管道中:

steps:
  - run: pnpm build
  - run: pnpm db:migrate
  - run: pnpm start:pm2

四、微服务部署(express / koa / fastify -micro)

4.1 k8s Manifests

微服务模板自带 k8s/ 目录:

# 部署
kubectl apply -f k8s/deployment.yaml
kubectl apply -f k8s/service.yaml

# 查看状态
kubectl get pods -l app=my-worker
kubectl logs -l app=my-worker --tail=100

k8s/deployment.yaml 配置了 liveness / readiness probe:

livenessProbe:
  httpGet:
    path: /livez
    port: 3000
  initialDelaySeconds: 10
  periodSeconds: 10

readinessProbe:
  httpGet:
    path: /readyz
    port: 3000
  initialDelaySeconds: 5
  periodSeconds: 5

/livez 返回 {status: "ok"}(不检查依赖,进程存活即可)。
/readyz 检查 db.ping() + cache.ping(),只有依赖全部就绪才返回 200。

4.2 BullMQ Worker 部署

微服务包含独立的 worker 进程:

# 开发
pnpm dev:worker

# 生产(PM2)
pnpm start:worker

# 或单独启动
node dist/worker.js

建议:将 API server 和 worker 部署为两个独立的 k8s Deployment,便于分别扩容。

4.3 水平扩展注意事项

  • BullMQ 默认以 Redis 为队列后端,多副本共享同一队列,自动负载分摊
  • API server 无状态,可直接水平扩展
  • 如果使用 PM2 cluster 模式,单机多核已经覆盖,不需要同时多副本 + cluster

五、business-mono 全栈部署

business-mono/
├── apps/api/      → Docker 镜像 → k8s Deployment 或 PM2
└── apps/web/      → 静态产物 → Nginx / CDN / Docker

5.1 分别构建

# 从 monorepo 根
pnpm build                          # turbo 并行构建 api + web + packages

# 单独构建
pnpm --filter @my-mono/api build
pnpm --filter @my-mono/web build

5.2 Docker Compose(含 web)

在根 docker-compose.yml 追加 web service(模板默认未含,根据实际需要添加):

docker-compose.yml 追加
services:
  web:
    image: nginx:alpine
    ports:
      - '80:80'
    volumes:
      - ./apps/web/dist:/usr/share/nginx/html:ro
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - api

5.3 CI/CD 示例

.github/workflows/deploy.yml
jobs:
  deploy:
    steps:
      - run: pnpm install --frozen-lockfile
      - run: pnpm typecheck
      - run: pnpm lint
      - run: pnpm build
      - run: pnpm --filter @my-mono/api db:migrate
      - name: Push Docker image
        run: |
          docker build -t my-api:${{ github.sha }} ./apps/api
          docker push my-api:${{ github.sha }}
      - name: Deploy to k8s
        run: kubectl set image deployment/api api=my-api:${{ github.sha }}

六、环境变量管理

文件 用途
.env.example 模板,提交到 git,展示所有必需变量
.env 本地开发值,不提交
.env.production 生产值,通过 CI/CD secret 注入,不提交

后端服务使用 zod 在启动时验证 process.env,缺少必需变量会立即崩溃(fail-fast),避免运行时才发现配置错误。


七、健康检查端点

端点 适用模板 行为
GET /livez 所有后端 + 微服务 进程存活检查,始终 200
GET /readyz 所有后端 + 微服务 检查 db + cache 连接,依赖就绪返回 200
GET / express-service 等 欢迎页 / API 版本信息