# 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/ - [ ] 全站访问验证