强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

第 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 [email protected]:team/project.git

# 使用自定义端口
git clone ssh://[email protected]: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/CDLFS包管理审计日志
裸仓库+SSHShell< 10 MB
GitolitePerl< 50 MB基础基础
GiteaGo150-300 MBActions
ForgejoGo150-300 MBActions
GitLab CERuby2-4 GBCI/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 "[email protected]"

# 输出:
# 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 服务器。