docs: 同步 README 与 docs 至最新部署与版本方案

- 更新三种部署方式:embed 单容器、./aiops 根目录二进制
- 补充版本管理、release、lghost/aiops 镜像推送说明
- 修正过时的 docker 4 容器、backend/aiops、run.sh start 等描述
- 更新 project-structure、deployment、quick-start 等核心文档
This commit is contained in:
Logan.Li committed 2026-06-26 16:39:00 +08:00
1 parent 9f5ce249f1
commit 286decf0b0
8 files changed
+593 -487

No files matched your search

+244 -97
View File
@@ -1,139 +1,286 @@
# 部署指南
## 开发环境
本文档描述 AIOps 的三种部署方式、版本管理和镜像发布流程。
参见 [快速开始](./quick-start.md)。
## 部署方式概览
```bash
./run.sh start
| 方式 | 命令 | 容器/产物 | 前端 | 数据库 |
|------|------|-----------|------|--------|
| 独立二进制 | `./run.sh build` | `./aiops`(项目根目录) | go:embed | 默认 SQLite + redka |
| Docker Compose | `./run.sh docker up` | 3 容器 | embed 单端口 8080 | MySQL + Redis |
| Kubernetes | `./run.sh kubernetes deploy` | embed 单 Pod | embed 单端口 8080 | 集群内 MySQL/Redis 或 local 模式 |
> **已废弃**:前后端分离的 4 容器 Compose(Backend + Nginx)已合并为 embed 单应用容器。
---
## 版本管理
### 原则
```
Git tag (v1.5.0) → 唯一发布版本
↓
┌────┴────┬──────────────┐
│ │ │
./aiops lghost/aiops K8s deployment
version :v1.5.0 image: lghost/aiops:v1.5.0
```
## 生产构建
### 版本解析优先级
### 后端编译
`run.sh` 中 `resolve_version()` 统一处理:
1. 显式参数(`./run.sh build tag v1.5.0`)
2. 环境变量 `VERSION=v1.5.0`
3. `git describe --tags --always --dirty`
4. 兜底 `dev`
### 查看版本
```bash
cd backend
CGO_ENABLED=1 go build -ldflags="-s -w" -o aiops-server cmd/main.go
./aiops version
./aiops --version
curl http://localhost:8080/version
```
### 前端构建
响应示例:
```bash
cd app
npm run build # 输出到 dist/
```
### 使用 Makefile
```bash
make build # 同时构建前后端
```
## Docker 部署
### Dockerfile
后端已有 `backend/Dockerfile`,可基于此构建镜像。
```bash
cd backend
docker build -t aiops-server .
```
### docker-compose
```bash
cd backend
docker-compose up -d
```
## Nginx 反向代理
前端构建后部署到 Nginx,后端 API 反向代理:
```nginx
server {
listen 80;
server_name aiops.example.com;
# 前端静态文件
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
}
# 后端 API 代理
location /api/ {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# WebSocket 代理
location /ws/ {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
```json
{
"version": "v1.5.0",
"build_time": "2026-06-26T08:26:52Z",
"git_commit": "9f5ce24",
"mode": "local",
"db_driver": "sqlite",
"redis_driver": "redka"
}
```
参考配置文件:`backend/nginx.conf`
### 一键发版
## 系统服务(systemd)
```bash
docker login
./run.sh release v1.5.0
```
创建 `/etc/systemd/system/aiops.service`:
依次执行:
1. 创建 git tag `v1.5.0`(已存在则跳过)
2. 编译独立二进制 `./aiops`(ldflags 注入版本)
3. 构建 Docker 镜像 `lghost/aiops:v1.5.0`
4. 推送到 Docker Hub
5. 更新 `deploy/kubernetes/deployment.yaml` 镜像坐标
发版后可选:
```bash
git push origin master
git push origin v1.5.0
```
---
## ① 独立二进制
### 编译
```bash
./run.sh build # 自动解析版本
./run.sh build tag v1.5.0 # 指定版本
```
产物固定输出到 **项目根目录** `./aiops`,不会在 `backend/` 下生成。
构建前会自动清理历史产物:`backend/aiops*`。
### 启动
```bash
./aiops --mode local # SQLite + redka(默认推荐)
./aiops --port 9090
./aiops --config config.yaml
# 后台守护进程
./run.sh binary upgrade
./run.sh binary status
./run.sh binary stop
```
### 平台说明
| 构建环境 | `./aiops` 格式 | 用途 |
|----------|---------------|------|
| macOS Apple Silicon | darwin/arm64 | 仅 Mac 本机 |
| macOS Intel | darwin/amd64 | 仅 Mac 本机 |
| Linux x86_64 | linux/amd64 | Linux 服务器 |
Mac 上 `./run.sh build` **不能**产出 Linux 二进制;Linux 部署请用 Docker 镜像或在 Linux 上构建。
### systemd 示例
```ini
[Unit]
Description=AIOps Server
Description=AIOps
After=network.target
[Service]
Type=simple
User=www-data
User=aiops
WorkingDirectory=/opt/aiops
ExecStart=/opt/aiops/aiops-server
ExecStart=/opt/aiops/aiops --mode local --port 8080
Restart=always
RestartSec=5
Environment=GIN_MODE=release
[Install]
WantedBy=multi-user.target
```
```bash
systemctl enable aiops
systemctl start aiops
---
## ② Docker Compose
### 架构(3 容器)
```
mysql:8.0 + redis:7-alpine + aiops (Dockerfile.embed)
↓
http://localhost:8080
(API + WebSocket + 前端 SPA)
```
## 环境变量
### 启动
| 变量 | 默认值 | 说明 |
|------|--------|------|
| PORT | 8080 | 后端端口 |
| GIN_MODE | debug | Gin 模式(release/debug) |
| GOPROXY | - | Go 模块代理 |
```bash
./run.sh docker up
./run.sh docker up v1.5.0 # 指定版本
./run.sh docker up fresh # 无缓存全量重建
```
## 生产配置建议
环境变量(可选):
1. **数据库**: 生产环境使用 MySQL/PostgreSQL,不要用 SQLite
2. **JWT Secret**: 更换为高强度随机字符串
3. **CORS**: 生产环境配置允许的具体域名,不要用 `*`
4. **HTTPS**: 配置 TLS 证书
5. **日志**: 使用文件日志 + 日志轮转
6. **备份**: 定期备份数据库
```bash
VERSION=v1.5.0 MYSQL_PASSWORD=xxx ./run.sh docker up
```
### 推送镜像
```bash
./run.sh docker push v1.5.0
# 等价于 docker push lghost/aiops:v1.5.0
```
### 连接外部数据库
使用 `docker-compose.k8s.yml`(仅单应用容器,挂载 `backend/config.external.yaml`):
```bash
VERSION=v1.5.0 docker compose -f docker-compose.k8s.yml up -d --build
```
### 管理命令
```bash
./run.sh docker ps
./run.sh docker logs
./run.sh docker down
./run.sh docker clean # 清理构建缓存
```
---
## ③ Kubernetes
### 镜像
- 默认镜像:`lghost/aiops:<tag>`
- 构建文件:`Dockerfile.embed`
- 命名空间:`devops`
- 访问:`http://<NODE_IP>:30080`
### 部署
```bash
./run.sh kubernetes deploy
./run.sh kubernetes deploy v1.5.0
```
### 滚动更新
```bash
./run.sh kubernetes upgrade v1.5.0
```
### 推送镜像(Mac 可构建 Linux 镜像)
```bash
./run.sh kubernetes push v1.5.0
```
`Dockerfile.embed` 内固定 `GOOS=linux GOARCH=amd64`,在 Mac 上 `docker build` 产出的是 Linux 镜像。
### 运维命令
```bash
./run.sh kubernetes status
./run.sh kubernetes logs
./run.sh kubernetes exec
./run.sh kubernetes mysql
./run.sh kubernetes redis
./run.sh kubernetes scale 3 # 多副本自动切换 release + MySQL 模式
./run.sh kubernetes port-forward
./run.sh kubernetes delete
```
### 内网部署说明
若 K8s 节点无法访问 Docker Hub:
1. **推荐**:同步到内网 Harbor,修改 `deployment.yaml` 中 `image` 为内网地址
2. **离线**:`docker save` → `scp` → 节点 `docker load`
运行节点(如 10.10.10.73/75)只需 `pull` 镜像,不需要把镜像文件直接推到服务器磁盘。
---
## Mac 构建 Linux 镜像
| 操作 | Mac 支持 | 说明 |
|------|---------|------|
| `./run.sh build` | ✅(darwin 二进制) | 仅本机运行 |
| `docker build` (Dockerfile.embed) | ✅ | 产出 linux/amd64 镜像 |
| `docker push lghost/aiops:tag` | ✅ | 需 `docker login` |
| `./run.sh release v1.x` | ✅ | 完整发版流程 |
---
## 健康检查
```bash
# 检查后端是否正常
curl http://localhost:8080/health
# {"status":"ok"}
# 检查版本
curl http://localhost:8080/version
# {"version":"dev","build_time":"...","git_commit":"..."}
curl http://localhost:8080/version # 推荐(无 DB 强依赖)
curl http://localhost:8080/health # 含 DB 检查
```
K8s 探针使用 `/version`。
---
## 生产配置建议
1. **数据库**:生产使用 MySQL + Redis(`MODE=release`),local 模式仅适合单副本
2. **JWT Secret**:更换默认密钥
3. **版本**:生产环境 pin 镜像 tag(`lghost/aiops:v1.5.0`),避免使用 `:dev`
4. **HTTPS**:Ingress 或前置 Nginx 终止 TLS
5. **备份**:定期备份 MySQL 数据和 PVC
---
## 相关文件
| 文件 | 说明 |
|------|------|
| `run.sh` | 统一入口(build/docker/kubernetes/release) |
| `Dockerfile.embed` | embed 单容器镜像(推荐) |
| `docker-compose.yml` | MySQL + Redis + AIOps |
| `deploy/kubernetes/deployment.yaml` | K8s Deployment + NodePort |
| `.gitignore` | 忽略 `aiops`、`backend/aiops*` 等编译产物 |