# 服务器部署配置

此目录包含生产环境的 Docker 部署配置，使用**外部 MySQL 和 Redis** 服务。

## 目录结构

```
server/
├── docker-compose.yml   # Docker Compose 配置
├── deploy.sh            # 自动部署脚本
├── .env.example         # 环境变量模板
├── .env                 # 实际环境变量（需手动创建）
├── nginx/               # Nginx 配置
│   ├── nginx.conf
│   └── conf.d/
│       └── default.conf
├── data/                # 数据目录（本地挂载，方便迁移）
│   ├── uploads/         # 用户上传的文件
│   └── logs/
│       ├── api/         # API 服务日志
│       └── nginx/       # Nginx 访问日志
├── admin-dist/          # Admin 打包后的静态文件（需手动放置）
└── README.md
```

## 架构说明

```
                    ┌─────────────────────────────────────┐
                    │           外部代理 (SSL)             │
                    └──────────────┬──────────────────────┘
                                   │
                                   ▼
┌──────────────────────────────────────────────────────────────────┐
│  Docker Compose (单一端口 2701)                                    │
│  ┌────────────────────────────────────────────────────────────┐  │
│  │                        Nginx                                │  │
│  │   /admin/*  → 静态文件 (Admin 后台)                          │  │
│  │   /api/*    → API 服务                                       │  │
│  │   /uploads  → API 服务                                       │  │
│  └────────────────────────┬───────────────────────────────────┘  │
│                           │                                       │
│                           ▼                                       │
│  ┌────────────────────────────────────────────────────────────┐  │
│  │                    API 服务 (:3000)                          │  │
│  └────────────────────────────────────────────────────────────┘  │
└──────────────────────────────────────────────────────────────────┘
                    │                           │
                    ▼                           ▼
            ┌─────────────┐             ┌─────────────┐
            │   MySQL     │             │    Redis    │
            │  (外部服务)  │             │  (外部服务)  │
            └─────────────┘             └─────────────┘
```

## 快速开始

### 1. 配置环境变量

```bash
cd server
cp .env.example .env
vim .env  # 编辑配置
```

### 2. 构建 Admin 前端

```bash
cd ../admin
npm install
npm run build

# 将打包产物复制到 server 目录
cp -r dist ../server/admin-dist
```

### 3. 启动服务

```bash
cd server
docker-compose up -d --build
```

### 4. 验证服务

```bash
# 检查服务状态
docker-compose ps

# 访问 Admin 后台
curl http://localhost:2701/admin

# 检查 API
curl http://localhost:2701/health
curl http://localhost:2701/api/v1/services
```

## 访问地址

| 路径 | 说明 |
|------|------|
| `/admin` | Admin 管理后台 |
| `/api/*` | 后端 API 接口 |
| `/api-docs` | API 文档 |
| `/health` | 健康检查 |
| `/uploads/*` | 上传文件 |

## 常用命令

```bash
# 启动
docker-compose up -d

# 停止
docker-compose down

# 重新构建并启动
docker-compose up -d --build

# 查看日志
docker-compose logs -f
docker-compose logs -f api
docker-compose logs -f nginx

# 重启服务
docker-compose restart api

# 进入容器
docker exec -it overseas-appointment-api sh
docker exec -it overseas-appointment-nginx sh
```

## 更新 Admin 前端

```bash
# 1. 重新构建 admin
cd ../admin
npm run build

# 2. 更新静态文件
rm -rf ../server/admin-dist
cp -r dist ../server/admin-dist

# 3. 重启 nginx
cd ../server
docker-compose restart nginx
```

## 外部代理配置示例

### Nginx (外部)

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

    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:2701;
        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;
    }
}
```

## 故障排查

### Admin 页面 404

确认 `admin-dist` 目录存在且包含 `index.html`：

```bash
ls -la server/admin-dist/
```

### API 连接数据库失败

```bash
# 检查数据库连通性
docker exec -it overseas-appointment-api sh
node -e "require('./src/models').sequelize.authenticate().then(() => console.log('OK')).catch(console.error)"
```

### 查看实时日志

```bash
docker-compose logs -f --tail=100
```
