10 KiB
机器人智慧服务系统 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()) 全开(跨域直连可行,但生产建议走反代同源)。
二、云服务器准备
- 选购:2 vCPU / 4 GB 起(含 Cesium 三维前端,建议 4 vCPU / 8 GB);系统盘 40 GB+,数据盘按需(录像/JSON 备份)。
- 系统:Ubuntu 22.04 LTS(或腾讯云 TencentOS Server 3/4)。
- 安全组(推荐仅暴露 22/80/443,其它端口走 Nginx 反代):
- 入站:22(SSH)、80(HTTP)、443(HTTPS)。
- 出站:全通。
- 若采用「直连各端口」方案,需额外开放 3010/3020/3030/9528/8081 等,并依赖 CORS——不推荐生产使用。
- 域名(可选但建议):国内云需 ICP 备案后才能用 80/443 绑定域名;备案期间可先用 IP + 自签/免费证书测试。
三、基础环境(Ubuntu)
# 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
四、获取代码
cd /opt
sudo git clone <你的仓库地址> robot-system
sudo chown -R $USER:$USER /opt/robot-system
cd /opt/robot-system
若不用 git,可用
scp/ 对象存储 将本地仓库打包上传解压。
五、部署 Alpha 三服务
三个服务结构一致,分别安装依赖并启动。下面以 device-access 为例,其余两目录同理。
# 设备接入服务
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 单元)
验证:
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 时生效):
[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 构建
cd /opt/robot-system
npm install
npm run build # 产出 dist/(MODE=production,使用 env.js 的 PROD 配置)
6.3 视频管理页地址(重要)
src/components/SystemSetting/VideoManagement.tsx 顶部硬编码了:
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 托管 + 反代
# /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前缀会冲突,请为二者分配不同前缀或子域。
启用并重载:
sudo ln -s /etc/nginx/sites-available/robot-system /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
七、部署 nodevideo 视频服务(9528)
视频管理页依赖此服务,需与前端同一云环境可达。
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(国内云)
- 备案:国内云使用 80/443 + 域名必须完成 ICP 备案(阿里云/腾讯云控制台申请,约 1–2 周)。
- 证书:备案后用免费证书
或在云控制台申请免费 DV 证书后下载,Nginx 配置
sudo certbot --nginx -d 你的域名.cnssl_certificate / ssl_certificate_key。 - 证书自动续期:
sudo certbot renew --dry-run验证,certbot 默认建好 timer。
九、开机自启(推荐 systemd)
PM2 在 Linux 可用 pm2 startup(写 systemd 单元)实现开机拉起全部 pm2 save 的进程,最省事。
若偏好纯 systemd,可为每个服务写一个 unit(示例 device-access.service):
[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
sudo systemctl enable --now device-access
十、运维与备份
- 日志:
pm2 logs <name>;或 journaldjournalctl -u device-access -f。 - 数据备份:三服务的
data/*.json是业务数据,定时备份: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备份任务已配置