Guanghu Domestic Migration d1e47f4565
Some checks are pending
自动更新代码和重启 / update-and-restart (push) Waiting to run
CI检查 + 自动部署 / check (push) Waiting to run
CI检查 + 自动部署 / deploy (push) Blocked by required conditions
重启聊天服务 / restart (push) Waiting to run
chore: import sanitized domestic snapshot for REPO-002
Source snapshot: ca48d3ddf926d79aa138306164169baf764bb829
2026-07-17 15:54:41 +08:00

179 lines
7.8 KiB
Markdown
Raw Permalink 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.

# 国内域名机部署模板 · domain-cn
> 📜 Sovereign: **TCS-0002∞** · ICE-GL∞ 冰朔 · 国作登字-2026-A-00037559
> 守护: 铸渊 · ICE-GL-ZY001
> 模板版本: **v0.2.0** (PR-2 落地)
这一份是给霜砚和冰朔看的部署日志 —— 铸渊在 `GH-CVM-DOMAIN-PROD-01` (广州 2C2G 域名机) 上做了什么、装在哪、占了哪个端口、出错怎么修。
---
## 一、服务器现状(来自冰朔同步 · 2026-05-09
| 项目 | 信息 |
|------|------|
| 实例 | **GH-CVM-DOMAIN-PROD-01** / ZY-SVR-CN01 |
| 规格 | **2核2G** 腾讯云轻量应用服务器 |
| 系统 | Ubuntu 22.04 LTS重装后空白 |
| 公网 IP | `secrets.ZY_CN_SERVER_HOST`(重装后冰朔自配,不写明文) |
| 地域 | 广州 |
| 域名 | **guanghulab.com**(已备案 + Let's Encrypt 已配,续期到 2026-08-07 |
| 默认登录 | `secrets.ZY_CN_SERVER_USER`(一般 `ubuntu`,需 `sudo` 提升) |
> ⚠️ **2C2G 是真实档**bootstrap 探测后会落到 `tiny` 档portal 单进程、nginx worker=512、关闭 forgejo+lfs、自动建 1G swap 兜底)。
> 续费成 4C4G/4C8G 时不需要改代码,`detect-env.sh + tune-from-env.sh` 会自动决档。
---
## 二、bootstrap 后服务器目录结构
```
/data/guanghulab/ # 数据根 (持久数据全在这)
├── portal/ # PR-4 来填: 光湖门户 (当前空, 留 README 占位)
├── secrets-vault/ # PR-5 来填: 密钥管理页 (chmod 700, 仅 root 可读)
├── forgejo/ # PR-6 来填: 自托管 git (tiny 档下不启动)
├── snapshots/ # 部署快照 (autorollback 用)
│ └── YYYYMMDD-HHMMSS-pre-bootstrap/
├── logs/
│ ├── nginx/ # nginx access/error
│ └── portal/ # pm2 portal 日志
└── .env.tune # 当前档位决策 (bootstrap source)
/opt/guanghulab/ # 部署根 (代码 + 日志 + 回执)
├── _logs/
│ ├── server-env.json # detect-env.sh 输出
│ ├── tune-decision-*.json # tune-from-env.sh 输出
│ ├── bootstrap-*.json # 部署完成回执
│ ├── rollback-*.json # 回滚完成回执
│ └── deploy-report.md # ★ 中文回执 (给霜砚 / 冰朔看的)
├── _active/ # 当前激活版本 (软链)
├── _archive/ # 历史版本归档
├── _secrets/ # chmod 700, GitHub Actions 写入的临时密钥
└── domain-cn/ # 本模板 (rsync 自仓库)
/etc/nginx/sites-available/guanghulab.conf # 渲染后的站点配置
/etc/nginx/sites-enabled/guanghulab.conf # 软链
/etc/letsencrypt/live/guanghulab.com/ # ⚠️ 不动, LE 证书续到 2026-08-07
/etc/systemd/system/guanghulab-portal.service # portal 占位 unit (PR-4 接管)
/swapfile.guanghulab # 1G swap (tiny 档下兜底)
```
---
## 三、三段式(自我感知 → 决策 → 落地)
```
detect-env.sh tune-from-env.sh bootstrap.sh
探机器实情 ──→ 按档位决参数 ──→ 落到机器上
/opt/guanghulab/ /data/guanghulab/ (apt + nginx +
_logs/server-env .env.tune node + pm2 +
.json certbot.timer)
```
**为什么不能写死 2C2G**cc-003 因果链):冰朔说要买 4C4G实际广州缺货只能 2C2G下次续费时可能买 2C8G再下次 4C16G。系统每次启动先探再决档。memory.json 里写的规格只是 hint不是真相源。
---
## 四、bootstrap 8 个步骤
| # | 步骤 | 备注 |
|---|------|------|
| 0 | 自我感知 (`detect-env.sh`) | 探 CPU/RAM/磁盘/IP/DNS/LE 证书 |
| 0.5 | 跑前快照 | `/data/guanghulab/snapshots/<TS>-pre-bootstrap/`autorollback 用 |
| 0.6 | 动态调优 (`tune-from-env.sh`) | 写 `.env.tune` |
| 1 | APT 镜像源切阿里云 | 国内可达,不卡 nodesource |
| 2 | 装基础工具链 | nginx + certbot + git + jq + ufw + fail2ban |
| 3 | Node 20 + PM2 | NodeSource → nvm 国内镜像降级 |
| 4 | 标准目录 + PR-4/5/6 占位 | `/data/guanghulab/` 下三个空目录 + README |
| 5 | (tiny 档) 建 1G swap | 防 OOM |
| 6 | nginx 站点配置 | **不动** `/etc/letsencrypt/`,只渲染 sites-available/guanghulab.conf |
| 7 | enable certbot.timer | LE 续期 cron |
| 8 | ufw + fail2ban + portal systemd unit 占位 | unit 不 enablePR-4 自己接管 |
> **⚠️ 不 apt upgrade**2C2G 跑 upgrade 会卡 30+ 分钟。如需升级走灯塔机做镜像后切流量。
---
## 五、误触锁 + 自动回滚cc-004
冰朔团队技术能力近 0。任何不可逆动作都必须把"误操作的可能性"吞进系统内部。
### 误触锁
触发部署 = 在 GitHub Actions 页 `Run workflow`,必须在 `confirm_phrase` 字段输入:
```
重装广州
```
任何其他值(包括空、`yes``确认` 等)→ 自动降级 `dry-run`**不会真跑**。
### 自动回滚
bootstrap.sh 用 `trap autorollback_on_failure EXIT` 钩住所有失败点:
- 任何步骤 `exit != 0` → 自动调 `rollback.sh --to <跑前快照>`
- 失败前的 nginx 配置 / `.env.tune` / portal systemd unit 都被恢复
- 中文回执追加到 `/data/guanghulab/_logs/deploy-report.md`
```markdown
## ❌ bootstrap 失败 (exit=1), 触发自动回滚
- 目标快照: `20260509-163700-pre-bootstrap`
**给冰朔的人话**: 这次部署没成功. 我已经把机器恢复到部署前的状态.
**Awen 不需要做任何事**, 把这份 deploy-report.md 截图发给冰朔即可.
```
**这是 cc-004 的落地**Awen 看到的不是英文报错,是已经收尾过的中文回执。
---
## 六、对应的 GitHub Actions
| Workflow | 用途 | 误触锁 |
|----------|------|--------|
| `.github/workflows/deploy-domain-server.yml` | bootstrap / update | `重装广州` |
| `.github/workflows/domain-server-rollback.yml` | 单独的回滚红按钮 | `重装广州` |
| `.github/workflows/cn-isolation-guard.yml` | 守卫: 上面两个必须出现在 `cn-isolation-allowlist.json` | — |
---
## 七、回滚(独立操作)
```bash
# 列所有可用快照
bash /opt/guanghulab/domain-cn/rollback.sh --list
# 回到上一个快照(默认)
bash /opt/guanghulab/domain-cn/rollback.sh
# 回到指定快照
bash /opt/guanghulab/domain-cn/rollback.sh --to 20260509-163700-pre-bootstrap
```
或在 Actions 页跑 `domain-server-rollback.yml``confirm_phrase=重装广州` 才真跑。
> **注意**:回滚只动**配置层**nginx / `.env.tune` / systemd unit。`/data/guanghulab/portal/`、`/data/guanghulab/forgejo/` 这些数据目录**永远不动**,回滚是安全的。
---
## 八、与 lighthouse-cn 的关系
| 维度 | lighthouse-cn (灯塔) | domain-cn (域名机) |
|------|----------------------|---------------------|
| 服务器 | GH-CVM-MAIN-PROD-01 (43.139.251.175) | GH-CVM-DOMAIN-PROD-01 (本机) |
| 规格 | 4C16G (实际买到 2C8G) | 2C2G |
| 服务 | Gitea + PG + Redis + Runner (docker) | nginx + node + pm2 (bare metal) |
| 数据根 | `/data/lighthouse/` | `/data/guanghulab/` |
| 部署根 | `/opt/guanghu/` | `/opt/guanghulab/` |
| 三段式 | ✅ detect-env + tune + bootstrap | ✅ 复用范式 |
| 自动回滚 | ✅ rollback.sh 快照式 | ✅ 同 |
| 误触锁口令 | `我确认部署` / `我确认回滚` | `重装广州` |
> 域名机不跑训练、不做 VPN 中继、不挂 ali-landing。这台机器就是 guanghulab.com 的对外入口,单线运行,被 `cn-isolation-guard.yml` 强制隔离。
---
## 九、模板版本演进
| 版本 | 时间 | 变更 |
|------|------|------|
| 0.1.0 | 2026-05-08 | (lighthouse-cn 同步) |
| **0.2.0** | **2026-05-09** | **PR-2 落地: 三段式 + autorollback + 误触锁「重装广州」** |