使用 Docker 快速部署 Gitea 指南(实战一)

📝 前言

在上一篇《从阿里云效到自建DevOps平台:Gitea入门介绍》我们介绍了 Gitea 是什么,使用场景以及核心功能,这一期我们就开始正式的实战起来,先介绍如何通过 Docker 快速部署 Gitea。

🧭 背景介绍

在许多中小型团队或个人开发者中,自建 Git 代码托管平台逐渐成为一种趋势。

相比 GitLab 资源消耗大、配置复杂,Gitea 以其轻量级、易部署、界面友好等特点成为热门选择。

Gitea 支持多用户、SSH/HTTP 协议、Web 界面管理等功能,非常适合用于:

  • 内网 Git 服务搭建
  • 构建 CI/CD 的私有仓库来源
  • 替代 GitHub 或 GitLab 的个人托管方案

📋 前提条件

部署前请确保你已具备以下环境:

🚀 详细步骤

1️⃣ 创建部署目录

1
2
mkdir -p /opt/gitea/
cd /opt/gitea

该目录主要用于存储docker compose部署文件,这里我们没有使用本地data目录,而是由Docker Volumes来自动创建,主要是避免权限问题。

2️⃣ 编写 docker-compose.yml

/opt/gitea 目录下创建一个名为 docker-compose.yml 的文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
networks:
gitea:
external: false

volumes:
gitea:
driver: local

services:
gitea:
image: gitea/gitea:1.24.2
container_name: gitea
environment:
- USER_UID=1010
- USER_GID=1010
- GITEA__database__DB_TYPE=mysql
- GITEA__database__HOST=<你的数据库IP>:3306
- GITEA__database__NAME=<数据库名>
- GITEA__database__USER=<数据库连接用户>
- GITEA__database__PASSWD=<数据库连接密码>
- DOMAIN=<访问git服务域名,如没有部署DNS服务可填写IP>
- LFS_START_SERVER=true
- DISABLE_REGISTRATION=true
restart: always
networks:
- gitea
volumes:
- gitea:/data
- /home/git/.ssh/:/data/git/.ssh
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "222:22"

PS:注意需提前创建好数据库。

另外通过 命名卷 方式启动,持久化的数据并不在当前目录,而是由 Docker 自行管理,可通过以下命令进行查看:

1
2
3
docker volume inspect gitea_gitea
# 其中 Mountpoint 即为实际的数据存储目录
"Mountpoint": "/var/lib/docker/volumes/gitea_gitea/_data",

3️⃣ 创建 git 用户

若想通过 ssh 链接下载仓库,建议提前创建一个名为 git 的系统用户,并将宿主机挂载目录的所属权赋予它。

执行以下命令创建 git 用户:

1
2
3
4
5
6
7
8
# 在创建之前先确保系统内不存在ID相同的用户,若无输出则表示用户不存在
getent passwd 1010

# 创建用户
useradd -m -u 1010 -g 1010 git

# 生成 ssh 密钥
sudo -u git ssh-keygen -t rsa -b 4096 -C "Gitea Host Key"

这里的1010是需要跟上面的USER_UIDUSER_GID环境变量保持一致。

4️⃣ 启动应用

执行以下命令启动:

1
2
3
4
5
6
# 进入部署目录
cd /opt/gitea
# 启动容器
docker compose up -d
# 查看启动状态
docker compose ps

首次启动后,Gitea 会在 http://<你的服务器IP>:3000 上运行,SSH 服务监听 222 端口。

5️⃣ 初始化 Gitea

待容器启动完成后,在浏览器访问 Gitea Web 页面:

http://<你的服务器IP>:3000

可根据实际情况填写,完成后点击“安装 Gitea”即可。

6️⃣ 设置域名解析和反向代理(可选)

若希望通过域名访问,可在自建的DNS服务器上添加域名解析,然后配置Nginx代理。

自建DNS服务可参看文档:《Ubuntu 本地 DNS 服务搭建指南(dnsmasq)》

Nginx 配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
server {
listen 80;
server_name git.luhome.com;


location / {
proxy_pass http://127.0.0.1:3000;
charset utf-8;
proxy_redirect off;
# 保证获取到真实IP
proxy_set_header X-Real-IP $remote_addr;
# 真实端口号
proxy_set_header X-Real-Port $remote_port;
# X-Forwarded-For 是一个 HTTP 扩展头部。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 在多级代理的情况下,记录每次代理之前的客户端真实ip
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
# 获取到真实协议
proxy_set_header X-Forwarded-Proto $scheme;
# 真实主机名
proxy_set_header Host $host;
# 设置变量
proxy_set_header X-NginX-Proxy true;
# 开启 brotli
proxy_set_header Accept-Encoding "";
}

}

7️⃣ 配置 SSH

我一般是都习惯通过 HTTP clone下载仓库,若想使用 SSH 协议,可进入 Gitea → 设置 → SSH/GPG 密钥 → 增加密钥:

其中密钥内容需要填写公钥文件内容,也即是 ~/.ssh/id_xxxx.pub 文件。

8️⃣ 通过 SSH 下载仓库

配置完 Gitea 的密钥后,我们就可以通过 ssh 协议下载仓库代码了,命令如下:

1
git clone ssh://git@<你的Gitea仓库IP或域名>:222/lusyoe/NotionNext.git

这里需要带上222端口,因为我们服务器 222 才是映射到 Gitea 容器内的 ssh 协议端口。

若不想带上ssh协议头和端口,我们也可以配置 ssh config,参考如下:

1
2
3
4
5
6
7
8
9
# 编辑config文件
vim ~/.ssh/config

# 添加以下内容
Host <你的Gitea仓库IP或域名>
HostName <你的Gitea仓库IP或域名>
Port 222 # git ssh映射的端口
User git
IdentityFile ~/.ssh/id_xxxx # 私钥文件路径

之后就可以直接用仓库上面提供的ssh链接进行下载了,如:

1
git clone git@git.luhome.com:lusyoe/NotionNext.git

✅ 总结

Gitea 提供了一种轻量、开箱即用、界面简洁的 Git 自托管方案,而借助 Docker 的部署方式,你只需几分钟即可完成:

  • 无需手动配置依赖或环境
  • 快速上线 Web 版 Git 仓库管理平台
  • 支持团队协作、权限管理、SSH/HTTP 克隆等核心功能

它尤其适用于中小型开发团队、个人项目归档、内网私有部署等场景,是构建自有 DevOps 环境的理想起点。

🔜 下期预告

下一篇,我们将带你深入了解 Gitea 的 CI/CD 功能。

介绍如何部署 Gitea Actions Runner,实现类似 GitHub Actions 的自动化构建与部署流程,轻松打造你的私有 DevOps 流水线,敬请期待!