Phabricator 是一个类似于 GitHub 的协作开发平台。同样的,Phabricator 也能提供 Git 仓库托管服务。
Git 服务有基于 HTTP 与 SSH 两种协议的连接方式,但是 Phabricator 提供的基于 HTTP 的 Git 服务并不完善,比如它不支持 Shallow Clone (带 --depth 参数的 Git 拷贝方法),所以我们仍然需要用到基于 SSH 协议的连接方法。
但是官方提供的文档中要求我们使用一个单独的进程和端口来提供 SSH 服务,这样的话我们的 Git 链接中需要像下面这样带上端口号,会显得比较丑陋:
ssh://git@phabricator.example.com:2222/source/libphutil.git
当然我们也可以让 Git 服务独占 22 端口,系统 SSH 服务使用另外一个端口,但是这样可能会导致 SSH 相关的服务出现各种问题(通常情况下更改 SSH 服务的端口并不会出现问题,但是我使用的云服务器商提供的某些服务依赖 22 端口的 SSH)。
所以这里我介绍一下如何让 Phabricator 的 Git 服务直接使用系统自带的 SSH 服务进程,这样我们就可以让两个服务同时使用默认的 22 端口。
除 Git 外,Phabricator 也能提供 Mercurial 和 Subversion 的托管服务,这篇文章的 SSH 配置对这两种仓库的托管也同样适用。Phabricator 只能安装于类 Unix 系统上,不能安装在 Windows 上。我下面使用的操作系统为 Debian 10,其他类 Unix 系统也可以作为参考。

开始配置

创建用户

首先为系统创建一个 git 用户:
sudo useradd -U -r -m -s /bin/sh git
  • -U: 创建一个同名的用户组并将用户放入用户组中
  • -r: 创建一个系统用户
  • -m: 同时创建用户的 home 目录
  • -s: 指定用户使用 shell (这里要配置为 /bin/sh)

创建 hook 文件

Phabricator 目录下 ./phabricator/resources/sshd 文件夹有个文件 phabricator-ssh-hook.sh,这就是 hook 文件的样本,你请求登录 git 用户时它将会被 sshd 进程调用。
我们首先把它复制到 /usr/local/sbin/phabricator-ssh-hook.sh,然后修改它的内容。需要修改的有 VCSUSERROOT 这两个变量。
VCSUSER=git
ROOT=/usr/share/nginx/html/phabricator
  • VCSUSER 为我们需要使用的系统用户的名称,这里我们使用前面创建的 git 用户
  • ROOT 是我们的 phabricator 文件夹的位置
注意确保 phabricator-ssh-hook.sh 具有可执行权限 (它的文件权限通常应为 755)。

修改 sshd 配置文件

/etc/ssh/sshd_config 文件添加以下内容:
Match User git
    AllowAgentForwarding no
    AllowTcpForwarding no
    PasswordAuthentication no
    AuthorizedKeysFile none
    AuthorizedKeysCommand /usr/local/sbin/phabricator-ssh-hook.sh
    AuthorizedKeysCommandUser git
这里配置了让 sshd 检测到 git 用户登录时调用 hook 脚本。
修改完成后务必使用以下命令检查 sshd_config 语法是否正确,否则你可能会无法再一次登入系统:
sudo sshd -t -f /etc/ssh/sshd_config
如果没有提示错误才可以重启 sshd 令配置生效:
sudo systemctl restart sshd

修改 sudoers 配置

Phabricator 的 SSH 用户 git 需要以 phd 用户的名义来运行 git 相关操作,这时就需要配置 sudoers 配置文件了。关于 Phabricator 三种用户之间的权限调用展开来写比较复杂,具体可以参阅官方文档 (中文版):「Diffusion 用户指南: 仓库托管」。

以上,我们就完成了全部配置。现在,已经可以通过 22 端口同时访问 SSH 服务和 Git 服务了。

参考资料