news 2026/7/1 4:31:36

【AI全栈】NMS 企业级网管系统:从 0 到 1 史诗级部署全记录

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【AI全栈】NMS 企业级网管系统:从 0 到 1 史诗级部署全记录

🏆 NMS 企业级网管系统:从 0 到 1 史诗级部署全记录

项目名称:光传输网管系统(OTN/WDM NMS)
技术栈:C++ / Go / Next.js / Docker / MySQL / RabbitMQ / Redis / Nacos
部署时间:2026年6月29日 - 6月30日
部署工程师:LucasLC
最终成果:成功构建并运行包含 4 个核心容器的微服务网管系统


📖 目录

  1. 序幕:挑战开始
  2. 第一幕:编译环境的"版本战争"
  3. 第二幕:GLIBC 的"时空错位"
  4. 第三幕:镜像构建的"破釜沉舟"
  5. 第四幕:服务启动的"多米诺骨牌"
  6. 第五幕:数据库的"网络迷宫"
  7. 第六幕:终极胜利
  8. 后记:经验总结

序幕:挑战开始

时间:2026年6月29日
任务:将企业级光传输网管系统从源码编译,部署到 Docker 容器中运行

🎯 初始状态

  • 项目位置D:\linux\Controller
  • 技术架构
    • 前端:Next.js (React)
    • 后端:Go (restserver, neapp, alarmapp 等微服务)
    • 底层:C++ (网元管理、协议栈)
    • 数据库:MySQL + InfluxDB
    • 中间件:RabbitMQ + Redis + Nacos

📋 初步尝试

# 第一次尝试编译cd D:\linux\Controller./build.sh nms

结果:❌ 编译失败,满屏报错


第一幕:编译环境的"版本战争"

🐛 问题 1:Node.js 版本冲突

现象

npm ERR! node_modules/canvas: Command failed. npm ERR! gyp ERR! stack Error: Command failed: python --version

诊断

  • 项目依赖的canvas包需要 Node.js 18.x
  • 当前使用的是 Node.js 20+
  • C++ 依赖编译失败

解决方案

# 在 WSL 中切换 Node 版本nvm use18.20.4

结果:✅ 前端编译通过


🐛 问题 2:Go 依赖下载失败

现象

go: downloading github.com/xxx/xxx tls: failed to verify certificate: x509: certificate signed by unknown authority

诊断

  • 公司网络拦截 HTTPS 请求
  • Go 无法从 GitHub 下载依赖

解决方案

# 配置国内 Go 代理goenv-wGOPROXY=https://goproxy.cn,direct

结果:✅ Go 依赖下载成功


🐛 问题 3:CMake 版本策略报错

现象

CMake Error: Policy CMP00XX not set

诊断

  • CMake 版本较老,不支持某些新策略
  • 需要设置最小策略版本

解决方案

# 修改 build.sh,添加兼容参数sed-i's/cmake ${CM_OPTS}/cmake ${CM_OPTS} -DCMAKE_POLICY_VERSION_MINIMUM=3.5/g'build.sh

结果:✅ CMake 配置通过


🐛 问题 4:Protobuf 编译工具缺失

现象

protoc-gen-go: command not found

诊断

  • Go 的 protobuf 编译器未安装
  • 需要在 PATH 中添加 GOPATH/bin

解决方案

exportPATH=$PATH:$(goenvGOPATH)/bin

结果:✅ Protobuf 代码生成成功


🎉 阶段性胜利

经过 2 小时的奋战,终于成功编译:

./build.sh nms# 输出CPack: - package: /mnt/d/linux/Controller/nmsbuild/nms_1.0.0.1_20260629.deb generated.

成果:生成了 146MB 的 deb 安装包


第二幕:GLIBC 的"时空错位"

🐛 问题 5:容器内服务启动即崩溃

现象

dockerexecdocker-nms-1 /usr/bin/restserver# 报错restserver: /lib/x86_64-linux-gnu/libc.so.6: version`GLIBC_2.32' not found restserver: /lib/x86_64-linux-gnu/libc.so.6: version`GLIBC_2.34' not found

诊断

  • 我们在WSL Ubuntu 24.04(glibc 2.39) 上编译
  • 官方镜像nmsimage:1.1基于Debian 10(glibc 2.28)
  • 新编译的二进制文件依赖新版 glibc,老系统跑不动!

第一次尝试:在 Debian 10 容器中重新编译

dockerrun-it--rm-vD:\linux\Controller:/workspace debian:10bashaptupdate# 安装编译工具...

结果:❌ Debian 10 已 EOL,软件源 404,无法安装工具

第二次尝试:从 WSL 复制编译工具到容器

dockercp/usr/bin/protoc docker-nms-1:/usr/bin/protocdockercp/usr/lib/go-1.26 docker-nms-1:/usr/local/go

结果:❌ protoc 依赖动态库,复制后仍无法运行


💡 灵光一现

核心洞察

我们不应该把 deb 包塞进旧容器,而应该基于新系统构建新镜像

战略调整

  1. 放弃"在旧容器中运行"的想法
  2. 基于ubuntu:24.04构建全新的nmsimage:1.2镜像
  3. 这样编译环境和运行环境 glibc 版本完全匹配

第三幕:镜像构建的"破釜沉舟"

🚀 构建新镜像

Step 1:创建 Dockerfile

FROM ubuntu:24.04 ENV DEBIAN_FRONTEND=noninteractive # 安装运行时依赖 RUN apt-get update && apt-get install -y \ supervisor \ rabbitmq-server \ redis-server \ rsyslog \ && rm -rf /var/lib/apt/lists/* # 复制编译好的 deb 包 COPY nmsbuild/nms_1.0.0.1_20260630.deb /tmp/ # 安装 deb 包 RUN dpkg -i /tmp/nms_1.0.0.1_20260630.deb || true RUN apt-get update && apt-get install -f -y # 复制 supervisor 配置 COPY docker/supervisor_conf/ /etc/supervisor/conf.d/ EXPOSE 8080 5050 5060 5070 5672 6379 830 CMD ["/usr/bin/supervisord", "-n"]

Step 2:构建镜像

docker build-f Dockerfile.new-t nmsimage:1.2.

结果:✅ 成功构建 1.23GB 的新镜像


🐛 问题 6: supervisor 配置路径错误

现象

ERROR: failed to solve: failed to calculate checksum: "/docker/supervisord.conf": not found

诊断

  • Dockerfile 中写的是COPY docker/supervisord.conf
  • 实际文件在docker/supervisor/supervisord.conf

解决方案

# 修正路径COPYdocker/supervisor/supervisord.conf/etc/supervisor/conf.d/supervisord.conf

结果:✅ 镜像构建成功


🚀 启动新容器

docker run-d--name docker-nms-1 `-p 49159:8080 `-p 5050:5050-p 5060:5060-p 5070:5070 `-p 5672:5672-p 6379:6379-p 830:830 `-e NACOS=host.docker.internal:8848 `-e RBMQ=127.0.0.1:5672 `-e REDIS=127.0.0.1:6379 `-e NODECOUNT=1 `-e WEB_PROXY="/nacos=http://host.docker.internal:8848;/rbmq=http://127.0.0.1:15672"`--cap-add=ALL ` nmsimage:1.2

结果:✅ 容器启动成功


第四幕:服务启动的"多米诺骨牌"

🐛 问题 7:restserver 启动即退出

现象

dockerexecdocker-nms-1 supervisorctl status restserver# 输出restserver EXITED Jun3012:59 AM

诊断过程

  1. 第一次检查日志

    cat/var/log/supervisor/restserver-stderr.log# 输出:No such file or directory
  2. 第二次检查 syslog

    greprestserver /var/log/syslog# 输出:空
  3. 第三次手动运行

    /usr/bin/restserver :8080 /var/web# 输出:无(静默退出)

关键发现

  • 程序没有任何输出就退出了
  • 说明它在初始化时检查某些条件,不满足就直接退出

🐛 问题 8:Python2 依赖导致服务链断裂

现象

dockerexecdocker-nms-1 supervisorctl status# 输出dependent-startup FATAL can't find command 'python2'

诊断

  • Ubuntu 24.04 默认只有 python3
  • supervisor 配置中有服务依赖python2
  • 导致整个服务启动链被阻塞

解决方案

# 创建软链接ln-s/usr/bin/python3 /usr/bin/python2

结果:✅ 服务链可以继续启动


🐛 问题 9:Syslog 连接失败

现象

tail-20/var/log/restserver.err.log# 输出log.go:38:[FLT]Unix syslog delivery error[Error to new syslog nms_restapp]

诊断

  • Go 程序尝试连接/dev/logUnix socket
  • rsyslog 服务没有运行,socket 不存在

解决方案

# 启动 rsyslogsupervisorctl start rsyslogd# 验证 socket 存在ls-la/dev/log# 输出:srw-rw-rw- 1 root root 0 Jun 30 05:52 /dev/log

结果:✅ Syslog 连接成功


🐛 问题 10:RabbitMQ 连接被拒绝(终极杀手)

现象

tail-20/var/log/nms_restapp.log# 输出2026-06-30T05:56:23.563250+00:00(11158)com.go:31:[FLT]dial tcp127.0.0.1:5672: connect: connection refused[Failed to connect to RabbitMQ]

诊断

  • restserver 需要连接 RabbitMQ 消息队列
  • RabbitMQ 没有启动,导致连接失败
  • 程序初始化失败,直接退出

解决方案

# 启动 RabbitMQsupervisorctl start rabbitmq# 等待 10 秒sleep10# 验证端口ss-tlnp|grep5672# 输出:tcp LISTEN 0 128 0.0.0.0:5672 0.0.0.0:* users:(("beam.smp",...))

结果:✅ RabbitMQ 启动成功


🎉 重大突破

tail-20/var/log/nms_restapp.log# 输出2026-06-30T05:56:29.763691+00:00(11244)main.go:56:[INFO]HTTP: :80802026-06-30T05:56:29.763763+00:00(11244)main.go:63:[INFO]WebPath: /var/web/2026-06-30T05:56:29.763781+00:00(11244)main.go:73:[INFO]WebProxy: /nacos http://host.docker.internal:8848

意义:restserver 成功启动,监听了 8080 端口!


第五幕:数据库的"网络迷宫"

🐛 问题 11:MySQL 容器已退出

现象

dockerps-a# 输出5a9731b56d4f mysql:8.0 Exited(137)25 minutes ago go-admin-mysql-1

诊断

  • MySQL 容器因为内存不足被 OOM Killer 杀掉(退出码 137)
  • NMS 无法连接数据库,数据无法保存

解决方案

# 启动 MySQLdockerstartgo-admin-mysql-1# 等待启动Start-Sleep-Seconds 5# 验证dockerps|findstr mysql

结果:✅ MySQL 重新启动


🐛 问题 12:Redis 未启动导致网元服务失败

现象

tail-20/var/log/nms_neapp.log# 输出2026-06-30T06:09:29.150745+00:00(12898)nestatus.go:159:[FLT]dial tcp127.0.0.1:6379: connect: connection refused[Failed to Get NE List]

诊断

  • neapp 需要连接 Redis 获取网元列表
  • Redis 服务处于EXITED状态
  • 导致网元服务无法工作

解决方案

# 启动 Redis(绕过 supervisor,直接后台运行)redis-server--daemonizeyes# 验证端口ss-tlnp|grep6379# 输出:tcp LISTEN 0 511 127.0.0.1:6379 0.0.0.0:* users:(("redis-server",...))# 重启 neappsupervisorctl restart neapp

结果:✅ Redis 启动成功,neapp 正常工作


🐛 问题 13:Nacos 配置中的数据库地址错误

现象

  • Web 页面可以访问
  • 但保存数据时提示"数据库连接失败"

诊断

  • NMS 容器通过 Nacos 获取数据库配置
  • Nacos 中配置的 MySQL 地址是127.0.0.1
  • NMS 容器去连自己的127.0.0.1,而不是宿主机的 MySQL

解决方案

  1. 登录 Nacos 控制台:http://localhost:8848/nacos(账号/密码:nacos/nacos
  2. 找到 NMS 的配置文件
  3. 将数据库 Host 修改为:host.docker.internal
  4. 重启 NMS 容器

原理

  • host.docker.internal是 Docker Desktop 提供的特殊域名
  • 指向 Windows 宿主机
  • NMS 容器通过这个域名可以访问宿主机上运行的 MySQL 容器

第六幕:终极胜利

🎯 最终状态

dockerps-a# 输出CONTAINER ID IMAGE STATUS PORTS NAMES 3773e45d6aef nmsimage:1.2 Up 2 hours 0.0.0.0:49159->8080/tcp docker-nms-1 5a9731b56d4f mysql:8.0 Up About an hour 0.0.0.0:3306->3306/tcp go-admin-mysql-1 29b3c64ec63c influxdb:latest Up 16 hours 8086/tcp docker-influxdb-1 69348e1f81b7 nacos/nacos-server:v2.1.1 Up 16 hours 0.0.0.0:9848->9848/tcp docker-nacos-1

🌐 访问 Web 界面

浏览器访问http://localhost:49159

登录成功:✅ 看到企业级网管系统登录界面

功能验证

  • ✅ Dashboard 仪表盘
  • ✅ 网元配置 (/ne/neConfig)
  • ✅ 告警管理 (/nealm/currentalm)
  • ✅ 性能监控 (/neperf/currentperf)
  • ✅ 路由管理 (/router/routes)
  • ✅ 光交叉连接 (/ocs)

后记:经验总结

📚 核心知识点

1. GLIBC 版本匹配原则

编译环境的 glibc 版本 ≤ 运行环境的 glibc 版本

  • 错误做法:在 Ubuntu 24.04 (glibc 2.39) 编译,在 Debian 10 (glibc 2.28) 运行
  • 正确做法:在 Ubuntu 24.04 编译,在 Ubuntu 24.04 运行
2. Docker 网络隔离与通信
  • 容器之间默认网络隔离
  • 使用host.docker.internal访问宿主机
  • 使用docker network创建自定义网络实现容器互访
3. 微服务启动顺序
rsyslog → RabbitMQ → Redis → restserver → neapp
  • 必须先启动基础服务(日志、消息队列、缓存)
  • 再启动业务服务(Web、网元管理)
4. 配置中心的重要性
  • Nacos 作为配置中心,统一管理所有微服务的配置
  • 修改数据库地址等配置时,只需在 Nacos 中修改一次
  • 所有微服务自动获取最新配置

🛠️ 常用命令速查

编译
nvm use18.20.4 goenv-wGOPROXY=https://goproxy.cn,direct dos2unix build.shsed-i's/cmake ${CM_OPTS}/cmake ${CM_OPTS} -DCMAKE_POLICY_VERSION_MINIMUM=3.5/g'build.sh ./build.sh nms
Docker 管理
# 构建镜像docker build-f Dockerfile.new-t nmsimage:1.2.# 启动容器docker run-d--name docker-nms-1-p 49159:8080...nmsimage:1.2# 启动基础服务dockerstartgo-admin-mysql-1 docker-nacos-1
容器内服务管理
dockerexec-itdocker-nms-1bashsupervisorctl start rsyslogd supervisorctl start rabbitmq redis-server--daemonizeyessupervisorctl restart restserver supervisorctl restart neapp
日志分析
tail-50/var/log/nms_restapp.log# Web 服务日志tail-50/var/log/nms_neapp.log# 网元服务日志ss-tlnp|grep8080# 检查端口监听

🏆 项目成果

  1. 成功编译:从源码编译出 146MB 的 deb 安装包
  2. 构建镜像:基于 Ubuntu 24.04 构建 1.23GB 的新镜像
  3. 微服务部署:成功运行 4 个核心容器,包含 20+ 个微服务
  4. Web 界面:通过http://localhost:49159访问企业级网管系统
  5. 数据库连通:成功连接 MySQL 和 InfluxDB,数据可正常读写

💡 给后来者的建议

  1. 环境准备

    • 使用 Node.js 18.x(不要用 20+)
    • 配置 Go 代理(GOPROXY=https://goproxy.cn,direct
    • 确保磁盘空间充足(编译过程需要 10GB+)
  2. 编译阶段

    • 先修复换行符(dos2unix build.sh
    • 添加 CMake 兼容参数(-DCMAKE_POLICY_VERSION_MINIMUM=3.5
    • 耐心等待(编译过程约 20-30 分钟)
  3. 部署阶段

    • 基于新系统构建镜像(不要用旧镜像)
    • 按顺序启动服务(rsyslog → RabbitMQ → Redis → 业务服务)
    • 修改 Nacos 配置(数据库地址改为host.docker.internal
  4. 调试技巧

    • 先看端口(ss -tlnp | grep 8080
    • 再看日志(tail -50 /var/log/nms_*.log
    • 最后看配置(Nacos 控制台)

🎓 个人成长

通过这次史诗级的部署挑战,我掌握了:

  1. 全栈编译能力:C++ / Go / Next.js 的交叉编译
  2. Docker 深度应用:镜像构建、网络配置、端口映射
  3. 微服务架构理解:服务依赖、配置中心、消息队列
  4. 问题排查能力:日志分析、端口检测、网络调试
  5. 系统架构设计:从编译到部署的完整 CI/CD 流程

这不仅是一次技术挑战,更是一次架构师思维的全面锻炼!


📝 附录:关键文件清单

Dockerfile.new

FROM ubuntu:24.04 ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y supervisor rabbitmq-server redis-server rsyslog COPY nmsbuild/nms_1.0.0.1_20260630.deb /tmp/ RUN dpkg -i /tmp/nms_1.0.0.1_20260630.deb || true COPY docker/supervisor_conf/ /etc/supervisor/conf.d/ CMD ["/usr/bin/supervisord", "-n"]

日常启动脚本(PowerShell)

# 启动基础中间件dockerstartgo-admin-mysql-1 docker-nacos-1 docker-influxdb-1# 启动 NMS 容器dockerstartdocker-nms-1# 进入容器启动服务docker exec-it docker-nms-1 bash-c" supervisorctl start rsyslogd && supervisorctl start rabbitmq && sleep 10 && redis-server --daemonize yes && supervisorctl restart restserver && supervisorctl restart neapp "


** 至此,NMS 企业级网管系统从 0 到 1 的史诗级部署挑战,圆满结束!**

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 4:31:13

都市人群高频睡眠误区解析:走出经验误区,建立科学睡眠管理体系

熬夜失眠、浅眠易醒、晨起疲惫,已成为西安职场人群的生活常态。很多人遭遇睡眠困扰后,常会凭借固有经验自我调理,通过周末长时间补觉、卧床强迫静养等方式改善睡眠,不仅收效甚微,反而容易加重睡眠紊乱。大众对睡眠认知…

作者头像 李华
网站建设 2026/7/1 4:31:02

Function Calling、MCP 和 Skills 的区别

结论先行 Function Calling、MCP 和 Skills 都是在扩展 AI Agent 的能力,但它们解决的问题层级不同: 能力 主要解决什么 本质 适合场景 Function Calling 让模型调用你定义的函数 API 级工具调用协议 应用内业务函数、结构化参数、确定性动作 MCP 让模…

作者头像 李华
网站建设 2026/7/1 4:31:02

基于SSM框架的Java智慧养老系统开发实战:从环境搭建到功能实现

这次我们来看一个基于 SSM 框架和 MySQL 数据库的 Java 智慧养老系统。对于计算机专业的同学来说,毕业设计是一个综合性的实战项目,而一个功能完整、结构清晰的“养老院综合管理平台”无疑是一个既贴合社会热点,又具备一定技术深度的选题。这…

作者头像 李华
网站建设 2026/7/1 4:30:12

化疗三次扛不住后,他转到了这里:没想到还能吃下饭、睡整觉

老张今年68岁,半年前确诊肺癌晚期。确诊那天,儿子在走廊里蹲了很久没站起来。老张倒是平静,跟医生说:“该怎么治怎么治,我不怕。”他确实不怕。第一次化疗,他咬着牙挺过去了。第二次,吐了三天&a…

作者头像 李华
网站建设 2026/7/1 4:30:04

【课程设计/毕业设计】基于 SpringBoot 的仓储物流物资管控系统的设计与实现 基于 SpringBoot 的库房出入库数据统计分析系统【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/7/1 4:30:02

从零构建Linux内核操作系统:环境搭建、编译与QEMU测试实战

在操作系统开发领域,Linux内核以其开源、稳定和高度可配置的特性,成为了学习和构建自定义操作系统的绝佳起点。无论是出于学术研究、嵌入式系统开发,还是对计算机底层原理的深度探索,基于Linux内核进行操作系统开发都是一项极具价…

作者头像 李华