# DataOps Platform 部署与运维手册

> 面向系统部署人员。配合 `deployment/` 发布包使用。

---

## 1. 部署架构

```text
                    ┌─────────────┐
   用户/前端  ────► │ Nginx :18183 │ ──► Gunicorn :5500 ──► Flask App
                    └─────────────┘              │
                                                 ├── PostgreSQL
                                                 ├── Neo4j
                                                 ├── MinIO
                                                 ├── n8n API
                                                 └── DeepSeek API
Supervisor 守护 ──► scripts/run_dataops.sh
环境变量 ─────────► /etc/dataops-platform/dataops.env
```

---

## 2. 服务器要求

| 项目 | 要求 |
|------|------|
| 操作系统 | Ubuntu 20.04 / 22.04 LTS（推荐） |
| CPU / 内存 | 4 核 / 8 GB 及以上（生产建议） |
| 磁盘 | 50 GB+（含日志与上传目录） |
| 运行用户 | `ubuntu`（可通过 `APP_USER` 覆盖） |
| Python | 3.8+ |

### 2.1 系统软件安装

```bash
sudo apt update
sudo apt install -y python3 python3-venv python3-pip supervisor nginx curl
sudo systemctl enable supervisor
sudo systemctl start supervisor
```

### 2.2 外部服务（需提前就绪）

| 服务 | 默认地址 | 用途 |
|------|----------|------|
| PostgreSQL | `192.168.3.143:5432` | 业务数据 |
| Neo4j | `192.168.3.143:7687` | 图关系 |
| MinIO | `192.168.3.143:9000` | 文件存储 |
| n8n | `https://n8n.citupro.com` | 工作流 |
| DeepSeek | `https://api.deepseek.com` | LLM |

部署前连通性测试：

```bash
psql "postgresql://postgres:***@192.168.3.143:5432/dataops" -c "SELECT 1"
curl -s http://192.168.3.143:7474
curl -s http://192.168.3.143:9000/minio/health/live
```

---

## 3. 一键部署流程

### 3.1 上传发布包

```bash
cd /tmp
tar -xzf dataops-platform-release-YYYYMMDD.tar.gz
cd dataops-platform
```

### 3.2 执行部署

```bash
chmod +x deploy_dataops.sh scripts/*.sh
sudo bash deploy_dataops.sh
```

**首次运行**会：

1. 创建 `/etc/dataops-platform/dataops.env`（来自 `dataops.env` 模板）
2. 提示编辑配置后重新执行（exit code 2）

### 3.3 编辑环境变量

```bash
sudo vim /etc/dataops-platform/dataops.env
sudo chown root:ubuntu /etc/dataops-platform/dataops.env
sudo chmod 640 /etc/dataops-platform/dataops.env
```

**必须修改的项：**

| 变量 | 说明 |
|------|------|
| `SECRET_KEY` | Flask 密钥，长随机字符串 |
| `DEEPSEEK_API_KEY` | DeepSeek API 密钥 |
| `N8N_API_KEY` | n8n API 密钥 |
| `DATABASE_URL` | PostgreSQL 连接串 |
| `NEO4J_PASSWORD` | Neo4j 密码 |
| `MINIO_*` | MinIO 四项须匹配同一实例 |

**LLM 配置（DeepSeek 官方格式）：**

```bash
DEEPSEEK_API_KEY=sk-xxxxxxxx
LLM_BASE_URL=https://api.deepseek.com    # 不要写成 .../v1
LLM_MODEL_NAME=deepseek-v4-pro
LLM_REASONING_EFFORT=high
```

### 3.4 再次部署

```bash
sudo bash deploy_dataops.sh
```

成功标志：

- 脚本输出 `健康检查通过`
- `curl http://127.0.0.1:5500/api/system/health` 返回 HTTP 200

### 3.5 配置 Nginx（公网访问）

```bash
# 修改 SSL 证书路径
sudo vim /etc/nginx/sites-available/dataops-platform.conf

sudo nginx -t
sudo systemctl reload nginx
```

或使用部署脚本自动生成（HTTP，不含 SSL）：

```bash
sudo ENABLE_NGINX=1 NGINX_SERVER_NAME=company.citupro.com NGINX_LISTEN_PORT=18183 bash deploy_dataops.sh
```

Nginx 模板 `config/nginx-dataops-platform.conf` 已包含：

- `/api/bd/ddlparse` 超时 300s（避免 LLM 解析 504）
- 默认 `client_max_body_size 100m`

---

## 4. Python 依赖

见 `requirements.txt`，核心依赖：

| 包 | 版本 | 用途 |
|----|------|------|
| Flask | 2.3.3 | Web 框架 |
| gunicorn | 21.2.0 | WSGI 服务器 |
| SQLAlchemy | 2.0.23 | ORM |
| psycopg2-binary | 2.9.9 | PostgreSQL |
| neo4j | 5.26.0 | 图数据库 |
| minio | 7.2.10 | 对象存储 |
| openai | 1.58.1 | DeepSeek SDK（OpenAI 兼容） |
| pdfplumber | 0.11.4 | PDF 解析 |

虚拟环境路径：`/opt/dataops-platform/venv`

重建虚拟环境：

```bash
sudo RECREATE_VENV=1 /opt/dataops-platform/scripts/deploy_dataops.sh
```

---

## 5. 目录与权限

| 路径 | 权限 | 说明 |
|------|------|------|
| `/opt/dataops-platform` | `ubuntu:ubuntu` | 应用代码 |
| `/etc/dataops-platform/dataops.env` | `640 root:ubuntu` | 环境变量 |
| `/data/upload` | `ubuntu:ubuntu` | 上传目录 |
| `/data/archive` | `ubuntu:ubuntu` | 归档目录 |
| `/opt/dataops-platform/logs` | `ubuntu:ubuntu` | 应用日志 |

---

## 6. 运维命令

```bash
# 服务管理
sudo supervisorctl status dataops-platform
sudo /opt/dataops-platform/scripts/restart_dataops.sh

# 日志
tail -f /opt/dataops-platform/logs/flask_production.log
tail -f /opt/dataops-platform/logs/gunicorn_error.log
tail -f /var/log/supervisor/dataops-platform.log

# 健康与翻译测试
curl http://127.0.0.1:5500/api/system/health
curl -k -X POST https://company.citupro.com:18183/api/system/translate \
  -H "Content-Type: application/json" \
  -d '{"node_name":"测试宁波数据加工"}'
```

---

## 7. 代码更新（不停机最短流程）

```bash
# 1. 上传新版发布包并解压
# 2. 重新部署（会覆盖 app/ 并 pip install）
cd /tmp/dataops-platform
sudo bash deploy_dataops.sh

# 或仅重启（仅改 env 时）
sudo /opt/dataops-platform/scripts/restart_dataops.sh
```

---

## 8. 常见问题

### 8.1 `$'\r': command not found`

Windows 编辑的脚本/env 含 CRLF。部署脚本已自动转换；手动修复：

```bash
sed -i 's/\r$//' /etc/dataops-platform/dataops.env
sed -i 's/\r$//' /opt/dataops-platform/scripts/*.sh
```

### 8.2 DeepSeek API Key 未加载

```bash
sudo chown root:ubuntu /etc/dataops-platform/dataops.env
sudo chmod 640 /etc/dataops-platform/dataops.env
sudo /opt/dataops-platform/scripts/restart_dataops.sh
grep DEEPSEEK /etc/dataops-platform/dataops.env
```

### 8.3 MinIO InvalidAccessKeyId

检查 `MINIO_HOST`、`MINIO_USER`、`MINIO_PASSWORD` 是否指向同一 MinIO 实例，不要混用 `127.0.0.1` 与生产 IP。

### 8.4 翻译/DDL 返回中文或 504

- 确认 `DEEPSEEK_API_KEY` 有效
- 确认 `LLM_BASE_URL=https://api.deepseek.com`（不带 `/v1`）
- Nginx `/api/bd/ddlparse` 超时 ≥ 300s

### 8.5 健康检查失败

```bash
sudo supervisorctl status dataops-platform
tail -50 /var/log/supervisor/dataops-platform.log
sudo /opt/dataops-platform/scripts/restart_dataops.sh
```

---

## 9. 环境变量完整说明

| 变量 | 默认值 | 说明 |
|------|--------|------|
| `FLASK_ENV` | production | 运行模式 |
| `SECRET_KEY` | （必填） | Flask 密钥 |
| `DATABASE_URL` | 见 dataops.env | PostgreSQL |
| `NEO4J_URI` | bolt://192.168.3.143:7687 | Neo4j Bolt |
| `NEO4J_USER` / `NEO4J_PASSWORD` | neo4j / *** | Neo4j 认证 |
| `MINIO_HOST` | 192.168.3.143:9000 | MinIO 地址 |
| `MINIO_USER` / `MINIO_PASSWORD` | access/secret | MinIO 密钥 |
| `MINIO_BUCKET` | dataops-bucket | 存储桶 |
| `DEEPSEEK_API_KEY` | （必填） | DeepSeek API |
| `LLM_BASE_URL` | https://api.deepseek.com | API 根地址 |
| `LLM_MODEL_NAME` | deepseek-v4-pro | 模型名 |
| `LISTEN_PORT` | 5500 | Gunicorn 端口 |
| `LOG_FILE` | /opt/.../flask_production.log | 应用日志绝对路径 |

完整模板见 `dataops.env` 与 `.env.production.example`。

---

## 10. 联系与支持

部署完成后请保存：

- 部署日期与发布包版本（`MANIFEST.md`）
- `/etc/dataops-platform/dataops.env` 备份（勿提交 Git）
- 首次健康检查与关键 API 测试结果

详细 API 文档见仓库 `docs/` 目录。
