为什么需要私有代码托管?
GitHub 免费仓库是私有的,但你不想让代码经过第三方。Gitea 是一个轻量级、自托管的 Git 服务,占用资源极少,256MB 内存就能跑起来。
它兼容 GitHub 的 Git 协议,VS Code、JetBrains 等主流 IDE 都能无缝对接。
Gitea 的核心特点
- 🪶 极致轻量:单个二进制文件,内存占用不到 200MB
- 🔒 完全私有:代码和数据都在你自己的服务器上
- 🤝 GitHub 兼容:支持 Fork、Pull Request、Issues 等完整工作流
- 🔌 插件生态:支持 LDAP、OAuth、Webhook 等扩展
- 📱 移动端友好:自带 App,iOS 和 Android 都能用
准备工作
你需要:
- 一台 VPS(推荐 1 核 1GB 以上,系统 Ubuntu 22.04 或 Debian 12)
- Docker 和 Docker Compose(已安装)
- 一个域名(可选,用于 HTTPS)
- 基础 Linux 操作知识
💡 如果只是个人玩,直接用服务器 IP 也行。想要更专业一点,配个域名加 HTTPS。
第一步:创建项目目录
mkdir -p ~/gitea/{data,logs,ssh}
cd ~/gitea
这里创建了三个目录:
data:存放数据库和应用数据logs:存放运行日志ssh:存放 SSH 密钥,用于 Git SSH 协议访问
第二步:编写 Docker Compose 配置
创建 docker-compose.yml:
services:
gitea:
image: gitea/gitea:1.22.3
container_name: gitea
restart: always
environment:
- USER_UID=1000
- USER_GID=1000
volumes:
- ./data:/data
- ./ssh:/etc/ssh
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "2222:22"
networks:
- gitea-net
postgres:
image: postgres:16-alpine
container_name: gitea-db
restart: always
environment:
POSTGRES_USER: gitea
POSTGRES_PASSWORD: gitea_secure_pwd_2026
POSTGRES_DB: gitea
volumes:
- ./pg_data:/var/lib/postgresql/data
networks:
- gitea-net
networks:
gitea-net:
driver: bridge
关键说明:
2222:22把容器内的 22 端口映射到宿主机的 2222,避免和本机 SSH 冲突postgres:16-alpine用 Alpine 镜像,体积更小- 密码请改成你自己的,别用示例里的
第三步:启动服务
docker compose up -d
等待几十秒后检查状态:
docker compose ps
应该看到两个容器都在运行:
NAME STATUS PORTS
gitea Up 10 seconds 0.0.0.0:3000->3000/tcp, 0.0.0.0:2222->22/tcp
gitea-db Up 10 seconds 5432/tcp
第四步:初始化 Gitea
打开浏览器访问 http://你的IP:3000,会进入安装向导。
填写以下信息:
| 配置项 | 值 |
|---|---|
| 数据库类型 | PostgreSQL |
| 主机 | postgres:5432 |
| 用户名 | gitea |
| 密码 | gitea_secure_pwd_2026 |
| 数据库名 | gitea |
| SSH 端口 | 2222 |
| 应用 URL | http://你的IP:3000 |
| 管理员账号 | 自己设定 |
点击安装完成后,用刚创建的管理员账号登录。
第五步:验证部署
# 检查 Gitea 服务是否正常
curl -s -o /dev/null -w "%{http_code}" http://localhost:3000
# 应返回 200
# 检查 SSH 端口是否监听
ss -tlnp | grep 2222
# 用 SSH 测试克隆(先配置好 SSH 密钥)
ssh -T -p 2222 git@你的IP
# 首次连接输入 yes,之后应返回欢迎信息
创建一个测试仓库验证功能:
# 登录后创建一个新仓库,命名为 test-repo
# 然后在终端执行:
git clone ssh://git@你的IP:2222/你的用户名/test-repo.git
cd test-repo
echo "hello gitea" > README.md
git add .
git commit -m "first commit"
git push -u origin main
如果推送成功,网页上的仓库就能看到你的文件了。
第六步:配置 HTTPS(推荐)
生产环境务必加上 HTTPS。用 Caddy 做反向代理最简单:
docker run -d \
--name caddy \
-p 80:80 -p 443:443 \
-v caddy_data:/data \
-v caddy_config:/config \
-v $(pwd)/Caddyfile:/etc/caddy/Caddyfile \
--restart unless-stopped \
caddy:latest
创建 Caddyfile:
yourdomain.com {
reverse_proxy gitea:3000
}
然后把 Gitea 配置文件中的应用 URL 改为 https://yourdomain.com。
第七步:定期备份
创建备份脚本 backup.sh:
#!/bin/bash
BACKUP_DIR="/root/gitea/backups"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
# 备份数据目录
tar czf $BACKUP_DIR/gitea-data-$DATE.tar.gz data/
# 备份数据库
docker exec gitea-db pg_dump -U gitea gitea | gzip > $BACKUP_DIR/gitea-db-$DATE.sql.gz
# 只保留最近 7 天的备份
find $BACKUP_DIR -name "*.gz" -mtime +7 -delete
echo "Backup completed: $DATE"
添加到 crontab 每天凌晨 3 点自动备份:
crontab -e
# 添加这一行:
0 3 * * * /root/gitea/backup.sh >> /root/gitea/logs/backup.log 2>&1
常见问题
Q: 忘记管理员密码怎么办?
docker exec -it gitea gitea admin change-password <username>
Q: 如何迁移到其他服务器?
直接把 data、pg_data、ssh 三个目录拷贝到新服务器,启动同样的 docker-compose 即可。
Q: 端口冲突怎么办?
如果本机 22 端口被占用,修改 docker-compose.yml 中 gitea 的端口映射,比如改成 "2223:22",然后对应修改 SSH URL。
Q: 怎么给团队成员发邀请?
登录后进入组织页面 → 成员管理 → 邀请成员,输入邮箱即可。也可以分享邀请链接。
Q: 支持 Git LFS 吗?
需要额外配置。在 Gitea 配置文件 app.ini 中添加:
[lfs]
ENABLED = true
PATH = /data/git-lfs
然后重启容器。
下一步
Gitea 搭好后,你可以:
- 接入 Gitea Actions 实现 CI/CD 自动化
- 搭配 Gitea Mirror 同步到 GitHub
- 配置 Webhook 触发自动化部署
私有代码托管,数据永远在自己手里。这才是真正的安全感。