用 Docker 一键部署 Gitea:打造你的私有代码托管平台

为什么需要私有代码托管?

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
应用 URLhttp://你的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: 如何迁移到其他服务器?

直接把 datapg_datassh 三个目录拷贝到新服务器,启动同样的 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 触发自动化部署

私有代码托管,数据永远在自己手里。这才是真正的安全感。

这篇文章对你有帮助吗?