Files
web-Iot/docs/Alpha部署说明(国内云).md

269 lines
10 KiB
Markdown
Raw Permalink Normal View History

# 机器人智慧服务系统 Alpha · 国内云部署说明
> 适用:将本项目(前端 SPA + Alpha 三服务 + nodevideo 视频服务)部署到国内云服务器
> (阿里云 ECS / 腾讯云 CVM / 华为云 ECS,推荐 Ubuntu 22.04 LTS)。
> 配套代码文档见 `docs/` 下设备数据字典、命令字典、状态机、联调报告等。
---
## 一、系统组成与端口
| 组件 | 目录 / 说明 | 端口 | 数据 / 依赖 |
|------|------------|:---:|------------|
| 前端 SPA(React 19 + Vite) | 仓库根目录 `npm run build` → `dist/` | 开发 3001;生产由 Nginx 托管 80/443 | 通过 `env.js` 的 `baseURL` 指向后端 |
| 设备接入服务 Alpha | `services/device-access` | **3010** | `data/devices.json` |
| 状态服务 Alpha | `services/status` | **3020** | `data/status.json` |
| 命令服务 Alpha | `services/command` | **3030** | `data/commands.json` |
| 主后端(已有,非 Alpha) | 由 `env.js` 指向 | API **8081** / WS **9002** / MQTT **8083** / GeoServer **59018** | 需与前端在同一云环境且可达 |
| 视频服务 nodevideo | 独立项目,视频管理页直连 | **9528** | SRS 录制目录 `BASE_DIR=/hdd/data/media/record/video/srs/` |
技术栈:Node.js + Express + 本地 JSON 文件(三服务均**不使用数据库**,数据落 `data/*.json`)。
Alpha 三服务均 `app.use(cors())` 全开;nodevideo 亦 `app.use(cors())` 全开(跨域直连可行,但生产建议走反代同源)。
---
## 二、云服务器准备
1. 选购:2 vCPU / 4 GB 起(含 Cesium 三维前端,建议 4 vCPU / 8 GB);系统盘 40 GB+,数据盘按需(录像/JSON 备份)。
2. 系统:Ubuntu 22.04 LTS(或腾讯云 TencentOS Server 3/4)。
3. 安全组(推荐**仅暴露 22/80/443**,其它端口走 Nginx 反代):
- 入站:22(SSH)、80(HTTP)、443(HTTPS)。
- 出站:全通。
- 若采用「直连各端口」方案,需额外开放 3010/3020/3030/9528/8081 等,并依赖 CORS——**不推荐生产使用**。
4. 域名(可选但建议):国内云需 ICP 备案后才能用 80/443 绑定域名;备案期间可先用 IP + 自签/免费证书测试。
---
## 三、基础环境(Ubuntu)
```bash
# 1. 系统更新
sudo apt update && sudo apt -y upgrade
# 2. Node.js 20 LTS(项目用 React19+Vite6,需 Node 18+)
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt -y install nodejs
node -v && npm -v # 期望 v20.x / v10.x
# 3. 进程守护 PM2(全局)
sudo npm i -g pm2
# 4. 反向代理 + HTTPS
sudo apt -y install nginx
sudo snap install --classic certbot && sudo ln -s /snap/bin/certbot /usr/bin/certbot
```
> 国内云若访问 npm 慢,可切换镜像:`npm config set registry https://registry.npmmirror.com`
---
## 四、获取代码
```bash
cd /opt
sudo git clone <你的仓库地址> robot-system
sudo chown -R $USER:$USER /opt/robot-system
cd /opt/robot-system
```
> 若不用 git,可用 `scp` / 对象存储 将本地仓库打包上传解压。
---
## 五、部署 Alpha 三服务
三个服务结构一致,分别安装依赖并启动。下面以 `device-access` 为例,其余两目录同理。
```bash
# 设备接入服务
cd /opt/robot-system/services/device-access
npm install
pm2 start server.js --name device-access --watch
# 状态服务
cd /opt/robot-system/services/status
npm install
pm2 start server.js --name status --watch
# 命令服务
cd /opt/robot-system/services/command
npm install
pm2 start server.js --name command --watch
# 保存进程列表并实现开机自启(Linux 上 pm2 startup 可用)
pm2 save
pm2 startup # 按提示执行它打印的 sudo 命令(写 systemd 单元)
```
验证:
```bash
pm2 ls # 三个服务 online
curl -s http://127.0.0.1:3010/api/devices/online/ROBOT-001 # 返回 JSON
curl -s http://127.0.0.1:3020/health ; curl -s http://127.0.0.1:3030/health
```
> 端口固定写死在 `server.js`(`PORT = 3010/3020/3030`),如需变更改文件即可。
> 数据文件 `data/*.json` 首次启动自动创建(空数组)。部署升级时**务必备份该目录**,避免覆盖业务数据。
---
## 六、部署前端(SPA)
### 6.1 配置生产后端地址
编辑仓库根目录 `env.js`,将 `PROD` 段改为云上实际地址(默认 `MODE=production` 时生效):
```js
[ENV.PROD]: {
baseURL: 'https://你的域名或http://云服务器IP:8081', // 主后端 API
WS_URL: 'wss://你的域名/ws/' 或 'ws://云服务器IP:9002/ws/',
mqtt_url: 'wss://你的域名/mqtt' 或 'ws://云服务器IP:8083/mqtt',
geoserver_url:'https://你的域名/geoserver' 或 'http://云服务器IP:59018/geoserver'
},
```
### 6.2 构建
```bash
cd /opt/robot-system
npm install
npm run build # 产出 dist/(MODE=production,使用 env.js 的 PROD 配置)
```
### 6.3 视频管理页地址(重要)
`src/components/SystemSetting/VideoManagement.tsx` 顶部硬编码了:
```ts
const NODEVIDEO_BASE = 'http://localhost:9528';
```
部署到云后,浏览器里的 `localhost:9528` 指向**用户本机**而非服务器,视频无法访问。二选一:
- **方案A(反代同源,推荐)**:改为 `const NODEVIDEO_BASE = '/nodevideo'`,并在 Nginx 配置 `location /nodevideo/ { proxy_pass http://127.0.0.1:9528/; }`。
- **方案B(跨域直连)**:改为 `const NODEVIDEO_BASE = 'http://<云服务器IP或域名>:9528'`(nodevideo 已开 CORS,可用;但需安全组开放 9528)。
改完需重新 `npm run build`。
### 6.4 Nginx 托管 + 反代
```nginx
# /etc/nginx/sites-available/robot-system
server {
listen 80; server_name 你的域名或IP;
root /opt/robot-system/dist; index index.html;
location / { try_files $uri $uri/ /index.html; } # SPA 路由回退
# ---- Alpha 三服务(按前端实际 API 前缀分流)----
location /api/devices/ { proxy_pass http://127.0.0.1:3010; }
location /api/status/ { proxy_pass http://127.0.0.1:3020; }
location /api/commands/ { proxy_pass http://127.0.0.1:3030; }
# ---- nodevideo 视频(对应方案A的 /nodevideo)----
location /nodevideo/ { proxy_pass http://127.0.0.1:9528/; }
# ---- 主后端(若与 Alpha 共用 /api 前缀需区分,建议独立子域或前缀)----
location /backend/ { proxy_pass http://127.0.0.1:8081/; }
# WebSocket / MQTT 透传(如前端直连)
location /ws/ { proxy_pass http://127.0.0.1:9002; proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }
}
```
> 注意:前端 `env.js` 的 `baseURL` 必须与实际访问方式一致——若走 Nginx 同源,填 `https://你的域名`(或 `/backend` 之类前缀);若主后端与 Alpha 都用 `/api` 前缀会冲突,请为二者分配不同前缀或子域。
启用并重载:
```bash
sudo ln -s /etc/nginx/sites-available/robot-system /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
```
---
## 七、部署 nodevideo 视频服务(9528)
视频管理页依赖此服务,需与前端同一云环境可达。
```bash
cd /opt/nodevideo
npm install
pm2 start server.js --name nodevideo
pm2 save
```
**关键路径说明**:`server.js` 中 `BASE_DIR = "/hdd/data/media/record/video/srs/"` 为 Linux 绝对路径(SRS 录制存储)。
- 云服务器需存在该目录并挂载好录像盘;否则 `/list` 返回 `code:500 / directories:[]`,视频管理页显示为空。
- 如路径不同,直接修改 `server.js` 的 `BASE_DIR` 后 `pm2 restart nodevideo`。
- `PORT` 在代码里写 `30003`,但实际按你指定以 **9528** 对外(用 `PORT=9528 pm2 start server.js --name nodevideo` 或反代时统一即可)。
---
## 八、域名与 HTTPS(国内云)
1. **备案**:国内云使用 80/443 + 域名必须完成 ICP 备案(阿里云/腾讯云控制台申请,约 1–2 周)。
2. **证书**:备案后用免费证书
```bash
sudo certbot --nginx -d 你的域名.cn
```
或在云控制台申请免费 DV 证书后下载,Nginx 配置 `ssl_certificate / ssl_certificate_key`。
3. 证书自动续期:`sudo certbot renew --dry-run` 验证,certbot 默认建好 timer。
---
## 九、开机自启(推荐 systemd)
PM2 在 Linux 可用 `pm2 startup`(写 systemd 单元)实现开机拉起全部 `pm2 save` 的进程,最省事。
若偏好纯 systemd,可为每个服务写一个 unit(示例 `device-access.service`):
```ini
[Unit]
Description=Device Access Service Alpha
After=network.target
[Service]
WorkingDirectory=/opt/robot-system/services/device-access
ExecStart=/usr/bin/node server.js
Restart=always
User=www-data
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
```
```bash
sudo systemctl enable --now device-access
```
---
## 十、运维与备份
- **日志**:`pm2 logs <name>`;或 journald `journalctl -u device-access -f`。
- **数据备份**:三服务的 `data/*.json` 是业务数据,定时备份:
```bash
tar czf /backup/alpha-data-$(date +%F).tgz /opt/robot-system/services/*/data/
```
- **录像备份**:nodevideo 的 `/hdd/.../srs` 目录按磁盘策略归档。
- **升级流程**:拉新代码 → `npm install` → `npm run build`(前端)→ `pm2 restart <name>`;升级前先备份 `data/`。
- **回滚**:保留上一版 `dist/` 与 `services`,出问题时 `pm2 restart` 旧版本或 git checkout。
---
## 十一、快速检查清单
- [ ] 云服务器 Ubuntu 22.04,安全组仅开 22/80/443(反代方案)
- [ ] Node 20 LTS + npm + pm2 + nginx 已装
- [ ] Alpha 三服务 `pm2 ls` 均 online,端口 3010/3020/3030 监听 127.0.0.1
- [ ] 前端 `npm run build` 成功,`dist/` 由 Nginx 托管
- [ ] `env.js` 的 `PROD` 段 baseURL/WS/MQTT/GeoServer 已改为云地址
- [ ] 视频管理页 `NODEVIDEO_BASE` 已改为 `/nodevideo` 或云地址并重新 build
- [ ] nodevideo :9528 已起,`BASE_DIR` 存在且有录像;`/list` 能返回通道
- [ ] Nginx 反代规则就位,`nginx -t` 通过
- [ ] 域名已备案,HTTPS 证书已配置并自动续期
- [ ] `pm2 save` + `pm2 startup` 完成,重启服务器后服务自动拉起
- [ ] `data/*.json` 备份任务已配置