Files
pangolin/deploy/bootstrap/README.md
T
wangjia ff9a40277d feat(deploy/bootstrap): 节点幂等初始化脚本(加固+pangolin用户+监控+防火墙)
全新 Debian 12 一键初始化,后续新机复用。四块:
- 系统:apt 升级+基础包(含 python3-systemd)、时区、swap 补足、sysctl(BBR/fq/句柄/队列)
- Pangolin:建 pangolin 非特权系统用户(/var/lib/pangolin, nologin)
- 网络安全:ufw 默认拒入站、放行 SSH+443(tcp/udp);fail2ban sshd jail
  (精简 Debian 无 rsyslog/auth.log → backend=systemd 读 journald)
- SSH 加固:root 仅密钥、可选禁密码(仅当已有 authorized_keys 时生效,防锁死)
- 监控:pangolin-monitor(systemd timer,CPU/内存/磁盘/进程/出网 → Telegram,
  异常+心跳);deadman-watch(EC2 侧主动探活,补"宕机/不上报"告警)

已在 racknerd(107.172.55.251)实跑验证全部步骤通过。密钥/真实配置 gitignore。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 01:30:55 +08:00

69 lines
3.0 KiB
Markdown

# 节点初始化(bootstrap)
全新 Debian 12 机器的**幂等**一键初始化。后续每台新机器照同样流程跑即可。
覆盖四块:① 系统加固 ② Pangolin 运行环境 ③ Telegram 监控 ④ 网络安全。
## 一、目标机上跑(本地)
```bash
cp bootstrap.env.example bootstrap.env
vi bootstrap.env # 按需改;要监控就填 TELEGRAM_BOT_TOKEN / CHAT_ID
sudo bash init.sh
```
## 二、从本机远程跑(已配 ssh 免密别名,推荐)
```bash
# 前提:已 ssh-copy-id,~/.ssh/config 里有该机别名(如 racknerd)
rsync -az deploy/bootstrap/ racknerd:/root/bootstrap/
ssh racknerd 'cd /root/bootstrap && bash init.sh'
```
`init.sh` 幂等,可反复跑(改了 bootstrap.env 后重跑即生效)。
## init.sh 做了什么
| 步 | 内容 |
|----|------|
| ① 系统 | `apt upgrade` + 基础包(ufw/fail2ban/chrony/curl/jq…);时区;**swap**(不足则建 `/swapfile` 补到 `SWAP_SIZE_MB`);sysctl(**BBR**/fq/文件句柄/连接队列) |
| ② 环境 | 建 **`pangolin` 非特权系统用户**(`/var/lib/pangolin`, nologin) |
| ④ 防火墙 | `ufw` 默认拒入站;放行 SSH + `443/tcp`(REALITY)+ `443/udp`(Hy2);其余拒绝 |
| ④ 暴破 | `fail2ban` sshd jail |
| ① SSH | drop-in 加固:`root` 仅密钥、`MaxAuthTries`、可选**禁密码登录** |
| ③ 监控 | 装 `pangolin-monitor` + systemd timer,定期经 Telegram 上报 |
### 🔒 防锁死红线
禁用密码登录(`DISABLE_PASSWORD_AUTH=true`)**仅当 `/root/.ssh/authorized_keys` 非空时才生效**;
否则自动保留密码登录并告警。所以**先 `ssh-copy-id` 再跑**,或确保公钥已装。
## 监控(③ 的细节)
- **节点侧**`pangolin-monitor`(本机 systemd timer,每 `MONITOR_INTERVAL_MIN` 分钟):
采 CPU/内存/磁盘、受监控 systemd 单元存活(`MONITOR_UNITS`)、出网连通;
**越界/掉线/断网 → 🔴 必报;正常 → 🟢**(心跳是否推送由 `MONITOR_SEND_OK_PULSE` 控制)。
- **死信(不上报/宕机)**:节点宕了自己报不了,需在**常在线主机(EC2)**跑 `deadman-watch.sh`
主动探活补这层:
```bash
# 在 EC2 上
sudo install -m 755 deploy/bootstrap/monitor/deadman-watch.sh /usr/local/bin/deadman-watch
sudo cp deploy/bootstrap/deadman.env.example /etc/pangolin-deadman.env && sudo vi /etc/pangolin-deadman.env
# 每 3 分钟探一次(用户 cron 即可,无需 root)
( crontab -l 2>/dev/null; echo '*/3 * * * * /usr/local/bin/deadman-watch >/dev/null 2>&1' ) | crontab -
```
节点端口连续失败到阈值 → 🔴 告警;恢复 → 🟢 通知。
## 文件
| 文件 | 说明 |
|------|------|
| `init.sh` | 主初始化(幂等) |
| `bootstrap.env.example` | 配置模板(SSH/swap/防火墙/Telegram) |
| `monitor/pangolin-monitor.sh` | 节点自监控上报 |
| `monitor/pangolin-monitor.{service,timer}` | systemd(timer 的 `__INTERVAL__` 由 init.sh 渲染) |
| `monitor/deadman-watch.sh` | EC2 侧死信探活 |
| `deadman.env.example` | 死信守望配置模板 |
密钥类(`bootstrap.env`、`/etc/pangolin-monitor.env`、`/etc/pangolin-deadman.env`)**不入 git**。