【Linux从入门到精通】第39篇:版本控制Git服务器搭建——Gitea/GitLab私有化部署

目录

一、引言:为什么需要私有Git服务器?

二、Git底层协议:三种通信方式

[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 三种协议对比总结)

三、搭建Gitea

[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 创建仓库并推送代码)

四、配置SSH免密推送

[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搭建流程

  1. 创建MySQL数据库和用户

  2. 下载Gitea二进制文件,创建工作目录

  3. 注册为systemd服务

  4. Web界面完成初始化配置

  5. 添加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面向版本历史。

相关推荐
浪客灿心4 小时前
Linux网络HTTP协议
linux
橙子也要努力变强4 小时前
volatile与信号
linux·服务器·c++
lst04264 小时前
Git 巨大失误案例记录 (2026-05-01)
大数据·git·elasticsearch
蜡笔小新拯救世界4 小时前
部分安全笔记总结
linux·网络·web安全
醇氧5 小时前
WSL 安装 Ubuntu 完整步骤(Windows 10/11 通用,极简无脑版)
linux·windows·ubuntu
中微子5 小时前
养虾小妙招:如何用 OpenClaw 把 Claude Code 调教成你的专属打工仔
linux·人工智能
TeDi TIVE5 小时前
Linux下MySQL的简单使用
linux·mysql·adb
Lucky_Turtle5 小时前
【Linux】debain13开启bbr
服务器·azure
ERBU DISH5 小时前
Linux下启动redis
linux·redis·bootstrap