# 部署指南

## 概述

本文档描述了 188-179 招聘系统的部署流程和配置。

## 部署架构

### 组件列表

| 组件 | 技术栈 | 端口 | 说明 |
|------|--------|------|------|
| Web服务器 | Node.js + Hono | 8080 | 管理后台后端 |
| PostgreSQL | 17 | 5432 | 数据库 |
| Redis | 7 | 6379 | 缓存和会话 |
| MinIO | latest | 9000 | 对象存储 |

### 基础设施要求

**最低配置**:
- CPU: 2核
- 内存: 4GB
- 磁盘: 20GB

**推荐配置**:
- CPU: 4核
- 内存: 8GB
- 磁盘: 50GB

## Docker部署

### 使用Docker Compose

```bash
# 构建镜像
docker-compose build

# 启动所有服务
docker-compose up -d

# 查看日志
docker-compose logs -f

# 停止服务
docker-compose down
```

### Dockerfile示例

```dockerfile
# Web服务Dockerfile
FROM node:20.19.2-alpine

WORKDIR /app

# 安装pnpm
RUN npm install -g pnpm@10.18.3

# 复制依赖文件
COPY package.json pnpm-lock.yaml ./
COPY pnpm-workspace.yaml ./

# 安装依赖
RUN pnpm install --frozen-lockfile

# 复制源码
COPY . .

# 构建共享包
RUN pnpm run build:mini-ui-packages

# 构建应用
RUN pnpm build

# 暴露端口
EXPOSE 8080

# 启动命令
CMD ["node", "web/server.js"]
```

### docker-compose.yml示例

```yaml
version: '3.8'

services:
  postgres:
    image: postgres:17
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: postgres
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data

  minio:
    image: minio/minio:latest
    command: server /data --console-address ":9001"
    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: minioadmin
    ports:
      - "9000:9000"
      - "9001:9001"
    volumes:
      - minio_data:/data

  web:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - postgres
      - redis
      - minio
    environment:
      DATABASE_URL: postgresql://postgres:postgres@postgres:5432/postgres
      REDIS_URL: redis://redis:6379
      MINIO_ENDPOINT: minio
      MINIO_PORT: 9000
      NODE_ENV: production

volumes:
  postgres_data:
  redis_data:
  minio_data:
```

## 生产环境部署

### 环境变量配置

创建生产环境的 `.env.production`:

```bash
# 数据库配置
DATABASE_URL=postgresql://user:password@production-db:5432/dbname

# Redis配置
REDIS_URL=redis://production-redis:6379

# JWT配置
JWT_SECRET=your-production-jwt-secret-min-32-chars

# MinIO配置
MINIO_ENDPOINT=production-minio
MINIO_PORT=9000
MINIO_ACCESS_KEY=your-access-key
MINIO_SECRET_KEY=your-secret-key
MINIO_BUCKET=d8dai
MINIO_USE_SSL=true

# 应用配置
NODE_ENV=production
PORT=8080
LOG_LEVEL=info

# CORS配置
CORS_ORIGIN=https://your-domain.com
```

### 构建生产版本

```bash
# 设置生产环境
export NODE_ENV=production

# 构建所有包
pnpm build

# 构建小程序UI包
pnpm run build:mini-ui-packages
```

### 启动生产服务

```bash
# 使用PM2管理进程
pm2 start web/server.js --name "d8d-web"

# 查看状态
pm2 status

# 查看日志
pm2 logs d8d-web

# 重启服务
pm2 restart d8d-web
```

## 数据库迁移

### 运行迁移

```bash
cd web
pnpm db:migrate
```

### 数据库备份

```bash
# 备份数据库
pnpm db:backup

# 恢复数据库
pnpm db:restore
```

## 监控和日志

### 应用日志

日志位置：
- 应用日志: `/var/log/d8d/app.log`
- 错误日志: `/var/log/d8d/error.log`

### 日志配置

```typescript
// logger配置
import { logger } from '@d8d/shared-utils';

logger.setLevel(process.env.LOG_LEVEL || 'info');
```

### 监控指标

- CPU使用率
- 内存使用率
- 响应时间
- 错误率
- 请求量

## 安全配置

### HTTPS配置

```nginx
server {
    listen 443 ssl http2;
    server_name your-domain.com;

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
```

### 防火墙配置

```bash
# 只开放必要端口
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 22/tcp
ufw enable
```

## CI/CD配置

### GitHub Actions示例

```yaml
name: Deploy

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '20.19.2'

      - name: Install pnpm
        run: npm install -g pnpm@10.18.3

      - name: Install dependencies
        run: pnpm install

      - name: Build
        run: pnpm build

      - name: Deploy to server
        run: |
          scp -r . user@server:/var/www/d8d
          ssh user@server "cd /var/www/d8d && pm2 restart all"
```

## 故障排查

### 服务无法启动

1. 检查环境变量配置
2. 检查数据库连接
3. 检查端口占用
4. 查看应用日志

### 数据库连接失败

1. 确认数据库服务运行
2. 检查连接字符串
3. 验证网络连接
4. 检查数据库用户权限

### 性能问题

1. 检查系统资源使用
2. 查看慢查询日志
3. 检查缓存命中率
4. 分析应用日志

## 回滚策略

### 数据库回滚

```bash
# 恢复到之前的备份
pnpm db:restore
```

### 应用回滚

```bash
# 使用PM2回滚到旧版本
pm2 revert d8d-web

# 或切换到之前的Git提交
git checkout <previous-commit>
pnpm build
pm2 restart d8d-web
```

## 相关文档

- [开发环境设置](./setup.md)
- [本地开发指南](./local-development.md)

---

**文档版本**: 1.0
**最后更新**: 2026-01-07
