Git 服务器搭建

Git服务器搭建指南

掌握自建Git服务器的完整流程,从基础SSH服务器到企业级GitLab部署

开始学习

Git服务器核心概念

什么是Git服务器?

Git服务器是存储Git仓库的中央位置,允许团队成员协作开发项目。与集中式版本控制系统不同,Git服务器主要作为代码同步和协作的中心点。

  • 存储项目的中央仓库
  • 支持多用户协作
  • 提供访问控制和权限管理
  • 可作为备份和代码分发中心

自建服务器的优势

相比使用GitHub、GitLab等托管服务,自建Git服务器有以下优势:

  • 完全控制:完全掌控服务器和数据
  • 数据隐私:代码保留在企业内部
  • 成本控制:长期使用成本更低
  • 自定义配置:根据需求定制功能
  • 网络优化:内网访问速度更快

Git服务器工作流程

开发者

本地开发环境

网络传输

SSH/HTTP/Git协议

Git服务器

中央代码仓库

搭建前的准备工作

  • 服务器选择:物理服务器、虚拟机或云服务器
  • 操作系统:Linux (Ubuntu/CentOS) 或 Windows Server
  • 网络配置:固定IP地址、域名解析、防火墙规则
  • 备份策略:定期备份仓库数据
  • 用户管理:SSH密钥或用户账户管理

提示: 对于小型团队或个人项目,可以从简单的SSH服务器开始。对于企业级需求,建议使用GitLab或Gitea等完整解决方案。

Git服务器访问协议

SSH协议

最常用的Git服务器协议,提供安全的加密连接。

  • 优点:安全性高、配置简单
  • 缺点:需要SSH访问权限
  • 端口:22(默认)
  • 认证:SSH密钥对
git clone user@server:/path/to/repo.git
HTTP/HTTPS协议

通过Web服务器提供Git服务,易于防火墙穿透。

  • 优点:易于使用、防火墙友好
  • 缺点:需要额外配置
  • 端口:80/443
  • 认证:用户名密码或令牌
git clone https://server.com/repo.git
Git协议

Git专用协议,性能最佳但无身份验证。

  • 优点:性能最佳、简单
  • 缺点:无身份验证
  • 端口:9418
  • 认证:无(只读访问)
git clone git://server.com/repo.git

协议选择指南

场景 推荐协议 理由
小型团队内部使用 SSH 配置简单,安全性高
公开只读仓库 Git 性能最佳,配置简单
企业级部署 HTTPS 易于管理,防火墙友好
混合环境 SSH + HTTPS 提供灵活性
开源项目 所有协议 最大化可访问性

协议配置要点

  • SSH协议:配置SSH密钥、设置权限、考虑使用Git Shell限制用户
  • HTTP协议:配置Web服务器、设置认证、启用Git智能HTTP
  • Git协议:启动Git守护进程、配置防火墙、设置仓库权限

安全警告: Git协议不提供任何身份验证机制,只适合公开只读仓库。对于需要写权限的仓库,务必使用SSH或HTTPS协议。

性能提示: 对于大型仓库,Git协议通常提供最佳性能,因为它的协议开销最小。SSH协议次之,HTTPS协议由于加密开销性能相对较低。

SSH Git服务器搭建

1. 服务器准备

安装Git和SSH

2. 创建用户

设置Git用户账户

3. SSH配置

配置SSH密钥认证

4. 初始化仓库

创建裸仓库

详细搭建步骤

# 1. 在Ubuntu/CentOS服务器上安装Git
sudo apt update && sudo apt install git
# 或 CentOS: sudo yum install git

# 2. 创建Git专用用户
sudo adduser git
sudo passwd git

# 3. 切换到Git用户并创建SSH目录
sudo su - git
mkdir ~/.ssh && chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys

# 4. 添加开发者的公钥到authorized_keys
echo "ssh-rsa AAAAB3NzaC1yc2E... user@dev-machine" >> ~/.ssh/authorized_keys

# 5. 初始化Git裸仓库
mkdir /home/git/repositories
cd /home/git/repositories
git init --bare myproject.git

# 6. 设置仓库权限
sudo chown -R git:git /home/git/repositories
sudo chmod -R 755 /home/git/repositories

客户端配置与使用

开发者客户端配置:

# 1. 生成SSH密钥对(如果还没有)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

# 2. 将公钥发送给服务器管理员添加到authorized_keys
cat ~/.ssh/id_rsa.pub

# 3. 克隆远程仓库
git clone git@yourserver.com:/home/git/repositories/myproject.git

# 4. 或添加远程仓库到现有项目
git remote add origin git@yourserver.com:/home/git/repositories/myproject.git
git push -u origin main

高级配置

限制Git用户只能进行Git操作:

# 1. 修改Git用户的shell为git-shell
sudo chsh git -s $(which git-shell)

# 2. 或创建自定义shell脚本限制命令
sudo vim /home/git/git-shell-commands
# 内容:限制允许的命令

# 3. 在/etc/ssh/sshd_config中添加限制
Match User git
AllowTCPForwarding no
X11Forwarding no
ForceCommand /usr/bin/git-shell -c "$SSH_ORIGINAL_COMMAND"

仓库管理命令

创建新仓库
git init --bare project.git
删除仓库
rm -rf project.git
备份仓库
git clone --mirror repo.git backup-repo.git
迁移仓库
git push --mirror new-location

SSH服务器优化

  • 连接保持:配置SSH连接保持活跃
  • 密钥轮换:定期更新SSH密钥
  • 访问日志:启用SSH访问日志记录
  • 防火墙配置:限制SSH访问来源IP
  • Fail2ban:安装Fail2ban防止暴力破解

性能优化: 对于大型团队,可以考虑使用SSH连接池或配置Git的pack配置来优化性能。

企业级Git解决方案

GitLab

功能完整的DevOps平台

  • 许可证:社区版免费,企业版付费
  • 功能:CI/CD、问题跟踪、Wiki等
  • 资源需求:4GB+ RAM,推荐8GB+
  • 部署方式:Omnibus包、Docker、源码
# Ubuntu安装
curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
sudo EXTERNAL_URL="https://gitlab.example.com" apt install gitlab-ce
Gitea

轻量级自托管Git服务

  • 许可证:MIT(完全免费)
  • 功能:代码托管、Pull Requests、问题跟踪
  • 资源需求:1GB+ RAM,推荐2GB+
  • 部署方式:二进制、Docker、包管理
# 二进制安装
wget -O gitea https://dl.gitea.io/gitea/1.18/gitea-1.18-linux-amd64
chmod +x gitea
./gitea web
Gogs

极简自托管Git服务

  • 许可证:MIT(完全免费)
  • 功能:基础Git托管、问题跟踪
  • 资源需求:512MB+ RAM
  • 部署方式:二进制、Docker
# 二进制安装
wget https://gogs.io/gogs_latest_linux_amd64.zip
unzip gogs_latest_linux_amd64.zip
cd gogs
./gogs web

解决方案比较

特性 GitLab Gitea Gogs
安装复杂度
资源需求
功能完整性 完整 丰富 基础
CI/CD集成 内置 通过Actions
社区活跃度 非常高

选择指南

企业级部署

推荐:GitLab

  • 需要完整的DevOps工具链
  • 有专门的运维团队
  • 需要企业级支持和功能
  • 资源充足(8GB+ RAM)
中小团队

推荐:Gitea

  • 平衡功能和资源需求
  • 需要现代化界面和功能
  • 资源有限(2-4GB RAM)
  • 易于维护和升级
个人或极简需求

推荐:Gogs或SSH服务器

  • 资源非常有限
  • 只需要基础Git功能
  • 对性能要求极高
  • 技术能力较强

安全配置与最佳实践

SSH安全配置

关键安全措施
  • 禁用密码认证,只使用SSH密钥
  • 修改默认SSH端口
  • 使用Fail2ban防止暴力破解
  • 限制用户权限(使用git-shell)
  • 定期更新SSH密钥
SSH配置示例
# /etc/ssh/sshd_config
Port 2222 # 修改默认端口
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AllowUsers git
ClientAliveInterval 300
ClientAliveCountMax 2
MaxAuthTries 3

系统安全配置

系统加固
  • 定期更新系统和软件包
  • 配置防火墙限制访问
  • 启用系统日志和审计
  • 使用非特权用户运行服务
  • 配置定期备份
备份策略
#!/bin/bash
# Git仓库备份脚本
BACKUP_DIR="/backup/git-repos"
REPO_DIR="/home/git/repositories"
DATE=$(date +%Y%m%d)

# 创建备份目录
mkdir -p $BACKUP_DIR/$DATE

# 备份所有仓库
for repo in $REPO_DIR/*.git; do
repo_name=$(basename $repo)
git clone --mirror $repo $BACKUP_DIR/$DATE/$repo_name
done

# 删除7天前的备份
find $BACKUP_DIR -type d -mtime +7 -exec rm -rf {} \;

监控与维护

磁盘空间监控
df -h /home/git
仓库大小检查
du -sh /home/git/repositories/*
Git垃圾回收
git gc --aggressive --prune=now
SSH连接监控
tail -f /var/log/auth.log | grep ssh

维护提示: 定期运行git gc可以优化仓库性能。对于大型仓库,可以考虑设置钩子脚本在每次推送后自动运行垃圾回收。

故障排除

检查SSH密钥权限和仓库权限:

# 检查客户端密钥权限
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub

# 检查服务器端权限
sudo chown -R git:git /home/git/repositories
sudo chmod 755 /home/git/repositories
sudo chmod 644 /home/git/.ssh/authorized_keys

检查网络连接和防火墙设置:

# 测试网络连接
ping yourserver.com
telnet yourserver.com 22

# 检查服务器SSH服务状态
sudo systemctl status ssh
sudo netstat -tlnp | grep :22

# 检查防火墙规则
sudo ufw status
sudo iptables -L

检查仓库配置和分支保护:

# 检查仓库是否为裸仓库
cd /path/to/repo.git
git config --get core.bare # 应该返回true

# 检查接收钩子
ls -la hooks/ | grep receive

# 检查分支保护设置
cat config | grep -A5 -B5 receive

# 重置仓库权限(谨慎使用)
sudo chown -R git:git /path/to/repo.git
sudo chmod -R 755 /path/to/repo.git

重要: 在修改权限时要特别小心,错误的权限设置可能导致安全漏洞或服务不可用。建议在测试环境中验证配置后再应用到生产环境。