feat: 开源项目门户站首版(iotLCM / 秀杰 DTU / XiuAdmin 三项目,注册表驱动)

This commit is contained in:
技小云
2026-11-04 11:08:47 +08:00
committed by MiFaZhan
commit fe63dacae2
27 changed files with 3786 additions and 0 deletions
+111
View File
@@ -0,0 +1,111 @@
---
title: 部署与运维
description: 生产部署前的必改项、可选组件、离线部署与常见问题
outline: deep
---
# 部署与运维
## 一键启动
```bash
git clone https://gitee.com/snowgoat/iotlcm.git
cd iotlcm/deploy
docker compose up -d
```
部署编排与数据库初始化脚本都在仓库的 `deploy/` 目录:
```text
deploy/
├── docker-compose.yml # 服务编排(含默认口令与端口)
├── compose.memlimit.yml # 容器内存上限(按机器规格叠加使用)
├── config/ # 各服务配置 + gateway / nginx 两种入口配置
├── schema/init.sql # MySQL 初始化(95 表 + 种子数据)
├── tdengine-init/ # 时序库建库建表(首次启动自动执行)
└── data/ # 运行数据,首次启动自动创建
```
## 可选组件
```bash
docker compose --profile with-mock up -d # 运营商接口挡板
docker compose --profile with-bot up -d # 飞书通知(运维自用)
docker compose --profile with-nginx up -d # 自带反向代理(多域名入口)
docker compose --profile with-gateway up -d # 单端口入口(默认对外 5051)
```
多个 profile 可组合。
### 单端口入口(with-gateway)
只暴露一个端口时用它。容器内监听 80,宿主机端口由 `GATEWAY_PORT` 控制(默认 5051):
```bash
docker compose --profile with-gateway up -d
# 或换端口
GATEWAY_PORT=8088 docker compose --profile with-gateway up -d
```
| 路径 | 去向 |
| --- | --- |
| `/` | 管理端(admin-ui,内部已代理 `/api/` 到 admin-svr) |
| `/docs/` | 文档站 |
| `/openapi/` | 对外 API |
| `/route/open/` | 运营商能力代理(白名单 / 共享 Token) |
配置见 `config/gateway/nginx.conf`。小程序 / H5 端的静态资源是根路径部署的,不能挂在同一域名的子路径下,需要单独域名或端口(见 `with-nginx` 的 app 段)。
`with-bot` 是把全量同步等运维事件推送到飞书群的**内部运维工具**,不是平台功能。它需要你自己的飞书自建应用凭证(`config/bot/config.yaml` 的 `appId` / `appSecret` / `chatId`),没填就不启动。
**默认不启动,也不影响平台功能**;不需要飞书通知就完全不用管它。
## 线上暴露到公网
80 / 443 入站在多数办公宽带上被运营商封禁,可评估三种形态:
| 形态 | 适用 | 代价 |
| --- | --- | --- |
| 高位端口 NAT | 内部验收、演示 | 地址带端口,不适合对外正式发布 |
| 独立子域 + 反代 | 有公网 IP 的服务器 | 需要域名解析与证书 |
| 云主机统一入口 | 正式对外发布 | 需要域名(以及国内服务器的备案) |
## 上线前必改
| 项 | 说明 |
| --- | --- |
| 数据库口令 | MySQL 的 root 与应用账号口令 |
| Redis 口令 | 缓存层口令 |
| RabbitMQ 口令 | 队列层口令 |
| admin 口令 | 种子账号初始口令统一重置过,必须改 |
| JWT 密钥 | 管理端与用户端签发令牌用 |
| 运营商通道凭据 | 通道配置的 appKey / appSecret / 账号,按运营商要求申请 |
| 对象存储 | 图片与附件的存放位置 |
## 离线部署
目标机器不能出网时:
1. 在有网机器上拉全部镜像并导出:
```bash
docker compose pull
docker save -o iotlcm-images.tar $(docker compose config --images)
```
2. 拷贝 `iotlcm-images.tar` 与仓库的 `deploy/` 目录到目标机器;
3. `docker load -i iotlcm-images.tar` 后再 `docker compose up -d`。
## 常见问题
| 现象 | 原因与处置 |
| --- | --- |
| MySQL 初始化中途失败 | schema 只在数据卷为空时执行,改完脚本必须清空卷才会重跑:`docker compose down && sudo rm -rf ./data/mysql && docker compose up -d` |
| 访问 8019 端口白屏 | 文档站必须带 `/docs/` 路径,裸端口会白屏 |
| 偶发 502 | 容器重建后 upstream IP 变化,nginx 未重新解析;配置已带 `resolver` + `resolve`,若仍出现,重启网关容器即可 |
| 通道调用报 IP 鉴权失败 | 运营商侧需要报备出口 IP,未报备则拒绝调用 |
| 端口被占用 | 编排里业务端口默认绑 `127.0.0.1`,改端口映射即可避开冲突 |
## 监控
Consul 提供服务注册与健康探针,Prometheus 指标入口在编排内已开。日志按服务落在 `deploy/data/logs/` 下,配合 logrotate 生效。
+81
View File
@@ -0,0 +1,81 @@
---
title: 快速开始
description: 三步把 iotLCM 开源版跑起来
outline: deep
---
# 快速开始
## 前置条件
| 项 | 要求 |
| --- | --- |
| 操作系统 | Linux(x86_64 / arm64) |
| Docker | 20.10 以上,含 Compose V2(`docker compose version` 可用) |
| 内存 | 建议 4 GB 以上 |
| 磁盘 | 建议 40 GB 以上(含镜像与数据库) |
| 端口 | 3306 / 6379 / 5672 / 6041 / 6030 / 8500 默认占用,起步前先确认空闲 |
## 第一步:取代码
```bash
git clone https://gitee.com/snowgoat/iotlcm.git
cd iotlcm
```
## 第二步:起栈
```bash
cd deploy
docker compose up -d
```
不需要复制或修改任何文件,编排里已带可用的默认配置。首次启动会自动:
1. MySQL 建库并导入 schema(13 个脚本按序执行:建表 → 结构补齐 → 创建应用账号 → 重置种子账号口令 → 导入通道模板、字典、菜单等种子数据),约 30 秒 ~ 1 分钟
2. TDengine 自动建库建表(流量历史库)
3. 其余服务依次启动并向 Consul 注册
观察进度:
```bash
docker compose logs -f mysql
```
看到 `[initdb] 应用账号 u_iotlcm 已创建` 与 `[initdb] 种子账号口令已统一重置` 表示初始化完成。
## 第三步:登录
部署完成后访问 `http://127.0.0.1:8009`,账号 `admin`,初始口令见仓库的 `deploy/README.md`。
> **正式使用前必须修改默认口令**:数据库、Redis、RabbitMQ、admin 账号口令与 JWT 密钥。清单见[部署与运维](/projects/iotlcm/guide/deploy)的「上线前必改」。
## 端口对照
| 服务 | 宿主机端口 | 说明 |
| --- | --- | --- |
| 管理端 | 8009 | Web 管理平台 |
| 对外接口 | 8000 | OpenAPI V3 与兼容接口 |
| 用户端 | 8018 | 小程序 / H5 |
| 文档站 | 8019 | 使用手册与接口文档,必须带 `/docs/` 路径 |
| 运营商对接 | 8110 / 8310 | 通道协议适配 |
| 通道缓存 | 8510 | 缓存转发 |
| MySQL | 3306 | 库名 `db_iotlcm` |
| Redis | 6379 | 缓存与运行状态 |
| RabbitMQ | 5672 / 15672 | 队列与管理界面 |
| TDengine | 6041 / 6030 | 时序库 |
| Consul | 8500 | 服务注册 |
编排默认把业务端口绑定在 `127.0.0.1`,需要局域网或公网访问时,改用反向代理编排或并入宿主机已有的 nginx。
## 停止与清理
```bash
docker compose down # 停止,数据保留
docker compose down -v # 停止并删除数据卷(不可恢复)
```
## 下一步
- [部署与运维](/projects/iotlcm/guide/deploy)
- [教程视频](/projects/iotlcm/guide/tutorial)
+65
View File
@@ -0,0 +1,65 @@
---
title: 教程视频
description: 部署与使用的录屏教程
outline: deep
---
# 教程视频
开源版的上手路径只有两条:**把平台跑起来**(部署)与**把平台用起来**(使用)。两条路径各一支录屏视频,文字文档只作配套说明,不替代视频。
## 部署教程
| 项 | 内容 |
| --- | --- |
| 标题 | iotLCM 开源版部署教程:从零到可用 |
| 目标观众 | 第一次接触本项目、具备 Linux 与 Docker 基础的开发者与实施工程师 |
| 时长 | 12 ~ 15 分钟 |
| 发布位置 | 官网本页 + 代码仓 README 顶部 + B 站 |
| 关联文档 | [快速开始](/projects/iotlcm/guide/quickstart)、[部署与运维](/projects/iotlcm/guide/deploy) |
| 关联仓库路径 | `deploy/`、`docs/` |
视频覆盖:
1. 环境准备:Docker 与 Compose 版本检查、端口占用确认、机器规格建议
2. 取代码:`git clone` 公开仓库,确认目录结构
3. 启动:`docker compose up -d`,观察 MySQL 初始化日志直到种子数据导入完成
4. 验证:登录管理端、打开文档站与 OpenAPI 文档、跑一次状态查询
5. 收尾:改默认口令、停栈与清理数据卷
## 使用教程
| 项 | 内容 |
| --- | --- |
| 标题 | iotLCM 开源版使用教程:核心功能实操 |
| 目标观众 | 已完成部署、准备给业务方上手的管理员与运营人员 |
| 时长 | 15 ~ 20 分钟 |
| 发布位置 | 官网本页 + 代码仓 README 顶部 + B 站 |
| 关联文档 | [功能概览](/projects/iotlcm/) |
| 关联仓库路径 | `admin-svr/`、`admin-ui/`、`openapi/`、`worker-svr/` |
视频覆盖:
1. 卡信息:列表检索、按三码查卡、卡详情与用量查看
2. 库存与划拨:入库后的代理商维度划拨
3. 资费与业务受理:套餐配置、开通/续费/停复机、达量断网
4. 通道与批次:通道配置查看、批量操作与异步进度
5. 对外接口:申请 API 凭证并完成一次真实调用
6. 账号与工单:企业用户与角色、告警工单处理
## 视频文件放置约定
成片放在代码仓的 `website/public/videos/` 下,文件名用小写连字符加版本号(如 `deploy-tutorial-v1.mp4`),页面里以相对路径引用:
```html
<video controls src="/videos/deploy-tutorial-v1.mp4"></video>
```
若改投 B 站等外部托管,页面保留外链入口即可,视频文件不进仓库(避免仓库体积膨胀)。
## 录制备忘
- 录屏环境用与观众一致的环境:干净的 Ubuntu + Docker Compose V2,不要在已有业务实例上录
- 涉及口令的片段一律打码,示例口令用编排里的默认值
- 步骤与[快速开始](/projects/iotlcm/guide/quickstart)严格一致,视频里出现的每条命令都必须能原样复制执行
- 每个视频产出配套字幕或要点说明(Markdown),随视频一起发布