概述
想在自己的服务器上搭一个Git仓库管理工具,但GitLab太重、GitHub收费、Gitea刚好。
Gitea是一个轻量级Git服务,内存占用只有GitLab的十分之一。支持Docker一键部署,SQLite作为默认数据库,1核512MB的VPS就能跑起来。
这篇文章教你在Ubuntu VPS上用Docker部署Gitea,配置好SSL和反向代理。
为什么选 Gitea?
Gitea是Go语言写的,整个程序编译出来才几十MB。运行时的内存占用大概50-100MB,比GitLab的1GB少得多。
它支持的功能和GitHub几乎一样:代码仓库管理、Issue追踪、Pull Request、Wiki、CI/CD集成。界面也很像,熟悉GitHub的人上手很快。
Gitea vs GitLab vs GitHub
| 特性 | Gitea | GitLab | GitHub |
|---|---|---|---|
| 内存占用 | 50-100MB | 1-2GB | 托管服务 |
| 安装方式 | Docker一键 | 复杂 | 无需安装 |
| 私有仓库 | 免费无限制 | 有限制 | 收费 |
| CI/CD | 有(Gitea Actions) | 强大 | 强大 |
| 界面相似度 | 像GitHub | 不同 | 原生 |
| 自托管 | 完全自主 | 完全自主 | 不支持 |
Gitea在轻量级和功能性之间取得了很好的平衡。如果你只需要一个简洁的Git服务,Gitea是最佳选择。
准备工作
你需要:
- 一台Ubuntu 22.04或24.04的VPS(推荐1核1GB以上)
- Docker和Docker Compose已安装
- 一个指向VPS IP的域名
- SSH登录权限
推荐的VPS配置
| 用途 | 最低配置 | 推荐配置 |
|---|---|---|
| 个人使用(<10个仓库) | 1核512MB | 1核1GB |
| 小团队(10-50个仓库) | 1核1GB | 2核2GB |
| 中型团队(>50个仓库) | 2核2GB | 4核4GB |
SQLite数据库在小规模场景下表现很好,超过50个活跃仓库建议换MySQL。
网络要求
确保以下端口在防火墙中开放:
- 80端口(HTTP,用于SSL证书申请)
- 443端口(HTTPS,Web访问)
- 2222端口(SSH,代码克隆和推送)
如果你用云服务商的VPS(如阿里云、腾讯云),还需要在安全组规则中放行这些端口。
如果还没有Docker,先跑一下:
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
newgrp docker
步骤
第一步:创建项目目录
mkdir -p ~/gitea/data
chmod 777 ~/gitea/data
Gitea的数据存在这里,包括git仓库、数据库文件、上传附件等。
第二步:写docker-compose.yml
cd ~/gitea
cat > docker-compose.yml << 'EOF'
version: '3'
services:
gitea:
image: gitea/gitea:latest
container_name: gitea
restart: unless-stopped
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=sqlite3
volumes:
- ./data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "2222:22"
networks:
- gitea-network
networks:
gitea-network:
driver: bridge
EOF
关键参数说明:
USER_UID=1000和USER_GID=1000:容器内用户的UID和GID,避免文件权限问题GITEA__database__DB_TYPE=sqlite3:使用SQLite数据库,小项目够用。大项目可以改成mysql或postgres3000:3000:Web界面端口2222:22:SSH端口,2222映射到容器内的22,因为本机可能已经在用22
如果宿主机已经有服务占用3000端口,可以改成其他端口,比如3001:3000。
第三步:启动服务
docker compose up -d
等30秒,检查容器状态:
docker compose ps
看到 gitea 状态是 running 就说明启动成功。
第四步:访问安装页面
浏览器打开 http://你的VPS_IP:3000,会看到Gitea的安装向导。
填写这些必填项:
- 站点标题:比如"我的Git服务器"
- 域名:填你的域名,如 git.example.com
- SSH端口:填2222
- Gitea基础URL:填
http://git.example.com(如果有域名) - 管理员账号:设置第一个管理员账号和密码
数据库设置选SQLite即可,不需要额外配置。
点击"立即安装",等几秒就完成。
第五步:配置反向代理
直接用IP访问不方便,加个域名和SSL。用Nginx做反向代理:
sudo apt install -y nginx
sudo nano /etc/nginx/sites-available/gitea
写入配置:
server {
listen 80;
server_name git.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name git.example.com;
ssl_certificate /etc/letsencrypt/live/git.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/git.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1: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;
}
}
保存后启用配置:
sudo ln -s /etc/nginx/sites-available/gitea /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl restart nginx
第六步:申请SSL证书
用Certbot申请免费证书:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d git.example.com
按提示输入邮箱,同意条款。Certbot会自动修改Nginx配置,开启HTTPS。
证书3个月过期,设置自动续期:
sudo certbot renew --dry-run
看到"new certificate deployed"就说明自动续期配置正确。
第七步:修改Gitea配置
安装完成后,去服务器修改Gitea配置文件,让Web界面用域名访问:
sudo nano /root/gitea/data/gitea/conf/app.ini
找到 [server] 部分,修改:
[server]
DOMAIN = git.example.com
HTTP_ADDR = 0.0.0.0
HTTP_PORT = 3000
ROOT_URL = https://git.example.com/
重启容器生效:
docker compose restart
这一步是为了让Gitea生成的链接全部用域名而不是IP。修改后,仓库的克隆地址、邮件通知等都会使用新域名。
验证
浏览器打开 https://git.example.com,应该能看到Gitea界面。
用管理员账号登录,创建一个测试仓库:
git clone https://git.example.com/admin/test.git
cd test
echo "hello" > README.md
git add .
git commit -m "first commit"
git push -u origin main
推送成功就说明整个链路通了。
在Gitea界面上,你能看到:
- 新创建的仓库列表
- 仓库的提交历史
- SSH/HTTPS克隆地址
如果提交记录显示正确的用户名和邮箱,说明配置都正常。
检查容器日志可以确认一切正常:
docker compose logs gitea
正常情况下应该看到类似这样的日志输出:
2026/08/07 10:00:00 ...
常见问题
Q: 容器启动后访问502怎么办?
A: 检查Docker容器是否正常运行:
docker compose logs gitea
看有没有报错。常见原因是端口冲突,检查3000和2222端口是否被占用:
sudo lsof -i :3000
sudo lsof -i :2222
如果被占用了,可以改docker-compose.yml里的端口映射,比如改成3001:3000。
Q: 怎么修改Gitea的存储路径?
默认数据存在 /data 目录。如果想把数据放到其他位置,比如 NAS 共享存储:
# 在docker-compose.yml中修改volume映射
volumes:
- /mnt/nas/gitea:/data # 改成你的实际路径
确保容器内的用户(UID 1000)对目标目录有读写权限。
Q: SQLite数据库能支撑多少仓库?
A: SQLite适合小团队,100个以内仓库没问题。超过200个仓库或者多用户同时操作,建议换MySQL:
cat > docker-compose.yml << 'EOF'
version: '3'
services:
gitea:
image: gitea/gitea:latest
container_name: gitea
restart: unless-stopped
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=mysql
- GITEA__database__HOST=db:3306
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=gitea_password
volumes:
- ./data:/data
ports:
- "3000:3000"
- "2222:22"
depends_on:
- db
networks:
- gitea-network
db:
image: mysql:8.0
container_name: gitea-db
restart: unless-stopped
environment:
- MYSQL_ROOT_PASSWORD=root_password
- MYSQL_DATABASE=gitea
- MYSQL_USER=gitea
- MYSQL_PASSWORD=gitea_password
volumes:
- mysql_data:/var/lib/mysql
networks:
- gitea-network
volumes:
mysql_data:
networks:
gitea-network:
driver: bridge
EOF
Q: SSH克隆提示connection refused?
A: 检查容器内SSH服务是否启动:
docker exec gitea sshd -T
同时检查防火墙是否放行了2222端口。云服务器要在安全组里放行。
Q: 怎么开启SSH密钥登录?
团队成员用SSH克隆仓库更方便:
- 用户在本地生成密钥对:
ssh-keygen -t ed25519 -C "your@email.com" - 复制公钥内容:
cat ~/.ssh/id_ed25519.pub - 在Gitea个人设置 → SSH密钥 中粘贴公钥
- 之后用SSH地址克隆:
git clone git@git.example.com:user/repo.git
SSH方式免密码,更安全。
Q: 怎么备份Gitea数据?
A: 数据全在 ~/gitea/data 目录。直接打包:
tar czvf gitea-backup-$(date +%Y%m%d).tar.gz ~/gitea/data
定期上传到远程存储或对象仓库。
Q: 怎么设置Git邮箱和用户名?
创建账号后,在个人设置里修改:
# SSH密钥添加
git config --global user.name "你的名字"
git config --global user.email "your@email.com"
这样推送到远程仓库时,提交记录会显示正确的作者信息。
Q: 怎么让团队成员协作?
Gitea支持多人协作:
- 管理员在后台创建组织(Organization)
- 邀请成员加入,设置权限(Owner/Maintainer/Developer/Guest)
- 成员用HTTPS或SSH克隆仓库
HTTPS方式需要账号密码,SSH方式更推荐,安全且方便。
Q: Gitea更新版本怎么操作?
cd ~/gitea
docker compose pull
docker compose up -d
更新前先备份数据,万一新版本有问题可以回滚:
# 回滚到旧版本
docker compose down
docker compose up -d gitea --no-recreate
Q: 怎么开启代码审查(Pull Request)功能?
默认已经开启。团队成员推送代码到远程后:
- 在Gitea界面点击"新建 Pull Request"
- 选择源分支和目标分支
- 填写标题和说明
- 指定审查者
- 审查者approve后合并
这个流程非常适合小团队开发,保持代码质量。
Q: 怎么开启两步验证(2FA)?
出于安全考虑,建议开启:
- 进入个人设置 → 安全 → 两步验证
- 用手机App扫描二维码,输入验证码确认
- 之后登录需要额外输入6位数字验证码
Q: Gitea和GitHub有什么区别?
- GitHub是托管服务,代码不在你手里
- Gitea是自托管,数据完全自主
- Gitea界面和GitHub类似,学习成本低
- GitHub免费私有仓库有限制,Gitea无限制
- Gitea支持更细粒度的权限控制
Q: 怎么开启SSH密钥登录?
团队成员用SSH克隆仓库更方便:
- 用户在本地生成密钥对:
ssh-keygen -t ed25519 -C "your@email.com" - 复制公钥内容:
cat ~/.ssh/id_ed25519.pub - 在Gitea个人设置 → SSH密钥 中粘贴公钥
- 之后用SSH地址克隆:
git clone git@git.example.com:user/repo.git
SSH方式免密码,更安全。
Q: 怎么备份Gitea数据?
A: 数据全在 ~/gitea/data 目录。直接打包:
tar czvf gitea-backup-$(date +%Y%m%d).tar.gz ~/gitea/data
定期上传到远程存储或对象仓库。
Gitea搭建起来不到10分钟,比起GitLab轻太多。512MB内存的VPS就能跑,适合个人开发者和小团队。
你的VPS内存多大?能跑几个Gitea容器?