59eb34976a
iotlcm-admin-svr:管理后台服务。 - Go module:iotlcm → git.5iot.com/iotlcm-public/iotlcm-admin-svr(729 文件) - 凭据与地址脱敏:JWT signingKey(含代码里的 MustGet 默认值)、 MySQL DSN、Redis 口令、告警邮件发件人邮箱全部改为占位; 私网 IP → 文档地址段;库名 xiujie_admin → iotlcm - 真实手机号/邮箱 → 合法 11 位编造号 / example.com - 移除内部资产:CI 触发器、过时 DDL(sql/db_iotlcm.sql)、 私有依赖 go get 行、明文 registry 登录口令 - 启动 banner 统一 IOTLCM 方块字 + 社区惯例署名 - Dockerfile 改用公共基础镜像 - 拼错的 RADEME.md → README.md,README 重写 - 需要真实数据库的用例改为可用 IOTLCM_TEST_WITH_DB=1 显式启用 - 补 Apache-2.0 LICENSE,LF 行尾 + .gitattributes 数据库 schema 不随本仓发布(生产 DDL 已过时),README 已说明。
273 lines
14 KiB
YAML
273 lines
14 KiB
YAML
# config.yaml 配置文件
|
||
# @Link https://github.com/xiujiecn/xiu-admin
|
||
# @Copyright Copyright (c) 2025 LiXiujie
|
||
# @Author Lxj <li@xiujie.cn>
|
||
# @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
|
||
# 系统配置
|
||
system:
|
||
name: "IotLCM"
|
||
version: "1.0"
|
||
description: "IotLCM Server"
|
||
gfmode: "dev"
|
||
upload:
|
||
local:
|
||
path: "resource/upload"
|
||
|
||
workerDiagnostic:
|
||
enabled: true
|
||
|
||
batch:
|
||
allocate:
|
||
chunkSize: 5000
|
||
maxFileSize: 52428800
|
||
# 服务配置
|
||
server:
|
||
# 基本配置
|
||
address: ":8008"
|
||
# 接口文档
|
||
openapiPath: "/api.json" # OpenAPI接口文档地址
|
||
swaggerPath: "/swagger" # 内置SwaggerUI展示地址
|
||
# 静态服务配置
|
||
indexFiles: ["index.html","index.htm"] # 自动首页静态文件检索。默认为["index.html", "index.htm"]
|
||
indexFolder: false # 当访问静态文件目录时,是否展示目录下的文件列表。默认关闭,那么请求将返回403
|
||
serverRoot: "resource/public" # 静态文件服务的目录根路径,配置时自动开启静态文件服务。默认关闭
|
||
searchPaths: ["/resource/public"] # 提供静态文件服务时额外的文件搜索路径,当根路径找不到时则按照顺序在搜索目录查找。默认关闭
|
||
fileServerEnabled: true
|
||
initLoadMemoryDB: false # 是否初始化内存数据库,默认关闭
|
||
|
||
# 文件上传配置
|
||
maxHeaderBytes: "20KB"
|
||
clientMaxBodySize: "200MB"
|
||
readTimeout: "20m"
|
||
writeTimeout: "20m"
|
||
|
||
# 日志配置
|
||
logger:
|
||
path: "/app/logs" # 日志文件路径。默认为空,表示关闭,仅输出到终端
|
||
file: "{Y-m-d-H}.log" # 日志文件格式。默认为"{Y-m-d}.log"
|
||
prefix: "" # 日志内容输出前缀。默认为空
|
||
level: "dev" # 日志输出级别
|
||
timeFormat: "2006-01-02T15:04:05" # 自定义日志输出的时间格式,使用Golang标准的时间格式配置
|
||
ctxKeys: [] # 自定义Context上下文变量名称,自动打印Context的变量到日志中。默认为空
|
||
header: true # 是否打印日志的头信息。默认true
|
||
stdout: true # 日志是否同时输出到终端。默认true
|
||
rotateSize: 0 # 按照日志文件大小对文件进行滚动切分。默认为0,表示关闭滚动切分特性
|
||
rotateExpire: 0 # 按照日志文件时间间隔对文件滚动切分。默认为0,表示关闭滚动切分特性
|
||
rotateBackupLimit: 0 # 按照切分的文件数量清理切分文件,当滚动切分特性开启时有效。默认为0,表示不备份,切分则删除
|
||
rotateBackupExpire: 0 # 按照切分的文件有效期清理切分文件,当滚动切分特性开启时有效。默认为0,表示不备份,切分则删除
|
||
rotateBackupCompress: 0 # 滚动切分文件的压缩比(0-9)。默认为0,表示不压缩
|
||
rotateCheckInterval: "1h" # 滚动切分的时间检测间隔,一般不需要设置。默认为1小时
|
||
stdoutColorDisabled: false # 关闭终端的颜色打印。默认开启
|
||
writerColorEnable: false # 日志文件是否带上颜色。默认false,表示不带颜色
|
||
|
||
# JWT配置
|
||
jwt:
|
||
signingKey: "${JWT_SIGNING_KEY}"
|
||
expiresTime: 7d
|
||
bufferTime: 1d
|
||
issuer: iotlcm # 发行人
|
||
|
||
# 验证码配置
|
||
captcha:
|
||
keyLong: 6
|
||
imgWidth: 240
|
||
imgHeight: 80
|
||
openCaptcha: 0
|
||
openCaptchaTimeout: 3600
|
||
|
||
# 注册验证码配置。短信 bodyTemplate、邮件 bodyTemplate 支持 {contact}/{code} 或 ${contact}/${code}
|
||
register:
|
||
sms:
|
||
url: ""
|
||
method: "POST"
|
||
headers: {}
|
||
bodyTemplate: '{"phone":"{contact}","code":"{code}"}'
|
||
successStatus: 200
|
||
email:
|
||
host: "smtp.exmail.qq.com"
|
||
port: 465
|
||
username: "iotlcm@example.com"
|
||
password: "JH8DaDFxJuzFRLyB"
|
||
from: "iotlcm@example.com"
|
||
fromName: "物联卡管理平台"
|
||
subject: "注册验证码"
|
||
bodyTemplate: "您的注册验证码是:{code},6小时内有效。"
|
||
ssl: true
|
||
|
||
# 预警通知配置。短信服务使用 iotlcm-sms,配置完整并 enabled=true 后才会真实发送。
|
||
warning:
|
||
expire:
|
||
# 系统默认套餐到期预警天数;必须满足 firstWarnDays > secondWarnDays > thirdWarnDays。
|
||
firstWarnDays: 30
|
||
secondWarnDays: 15
|
||
thirdWarnDays: 7
|
||
sms:
|
||
enabled: true
|
||
# HTTP 接口地址;如果配置 grpcAddr,则优先走 gRPC。
|
||
url: "http://127.0.0.1:11190/api/v1/sms/send"
|
||
grpcAddr: "127.0.0.1:11200"
|
||
timeout: "5s"
|
||
routerId: 0
|
||
# 兼容当前 iotlcm-sms 协议:如果短信微服务没有内置供应商配置,可在这里透传。
|
||
# 阿里云 serviceType=1,腾讯云 serviceType=2。
|
||
serviceType: ""
|
||
regionId: ""
|
||
accessKeyId: ""
|
||
accessKeySecret: ""
|
||
sdkAppId: ""
|
||
signName: ""
|
||
templateId: ""
|
||
# 阿里云模板参数通常需要 JSON;如果预警模板变量名是 content,可配置为 '{"content":{contentJson}}'。
|
||
# 腾讯云多参数模板可按实际顺序配置,例如 '{firstItem}|{count}'。
|
||
msgContentTemplate: ""
|
||
# 长期建议:短信平台签名、模板和密钥由短信微服务自行处理,lcm 只传手机号和聚合内容。
|
||
wechat:
|
||
enabled: false
|
||
appId: "wx9e26905702c1a372"
|
||
appSecret: ""
|
||
templateId: "DMDP2PKktdtG1ES_3Ic1JcR0LGELQmWE6LunYyerHCY"
|
||
page: "pages/message/index"
|
||
timeout: "5s"
|
||
|
||
|
||
database:
|
||
logger:
|
||
path: "/app/logs/sql"
|
||
level: "all"
|
||
stdout: true
|
||
default: # 分组名称,可自定义,默认为default
|
||
link: "mysql:${DB_USER}:${DB_PASSWORD}@tcp(${DB_HOST}:3306)/db_iotlcm?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghai"
|
||
debug: true #开启调试模式
|
||
charset: "utf8mb4" # (可选)数据库编码(如: utf8mb4/utf8/gbk/gb2312),一般设置为utf8mb4。默认为utf8。
|
||
dryRun: false #ORM空跑(只读不写)
|
||
maxIdle: 30 #连接池最大闲置的连接数
|
||
maxOpen: 100 #连接池最大打开的连接数
|
||
maxLifetime: 120 #(单位秒)连接对象可重复使用的时间长度
|
||
memorydb:
|
||
# link: "sqlite::@file(jieiotmem.db)?journal_mode=WAL"
|
||
link: "sqlite::@file(:memory:)"
|
||
# link: ""
|
||
debug: true
|
||
maxIdle: 1
|
||
maxOpen: 1
|
||
maxLifetime: 30
|
||
|
||
# 缓存配置
|
||
cache:
|
||
adapter: "redis" # 缓存适配器,支持:file|redis
|
||
fileDir: "resource/cache" # 缓存文件目录
|
||
|
||
# Redis 配置示例
|
||
redis:
|
||
# 单实例配置
|
||
default:
|
||
mode: "single" #redis模式,支持:single|cluster|sentinel
|
||
sentinelMasterName: "iotlcm-master" #哨兵模式主节点名称
|
||
address: 192.0.2.29:6379
|
||
db: 0
|
||
pass: "${REDIS_PASSWORD}"
|
||
minIdle: 5 #最小空闲连接数
|
||
maxIdle: 30 #允许闲置的最大连接数
|
||
maxActive: 5000 #最大活跃连接数
|
||
idleTimeout: "60s" #连接最大空闲时间,使用时间字符串例如30s/2m/2d
|
||
ClientName: "SystemCache"
|
||
|
||
rabbitmq:
|
||
enabled: true
|
||
# 示例:amqp://${MQ_USER}:${MQ_PASSWORD}@${MQ_HOST}/
|
||
# dsn: "amqp://${MQ_USER}:${MQ_PASSWORD}@${MQ_HOST}/"
|
||
dsn: "amqp://${MQ_USER}:${MQ_PASSWORD}@${MQ_HOST}/"
|
||
|
||
tsdb:
|
||
database: "TdEngine" #可选择 TdEngine、Influxdb
|
||
tdengine:
|
||
# type: "taosRestful" #http连接方式,端口是6041
|
||
# dsn: "root:taosdata@http(127.0.0.1:6041)/"
|
||
type: "taosWS" #websocket连接方式,端口是6041
|
||
# dsn: "root:taosdata@ws(127.0.0.1:6041)/"
|
||
dsn: "root:sdyz2026__@ws(192.0.2.29:6041)/"
|
||
dbName: "iotlcm"
|
||
maxOpenConns: 100
|
||
maxIdleConns: 10
|
||
batchSize: 200
|
||
|
||
|
||
# 路由配置
|
||
router:
|
||
# 不需要验证登录的路由地址
|
||
exceptLogin:
|
||
- /api/v1/system/auth/login
|
||
- /api/v1/system/auth/refresh
|
||
- /api/v1/system/captcha
|
||
- /api/v1/system/auth/getTenantList
|
||
- /api/v1/pay/alipay/notify
|
||
- /api/v1/pay/alipay/return
|
||
|
||
# 生成代码
|
||
alipay:
|
||
appId: "9021000165668942"
|
||
privateKey: "MIIEowIBAAKCAQEAg+4BpLO2Fw5GMbrihnugyQqiLBp2RhSbSsvjNyzaG10u900N1DcVlh8HNdcus5AGjfbiUwMQwv7Os+NnFrEZA3CtWLXH+uczHIpcMqJJhoVgA//4gf2TX9K4OSQ1pgJeAhTS9WWMEB7DQLb7A6xGjvBdGNbPAzucGhUmtG1tgZSVOcpWqN2h4dQxkZhfR+6m3AqWAPahpQXsNINHewetQ4mIG+b3+z/OknEll0RDRmw7OihOJ24B51Phy7lewl160LgLpLffyaQUUXcFdcNo+HvWqtIT0mH8WWHAgqfN/WVkMz/WVjE0rzbIVgmpQc7+hMbrcafTmeq0wdnVXrKS6QIDAQABAoIBAEagy1ZuMyRiqueCojTWyHv4altsCzd3Xq+LOWfXZihSGYuhP68FklPc5pJHUaQljazAp+dC891AZk5dhlnak4aI8vRT1OyYi39S/wrIYM5YZs+dYF/O7e/VsnQ800+9YrCAj3N6WqJiparmirkrqFZrjZt3nDmh1u8Ltb3P+1jr90MBEdS+BXaEQP/KGxFiKZyoWFn9B4l0aPFkPExF+hgtRpP3gxFcyljQKGVmSUIkT6V08F1oRm72NQOhcizCh9lX+5HYLTkUVQVg6FHwdZs/KeJcZu6Y829pNSNeJmPbR3VPUpTbvwb0qeEoc42T3H/C0xXUeTYizUpHmhJJqnUCgYEA3Y7Xz+MUk98zRJnlr2BDUc+Qnhv3wmSA5LCcRbxTNNBp4TXjnZknY6Ms9D+nJupL4nw6QSYkO6O+tAEmU6gaSDEHKI1uKqU0zOdbGIHNkMqka3rinQcMJNNRZ8T1FLCPFna7S1FNlxulZgWxjqxP/KvWOEpCWLCLzwZNk8fEd+MCgYEAmHBNbaMmT4WvLevY/OMv/5e5csnDFIcsNJKvFLZZMBLuKT/26YN2ryVUivY+TTyHL5zk4VybeauTdQHIvX6sNJoh2Ii6vthKfSufL4rkMob8PHiG33iHBx3VxAwiVXfu3JHVnbCPcXTOzsdRzT17X3rODK9t8319qfVjd0Gxi8MCgYEAqgNc0+ea+MXD35aAzA0AW5z9inZHruHUjqh/onubFeH//ZOOsHa/5RNoAZ1+tLwBszBEu417LFDAm/xt3rAWSuNkbNfqe8r+M2YtXybsCXmWpetMTdcEmJWX2BspPdEmW8SMgIVJFvVd/GXOFH9hebCa1+MT+l6vShO6H/ahaqUCgYAzon6nr4bPkvHWtTfH2VCt2//mIO+iaXMQz8rcUjP9s7vWXyNMz8oI47UyaNyLnwAPoa5po8vKN9L35EXR4jGEk9z5Er9m267HnVoLaZmIf+66sPzGf3YFdBavlIiguMJBFmjsRB0iijVvF1bfFX9PxTI8W8P7oTtKsaMihy8TrwKBgCgjA8DL8HJbRwZ+V/KWOh8rzO5cBUUH3ThIj6u7Wn4tMlscfi+KFKTXghjSORfIVx8v9v2aNZKwGZ547AOPRXhDF09cLAcCfl7uOrwsftziIeBQnrqtpIqcVTgRwGMIMBJEtQEks5N/E/d+dSL1YQKC76mVC8/RMf52WYKH1QCa"
|
||
alipayPublicKey: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8Df1EPFkA2xy8NgF0UdRYxsshslUi2XSGTG01oQKsrYNB+rhAw9MJdMlunVQxSrBZsw5N7htXGdiTceaLo/n8Wuibp0cRHdErJSp9GhP4pW2IR3FoCCPYlJlyiCUR/NInI3XMai0UdjgiPX03bvYLRAKE8lLiOSgxNagQmOFLmQYRYfFhGbxDe98XMg83YdSWvZKrlM+vzgk8/aPgq7BFLpbRKqLvd8OXXBHDCaWMSSGwCN0whhdEiwbIhSVgwTgkhWXUuNDmT741/+7D46djp8wX/84SDts0fWb63/in9ATTGtNivJX7HPDyqrmcN2iUi5xFHS9XwYBdT4yu/xFQwIDAQAB"
|
||
notifyUrl: "https://evolution-starless-municipal.ngrok-free.dev/api/v1/pay/alipay/notify"
|
||
returnUrl: "http://localhost:5666/enterpriseManagement/tBalanceDetail/tAgentBalance"
|
||
isProduction: false
|
||
|
||
pay:
|
||
expireTime: 3 # 支付过期时间,方便测试先改为3分钟
|
||
balanceRecharge:
|
||
timeoutDelay: "3m" # 余额充值支付宝支付与 RabbitMQ 延时检查时间,方便测试先改为3分钟,后续改为真正时间
|
||
|
||
xgen:
|
||
allowedIPs: [ "127.0.0.1", "*" ] # 白名单,*代表所有,只有允许的IP后台才能使用生成代码功能
|
||
selectDbs: [ "default" ] # 可选生成表的数据库配置名称,支持多库
|
||
disableTables: [ ] # 禁用的表,禁用以后将不会在选择表中看到
|
||
delimiters: [ "@{", "}" ] # 模板引擎变量分隔符号
|
||
# 生成应用模型,所有生成模板允许自定义,可以参考default模板进行改造
|
||
application:
|
||
# CRUD和关系树列表模板
|
||
crud:
|
||
templates:
|
||
# 默认的主包模板
|
||
- group: "default" # 分组名称
|
||
isAddon: false # 是否为插件模板 false|true
|
||
masterPackage: "gen" # 主包名称,需和controllerPath、logicPath、inputPath保持关联
|
||
templatePath: "./resource/generate/default/curd" # 模板路径
|
||
apiPath: "./api/gen" # goApi生成路径
|
||
controllerPath: "./internal/controller/gen" # 控制器生成路径
|
||
logicPath: "./internal/logic/gen" # 主要业务生成路径
|
||
inputPath: "./internal/model/genin" # 表单过滤器生成路径
|
||
routerPath: "./internal/router/genrouter" # 生成路由表路径
|
||
sqlPath: "./manifest/generate" # 生成sql语句路径
|
||
webApiPath: "../vue/apps/web-antd/src/api/gen" # webApi生成路径
|
||
webViewsPath: "../vue/apps/web-antd/src/views/gen" # web页面生成路径
|
||
|
||
# 默认的插件包模板,{$name}会自动替换成实际的插件名称
|
||
- group: "addon" # 分组名称
|
||
isAddon: true # 是否为插件模板 false|true
|
||
masterPackage: "sys" # 主包名称,需和controllerPath、logicPath、inputPath保持关联
|
||
templatePath: "./resource/generate/default/curd" # 模板路径
|
||
apiPath: "./addons/{$name}/api/admin" # goApi生成路径
|
||
controllerPath: "./addons/{$name}/controller/admin/sys" # 控制器生成路径
|
||
logicPath: "./addons/{$name}/logic/sys" # 主要业务生成路径
|
||
inputPath: "./addons/{$name}/model/input/sysin" # 表单过滤器生成路径
|
||
routerPath: "./addons/{$name}/router/genrouter" # 生成路由表路径
|
||
sqlPath: "./storage/data/generate/addons" # 生成sql语句路径
|
||
webApiPath: "../web/src/api/addons/{$name}" # webApi生成路径
|
||
webViewsPath: "../web/src/views/addons/{$name}" # web页面生成路径
|
||
|
||
upstream:
|
||
proxy:
|
||
# address: "yzupstreamproxy-http-svc"
|
||
address: "localhost:8510"
|
||
timeout: 10s
|
||
gateway:
|
||
# address: "iotlcmupstreamchan-http-svc"
|
||
address: "localhost:8110"
|
||
timeout: 10s
|
||
diagnose:
|
||
clientName: "iotlcm.example.com:8110"
|
||
timeout: 10s
|
||
inboundBasicInfo:
|
||
clientName: "iotlcm.example.com:8110"
|
||
timeout: 10s
|