Files
get_wechat/license_server/正式上线打包与授权流程.md

778 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 里的安装包发给客户。
```