汇率说明:本文出现的金额均以人民币计价。涉及外币的原始报价已按 2026 年 10 月固定基准 1 USD ≈ 6.71 元、1 EUR ≈ 7.88 元 换算。文中硬件报价为 2026 年 10 月公开渠道采集的成交价区间,用于量级判断,不构成采购依据。


"数据不能出厂区"这七个字,几乎是工业物联网项目招标文件里的标配。

它通常出现在技术规格书的第三条,措辞简短,没有附加说明。然后项目中标,集成商买一台工控机,装上私有化版本的物联网平台,验收通过,事情看上去就结束了。

问题在于,这七个字只描述了数据存放在哪里,没有描述数据在厂区里怎么流动。你把一个跑着七个容器的平台搬进车间网络之后,MQTT 是不是明文、对象存储的控制台谁都能开、历史数据一年能长到多大,这些问题不会因为"不出厂区"自动消失。恰恰相反——数据越集中,内部暴露面越大。

本文按实际部署顺序,把 ThinkLink Edge(TKE)从选型到验收的中间环节拆开讲。重点不是复述安装命令,而是那些装完之后才被发现、但本该在买机器之前就想清楚的事。


一、先别急着买机器:三个问题决定你要不要 TKE

ThinkLink 有三种部署形态,官方定位分别是公有云 SaaS(Cloud)、本地服务器自建(TKE / ThinkLink Edge)、网关内置(TKG)。三者共用同一套物模型、RPC 和触发逻辑,可以相互迁移——这是选型能后置的技术前提。

维度 Cloud TKE(Edge) TKG(网关内置)
部署位置 公有云 SaaS 本地服务器 / 工控机,自建 门思网关内部(如 GDO51 / GDI51)
设备接入上限 1000 个(永久免费) 1000 个 100 个
数据处理密度 约 10 万条/天 无上限 约 1 万条/天
参考硬件 无需自备 8 核 / 8 GB / 64 GB 存储 集成在网关内(GDI51 内置 32 GB eMMC)
联网要求 依赖公网 本地部署,可离线运行 本地运行,不依赖公网
适用场景 快速体验、小规模起步 数据本地化、中大型企业、私有网络 小型私有化、存量改造、无额外服务器

三个必须先问的问题:

第一,你真的需要 TKE 吗? 如果设备数在 100 台以内、日数据量在 1 万条以下,TKG 直接把 NS 嵌进网关,不需要额外服务器,也不需要单独的服务器采购流程。很多"数据不出厂区"的要求,本质是不想让生产数据走公网出口,TKG 同样满足,成本结构完全不同。

第二,1 万条/天和 10 万条/天,你的项目落在哪边? 这条线决定了选 TKG 还是 TKE。按 1000 台设备、每台 10 分钟一条上行算,是 14.4 万条/天,已经超过 Cloud 的参考密度、远超 TKG 上限,只能走 TKE。但如果只有 50 台表计、每小时一条,一天 1200 条,TKG 绰绰有余。

第三,这台机器以后归谁管? TKE 是一条独立的运维线:操作系统补丁、Docker 引擎、七个容器、证书到期、数据备份。如果甲方 IT 部门没有明确接手,它就是一台无人负责的服务器,通常会在第二年被发现时已经磁盘写满。

回答完这三个问题,再进选型环节。


二、硬件选型:x64 是一条硬约束,不是建议

官方文档对 TKE 的硬件要求存在两个描述口径,需要先说清楚,因为它们给出的结论不一样。

口径 A(知识库产品对比表):参考硬件 8 核 CPU / 8 GB 内存 / 64 GB 存储,最低 2 核 2 GB,架构标注 ARM64 / x64。

口径 B(Docker 部署手册,2026-09-11 更新,TLS 章节 2026-10-22 更新):

项目 要求
权限 root(安装命令使用 sudo)
CPU 架构 仅 x64(x86_64 / amd64),至少 2 核
内存 至少 4 GiB
磁盘 /opt 所在文件系统至少 20 GiB 可用空间
网络 在线安装需 HTTPS 访问 package.think-link.net;离线目标机不需要公网
明确不支持 ARM、ARM64、32 位 x86

两个口径在三个点上不一致:内存 2 GB 还是 4 GB、存储 64 GB 还是 20 GB、以及最关键的——ARM 到底能不能跑。

选型时以口径 B 为准,理由有三条:

  1. 口径 B 出自部署手册本身,是安装器实际执行检查的依据,不满足会直接终止;口径 A 是产品对比表里的概括性描述。
  2. 口径 B 的约束更严。7 个容器(EMQX、NS 桥接、PostgreSQL、Redis、ThinkLink、ThinkOne、MinIO)同时常驻,2 GB 内存在这个规模下没有余量。
  3. 口径 B 明确列出了"不支持 ARM、ARM64 或 32 位 x86",并单独说明该限制对在线一键安装和脚本化离线安装同样适用。这类措辞通常来自实测,不是保守表述。

这条约束在信创项目里会直接撞墙。 国产 CPU 分两条路线:

路线 代表型号 与 TKE 的关系
x86 路线 兆芯 KX-6000/KX-7000、海光 3000/5000 系列 架构兼容,可部署
ARM 路线 飞腾 FT-2000/4、腾锐 D2000、鲲鹏 920、瑞芯微 RK3568/RK3588 架构不兼容,装不上

如果项目的国产化要求落在 ARM 路线,TKE 这条路在选型阶段就该排除,而不是等机器到货才发现 uname -m 输出的是 aarch64。反过来,x86 路线的国产 CPU 可以直接用——比如海光 3350(8 核 16 线程 3.0 GHz),它本身就是 x86_64。

2026 年 10 月公开渠道的实际报价区间:

配置 用途 公开报价
上架式 4U,I5-6500U / 8 GB / 1 TB 验证环境(2 核 8 GB,卡在最低要求边��) 约 3,200 元
工控机,海光 3350(8 核 16 线程)/ 16 GB / 1 TB SSD 生产环境推荐 约 10,400–11,400 元
同配置 + 国产操作系统授权 信创场景 约 13,100 元

第一个档次只适合 POC。I5-6500U 是双核四线程,刚好等于"至少 2 核"的下限,一旦设备量上来或者开了多个客户连接,CPU 会先于磁盘成为瓶颈。


三、磁盘这笔账:20 GiB 只够起步

/opt 至少 20 GiB 是安装器的准入线,不是容量规划的结果。真正的占用来自三块:

七个容器镜像:离线包 2026-09-11 验收的 2.00.062 版本约 2.45 GB,包含应用归档、Compose 文件和 7 个镜像归档共 9 个文件。后续版本大小会变。

数据库增长:这是长期项。按 1000 台设备、每 10 分钟一条上行计算,每天 14.4 万条;每条记录含索引按 1 KB 量级估算,约 144 MB/天,一年约 52 GB。再算上 PostgreSQL 的 WAL 日志、索引膨胀和历史查询开销,实际占用按 2–3 倍预留是常规做法。

MinIO 对象存储:报表文件、图片等存在 Docker 命名卷 minio_data 里。这一项波动很大,取决于业务是否生成报表、生成频率多少。

三块加总,20 GiB 只够几个月。生产环境建议直接上 1 TB SSD,价格区间在上表里,差价相对总项目金额可以忽略,但换来的是不用在第二年做在线扩容。

还有一个容易被忽略的点:对象文件保存在 Docker 命名卷中,日常备份必须覆盖该数据卷;仅备份 /opt 目录不能代替对象数据备份。 备份脚本里只写目录路径,报表文件是丢的。


四、端口规划:不出厂区不等于不出网

这是本文最想强调的一节。私有化部署解决的是数据不出厂区,但默认安装会在宿主机上开出一整套端口,其中相当一部分是明文协议。

先完成 HTTP 安装,再使用 tkl-tls 2.0.0 配置 HTTPS——这是官方推荐顺序。下表是宿主机入站端口清单:

端口 协议 用途 说明
80(或 8080) TCP ThinkLink 网页 / API(HTTP) 原始入口,80 被占用时可交互改用 8080;配置 TLS 后仍保留
443 TCP ThinkLink 网页 / API(HTTPS) tkl-tls 2.0.0 配置容器内 Nginx 后启用
1700 UDP LoRaWAN GWMP 网关接入 按网关接入需要放行
1883 TCP 设备 MQTT(明文) 按设备接入需要放行
8883 TCP 设备 MQTTS 默认未发布,需在 EMQX 单独配置并验证
8083 TCP MQTT over WebSocket 按客户端需要放行
8084 TCP MQTT over WSS 路径 /mqtt,需单独配置证书
18083 TCP EMQX 管理控制台(HTTP) 保留,不会自动改 HTTPS
18084 TCP EMQX 管理控制台(HTTPS) tkl-tls 2.0.0 配置后启用
9000 TCP MinIO S3 API 限制访问来源
9001 TCP MinIO 管理控制台 仅对管理员所在可信网络开放

几个必须提前知道的细节:

1. 端口冲突的处理方式不一致。 80 端口被占用时,安装器会交互式询问是否改用 8080,不会动占用端口的原服务;但 9000 或 9001 已被占用时,安装器直接停止,不会自动选择替代端口。如果目标机上已经跑了别的存储服务,这一步会在安装中途卡住。

2. 5432 和 6379 不需要对外开放。 PostgreSQL 和 Redis 的端口仅供容器内部使用。

3. 管理 HTTPS 不等于设备 MQTTS。 tkl-tls 配置出的是 443 和 18084;设备侧的 8883 / 8084 默认未发布,需要通过 EMQX Web 单独上传证书、开放映射、验证连通。在管理界面上换证不会自动替换设备监听器证书,这是两个独立配置。

4. 放行端口不等于已经启用 TLS。 官方文档这句提醒值得抄进验收单:防火墙开了 443 和证书真的生效是两件事。

5. EMQX 控制台的 18083 是 HTTP 入口,不会自动改为 HTTPS。 新的是 18084,老的入口保留。如果只对着 18083 做访问限制而忘了 18084,等于没做。


五、私有化部署 ≠ 满足合规

这是"数据不出厂区"最容易产生的误解。

工厂把平台搬进厂区,解决的是存储位置问题。但数据从传感器到平台的这段路,仍然是网络传输,仍然受传输环节的安全要求约束。

《工业和信息化领域数据安全管理办法(试行)》(工信部网安〔2022〕166 号,2022 年 12 月 8 日印发,2023 年 1 月 1 日施行)把工信领域数据分为一般数据、重要数据、核心数据三级,并在第十七条明确:

工业和信息化领域数据处理者应当根据传输的数据类型、级别和应用场景,制定安全策略并采取保护措施。传输重要数据和核心数据的,应当采取校验技术、密码技术、安全传输通道或者安全传输协议等措施。

对照上一节的端口表看:默认安装下,设备 MQTT 走 1883 明文,HTTP 走 80 明文,MinIO S3 API 走 9000。如果这套系统承载的数据被识别为重要数据,仅完成私有化部署并不满足第十七条的要求,还需要把传输通道补上——也就是配置 TLS,让网页/API 走 443、设备 MQTT 走 8883。

《网络数据安全管理条例》(国务院令第 790 号,2024 年 9 月 24 日公布,2025 年 1 月 1 日施行,共 9 章 64 条)则从更上层确立了分类分级保护制度,并设专章规定重要数据。

同一份 166 号文还有两条会落到具体操作上:

三条合起来,构成了一条完整的逻辑链:本地部署是第一步,TLS 是第二步,备份与日志留存是第三步。只做第一步就宣称满足数据不出厂区要求,在等保测评或者甲方内部审计环节会出问题。


六、两条安装路径:在线一键与脚本化离线

在线一键安装

能联网的服务器直接执行官方脚本,无需参数:

curl --tlsv1.2 --tls-max 1.2 -fsSL https://package.think-link.net/install.sh | sudo bash

安装器依次完成:检测操作系统、CPU、内存、磁盘和端口 → 在支持的系统上安装 Docker(已有可用 Docker 则复用)→ 下载应用归档、Compose 文件和 7 个容器镜像归档共 9 个文件 → 安装到目标目录,加载镜像并启动 Compose → 检查 ThinkLink HTTP、MinIO 就绪状态及存储桶初始化 → 记录版本和访问信息。

MinIO 首次启动自动创建私有存储桶 thinklink。

脚本化离线安装

联网受限的现场走这条路,官方文档把它概括为"联网下载 → 搬运校验 → 离线安装"。

第一步,在联网机器上下载离线包。 注意下载模式必须从本地脚本文件执行,不能用 curl | bash,因为离线包需要携带同一份完整安装器:

curl --fail --silent --show-error --proto '=https' \ --tlsv1.2 --tls-max 1.2 --connect-timeout 10 --max-time 60 \ https://package.think-link.net/install.sh -o thinklink-install.sh

bash thinklink-install.sh --help bash thinklink-install.sh --download-only ./thinklink-offline

先跑 --help 确认输出里包含 --download-only、--verify-only、--offline 三个参数。目标目录必须尚不存在,父目录必须已存在,不要提前 mkdir。

交付目录内含 13 个受校验文件:

文件 说明
application.tar 应用归档
docker-compose.yml Compose 定义
tkl-emqx.tar / tkl-nsbrg.tar / tkl-postgres.tar EMQX、NS 桥接、PostgreSQL 镜像
tkl-redis.tar / tkl-thinklink.tar / tkl-thinkone.tar Redis、ThinkLink、ThinkOne 镜像
tkl-minio.tar MinIO 镜像
install.sh / install-offline.sh 安装器脚本
release.json 发布 ID、版本、通道、架构
SHA256SUMS 覆盖 9 个制品 + 2 个脚本 + 版本记录 + 说明文件
README.txt 包内说明

第二步,搬运并校验。 整个目录原样搬运,生成目录权限为 0700,搬运后仍应限制读取权限。到目标机进入包目录:

cd thinklink-offline bash install.sh --verify-only .

这个模式不需要 root、不需要 Docker、不发起网络请求。它校验文件完整性、清单路径和版本格式,全部通过才继续。SHA-256 用于核对转移完整性,不是发布方数字签名,不能独立证明来源——文档这句提醒很实在,供应链的信任还要靠交付渠道本身。

第三步,安装。 在包目录执行 sudo bash install-offline.sh,需要无人值守时加 --yes(只跳过最终确认提示,不绕过校验和端口检查)。

离线目标机必须预装 Docker Engine 和 Docker Compose V2,因为离线包不包含 Docker 和操作系统依赖。先自查:

uname -m sudo docker version sudo docker compose version

uname -m 应输出 x86_64。其他架构请停止安装。

离线安装的三条限制

  1. 仅用于全新安装,不提供自动升级或失败回滚。 检测到已有安装或残留数据时,安装器会保留现场让你排查,不会自动清理后重试。已有部署升级前需准备新制品、备份和对应版本的升级方案。
  2. 不混用不同下载批次。 服务端制品每日北京时间 00:00 检查上游并更新,跨批次混用会导致 OFFLINE_IMAGES_MISSING(Compose 与镜像不匹配)。
  3. 不支持跨进程断点续传。 失败后重新执行会重新下载整套 2.45 GB。地址过期或单文件下载失败时,脚本会用原下载会话刷新地址并重试一次。

七、与云端协同的那条红线

TKE 装好之后,很多项目会进入"云端和本地并存"的过渡期——老设备在云上,新设备在本地,两边都在跑。

官方文档对此有一条明确警告:

同一 LoRaWAN 设备档案不要同时在两个平台上启用。若 TKE 和云平台同时响应 Join 或 Confirm 消息,可能产生入网失败和下行冲突。切换平台时,应在不使用的平台禁用或删除对应设备档案。

这条不是性能建议,是功能性约束。OTAA 入网时 Join Request 被网关广播到所有已注册该 DevEUI 的 NS,两个 NS 都会回 Join Accept,终端只接受其中一个,但另一个 NS 会认为设备已入网并持有帧计数——后续下行就打到了错误的路径上。

过渡期的正确做法是:设备档案在哪个平台生效,就在另一个平台禁用或删除,不要靠"两边都开着看谁先响应"。


八、云 → 边迁移:Excel 导入导出的三个陷阱

ThinkLink 用 Excel 文件做批量数据的导入导出,支持六类模块:设备配置、LoRaWAN Profiles、物模型、RPC 命令、联动/触发模型、设备模板。云端和 TKE/TKG 的操作流程完全一致,区别只在于 TKE/TKG 的 admin 账号是本地独立账号,与云端 admin 无关。

标准流程:

  1. 在云端进入目标模块(如 LoRaWAN Profiles)
  2. 勾选需要同步的条目(不勾选则导出全部)
  3. 点 Export,下载生成的 Excel
  4. 对每个数据类型重复 2–3(物模型、RPC 命令等)
  5. 切到 TKE,进入对应模块
  6. 点 Import,选上一步的 Excel
  7. 确认导入结果无报错
  8. 导入公共模型必须用 admin 账号登录

三个陷阱:

陷阱一:DevEUI 全局唯一,跨组织迁移要先删后导。 同一 DevEUI 在同一平台内只能归属一个组织。想把组织 A 的设备档案迁到组织 B,必须先在 A 里删除,才能在 B 里导入;不删则导入直接失败。

数据类型 是否需先删 原因
LoRaWAN Profiles 是 DevEUI 全局唯一
物模型 / RPC 命令 / 设备模板 否 ID 相同则覆盖,不受唯一性约束

陷阱二:ID 相同则完全覆盖,且不可回滚。 导入逻辑是"ID 不存在则创建,ID 已存在则完全覆盖"。这不是合并,是替换。如果 Excel 里带着旧的字段值,导入后目标系统的对应配置就被旧数据顶掉了。

对应做法只有一条:导入前先做一次导出,把当前状态存成 Excel 备份。 首次大批量导入先用小批量试格式。

陷阱三:误覆盖后没有撤销键。 有备份就用备份重新导入恢复;没有备份只能手工重配。导入前逐行核对 Excel 里的 ID 列,确保只包含需要创建或更新的数据。


九、备份:三个层次不能互相替代

层次 位置 备份方式
配置与安装记录 /opt 下的安装目录 文件级备份
数据库 PostgreSQL 容器数据卷 卷级快照或逻辑导出
对象文件 Docker 命名卷 minio_data 卷级备份

仅备份 /opt 目录不能代替对象数据备份,文档里这句话单独成段是有原因的。容器重启会保留已有存储桶和对象,但宿主机磁盘故障不会。

166 号文第十五条要求"实施数据容灾备份和存储介质安全管理,定期开展数据恢复测试"。注意后半句——备份了没恢复测试过,等于没备份。可以在验收环节用一次报表生成和下载来跑通整条链路:

sudo docker compose -f exec -T minio /thinklink-minio check-ready

这条命令检查镜像内置初始化流程是否完成,配合容器状态检查一起用。


十、常见错误码速查

官方文档给了完整的错误码表,这里摘出部署阶段最常遇到的:

提示 含义与处理
OFFLINE_OUTPUT_EXISTS 下载目录已存在,换一个尚不存在的目录,不覆盖旧包
SCRIPT_FILE_REQUIRED 下载模式必须从本地脚本文件执行,不能用 curl \| bash
ARTIFACT_DOWNLOAD_FAILED 检查网络与磁盘空间,重新下载整套文件
DOWNLOAD_REFRESH_INVALID 刷新后的版本或制品发生变化,重新下载完整包
OFFLINE_BUNDLE_INVALID / OFFLINE_CHECKSUM_FAILED 重新传输完整目录,不修改校验清单绕过
OFFLINE_DOCKER_REQUIRED 补齐离线依赖,启动 Docker 并检查 Compose V2
OFFLINE_EXISTING_INSTALL 已有安装或数据,先制定备份和升级方案
PORT_IN_USE / ALTERNATE_PORT_IN_USE 检查端口占用,安排可用端口后重试
OFFLINE_IMAGES_MISSING Compose 与镜像不匹配,提供同版完整包
HEALTH_CHECK_FAILED 检查容器状态和日志,保留安装数据排查

日常排障两条:

sudo docker compose -f ps sudo docker compose -f logs <服务名>

对外分享日志前检查是否包含业务配置或凭据——这条提醒在文档里也单独提了,日志里通常有连接串和账号。


十一、验收清单

按上文的顺序,一份能对外交付的 TKE 部署应当逐项确认:

# 项目 判定
1 uname -m 输出 x86_64 架构非 x64 直接不成立
2 CPU ≥ 2 核、内存 ≥ 4 GiB、/opt ≥ 20 GiB 生产建议 8 核 / 16 GB / 1 TB
3 端口冲突预检:80/8080、9000、9001、1700、1883 9000/9001 冲突会终止安装
4 容器全部运行(7 个) docker compose ps
5 MinIO 私有桶就绪,匿名访问被拒绝 check-ready + 匿名访问验证
6 网页/API 走 HTTPS 443,EMQX 控制台走 18084 tkl-tls 2.0.0
7 设备 MQTT 走 8883(按需) 单独在 EMQX Web 配置并验证
8 MinIO 9000/9001 仅对可信网络开放 防火墙规则
9 云端与 TKE 未同时启用同一设备档案 设备档案清单核对
10 导入前已做导出备份 备份文件留档
11 备份范围覆盖 minio_data 卷 备份脚本核对
12 完成一次恢复测试 恢复演练记录
13 初始密码已修改(ThinkLink / EMQX / MinIO) 修改后同步更新业务客户端配置
14 完整离线包 + release.json + SHA256SUMS 留档 版本追溯

第 5 项的"匿名访问私有桶被拒绝"是官方 2026-09-11 验收记录里明确覆盖的一条,建议照搬到自己的验收单上——私有桶匿名可访问,等于把所有报表文件放到了内网共享目录。


十二、结语

"数据不出厂区"是一个关于存储位置的要求,但它会带来三个连锁后果:机器要自己买、传输通道要自己配、备份要自己做。这三件事里,只有第一件是采购问题。

本文反复强调的两条:

私有化部署不等于满足合规。 166 号文第十七条要求传输重要数据采取安全传输通道或安全传输协议。默认安装的 TKE 里,MQTT 走 1883 明文、HTTP 走 80 明文。tkl-tls 不是可选优化项,是补齐这条要求的必要动作。

x64 约束要在买机器之前确认。 官方文档自身对 TKE 的硬件描述存在两个口径,ARM 架构能不能跑的答案不一致。以部署手册为准的结论是:不能。信创项目如果已经定了飞腾或鲲鹏路线,这条要在方案阶段就提出来,而不是等 uname -m 输出 aarch64 时才发现。

TKE 的价值在于它把 NS、物模型、触发逻辑、告警和对象存储打包成一条 Compose 命令,同时保留了与云端、与网关内置形态之间的迁移路径。代价是这套东西从此有人要负责。买机器之前先问清楚归谁管,比选什么配置更重要。

下一期预告(第 24 期):数据已经留在本地了,下一步是让它被楼里的其他系统看懂——BACnet/IP 与 Modbus TCP 在 ThinkLink 上的对接实战,从字段映射到 YABE 调试。


参考来源