git 服务器端 搭建
- 云服务器
- 2025-08-11
- 9
本文将详细介绍如何在Linux系统(以Ubuntu为例)上搭建自主可控的Git服务器,涵盖SSH协议和HTTP(S)协议两种主流访问方式,并提供权限管理、安全加固及扩展功能实现方案。

基础环境准备
硬件/软件要求
| 项目 | 最低配置建议 | 说明 |
|---|---|---|
| 操作系统 | Ubuntu 20.04+ | 支持Debian系发行版 |
| CPU核心数 | 2核 | 多用户场景建议4核以上 |
| 内存 | 2GB | 高并发场景需更大内存 |
| 磁盘空间 | 50GB+ | 根据代码库规模调整 |
| 网络带宽 | ≥1Mbps | 多人同步时需更高带宽 |
必要组件安装
# 更新软件源并安装基础组件 sudo apt update && sudo apt install -y git openssh-server openssl
通过SSH协议搭建(推荐生产环境使用)
创建专用Git用户组
# 创建开发团队专属用户组 sudo groupadd developers # 创建普通用户并加入该组(示例用户:devuser) sudo useradd -m -g developers -s /bin/bash devuser # 设置密码(实际生产建议禁用密码登录) passwd devuser
SSH密钥认证配置
| 操作步骤 | 命令示例 | 作用 |
|---|---|---|
| 生成ED25519密钥对 | ssh-keygen -t ed25519 | 更安全的密钥算法 |
| 复制公钥到服务器 | ssh-copy-id devuser@your_server_ip | 免密登录配置 |
| 修改SSH配置文件 | sudo nano /etc/ssh/sshd_config | 关键参数调整 |
重要配置项修改:
# 禁止root直接登录 PermitRootLogin no # 仅允许密钥认证 PasswordAuthentication no # 指定允许的用户/组 AllowGroups developers # 限制Shell为git-shell(强制使用Git命令) ForceCommand /usr/bin/git-shell
初始化裸仓库
# 切换为git用户或授权用户 sudo su devuser mkdir ~/repos cd ~/repos git init --bare myproject.git chown -R devuser:developers myproject.git chmod -R 755 myproject.git exit
克隆与推送测试
# 本地客户端执行 git clone ssh://devuser@your_server_ip:/home/devuser/repos/myproject.git cd myproject echo "Test content" > test.txt git add . && git commit -m "Initial commit" git push origin main
通过HTTP(S)协议搭建(适合公开仓库)
Nginx反向代理配置
# 安装Nginx sudo apt install -y nginx # 创建站点配置文件 sudo nano /etc/nginx/sites-available/git.conf
Nginx配置模板:

server { listen 80; server_name git.example.com; location / { client_max_body_size 100M; # 限制上传大小 fastcgi_pass unix:/var/run/fcgiwrap.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend/githttp-backend.cgi; fastcgi_param GIT_PROJECT_ROOT /home/devuser/repos; fastcgi_param REMOTE_USER $remote_user; } }
启用FastCGI支持
# 安装FastCGI模块 sudo apt install -y fcgiwrap # 创建符号链接 sudo ln -s /usr/lib/git-core/git-http-backend/githttp-backend.cgi /usr/lib/cgi-bin/githttp-backend.cgi # 重启服务 sudo systemctl restart nginx
HTTPS加密配置(可选)
# 生成自签名证书(生产环境建议购买CA证书) sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/git.key -out /etc/ssl/certs/git.crt # 修改Nginx配置添加SSL支持 server { listen 443 ssl http2; ssl_certificate /etc/ssl/certs/git.crt; ssl_certificate_key /etc/ssl/private/git.key; ... # 其他配置同上 }
权限管理进阶方案
Gitolite工具集成(细粒度权限控制)
| 功能特性 | 实现方式 |
|---|---|
| 分支读写分离 | @branches = master => +read |
| IP白名单限制 | deny => @all except IPv4::192.168.1.0/24 |
| 强制代码审查 | require CHANGE_IDENTIFIER |
| 审计日志记录 | logpath => /var/log/gitolite.log |
安装步骤:

# 下载并安装Gitolite wget https://github.com/sitaramc/gitolite/archive/refs/tags/v3.x.tar.gz tar xzf v3.x.tar.gz cd gitolite-3.x/src sudo ./gl-system-install -t <admin_pubkey>
文件系统级权限控制
# 设置仓库所有权和权限掩码 sudo chown -R devuser:developers /home/devuser/repos/myproject.git find /home/devuser/repos/myproject.git -type d -exec chmod 755 {} ; find /home/devuser/repos/myproject.git -type f -exec chmod 644 {} ;
安全加固措施
| 风险点 | 防护措施 |
|---|---|
| 暴力免费攻破 | 启用Fail2Ban自动封禁异常IP |
| 敏感信息泄露 | 禁止git config --list等危险命令执行 |
| 恶意代码执行 | 设置core.safecrlf=true防止换行符载入 |
| 磁盘空间耗尽 | 定期清理大型二进制文件(git filter-branch --prune-empty) |
| 分布攻破 | 配置Nginx限流模块(limit_req_zone) |
相关问题与解答
Q1: 为什么通过SSH推送代码时报”Permission denied (publickey)”?
A: 常见原因及解决方法:
- 密钥未正确部署:确认~/.ssh/authorized_keys文件中包含客户端公钥,且权限为600;
- SSH服务未重启:执行sudo systemctl restart sshd;
- 路径拼写错误:检查~/.ssh/config中的HostName是否与实际服务器地址一致;
- SELinux拦截:临时关闭验证(getenforce查看状态,setenforce 0禁用)。
Q2: 如何实现多仓库统一管理?
A: 推荐两种方案:
- 虚拟主机映射:在Nginx中为每个仓库创建独立域名解析,如projectA.git.example.com指向对应仓库;
- 子目录分发:在git-http-backend配置中设置GIT_PROJECT_ROOT为总目录,通过URL路径区分仓库,例如https://git.example.com/projectA。
维护建议
- 定期备份:使用git bundle create backup.bundle --all导出完整快照;
- 版本升级:关注Git官方安全公告,及时更新至最新稳定版;
- 监控告警:配置Prometheus+Grafana监控磁盘使用率、连接数等指标;
- 灾难恢复:保留最近3次完整备份,测试恢复流程有效性