⚠️ Alpha内测版本警告:此为早期内部构建版本,尚不完整且可能存在错误,欢迎大家提Issue反馈问题或建议
Skip to content

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.jsNestJS
输出目录.next/standalonedist
启动命令node server.jsnode dist/main.js
ORM 配置通常无需要 Prisma generate
端口30003001

步骤二:配置数据库连接

环境变量设置

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_ENVproduction生产模式
DATABASE_URLpostgresql://...数据库连接串
REDIS_URLredis://redis:6379Redis 连接串
JWT_SECRETxxxJWT 密钥
PORT3001监听端口

启动顺序配置

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 未生成镜像构建时未执行 generateDockerfile 中添加 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 网络、容器间通信、健康检查