作为开发者,代码是核心资产。虽然 GitHub 很好用,但免费私有仓库限制多、大文件传输慢、且数据完全依赖第三方。
2025 年,在自己的 VPS 上搭建一个私有 Git 服务已成为主流选择。本文将推荐 Gitea —— 一个轻量级、超快、功能强大的开源 Git 服务。它不仅比 GitLab 省资源(256MB 内存就能跑),还比 Gogs 更新更活跃、功能更全。
本文将教你使用 Docker Compose 快速部署 Gitea,并配置 HTTPS 访问和 SSH 端口穿透,打造一个完全属于你的“私有 GitHub”。
在 2025 年,Gitea 依然是自托管 Git 服务的首选,理由很简单:
- 极度轻量:Go 语言编写,编译成单文件,极低资源占用(树莓派都能跑)。
- 功能完整:Pull Requests、Issues、Wiki、Kanban、LFS、Packages 一应俱全。
- 内置 CI/CD:支持 Gitea Actions,语法兼容 GitHub Actions,这对于自动化构建至关重要。
- 活跃社区:相比已经“停滞”的 Gogs,Gitea 迭代速度快,安全性更有保障(Gogs 近期曾曝出高危漏洞)。
- VPS 配置:1 核 1GB 内存即可(推荐 2 核 2GB 以获得更佳体验)。
- 系统:Ubuntu 20.04+ / Debian 11+。
- 软件:已安装 Docker 和 Docker Compose。
去你的域名服务商(如 Cloudflare)添加一条 A 记录:
git.yourdomain.com->你的 VPS IP- 代理状态:关闭(仅 DNS),让 Caddy 自动申请 SSL。
我们将使用 Docker Compose 一键拉起 Gitea 和 Caddy(作为反向代理)。
mkdir -p ~/gitea/{data,config,caddy/data,caddy/config}
cd ~/gitea
创建一个 docker-compose.yml 文件:
version: "3"
networks:
gitea:
external: false
services:
server:
image: gitea/gitea:latest
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=sqlite3 # 个人使用 SQLite 足够,无需独立数据库容器
restart: always
networks:
- gitea
volumes:
- ./data:/data # 持久化数据
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
# - "3000:3000" # Web端口,通过 Caddy 代理,无需对外暴露
- "2222:22" # SSH端口,映射到主机的 2222,避免冲突
caddy:
image: caddy:latest
container_name: caddy
restart: always
networks:
- gitea
ports:
- "80:80"
- "443:443"
volumes:
- ./caddy/Caddyfile:/etc/caddy/Caddyfile
- ./caddy/data:/data
- ./caddy/config:/config
创建 ./caddy/Caddyfile,写入你的域名配置:
git.yourdomain.com {
reverse_proxy server:3000
}
注意:将
git.yourdomain.com替换为你实际的域名。
docker compose up -d
访问 https://git.yourdomain.com,你将看到安装向导。只需修改以下关键项,其他保持默认即可:
- 数据库设置:保持 SQLite3。
- 一般设置:
- 站点名称:给你的仓库起个名字,比如 "My Private Git"。
- SSH 服务端口:改为 2222(非常重要!因为我们在 Docker 里把内部的 22 映射到了外部的 2222)。
- SSH 服务域名:填写你的域名
git.yourdomain.com。 - 基础 URL:
https://git.yourdomain.com/。
- 管理员帐号设置:务必创建一个管理员账号,不要留空。
点击“立即安装”,几秒钟后,你的私有 Git 服务就上线了!
很多人在自建 Git 时会卡在 SSH 克隆上,因为 VPS 的 22 端口通常被 SSH 登录占用了。我们在 docker-compose.yml 中将 Gitea 的 SSH 端口映射到了 2222。
你的 Clone 地址会长这样:
ssh://[email protected]:2222/username/repo.git
注意 URL 中多了 :2222。
如果你不想每次都输入端口号,可以在本地电脑的 ~/.ssh/config 文件中配置:
Host git.yourdomain.com
HostName git.yourdomain.com
User git
Port 2222
IdentityFile ~/.ssh/id_rsa
配置后,你就可以像用 GitHub 一样克隆了(无需手动加端口):
git clone [email protected]:username/repo.git
Gitea 1.19+ 版本引入了 Actions,语法兼容 GitHub Actions。要启用它,我们需要添加一个 Runner。
在 services 下添加 runner 服务:
runner:
image: gitea/act_runner:latest
container_name: act_runner
restart: always
depends_on:
- server
volumes:
- ./runner-data:/data
- /var/run/docker.sock:/var/run/docker.sock
environment:
- GITEA_INSTANCE_URL=http://server:3000
- GITEA_RUNNER_REGISTRATION_TOKEN=<你的Token>
- GITEA_RUNNER_NAME=vps-runner
- 进入 Gitea 管理面板 -> Actions -> Runners -> Create new Runner,复制 Token。
- 替换上面的
<你的Token>。 - 重启容器:
docker compose up -d。
现在,你可以在仓库里创建 .gitea/workflows/demo.yaml,开始体验自动构建了!
数据都在 ~/gitea/data 目录下,包含数据库文件 (sqlite.db) 和 Git 仓库文件。
备份命令:
# 打包整个 data 目录
tar -czvf gitea-backup-$(date +%Y%m%d).tar.gz ~/gitea/data
建议配合 Rclone 自动上传到云端对象存储,确保数据万无一失。
通过 Docker + Gitea,我们只用了不到 500MB 的内存,就拥有了一个媲美 GitHub 的全功能私有代码托管平台。
- 安全:代码在自己手里,不用担心第三方服务条款变更。
- 高速:局域网或优质 VPS 加持,大文件 Push/Pull 飞快。
- 省心:SQLite + Docker,维护成本几乎为零。
这是每一位开发者构建个人知识库和代码库的最佳起点。
