# 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/ 前端(首页/博客/ResLib/申请/查询/资源包/管理后台) └─ data/ 运行时数据(自动创建) ├─ requests/*.txt 申请记录(DokuWiki 式) ├─ licenses/*.lic 生成的授权文件 └─ packages/ ★ 资源包(把真实资源包 zip 放这里) ``` --- ## 第一步:准备本地文件 1. 打包本地 `website/` 目录为 `website.zip`(只打包目录本身,不含外层) --- ## 第二步:上传到服务器 **方式 A:1Panel 网页上传** 1Panel → 文件 → 进入 `/opt` → 上传 `website.zip` → 右键解压 → 得到 `/opt/website/` **方式 B:scp 命令行** ```bash scp -r D:\黑奴编程\网站\website root@124.220.63.9:/opt/website ``` --- ## 第三步:服务器安装依赖 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/` | 博客首页(从数学出发 + 平台卡片 + 最新文章) | | `https://sincos.cc/blog/` | 文章列表 | | `https://sincos.cc/reslib/` | ResLib 产品介绍 | | `https://sincos.cc/reslib/apply` | License 申请(MAC 输入) | | `https://sincos.cc/reslib/status` | 查询/下载 | | `https://sincos.cc/reslib/package` | 资源包获取(仅 approved) | | `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/ - [ ] 全站访问验证