Caster 到底在干什么
NTRIP 协议里有三个角色,很容易记混:
占用 1 个上行连接
鉴权 + 源表
按挂载点选流
一个 Caster 具体做四件事:
- 接收与鉴权:验证推流方的凭据,把某一路 RTCM 流绑定到一个挂载点(mountpoint)。
- 分发:一路流同时发给几十上百个客户端,基站上行带宽只花一份。
- 公告:维护源表(sourcetable / STR),告诉客户端「我这里有哪些流、在哪、什么格式、什么电文」。
- 解析:读出流里的 1005 / 1006 电文,反查经纬度、国家、城市,把源表里的位置信息改对——这是 2RTK NTRIP Caster 相比纯转发型 Caster 多做的一步。
负载其实很轻。实测 2000 个并发拉流时 CPU 不到 20%,瓶颈永远在带宽和线路质量上,不在计算。
什么情况下值得自己搭
| 场景 | 建议 |
|---|---|
| 只有一台基站,自己用 | 直接推公共 Caster(比如 本站测试服务器)就够了 |
| 几台基站,要给团队分账号 | 自己搭,按挂载点 + 账号做隔离 |
| 数据不能公开(厂区、矿区、项目) | 必须自己搭,公共 Caster 的源表都是公开的 |
| 要给客户提供差分服务 | 自己搭,能看在线数、流量、连接日志 |
| 基站放在内网,只放出流 | 自己搭在公网 VPS,内网基站主动往上推 |
为什么用这个 Caster
全程网页管理
加用户、加挂载点、看在线连接、看日志都在浏览器里点,不用改配置文件再重启。
自动生成 STR
建好挂载点直接推流,服务端解析 RTCM 后自己补齐源表字段,不用手写 sourcetable。
SQLite 单文件
账号和挂载点都存在一个 2rtk.db 里,备份就是拷一个文件,换机器两分钟复活。
2000+ 并发
线程池 + 环形缓冲 + 独立发送线程,实测 2000 连接不掉线,CPU 17% 左右。
三种装法
一键脚本(含 systemd + Nginx)、Docker 一条命令、源码 venv 直接跑,按环境挑。
无损升级
update.sh 自动备份、停旧进程、健康检查、失败回滚,数据和账号都不动。
一句话:2RTK NTRIP Caster 让你用最快、最简单的方式,部署一套完全属于你自己的 RTK 站点链路—— 自己的 RTK 基站、自己的 RTK CORS、自己的 NTRIP Caster,数据和账号都在你手里。 下面这一页只讲这一件事的完整流程。
不管你是在找「自建 RTK 基站」「自建 CORS / RTK CORS」「自建 RTK 网络」「自建 NTRIP Caster」, 还是想给自己的 RTK 设备搭一个私有的差分服务端,流程都是同一条,照着做一遍就够。
先准备一台服务器
最低配置要求不高,但系统版本有一条硬红线。推荐直接使用云服务器—— 公网 IP、带宽和安全组都是现成的,不用自己折腾内网穿透:
| 项目 | 要求 | 说明 |
|---|---|---|
| 系统 | Debian 11+ / Ubuntu 22.04+ | CentOS 8+ / RHEL 8+ 也能跑,但没有一键脚本;关键是 Python 3.9+ |
| CPU | 2 核(x86_64 优先) | ARM 也能跑,性能按比例折算 |
| 内存 | 2 GB | 100 并发以下 1 GB 也够 |
| 硬盘 | 10 GB | 主要是日志 |
| 端口 | 2101、5757 | 云厂商的安全组里要单独放行 |
Ubuntu 20.04 和 Debian 10 装不上。它们自带 Python 3.8,而依赖里的 pyrtcm==1.1.8 要求 Python 3.9+。
一键脚本会直接检测并退出,不用浪费时间试。
按并发量估配置,别一上来就买大机器:
| 并发连接 | CPU | 内存 | 硬盘 | 带宽 |
|---|---|---|---|---|
| 100 以内 | 1 核 | 1 GB | 5 GB | 10 Mbps |
| 100 – 500 | 2 核 | 2 GB | 10 GB | 50 Mbps |
| 500 – 1000 | 4 核 | 4 GB | 20 GB | 100 Mbps |
| 1000 – 2000 | 8 核 | 8 GB | 50 GB | 200 Mbps |
| 2000 以上 | 16 核以上 | 16 GB 以上 | 100 GB 以上 | 500 Mbps 以上 |
和 2RTK Server 装同一台机器要注意:两者 Web 端口默认都是 5757。
如果要在一台机器上同时跑基站服务和 Caster,先改掉其中一个的 [web] port,否则第二个起不来。
三种装法,挑一种
安装前先做这一步:回到云厂商后台,把 2101 和 5757 两个端口放行。
在控制台找到这台服务器的安全组(也叫防火墙、防火墙规则),添加入方向规则:
2101/tcp— NTRIP 服务端口。基站往这里推流、流动站从这里拉流,不放行整条链路都连不上。5757/tcp— Web 管理端口。不放行浏览器打不开后台。80/443— 可选。要用域名访问后台时再加。
系统自带的 UFW/firewalld 脚本会帮你放行,但云厂商的安全组在脚本管不到的地方,必须你在控制台手动开。 这一步漏掉,后面装得再顺也会一直连不上。
方式 A:一键脚本(推荐)
Debian 11+ / Ubuntu 22.04+ 上跑,脚本会自动装依赖、建目录、配 systemd、开防火墙、加 Nginx 反代。
git clone https://gitcode.com/rampump/NTRIPcaster.git && cd NTRIPcaster && sudo bash install.sh
git clone https://github.com/Rampump/NTRIPcaster.git && cd NTRIPcaster && sudo bash install.sh
脚本干的事:装 python3-venv / nginx / git → 源码放到 /opt/2rtk →
配置放 /etc/2rtk/config.ini → 日志放 /var/log/2rtk → 注册 systemd 服务 2rtk 并设开机自启 →
UFW/firewalld 放行 2101/5757 → 写一份 Nginx 配置把 80 端口反代到 5757。
权限说明:普通用户用 sudo bash install.sh;如果本来就是 root 登录(提示符是 #),直接
bash install.sh,不用加 sudo。
方式 B:Docker
不想动系统环境,一条命令起来。国内用腾讯云镜像(不用登录):
# 国内(腾讯云镜像,免登录) docker run -d --name ntrip-caster -p 2101:2101 -p 5757:5757 \ ccr.ccs.tencentyun.com/2rtk/ntripcaster:latest # 海外(Docker Hub) docker run -d --name ntrip-caster -p 2101:2101 -p 5757:5757 \ 2rtk/ntripcaster:latest
正式用建议把三个目录挂出来,数据库和配置就落在宿主机上,删容器不丢数据:
mkdir -p ./ntrip-data/{logs,data,config}
# 先把配置模板抠出来
docker run --rm ccr.ccs.tencentyun.com/2rtk/ntripcaster:latest \
cat /app/config.ini.example > ./ntrip-data/config/config.ini
docker run -d --name ntrip-caster \
-p 2101:2101 -p 5757:5757 \
-v $(pwd)/ntrip-data/logs:/app/logs \
-v $(pwd)/ntrip-data/data:/app/data \
-v $(pwd)/ntrip-data/config:/app/config \
ccr.ccs.tencentyun.com/2rtk/ntripcaster:latest
仓库里还有 docker-compose.yml(开发)和 docker-compose.prod.yml(生产)可以直接用。
方式 C:源码直接跑(不装服务)
只是想在本机或测试机上试一下,用这种方式最快。需要 Python 3.9+:
tar -xzf ntripcaster-full.tar.gz && cd ntripcaster
cp config.ini.example config.ini # 然后改掉里面的 admin 密码
python3 -m venv venv
source venv/bin/activate
python3 -m pip install -r requirements.txt
python3 main.py
Web 面板在 http://服务器IP:5757;首次启动会自动生成 data/.secret_key,不用手动填。
登录、改密码的事在下面第 1 步和第 3 步。
装完先验三下
sudo systemctl status 2rtk # 服务在跑没 sudo ss -tlnp | grep -E ':2101|:5757' # 两个端口有没有在听 curl -s http://localhost:5757/health # 期望 {"status":"ok","version":"2.3.4",...}
/health 不需要登录、也不查数据库,Docker 健康检查和监控探活都用它,接 Uptime Kuma 之类的直接填这个地址。
本文截图都取自英文界面。控制台内置中英双语,右上角 中文 / EN 一键切换,选项记在浏览器本地(localStorage),换页不掉。
下面所有截图都是 EN 模式,方便你对着全局用户的界面比对;切回「中文」功能完全一样,只是文案不同。
记住对应关系就够用:Overview = 总览,Mount Points = 挂载点,Users = 用户,Live Data = 实时数据,Settings = 设置。
第 1 步:登录
装完打开 http://服务器IP:5757,落在管理员登录页。默认账号 admin / admin123,
登录框底下那行灰字就是告诉你这件事的——所以第一件事永远是改密码,见第 3 步。
账号或密码不对,标题下方会顶出一条红条「用户名或密码错误」;密码框只显示圆点,不会回显。
连错会被锁。同一 IP + 用户名连续失败 5 次锁 300 秒([security] 段可调)。
被锁时别反复点登录,等 5 分钟,或者直接上服务器本地改。
忘记管理员密码只能改库或重置配置,所以第 3 步别跳过。
第 2 步:看懂总览
登录后直接进总览,这一页是你以后最常看的地方——挂没挂、有没有人在拉、流还活着没,都在这里。
四个指标卡和左边那列运行状态,各是什么含义:
| 指标 | 含义 | 怎么用它判断 |
|---|---|---|
| 运行时长 | 进程启动到现在 | 数字比你以为的小 → 服务重启过,去查日志 |
| 在线挂载点 | 此刻有源在推的挂载点数 | 建了 3 个只显示 1,说明有 2 路基站掉线了 |
| 在线用户 | 正在拉流的客户端连接数 | 流动站说连不上时先看这里是不是 0 |
| 数据传输 | 启动以来累计下发的字节数 | 不涨 = 没人在拉,或拉的都断了 |
| CPU / 内存 | 本进程占用 | 2000 并发下也只有一两核、几百 MB,不是瓶颈 |
| 网络 ↑ ↓ | 实时上行 / 下行速率 | ↑ 是基站推上来的,↓ 是发给流动站的 |
| 活动连接 | 当前 NTRIP 会话数 | 推流 + 拉流都算;和在线挂载点数对不上是正常的 |
| 最大并发 | 配置的上限 | 默认 5000,个人用基本碰不到 |
| 累计连接 | 启动以来建立过的会话总数 | 客户端反复重连会让它涨得很快 |
| 已拒绝 | 鉴权失败 / 超限被拒的次数 | 正常应该一直是 0,涨了就是有人在撞密码或配置错 |
下面的「在线 RTK 基准站」是唯一能看到单路基站实时速率的地方,一行一个挂载点:
| 字段 | 含义 |
|---|---|
| 挂载点名称 | 例如 2RTK,就是客户端要填的那个名字 |
| 人数图标 | 当前有几个客户端在拉这路流 |
| 数据包 | 累计收到的 RTCM 帧数,只要在涨就说明流是活的 |
| 已传输 | 这路流累计转发了多少字节 |
| 速率 | 实时码率。四系统 MSM4 大约 2~3 KB/s,MSM7 会翻几倍 |
| 在线时长 | 本次推流持续了多久;数字一直很小说明基站在反复断连 |
| online | 有源在推才是 online,否则这行根本不会出现 |
最底下是系统日志,连接建立、鉴权失败、挂载点增删都会实时推到这里,排错先看它。
第 3 步:改管理员密码
点顶部「设置」,这一页只有两块内容:改密码、重启程序。
其余配置项都不在界面里,要改 config.ini。改完必须重启——页面上的「重启程序」按钮就是干这个的,
也可以走 systemd。重启会重载配置,并中断所有 NTRIP 会话几秒,流动站会自动重连,但别在测绘作业中途点。
| 装法 | 配置文件 | 数据库 |
|---|---|---|
| 一键脚本 | /etc/2rtk/config.ini | /opt/2rtk/data/2rtk.db |
| Docker | /app/config/config.ini | /app/data/2rtk.db |
| 源码 | 项目根目录 config.ini | 2rtk.db |
真正需要动的配置项就这么几个,其余保持默认:
- [ntrip] port
- 2101 NTRIP 服务端口,改完记得放行新端口
- [web] port
- 5757 Web 管理端口,和 2RTK Server 冲突时改这里
- [database] path
- 2rtk.db 容器内写
/app/data/2rtk.db并挂卷 - [admin] password
- admin123 首次启动创建的管理员口令
- [caster] lat / lon
- 源表的兜底位置,流里没有 1005/1006 时才会用到
- [security] 登录限流
- 5 同一 IP+用户名连错 5 次锁 300 秒
另外两处也顺手确认一下:debug_mode 生产环境应为 false(开调试会把内部信息和堆栈吐到页面上);
secret_key 留空时程序会自动生成随机值写到 data/.secret_key,不要填成示例值。
环境变量优先级高于配置文件,排查「改了没生效」时先看 systemd unit 里有没有 Environment= 覆盖。
第 4 步:建用户
用户是给客户端用的账号。一个客户一个账号,出问题能单独停掉,也方便看是谁在拉。 点「用户」进用户管理,右上角「添加用户」:
-
命名规则卡得比较死,输错了会直接弹红条告诉你哪一条不满足:
| 字段 | 规则 |
|---|---|
| 用户名 | 2 – 50 字符,只允许字母、数字、下划线、中横线 |
| 密码 | 6 – 100 字符,同样只允许字母、数字、下划线、中横线 |
| 保留名 | 不能和管理员同名(admin),否则改密码会改到管理员身上 |
密码只允许这几类字符,看着别扭,但换来的是不会因为特殊符号在客户端 XML / 命令行里被转义出错。
强度靠长度补:Base01_2026 这种比 a!B2# 好用得多。
密码存的是 PBKDF2 哈希。管理界面只能重设,看不到原值——忘了就让用户改密码,别指望能「查回来」。
第 5 步:建挂载点
挂载点(mountpoint)就是「一路流」的名字,基站往上推、流动站往下拉,都靠这个名字对上。
| 列 | 说明 |
|---|---|
| 挂载点 | 名字,2 – 50 字符,字母 / 数字 / 下划线 / 中横线 |
| 状态 | 在线 = 此刻有源在推;离线 = 建好了但没数据进来 |
| 连接数 | 有几个客户端在拉这路流 |
| 所属用户 | 绑定的账号,没绑就是「未指定」 |
| 描述 | 预留列,目前恒为 -,源表里的描述来自基站电文 |
| 操作 | 编辑(改名 / 改密码 / 改绑定)、删除 |
添加挂载点
右上角「添加挂载点」,三个字段:
- 挂载点名称
- 2 – 50 字符,字母 / 数字 / 下划线 / 中横线,例如 BASE01
- 挂载点密码
- 6 – 100 字符,NTRIP 1.0 推流和拉流都拿它认证
- 绑定用户
- 可选。绑了之后 NTRIP 2.0 只允许这个账号推这个点
建好之后还能改。「编辑」弹窗和添加不一样的地方在于:密码留空表示不改,绑定用户是手填用户名而不是下拉,留空就是解除绑定。
绑定的作用范围不一样,这点容易踩坑:推流(SOURCE)方向,只要挂载点绑了用户,NTRIP 2.0 就一定校验绑定关系;
拉流方向默认只校验账号密码,任何有效用户都能拉全部挂载点,想收紧得把 [ntrip] download_enforce_user_binding 设成 true。
第 6 步:让基站把流推上来
Caster 起来只是空壳,挂载点要有源推进来才会变成「在线」。推流走 NTRIP 的 SOURCE 请求,两种认证方式:
| NTRIP 版本 | 请求行 | 用哪个凭据 |
|---|---|---|
| 1.0(默认) | SOURCE <挂载点密码> /<挂载点> | 挂载点密码 |
| 2.0 | SOURCE /<挂载点> HTTP/1.1 + Basic | 用户名 + 用户密码 |
基站侧用 2RTK Server 的话,在 /config 里勾上「上传到上游 Caster」,
填这四项保存即可:
- Caster 地址
- 你的服务器 IP 或域名
caster_host - 端口
- 2101
caster_port - 挂载点
- BASE01,和网页上建的完全一致
caster_mountpoint - 密码
- 该挂载点的密码(NTRIP 2.0 则填用户账号密码)
caster_password
手边没有基站,想先验证链路,可以用 RTKLIB 把一路现成的公共流中继过来:
# 从公共源拉一路,转推到自己的 Caster
str2str -in "ntrip://user:pass@rtk2go.com:2101/SOME_MOUNT" \
-out "ntrips://:挂载点密码@caster.example.com:2101/BASE01"
推上去后回总览看两处:挂载点列表里状态变成绿色「在线」,以及「在线 RTK 基准站」里多出一行, 数据包那个数字一直在涨,就说明流真的通了。
挂载点必须先建。Caster 不会因为收到一路新流就自动创建挂载点,名字对不上直接拒绝。 日志里出现「挂载点不存在」就是这个问题,不是密码错。
第 7 步:查看挂载点信息
点顶部「实时数据」,这里是给已经在推的站点做体检的地方。上面的 STR 数据表列出所有在线挂载点, 每一行左边是站点按钮,右边是它当前的源表原文:
点站点按钮后,右边「基准站信息」会实时解析这路流里的 RTCM 电文,把下面这些一项项填出来:
| 字段 | 来自哪条电文 |
|---|---|
| 站点编号、国家、城市、接收机 / 固件 / 天线 | 1005 / 1006(天线描述)与 1033(接收机与天线描述) |
| 经度 / 纬度 / 高程 | 1005 / 1006 的 ECEF 坐标反算并换算高程 |
| ECEF X / Y / Z | 同上,原始值直接给出来,方便和基站端比对 |
再往下是位置图和卫星状态,用来快速判断「这站的数据到底好不好」:
解析要等一会儿,而且一次只解析一个站。点下去先显示「正在解析…」,十几秒到几十秒后才出坐标和卫星; 换一个站会接管解析,前一个自动停。别在作业时间反复点,它会占用一点服务端资源。
源表原文长什么样
想不打开网页就确认客户端会看到什么,直接对 2101 端口发一个请求,它会把整个源表吐回来:
curl -s http://你的域名:2101/ | iconv -f utf-8
SOURCETABLE 200 OK
Server: NTRIP 2RTK caster 2.3.4
Ntrip-Version: Ntrip/1.0
Content-Type: text/plain
CAS;2rtk;2101;2RTK Ntrip Caster;2rtk;0;CHN;25.20341154;110.277492;0.0.0.0;0;https://2rtk.com
NET;2rtk;2rtk;B;CHN;https://2rtk.com;https://2rtk.com;i@jia.by;none
STR;2RTK;Sarlat-la-Canéda;RTCM3.x;
1004(3),1012(2),1077(2),1087(2),1097(2),1107(2),1127(2),1045(3),1046(3),1019(1),
1005(1),1008(1),1033(1),1020(1),1006(1),1230(1),1042(2);
B1I+B2I+B3I+E1+E5a+E5b+G1+G2+G3+L1+L2+L5+LEX;BDS+GAL+GLO+GPS+QZSS+SBAS;
2rtk;FRA;44.8975;1.2167;0;0;2RTK_NtirpCaster;N;B;N;19945;YES
ENDSOURCETABLE
实际返回里 STR 是一整行,上面为了看得清才按字段折开;用 curl 拿到的是连续的一行。
三行分别是 CAS(Caster 自身)、NET(运营者信息)、STR(每个在线挂载点一行)。
STR 中间的格式串、载波、星座列表,就是上面那张 STR 表里展示的内容;
末尾的 19945 是码率(bps),和你总览里看到的 2 KB/s 左右对得上。
源表是自动补的,不用手写:挂载点建好、基站把 RTCM 推上来之后,服务端用 pyrtcm 解析流里的电文,
自动读出坐标、国家、城市和电文类型,再回填进 STR 行。流里没有 1005 / 1006 时,
才会退回到 [caster] 里配的兜底经纬度——所以基站端一定要开这两条电文。
第 8 步:流动站怎么连
手簿 / App / 接收机里选 NTRIP,填这几项:
- Caster 地址
- caster.example.com
- 端口
- 2101
- 挂载点
- BASE01
- 用户名 / 密码
- 网页上建的用户账号(NTRIP 2.0)
- NTRIP 版本
- 优先选 2.0;老设备只有 1.0 时改用挂载点密码
认证方式跟版本绑死,选错了就会一直 401:
| 客户端支持的版本 | 要填什么 |
|---|---|
| NTRIP 2.0 | 用户名 + 用户密码(挂载点密码在这里不起作用) |
| NTRIP 1.0 / 0.9 | 挂载点密码,用户名随便填或留空 |
只支持 Basic,Digest 已经整个移除。早期版本留过 Digest 实现但从没真正校验过 nonce, 现在收到 Digest 请求会回 401 并只声明 Basic。如果你的客户端被设成 Digest 认证,会连不上,改成 Basic 或换 NTRIP 2.0。
连上后先收到 ICY 200 OK(1.0)或 HTTP/1.1 200 OK(2.0),紧接着就是一串二进制 RTCM。
能连但久久不出固定解,八成是电文不匹配——去实时数据点开这个站,
看 STR 行里的电文列表有没有你接收机需要的类型,再看卫星信噪比是不是整体偏低。
升级、备份与回滚
在源码目录里跑,不要在 /opt/2rtk 里跑。/opt/2rtk/update.sh 是安装时留下的一份旧拷贝,永远不自我更新。
cd ~/NTRIPcaster # 当初 clone 的目录 git pull # 先把 update.sh 自己更新到最新 sudo bash update.sh
update.sh 会自动判断你是一键脚本装的还是 Docker 装的,然后:
- 备份
config.ini和数据库; - 找到真正在跑的那个 systemd 服务(哪怕你改过单元名),
stop掉,25 秒还没停就SIGKILL; - 顺手杀掉手工
python main.py起的野进程,等 2101 / 5757 真的空出来; - 替换代码 → 起服务 → 健康检查;失败就用备份回滚。
Docker 部署同理:先 stop 再 rm -f 再 up -d --force-recreate。跳过删除这一步,就会出现
container name is already in use,或者旧容器继续占着 2101/5757。
sudo bash update.sh --force # 不比版本,直接更 sudo REPO_SOURCE=github bash update.sh # 源码模式走 GitHub sudo REPO_SOURCE=gitcode bash update.sh # 源码模式走 GitCode sudo REPO_SOURCE=tcr bash update.sh # Docker 模式走腾讯云镜像
源码目录删了也能救——临时拉一份新的再跑:
cd /tmp && rm -rf _2rtk_upd git clone --depth 1 https://gitcode.com/rampump/NTRIPcaster.git _2rtk_upd sudo bash _2rtk_upd/update.sh rm -rf /tmp/_2rtk_upd
备份只要两个文件
| 文件 | 内容 |
|---|---|
/etc/2rtk/config.ini | 端口、管理员口令、密钥、各类参数 |
/opt/2rtk/data/2rtk.db | 全部用户、挂载点、密码哈希 |
这两个拷走,换台机器重装一遍再放回去,账号和挂载点原样还在。日志不用备。
安全清单
- 改掉 admin 默认密码——文档里公开写着的口令,等于没有。
- 只开两个端口:2101 给 NTRIP,5757 给管理。SSH 别和面板一起暴露在 0.0.0.0。
- 管理端口不要裸奔公网:用 Nginx 反代到 443 加 HTTPS,再套一层 Basic 认证或限制来源 IP。
- 一个客户一个账号:停服务时只停一个人,不用改全局密码。
- 收紧拉流范围:多客户多基站时,把
download_enforce_user_binding打开,只允许拉自己绑定的点。 - 登录限流保持默认:5 次失败锁 300 秒,别为了省事关掉。
- 盯住
/health:定时 curl 一下,非 200 就告警。
套了反向代理记得改两个开关:[security] trust_proxy_headers = true 才会信任
X-Forwarded-For(否则日志里全是 127.0.0.1);上了 HTTPS 再开 session_cookie_secure = true。
另外 [websocket] cors_allowed_origins 跨域时写死白名单,不要用 *。
排错对照表
| 现象 | 最可能的原因 | 处理 |
|---|---|---|
| 安装脚本直接退出 | 系统版本低于 Debian 11 / Ubuntu 22.04 | 换系统,Python 3.9 是硬要求 |
systemctl status 2rtk 一直 restart | 依赖没装进 venv | journalctl -u 2rtk -n 50 看报错,再 /opt/2rtk/venv/bin/pip install -r requirements.txt |
| 5757 打不开 | 只在本机监听 / 安全组没开 / Nginx 没起 | 先 ss -tlnp | grep :5757 确认监听,再查安全组 |
| 2101 连不上 | 云厂商安全组没放行 | 控制台单独加 2101/tcp,ufw 只是本机一层 |
Address already in use | 旧进程或另一个服务占了端口 | sudo fuser -k 2101/tcp,或改 [ntrip] port |
| 两个面板只能开一个 | 2RTK Server 和 Caster 都用了 5757 | 改其中一个的 [web] port |
| 基站推流被拒 | 挂载点没建 / 名字大小写不一致 / 密码错 | 看日志的拒绝原因,挂载点要先在网页上建好 |
| 流动站 401 | 客户端选了 Digest / 用户名密码填了挂载点密码 | 改 Basic 或切 NTRIP 2.0,账号用网页建的用户 |
| 能连上但收不到数据 | 该挂载点没有源在线 | 首页看 Mount Point Details 是否 online |
| 源表里位置是错的 | 流里没有 1005/1006,用了模板默认经纬度 | 基站端打开 1005/1006 输出,或改 [caster] 经纬度 |
| 升级后起不来 | 旧实例还占着端口 | 用 update.sh 升,别手动 git pull 后只 restart |
| Docker 报 name already in use | 同名容器还在 | docker rm -f ntrip-caster 再 run |
| 时间戳乱、解算异常 | 服务器时间漂移 | 开 systemd-timesyncd 或 chrony 校时 |