10.2.4 NestJS 项目怎么部署——NestJS 部署示例:API 服务与数据库连接
NestJS 部署的核心:编译 TypeScript,连接数据库。
部署流程概览
步骤一:编写 Dockerfile
在项目根目录创建 Dockerfile:
dockerfile
# 构建阶段
FROM node:18-alpine AS builder
WORKDIR /app
# 安装依赖
COPY package*.json ./
RUN npm ci
# 复制源码并编译
COPY . .
RUN npm run build
# 生产阶段
FROM node:18-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
# 只复制生产依赖
COPY package*.json ./
RUN npm ci --only=production
# 复制编译产物
COPY --from=builder /app/dist ./dist
# 复制 Prisma 相关文件(如果使用 Prisma)
COPY --from=builder /app/prisma ./prisma
RUN npx prisma generate
EXPOSE 3001
CMD ["node", "dist/main.js"]与 Next.js Dockerfile 的区别
| 差异点 | Next.js | NestJS |
|---|---|---|
| 输出目录 | .next/standalone | dist |
| 启动命令 | node server.js | node dist/main.js |
| ORM 配置 | 通常无 | 需要 Prisma generate |
| 端口 | 3000 | 3001 |
步骤二:配置数据库连接
环境变量设置
env
# .env.production
DATABASE_URL="postgresql://user:password@postgres:5432/mydb?schema=public"
REDIS_URL="redis://redis:6379"
JWT_SECRET="your-production-secret"
PORT=3001容器网络配置
在 1Panel 中,确保 NestJS 容器和数据库容器在同一网络:
容器间通信
在同一 Docker 网络中,可以用容器名作为主机名。例如数据库容器名为 postgres,连接地址就是 postgres:5432。
步骤三:在 1Panel 中部署
容器配置
| 配置项 | 值 | 说明 |
|---|---|---|
| 镜像 | registry.cn-hangzhou.aliyuncs.com/xxx/my-nestjs-api:v1.0.0 | 完整镜像地址 |
| 容器名 | nestjs-api | 便于识别 |
| 端口映射 | 3001:3001 | 外部:内部 |
| 网络 | 1panel-network | 与数据库同网络 |
| 重启策略 | always | 崩溃自动重启 |
环境变量配置
| 变量名 | 值 | 说明 |
|---|---|---|
NODE_ENV | production | 生产模式 |
DATABASE_URL | postgresql://... | 数据库连接串 |
REDIS_URL | redis://redis:6379 | Redis 连接串 |
JWT_SECRET | xxx | JWT 密钥 |
PORT | 3001 | 监听端口 |
启动顺序配置
NestJS 依赖数据库,需要确保数据库先启动:
yaml
# docker-compose.yml 示例
services:
api:
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_started步骤四:数据库迁移
方式一:启动时自动迁移
修改启动命令:
dockerfile
CMD ["sh", "-c", "npx prisma migrate deploy && node dist/main.js"]方式二:手动执行迁移
进入容器执行:
bash
# 进入容器
docker exec -it nestjs-api sh
# 执行迁移
npx prisma migrate deploy
# 可选:执行种子数据
npx prisma db seed生产环境迁移注意
- 始终使用
migrate deploy而非migrate dev - 迁移前备份数据库
- 破坏性迁移需要维护窗口
步骤五:配置反向代理
在 1Panel 的 网站 中配置 API 子域名:
| 配置项 | 值 |
|---|---|
| 域名 | api.example.com |
| 代理地址 | 127.0.0.1:3001 |
| HTTPS | 开启 |
Nginx 配置示例
nginx
server {
listen 443 ssl http2;
server_name api.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://127.0.0.1:3001;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 支持 WebSocket(如果需要)
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}健康检查
添加健康检查端点
typescript
// src/health/health.controller.ts
@Controller('health')
export class HealthController {
@Get()
check() {
return { status: 'ok', timestamp: new Date().toISOString() };
}
}Docker 健康检查配置
dockerfile
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD curl -f http://localhost:3001/health || exit 1常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 数据库连接失败 | 网络不通或凭证错误 | 检查容器网络和环境变量 |
| Prisma Client 未生成 | 镜像构建时未执行 generate | Dockerfile 中添加 prisma generate |
| 启动超时 | 等待数据库就绪 | 添加健康检查和重试逻辑 |
| 内存不足 | Node.js 默认内存限制 | 设置 NODE_OPTIONS=--max-old-space-size=2048 |
AI 协作指南
向 AI 描述 NestJS 部署问题时:
我的 NestJS + Prisma 应用部署后无法连接数据库,
使用 PostgreSQL,部署在 1Panel,
错误信息:Can't reach database server at 'postgres:5432'
请帮我排查原因。关键术语:Prisma migrate deploy、Docker 网络、容器间通信、健康检查
