服务端教程

NTRIP Caster 搭建与使用

Caster 是整条链路的「中转站」:基站把 RTCM 推上来,流动站按挂载点把流拉下去,中间由它做鉴权、转发和源表公告。 这一页用我开源的 2RTK NTRIP Caster(Python,Web 管理,Apache-2.0)在 VPS 上从零搭起来, 建好账号和挂载点,最后用基站推流、流动站拉流验证一遍。

2RTK NTRIP Caster NTRIP 1.0 / 2.0 Python 3.9+ TCP 2101 + 5757

Caster 到底在干什么

NTRIP 协议里有三个角色,很容易记混:

Server(源)基站侧,主动推
占用 1 个上行连接
→
Caster(中枢)收 1 份,发 N 份
鉴权 + 源表
→
Client(流动站)主动拉
按挂载点选流

一个 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+
CPU2 核(x86_64 优先) ARM 也能跑,性能按比例折算
内存2 GB100 并发以下 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 GB5 GB10 Mbps
100 – 5002 核2 GB10 GB50 Mbps
500 – 10004 核4 GB20 GB100 Mbps
1000 – 20008 核8 GB50 GB200 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 反代。

shell · 国内服务器(GitCode)
git clone https://gitcode.com/rampump/NTRIPcaster.git && cd NTRIPcaster && sudo bash install.sh
shell · 海外服务器(GitHub)
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

不想动系统环境,一条命令起来。国内用腾讯云镜像(不用登录):

shell · 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

正式用建议把三个目录挂出来,数据库和配置就落在宿主机上,删容器不丢数据:

shell · 带持久化
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+:

shell · 源码运行
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 步。

装完先验三下

shell · 自检
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 步。 账号或密码不对,标题下方会顶出一条红条「用户名或密码错误」;密码框只显示圆点,不会回显。

2RTK NTRIP Caster 管理员登录页,底部提示默认账号 admin / admin123
登录页。右上角 中文 / EN 可切换界面语言,左下角是打赏入口

连错会被锁。同一 IP + 用户名连续失败 5 次锁 300 秒([security] 段可调)。 被锁时别反复点登录,等 5 分钟,或者直接上服务器本地改。 忘记管理员密码只能改库或重置配置,所以第 3 步别跳过。

第 2 步:看懂总览

登录后直接进总览,这一页是你以后最常看的地方——挂没挂、有没有人在拉、流还活着没,都在这里。

总览页:运行时长、在线挂载点、在线用户、数据传输四个指标卡,下面是运行状态、在线 RTK 基准站列表和系统日志
总览页。右上角「更新于 HH:MM:SS」说明数据是轮询刷新的,页面不用手动刷新

四个指标卡和左边那列运行状态,各是什么含义:

指标含义怎么用它判断
运行时长进程启动到现在数字比你以为的小 → 服务重启过,去查日志
在线挂载点此刻有源在推的挂载点数建了 3 个只显示 1,说明有 2 路基站掉线了
在线用户正在拉流的客户端连接数流动站说连不上时先看这里是不是 0
数据传输启动以来累计下发的字节数不涨 = 没人在拉,或拉的都断了
CPU / 内存本进程占用2000 并发下也只有一两核、几百 MB,不是瓶颈
网络 ↑ ↓实时上行 / 下行速率↑ 是基站推上来的,↓ 是发给流动站的
活动连接当前 NTRIP 会话数推流 + 拉流都算;和在线挂载点数对不上是正常的
最大并发配置的上限默认 5000,个人用基本碰不到
累计连接启动以来建立过的会话总数客户端反复重连会让它涨得很快
已拒绝鉴权失败 / 超限被拒的次数正常应该一直是 0,涨了就是有人在撞密码或配置错

下面的「在线 RTK 基准站」是唯一能看到单路基站实时速率的地方,一行一个挂载点:

字段含义
挂载点名称例如 2RTK,就是客户端要填的那个名字
人数图标当前有几个客户端在拉这路流
数据包累计收到的 RTCM 帧数,只要在涨就说明流是活的
已传输这路流累计转发了多少字节
速率实时码率。四系统 MSM4 大约 2~3 KB/s,MSM7 会翻几倍
在线时长本次推流持续了多久;数字一直很小说明基站在反复断连
online有源在推才是 online,否则这行根本不会出现

最底下是系统日志,连接建立、鉴权失败、挂载点增删都会实时推到这里,排错先看它。

第 3 步:改管理员密码

点顶部「设置」,这一页只有两块内容:改密码、重启程序。

系统设置页:安全卡片里是新密码、确认密码和修改按钮,右侧系统控制卡片里是重启程序按钮
设置页。新密码最少 6 个字符;改完当前登录不会掉线

其余配置项都不在界面里,要改 config.ini。改完必须重启——页面上的「重启程序」按钮就是干这个的, 也可以走 systemd。重启会重载配置,并中断所有 NTRIP 会话几秒,流动站会自动重连,但别在测绘作业中途点。

装法配置文件数据库
一键脚本/etc/2rtk/config.ini/opt/2rtk/data/2rtk.db
Docker/app/config/config.ini/app/data/2rtk.db
源码项目根目录 config.ini2rtk.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 步:建用户

用户是给客户端用的账号。一个客户一个账号,出问题能单独停掉,也方便看是谁在拉。 点「用户」进用户管理,右上角「添加用户」:

用户管理页:列表显示用户名、状态、连接数、连接时间和操作按钮
用户列表。状态只有在线 / 离线两种;「连接时间」是该用户本次接入的时刻,没连过显示 -
添加用户弹窗 Add User,填写用户名 rover01 和密码
添加用户只有两个字段,没有邮箱、没有配额,越简单越不出错

命名规则卡得比较死,输错了会直接弹红条告诉你哪一条不满足:

字段规则
用户名2 – 50 字符,只允许字母、数字、下划线、中横线
密码6 – 100 字符,同样只允许字母、数字、下划线、中横线
保留名不能和管理员同名(admin),否则改密码会改到管理员身上

密码只允许这几类字符,看着别扭,但换来的是不会因为特殊符号在客户端 XML / 命令行里被转义出错。 强度靠长度补:Base01_2026 这种比 a!B2# 好用得多。

密码存的是 PBKDF2 哈希。管理界面只能重设,看不到原值——忘了就让用户改密码,别指望能「查回来」。

第 5 步:建挂载点

挂载点(mountpoint)就是「一路流」的名字,基站往上推、流动站往下拉,都靠这个名字对上。

挂载点管理页:RTKGL、2RTK、RTKSC 三个挂载点,2RTK 为在线状态
挂载点列表。2RTK 有源在推所以是绿色「在线」,另外两个没有源就是灰的「离线」
列说明
挂载点名字,2 – 50 字符,字母 / 数字 / 下划线 / 中横线
状态在线 = 此刻有源在推;离线 = 建好了但没数据进来
连接数有几个客户端在拉这路流
所属用户绑定的账号,没绑就是「未指定」
描述预留列,目前恒为 -,源表里的描述来自基站电文
操作编辑(改名 / 改密码 / 改绑定)、删除

添加挂载点

右上角「添加挂载点」,三个字段:

添加挂载点弹窗 Add Mount Point:挂载点名称 MYBASE01、密码、绑定用户下拉选择 test
名称是给客户端填的,密码是 NTRIP 1.0 的凭据;绑定用户下拉里列的就是第 4 步建好的账号
挂载点名称
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.0SOURCE /<挂载点> HTTP/1.1 + Basic用户名 + 用户密码

基站侧用 2RTK Server 的话,在 /config 里勾上「上传到上游 Caster」, 填这四项保存即可:

Caster 地址
你的服务器 IP 或域名 caster_host
端口
2101 caster_port
挂载点
BASE01,和网页上建的完全一致 caster_mountpoint
密码
该挂载点的密码(NTRIP 2.0 则填用户账号密码)caster_password

手边没有基站,想先验证链路,可以用 RTKLIB 把一路现成的公共流中继过来:

shell · 中继测试
# 从公共源拉一路,转推到自己的 Caster
str2str -in  "ntrip://user:pass@rtk2go.com:2101/SOME_MOUNT" \
        -out "ntrips://:挂载点密码@caster.example.com:2101/BASE01"

推上去后回总览看两处:挂载点列表里状态变成绿色「在线」,以及「在线 RTK 基准站」里多出一行, 数据包那个数字一直在涨,就说明流真的通了。

挂载点必须先建。Caster 不会因为收到一路新流就自动创建挂载点,名字对不上直接拒绝。 日志里出现「挂载点不存在」就是这个问题,不是密码错。

第 7 步:查看挂载点信息

点顶部「实时数据」,这里是给已经在推的站点做体检的地方。上面的 STR 数据表列出所有在线挂载点, 每一行左边是站点按钮,右边是它当前的源表原文:

实时数据页的 STR 数据表,一行显示 2RTK 站点按钮和完整的 STR 源表内容
STR 数据表。按钮上的名字就是挂载点名,点它才开始解析;右边那串分号分隔的就是客户端看到的源表行

点站点按钮后,右边「基准站信息」会实时解析这路流里的 RTCM 电文,把下面这些一项项填出来:

基准站信息卡:挂载点、站点编号、国家、城市、接收机型号、固件、天线型号、天线序列号、经纬度高程和 ECEF 坐标
基准站信息。这些值全部来自流里的电文解析,不是从配置抄的——接收机型号、固件、天线型号对不上,说明基站端配置有问题
字段来自哪条电文
站点编号、国家、城市、接收机 / 固件 / 天线1005 / 1006(天线描述)与 1033(接收机与天线描述)
经度 / 纬度 / 高程1005 / 1006 的 ECEF 坐标反算并换算高程
ECEF X / Y / Z同上,原始值直接给出来,方便和基站端比对

再往下是位置图和卫星状态,用来快速判断「这站的数据到底好不好」:

基准站位置地图,站点图标和覆盖范围圈,右上角可切换高德地图和 OpenStreetMap
基准站位置。圆圈是示意覆盖范围;右上角可切「高德地图 / OpenStreetMap」,海外站点建议用 OSM
卫星数据可视化:GPS 与 GLONASS 各卫星的信噪比柱状图,绿色为强信号、黄色为偏弱
卫星数据可视化。柱子是各卫星的信噪比,PRN 号在下面;某个星座整排偏黄偏低,就去看基站那边的天线和遮挡

解析要等一会儿,而且一次只解析一个站。点下去先显示「正在解析…」,十几秒到几十秒后才出坐标和卫星; 换一个站会接管解析,前一个自动停。别在作业时间反复点,它会占用一点服务端资源。

源表原文长什么样

想不打开网页就确认客户端会看到什么,直接对 2101 端口发一个请求,它会把整个源表吐回来:

shell · 读源表
curl -s http://你的域名:2101/ | iconv -f utf-8
SOURCETABLE 的实际返回(未在线挂载点不会出现)
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 是安装时留下的一份旧拷贝,永远不自我更新。

shell · 升级
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。

shell · 强制更新 / 指定源
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 模式走腾讯云镜像

源码目录删了也能救——临时拉一份新的再跑:

shell · 没有源码目录
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依赖没装进 venvjournalctl -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 校时
Next

基站侧还没弄好?

Caster 只是中转,流从哪来要看基站。用 Armbian 盒子 + RTK 模块在家搭一台,或者先拿本站测试服务器验证流动站配置。

→ RTK 基站搭建 · → 免费 NTRIP Caster 测试服务器