目录
[2.1 本地协议(file://)](#2.1 本地协议(file://))
[2.2 HTTP/HTTPS协议](#2.2 HTTP/HTTPS协议)
[2.3 SSH协议](#2.3 SSH协议)
[2.4 Git协议(原生协议)](#2.4 Git协议(原生协议))
[2.5 三种协议对比总结](#2.5 三种协议对比总结)
[3.1 环境准备](#3.1 环境准备)
[3.2 创建数据库](#3.2 创建数据库)
[3.3 下载并配置Gitea](#3.3 下载并配置Gitea)
[3.4 注册为systemd服务](#3.4 注册为systemd服务)
[3.5 Web界面初始化](#3.5 Web界面初始化)
[3.6 创建仓库并推送代码](#3.6 创建仓库并推送代码)
[4.1 Gitea的SSH设计](#4.1 Gitea的SSH设计)
[4.2 配置步骤](#4.2 配置步骤)
[4.3 如果SSH不通的排查](#4.3 如果SSH不通的排查)
[5.1 Gitea备份](#5.1 Gitea备份)
[5.2 升级Gitea](#5.2 升级Gitea)
一、引言:为什么需要私有Git服务器?
GitHub很好用,但在某些场景下,你需要把代码放在自己手里:
-
代码合规:金融、政务等行业要求代码不得出境
-
访问速度:内网开发时,GitHub偶尔抽风会影响整个团队
-
完全控制:自定义备份策略、集成公司SSO单点登录、审计所有操作日志
市面上有两个主流选择:
| 平台 | 定位 | 资源要求 | 适合场景 |
|---|---|---|---|
| Gitea | 轻量级自托管Git服务 | 1核1G即可流畅运行 | 小型团队、个人项目 |
| GitLab | 企业级DevOps平台 | 最低4核4G | 大型团队、需要CI/CD |
Gitea是Go语言编写的一个开源Git托管平台,安装包只有几十MB,内存占用极低。GitLab功能更全面(内置CI/CD、Docker Registry等),但资源消耗是Gitea的5倍以上。对于学习和中小型项目,Gitea是最佳起点。
二、Git底层协议:三种通信方式
在搭建Git服务器之前,先理解git clone底层用了什么协议。Git支持三种传输协议:
2.1 本地协议(file://)
bash
git clone /path/to/repo.git
git clone file:///path/to/repo.git
直接从本地文件系统克隆。几乎不用网络,但只能在同一台机器上操作。
2.2 HTTP/HTTPS协议
bash
git clone https://github.com/user/repo.git
认证方式:用户名+密码(或Token)。企业防火墙通常放行HTTPS端口,因此最通用。
智能HTTP:Git 1.6.6+引入的优化,服务端能主动选择只发送客户端需要的对象,而不是整个仓库,大幅减少数据传输量。
2.3 SSH协议
bash
git clone git@github.com:user/repo.git
认证方式:SSH密钥对(我们在第19篇详细学过)。这是开发者最常用的方式,因为配置免密后,推送代码无需每次输入密码。
2.4 Git协议(原生协议)
使用端口9418,无加密且不要求认证。由于缺乏安全性和实际部署困难,实际项目中极少使用。
2.5 三种协议对比总结
| 协议 | 认证方式 | 加密 | 防火墙友好 | 适用场景 |
|---|---|---|---|---|
| HTTPS | 密码/Token | ✅ TLS加密 | ✅ 通常放行443 | 通用,首次使用者友好 |
| SSH | 密钥对 | ✅ SSH加密 | ⚠️ 部分防火墙拦截22 | 开发者日常使用,免密 |
| 本地 | 无(依赖文件系统权限) | ❌ | N/A | 单机测试 |
实际项目中的最佳实践:日常工作用SSH(免密推送),只在首次克隆或CI/CD自动化脚本中使用HTTPS。这两种方式可以同时配置,共用同一个远程仓库。
三、搭建Gitea
3.1 环境准备
Gitea官方提供了编译好的二进制文件,下载即可运行。它支持SQLite、MySQL、PostgreSQL作为数据库。生产环境推荐MySQL。
bash
# 创建运行Gitea的系统用户
sudo adduser --system --group --disabled-password --home /home/git git
# 安装MySQL(参考第33篇)
sudo apt update && sudo apt install mysql-server -y
sudo mysql_secure_installation
3.2 创建数据库
sql
sudo mysql -u root -p
sql
CREATE DATABASE gitea CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'gitea'@'localhost' IDENTIFIED BY 'GiteaStrongPassword123!';
GRANT ALL PRIVILEGES ON gitea.* TO 'gitea'@'localhost';
FLUSH PRIVILEGES;
EXIT;
3.3 下载并配置Gitea
bash
# 下载最新稳定版(以1.21为例,实际请访问 https://dl.gitea.com 获取最新版本号)
wget -O /usr/local/bin/gitea https://dl.gitea.com/gitea/1.21/gitea-1.21-linux-amd64
sudo chmod +x /usr/local/bin/gitea
# 创建工作目录
sudo mkdir -p /var/lib/gitea/{custom,data,log}
sudo chown -R git:git /var/lib/gitea/
sudo chmod -R 750 /var/lib/gitea/
3.4 注册为systemd服务
使用第15篇学过的systemd技能,将Gitea注册为系统服务:
bash
sudo vim /etc/systemd/system/gitea.service
ini
[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target
After=network.target
After=mysql.service
[Service]
Type=simple
User=git
Group=git
WorkingDirectory=/var/lib/gitea/
ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
Restart=always
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea
[Install]
WantedBy=multi-user.target
bash
sudo systemctl daemon-reload
sudo systemctl enable --now gitea
3.5 Web界面初始化
浏览器访问http://服务器IP:3000,进入首次安装向导:
| 配置项 | 建议值 | 说明 |
|---|---|---|
| 数据库类型 | MySQL | 选择你之前创建的数据库 |
| 数据库主机 | 127.0.0.1:3306 | 本地数据库 |
| 数据库用户 | gitea | 之前创建的用户 |
| 数据库密码 | GiteaStrongPassword123! | 之前设置的密码 |
| 数据库名 | gitea | 之前创建的数据库 |
| 站点名称 | My Team Git | 自定义 |
| 域名 | 服务器IP或域名 | 生成克隆URL时使用 |
| SSH端口 | 22 | 保持不变 |
| 基础URL | http://服务器IP:3000/ | 对外提供服务的地址 |
点击"安装Gitea"后,自动完成数据库初始化和配置写入。
3.6 创建仓库并推送代码
安装完成后,注册第一个用户(自动成为管理员),然后创建仓库:
bash
# 在本地项目目录中
git init
git add .
git commit -m "Initial commit"
git remote add origin http://服务器IP:3000/用户名/仓库名.git
git push -u origin main
四、配置SSH免密推送
4.1 Gitea的SSH设计
Gitea通过/home/git/.ssh/authorized_keys管理所有用户的SSH公钥。当你在Web界面添加SSH公钥时,Gitea会自动写入这个文件,并配合内部的gitea serv命令来区分不同用户的权限。
4.2 配置步骤
第一步:生成密钥对(在你的本地电脑上)
bash
ssh-keygen -t ed25519 -C "your_email@example.com"
第二步:在Gitea Web界面添加公钥
登录Gitea → 右上角头像 → 设置 → SSH/GPG密钥 → 添加密钥:
bash
# 复制公钥内容
cat ~/.ssh/id_ed25519.pub
粘贴到文本框,保存。
第三步:用SSH地址克隆
bash
git clone git@服务器IP:用户名/仓库名.git
# 或者在仓库页面直接复制SSH地址
4.3 如果SSH不通的排查
bash
# 测试SSH连接
ssh -vT git@服务器IP
# 正常情况应该看到 "Hi there, 用户名! You've successfully authenticated..."
# 如果没有,检查 /home/git/.ssh/authorized_keys 中是否有你的公钥
五、备份与维护
5.1 Gitea备份
Gitea的数据包含两个部分:数据库 (存元数据)和仓库目录(存Git对象和附件)。备份时需要同时备份两者:
bash
# 备份数据库
sudo mysqldump -u root -p gitea > gitea_db_backup.sql
# 备份仓库目录
sudo rsync -av /var/lib/gitea/data/repositories/ /backup/gitea-repos/
使用第38篇学到的定时同步利器rsync,配合crontab定时执行:
bash
0 3 * * * /opt/scripts/gitea_backup.sh
5.2 升级Gitea
Gitea的升级非常简洁------下载新版本二进制文件替换即可:
bash
# 1. 停止服务
sudo systemctl stop gitea
# 2. 备份(重要!)
# 执行上面的备份步骤
# 3. 下载新版本并替换
wget -O gitea_new https://dl.gitea.com/gitea/版本号/gitea-版本号-linux-amd64
sudo mv gitea_new /usr/local/bin/gitea
sudo chmod +x /usr/local/bin/gitea
# 4. 启动服务
sudo systemctl start gitea
六、本篇小结
Git协议选择:
| 协议 | 特点 | 使用场景 |
|---|---|---|
| SSH | 密钥认证,免密推送 | 开发者日常工作(推荐) |
| HTTPS | 密码/Token认证 | CI/CD脚本、首次使用 |
| 本地 | 无网络需求 | 单机测试 |
Gitea搭建流程:
-
创建MySQL数据库和用户
-
下载Gitea二进制文件,创建工作目录
-
注册为systemd服务
-
Web界面完成初始化配置
-
添加SSH公钥,用
git clone git@服务器:用户/仓库.git推送代码
核心优势:
-
二进制文件几十MB,资源占用极低
-
内置Wiki、Issue跟踪、Pull Request、Actions(CI/CD)
-
维护简单:升级就是替换一个文件
动手练习
bash
# 1. 下载并运行Gitea(使用内置SQLite快速体验,无需装MySQL)
wget -O gitea https://dl.gitea.com/gitea/1.21/gitea-1.21-linux-amd64
chmod +x gitea
./gitea web # 使用SQLite作为数据库(默认),跳过MySQL安装
# 在另一终端或浏览器访问 http://localhost:3000
# 初始配置选SQLite3,路径填任意可写目录即可
# 2. 创建一个测试仓库
# 在Web界面创建后,本地测试推送
mkdir test-repo && cd test-repo
git init
echo "# Test" > README.md
git add . && git commit -m "first commit"
git remote add origin http://localhost:3000/你的用户名/test-repo.git
git push -u origin main
# 3. 配置SSH免密
# 在Web界面 → 设置 → SSH密钥 → 添加 ~/.ssh/id_ed25519.pub
git remote set-url origin git@localhost:你的用户名/test-repo.git
git pull # 测试SSH免密是否生效
# 4. 如果只想临时体验,体验后停止并清理:
# Ctrl+C 停止 ./gitea web
# rm -rf gitea gitea.db test-repo
七、下篇预告
Gitea让团队有了私有代码仓库,但Web应用还没部署到生产环境。下一篇我们将搭建LAMP/LNMP环境------Linux + Nginx/Apache + MySQL + PHP/Python,这是运行Web应用的经典组合。与前面各篇文章零散安装不同,这次我们将用一篇Shell脚本把Nginx、MySQL、PHP从安装到配置全部自动化,真正把第二阶段学到的脚本技能用到生产实战中。
延伸思考:Git与rsync都是"增量传输",但思路完全不同。rsync用校验和匹配找到变化的部分;Git在最初的设计中依靠对象模型------如果两个文件内容相同,它们共享同一个对象的哈希,从根本上避免了重复存储。Git的pack文件进一步把多个对象增量压缩,接近rsync的效果但实现更复杂。这是同一问题的两种不同解法:rsync面向通用同步,Git面向版本历史。