70 lines
4.6 KiB
Markdown
70 lines
4.6 KiB
Markdown
# 生产部署(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 为缺失文件创建的默认配置当成验收结果。与部署前候选比对时使用同一最新生产快照。
|