在 VPS 上部署 Gitea:轻量级自托管 Git 服务

概述

想在自己的服务器上搭一个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

特性GiteaGitLabGitHub
内存占用50-100MB1-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核512MB1核1GB
小团队(10-50个仓库)1核1GB2核2GB
中型团队(>50个仓库)2核2GB4核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或postgres
  • 3000: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克隆仓库更方便:

  1. 用户在本地生成密钥对:ssh-keygen -t ed25519 -C "your@email.com"
  2. 复制公钥内容:cat ~/.ssh/id_ed25519.pub
  3. 在Gitea个人设置 → SSH密钥 中粘贴公钥
  4. 之后用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支持多人协作:

  1. 管理员在后台创建组织(Organization)
  2. 邀请成员加入,设置权限(Owner/Maintainer/Developer/Guest)
  3. 成员用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)功能?

默认已经开启。团队成员推送代码到远程后:

  1. 在Gitea界面点击"新建 Pull Request"
  2. 选择源分支和目标分支
  3. 填写标题和说明
  4. 指定审查者
  5. 审查者approve后合并

这个流程非常适合小团队开发,保持代码质量。

Q: 怎么开启两步验证(2FA)?

出于安全考虑,建议开启:

  1. 进入个人设置 → 安全 → 两步验证
  2. 用手机App扫描二维码,输入验证码确认
  3. 之后登录需要额外输入6位数字验证码

Q: Gitea和GitHub有什么区别?

  • GitHub是托管服务,代码不在你手里
  • Gitea是自托管,数据完全自主
  • Gitea界面和GitHub类似,学习成本低
  • GitHub免费私有仓库有限制,Gitea无限制
  • Gitea支持更细粒度的权限控制

Q: 怎么开启SSH密钥登录?

团队成员用SSH克隆仓库更方便:

  1. 用户在本地生成密钥对:ssh-keygen -t ed25519 -C "your@email.com"
  2. 复制公钥内容:cat ~/.ssh/id_ed25519.pub
  3. 在Gitea个人设置 → SSH密钥 中粘贴公钥
  4. 之后用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容器?

这篇文章对你有帮助吗?