Files
sincos.cc-website/deploy/DEPLOY.md
T

286 lines
8.9 KiB
Markdown
Raw 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.
# SinCos 聚合站部署手册(详细版)
- 服务器:`124.220.63.9`(1Panel + OpenResty + Python)
- 域名:`sincos.cc`(腾讯云备案,已解析 A 记录 → 124.220.63.9)
- 站点形态:单站 FastAPI(:8003),根路径 = 科技首页(产品矩阵 + 研究 + 最新文章),其余为子页面
## 目录结构
```
website/ ← 整个目录上传到服务器 /opt/website
├─ main.py FastAPI 主程序
├─ license.py MAC→LIC 算法
├─ requirements.txt 依赖清单
├─ run.sh 启动脚本
├─ static/ 前端(首页/研究/工具/License/资源中心/博客/管理后台)
└─ data/ 运行时数据(自动创建)
├─ requests/*.txt 申请记录(DokuWiki 式)
├─ licenses/*.lic 生成的授权文件
└─ packages/ ★ 资源包(把真实资源包 zip 放这里)
```
---
## 全新重部署(清空 /opt/website)
> 适用于:网站目录全部推倒重来,服务器上其它服务(Gitea / Research Digest / Engineer Craft 等)不受影响。
> ⚠️ 清空前**必须备份运行时数据**,否则申请记录、已生成的授权文件、资源包全部丢失。
### 0. 备份数据(强制)
```bash
tar czf /root/website-backup-$(date +%F).tar.gz /opt/website/data
# 建议再拉回本地一份:
# scp root@124.220.63.9:/root/website-backup-*.tar.gz ./
```
### 1. 停止服务
1Panel → 进程守护 → `reslib` → 停止
### 2. 清空旧目录
```bash
rm -rf /opt/website
```
### 3. 上传并解压新包
本地使用 `dist/sincos.cc-deploy-YYYYMMDD.zip`(含 `website/` 与 `DEPLOY.md`):
- 1Panel → 文件 → `/opt` → 上传 → 解压;或
- scp 后执行 `cd /opt && unzip -o sincos.cc-deploy-YYYYMMDD.zip -d /opt/`
得到全新的 `/opt/website/`。
### 4. 恢复运行时数据
```bash
tar xzf /root/website-backup-$(date +%F).tar.gz -C /
mkdir -p /opt/website/data/{requests,licenses,packages}
```
确认三个目录都在:`/opt/website/data/requests`、`licenses`、`packages`。
### 5. 安装依赖
```bash
pip3 install -r /opt/website/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
```
### 6. 确认管理密码
- 新包内 `website/.env` 已带 `RESLIB_ADMIN_PASSWORD=ds3317210`;
- 若 1Panel 进程守护里配置了同名环境变量,**环境变量优先**,需在 1Panel 里同步改成新密码。
### 7. 启动服务
1Panel → 进程守护 → `reslib` → 启动(如已删除则重新创建):
- 运行目录:`/opt/website`
- 启动命令:`uvicorn main:app --host 0.0.0.0 --port 8003`
- 环境变量:`RESLIB_ADMIN_PASSWORD=ds3317210`(可选,与 .env 二选一)
- 开机自启:开
### 8. 验收
```bash
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8003/
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8003/license/
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8003/tools/
```
浏览器验证:
| 地址 | 预期 |
|---|---|
| `https://sincos.cc/` | 新科技首页 |
| `https://sincos.cc/tools/` | 工具矩阵 + 界面实录 |
| `https://sincos.cc/research/neural/` | NeuralMix v2.0(含图表) |
| `https://sincos.cc/license/` | License 中心 |
| `https://sincos.cc/admin` | 用新密码 `ds3317210` 登录 |
### 9. 资源包
原 `data/packages/` 里的资源包已随备份恢复;若备份中没有,需重新上传真实资源包文件。
---
## 第一步:准备本地文件(常规更新)
1. 优先直接使用 `dist/sincos.cc-deploy-YYYYMMDD.zip`(干净包:含 website/、.env、DEPLOY.md,不含 data/)
2. 或手动把 `website/` 打成 zip(只打包目录本身,不含外层、不含 data/ 与 __pycache__/)
---
## 第二步:上传到服务器
**方式 A:1Panel 网页上传**
1Panel → 文件 → 进入 `/opt` → 上传 `website.zip` → 右键解压 → 得到 `/opt/website/`
**方式 B:scp 命令行**
```bash
scp dist\sincos.cc-deploy-YYYYMMDD.zip root@124.220.63.9:/opt/
# 服务器上:cd /opt && unzip -o sincos.cc-deploy-YYYYMMDD.zip -d /opt/
```
---
## 第三步:服务器安装依赖
SSH 登录服务器后执行:
```bash
# 确认 python 版本(1Panel 环境一般自带 python3)
python3 --version
# 安装依赖
pip3 install -r /opt/website/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
```
若提示 pip3 不存在,用 `python3 -m pip install -r /opt/website/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple`
---
## 第四步:设置管理密码并启动
**方式 A(推荐):1Panel 进程守护(图形化)**
1. 1Panel → 应用商店 → 安装 **进程守护**(Process Supervisor)
2. 1Panel → 进程守护 → 创建:
- 名称:`reslib`
- 运行用户:`root`
- 运行目录:`/opt/website`
- 启动命令:`uvicorn main:app --host 0.0.0.0 --port 8003`
- 环境变量:`RESLIB_ADMIN_PASSWORD=你的强密码`(管理后台密码,务必修改)
- 开机自启:开
3. 创建后进程状态为"运行中"即成功
**方式 B:1Panel Python 项目(图形化)**
1Panel → 网站 → 创建网站 → 选择 **Python 项目**:
- 运行环境:选择已装的 Python
- 项目路径:`/opt/website`
- 启动命令:`uvicorn main:app --host 0.0.0.0 --port 8003`
- 环境变量:`RESLIB_ADMIN_PASSWORD=你的强密码`
**方式 C:临时测试**
```bash
cd /opt/website && RESLIB_ADMIN_PASSWORD="你的强密码" python3 -m uvicorn main:app --host 0.0.0.0 --port 8003
```
验证服务已监听:
```bash
curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8003/
# 应返回 200
```
---
## 第五步:1Panel 建站(反代)
1Panel → 网站 → 创建网站 → **反向代理**:
- 主域名:`sincos.cc`
- 其他域名:留空(不需要 www)
- 代理地址:`http://127.0.0.1:8003`
- 创建
然后 网站 → 选中 sincos.cc → **网站** → 确认 OpenResty 已启用(反向代理自动走 OpenResty)。
---
## 第六步:HTTPS 证书
1Panel → 网站 → sincos.cc → **HTTPS** → 申请证书:
- 类型:Let's Encrypt(推荐,自动续期)
- 勾选:强制 HTTPS、自动续期
- 申请成功后站点即带 https://
> 备案域名证书申请无特殊要求。若 Let's Encrypt 连不上,可改用腾讯云免费证书(DNSPod 申请 → 上传证书)。
---
## 第七步:防火墙放行
1Panel → 安全 → 防火墙:
- 放行端口:`80`、`443`(8003 不需要对外开放,只在服务器内网访问)
- 若之前有其他站点端口(30000/10000 等)保持原状
---
## 第八步:上线验证
| 地址 | 预期 |
|---|---|
| `https://sincos.cc/` | 科技首页(Hero + 研究平台 + 工具矩阵 + 最新文章) |
| `https://sincos.cc/research/` | 前沿技术研究聚合页 |
| `https://sincos.cc/tools/` | 工具开发产品页(6 个产品独立介绍页) |
| `https://sincos.cc/license/` | License 中心(申请 / 查询下载 / 资源包) |
| `https://sincos.cc/license/apply` | License 申请(MAC 输入) |
| `https://sincos.cc/license/status` | 查询/下载 |
| `https://sincos.cc/license/package` | 资源包获取(仅 approved) |
| `https://sincos.cc/resources/` | 资源中心(私有服务入口) |
| `https://sincos.cc/blog/` | 文章列表 |
| `https://sincos.cc/admin` | 管理后台(密码 = 第四步设置的) |
---
## 第九步:数据目录初始化
```bash
mkdir -p /opt/website/data/{requests,licenses,packages}
```
- `packages/` 放入真实资源包文件(zip 等),文件名即展示给用户的名字
- `requests/`、`licenses/` 由系统自动写入
---
## 日常维护
**写博客**
```powershell
# 本地
# 1. 新建 blog\posts\2026-xx-xx-标题.md(front matter: title/date/tags)
# 2. 构建
python -X utf8 blog\build.py
# 3. 将 website\static\home.html、about.html、blog\ 目录 上传覆盖到服务器 /opt/website/static/
```
**备份**(每周):备份 `/opt/website/data/` 目录即可(申请记录 + 授权文件)
```bash
tar czf /root/reslib-backup-$(date +%F).tar.gz /opt/website/data
```
**查看日志**
```bash
# 1Panel 进程守护 → reslib → 日志
```
**重启服务**
```bash
# 1Panel 进程守护 → reslib → 重启(或先停后启)
```
---
## 常见问题
| 问题 | 处理 |
|---|---|
| 80/443 访问超时 | 检查防火墙放行、1Panel 网站状态 |
| 反代 502 | `curl http://127.0.0.1:8003/` 检查后端是否在跑;1Panel 进程守护查看 reslib 状态 |
| 证书申请失败 | 确认 DNS A 记录解析完成且 80 端口可访问 |
| 申请提交后 txt 乱码 | 确认服务器 `python3` 默认编码 UTF-8(正常不会) |
| 忘记管理密码 | SSH 执行 `export RESLIB_ADMIN_PASSWORD=新密码` 后重启服务 |
## 待办清单
- [ ] 上传 website/ 到服务器
- [ ] 安装依赖
- [ ] 设置 RESLIB_ADMIN_PASSWORD
- [ ] 启动服务并 curl 验证 200
- [ ] 1Panel 建反代站 + SSL
- [ ] 防火墙放行 80/443
- [ ] 放真实资源包到 data/packages/
- [ ] 全站访问验证