Ubuntu + apache2 配置 https 协议下的 SVN 仓库
在 Windows 环境下,因为有 Tortoise SVN 和 Visual SVN Server
的存在,SVN 的操作难度降低了不少。但在 Linux
环境下,为了让用户更好地了解 SVN
的工作原理,从而体验自立更生的快乐和自闭。SVN
的种种操作,从建仓到创建用户到配置网络到 checkout 到 commit 到
update,据作者有限的知识,全都是用命令行实现的。本文介绍的是如何在 Linux
环境下使用 apache2 配置 https 协议下的 SVN 仓库。主要的参考文档是:Subversion 和 ssl
配置,Ubuntu 版本号是 22.04。
创建 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,其中
-c 会覆盖原来的 passwd 文件:
1 | sudo htpasswd -c /etc/subversion/passwd laptop |
运行该命令之后,会要求输入用户密码并确认,输入的密码会加密保存在
passwd 中。如果继续添加用户,则运行如下命令:
1 | sudo htpasswd /etc/subversion/passwd another_laptop |
或者重置原用户的密码:
1 | sudo htpasswd /etc/subversion/passwd laptop |
本地 checkout SVN 仓库
现在,如果只需要在本地操作 SVN 的话,那么就可以通过
file:/// 获取,checkout 本地的 SVN
仓库不需要用户名和密码:
1 | # 注意,命令中有三个反斜杠 |
使用 WebDAV 获取 SVN 仓库
许多教程中要求安装的是libapache2-svn,但是对于 Ubuntu 22.04,应该安装
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
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 了。