凌峰创科服务平台

CentOS Git服务器搭建步骤详解?

我们将使用 Gitosis 来管理用户和仓库,这是一种轻量级、基于 SSH 的解决方案,非常适合小团队或个人项目。

CentOS Git服务器搭建步骤详解?-图1
(图片来源网络,侵删)

方案概述

  1. 服务器端 (CentOS):
    • 安装 Git 和相关工具。
    • 创建一个专用的 git 用户来运行 Git 服务。
    • 安装并配置 Gitosis,它将通过管理一个特殊的 gitosis-admin 仓库来控制所有其他仓库的访问权限。
  2. 客户端 (您的开发机器):
    • 生成 SSH 密钥。
    • 克隆 gitosis-admin 仓库。
    • 通过修改这个仓库的配置文件来添加用户、创建新仓库。
    • 将修改后的配置推送到服务器,Gitosis 会自动应用。

第一步:在 CentOS 服务器上安装和配置 Git

更新系统

确保您的系统是最新的。

sudo yum update -y

安装 Git

使用 yum 包管理器安装 Git。

sudo yum install -y git

创建 git 用户

为了安全,我们不应该用 root 用户来运行 Git 服务,创建一个名为 git 的系统用户,并且不允许它登录 shell。

sudo adduser --system --shell /bin/bash --comment 'Git Version Control' --home-dir /home/git git
  • --system: 创建一个系统用户。
  • --shell /bin/bash: 虽然不登录,但需要 /bin/bash 来运行 Gitosis 的钩子脚本。
  • --home-dir /home/git: 指定家目录。

设置 git 用户的密码(可选)

如果您需要通过 susudo 切换到 git 用户,可以设置一个密码,否则,可以跳过。

CentOS Git服务器搭建步骤详解?-图2
(图片来源网络,侵删)
sudo passwd git

测试 git 用户

切换到 git 用户,并测试 Git 是否可用。

sudo su - git
git --version

如果看到 Git 版本号,说明安装成功。


第二步:安装和配置 Gitosis

安装 Gitosis 依赖

Gitosis 需要一些 Python 工具来安装。

# 先退出 git 用户,回到 root 或普通用户
exit
# 安装 Python 的 setuptools 和 pip
sudo yum install -y python python-setuptools python-pip
# 使用 pip 安装 Gitosis
sudo pip install gitosis

初始化 Gitosis

在服务器上,我们需要一个“初始”的公钥来配置 Gitosis,这个公钥应该来自您(管理员)的开发机器。

CentOS Git服务器搭建步骤详解?-图3
(图片来源网络,侵删)

操作流程:

A. 在您的开发机器上,获取您的公钥 打开终端,运行以下命令,它会显示您 ~/.ssh/ 目录下的 id_rsa.pub 文件内容。

# 如果您还没有 SSH 密钥,先生成一个
# ssh-keygen -t rsa -b 4096
cat ~/.ssh/id_rsa.pub

复制输出的完整内容(以 ssh-rsa 开头,以您的邮箱结尾)。

B. 在服务器上,使用该公钥初始化 Gitosis 回到服务器,以 git 用户身份操作。

sudo su - git
# 将您刚刚复制的公钥内容粘贴到这里,保存为一个文件,/tmp/admin.pub
# 假设公钥内容是:ssh-rsa AAAAB3NzaC1yc2E... admin@example.com
echo "ssh-rsa AAAAB3NzaC1yc2E... admin@example.com" > /tmp/admin.pub

使用这个 admin.pub 文件来初始化 Gitosis。

gitosis-init < /tmp/admin.pub

如果成功,你会看到类似 Initialized empty Git repository in /home/git/repositories/gitosis-admin.git/ 的输出,它会自动设置好 gitosis-admin 仓库的 post-update 钩子。

检查初始化结果

Gitosis 会创建一个 repositories 目录来存放所有 Git 仓库。

ls -l ~/repositories/

你应该能看到 gitosis-admin.git 这个仓库。


第三步:在客户端(开发机器)上配置 Gitosis

您需要从您的开发机器上管理 Git 服务器的所有配置。

克隆 gitosis-admin 仓库

这个仓库是 Gitosis 的“控制中心”,您需要将其克隆到本地。

# 退出服务器 git 用户
exit
# 在您的开发机器上执行
git clone git@your_server_ip:gitosis-admin.git
  • your_server_ip: 替换为您的 CentOS 服务器的 IP 地址。
  • 首次连接时,SSH 会询问您是否信任主机指纹,输入 yes 即可。

理解 gitosis-admin 的结构

克隆完成后,进入该目录,你会看到:

cd gitosis-admin
ls -l
  • gitosis.conf: 这是核心配置文件,用于定义用户、仓库和权限。
  • keydir/: 这个目录存放所有用户的公钥,文件名必须是用户的邮箱地址(或唯一标识),内容是对应的公钥。

添加新用户和新仓库(示例)

假设我们要添加一个新用户 developer,并为他创建一个名为 my-new-project 的仓库。

A. 获取新用户的公钥developer 用户在他的机器上执行:

# developer 在他自己的机器上
cat ~/.ssh/id_rsa.pub

他将得到一串公钥,ssh-rsa BBBB... developer@workpc.com

B. 将公钥添加到服务器developer 的公钥内容添加到服务器的 gitosis-admin 仓库中。

# 回到您的管理机器
cd gitosis-admin
# 创建新文件,文件名必须是邮箱地址
# 将 developer 的公钥内容粘贴进去
echo "ssh-rsa BBBB... developer@workpc.com" > keydir/developer@workpc.com

C. 修改 gitosis.conf 文件 打开 gitosis.conf 文件进行编辑。

vim gitosis.conf

一个典型的配置如下:

[gitosis]
[group gitosis-admin]
writable = gitosis-admin
members = admin@example.com  # 这里是管理员的邮箱
[group myteam]
writable = my-new-project    # 定义一个可写仓库
members = admin@example.com  # 管理员也是成员
members = developer@workpc.com # 添加新成员
[group readonly-viewers]
readonly = my-new-project   # 定义一个只读仓库
members = some_other_user@domain.com
  • [group <group_name>]: 定义一个用户组。
  • writable = <repo_name>: 组内成员对该仓库有读写权限。
  • readonly = <repo_name>: 组内成员对该仓库有只读权限。
  • members = <user_email>: 将用户添加到组中,用户邮箱必须与 keydir/ 目录下的文件名完全一致。

提交更改并推送到服务器**

保存并关闭 gitosis.conf 文件,然后提交您的更改。

git add .
git commit -m "Added developer user and created my-new-project"
git push origin master

当您 push 成功后,Gitosis 服务器会自动收到更新,并应用新的配置,它会:

  1. my-new-project 创建一个空的 Git 仓库。
  2. 更新 SSH 的授权文件,允许 developer 用户访问。

第四步:用户如何使用新仓库

developer 用户可以从他自己的机器上克隆新仓库了。

# developer 在他自己的机器上
git clone git@your_server_ip:my-new-project.git

如果一切顺利,他就能成功克隆到仓库了。


第五步:日常维护

  • 添加更多用户/仓库: 重复 第三步 的流程。
  • 删除用户/仓库: 从 gitosis.conf 中删除相应条目,并从 keydir/ 中删除对应的公钥文件,commitpush
  • 查看仓库列表: 您可以在服务器的 /home/git/repositories/ 目录下看到所有已创建的仓库。

安全建议

  1. 防火墙: 确保服务器的防火墙(如 firewalldiptables)只开放了必要的端口(SSH 默认 22)。
    # 使用 firewalld
    sudo firewall-cmd --permanent --add-service=ssh
    sudo firewall-cmd --reload
  2. 禁用密码登录: 为了更高的安全性,可以在服务器的 SSH 配置 (/etc/ssh/sshd_config) 中禁用密码登录,强制使用 SSH 密钥。
    • 找到 PasswordAuthentication yes,将其改为 PasswordAuthentication no
    • 重启 SSH 服务: sudo systemctl restart sshd
  3. 定期更新: 定期运行 sudo yum update -y 来保持系统和软件包的最新状态。

常见问题排查

  • Permission denied (publickey).:
    • 检查客户端的 ~/.ssh/id_rsa.pub 是否正确添加到服务器的 gitosis-admin/keydir/ 目录下。
    • 检查 gitosis.confmembers 字段的邮箱是否与 keydir 中的文件名完全匹配。
    • 检查用户是否属于正确的 group,并且该组是否有对应仓库的 writablereadonly 权限。
  • fatal: The remote end hung up unexpectedly:
    • 通常是 gitosis.conf 文件格式错误(例如拼写错误、缺少引号等),仔细检查文件语法。
  • gitosis: command not found:
    • 这通常发生在服务器端,确保您在 git 用户下操作,或者使用 sudo -u git 来执行命令。

通过以上步骤,您就拥有了一个功能完善、易于管理的 Git 服务器,Gitosis 的核心思想就是“通过 Git 来管理 Git”,非常优雅和高效。

分享:
扫描分享到社交APP
上一篇
下一篇