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

📅 2026/7/1 4:31:43
【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 个核心容器的微服务网管系统 目录序幕挑战开始第一幕编译环境的版本战争第二幕GLIBC 的时空错位第三幕镜像构建的破釜沉舟第四幕服务启动的多米诺骨牌第五幕数据库的网络迷宫第六幕终极胜利后记经验总结序幕挑战开始时间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结果❌ 编译失败满屏报错第一幕编译环境的版本战争 问题 1Node.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 20C 依赖编译失败解决方案# 在 WSL 中切换 Node 版本nvm use18.20.4结果✅ 前端编译通过 问题 2Go 依赖下载失败现象go: downloading github.com/xxx/xxx tls: failed to verify certificate: x509: certificate signed by unknown authority诊断公司网络拦截 HTTPS 请求Go 无法从 GitHub 下载依赖解决方案# 配置国内 Go 代理goenv-wGOPROXYhttps://goproxy.cn,direct结果✅ Go 依赖下载成功 问题 3CMake 版本策略报错现象CMake Error: Policy CMP00XX not set诊断CMake 版本较老不支持某些新策略需要设置最小策略版本解决方案# 修改 build.sh添加兼容参数sed-is/cmake ${CM_OPTS}/cmake ${CM_OPTS} -DCMAKE_POLICY_VERSION_MINIMUM3.5/gbuild.sh结果✅ CMake 配置通过 问题 4Protobuf 编译工具缺失现象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: versionGLIBC_2.32 not found restserver: /lib/x86_64-linux-gnu/libc.so.6: versionGLIBC_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 包塞进旧容器而应该基于新系统构建新镜像战略调整放弃在旧容器中运行的想法基于ubuntu:24.04构建全新的nmsimage:1.2镜像这样编译环境和运行环境 glibc 版本完全匹配第三幕镜像构建的破釜沉舟 构建新镜像Step 1创建 DockerfileFROM ubuntu:24.04 ENV DEBIAN_FRONTENDnoninteractive # 安装运行时依赖 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 NACOShost.docker.internal:8848 -e RBMQ127.0.0.1:5672 -e REDIS127.0.0.1:6379 -e NODECOUNT1 -e WEB_PROXY/nacoshttp://host.docker.internal:8848;/rbmqhttp://127.0.0.1:15672--cap-addALL nmsimage:1.2结果✅ 容器启动成功第四幕服务启动的多米诺骨牌 问题 7restserver 启动即退出现象dockerexecdocker-nms-1 supervisorctl status restserver# 输出restserver EXITED Jun3012:59 AM诊断过程第一次检查日志cat/var/log/supervisor/restserver-stderr.log# 输出No such file or directory第二次检查 sysloggreprestserver /var/log/syslog# 输出空第三次手动运行/usr/bin/restserver :8080 /var/web# 输出无静默退出关键发现程序没有任何输出就退出了说明它在初始化时检查某些条件不满足就直接退出 问题 8Python2 依赖导致服务链断裂现象dockerexecdocker-nms-1 supervisorctl status# 输出dependent-startup FATAL cant find command python2诊断Ubuntu 24.04 默认只有 python3supervisor 配置中有服务依赖python2导致整个服务启动链被阻塞解决方案# 创建软链接ln-s/usr/bin/python3 /usr/bin/python2结果✅ 服务链可以继续启动 问题 9Syslog 连接失败现象tail-20/var/log/restserver.err.log# 输出log.go:38:[FLT]Unix syslog delivery error[Error to new syslog nms_restapp]诊断Go 程序尝试连接/dev/logUnix socketrsyslog 服务没有运行socket 不存在解决方案# 启动 rsyslogsupervisorctl start rsyslogd# 验证 socket 存在ls-la/dev/log# 输出srw-rw-rw- 1 root root 0 Jun 30 05:52 /dev/log结果✅ Syslog 连接成功 问题 10RabbitMQ 连接被拒绝终极杀手现象tail-20/var/log/nms_restapp.log# 输出2026-06-30T05:56:23.56325000: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.76369100:00(11244)main.go:56:[INFO]HTTP: :80802026-06-30T05:56:29.76376300:00(11244)main.go:63:[INFO]WebPath: /var/web/2026-06-30T05:56:29.76378100:00(11244)main.go:73:[INFO]WebProxy: /nacos http://host.docker.internal:8848意义restserver 成功启动监听了 8080 端口第五幕数据库的网络迷宫 问题 11MySQL 容器已退出现象dockerps-a# 输出5a9731b56d4f mysql:8.0 Exited(137)25 minutes ago go-admin-mysql-1诊断MySQL 容器因为内存不足被 OOM Killer 杀掉退出码 137NMS 无法连接数据库数据无法保存解决方案# 启动 MySQLdockerstartgo-admin-mysql-1# 等待启动Start-Sleep-Seconds 5# 验证dockerps|findstr mysql结果✅ MySQL 重新启动 问题 12Redis 未启动导致网元服务失败现象tail-20/var/log/nms_neapp.log# 输出2026-06-30T06:09:29.15074500: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 正常工作 问题 13Nacos 配置中的数据库地址错误现象Web 页面可以访问但保存数据时提示数据库连接失败诊断NMS 容器通过 Nacos 获取数据库配置Nacos 中配置的 MySQL 地址是127.0.0.1NMS 容器去连自己的127.0.0.1而不是宿主机的 MySQL解决方案登录 Nacos 控制台http://localhost:8848/nacos账号/密码nacos/nacos找到 NMS 的配置文件将数据库 Host 修改为host.docker.internal重启 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-wGOPROXYhttps://goproxy.cn,direct dos2unix build.shsed-is/cmake ${CM_OPTS}/cmake ${CM_OPTS} -DCMAKE_POLICY_VERSION_MINIMUM3.5/gbuild.sh ./build.sh nmsDocker 管理# 构建镜像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# 检查端口监听 项目成果成功编译从源码编译出 146MB 的 deb 安装包构建镜像基于 Ubuntu 24.04 构建 1.23GB 的新镜像微服务部署成功运行 4 个核心容器包含 20 个微服务Web 界面通过http://localhost:49159访问企业级网管系统数据库连通成功连接 MySQL 和 InfluxDB数据可正常读写 给后来者的建议环境准备使用 Node.js 18.x不要用 20配置 Go 代理GOPROXYhttps://goproxy.cn,direct确保磁盘空间充足编译过程需要 10GB编译阶段先修复换行符dos2unix build.sh添加 CMake 兼容参数-DCMAKE_POLICY_VERSION_MINIMUM3.5耐心等待编译过程约 20-30 分钟部署阶段基于新系统构建镜像不要用旧镜像按顺序启动服务rsyslog → RabbitMQ → Redis → 业务服务修改 Nacos 配置数据库地址改为host.docker.internal调试技巧先看端口ss -tlnp | grep 8080再看日志tail -50 /var/log/nms_*.log最后看配置Nacos 控制台 个人成长通过这次史诗级的部署挑战我掌握了全栈编译能力C / Go / Next.js 的交叉编译Docker 深度应用镜像构建、网络配置、端口映射微服务架构理解服务依赖、配置中心、消息队列问题排查能力日志分析、端口检测、网络调试系统架构设计从编译到部署的完整 CI/CD 流程这不仅是一次技术挑战更是一次架构师思维的全面锻炼 附录关键文件清单Dockerfile.newFROM ubuntu:24.04 ENV DEBIAN_FRONTENDnoninteractive 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 的史诗级部署挑战圆满结束**