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

10 KiB
Raw Permalink Blame 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)

# 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(国内云)

  1. 备案:国内云使用 80/443 + 域名必须完成 ICP 备案(阿里云/腾讯云控制台申请,约 1–2 周)。
  2. 证书:备案后用免费证书
    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):

[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>;或 journald journalctl -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 备份任务已配置