恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
无人机管理平台从零部署:Docker Compose与视频流接入全攻略
首页
资讯中心
/
无人机管理平台从零部署:Docker Compose与视频流接入全攻略
无人机管理平台从零部署:Docker Compose与视频流接入全攻略
发布时间:2026/10/13 2:30:43
简介嗨森无人机管理平台是一套集操控、管理于一体的无人机算法源码包面向无人机开发者、科研人员及入门学习者帮助解决飞行稳定性、路径规划、避障、自主导航、任务执行等关键问题。平台围绕姿态控制、飞行路径规划、避障、自主导航、任务执行、无线通信、能量管理及故障诊断等算法模块展开源码结构清晰便于从零学习无人机的完整工作链路。压缩包共559个文件、约6.63MB以54个JavaScript和42个Vue组件为前端核心配合HTML/CSS页面样式、JSON配置数据、SQLite数据库以及SVN版本记录等覆盖界面、逻辑、存储和版本管理多个层面。目前已有170人学习下载。对于希望提升无人机算法开发能力的学习者可通过研读各算法模块的具体实现快速建立理论与实践之间的对应关系同时参考其中的示例工程和配置样例进行定制化改动是一份适合教研与工程实战两用的高质量学习资源。1. 拿到“嗨森无人机管理平台.zip”之后先搞清这个包到底能干什么做无人机巡检和测绘的团队手上散落的东西往往比飞机还多每台飞机各自一套地面站飞完的数据在SD卡里躺着任务的派发靠微信群吼月底统计作业量靠翻聊天记录。嗨森无人机管理平台这类交付包解决的就是这个阶段最头疼的事——把飞机、任务、数据、人员收进一套Web系统里统一管。它能覆盖航线规划、任务派发、实时视频回传、飞行数据归档和简单的统计看板适合电力巡检、林业勘察、农业生产这类有固定作业流程的团队也适合给这些行业做集成的交付商。这篇笔记按我实际落地的顺序来写拆开zip包先看懂交付物是什么形态然后用Docker Compose把系统从空服务器跑到登录页再接入第一台无人机把视频流和任务链路打通最后把部署和使用里最容易翻车的几个问题拿出来单独说。整个过程不依赖某个特定版本只要你拿到的包结构跟常见交付形态一致就能照着走通。2. 拆开交付包先建模看懂目录结构、部署形态与运行基线2.1 拿到zip先做三件事校验完整性、解压、摸清顶层目录很多团队拿到交付包的第一反应是直接双击解压结果解到一半报错或者是解出来不知道哪个目录才是入口。我一般会在服务器上先做一次清单预览确认压缩包完整再动手。zip解压这一步出问题大多不是操作问题而是压缩包本身在传输过程中损坏或者打包时带了不规范的路径。# 先看压缩包内容清单不实际解压 unzip -l 嗨森无人机管理平台.zip # 校验完整性的另一种方式看CRC测试结果 unzip -t 嗨森无人机管理平台.zip # 确认没问题后解压到指定目录 unzip 嗨森无人机管理平台.zip -d ./hiyson # 查看顶层结构忽略node_modules这类重目录 tree -L 2 ./hiyson -I node_modulesunzip -l列出的是压缩包内的文件清单重点看有没有顶层目录包裹、有没有明显的磁盘绝对路径比如C:\开头这两种情况都会给后面的部署脚本带来麻烦。unzip -t会逐文件做CRC校验输出OK才算传输完整。解压时用-d指定目标目录避免文件散落到当前目录里。如果交付方给压缩包设置了密码常见做法是找交付文档里附带的密码说明。zip密码移除这类操作在正规交付场景里基本用不到反而要警惕来源不明的包。压缩包如果出现could not find EOCD这类错误说明文件被截断过直接找交付方重新要包别用修复工具硬解。2.2 从目录结构判断交付形态源码工程还是编译产物解压之后先别急着跑花五分钟把目录结构看明白。无人机管理平台的交付形态通常就两种一种是完整的源码工程前端、后端、数据库脚本都在需要自己编译构建另一种是编译产物后端是jar包或war包前端是打包好的静态文件数据库脚本单独放在sql目录里。这两种形态的部署路径完全不同。# 典型的编译产物交付结构 hiyson/ ├── backend/ │ ├── hiyson-server.jar │ └── config/ │ └── application.yml ├── frontend/ │ ├── index.html │ └── static/ ├── sql/ │ └── init.sql ├── docs/ │ ├── 部署文档.md │ └── 接口文档.md └── docker/ └── docker-compose.yml判断依据很简单看到pom.xml、package.json、src目录说明是源码工程需要先装JDK和Node环境做构建看到jar包和dist、static这类静态资源目录说明是编译产物可以直接部署。我遇到过不少团队把源码包当产物包处理跑到一半发现没有可执行文件白白浪费半天。还有一种混合形态交付包里有源码但也有现成的编译产物和镜像归档文件。这种情况下优先用编译产物源码留作二次开发参考。文档目录里的部署说明一定先读里面通常会写清楚依赖的中间件版本和默认端口这比你自己猜要靠谱得多。2.3 运行基线核对版本、端口、依赖服务清单在启动任何服务之前先把运行基线核对清楚。无人机管理平台这种系统一般依赖四类基础服务关系型数据库存业务数据、缓存存会话和热点数据、对象存储存航拍照片和视频、媒体服务做视频流转发。不同交付版本用的中间件和版本差异很大MySQL有5.7和8.0之分JDK有8和11之分接错版本会出现各种莫名其妙的兼容问题。# 检查操作系统与架构 uname -m cat /etc/os-release # 检查Java版本后端如果是Java写的话 java -version # 检查Docker与Compose版本 docker --version docker compose version # 检查端口占用情况常见端口8000-8100、3306、6379、9000 ss -lntp | grep -E :(3306|6379|9000|8080|1935)端口规划可以整理成一张基线表部署时逐项核对。后端API服务一般落在8080或8000数据库默认3306Redis默认6379对象存储的API端口可能是9000媒体服务的RTMP端口是1935。如果服务器上已经跑着别的业务端口冲突是第一个要排查的点。服务角色常见默认端口说明后端API8080 / 8000业务接口Nginx反代目标MySQL3306业务数据库Redis6379会话与缓存MinIO / OSS9000 / 9090航拍文件存储媒体服务1935 / 8081RTMP推拉流与HTTP-FLV版本核对这一步别省。之前有一次我在x86服务器上部署得好好的换到ARM架构的机器上镜像直接起不来后来才发现交付包里有的镜像是按x86构建的。架构不匹配这类问题等跑起来再发现代价很大基线阶段就能排除。3. 用Docker Compose从零跑到登录页最小可运行系统的落地步骤3.1 先装基础环境Docker与Compose的安装和验证无人机管理平台涉及的中间件多我习惯直接用Docker Compose把整套拉起来而不是在宿主机上一个一个装。用Docker的另一个好处是环境隔离MySQL的版本、Redis的配置都在编排文件里固定下来换服务器能复现同一套环境。如果是在内网环境没有镜像仓库后面第6章会讲离线搬运的方法。# 安装Docker以CentOS系为例 sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io # 启动并设置开机自启 sudo systemctl enable --now docker # 安装Compose插件 sudo yum install -y docker-compose-plugin # 验证安装结果 docker compose versionDocker装好之后建议立刻配一下镜像加速不然后面拉取镜像会非常慢。如果服务器完全没有外网那就得走离线镜像导入的路线这个在第6章单独说。这里有个小习惯所有中间件的数据目录都通过卷挂载到宿主机这样容器删了数据还在后面升级和排错都方便。不使用Docker的情况下也有团队选择用mysql zip安装包手动初始化数据库、用jdk8 zip下载解压配置Java环境这种做法在多台服务器之间复制环境时容易漏版本我不太推荐。Docker Compose的价值在于把整个环境定义成一份yaml文件版本、端口、数据卷全都看得见。3.2 编排文件把数据库、缓存、对象存储、媒体服务一次拉起docker-compose.yml是整套系统的核心。无人机管理平台常见的服务拆分是Nginx做入口网关、后端API服务、MySQL存业务数据、Redis做缓存、MinIO存航拍文件、媒体服务处理视频流。后端API的镜像是交付包里自带的其他中间件用的是公共镜像编排文件把它们的网络和依赖关系串起来。services: mysql: image: mysql:8.0 container_name: hiyson-mysql environment: MYSQL_ROOT_PASSWORD: Hiyson123 MYSQL_DATABASE: hiyson TZ: Asia/Shanghai ports: - 3306:3306 volumes: - ./data/mysql:/var/lib/mysql - ./sql/init.sql:/docker-entrypoint-initdb.d/init.sql:ro command: - --character-set-serverutf8mb4 - --collation-serverutf8mb4_unicode_ci redis: image: redis:7.0 container_name: hiyson-redis command: redis-server --requirepass Hiyson123 --appendonly yes ports: - 6379:6379 volumes: - ./data/redis:/data minio: image: minio/minio:latest container_name: hiyson-minio environment: MINIO_ROOT_USER: hiyson MINIO_ROOT_PASSWORD: Hiyson123456 command: server /data --console-address :9001 ports: - 9000:9000 - 9001:9001 volumes: - ./data/minio:/data media: image: registry.cn-hangzhou.aliyuncs.com/hiyson/media:1.0 container_name: hiyson-media environment: RTMP_PORT: 1935 HTTP_PORT: 8081 ports: - 1935:1935 - 8081:8081 volumes: - ./data/media:/var/media backend: image: registry.cn-hangzhou.aliyuncs.com/hiyson/backend:1.0 container_name: hiyson-backend depends_on: - mysql - redis - minio - media environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/hiyson?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai SPRING_DATASOURCE_USERNAME: root SPRING_DATASOURCE_PASSWORD: Hiyson123 SPRING_REDIS_HOST: redis SPRING_REDIS_PASSWORD: Hiyson123 MINIO_ENDPOINT: http://minio:9000 MEDIA_RTMP_BASE: rtmp://media:1935/live ports: - 8080:8080 volumes: - ./logs:/logs nginx: image: nginx:1.24 container_name: hiyson-nginx depends_on: - backend ports: - 80:80 volumes: - ./frontend:/usr/share/nginx/html:ro - ./nginx/conf.d:/etc/nginx/conf.d:ro这里几个参数值得展开说。MySQL的环境变量里TZ: Asia/Shanghai设置了容器时区这个不设的话后面所有任务时间都会差8小时。MySQL的数据目录和初始化脚本都挂载到宿主机init.sql放到docker-entrypoint-initdb.d目录会在容器首次启动时自动执行这是初始化数据库最省事的方式。后端服务连接数据库用的是服务名mysql而不是localhost因为在Compose网络里服务名就是DNS名称这样IP变化不影响配置。MinIO的console-address参数把管理控制台单独放到9001端口避免和API端口冲突。媒体服务的镜像可能是私有仓库里的部署前要先确认能不能拉取到。3.3 初始化数据库与账号验证从空库到能登录编排文件里配置了自动执行初始化脚本但为了确认数据库真的初始化成功我习惯手动进容器看一眼。无人机管理平台的数据初始化脚本通常包含三部分内容表结构、基础字典数据飞机型号、任务类型、组织架构、默认管理员账号。前两部分是运行必需默认账号是验证系统能不能用的第一步。# 查看初始化是否完成检查库里的核心表 docker exec -i hiyson-mysql mysql -uroot -pHiyson123 -e USE hiyson; SHOW TABLES; # 手动执行初始化脚本如果自动初始化没生效 docker exec -i hiyson-mysql mysql -uroot -pHiyson123 ./sql/init.sql # 检查后端服务日志是否正常启动 docker logs --tail 100 hiyson-backend # 验证登录接口 curl -X POST http://localhost:8080/api/auth/login \ -H Content-Type: application/json \ -d {username:admin,password:admin123}登录接口返回的JSON里一般包含token和用户基本信息拿到token说明后端、数据库、Redis这条链路是通的。如果接口报连接数据库失败优先检查MySQL容器是否健康再看后端日志里的具体异常栈。如果登录返回但很快报会话失效大概率是Redis的密码或者网络配置不对注意Compose里后端连Redis用的是服务名而不是宿主机IP。初始化脚本有个容易踩的坑脚本里如果包含大量坐标数据比如行政区划边界、禁飞区数据执行时间会比较长看起来像卡住了。这时候不要中断用docker logs观察MySQL的执行进度或者进入容器用SHOW PROCESSLIST看当前在跑什么语句。3.4 Nginx把前端和后端收到同一个域名下前端静态页面和后端API通常是两个服务如果直接用IP加端口访问浏览器会碰到跨域问题。解决方式是让Nginx统一入口/路径返回前端页面/api路径反向代理到后端服务。这样浏览器只跟Nginx打交道跨域被转发层消化掉。server { listen 80; server_name _; root /usr/share/nginx/html; index index.html; # 前端路由HTML5 History模式下的兜底 location / { try_files $uri $uri/ /index.html; } # API反向代理 location /api/ { proxy_pass http://backend:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # 航拍文件访问从MinIO拉取 location /files/ { proxy_pass http://minio:9000/; proxy_set_header Host $host; } }try_files那行是给前端路由用的如果平台是单页应用刷新页面时URL会变深没有这行直接返回404。proxy_pass http://backend:8080;注意结尾不带斜杠这样/api前缀会被保留后端接口定义一般也是带这个前缀的。文件访问路径如果直接代理到MinIO要注意水土不服的问题——MinIO默认要求带bucket名的路径比如/files/航拍照片/xxx.jpg代理过去变成bucket名/xxx.jpg得确认下bucket名是否匹配。到这里浏览器访问服务器IP应该能看到登录页了用初始化脚本里的默认账号就能登进去。登录成功只是第一步真正的考验是接入无人机这个放到下一章。4. 接入第一台无人机视频流、协议选型与航线任务下发4.1 三种主流接入方式怎么选SDK直连、RTMP推流、GB/T 28181无人机管理平台要接的第一类设备是飞机本身第二类是机巢或机场第三类是挂载的云台相机。接入方式决定了你能拿到什么数据、控制到什么程度。常见做法是三种SDK直连、RTMP推流、GB/T 28181国标接入。选错了后面全返工我在这一节把优缺点和适用场景摆清楚。接入方式控制能力视频质量适用设备落地成本厂商SDK直连完整飞行控制与航线下发最高走私有协议自家品牌行业机高需二次开发RTMP推流仅视频不含控制高延迟2-5秒带推流功能的相机/挂载低配置即可GB/T 28181标准信令与视频中有国标编码开销存量监控级设备中需SIP配置SDK直连是体验最好的方式能做到航线下发、实时遥测、相机控制一条链路全通但每种机型的SDK都不一样接一款飞机就得写一套适配。RTMP推流最简单消费级无人机和很多云台相机本身就支持推流平台这边只需要一个媒体服务接收流转发适合先跑通再看数据的场景。GB/T 28181适合对接存量设备特别是原来就用在监控场景的球机、云台通过SIP信令把设备的视频流注册到平台。选型上我的建议是如果交付项目里飞机型号统一且是行业级设备走SDK直连如果只是要把视频接进来做直播和存储RTMP推流性价比最高如果客户原有大量国标设备要纳管那就上GB/T 28181。三种方式可以并存平台侧一般都会支持只是工作量差异很大。4.2 设备表单里最关键的五个字段别等接不上再回头补不管是哪种接入方式平台上都要新增一条设备记录。设备管理表单里字段很多但真正决定能不能用起来的就五个设备编号、接入协议、视频流地址、安装经纬度、国标ID如果走国标。我见过太多团队在前面填得随意后面直播黑屏或者任务没发出去回头一看是设备编号和推流地址不一致。{ deviceId: HS-2024-001, deviceName: 1号巡检机, protocol: RTMP, streamUrl: rtmp://192.168.1.100:1935/live/HS-2024-001, location: { lng: 120.123456, lat: 30.654321 }, gbId: , underControl: true }设备编号是平台内部的唯一标识必须和推流地址里的流名保持一致。比如设备编号是HS-2024-001RTMP地址建议按rtmp://IP:1935/live/HS-2024-001来拼媒体服务才能正确把流路由到这条设备记录上。streamUrl填的是视频流地址SDK直连模式下这里可能是SDK的接入参数而不是一个URL。经纬度用于地图显示和航线规划的基准点填反了或者填了GCJ-02火星坐标系地图上位置会偏几百米。新增设备之后有个验证步骤看媒体服务里有没有这条流的日志。以RTMP为例推流端开始推流后媒体服务日志里会出现play或者publish事件。如果设备显示在线但日志里压根没有流事件说明推流地址根本没到这台媒体服务优先排查网络和端口。4.3 航线任务从KML/KMZ到可执行的航点列表航线是无人机管理平台的核心功能而规划航线的数据通常来自两个渠道地面站软件导出KML/KMZ文件或者平台自己在地图上画。KML是标准的地理标注格式平台收到之后需要解析成航点列表再下发给飞机。这个环节看起来简单实际坑不少——坐标系的偏移、高度的单位、航点动作的类型任何一个字段理解错飞机飞出去就是另外一个路线。# 从KML里提取航点的常见方式直接解压读取 unzip -o 航线文件.kmz -d ./kmz_tmp # KMZ本质是压缩包解压后得到一个doc.kml # 用grep快速看航点坐标不严谨但快速排查用 grep -E coordinates ./kmz_tmp/doc.kml | head -5KML里coordinates标签的内容是经度,纬度,高度三元组这个高度默认是椭球高或者海拔高具体取决于生成KML的地面站设置。平台解析之后要转成相对起飞点的高度这里换算错了飞机实际飞行高度会跟规划差一大截。KMZ格式本质就是zip压缩包解压后能看到里面真正的KML文件这也是为什么第2章强调zip解压基本功——无人机领域很多交付文件都藏在压缩包里。航线上有两个参数需要人工确认航点动作和云台角度。到点悬停拍照、匀速通过还是云台朝特定方向拍摄这些在KML里不一定表达得出来平台的任务模板里一般会有默认值下发前要跟飞手确认一遍。OTA固件升级也是通过这种文件上传的方式下发上传固件zip包的时候如果平台报校验失败通常不是网络问题而是文件问题这个在第5章会细说。5. 部署与使用避坑五个让无人机团队翻车的真实问题5.1 飞机在线、视频黑屏SRS端口与拉流地址不一致现象平台设备列表里飞机显示在线点开直播画面却一直黑屏播放器不报错就是不出画面。原因设备在线是心跳在维持跟视频流是两条独立的链路。最常见的是媒体服务的RTMP端口只开了1935但拉流时走了HTTP-FLV的8081端口防火墙没放通或者Nginx没有把播放请求代理到媒体服务。也遇到过推流地址的流名跟设备编号对不上推流发出去了但平台不知道这条流属于哪台设备于是直播页面找不到流。解决先ss -lntp | grep 1935确认端口在监听再在播放页面按F12看网络请求确认播放请求发到了哪个端口。如果是HTTP-FLV播放确认8081端口放通并且Nginx里有对应的location转发规则。流名不匹配的问题回第4章的表单里核对deviceId和推流地址里的流名改完后让飞手重启推流。5.2 任务明明下发了飞机却不动作协议版本不匹配现象平台上下发航线任务界面提示“已下发”但飞机没有任何反应飞手手里的遥控器也没收到任务。原因平台和飞机之间的通信协议版本对不上。行业无人机的SDK协议更新频繁平台按旧协议下发航线新固件的飞机直接不认或者平台连接的网关组件版本落后把新协议的任务包解析错了。日志里一般能看到unknown command或parse error这类关键字。解决先看任务下发后平台有没有等待设备ACK很多平台有“下发-确认”两段式状态如果状态一直停在“已下发”不变成“已确认”说明设备侧没应答。这时候去查平台的协议适配版本跟飞机固件版本是否匹配找交付方要一个协议兼容矩阵。血的教训升级飞机固件前先确认平台侧协议版本支持别在作业高峰期做固件升级。5.3 地图上飞机位置偏了几十米坐标系混用现象平台上飞机图标的位置跟实际位置偏差几十到几百米航线在地图上看起来很合理飞出去实际偏了。原因坐标系不统一。平台地图用的坐标系通常是GCJ-02或者Web Mercator投影跟飞机的GPS输出坐标系WGS-84不是一回事二者之间需要做转换。很多平台的设备接入示例代码里默认不做转换直接拿GPS原始坐标往地图上填低纬度地区偏差几十米高纬度只会更严重。解决确认平台的地图SDK用的是什么坐标系然后在接入层加一道转换。WGS-84转GCJ-02是一个固定算法网上有成熟实现关键是要判断平台有没有已经做过转换做过的话再做一遍就是二次偏移。验证方法把飞机放在一个已知坐标的地标点旁边看平台显示位置与实际位置的偏差这是最直观的坐标系体检。5.4 任务时间错8个小时容器时区没有统一现象平台里任务计划时间填写的是上午10点实际执行记录显示凌晨2点所有时间都差8小时。原因容器默认的时区是UTC业务代码里如果用了new Date()存的本地时间写入到MySQL后跟Asia/Shanghai时区的读取逻辑一比较就差了8小时。这个在第3章的编排文件里特别加了TZ: Asia/Shanghai环境变量但容易漏在某个中间件上比如Redis容器或者MinIO容器没加。解决在docker-compose.yml里每个服务都加上TZ: Asia/Shanghai环境变量后端服务连接数据库的URL里加serverTimezoneAsia/Shanghai。已经脏掉的数据写SQL按小时数批量修正。这属于典型的“加一行配置就能解决”的问题排查时别去改代码先检查容器时区。5.5 上传固件zip包总报校验失败现象通过平台上传飞机固件zip包进度条到100%之后提示“校验失败”或者“文件损坏”换了浏览器也一样。原因固件包在打包环节出了问题。常见的情况是打包时把固件文件的顶层目录一起打了进去平台解压后找不到预期的固件描述文件或者压缩时用了不规范的压缩算法平台端的解压组件不支持。传输过程也可能导致文件损坏但每次都失败的话更要考虑是打包问题而不是传输问题。解决重新打包注意固件包内层目录结构要跟平台要求的清单一致一般固件包根部应该直接是描述文件和固件主体不能多包一层文件夹。如果平台侧报的是failed to copy相关错误要看是不是存储目录权限问题——固件上传后要临时解压到某个目录该目录不可写也会报奇奇怪怪的错误给上传目录正确的写权限不要直接拿root硬试。上传前可以在本地先解压一遍确认zip包结构正常再传。6. 进阶离线内网环境的镜像搬运与一条日志定位问题6.1 内网部署用docker save和load搬运整套镜像很多无人机项目的实际运行环境在客户机房完全没有外网。这时候在能联网的机器上先把镜像拉下来打包成tar文件拷进内网再用docker load导入是最常用的离线部署方案。这一步看起来简单但镜像大小动辄几个GB打包、传输、导入的每一步都可能翻车。# 在联网机器上把所有需要离线交付的镜像打成一个tar包 docker save -o hiyson-images.tar \ mysql:8.0 redis:7.0 minio/minio nginx:1.24 \ registry.cn-hangzhou.aliyuncs.com/hiyson/backend:1.0 \ registry.cn-hangzhou.aliyuncs.com/hiyson/media:1.0 # 压缩传输linux压缩当前文件夹到zip或tar.gz都行 tar -czf hiyson-images.tar.gz hiyson-images.tar # 在内网服务器上解压并导入 tar -xzf hiyson-images.tar.gz docker load -i hiyson-images.tar # 导入后确认镜像列表完整 docker images | grep -E hiyson|mysql|redis|minio|nginxdocker save的-o参数指定输出文件镜像多的时候可以像上面这样一次传多个但注意tar包会非常大传输前先确认磁盘空间。导入后有个容易忽略的点镜像的tag要跟docker-compose.yml里写的一致否则Compose会自动尝试拉取远程镜像离线环境下直接失败。docker load保留了镜像的完整tag信息一般没问题但如果你在离线机器上重新打过tagdocker-compose.yml里的引用就得跟着改。6.2 用日志关键字五分钟定位一次故障部署完成之后的日常维护最常用的排查手段不是看界面而是看日志。日志里的一行关键字往往直接指向问题根因比在界面上反复点按钮高效得多。我习惯按“先看启动日志、再看请求日志、最后看中间件日志”的顺序排查启动失败找backend业务异常找backend和数据库视频问题找media。# 看服务启动是否成功重点搜ERROR和Exception docker logs --tail 200 hiyson-backend | grep -E ERROR|Exception|Caused by # 看请求链路是否到了后端 docker logs --tail 50 hiyson-backend | grep -E 正在处理|HttpRequest|method # 看数据库连接和慢SQL docker logs --tail 50 hiyson-mysql | grep -E Aborted connection|slow query # 看媒体服务的流事件 docker logs --tail 50 hiyson-media | grep -E publish|play|close日志排查有一个关键习惯先确认时间点再搜关键字。无人机作业是强时间相关的场景飞机几点推流、任务几点下发日志里的时间戳是定位问题的锚点。拿作业时间段去过滤日志比看漫天的INFO信息有用得多。还有一个经验Connection refused和Access denied这两类错误占了日常问题的六成以上前者是网络或服务没起来后者是账号密码或权限配错看到这两个关键字基本不用看堆栈就能定位方向。最后说一个我自己的习惯每次部署完我都会把docker-compose.yml、部署文档、镜像清单打成zip归档连同初始化好的数据库导出一份放到项目目录里。这能省掉大量“环境跑不起来了找现场的人要现场配置”的麻烦。等过一个月有新同事加入接手项目他拿到的是一套能完整复现的环境而不是一堆“当年能跑但没人知道为什么”的黑匣子。希望帮到你。本文还有配套的精品资源点击获取