Initial upload for secondary development
This commit is contained in:
777
license_server/正式上线打包与授权流程.md
Normal file
777
license_server/正式上线打包与授权流程.md
Normal file
@@ -0,0 +1,777 @@
|
||||
# ChatLab 正式上线、打包、联网授权、离线授权操作手册
|
||||
|
||||
这份文档按实际销售流程写,不讲太多专业词。你可以把它理解成:
|
||||
|
||||
```text
|
||||
先把授权服务放到你的服务器上
|
||||
再把桌面软件里的授权地址改成你的服务器地址
|
||||
然后重新打包安装包
|
||||
客户安装后输入授权码,就会连你的服务器激活
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 1. 正式上线前你要准备什么
|
||||
|
||||
你需要准备 4 样东西:
|
||||
|
||||
```text
|
||||
1. 一台云服务器
|
||||
2. 一个域名,比如 https://license.xxx.com
|
||||
3. 授权后台 license_server
|
||||
4. 打包好的客户安装包
|
||||
```
|
||||
|
||||
建议你正式卖客户时使用:
|
||||
|
||||
```text
|
||||
默认:联网授权
|
||||
备用:离线授权
|
||||
```
|
||||
|
||||
联网授权适合大多数客户。
|
||||
离线授权只给网络限制很严的客户用。
|
||||
|
||||
---
|
||||
|
||||
## 2. 修改客户软件里的授权服务器地址
|
||||
|
||||
正式上线后,先打开这个文件:
|
||||
|
||||
```text
|
||||
electron-launcher/license-config.json
|
||||
```
|
||||
|
||||
本地测试时通常是:
|
||||
|
||||
```json
|
||||
{
|
||||
"licenseServerUrl": "http://127.0.0.1:8787"
|
||||
}
|
||||
```
|
||||
|
||||
正式上线后改成你的公网授权地址:
|
||||
|
||||
```json
|
||||
{
|
||||
"licenseServerUrl": "https://license.你的域名.com"
|
||||
}
|
||||
```
|
||||
|
||||
例子:
|
||||
|
||||
```json
|
||||
{
|
||||
"licenseServerUrl": "https://license.chatlab.cn"
|
||||
}
|
||||
```
|
||||
|
||||
注意:
|
||||
|
||||
```text
|
||||
不要给客户正式包继续使用 http://127.0.0.1:8787
|
||||
```
|
||||
|
||||
因为 `127.0.0.1` 代表客户自己的电脑。
|
||||
客户电脑上没有你的授权服务,就会激活失败。
|
||||
|
||||
---
|
||||
|
||||
## 3. 修改授权地址后怎么打包
|
||||
|
||||
在你自己的开发电脑上打开 PowerShell。
|
||||
|
||||
进入项目根目录:
|
||||
|
||||
```powershell
|
||||
cd C:\Users\12138\Desktop\get_wechat_new\用户使用版本\第二版\get_wechat_me
|
||||
```
|
||||
|
||||
推荐使用完整打包命令:
|
||||
|
||||
```powershell
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\build-desktop.ps1
|
||||
```
|
||||
|
||||
这个命令会重新打包前端、后端和 Electron 安装包。
|
||||
|
||||
打包完成后,正式发给客户的是:
|
||||
|
||||
```text
|
||||
release\ChatLab-Setup-1.0.0.exe
|
||||
```
|
||||
|
||||
如果你只是临时测试 Electron 打包,也可以执行:
|
||||
|
||||
```powershell
|
||||
cd .\electron-launcher
|
||||
npm.cmd run build
|
||||
```
|
||||
|
||||
临时测试输出一般在:
|
||||
|
||||
```text
|
||||
electron-launcher\dist\ChatLab-Setup-1.0.0.exe
|
||||
```
|
||||
|
||||
但正式发客户,建议用:
|
||||
|
||||
```powershell
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\build-desktop.ps1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 如果你有代码签名证书
|
||||
|
||||
正式商业销售建议做代码签名,否则客户电脑可能提示未知发布者。
|
||||
|
||||
有证书时使用:
|
||||
|
||||
```powershell
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\build-desktop.ps1 `
|
||||
-Sign `
|
||||
-CertificateFile "D:\certs\ChatLab-CodeSigning.pfx" `
|
||||
-CertificatePassword "证书密码" `
|
||||
-PublisherName "你的公司名称" `
|
||||
-ForceSign
|
||||
```
|
||||
|
||||
如果暂时没有证书,也可以先用普通打包命令:
|
||||
|
||||
```powershell
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\build-desktop.ps1
|
||||
```
|
||||
|
||||
只是客户安装时可能会看到系统提醒。
|
||||
|
||||
---
|
||||
|
||||
## 5. 部署联网授权服务
|
||||
|
||||
下面以 Ubuntu 云服务器为例。
|
||||
|
||||
### 5.1 上传授权后台
|
||||
|
||||
把本地这个目录上传到服务器:
|
||||
|
||||
```text
|
||||
license_server
|
||||
```
|
||||
|
||||
建议服务器上放到:
|
||||
|
||||
```text
|
||||
/opt/chatlab-license-server
|
||||
```
|
||||
|
||||
服务器上的目录大概是:
|
||||
|
||||
```text
|
||||
/opt/chatlab-license-server
|
||||
admin_cli.py
|
||||
main.py
|
||||
license_core.py
|
||||
requirements.txt
|
||||
dev_private_key.pem
|
||||
```
|
||||
|
||||
注意:
|
||||
|
||||
```text
|
||||
不要把整个桌面软件项目都发到客户电脑。
|
||||
license_server 是你自己服务器用的,不发给客户。
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5.2 安装运行环境
|
||||
|
||||
登录服务器后执行:
|
||||
|
||||
```bash
|
||||
cd /opt/chatlab-license-server
|
||||
python3 -m venv .venv
|
||||
. .venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
先手动测试运行:
|
||||
|
||||
```bash
|
||||
python main.py
|
||||
```
|
||||
|
||||
如果看到类似:
|
||||
|
||||
```text
|
||||
Uvicorn running on http://127.0.0.1:8787
|
||||
```
|
||||
|
||||
说明授权服务已经启动。
|
||||
|
||||
再测试:
|
||||
|
||||
```bash
|
||||
curl http://127.0.0.1:8787/health
|
||||
```
|
||||
|
||||
正常会返回:
|
||||
|
||||
```json
|
||||
{"ok":true}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. 绑定域名和 HTTPS
|
||||
|
||||
假设你的域名是:
|
||||
|
||||
```text
|
||||
license.你的域名.com
|
||||
```
|
||||
|
||||
先在域名解析后台添加:
|
||||
|
||||
```text
|
||||
类型:A
|
||||
主机记录:license
|
||||
记录值:你的服务器公网 IP
|
||||
```
|
||||
|
||||
然后服务器安装 Nginx 和证书工具:
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install nginx certbot python3-certbot-nginx -y
|
||||
```
|
||||
|
||||
开放网页端口:
|
||||
|
||||
```bash
|
||||
sudo ufw allow 80
|
||||
sudo ufw allow 443
|
||||
```
|
||||
|
||||
申请 HTTPS 证书:
|
||||
|
||||
```bash
|
||||
sudo certbot --nginx -d license.你的域名.com
|
||||
```
|
||||
|
||||
成功后,在浏览器打开:
|
||||
|
||||
```text
|
||||
https://license.你的域名.com/health
|
||||
```
|
||||
|
||||
如果看到:
|
||||
|
||||
```json
|
||||
{"ok":true}
|
||||
```
|
||||
|
||||
说明公网授权服务已经通了。
|
||||
|
||||
---
|
||||
|
||||
## 7. 让授权服务一直运行
|
||||
|
||||
手动执行 `python main.py` 只适合测试。
|
||||
正式上线要让它一直在服务器后台运行。
|
||||
|
||||
创建服务文件:
|
||||
|
||||
```bash
|
||||
sudo nano /etc/systemd/system/chatlab-license.service
|
||||
```
|
||||
|
||||
写入:
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=ChatLab License Server
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
WorkingDirectory=/opt/chatlab-license-server
|
||||
ExecStart=/opt/chatlab-license-server/.venv/bin/python /opt/chatlab-license-server/main.py
|
||||
Restart=always
|
||||
RestartSec=3
|
||||
Environment=CHATLAB_LICENSE_DB=/opt/chatlab-license-server/license_server.db
|
||||
Environment=CHATLAB_LICENSE_PRIVATE_KEY_FILE=/opt/chatlab-license-server/dev_private_key.pem
|
||||
Environment=CHATLAB_LICENSE_ADMIN_TOKEN=请改成一串很长的后台管理密码
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
启动服务:
|
||||
|
||||
```bash
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable chatlab-license
|
||||
sudo systemctl start chatlab-license
|
||||
```
|
||||
|
||||
查看状态:
|
||||
|
||||
```bash
|
||||
sudo systemctl status chatlab-license
|
||||
```
|
||||
|
||||
如果看到 `active` 或 `running`,说明授权服务正在运行。
|
||||
|
||||
查看日志:
|
||||
|
||||
```bash
|
||||
sudo journalctl -u chatlab-license -f
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. 正式环境私钥怎么处理
|
||||
|
||||
私钥可以理解成:
|
||||
|
||||
```text
|
||||
你的授权盖章工具
|
||||
```
|
||||
|
||||
谁拿到私钥,谁就可以自己生成授权。
|
||||
|
||||
所以正式上线要记住:
|
||||
|
||||
```text
|
||||
私钥只放你的服务器
|
||||
不要发给客户
|
||||
不要放进安装包
|
||||
不要上传到公开仓库
|
||||
不要放到网盘分享
|
||||
```
|
||||
|
||||
如果你换了正式私钥,就必须保证:
|
||||
|
||||
```text
|
||||
服务器用新私钥签授权
|
||||
客户软件里内置的新公钥能验证这个授权
|
||||
```
|
||||
|
||||
如果私钥和公钥不是一对,客户会看到:
|
||||
|
||||
```text
|
||||
授权签名校验失败
|
||||
```
|
||||
|
||||
简单理解:
|
||||
|
||||
```text
|
||||
服务器负责盖章
|
||||
客户软件负责验章
|
||||
两边必须是一套章
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9. 联网授权怎么做
|
||||
|
||||
联网授权是正式销售最推荐的方式。
|
||||
|
||||
### 9.1 你先给客户创建授权码
|
||||
|
||||
登录服务器:
|
||||
|
||||
```bash
|
||||
cd /opt/chatlab-license-server
|
||||
. .venv/bin/activate
|
||||
```
|
||||
|
||||
创建一年授权:
|
||||
|
||||
```bash
|
||||
python admin_cli.py create-license --customer-name "某某公司" --days 365
|
||||
```
|
||||
|
||||
如果是 7 天试用:
|
||||
|
||||
```bash
|
||||
python admin_cli.py create-license --customer-name "某某公司-试用" --days 7
|
||||
```
|
||||
|
||||
它会输出类似:
|
||||
|
||||
```json
|
||||
{
|
||||
"customer_id": "cus_xxx",
|
||||
"license_id": "lic_xxx",
|
||||
"license_key": "CL-2026-XXXX-XXXXXX-XXXXXX",
|
||||
"expires_at": "2027-05-18T00:00:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
你要发给客户的是:
|
||||
|
||||
```text
|
||||
license_key
|
||||
```
|
||||
|
||||
也就是类似:
|
||||
|
||||
```text
|
||||
CL-2026-XXXX-XXXXXX-XXXXXX
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 9.2 你发给客户两个东西
|
||||
|
||||
发给客户:
|
||||
|
||||
```text
|
||||
1. 安装包:ChatLab-Setup-1.0.0.exe
|
||||
2. 授权码:CL-2026-XXXX-XXXXXX-XXXXXX
|
||||
```
|
||||
|
||||
客户操作:
|
||||
|
||||
```text
|
||||
1. 安装软件
|
||||
2. 打开软件
|
||||
3. 输入授权码
|
||||
4. 点“激活并进入”
|
||||
5. 软件自动连接你的授权服务器
|
||||
6. 激活成功后绑定当前电脑
|
||||
```
|
||||
|
||||
客户第一次激活成功后,这个授权默认绑定这台电脑。
|
||||
|
||||
---
|
||||
|
||||
### 9.3 你给客户的话术
|
||||
|
||||
可以直接复制:
|
||||
|
||||
```text
|
||||
您好,这是 ChatLab 安装包和授权码。
|
||||
|
||||
安装后打开软件,输入授权码即可在线激活。
|
||||
首次激活会绑定当前电脑。
|
||||
如果后续更换电脑,请联系我处理换机。
|
||||
授权期内包含软件维护、问题修复和基础使用支持。
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 10. 离线授权怎么做
|
||||
|
||||
离线授权只建议作为备用方案。
|
||||
|
||||
适合这些情况:
|
||||
|
||||
```text
|
||||
客户公司网络拦截你的授权服务器
|
||||
客户电脑不能访问外网
|
||||
客户临时无法联网激活
|
||||
```
|
||||
|
||||
不建议默认给客户一年离线授权。
|
||||
建议:
|
||||
|
||||
```text
|
||||
普通离线授权:30 天或 90 天
|
||||
非常稳定客户:180 天
|
||||
一年离线授权谨慎使用
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 10.1 客户先复制离线请求码
|
||||
|
||||
客户打开软件后:
|
||||
|
||||
```text
|
||||
1. 点“离线授权”
|
||||
2. 复制“离线请求码”
|
||||
3. 发给你
|
||||
```
|
||||
|
||||
离线请求码通常是一长串字符,例如:
|
||||
|
||||
```text
|
||||
eyJsaWNlbnNlX2tleSI6IiIsImRldmljZV9maW5nZXJwcmludF9zaGEyNTYiOi...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 10.2 你生成离线授权文件
|
||||
|
||||
在服务器或你的授权管理电脑上执行:
|
||||
|
||||
```bash
|
||||
cd /opt/chatlab-license-server
|
||||
. .venv/bin/activate
|
||||
```
|
||||
|
||||
生成 90 天离线授权:
|
||||
|
||||
```bash
|
||||
python admin_cli.py offline-grant \
|
||||
--license-key "CL-2026-XXXX-XXXXXX-XXXXXX" \
|
||||
--request-code "客户发来的离线请求码" \
|
||||
--days 90 \
|
||||
--output customer.chatlab-license
|
||||
```
|
||||
|
||||
如果你在 Windows PowerShell 里执行,可以写成一行:
|
||||
|
||||
```powershell
|
||||
python .\admin_cli.py offline-grant --license-key "CL-2026-XXXX-XXXXXX-XXXXXX" --request-code "客户发来的离线请求码" --days 90 --output customer.chatlab-license
|
||||
```
|
||||
|
||||
注意:
|
||||
|
||||
```text
|
||||
--license-key 后面必须是真实授权码
|
||||
不能写 CL-...
|
||||
```
|
||||
|
||||
错误写法:
|
||||
|
||||
```powershell
|
||||
--license-key "CL-..."
|
||||
```
|
||||
|
||||
正确写法:
|
||||
|
||||
```powershell
|
||||
--license-key "CL-2026-C6D0-4A9B22-F1B5B7"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 10.3 把离线授权内容发给客户
|
||||
|
||||
命令成功后,会生成:
|
||||
|
||||
```text
|
||||
customer.chatlab-license
|
||||
```
|
||||
|
||||
打开这个文件,把里面全部内容发给客户。
|
||||
|
||||
客户操作:
|
||||
|
||||
```text
|
||||
1. 打开软件
|
||||
2. 点“离线授权”
|
||||
3. 把你发的授权内容粘贴进去
|
||||
4. 点“导入离线授权”
|
||||
5. 成功后进入系统
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 11. 联网授权和离线授权怎么选
|
||||
|
||||
建议你这样定规则:
|
||||
|
||||
```text
|
||||
默认使用联网授权
|
||||
客户网络有限制时,再使用离线授权
|
||||
```
|
||||
|
||||
推荐策略:
|
||||
|
||||
| 场景 | 用哪种 |
|
||||
|---|---|
|
||||
| 普通客户电脑能联网 | 联网授权 |
|
||||
| 客户需要年费续费 | 联网授权 |
|
||||
| 客户可能换电脑 | 联网授权 |
|
||||
| 客户公司限制外网 | 离线授权 |
|
||||
| 客户临时无法访问授权服务器 | 离线授权 |
|
||||
| 试用客户 | 联网授权,或短期离线授权 |
|
||||
|
||||
---
|
||||
|
||||
## 12. 常见错误和处理方法
|
||||
|
||||
### 12.1 connect ECONNREFUSED
|
||||
|
||||
错误类似:
|
||||
|
||||
```text
|
||||
connect ECONNREFUSED 127.0.0.1:8787
|
||||
```
|
||||
|
||||
意思是:
|
||||
|
||||
```text
|
||||
软件找不到授权服务
|
||||
```
|
||||
|
||||
常见原因:
|
||||
|
||||
```text
|
||||
1. 授权服务没启动
|
||||
2. 软件里的授权地址还是 127.0.0.1
|
||||
3. 客户电脑访问不到你的服务器
|
||||
4. 域名或 HTTPS 没配置好
|
||||
```
|
||||
|
||||
处理:
|
||||
|
||||
```text
|
||||
1. 浏览器打开 https://license.你的域名.com/health
|
||||
2. 确认返回 {"ok":true}
|
||||
3. 检查 electron-launcher/license-config.json
|
||||
4. 修改后重新打包安装包
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 12.2 授权密钥不存在
|
||||
|
||||
错误类似:
|
||||
|
||||
```text
|
||||
KeyError: '授权密钥不存在。'
|
||||
```
|
||||
|
||||
常见原因:
|
||||
|
||||
```text
|
||||
1. 你用了 CL-... 这种占位符
|
||||
2. 授权码输错
|
||||
3. 你连的是另一份授权数据库
|
||||
4. 这个客户授权还没有创建
|
||||
```
|
||||
|
||||
处理:
|
||||
|
||||
```text
|
||||
先创建真实授权码,再生成离线授权。
|
||||
```
|
||||
|
||||
创建授权码:
|
||||
|
||||
```bash
|
||||
python admin_cli.py create-license --customer-name "客户名称" --days 365
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 12.3 授权签名校验失败
|
||||
|
||||
意思是:
|
||||
|
||||
```text
|
||||
客户软件验不过授权文件
|
||||
```
|
||||
|
||||
常见原因:
|
||||
|
||||
```text
|
||||
1. 客户改过授权文件
|
||||
2. 服务器私钥和客户端公钥不是一对
|
||||
3. 你换了服务器私钥,但没有重新打包客户端
|
||||
```
|
||||
|
||||
处理:
|
||||
|
||||
```text
|
||||
1. 不要让客户手动改授权文件
|
||||
2. 确保服务器私钥和客户端公钥匹配
|
||||
3. 换密钥后重新打包客户安装包
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 12.4 授权文件不属于当前电脑
|
||||
|
||||
意思是:
|
||||
|
||||
```text
|
||||
这个离线授权是给另一台电脑生成的
|
||||
```
|
||||
|
||||
处理:
|
||||
|
||||
```text
|
||||
让客户在当前电脑重新复制离线请求码
|
||||
你重新生成离线授权文件
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 13. 你每天真实销售时怎么操作
|
||||
|
||||
### 联网授权客户
|
||||
|
||||
```text
|
||||
1. 客户付款或试用
|
||||
2. 你在服务器创建授权码
|
||||
3. 你发安装包和授权码
|
||||
4. 客户安装并输入授权码
|
||||
5. 软件自动激活并绑定电脑
|
||||
6. 你记录客户信息和到期时间
|
||||
```
|
||||
|
||||
### 离线授权客户
|
||||
|
||||
```text
|
||||
1. 客户付款或试用
|
||||
2. 你创建授权码
|
||||
3. 客户复制离线请求码发给你
|
||||
4. 你生成 customer.chatlab-license
|
||||
5. 客户导入离线授权
|
||||
6. 你记录离线授权到期时间
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 14. 建议你的客户记录表
|
||||
|
||||
你可以建一个 Excel,字段如下:
|
||||
|
||||
```text
|
||||
客户名称
|
||||
联系人
|
||||
微信
|
||||
电话
|
||||
授权码
|
||||
授权类型:联网 / 离线
|
||||
购买日期
|
||||
到期日期
|
||||
离线授权到期日期
|
||||
绑定电脑备注
|
||||
是否已安装
|
||||
是否已培训
|
||||
备注
|
||||
```
|
||||
|
||||
这样续费、换机、售后会清楚很多。
|
||||
|
||||
---
|
||||
|
||||
## 15. 最推荐的正式流程
|
||||
|
||||
最终建议你采用这个流程:
|
||||
|
||||
```text
|
||||
1. 授权服务部署到公网服务器
|
||||
2. 域名使用 HTTPS
|
||||
3. electron-launcher/license-config.json 改成公网授权地址
|
||||
4. 重新打包安装包
|
||||
5. 普通客户使用联网授权
|
||||
6. 特殊客户使用离线授权
|
||||
7. 离线授权尽量给 30 天或 90 天
|
||||
8. 私钥只放服务器,不发给客户
|
||||
```
|
||||
|
||||
一句话总结:
|
||||
|
||||
```text
|
||||
正式销售用联网授权,离线授权只做备用。
|
||||
改完授权域名后,用 build-desktop.ps1 重新打包,再把 release 里的安装包发给客户。
|
||||
```
|
||||
Reference in New Issue
Block a user