在开发一个类似于ModelScope的AI模型托管平台时,我们为每个项目都配备了独立的代码仓库服务。
最初,我们采用了业界广泛使用的GitLab方案。然而,它很快暴露了资源消耗过大的问题:仅仅运行基础的代码托管功能,GitLab及其依赖的PostgreSQL和Redis服务,在运行一段时间后内存占用就接近了10GB。这对于我们追求轻量化的项目需求来说,无疑是一个难以接受的“资源黑洞”。
最终,我们将目光投向了Gitea——一个轻量级的自托管Git解决方案。这一转变带来了显著的效果:内存占用从近10GB骤降至约600MB。更重要的是,Gitea提供了完备的REST API接口,使我们能够将其深度集成到自有的AI平台业务逻辑中。
本文将指导你快速完成Gitea的Docker化部署,并演示仓库创建以及如何利用其REST API实现定制化业务集成。

部署前置条件与组件说明

| 组件 |
是否必须 |
用途说明 |
| 数据库(MySQL / PostgreSQL / SQLite) |
✅ 必须 |
存储用户、仓库、Issue、Pull Request、权限等核心业务数据 |
| S3 / MinIO(对象存储) |
➖ 可选 |
用于存储仓库附件、Git LFS大文件;未配置则使用服务器本地磁盘 |
| Redis |
➖ 可选 |
用作缓存、会话存储和任务队列,可显著提升系统性能 |
Gitea支持SQLite、MySQL 8及PostgreSQL 12等数据库。需要注意的是,SQLite仅支持单进程/线程写入,性能受限,不适合生产环境。
考虑到熟悉度与通用性,我们选择MySQL 8作为数据库。请提前安装MySQL,并创建一个名为 gitea 的空数据库(此时库内无需任何表)。

Docker部署Gitea服务
通过以下Docker命令,即可快速启动一个Gitea实例:
docker run -d --name gitea \
-p 3000:3000 -p 222:22 \
-v /Users/zhangyong/docker/gitea/data:/data \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
-e USER_UID=1000 \
-e USER_GID=1000 \
--restart always \
gitea/gitea:latest
命令执行后,首次访问 http://localhost:3000,将进入初始化安装页面。

如图,在页面中配置好数据库连接信息(指向我们预先创建的gitea数据库),然后点击“立即安装”。所有配置将被保存至容器内的 /data/gitea/conf/app.ini 文件中。
安装完成后,界面如下:

注册初始管理员(root)账号后,即可登录进入Gitea主页面。

创建与管理代码仓库
Gitea的仓库创建界面与GitHub类似,直观易用。

输入仓库名称等基本信息,即可成功创建一个Git仓库。

在克隆或推送代码到私有仓库时,通常需要身份验证。除了账号密码,更安全的方式是使用个人访问令牌(Personal Access Token, PAT)。

令牌创建成功后请妥善保存,在命令行执行git clone或git push时,可使用此令牌作为密码。

调用Gitea REST API实现业务集成
Gitea提供了完整的Swagger API文档。访问 http://localhost:3000/api/swagger#/repository,可以查阅所有可用的API接口。

基于这些开放的API,我们可以将Gitea的功能封装成内部服务。例如,可以使用Java Spring Boot框架,构建一个统一的仓库管理服务,实现对仓库的创建、删除、权限分配等操作的自动化管控。

总结与方案对比
下图展示了Gitea与GitLab在关键指标上的对比。对于资源敏感、追求轻量化且需要深度定制的场景,Gitea凭借其极低的资源开销和友好的数据库/中间件集成API,成为了一个非常理想的选择。

通过Docker容器化部署,Gitea的安装和运维变得极其简单,能够快速适配并融入现有的开发运维体系,满足企业级业务对自托管代码仓库的定制化需求。