141 lines
6.2 KiB
Markdown
141 lines
6.2 KiB
Markdown
# serverrun —— 运行环境与部署编排
|
||
|
||
本目录是 **server-core 的运行环境中心**:集中基础设施编排(MySQL/Redis/EMQX)与**三服务容器编排**(部署入口)。
|
||
不存放业务代码;运行时数据全部落在各项目 `serverdata/`(见下方「数据策略」)。
|
||
|
||
## 编排总览
|
||
|
||
| 编排 | 用途 | 说明 |
|
||
|---|---|---|
|
||
| `mysql/docker-compose.yml` | 基础设施:MySQL 8 | 容器名 `opc-mysql`,宿主机端口 `8091`,数据 `serverdata/mysql-data` |
|
||
| `redis/docker-compose.yml` | 基础设施:Redis 7 | 容器名 `opc-redis`,宿主机端口 `8092`,数据 `serverdata/redis-data` |
|
||
| `mqtt/docker-compose.yml` | 基础设施:EMQX | 容器名 `opc-emqx`,1883/8883/8083/8084/18083,数据 `serverdata/emqx-data`、`emqx-log` |
|
||
| `docker-compose.yml` | **业务主编排**:三服务一起(opc-server/opc-im/opc-compute) | 部署入口,仅 8090 对外 |
|
||
| `all/docker-compose.yml` | 三服务一起(等价根编排,单源 include) | 与根文件同效果 |
|
||
| `core/docker-compose.yml` | 单独启动 opc-server | 只起核心服务 |
|
||
| `im/docker-compose.yml` | 单独启动 opc-im | 只起即时通讯 |
|
||
| `compute/docker-compose.yml` | 单独启动 opc-compute | 只起算力服务 |
|
||
|
||
> 所有编排共用外部网络 **`opc-network`**;业务与基础设施在同一网络内以容器名互访。
|
||
> 旧 `start.sh`/`start-all.sh` 等启动脚本与旧 `Dockerfile` 已废弃移除,镜像入口直接 `uvicorn`。
|
||
|
||
## 快速开始
|
||
|
||
### 1. 创建共享网络(一次性)
|
||
|
||
```bash
|
||
docker network create opc-network
|
||
```
|
||
|
||
### 2. 启动基础设施(MySQL / Redis / EMQX)
|
||
|
||
```bash
|
||
cd serverrun/mysql && docker compose up -d # opc-mysql
|
||
cd serverrun/redis && docker compose up -d # opc-redis
|
||
cd serverrun/mqtt && docker compose up -d # opc-emqx
|
||
```
|
||
|
||
> 镜像均走国内加速(docker.m.daocloud.io);MySQL 首次启动由 `init.sql` 自动建库。
|
||
|
||
### 3. 构建业务镜像(各自项目内)
|
||
|
||
```bash
|
||
cd server-core && docker build -t opc-server:latest .
|
||
cd im-service && docker build -t opc-im:latest .
|
||
cd compute && docker build -t opc-compute:latest .
|
||
```
|
||
|
||
### 4. 配置环境变量并启动业务
|
||
|
||
```bash
|
||
cd serverrun
|
||
cp .env.example .env # 默认已适配本地 Docker 基础设施(opc-mysql/opc-redis/opc-emqx)
|
||
docker compose up -d # 三服务一起;或 cd all 同样效果
|
||
# 单独启动某个:cd core && docker compose up -d(im / compute 同理)
|
||
```
|
||
|
||
### 5. 数据库迁移(首次部署,幂等)
|
||
|
||
```bash
|
||
# server-core:alembic 迁移
|
||
cd serverrun && docker compose run --rm opc-server uv run alembic upgrade head
|
||
|
||
# compute:迁移 + 种子(非运行态,先于启动)
|
||
docker compose run --rm opc-compute sh -c "uv run python scripts/db/migrate.py && uv run python scripts/db/seed.py"
|
||
|
||
# im-service:无迁移脚本(lifespan 启动时建表),无需执行
|
||
```
|
||
|
||
### 6. 验证
|
||
|
||
```bash
|
||
curl http://localhost:8090/health # opc-server 健康检查
|
||
docker compose ps # 业务容器状态(healthy)
|
||
docker ps | grep opc- # 全部容器(含基础设施)
|
||
```
|
||
|
||
## 端口与网络
|
||
|
||
| 服务 | 容器名 | 端口 | 对外 | 说明 |
|
||
|---|---|---|---|---|
|
||
| opc-server | `opc-server` | 8090 | ✅ `8090:8090` | 主 API / admin / website / 桌面更新源 |
|
||
| opc-im | `opc-im` | 8101 | ❌ | 即时通讯,server-core 经 `http://opc-im:8101` 调用 |
|
||
| opc-compute | `opc-compute` | 3000 | ❌ | 算力中转/计量,server-core 经 `http://opc-compute:3000` 调用 |
|
||
| opc-mysql | `opc-mysql` | 8091→3306 | 宿主机 8091 | 业务主库(opc 库、compute 库) |
|
||
| opc-redis | `opc-redis` | 8092→6379 | 宿主机 8092 | 会话/缓存/限流 |
|
||
| opc-emqx | `opc-emqx` | 1883/8083/18083… | 宿主机同端口 | MQTT 总线 / WebSocket / Dashboard |
|
||
|
||
业务容器内访问基础设施用 **容器名 + 内部端口**(`.env` 已默认配置):
|
||
`opc-mysql:3306`、`opc-redis:6379`、`opc-emqx:1883`。
|
||
|
||
服务间地址(`.env` 注入 server-core):
|
||
|
||
| 变量 | 值 |
|
||
|---|---|
|
||
| `PINEAGENTS_COMPUTE_BASE_URL` | `http://opc-compute:3000` |
|
||
| `PINEAGENTS_IM_BASE_URL` | `http://opc-im:8101` |
|
||
| `PINEAGENTS_IM_WS_URL` | `ws://opc-im:8101/ws` |
|
||
|
||
## 数据策略
|
||
|
||
**数据目录在各自项目的 `serverdata/`**,挂载到容器内 `/app/serverdata`:
|
||
|
||
| 服务 | 宿主机目录 | 容器内 |
|
||
|---|---|---|
|
||
| opc-server | `../serverdata`(server-core/serverdata) | `/app/serverdata` |
|
||
| opc-server 上传 | `../uploads`(server-core/uploads) | `/app/uploads` |
|
||
| opc-im | `../../im-service/serverdata` | `/app/serverdata` |
|
||
| opc-compute | `../../compute/serverdata` | `/app/serverdata` |
|
||
| MySQL | `serverdata/mysql-data` | `/var/lib/mysql` |
|
||
| Redis | `serverdata/redis-data` | `/data` |
|
||
| EMQX | `serverdata/emqx-data`、`emqx-log` | `/opt/emqx/data`、`/opt/emqx/log` |
|
||
|
||
> `serverdata/seed/`、`serverdata/prompts/` 等模板直接在宿主机(git 管理),修改后重启服务即生效;
|
||
> 备份覆盖 `serverdata/`(含 keys/、uploads/、data/)与 `server-core/uploads/`。
|
||
|
||
## 常见问题
|
||
|
||
**连不上 MySQL / Redis / MQTT?**
|
||
先确认基础设施已启动(`docker ps | grep opc-`);业务容器与基础设施必须在同一网络
|
||
(`docker network create opc-network` 后分别 `up`,勿用默认网络)。
|
||
|
||
**升级某个服务?**
|
||
```bash
|
||
cd compute && docker build -t opc-compute:latest .
|
||
cd ../serverrun && docker compose up -d opc-compute
|
||
```
|
||
|
||
**桌面端自动更新不生效?**
|
||
确认 `DESKTOP_UPDATER_PUBKEY` 与 `agent-desktop/mykey/tauri-signer.key` 公钥一致,
|
||
`PUBLIC_BASE_URL` 公网可访问;更新包经 opc-server `/uploads` 分发。
|
||
|
||
**从旧的"三服务合一镜像"迁移?**
|
||
合一方案(旧 `deploy/Dockerfile`/`entrypoint.sh`)已废弃。注意:`.env` 中服务间地址改为
|
||
服务名(模板已默认);`IM_HOST` 由 `127.0.0.1` 改为 `0.0.0.0`;旧 `deploy/data/server-core`
|
||
数据可复制到 `serverdata/`(结构一致);首次启动前执行数据库迁移。
|
||
|
||
## 数据库迁移说明
|
||
|
||
镜像容器启动仅运行单进程(uvicorn),**不在启动脚本内跑迁移**;
|
||
`alembic upgrade head` 与 compute `migrate.py`/`seed.py` 按上文「快速开始」显式执行(幂等)。
|