init: IotLCM 开源版部署仓

内容:
- docker-compose.yml:14 个基础/业务服务 + 3 个可选 profile(with-mock 挡板、with-bot、with-nginx)
- .env.example:集中管理镜像仓库、口令、端口;必填项缺失时 compose 直接报错退出
- config.example/:10 份配置模板,全部为占位值与注释说明
- schema/:12 个初始化脚本,按文件名顺序由 MySQL initdb 自动执行

脱敏处理:
- 生产/内网 IP、镜像仓库地址、公司名、真实域名全部清除
- 演示账号保留 18 个(出库与划拨依赖账号与部门树的关联),
  昵称/邮箱/手机号/登录IP/头像改为占位或编造值
- 数据库账号与 admin 口令改为初始化时按 .env 注入计算
- 通道模板与 Mock 通道的上游密钥置空
- Mock 通道地址指向 compose 内 onelink-mock 服务

部署时用 --profile with-mock 启动运营商接口挡板,即可在无真实运营商环境时跑通全链路。
This commit is contained in:
MiFaZhan
2026-10-28 13:40:12 +08:00
commit bc2c7bcc6b
26 changed files with 7264 additions and 0 deletions
+94
View File
@@ -0,0 +1,94 @@
# 数据库初始化脚本
MySQL 容器**首次以空数据卷启动**时,`docker-entrypoint-initdb.d` 会按**文件名顺序**自动执行本目录下的脚本。
改了这些文件必须清空数据卷才会重跑:
```bash
docker compose stop mysql
sudo rm -rf ./data/mysql
docker compose up -d mysql
```
> ⚠️ 清空 `./data/mysql` 会**删除全部数据**,生产环境不要执行。
## 执行顺序
按「结构 → 账号 → 种子数据」三阶段编号,文件名顺序即执行顺序。除 01 外全部幂等,可重复执行。
| 序号 | 文件 | 内容 |
| --- | --- | --- |
| 01 | `01-schema.sql` | 建 `db_iotlcm` 库 + 全部表结构 + 基础数据(菜单、字典、角色、租户、演示账号)。自包含:`DROP DATABASE` → `CREATE` → `USE` |
| 02 | `02-schema-fix-preview1.sql` | 补 `card_channel_assoc` 表 + 27 列。用存储过程按 `information_schema` 判断,规避 MySQL 8 无 `ADD COLUMN IF NOT EXISTS` |
| 03 | `03-schema-align-prod.sql` | 补 `t_sms_template_config` 表 + 修正 `batch_no` 默认值 |
| 04 | `04-users.sh` | 建应用账号 `u_iotlcm`(口令取自 `MYSQL_APP_PASSWORD`)+ 可选库 `iotdb` |
| 05 | `05-reset-passwords.sh` | 把所有种子账号口令重置为 `MYSQL_ADMIN_PASSWORD`(按各账号自身 salt 重算哈希) |
| 06 | `06-seed-channel-templates.sql` | 通道模板 23 条(上游密钥已置空) |
| 07 | `07-seed-dict.sql` | 数据字典:`sys_dict_type` 86 类 + `sys_dict_data` 435 条 |
| 08 | `08-seed-mock-channel.sql` | **Mock 通道 `channel_yd_mock`**。演示卡全部挂在该通道上,缺则卡片管理的通道列、筛选、开停复机均不可用 |
| 09 | `09-seed-role-chain.sql` | 代理下发模板参数 + 角色下发标记 |
| 10 | `10-seed-jobs.sql` | 定时任务 19 条,**默认全部停用**(避免自动全量同步压满机器) |
| 11 | `11-seed-menu-align-prod.sql` | 菜单增量 27 条(含达量断网按钮权限、全量同步页) |
| 12 | `12-repair-dept-ancestors.sql` | `sys_dept.ancestors` 尾逗号归一化。全新库为空操作,仅用于修复既有库脏数据 |
## 种子数据说明
### 保留的内容(业务必需)
- **菜单** `sys_menu`:系统导航与按钮权限
- **字典** `sys_dict_type` / `sys_dict_data`:全部业务枚举
- **角色** `sys_role` / `sys_role_menu` / `sys_role_dept`:超级管理员、M管理员、M用户、终端用户
- **租户与部门** `sys_tenant` / `sys_dept`:企业-代理-部门三层结构
- **接口权限** `t_api` / `t_api_group` / `t_api_resource`:OpenAPI 权限模型
- **通道模板** `t_sim_channel_template`:运营商通道配置模板
- **行政区划** `t_division_code`:省市级
- **演示账号** `sys_user` 18 个:覆盖管理员、代理、终端用户等角色,出库与划拨流程依赖这张表与部门树的关联
### 已脱敏的内容
| 项 | 处理 |
| --- | --- |
| 账号昵称 | `示例用户01` ~ `示例用户18` |
| 邮箱 | `user01@example.com` ~ `user18@example.com` |
| 手机号 | 合法 11 位编造号(`1380000` + 4 位序号,保持互异) |
| 登录 IP | 清空 |
| 头像地址 | 清空 |
| 公司名 / 组织名 | `示例企业` / `示例代理` |
| 密码哈希 | 初始化时按 `MYSQL_ADMIN_PASSWORD` 重算 |
| 通道密钥 | 置空 |
### 空表(正常)
以下表在种子库中为空,属预期状态:
| 表 | 说明 |
| --- | --- |
| `t_sim_flow_package_info` | 流量套餐。为空时无法办理套餐/续费/改套餐,需自行在后台「套餐定价」中创建 |
| `t_sim_card` | 卡数据。可通过挡板服务的造卡接口生成测试卡 |
| `t_sim_channels` | 业务通道。Mock 通道由 `08` 脚本插入 |
| 其余 `t_*` 业务表 | 均为空,随业务操作产生数据 |
## 首次登录
| 项 | 值 |
| --- | --- |
| 地址 | `http://<宿主机IP><:ADMIN_UI_PORT>` |
| 账号 | `admin` |
| 口令 | `.env` 里的 `MYSQL_ADMIN_PASSWORD` |
其余演示账号的登录名见 `sys_user.user_name`,口令同为 `MYSQL_ADMIN_PASSWORD`。**所有账号登录后请立即修改口令。**
## 手动执行
容器已启动后需要单独执行某个脚本:
```bash
docker compose exec -T mysql sh -c \
'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" db_iotlcm' < schema/07-seed-dict.sql
```
`.sh` 脚本需要环境变量,在容器内执行:
```bash
docker compose exec mysql bash /docker-entrypoint-initdb.d/04-users.sh
```