Files
proxy-station/docs/DEPLOY.md

70 lines
4.6 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.

# 生产部署(LA 节点,无 Docker)
服务器资源有限(1 核/1.9G),采用 Node 直跑 + systemd 守护,前端在本机构建后由服务端静态托管,反向代理与证书由 aaPanel 管理。
本文描述 Proxy Station 应用发布。边缘 VPS 的部署、重建与协议维护已合入本仓库,见 [节点工作区](../edge-nodes/README.md) 与 `edge-node-multi-protocol` 技能;其私有资料不随应用部署上传。LA 同时承载节点与本应用,维护 nginx、证书或 WARP 时需核对共享服务影响。
当前配置与变更接续入口见 [生产状态](CURRENT-STATE.md)。应用部署只更新代码/产物,不重置生产数据库,不恢复已停用节点,也不自动修改客户端的活动配置与保存选择。
## 拓扑
```
客户端 ──HTTPS──▶ nginx(aaPanel 站点 ps.la.njcqtechaicoding.com,泛域名证书)
└─ proxy_pass http://127.0.0.1:3000 ──▶ proxy-station(systemd,用户 proxy-station)
```
| 项目 | 位置 |
|---|---|
| 代码 | `/opt/proxy-station`(含 `web/dist` 构建产物,无 `web/src`) |
| 数据库 | `/opt/proxy-station/data/proxy-station.db` |
| 环境变量 | `/etc/proxy-station/env`(`PORT`/`DATA_DIR`/`ADMIN_TOKEN`,权限 600) |
| 服务 | `systemctl status proxy-station`,日志 `journalctl -u proxy-station -f` |
| nginx 站点 | aaPanel 站点 `ps.la.njcqtechaicoding.com`,反代配置在 `/www/server/panel/vhost/nginx/proxy/<域名>/` |
| 证书 | `/www/server/panel/vhost/cert/<域名>/`,由 acme.sh 续期钩子统一复制 |
`ADMIN_TOKEN` 在 Web 界面「设置」页填入,存于浏览器 localStorage。
## 更新代码
日常更新用 Codex/Claude Code 共用的项目级技能 `deploy`(说「部署」即可匹配;也可分别用 `$deploy`/`/deploy` 显式调用),也可在仓库根目录直接跑脚本:
```bash
bash .claude/skills/deploy/scripts/deploy.sh all # 前后端一起(默认)
bash .claude/skills/deploy/scripts/deploy.sh web # 只换前端产物,不重启
bash .claude/skills/deploy/scripts/deploy.sh server # 只推后端源码,装依赖并重启
```
脚本自带本地 typecheck/单测、tar 管道推送、暂存目录原子换入、健康检查失败自动回滚源码,以及本地与远端的源码树指纹比对与公网校验。细节见 `.claude/skills/deploy/SKILL.md`。
SSH 别名必须用小写 `la`,大写会被当作域名解析。
## 迁移数据库
普通节点、组、规则与设置调整使用 update-db 管理 API,并先做生产 SQLite 在线备份。整库迁移/恢复只属于用户明确授权的相应任务;按技能恢复流程安排停服窗口、回滚备份和后续 HTTPS 验收,不用替库代替定向业务修改。
需要从本机导出时,使用在线备份取得一致副本,文件保存在私有临时目录:
```bash
umask 077
migration_dir="$(mktemp -d /private/tmp/proxy-station-migration.XXXXXX)"
sqlite3 server/data/proxy-station.db ".backup $migration_dir/proxy-station.db"
chmod 600 "$migration_dir/proxy-station.db"
```
远端备份确认 root 属主、600 权限;恢复后的活动数据库属运行用户,保留仅必要的访问权限。不要直接拷贝运行中的主库而漏掉 WAL,也不把含真实凭据的库放进 Git 或共享日志。
## 反向代理注意点
- aaPanel 的反代模板不带 `X-Forwarded-Proto`/`X-Forwarded-Host`,已手工补进反代配置。服务端 `routes/sub.ts` 的 `baseUrl()` 依赖这两个头还原外部地址,缺失时 Surge 的 `#!MANAGED-CONFIG` 与 Clash 的 provider URL 会变成 `http://`。
- 站点通过面板类 `AddSite`/`SetSSL`/`CreateProxy`/`HttpToHttps` 创建(脚本模式见本仓库 `.claude/skills/edge-node-multi-protocol/scripts/09-aapanel-sites.py`),不要手写 vhost,否则面板里看不到。
- 泛域名 `*.la.njcqtechaicoding.com` 的 DNS 已指向服务器,新子域无需单独加记录。
- acme.sh 的 `--reloadcmd` 要把新站点加进复制循环,且证书源路径必须写死(原先引用未定义的 `$SRC`,续期后不会重新部署证书)。
## 验证
```bash
curl -fsS --max-time 10 https://ps.la.njcqtechaicoding.com/api/health
```
部署脚本核对服务状态、源码/前端指纹、公网健康及管理接口鉴权。涉及生成器或 shared 后,还要读取最新节点范围与真实 HTTPS 订阅,按 [订阅验证](SURGE-CHANGES.md)检查 Surge/Clash 及受影响的 Shadowrocket 产物;先确保下载成功及文件非空,不能把 mihomo 为缺失文件创建的默认配置当成验收结果。与部署前候选比对时使用同一最新生产快照。