Ubuntu + apache2 配置 https 协议下的 SVN 仓库
在 Windows 环境下,因为有 Tortoise SVN 和 Visual SVN Server
的存在,SVN 的操作难度降低了不少。但在 Linux
环境下,为了让用户更好地了解 SVN
的工作原理,从而体验自立更生的快乐和自闭,SVN
的种种操作,从建仓到创建用户到配置网络到 checkout 到 commit 到
update,全都是用命令行实现的。虽然一些编译器集成了版本控制的功能,但是要建立
SVN 仓库,据作者有限的知识,应该只能通过命令行创建。本文介绍的是如何在
Linux 环境下使用 apache2 配置 https 协议下的 SVN 仓库。
主要的参考文档是:Subversion 和 ssl 配置
创建 apache2 用户 www-data
apache2 是与网络相关的服务器,如果我们希望能在同一局域网下的不同设备操作同一个 SVN 仓库,就必须要配置它。首先我们需要创建一个与 SVN 相关的 group,和 apache2 的用户:
1 | # 添加组 subversion |
创建的 group
以及所属用户可以查看
/etc/group
文件获知:
1 | $ cat /etc/group | grep subversion |
创建 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 | # 注意,命令中有三个反斜杠! |
checkout 本地的 SVN 仓库不需要用户名和密码。
使用 WebDAV 获取 SVN 仓库
许多教程中要求安装的是libapache2-svn,但是对于新版本 Ubuntu 系统,安装 libapache2-mod-svn 。
我们首先配置文件
/etc/apache2/mods-available/dav_svn.conf
,其用途是配置
apache2 和 subversion 关联:
1 | <Location /svn> |
一些对于该文件的注释:
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 | SSLCertificateFile /etc/apache2/ssl/apache.pem |
在之后我们还要修改 /etc/apache2/ports.conf
文件:
1 | Listen 80 |
配置完这些文件之后,我们需要开启 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 了。