fix: 生成项目补齐 --encrypt/--license 构建契约(网关收集项、[license] 注入点)

- config.toml:--encrypt 会先 PyArmor 混淆 main.py / server.py,PyInstaller 静态
  分析跟不到 `from chongming.app import app`,网关包整个漏收(打包"成功"、产物
  启动报 No module named 'chongming')—— 显式列 chongming / chongming.app 等入口包;
- public/config.toml:补 [license] 段(public_key 留空),--license 的注入点;
- README.project.md:补授权公钥前置条件(keygen → license_public.key 或环境变量),
  以及 --only 对 obfuscate 同样划界(加密构建要显式带上,否则混淆被静默跳过)。
This commit is contained in:
2026-10-14 15:29:25 +08:00
parent 042ac0e8d5
commit d58be74123
3 changed files with 28 additions and 1 deletions
+7
View File
@@ -95,7 +95,14 @@ uv run build --encrypt --license # 对外分发:加密插件模块 + 注
uv run build --only mbank # 只重新生成 plugins.mbank(插件热更新只需替换该文件) uv run build --only mbank # 只重新生成 plugins.mbank(插件热更新只需替换该文件)
``` ```
- `--encrypt --license` 需要厂商授权公钥(未提供会直接构建失败):先
`uv run chongming-license keygen -o license_private.pem` 生成密钥对(一次性;私钥离线保管,
绝不进仓库/产物),把输出的公钥写入根目录 `license_public.key`(或用
`CHONGMING_LICENSE_PUBKEY` / `CHONGMING_LICENSE_PUBKEY_FILE` 指定),再构建
- 无前端时跳过 vue 步骤:`uv run build pyinstaller --only mbank,prepare,pack` - 无前端时跳过 vue 步骤:`uv run build pyinstaller --only mbank,prepare,pack`
(`--only` 对**所有**步骤划界:加密构建还要显式带上 `obfuscate`,如
`uv run build --encrypt --license --only mbank,prepare,obfuscate,pack,license_guard`,
否则 PyArmor 混淆会被静默跳过)
- 插件代码在 `plugins.mbank` 里 → 换文件即可热更新;**网关本体是普通依赖** → - 插件代码在 `plugins.mbank` 里 → 换文件即可热更新;**网关本体是普通依赖** →
升级网关需改 `pyproject.toml` 版本(或 `uv lock --upgrade-package chongming-gateway`) 升级网关需改 `pyproject.toml` 版本(或 `uv lock --upgrade-package chongming-gateway`)
并重新 `uv run build` 并重新 `uv run build`
+13 -1
View File
@@ -81,7 +81,11 @@ config_path = "./config/workers/config.toml"
[pyinstaller_build_import] [pyinstaller_build_import]
# 打包收集清单(PyInstaller --hidden-import / Nuitka --include-module),`uv run build` 的 # 打包收集清单(PyInstaller --hidden-import / Nuitka --include-module),`uv run build` 的
# pack 步骤使用。网关本体依赖随 chongming-gateway 包发布、静态分析可跟到;这里保留: # pack 步骤使用。网关本体(chongming-gateway 包)**未混淆时**能沿骨架的
# `from chongming.app import app` 静态跟到;但 --encrypt 会先 PyArmor 混淆
# main.py / server.py,此时静态分析跟不到,网关入口包必须显式列出(见 base 前几项)。
# 这里保留:
# - 网关入口包(chongming / chongming.app 与骨架直接引用的子模块)
# - 动态导入、静态分析看不到的(granian 内部子模块、amqtt 插件、sqlite_vfs 等) # - 动态导入、静态分析看不到的(granian 内部子模块、amqtt 插件、sqlite_vfs 等)
# - public 骨架自身(server / utils)与服务器可选实现(uvloop 等) # - public 骨架自身(server / utils)与服务器可选实现(uvloop 等)
# 内置插件专属依赖(网关本体不 import 的第三方包)写根目录 plugins_deps.toml,按插件分节声明。 # 内置插件专属依赖(网关本体不 import 的第三方包)写根目录 plugins_deps.toml,按插件分节声明。
@@ -90,6 +94,14 @@ base = [
"utils.launch", "utils.launch",
"utils.config", "utils.config",
"server", "server",
# 网关入口包:--encrypt 时 main.py / server.py 先被 PyArmor 混淆,里面的
# `from chongming.app import app` 对 PyInstaller 静态分析不可见 —— 漏了会在
# 打包期"成功"、产物启动即报
# "无法导入网关(chongming.app): No module named 'chongming'"
"chongming",
"chongming.app",
"chongming.app.core.logger",
"chongming.app.core.parent_death",
"module_bank", "module_bank",
"granian", "granian",
"granian._compat", "granian._compat",
+8
View File
@@ -28,6 +28,14 @@ launch_worker_count = "cache"
algorithm = "HS256" algorithm = "HS256"
secret_key = "your-secret-key-change-in-production" secret_key = "your-secret-key-change-in-production"
[license]
# 机器码授权(厂商 Ed25519 签发):`uv run build --license` 在打包前把厂商公钥注入
# 这里,并把"本产物是否为授权版"烘焙进产物代码(编译后部署侧改不了)。
# public_key 留空 = 未接入授权:开发态不校验;未加 --license 的产物也不校验
# (插件照常加载,不是砖头包)。可选键:path(授权文件,默认 ./license.lic)、
# min_match(指纹容错阈值)、enabled(仅开发态生效;打包产物以构建期烘焙为准)。
public_key = ""
[production] [production]
debug = false debug = false
env = "production" env = "production"