Ubuntu + apache2 配置 https 协议下的 SVN 仓库

在 Windows 环境下,因为有 Tortoise SVN 和 Visual SVN Server 的存在,SVN 的操作难度降低了不少。但在 Linux 环境下,为了让用户更好地了解 SVN 的工作原理,从而体验自立更生的快乐和自闭,SVN 的种种操作,从建仓到创建用户到配置网络到 checkout 到 commit 到 update,全都是用命令行实现的。虽然一些编译器集成了版本控制的功能,但是要建立 SVN 仓库,据作者有限的知识,应该只能通过命令行创建。本文介绍的是如何在 Linux 环境下使用 apache2 配置 https 协议下的 SVN 仓库。

主要的参考文档是:Subversionssl 配置

创建 apache2 用户 www-data

apache2 是与网络相关的服务器,如果我们希望能在同一局域网下的不同设备操作同一个 SVN 仓库,就必须要配置它。首先我们需要创建一个与 SVN 相关的 group,和 apache2 的用户:

1
2
3
4
5
# 添加组 subversion
$ sudo addgroup subversion
# 在组 subversion 中添加用户 www-data (apache2 用户) 和 laptop
$ sudo adduser www-data subversion
$ sudo adduser laptop subversion

创建的 group 以及所属用户可以查看 /etc/group 文件获知:

1
2
$ cat /etc/group | grep subversion
subversion1002:laptop,www-data

创建 SVN 仓库

如果我们希望在 /repos/svn 创建一个关于 MATLAB 脚本的仓库,我们可以运行如下命令:

1
sudo svnadmin create /repos/svn/MATLAB

塔嗒!一个 SVN 仓库就创建好了,是不是很简单?我们先接着往下做吧。因为我们是用 sudo 命令创建的仓库,所以该仓库所属用户为 root,如果我们想要读写执行该文档中的数据,每次都要通过 sudo 来操作,否则会遇到 permission denied 错误。我们将文件夹的用户修改为 www-data,组修改为 subversion

1
sudo chown -R www:data /repos/svn/MATLAB

命令中的选项 -R 表示递归修改指定目录下的所有子文件夹以及文件所属用户和组。修改完之后,我们还需要修改 SVN 仓库的权限:

1
chmod -R g+rws /repos/svn/MATLAB

命令表示,对文件夹 MATLAB 所属的用户g递归-R添加+读写执行rws权限。

创建 SVN 用户

SVN 用户名以及密码存放在 /etc/subversion/passwd 文件中,第一次创建用户时使用命令 htpasswd -c

1
sudo htpasswd -c /etc/subversion/passwd laptop

运行该命令之后,会要求输入用户密码并确认,输入的密码会加密保存在 passwd 中。

-c 会覆盖原来的 passwd 文件!

如果继续添加用户,则运行如下命令:

1
sudo htpasswd /etc/subversion/passwd another_laptop

或者重置原用户的密码:

1
sudo htpasswd /etc/subversion/passwd laptop

本地 checkout SVN 仓库

现在,如果只需要在本地操作 SVN 的话,那么就可以通过 file:/// 获取:

1
2
3
4
# 注意,命令中有三个反斜杠!
svn co file:///repos/svn/MATLAB MATLAB
# 或者使用 localhost,此时命令有两个反斜杠
svn co file://localhost/repos/svn/MATLAB myproject

checkout 本地的 SVN 仓库不需要用户名和密码。

使用 WebDAV 获取 SVN 仓库

许多教程中要求安装的是libapache2-svn,但是对于新版本 Ubuntu 系统,安装 libapache2-mod-svn

我们首先配置文件 /etc/apache2/mods-available/dav_svn.conf,其用途是配置 apache2 和 subversion 关联:

1
2
3
4
5
6
7
8
9
<Location /svn>
DAV svn
SVNParentPath /repos/svn
SVNListParentPath On
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /etc/subversion/passwd
Require valid-user
</Location>

一些对于该文件的注释:

  • Location 中的路径 /svn 表示在 checkout SVN 仓库时,URL 的链接目录。该目录可以不等同于 SVN 仓库在服务器本地的存储路径。具体来说,如果按照如上配置文件,那么 checkout 的 SVN 路径应该是 http://<ip>/svn/<reposName>,不是http://<ip>/repos/svn/<reposName>
  • SVNParentPath 写入 SVN 仓库的上一级目录

配置完成之后,需要重启 apache2:

1
sudo /etc/init.d/apache2 restart

此时就可以使用 http 协议拉取 SVN 仓库了:

1
svn co http://hostname/svn/MATLAB --username laptop

配置 https 协议

http 协议客户端与服务器之间的通讯是明文的,为了对通讯进行加密,我们使用 https 协议,其中多出的「s」表示 ssl。

首先我们需要打开 apache2 关于 ssl 的模块:

1
sudo a2enmod ssl

然后我们需要生成自签名证书与密钥。创建目录 /etc/apache2/ssl ,运行命令:

1
sudo openssl req -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.key

这时在目录 /etc/apache2/ssl 目录下会生成证书 apache.pem 和密钥 apache.key 两个文件。我们需要修改文件 /etc/apache2/sites-available/default-ssl 中自签名证书和密钥的路径为刚刚生成的两个文件:

1
2
SSLCertificateFile /etc/apache2/ssl/apache.pem
SSLCertificateKeyFile /etc/apache2/ssl/apache.key

在之后我们还要修改 /etc/apache2/ports.conf 文件:

1
2
3
4
5
6
7
8
9
10
11
Listen 80

<IfModule ssl_module>
NameVirtualHost *:443
Listen 443
</IfModule>

<IfModule mod_gnutls.c>
NameVirtualHost *:443
Listen 443
</IfModule>

配置完这些文件之后,我们需要开启 apache2 虚拟主机 ssl(英文是:Enable an apache2 virtual host on Debian-based OSes.):

1
sudo a2ensite default-ssl

以及重启 apache2:

1
sudo /etc/init.d/apache2 restart

这时,如果一切顺利的话,我们就可以通过 https 访问 SVN 仓库了:

1
svn co https://hostname/svn/MATLAB

防火墙允许 https

此时,我们在同一局域网下的客户端,因为服务器防火墙的阻拦,还是不可以 checkout SVN repos,这时需要在服务器中运行如下命令:

1
sudo ufw allow https

就能够允许客户端通过 https 协议访问 SVN 了。