当前位置:首页 > 云服务器 > 正文

git 服务器端 搭建

安装Git→创建裸仓库( git init --bare)→配置SSH/HTTP访问→添加用户权限→推送

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

git 服务器端 搭建 第1张

基础环境准备

硬件/软件要求

项目 最低配置建议 说明
操作系统 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配置模板

git 服务器端 搭建 第2张

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

安装步骤

git 服务器端 搭建 第3张

# 下载并安装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: 常见原因及解决方法:

  1. 密钥未正确部署:确认~/.ssh/authorized_keys文件中包含客户端公钥,且权限为600;
  2. SSH服务未重启:执行sudo systemctl restart sshd;
  3. 路径拼写错误:检查~/.ssh/config中的HostName是否与实际服务器地址一致;
  4. SELinux拦截:临时关闭验证(getenforce查看状态,setenforce 0禁用)。

Q2: 如何实现多仓库统一管理?

A: 推荐两种方案:

  1. 虚拟主机映射:在Nginx中为每个仓库创建独立域名解析,如projectA.git.example.com指向对应仓库;
  2. 子目录分发:在git-http-backend配置中设置GIT_PROJECT_ROOT为总目录,通过URL路径区分仓库,例如https://git.example.com/projectA。


维护建议

  1. 定期备份:使用git bundle create backup.bundle --all导出完整快照;
  2. 版本升级:关注Git官方安全公告,及时更新至最新稳定版;
  3. 监控告警:配置Prometheus+Grafana监控磁盘使用率、连接数等指标;
  4. 灾难恢复:保留最近3次完整备份,测试恢复流程有效性

0