Files
pangolin/deploy/single-node/seed-node.sql.tmpl
T
wangjia 912a495e91 feat(deploy): 单节点全套部署脚本 deploy/single-node(档 3 真机准备)
一台全新 Ubuntu/Debian VPS 上一条命令起整套 pangolin:MySQL + Redis(docker)
+ 控制面(HTTP + gRPC agent 服务)+ 节点 agent + sing-box 数据面,客户端连该
VPS 公网 IP 真实出网。

- deploy.sh:幂等编排——构建二进制 → docker MySQL/Redis → 生成 JWT/webhook/
  derive 密钥 + Node CA + CA 签发的 gRPC server 证书(SAN localhost,匹配 agent
  enroll 后的 mTLS 校验)+ REALITY 密钥对(持久化跨重部署)→ migrate + seed 节点
  → 起控制面(走完整 gRPC 分支)→ nodectl bootstrap-token → 起 agent + sing-box。
- systemd/{pangolin-server,pangolin-agent,sing-box}.service、docker-compose.yml
  (MySQL/Redis 仅 loopback)、seed-node.sql.tmpl。
- README.md:架构图 + 部署/验证步骤 + 客户端接线(API URL / PANGOLIN_SINGBOX_BIN
  / sudoers / 真节点 uuid,客户端代码无改动)+ 排查指引。

本机验证:shellcheck + bash -n 通过;openssl CA ↔ mtls.NewCA + gRPC 证书链互通
已单测实测通过。VPS 端到端(出口 IP == VPS IP)待真机到位后执行。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 00:32:47 +08:00

29 lines
1.2 KiB
Cheetah

-- Single-node seed: 1 provider + 1 status='up' node, so GET /v1/nodes returns
-- this box and the client can connect to it. Placeholders (__VAR__) are filled
-- by deploy.sh from the generated REALITY keypair + the VPS public IP.
--
-- Idempotent: fixed uuid, delete-then-insert so re-running deploy.sh refreshes
-- the row without duplicating it. The REALITY keys MUST stay stable across
-- re-deploys (deploy.sh persists them in /etc/pangolin/reality.env) or already
-- issued client configs would break.
DELETE FROM nodes WHERE uuid = '__NODE_UUID__';
DELETE FROM providers WHERE name = 'single-node';
INSERT INTO providers (name, api_kind, regions, pool, enabled)
VALUES ('single-node', 'manual', '["__REGION__"]', 'consumable', TRUE);
INSERT INTO nodes
(uuid, region, name_zh, name_en, role, tier, endpoint, hy2_port,
reality_pbk, reality_prk, reality_short_id, reality_sni, provider_id, status, weight)
VALUES (
'__NODE_UUID__',
'__REGION__', '__NAME_ZH__', '__NAME_EN__',
'exit', 'free',
'__ENDPOINT__', __HY2_PORT__,
'__REALITY_PBK__', '__REALITY_PRK__', '__REALITY_SHORT_ID__',
'__REALITY_SNI__',
(SELECT id FROM providers WHERE name = 'single-node' LIMIT 1),
'up', 100
);