目前基于Git的开源仓库管理软件主要有Gitlab、Gitea、Gogs等,Gitea是一个基于Go语言开发的开源代码托管平台软件。
你还可以在Gitea官网 对比 Gitea 与其它 Git 托管工具[1] 查看不同开源项目的详细的差异。

我关注Gitea轻量、快速、极易上手的特点,以及有活跃的中文社区。搭建了一个基于Gitea的代码仓库,并配置了SSO,对象存储,邮箱等,可以访问 https://gitea.cncfstack.com 体验。
本文提供Gitea的安装与配置,包含以下内容:
准备数据库和证书
基于藏云阁镜像仓库快速安装Gitea
Gitea基础配置
配置对象存储用以保存Git仓库制品
基于邮箱服务配置邮件通知
基于Keycloak实现SSO统一登录
1. 准备数据库和证书在使用 Gitea 前,您需要准备一个数据库和HTTPS证书。
数据库
Gitea 支持 PostgreSQL(>= 12)、MySQL(>= 8.0)、MariaDB(>= 10.4)、SQLite(内置) 和 MSSQL(>= 2012 SP4)这几种数据库。
HTTPS 证书
默认基于 HTTP 访问,为了保证安全建议添加HTTPS证书。
HTTPS合法证书也可以免费无限申请,可以参考文章:《永久免费的HTTPS/TLS通配符域名合法证书申请很简单,不要再自签证书啦[最佳实践]》
2. 基于藏云阁镜像仓库快速安装Gitea本文使用使用的是 gitea:1.21.1 版本,如果需使用其他版本,请自行修改镜像版本(点击图片获取最新列表)。

如下是启动服务的 docker-compose.yml 文件,修改数据库配置并创建 /data/gitea-data 目录后即可启动服务。
services: gitea: image: harbor.cncfstack.com/docker.io/gitea/gitea:1.21.1 container_name: gitea networks: - cncfstack environment: - USER_UID=1000 - USER_GID=1000 - GITEA__database__DB_TYPE=postgres - GITEA__database__HOST=1.2.3.4:5432 - GITEA__database__NAME=gitea - GITEA__database__USER=user001 - GITEA__database__PASSWD=pwd123 - TLSMinVersion=TLSv1.2 restart: always volumes: - /data/gitea-data/git:/data/git - /data/gitea-data/gitea:/data/gitea - /data/gitea-data/ssh:/data/ssh - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro - ./app.ini:/data/gitea/conf/app.ini:ro ports: - "3000:3000" - "10022:22" deploy: resources: limits: cpus: '3' memory: 4G
默认安装完成后通过 3000 端口访问Web界面,为了符合企业的实践,可以添加友好的域名以及HTTPS 证书配置。
可通过 Nginx 来进行代理,如下配置
server { listen 443 ssl; server_name gitea.cncfstack.com; ssl_certificate /your/path/cncfstack.com_ecc/fullchain.cer; ssl_certificate_key /your/path/cncfstack.com_ecc/cncfstack.com.key; location / { # 动态设置允许的Origin if ($http_origin ~* (https://cncfstack.com|https://www.cncfstack.com)) { add_header 'Access-Control-Allow-Origin' '$http_origin'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; add_header 'Access-Control-Allow-Credentials' 'true'; # 如果需要凭据 add_header 'Vary' 'Origin'; } # 处理预检请求 if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '$http_origin'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization'; # 预检请求缓存时间,20天内无需再发送预检请求 add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain; charset=utf-8'; add_header 'Content-Length' 0; return 204; } proxy_pass http://1.2.3.4: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; }}
注意 nginx 配置中证书路径需要调整为实际路径;并且proxy_pass后端服务实际地址根据实际修改。
3. Gitea基础配置在 Docker Compose 的 Yaml 文件中,挂载了当前目录下 app.ini 配置文件,在这里可以详细配置Gitea。
基础配置内容:
注意这里的配置是针对 gitea 进程的配置,是在容器内的路径和端口,需要注意与docker挂载的路径和端口差异。
[server]APP_DATA_PATH = /data/giteaDOMAIN = gitea.cncfstack.comHTTP_PORT = 3000ROOT_URL = https://gitea.cncfstack.com/DISABLE_SSH = false#显示在克隆 URL 中的 SSH 端口SSH_PORT = 22# 内置 SSH 服务器的端口10022,通过 docker 映射为22SSH_LISTEN_PORT = 10022SSH_DOMAIN = gitea.cncfstack.comSTART_SSH_SERVER = true
4. 配置对象存储用以保存Git仓库制品Git支持管理代码仓库的制品,这些制品由于持续的版本发布会生成很多的制品包文件,这些文件会消耗较多的磁盘存储空间。
特别是在进行一些开源项目仓库 Mirror 镜像的时候,比如etcd、Kuberentes这些代码仓库,会导致磁盘空间大量消耗。
为了降低磁盘空间的消耗和提升制品文件下载的性能,Gitea支持使用对象存储进行保存。S3兼容的对象存储如阿里云 OSS、腾讯云 COS、MinIO 等,都可以使用。
建议:对于代码文件建议放在文件存储或块存储中,经验证代码放在对象存储中的性能很差。
这里使用阿里云的OSS对象存储为例,配置如下
[storage]STORAGE_TYPE = minioMINIO_ENDPOINT = oss-cn-hangzhou-internal.aliyuncs.comMINIO_ACCESS_KEY_ID = ******************MINIO_SECRET_ACCESS_KEY = ******************MINIO_BUCKET = mybucketMINIO_LOCATION = cn-hangzhouMINIO_USE_SSL = trueMINIO_INSECURE_SKIP_VERIFY = falseSERVE_DIRECT = falseMINIO_BASE_PATH = /gitea-storage
配置完成后,启动服务后,自动将仓库制品保存到对象存储中。
在OSS中存储的文件是经过加密的,直接在OSS端是无法查看的,需要通过Gitea页面访问获取。

在进行账号创建时需要填写邮箱地址,开启邮件服务后,Gitea会发送邮件进行账号激活。
在后面密码忘记时,可以通过邮件发送验证码进行密码重置。
示例为基于企业微信邮箱的配置实例,只需要修改邮箱地址和密码信息即可
[mailer]ENABLED = trueFROM = auto@cncfstack.comPROTOCOL = smtpsSMTP_ADDR = smtp.exmail.qq.comSMTP_PORT = 465USER = auto@cncfstack.comPASSWD = `****************`
FROM: 邮件发送的邮箱地址。就是在接受邮件时显示来源的邮箱地址
USER/PASSWD: 是用于登录邮箱系统的账号和密码
配置完成启动后,在 Gitea 管理后台 > 应用配置 > Mailer配置 可以看到配置信息

可以发送测试邮件,测试成功后,即可开始使用。

配置 Gitea 基于 KeyCloak 登录需要有以下步骤
6.1. 在 KeyCloak 中创建一个客户端
6.2. 在 Gitea 配置 SSO 登录
6.3. 在 KeyClaok 中配置 Gitea 的回调地址
6.4. Gitea SSO 登录验证
6.1. 在 KeyCloak 中创建一个客户端创建一个客户端, 如客户端ID为 gitea
对于“有效的重定向URI”在第三步填写完Gitea配置时获取的值,在创建Keycoak的客户端时还是未知。

在创建时或者创建后修改“功能配置”,开启客户端认证功能。

创建完成后,在“密钥”页面会生成一个 Client Secret,这个 Secret 需要在 Gitea 中配置。
6.2. 在 Gitea 配置 SSO 登录在 KeyCloak 中配置 Gitea 的客户端后可以获取到以下信息:
Client ID
Client Secret
OpenID 连接自动发现URL(这个在realms创建时就是已经确定了,修改realms后可以尝试访问下)
通过这3条信息,访问 Gitea 的 SSO 配置页面 Gitea 管理后台 > 身份及认证 > 认证源 新建一条 OpenID Connect 认证源配置
配置参考如下(图片中的密钥和URL做了脱敏,根据实际情况修改即可)

默认的 Scopes 和 KeyCloak 是一致的,不需要修改。
6.3. 在 KeyClaok 中配置 Gitea 的回调地址在Gitea信息填写完成后,会在底部的“帮组提示” 中显示”OAuth2认证“回调地址,这个地址需要配置到 KeyCloak 的回调地址中,即第一步的创建客户端时填写的“有效的重定向URI”。

这个回调地址和创建认证源时的“认证名称”有关,如果填写的是中文,就会出现转译的URL,不影响功能。
6.4. Gitea SSO 登录验证Gitea 在进行登录时,会在登录页面提示一个 SSO 登录按钮 “使用XXXX登录”。
点击按钮后,会跳转到 KeyCloak 的登录页面,登录成功后,会返回 Gitea 的登录页面,并完成登录。

恭喜你已经搭建好了一个可以满足企业基本使用的代码仓库服务了。
这里仅做了最基本的配置,后续可以根据自身需求进行扩展。Gitea 还提供了很多和 Github 类似的功能,比如制品托管,流水线,也可以通过插件配置 Gitea Page静态页面等等功能,可以根据需要进行功能探索配置。
在配置的过程中,如果遇到问题,可以加群进行技术交流。
引用链接[1] 对比 Gitea 与其它 Git 托管工具: https://docs.gitea.com/zh-cn/1.24/installation/comparison[2] : https://cncfstack.com/i/docker.io/gitea/gitea