跳转至

Forgejo/Gitea: 自托管轻量 Git 服务

为什么要学 Forgejo

GitHub 是好的,但有些场景需要自托管 Git 服务: - 公司内部代码不能放在外部平台 - 需要完全控制数据和基础设施 - 对 GitHub/GitLab 的定价不满意 - 想要在私有网络中运行 - 研究数据有合规要求(如医疗、政府)

GitLab 自托管虽然功能全面,但资源消耗巨大(推荐 8GB+ 内存)。Forgejo(Gitea 的社区分叉)用极少的资源提供了核心的 Git 托管能力。

维度GitHubGitLab 自托管Forgejo/Gitea
部署方式SaaS自托管自托管
最低内存N/A8GB+256MB
语言未知Ruby/GoGo
启动时间N/A分钟级秒级
CI/CDGitHub ActionsGitLab CIForgejo Actions/Woodpecker
包注册表
费用免费(受限)/付费免费/付费完全免费
治理微软GitLab Inc社区非营利

Forgejo vs Gitea

Forgejo 是 Gitea 的社区分叉(2022 年),两者 API 和功能高度兼容。主要区别: - Forgejo:非营利组织治理,社区优先,不接受风投 - Gitea:公司治理(Gitea Ltd),可能走商业化路线 - 功能上几乎一致,本教程的内容适用于两者


核心概念

白话解释

Forgejo 就是一个"迷你 GitHub"。安装后你会得到一个 Web 界面,能做以下事情: - 创建和管理 Git 仓库 - Pull Request 和代码审查 - Issue 跟踪 - CI/CD(通过 Forgejo Actions 或集成 Woodpecker CI) - 包注册表(npm、Docker、PyPI 等) - OAuth2 登录

核心概念表

概念说明GitHub 等价物
Organization组织,用于分组管理仓库和成员Organization
RepositoryGit 仓库Repository
Pull Request代码合并请求Pull Request
Issue问题跟踪Issue
ActionCI/CD 工作流(兼容 GitHub Actions 语法)GitHub Actions
Package Registry包存储(Docker/npm/PyPI 等)GitHub Packages
Webhook事件通知回调Webhook
OAuth2 Provider作为 OAuth2 身份提供者GitHub OAuth
Migration从其他平台导入仓库GitHub Importer

安装配置

方式一:Docker Compose(推荐)

# docker-compose.yml
version: '3'

services:
  forgejo:
    image: codeberg.org/forgejo/forgejo:9
    container_name: forgejo
    environment:
      - USER_UID=1000
      - USER_GID=1000
    restart: always
    volumes:
      - ./forgejo-data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - '3000:3000'   # Web UI
      - '2222:22'     # SSH
docker compose up -d
# 访问 http://localhost:3000 进行初始配置

方式二:直接安装

# 下载二进制
wget -O forgejo https://codeberg.org/forgejo/forgejo/releases/download/v9.0.0/forgejo-9.0.0-linux-amd64
chmod +x forgejo
sudo mv forgejo /usr/local/bin/

# 创建用户
sudo adduser --system --group --disabled-password --shell /bin/bash --home /home/git git

# 创建必要目录
sudo mkdir -p /var/lib/forgejo/{custom,data,log}
sudo chown -R git:git /var/lib/forgejo
sudo chmod -R 750 /var/lib/forgejo

# 创建 systemd 服务
sudo cat > /etc/systemd/system/forgejo.service << 'EOF'
[Unit]
Description=Forgejo
After=syslog.target network.target

[Service]
RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/var/lib/forgejo
ExecStart=/usr/local/bin/forgejo web --config /etc/forgejo/app.ini
Restart=always
Environment=USER=git HOME=/home/git FORGEJO_WORK_DIR=/var/lib/forgejo

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl enable --now forgejo

初始配置

首次访问 http://your-server:3000 会进入安装向导:

配置项推荐值说明
数据库类型SQLite3 (小团队) / PostgreSQL (大团队)SQLite 零配置
站点名称你的组织名显示在页面标题
仓库根目录/data/gitea-repositoriesGit 仓库存储路径
服务器域名git.example.com对外访问域名
SSH 端口22 或 2222SSH 克隆端口
注册模式禁用自注册 (内部使用)安全考虑

配置文件详解

# /etc/forgejo/app.ini (或 /data/gitea/conf/app.ini)

[server]
DOMAIN = git.example.com
HTTP_PORT = 3000
ROOT_URL = https://git.example.com/
SSH_PORT = 2222
START_SSH_SERVER = true
LFS_START_SERVER = true  # 启用 Git LFS

[database]
DB_TYPE = sqlite3
PATH = /data/forgejo/forgejo.db

[repository]
ROOT = /data/gitea-repositories
DEFAULT_BRANCH = main

[service]
DISABLE_REGISTRATION = true  # 禁用公开注册
REQUIRE_SIGNIN_VIEW = true   # 需要登录才能查看
DEFAULT_ALLOW_CREATE_ORGANIZATION = true

[mailer]
ENABLED = true
PROTOCOL = smtps
SMTP_ADDR = smtp.example.com
SMTP_PORT = 465
USER = noreply@example.com
PASSWD = your-password
FROM = "Forgejo" <noreply@example.com>

[actions]
ENABLED = true  # 启用 Forgejo Actions

[packages]
ENABLED = true  # 启用包注册表

反向代理(Caddy)

# Caddyfile
git.example.com {
    reverse_proxy localhost:3000
}
# 或 Nginx
server {
    listen 443 ssl;
    server_name git.example.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

快速上手

创建仓库

# Web UI 创建:点击 "+" → "New Repository"

# 或使用 API
curl -X POST "http://localhost:3000/api/v1/user/repos" \
  -H "Authorization: token YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "my-project", "private": true, "auto_init": true}'

Git 操作

# 克隆仓库
git clone http://localhost:3000/user/my-project.git
# 或 SSH
git clone ssh://git@localhost:2222/user/my-project.git

# 推送代码
cd my-project
echo "# My Project" > README.md
git add .
git commit -m "Initial commit"
git push origin main

从 GitHub 迁移

Forgejo 内置了仓库迁移功能:

  1. Web UI → "+" → "New Migration"
  2. 选择来源(GitHub、GitLab、Bitbucket 等)
  3. 输入仓库 URL 和认证信息
  4. 选择要迁移的内容(Issues、Labels、Milestones、Releases 等)
# 或使用 API 迁移
curl -X POST "http://localhost:3000/api/v1/repos/migrate" \
  -H "Authorization: token YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "clone_addr": "https://github.com/user/repo.git",
    "repo_name": "repo",
    "repo_owner": "your-org",
    "service": "github",
    "auth_token": "ghp_...",
    "mirror": false,
    "issues": true,
    "labels": true,
    "milestones": true,
    "releases": true
  }'

Webhook 配置

# 在仓库 Settings → Webhooks 中配置
# 或使用 API

curl -X POST "http://localhost:3000/api/v1/repos/user/repo/hooks" \
  -H "Authorization: token YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "slack",
    "config": {
      "url": "https://hooks.slack.com/services/...",
      "content_type": "json"
    },
    "events": ["push", "pull_request"],
    "active": true
  }'

进阶用法

Forgejo Actions(CI/CD)

Forgejo Actions 兼容 GitHub Actions 语法:

# .forgejo/workflows/ci.yml
name: CI
on:
  push:
    branches: [main]
  pull_request:

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-go@v5
        with:
          go-version: '1.22'
      - run: go test ./...

  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: golangci/golangci-lint-action@v6

设置 Runner

# 下载 Forgejo Runner
wget https://code.forgejo.org/forgejo/runner/releases/download/v3.5.0/forgejo-runner-linux-amd64
chmod +x forgejo-runner-linux-amd64
sudo mv forgejo-runner-linux-amd64 /usr/local/bin/forgejo-runner

# 注册 Runner
forgejo-runner register \
  --instance https://git.example.com \
  --token YOUR_RUNNER_TOKEN \
  --name my-runner

# 启动 Runner(使用 Docker 执行任务)
forgejo-runner daemon

包注册表

Forgejo 支持多种包格式:

# Docker Registry
docker login git.example.com
docker tag myapp git.example.com/user/myapp:latest
docker push git.example.com/user/myapp:latest

# npm
npm login --registry=https://git.example.com/api/packages/user/npm/
npm publish --registry=https://git.example.com/api/packages/user/npm/

# PyPI
pip install twine
twine upload --repository-url https://git.example.com/api/packages/user/pypi \
  -u your-username -p your-token dist/*

# Go Proxy
GOPROXY=https://git.example.com/api/packages/user/go go get example.com/pkg

OAuth2 / SSO

将 Forgejo 作为 OAuth2 身份提供者,或接入外部 SSO:

# app.ini — 接入 LDAP
[authentication]
ENABLE_OAUTH2_INTROSPECTION = true

# 接入 Keycloak/OIDC
# 在 Web UI → Site Administration → Authentication Sources 中配置
# 类型:OAuth2
# Provider:OpenID Connect
# Client ID/Secret:从 Keycloak 获取
# Discovery URL:https://keycloak.example.com/realms/myrealm/.well-known/openid-configuration

备份与恢复

# 备份
forgejo dump -c /etc/forgejo/app.ini
# 生成 forgejo-dump-xxx.zip,包含:
# - 数据库
# - 仓库
# - 配置
# - 日志

# Docker 环境备份
docker exec forgejo forgejo dump -c /data/gitea/conf/app.ini

# 恢复
forgejo restore --from forgejo-dump-xxx.zip

API 使用

Forgejo 提供完整的 REST API(兼容 Gitea API):

# 创建 API Token
# Web UI → Settings → Applications → Generate Token

# 列出仓库
curl -H "Authorization: token YOUR_TOKEN" \
  http://localhost:3000/api/v1/repos/search

# 创建 Issue
curl -X POST "http://localhost:3000/api/v1/repos/user/repo/issues" \
  -H "Authorization: token YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title": "Bug report", "body": "Description..."}'

# API 文档
# 访问 http://localhost:3000/api/swagger

常见问题

Q1: Forgejo 和 Gitea 我该选哪个?

功能上几乎一致。选择依据: - Forgejo:偏好社区治理、非营利、长期稳定性 - Gitea:偏好公司维护、可能有更多商业功能

两者的配置和 API 兼容,迁移成本极低。

Q2: 小团队(5-10人)需要多少资源?

  • CPU:1 核心足够
  • 内存:512MB-1GB
  • 磁盘:取决于仓库大小,起步 10GB
  • 数据库:SQLite 足够(<50 用户),更大规模用 PostgreSQL

Q3: 可以和 GitHub 双向同步吗?

可以设置镜像仓库: - 在 Forgejo 中创建仓库时选择 "Mirror" - 支持从 GitHub 拉取(pull mirror) - 也支持推送到 GitHub(push mirror)

Q4: HTTPS 怎么配置?

推荐用 Caddy 或 Nginx 反向代理处理 TLS,不在 Forgejo 中直接配置 HTTPS。

Q5: 如何升级 Forgejo?

# Docker
docker compose pull
docker compose up -d

# 二进制
# 下载新版本替换旧版本,重启服务
sudo systemctl stop forgejo
sudo cp forgejo-new /usr/local/bin/forgejo
sudo systemctl start forgejo

升级前务必备份。


参考资源

资源链接
Forgejo 官网https://forgejo.org
Forgejo 文档https://forgejo.org/docs
Codeberg (Forgejo 的旗舰实例)https://codeberg.org
Gitea 官网https://about.gitea.com
Gitea 文档https://docs.gitea.com
API 文档你的实例地址 /api/swagger
Forgejo Runnerhttps://code.forgejo.org/forgejo/runner

总结:Forgejo/Gitea 是自托管 Git 服务的最佳轻量选择。只需要一个 Docker 容器和 256MB 内存,你就能拥有一个功能完整的代码托管平台。它特别适合小团队、内部项目、和对数据主权有要求的场景。与 GitLab 的重量级方案相比,Forgejo 的维护成本几乎可以忽略。