Git 服务器搭建完全指南 / 第 1 章 - Git 服务器概述
第 1 章 - Git 服务器概述
1.1 为什么需要自建 Git 服务器
在 GitHub、GitLab.com 等公有云平台之外,自建 Git 服务器有以下核心优势:
| 维度 | 公有云平台 | 自建服务器 |
|---|---|---|
| 数据主权 | 数据存储在第三方 | 数据完全自控 |
| 成本 | 免费版有限制,私有仓库按人收费 | 硬件 + 运维成本,长期更经济 |
| 网络访问 | 依赖公网,国内可能较慢 | 内网高速访问 |
| 定制能力 | 受限于平台功能 | 完全可控,可集成内部系统 |
| 合规要求 | 可能不满足等保/行业合规 | 满足企业合规需求 |
典型业务场景
场景一:企业源代码管控
某金融公司要求所有代码不出内网,需在 IDC 机房部署 Git 服务,与内部 LDAP 打通,所有推送操作需审计记录。
场景二:团队效能提升
10 人研发团队希望拥有 Code Review、CI/CD 能力,但预算有限,无法承担 GitLab SaaS 企业版费用。
场景三:个人代码托管
开发者希望将私有项目存放在自己的 VPS 上,不依赖任何第三方平台。
1.2 Git 传输协议
Git 支持四种主要传输协议,理解它们是搭建服务器的基础。
1.2.1 本地协议(Local)
直接通过文件系统路径访问仓库。
# 克隆本地仓库
git clone /opt/git/project.git
# 也可以使用 file:// 前缀
git clone file:///opt/git/project.git
| 优点 | 缺点 |
|---|---|
| 零配置,简单直接 | 无法远程访问 |
| 适合单机使用 | 权限控制依赖文件系统 |
| 性能最好 | 不适合团队协作 |
适用场景:个人本地备份、同一台机器上的 CI 构建。
1.2.2 HTTP/HTTPS 协议
现代 Git 服务器最常用的协议,支持智能 HTTP 传输。
# 克隆(需要认证时会提示输入密码)
git clone https://git.example.com/team/project.git
# 设置凭据缓存(避免重复输入密码)
git config --global credential.helper cache
git config --global credential.helper 'cache --timeout=3600'
工作原理:
客户端 服务端
| |
|-- GET /info/refs -------->| (发现引用)
|<-- 200 refs -------------|
| |
|-- POST /git-upload-pack ->| (协商需要的对象)
|<-- 200 packfile ---------|
| |
| 优点 | 缺点 |
|---|---|
| 穿透防火墙(80/443 端口) | 需要 Web 服务器支持 |
| 支持认证(用户名密码/Token) | 配置比 SSH 复杂 |
| 可用 CDN 加速 | 匿名访问需额外配置 |
| 推拉统一端口 | 需要 SSL 证书(HTTPS) |
适用场景:企业环境、需要 Web 界面、CI/CD 集成。
1.2.3 SSH 协议
最常用的 Git 传输协议,利用系统 SSH 服务进行认证和传输。
# 克隆
git clone git@git.example.com:team/project.git
# 使用自定义端口
git clone ssh://git@git.example.com:2222/team/project.git
认证流程:
客户端 SSH 服务端 (git.example.com:22)
| |
|-- SSH 握手 ------------->|
|<-- 服务器公钥 ------------|
|-- 客户端公钥认证 -------->| (验证 ~/.ssh/authorized_keys)
|<-- 认证成功 -------------|
| |
|-- git-receive-pack ----->| (推送)
| 或 git-upload-pack --->| (拉取)
|<-- packfile -------------|
| 优点 | 缺点 |
|---|---|
| 无需额外服务(利用系统 SSH) | 需要管理 SSH 密钥 |
| 加密传输,安全性高 | 默认端口 22 可能被封 |
| 认证成熟稳定 | 推送需有系统用户账号 |
| 广泛支持 | HTTP 穿透性更好 |
适用场景:开发团队日常使用、服务器管理。
1.2.4 Git 协议(git://)
Git 自有的守护进程协议,使用端口 9418。
# 克隆(仅支持匿名读取)
git clone git://git.example.com/project.git
| 优点 | 缺点 |
|---|---|
| 读取性能最好 | 不支持认证 |
| 匿名访问方便 | 不支持推送(默认) |
| 防火墙不友好(自定义端口) |
适用场景:开源项目公开只读镜像,目前已较少使用。
协议选择决策树
需要匿名公开访问?
├── 是 → HTTP(Smart HTTP)
└── 否 → 团队内部使用?
├── 是 → SSH 或 HTTPS
│ ├── 已有 SSH 密钥管理 → SSH
│ └── 需要 Web 界面/Token 认证 → HTTPS
└── 否 → 根据安全要求选择
1.3 裸仓库(Bare Repository)
搭建 Git 服务器的核心概念是裸仓库——没有工作目录的仓库。
普通仓库 vs 裸仓库
| 特性 | 普通仓库 | 裸仓库 |
|---|---|---|
| 工作目录 | 有(可编辑文件) | 无 |
.git 目录 | 存在,内容在 .git/ 中 | 仓库内容直接在根目录 |
| 用途 | 日常开发 | 服务器端共享 |
| 推送 | 不推荐直接推送到当前分支 | 专门用于接收推送 |
# 创建裸仓库
git init --bare /opt/git/project.git
# 查看裸仓库结构
ls /opt/git/project.git/
# HEAD config description hooks/ info/ objects/ refs/
# 对比:普通仓库结构
ls project/
# .git/ src/ README.md ...
ls project/.git/
# HEAD config description hooks/ info/ objects/ refs/
裸仓库本质上就是把普通仓库的 .git 目录内容直接放在仓库根目录。
创建第一个裸仓库
# 1. 创建 Git 专用目录
sudo mkdir -p /opt/git
sudo chown git:git /opt/git
# 2. 创建裸仓库
cd /opt/git
git init --bare project.git
# 3. 在本地克隆并推送初始代码
# (在开发机器上执行)
git clone git@server:/opt/git/project.git
cd project
echo "# Project" > README.md
git add .
git commit -m "Initial commit"
git push -u origin main
1.4 Git 服务器方案全景
1.4.1 方案对比
功能丰富度
↑
│ GitLab CE ────────────●
│ │
│ Forgejo ──────● │
│ Gitea ────────● │
│ │
│ Gitolite ──● │
│ │ │
│ 裸仓库+SSH ● │
│ │ │
└──────────────────────────→ 运维复杂度
1.4.2 各方案详细对比
| 方案 | 语言 | 内存占用 | Web 界面 | CI/CD | LFS | 包管理 | 审计日志 |
|---|---|---|---|---|---|---|---|
| 裸仓库+SSH | Shell | < 10 MB | ❌ | ❌ | ❌ | ❌ | ❌ |
| Gitolite | Perl | < 50 MB | 基础 | ❌ | ❌ | ❌ | 基础 |
| Gitea | Go | 150-300 MB | ✅ | Actions | ✅ | ✅ | ✅ |
| Forgejo | Go | 150-300 MB | ✅ | Actions | ✅ | ✅ | ✅ |
| GitLab CE | Ruby | 2-4 GB | ✅ | CI/CD | ✅ | ✅ | ✅ |
1.4.3 选型建议
选裸仓库 + SSH,如果:
- 只有 1-5 人
- 不需要 Web 界面
- 服务器资源极其有限
- 只需要基本的推拉功能
选 Gitolite,如果:
- 5-50 人团队
- 需要细粒度的分支/仓库权限控制
- 不需要 Web 界面(或只需简单的 Gitweb)
- 服务器资源有限
选 Gitea,如果:
- 5-500 人团队
- 需要完整的 Web 界面(Issue、PR、Wiki)
- 需要 CI/CD(Gitea Actions)
- 希望轻量级部署,资源有限
选 Forgejo,如果:
- 认同社区驱动的开源理念
- 希望更强的隐私保护
- 需要与 Gitea 高度兼容的功能
- 关注项目的长期可持续性
选 GitLab CE,如果:
- 50+ 人以上团队
- 需要企业级功能(高级 CI/CD、安全扫描、合规)
- 有足够的服务器资源(8 GB+ 内存)
- 需要一体化 DevOps 平台
1.5 服务器基础准备
无论选择哪种方案,都需要先完成基础环境配置。
1.5.1 系统更新
# Ubuntu / Debian
sudo apt update && sudo apt upgrade -y
# CentOS / RHEL
sudo yum update -y
1.5.2 创建 Git 专用用户
# 创建 git 用户(用于管理仓库)
sudo adduser --system --shell /bin/bash --group --home /home/git git
# 设置密码(可选,SSH 密钥认证更安全)
sudo passwd git
1.5.3 SSH 服务配置
# 确认 SSH 服务已安装并运行
sudo systemctl status sshd
# 安装 SSH 服务(如未安装)
sudo apt install openssh-server -y
# 编辑 SSH 配置
sudo vim /etc/ssh/sshd_config
关键配置项:
# /etc/ssh/sshd_config
# 禁用密码登录(推荐仅使用密钥认证)
PasswordAuthentication no
# 禁用 root 登录
PermitRootLogin no
# 允许公钥认证
PubkeyAuthentication yes
# 指定允许登录的用户
AllowUsers git your_username
# 可选:修改默认端口
# Port 2222
# 重启 SSH 服务
sudo systemctl restart sshd
1.5.4 防火墙配置
# UFW (Ubuntu)
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP(Web 界面需要)
sudo ufw allow 443/tcp # HTTPS(SSL 需要)
sudo ufw enable
sudo ufw status
# firewalld (CentOS)
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
1.5.5 磁盘规划
# 查看磁盘空间
df -h
# 建议的目录结构
/opt/git/ # Git 仓库数据(建议独立分区)
/var/backups/git/ # 备份目录
/var/log/git/ # 日志目录
注意: Git 仓库可能快速增长,尤其是二进制文件较多的项目。建议初始分配足够磁盘空间,并设置监控告警。
1.6 SSH 密钥管理基础
1.6.1 生成 SSH 密钥对
# 在开发机器上生成密钥
ssh-keygen -t ed25519 -C "your_email@example.com"
# 输出:
# Generating public/private ed25519 key pair.
# Enter file in which to save the key (/home/user/.ssh/id_ed25519):
# Enter passphrase (empty for no passphrase):
# Your identification has been saved in /home/user/.ssh/id_ed25519
# Your public key has been saved in /home/user/.ssh/id_ed25519.pub
安全建议: 始终为密钥设置 passphrase。使用
ssh-agent管理密钥,避免每次输入密码。
1.6.2 部署公钥到服务器
# 方式一:ssh-copy-id(推荐)
ssh-copy-id -i ~/.ssh/id_ed25519.pub git@your-server
# 方式二:手动复制
cat ~/.ssh/id_ed25519.pub | ssh git@your-server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
1.6.3 测试连接
# 测试 SSH 连接
ssh -T git@your-server
# 如果使用自定义端口
ssh -T -p 2222 git@your-server
# 查看详细连接信息(调试用)
ssh -vT git@your-server
1.7 扩展阅读
本章小结
| 学到了什么 | 关键要点 |
|---|---|
| 传输协议 | SSH(安全首选)、HTTP(穿透性好)、本地(单机)、git://(只读) |
| 裸仓库 | 服务器端使用,没有工作目录,就是 .git 的内容 |
| 方案选型 | 从简单的裸仓库到企业级 GitLab,根据团队规模和需求选择 |
| 基础准备 | 系统更新、Git 用户、SSH 配置、防火墙、磁盘规划 |
| SSH 密钥 | 使用 ed25519 算法,设置 passphrase,通过 authorized_keys 部署 |
下一章:第 2 章 - SSH 基础方案 — 使用裸仓库和 SSH 搭建最简单的 Git 服务器。