运行 Subversion 服务器

运行 Subversion 服务器

本节将介绍如何设置、管理和保护 Subversion 服务器。

Subversion 服务器依赖

必需

Subversion-1.14.5OpenSSH-10.3p1

设置 Subversion 服务器

以下说明将安装一个 Subversion 服务器,该服务器将配置为 使用 OpenSSH 作为安全远程访问方法,并提供 svnserve 用于匿名访问。

Subversion 服务器的配置包括以下步骤:

1. 设置用户、组和权限

配置的初始部分需要以 root 用户身份执行。使用以下命令创建 svn 用户和组:

groupadd -g 56 svn &&
useradd -c "SVN Owner" -d /home/svn -m -g svn -s /bin/false -u 56 svn

如果计划拥有多个仓库,应该为每个仓库设置一个专用组以方便管理。使用以下 命令为测试仓库创建 svntest 组,并将 svn 用户添加到该组:

groupadd -g 57 svntest &&
usermod -G svntest -a svn

此外,在处理仓库时应设置 umask 002,以便所有新建文件 都可被所有者和组写入。可以通过为 svnsvnserve 创建包装脚本来强制实现这一点:

mv /usr/bin/svn /usr/bin/svn.orig &&
mv /usr/bin/svnserve /usr/bin/svnserve.orig &&
cat >> /usr/bin/svn << "EOF"
#!/bin/sh
umask 002
/usr/bin/svn.orig "$@"
EOF
cat >> /usr/bin/svnserve << "EOF"
#!/bin/sh
umask 002
/usr/bin/svnserve.orig "$@"
EOF
chmod 0755 /usr/bin/svn{,serve}
[注意]

注意

如果使用 Apache 通过 HTTP 访问仓库, 即使是匿名访问,也应该用类似的脚本包装 /usr/sbin/httpd

2. 创建 Subversion 仓库

有几种方法可以设置 Subversion 仓库。建议查看 《SVN Book》 的相应章节。可以使用以下说明设置一个基本仓库。

使用以下命令(以 root 用户身份)创建一个新的 Subversion 仓库:

install -v -m 0755 -d /srv/svn &&
install -v -m 0755 -o svn -g svn -d /srv/svn/repositories &&
svnadmin create /srv/svn/repositories/svntest

仓库创建完成后,应该填充一些有用的内容。你需要预先设置好 目录结构,确保它完全按照你希望仓库的样子来组织。例如, 这里是一个以 svntest/ 为根的示例 BLFS 布局设置。 你需要设置类似于以下的目录树:

svntest/            # 仓库名称
   trunk/           # 包含现有的源代码树
      BOOK/
      bootscripts/
      edguide/
      patches/
      scripts/
   branches/        # 额外分支所需
   tags/            # 标记发布点所需

按照上述内容创建目录布局后,就可以进行初始导入:

svn import -m "Initial import." \
    </path/to/source/tree>      \
    file:///srv/svn/repositories/svntest

现在修改仓库的所有者和组信息,并将一个非特权用户添加到 svnsvntest 组:

chown -R svn:svntest /srv/svn/repositories/svntest    &&
chmod -R g+w         /srv/svn/repositories/svntest    &&
chmod g+s            /srv/svn/repositories/svntest/db &&
usermod -G svn,svntest -a <username>

svntest 是分配给 svntest 仓库的组。如前所述,这在使用 OpenSSH 进行认证时, 可以简化多个仓库的管理。接下来,你需要将非特权用户以及任何希望获得 仓库写入权限的其他用户添加到 svnsvntest 组。

此外,你会注意到新仓库的 db 目录设置了 set-groupID 位。如果原因不显而易见,当使用任何外部认证方法(例如 ssh)时,设置粘滞位是为了使所有新文件的所有者都是该用户, 但组为 svntestsvntest 组中的任何人都可以创建文件, 同时仍然给予整个组对这些文件的写入权限。这可以避免将其他用户锁定在仓库之外。

现在,返回到非特权用户帐户,使用 svnlook 查看新仓库:

svnlook tree /srv/svn/repositories/svntest/
[注意]

注意

可能需要注销并重新登录以刷新组成员资格。su <username> 也应该有效。

3. 配置服务器

如前所述,这些说明将配置服务器仅使用 ssh 对仓库进行 写入访问,并使用 svnserve 提供匿名访问。还有几种 其他方法可以提供对仓库的访问。这些额外配置的最佳说明请参阅 https://svnbook.red-bean.com/

需要为每个仓库进行访问配置。使用以下命令为 svntest 仓库创建 svnserve.conf 文件:

cp /srv/svn/repositories/svntest/conf/svnserve.conf \
   /srv/svn/repositories/svntest/conf/svnserve.conf.default &&

cat > /srv/svn/repositories/svntest/conf/svnserve.conf << "EOF"
[general]
anon-access = read
auth-access = write
EOF

配置文件的内容其实不多。你会注意到只需要 general 段。 查看 svnserve.conf.default 文件以获取有关使用 svnserve 内置认证方法的信息。

4. 启动服务器

要在启动时启动服务器,请从 blfs-systemd-units-20251204 软件包安装 svnserve.service 单元:

make install-svnserve

此外,上述说明要求 svn 服务器使用 umask 002,以便所有新建文件 都可被所有者和组写入。可以通过运行以下命令创建 systemd 单元覆盖文件来实现这一点:

mkdir -p /etc/systemd/system/svnserve.service.d
echo "UMask=0002" > /etc/systemd/system/svnserve.service.d/99-user.conf

传递给 svnserve 守护进程的选项可以在 /etc/default/svnserve 中更改。