feat(single-node): 改 SQLite + 非特权 pangolin 用户 + 免 Docker(512MB 可跑)
ci-pangolin / Lint — shellcheck (push) Has been cancelled
ci-pangolin / OpenAPI Sync Check (push) Has been cancelled
ci-pangolin / Redline Scan — 脱敏 (UI 文案) (push) Has been cancelled
ci-pangolin / Flutter — analyze + test (push) Has been cancelled

为小内存机收尾单机栈,已在 racknerd(107.172.55.251)实跑验证通过:
- 数据库:MySQL(docker)→ SQLite 文件(DB_DRIVER=sqlite);Redis 改 apt 原生
  (免 Docker);依赖 redis-server/sqlite3/polkitd/sing-box 由 deploy.sh 自动装
- 运行身份:三 systemd 单元 User=root → User=pangolin;sing-box 经
  AmbientCapabilities 绑 443;新增 polkit 规则让 pangolin 仅可重启 sing-box
- 二进制:支持预置(机上无 go 时用交叉编译产物;SQLite 纯 Go 免 CGO)
- 端口:REALITY 默认 443/tcp(对齐 bootstrap 防火墙);deploy.sh 放行 8080/tcp
- 修 sing-box.service:ExecStart 按实际安装路径渲染(官方 .deb 在 /usr/bin)
- Hy2 默认关闭:控制面尚未下发 Hy2 TLS 证书(handler_grpc.go 仅发 ListenPort)
  → 开启会 missing certificate;待补全证书后传 HY2_PORT=443 开启
- 删 docker-compose.yml;seed TRUE→1;README 同步

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-06-18 07:46:54 +08:00
parent 1d76c00f66
commit 5d90610649
8 changed files with 181 additions and 181 deletions
+27 -12
View File
@@ -1,10 +1,11 @@
# 单节点全套部署(档 3 真实连接)
# 单节点全套部署(真实连接,SQLite + 非特权用户
一台全新 Ubuntu/Debian VPS 上跑 **整套** pangolinMySQL + Redis + 控制面HTTP
API + gRPC agent 服务)+ 节点 agent + sing-box 数据面。客户端连这台 VPS 的公网
IP真实出网(出口 IP = VPS IP)。
一台全新 Debian 12 VPS 上跑 **整套** pangolin**SQLite(文件)+ Redisapt** + 控制面
HTTP API + gRPC agent 服务)+ 节点 agent + sing-box 数据面**全部以非特权 `pangolin`
用户运行,免 Docker**。客户端连这台 VPS 的公网 IP,真实出网(出口 IP = VPS IP)。
> 不碰 EC2 生产、不用本机出网。这套是独立的端到端验证环境
> 为小内存机(512MB)调优:SQLite 取代 MySQL、apt 原生 Redis 取代 docker 容器
> 配合 `deploy/bootstrap/`(系统加固/防火墙/监控)使用。
## 架构(一台机器内)
@@ -19,23 +20,37 @@ IP,真实出网(出口 IP = VPS IP)。
│ │ connect → Hub.Push(Upsert dp_uuid) │
│ ▼ (gRPC Subscribe 命令流, mTLS) │
│ pangolin-agent ── 渲染 sing-box SERVER 配置 → systemctl restart │
│ ▼
│ sing-box VLESS+REALITY :11443 (+ Hysteria2 :443) → 直连出网
MySQL :3306 (loopback) Redis :6379 (loopback) [docker]
│ ▼ (polkit 规则允许 pangolin 仅重启 sing-box)
│ sing-box VLESS+REALITY :443/tcp → 直连出网
│ SQLite /var/lib/pangolin/pangolin.db Redis :6379 (apt, loopback) │
└─────────────────────────────────────────────────────────────────┘
(三服务均 User=pangolin;sing-box 经 AmbientCapabilities 绑 443
```
> ⚠️ **Hy2 默认关闭**:控制面尚未接线 Hy2 的 TLS 证书下发(`handler_grpc.go` 只发
> ListenPort,不发 CertPath/KeyPath),开启会导致 sing-box `missing certificate`。
> 待补全证书下发后,传 `HY2_PORT=443` 开启。当前数据面=REALITY(443/tcp)。
凭证天然自洽:connect 给客户端的 REALITY `uuid = dp_uuid`、Hy2 `password =
DeriveHy2Password(dp_uuid, NODE_DERIVE_KEY)`agent 渲染 server 配置时用 **同一**
`NODE_DERIVE_KEY` 和 dp_uuid,两端一致。
## 部署VPS 上一条命令)
## 部署
前置root、`docker`(含 compose v2)、`openssl``go``sing-box`(脚本会尝试自动装
前置:root、`openssl``redis-server`/`sqlite3`/`polkitd`/`sing-box` 由 deploy.sh 自动装。
二进制:机上有 `go` 则就地构建;**512MB 机器推荐别处交叉编译后预置**(无需机上装 Go):
```bash
# 1. 把仓库 checkout 到 VPSgit clone 或 scp
# 2. 一键起全套(VPS_IP 不传则自动探测公网 IP)
# 在开发机交叉编译(SQLite 纯 Go,免 CGO),scp 到 VPS 的 /usr/local/bin/
cd server && for c in server agent nodectl migrate; do
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /tmp/p-$c ./cmd/$c
done
scp /tmp/p-server <vps>:/usr/local/bin/pangolin-server
scp /tmp/p-agent <vps>:/usr/local/bin/pangolin-agent
scp /tmp/p-migrate <vps>:/usr/local/bin/pangolin-migrate
scp /tmp/p-nodectl <vps>:/usr/local/bin/nodectl
# scp 本目录到 VPS 的 <repo>/deploy/single-node/,再一键起(VPS_IP 不传则自动探测)
sudo VPS_IP=<你的公网IP> bash deploy/single-node/deploy.sh
```