Files
blog/infra/gitea/README.md
T
wait4xandGLM-5.3 938558ad4c feat(launch): 热力图与 webhook 发布闭环(T2/T3)
- T2 (op-artalk 车道):gitea heatmap 构建期拉取+fallback+空态三保险,
  53×7 灰阶格复用 tokens(亮暗自动),日界锚定 Asia/Shanghai,零 JS,
  zh/en 首页挂载;fallback 经死端点实测不破构建
- T3:webhook_receiver.py(HMAC 强制+main-only+构建锁)以 systemd
  --user 常驻 13021;gitea hook 注册(events=push, branch=main)
- 三个深坑:gitea 容器回宿主须走桥网关 IP 而非 127.0.0.1;gitea 28
  egress 拦私网须 ALLOWED_HOST_LIST(ALLOWLIST 是废弃名);systemd
  用户服务缺用户 PATH 致 build 静默失败(stamp 不更新即症状)

验证: 测试投递 202→构建→staging 戳更新(09:48:37 实测);
      dist 热力图 376 格真数据(9 次贡献)zh/en 双页

Spec: 2026-10-25_add-blog-launch
Co-authored-by: GLM-5.3
2026-10-25 09:49:19 +08:00

70 lines
3.6 KiB
Markdown
Raw 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.
# gitea 部署(博客代码托管)
博客重建方案中的自建 git 托管后端:容器只绑 `127.0.0.1:13020`,公网经 nginx 反代为
`https://git.wait4x.online/`。本目录是入库快照,宿主实际运行位置为 `~/docker_apps/gitea/`。
## 文件与同步方向
| 文件 | 作用 |
|------|------|
| `docker-compose.yml` | 容器编排(gitea/gitea:28.2.0,UID/GID 1000,restart unless-stopped) |
| `app.ini` | 首启种子配置;密钥(SECRET_KEY/INTERNAL_TOKEN 等)由首启自动生成 |
| `nginx-git.wait4x.online.conf` | nginx 接入**草稿,未安装**(proxy 头写法对齐主站 halo vhost) |
改动流程:先改本目录 → 拷贝到 `~/docker_apps/gitea/` → `docker compose up -d`。
运行时 app.ini 在宿主 `data/gitea/conf/app.ini`,含首启生成的密钥,
**严禁**用本目录快照回覆盖(密钥丢失 = 加密数据不可解密)。
## 初始化凭据(仅初始化用)
- 管理员:`wait4x`;初始密码与 API token 一并存宿主 `~/docker_apps/gitea/init-credentials.txt`
(0600,不入库——本仓库将公开,凭据不进 git 历史),首登修改后删除该文件敏感行
- API token(scopes=all)存宿主 `~/docker_apps/gitea/init-credentials.txt`(0600,不入库),
供后续 webhook/CI 用,可随时在 gitea UI 撤销重建
## 管理命令速查(均在宿主 `~/docker_apps/gitea/` 下执行)
```bash
# 建用户(关注册实例,账号只能这样建)
docker compose exec -u git gitea gitea admin user create --username <u> --email <e>@wait4x.online --random-password
# 建私有空仓(token 从 init-credentials.txt 取)
curl -X POST http://127.0.0.1:13020/api/v1/user/repos \
-H "Authorization: token <TOKEN>" -H 'Content-Type: application/json' \
-d '{"name":"<repo>","private":true,"auto_init":false}'
# 生成新 token
docker compose exec -u git gitea gitea admin user generate-access-token --username <u> --scopes all --raw
# 改密(含管理员自救)
docker compose exec -u git gitea gitea admin user change-password -u <u> -p <新密码>
```
## 数据备份
全部状态在宿主 `~/docker_apps/gitea/data/`:sqlite(`gitea/gitea.db`)、
裸仓(`git/repositories/`)、LFS 与附件(`gitea/data/`)。
sqlite 直接热拷贝会撕裂,备份前 `docker compose down` 或用 `sqlite3 .backup`;
升级前必须先备份。
## 升级
改 compose 里镜像 tag → `docker compose pull` → `up -d`(首启自动迁移 schema,不可降级)。
## 已知坑
- **不要开 `REQUIRE_SIGNIN_VIEW`**:它会把匿名 `/api/v1/version` 一并 403,
而验收与健康检查都裸 curl 该端点;私有性靠 private 仓 + `DISABLE_REGISTRATION` 保证。
- nginx 的 `client_max_body_size 100M`(git push 大 pack)与 app.ini
`FILE_MAX_SIZE=50`(网页上传单文件)是两条独立限制,别混为一谈。
- vhost 草稿未带 websocket Upgrade 头(与 halo 写法一致);若日后 Actions 实时日志
异常,参照 dpanel vhost 补 Upgrade 头——全局 `map $connection_upgrade` 已在
default 里定义,新 vhost 直接引用即可,勿重复定义。
- SSH 通道整体关闭(不映射 22 + `DISABLE_SSH=true`),克隆统一走 https。
- DNS/ESA 解析 `git.wait4x.online` 尚未配置,nginx 接入由运维会话统一执行,
本目录草稿不自行生效。
## 运行时变更台账(2026-10-25,Phase 4)
- `data/gitea/conf/app.ini` 追加 `[webhook] ALLOWED_HOST_LIST = 172.22.0.1`——
gitea 28 出站 egress 策略默认拦私网地址(废弃名 ALLOWLIST 无效),
此项放行 webhook 回连宿主接收器(172.22.0.1:13021);改后需 restart gitea