Zig 编程语言项目最近从 GitHub 迁移到 Codeberg,这是开源社区对 GitHub 过度拥抱 AI(如 Copilot)引发的担忧的一个典型案例。Copilot 通过刮取公共仓库代码训练模型,不仅可能违反项目 no-LLM 政策,还带来代码污染和许可风险。自托管 Forgejo 或 Gitea 成为理想方案:完全掌控数据,避免 AI 自动访问,同时提供类似 GitHub 的功能,却资源占用低、维护简单。本文聚焦单一技术点 —— 自托管 Forgejo 迁移工程实践,从部署参数到 Copilot 规避策略,给出可落地清单。
为什么选择自托管 Forgejo/Gitea?
GitHub 的 Copilot 已深度集成 UI,推动 AI 生成 issue/PR,导致 Zig 等项目频繁违反 “禁止 LLM 输出” 的规则。Zig 维护者 Andrew Kelley 指出,GitHub Actions 不稳定、性能下降、AI 推广是迁移导火索。Codeberg 使用 Forgejo(Gitea 的社区分叉),Zig 主仓库现为 https://codeberg.org/ziglang/zig,已设 GitHub repo 为只读,不迁移 issues(从 30000 开始新计数)。
Forgejo 优势在于轻量(内存 <200MB vs GitHub Actions 高负载)、100% FOSS、非营利导向,支持 CI/CD(Actions 兼容 GitHub YAML)、包管理(20+ 类型如 Cargo、Maven)。Gitea 类似,但 Forgejo 更注重联邦和隐私。自托管避免供应商锁定:数据本地,禁用 fork 下载即可防 Copilot 刮取(Copilot 主要训公共代码,私有需 Enterprise 订阅)。
风险:迁移损失 Sponsors(Zig 2024 年 17 万美元),Codeberg 限开源;自托管需运维,但 Docker 一键部署化解。
自托管 Forgejo 部署清单
使用 Docker Compose,单机 2C4G 服务器即可(推荐 Ubuntu 24.04+)。
-
准备环境:
- 创建数据目录:
mkdir -p /opt/forgejo/{data,db}, chown 1000:1000。 - 时区文件:
echo Asia/Shanghai > /etc/timezone。
- 创建数据目录:
-
docker-compose.yaml(核心参数):
networks: forgejo: external: false services: server: image: codeberg.org/forgejo/forgejo:9 # 或 code.forgejo.org 镜像 container_name: forgejo environment: - USER_UID=1000 - USER_GID=1000 - DB_TYPE=postgres # 或 mysql/sqlite - DB_HOST=127.0.0.1:5432 - DB_NAME=forgejo - DB_USER=forgejo - DB_PASS=your_secure_pass restart: always networks: [forgejo] volumes: - /opt/forgejo/data:/data - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro ports: - '3000:3000' - '222:22' # SSH db: # PostgreSQL 示例 image: postgres:16 environment: POSTGRES_USER: forgejo POSTGRES_PASSWORD: your_secure_pass POSTGRES_DB: forgejo volumes: [/opt/forgejo/db:/var/lib/postgresql/data] networks: [forgejo]启动:
docker compose up -d。 -
初始配置(访问 http://your-ip:3000):
- 站点标题:你的组织名。
- 数据库:已配置。
- 安装锁定:启用。
- SSH:域名 + 端口(e.g., git@your-domain:222)。
-
app.ini 调优(/opt/forgejo/data/gitea/conf/app.ini,重启生效):
[server] DOMAIN = your-domain.com HTTP_PORT = 3000 SSH_PORT = 22 # 宿主机映射 [database] TYPE = postgres [actions] ENABLED = true DEFAULT_BASH_PATH = /bin/bash [security] DISABLE_GIT_HOOKS = true # 防钩子滥用 INSTALL_LOCK = true SECRET_KEY = gen_random_pass # 随机生成 [session] PROVIDER = file [repo] ENABLE_PUSH_CREATE_USER = true MAX_CREATION_LIMIT = -1 # 无仓库限阈值:Actions 并发 ≤5 / 用户,超时 30min。
-
迁移仓库(从 GitHub/Zig 示例):
git clone --mirror https://github.com/ziglang/zig.gitgit remote add codeberg https://codeberg.org/ziglang/zig.gitgit push codeberg --mirror- 更新 canonical:Zig 策略 ——issues/PR 保留 GitHub 查看,新版 Codeberg。
- 私有 repo:启用 “禁止 fork”(repo 设置),Copilot 无法下载训练。
Copilot 禁用与私有 repo 防护
Copilot 刮公共代码训练,私有需 fork/download(Enterprise 可见)。防护参数:
- 公共 repo:迁移自托管 + README 声明 “禁止 LLM 使用”(Zig 已禁)。
- 私有 repo:Gitea/Forgejo 默认无 AI 访问;设置 “禁用 fork”(admin → repo → settings)。
- 下载防护:Webhook 监控 clone/push,阈值 >10/min 封 IP;Actions YAML 禁 Copilot 插件。
- 参数:
[repo].ENABLE_PUSH_CREATE_FORK=false,监控日志 grep "copilot|ai"。
监控与回滚策略
- Prometheus + Grafana:监控 CPU<50%、内存 < 500MB、Actions 队列 < 10。
- 告警:uptime <99.5%、disk>80%。
- 备份:
docker volume backup /opt/forgejo/data日 cron,S3 offsite。 - 回滚:若 Forgejo 故障,fallback Gitea(二进制切换),或 GitLab CE(重部署 <1h)。
- 规模:单机 100 repo/50 user;集群用 Forgejo HA(PostgreSQL 主从)。
Zig 迁移证明:自托管 Forgejo 阈值低(165MB vs GitLab 2.9GB),避 AI 风险,落地快。测试环境:VPS 1h 部署,CI 兼容 GitHub YAML 无缝。
资料来源:Codeberg.org/ziglang/zig(Zig 主仓库)、Forgejo.org(部署文档)、Gitea about(功能对比)。“Codeberg 使用 Forgejo,轻量级且注重隐私。”(Forgejo.org)。
(字数:1256)