Hotdry.
systems-engineering

Zig 项目 GitHub 迁移自托管 Forgejo:避开 Copilot AI 代码刮取的工程实践

基于 Zig 从 GitHub 迁至 Codeberg 的案例,详解自托管 Forgejo/Gitea 部署参数、Copilot 禁用策略及私有仓库 fork 下载防护要点。

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+)。

  1. 准备环境

    • 创建数据目录:mkdir -p /opt/forgejo/{data,db}, chown 1000:1000。
    • 时区文件:echo Asia/Shanghai > /etc/timezone
  2. 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

  3. 初始配置(访问 http://your-ip:3000):

    • 站点标题:你的组织名。
    • 数据库:已配置。
    • 安装锁定:启用。
    • SSH:域名 + 端口(e.g., git@your-domain:222)。
  4. 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。

  5. 迁移仓库(从 GitHub/Zig 示例):

    • git clone --mirror https://github.com/ziglang/zig.git
    • git remote add codeberg https://codeberg.org/ziglang/zig.git
    • git 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)

查看归档