这个方案结合了 svnserve 和 HTTP(S) 两种访问方式,是目前最稳定、最主流的部署方式。

方案概述
我们将采用以下架构:
- Apache HTTP Server: 作为 Web 服务器,提供 HTTP(S) 协议访问 SVN 仓库,这种方式支持通过浏览器浏览仓库,并且可以方便地与防火墙和代理协同工作。
- SVN (Subversion): 版本控制系统的核心软件。
mod_dav_svn: Apache 的一个模块,用于将 SVN 仓库“挂载”到 Apache 服务器上,使其能够通过 HTTP 协议访问。svnserve: SVN 自带的一个轻量级服务器,我们将用它来处理svn://协议的访问,以及管理用户认证和权限。
最终效果:用户可以通过两种方式访问仓库:
svn://your_server_ip/svn/project_repo(通过svnserve)http://your_server_ip/svn/project_repo(通过 Apache HTTP)
第一步:环境准备
我们假设你有一台干净的 CentOS 7 服务器,并且拥有 root 权限。
-
更新系统
(图片来源网络,侵删)sudo yum update -y
-
安装必要的软件包 我们需要安装 Apache、SVN 以及 Apache 的 SVN 模块。
sudo yum install -y httpd subversion mod_dav_svn
httpd: Apache HTTP 服务器。subversion: SVN 软件包。mod_dav_svn: Apache 的 SVN 模块。
-
启动并设置 Apache 开机自启
sudo systemctl start httpd sudo systemctl enable httpd
-
检查防火墙和 SELinux 为了让外部能访问,需要开放 HTTP (80) 和 SVN (3690) 端口。
# 开放端口 sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-port=3690/tcp # 重载防火墙规则 sudo firewall-cmd --reload
SELinux (安全增强型 Linux) 是一个安全子系统,配置不当会阻止 Apache 访问 SVN 仓库,为了简化,我们暂时将其设置为宽松模式(生产环境请谨慎配置)。
(图片来源网络,侵删)# 临时设置(重启后失效) setenforce 0 # 永久设置 sudo sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
重要提示:在生产环境中,建议学习并正确配置 SELinux 策略,而不是简单地禁用它。
第二步:创建 SVN 仓库
我们将在 /var/svn 目录下创建仓库。
-
创建仓库根目录
sudo mkdir -p /var/svn
-
创建 SVN 仓库 假设我们要创建一个名为
myproject的项目仓库。sudo svnadmin create /var/svn/myproject
执行后,
/var/svn/myproject目录下会出现一系列文件和文件夹,如conf,db,hooks,hooks-env.tmpl等。 -
设置仓库目录所有者 Apache HTTP 进程通常以
apache用户运行,需要给它赋予仓库的读写权限。sudo chown -R apache:apache /var/svn
第三步:配置用户认证和权限
这是 SVN 服务器的核心部分,我们将使用 svnserve 的认证机制,这样 svn:// 和 http:// 两种方式可以共用同一套用户和密码。
-
进入仓库的配置目录
cd /var/svn/myproject/conf
你会看到三个文件:
svnserve.conf,passwd,authz。 -
配置
svnserve.conf(仓库主配置文件) 这个文件是 SVN 仓库的“总开关”,用来启用认证和权限文件。sudo vim svnserve.conf
编辑文件,确保以下配置项被取消注释并且值正确:
[general] # 匿名用户不可读,必须认证 anon-access = none # 认证用户可读写 auth-access = write # 密码文件路径,相对于当前目录 password-db = passwd # 权限文件路径,相对于当前目录 authz-db = authz # 认证命名空间,提示用户输入用户名时会显示它 realm = My Project Repository
注意:
svnserve.conf文件中的每一项配置的前面和后面都不能有空格,否则会出错。 -
配置
passwd(用户密码文件) 这个文件用于存储用户名和密码。sudo vim passwd
在文件末尾添加你的用户和密码,格式为
用户名 = 密码。[users] # harry = harryssecret # sally = sallyssecret admin = your_strong_password user1 = another_password
-
配置
authz(权限控制文件) 这个文件用于精细控制不同用户或用户组对不同仓库或目录的访问权限。sudo vim authz
编辑文件,添加如下内容:
# 定义用户组 [groups] # admin_group = admin # developers = user1, user2 # 根目录权限设置 [/] # admin_group = rw # * = r # * 代表所有用户,这里表示所有用户只有读权限,但我们上面设置了anon-access=none,所以匿名用户无法访问 # 给特定用户授权 admin = rw user1 = rw # 如果你有多个仓库,可以这样设置 # [/project1] # harry = rw # sally = r
[groups]: 定义用户组。[/]: 表示根目录,即整个仓库的权限。用户名 = 权限:r: 只读rw: 读写空或没有权限条目:表示无权限
第四步:启动 svnserve 服务
svnserve 负责处理 svn:// 协议的请求。
-
创建
svnserve的 systemd 服务文件 为了方便管理,我们创建一个服务文件。sudo vim /etc/systemd/system/svnserve.service
粘贴进去:
[Unit] Description=Subversion protocol daemon After=network.target [Service] Type=forking ExecStart=/usr/bin/svnserve -d -r /var/svn User=apache Group=apache Restart=on-abort [Install] WantedBy=multi-user.target
-d: 以守护进程模式运行。-r /var/svn: 将/var/svn作为仓库的根目录,这样访问svn://your_ip/myproject时,svnserve就会去/var/svn/myproject寻找仓库。
-
启动并设置开机自启
sudo systemctl daemon-reload sudo systemctl start svnserve sudo systemctl enable svnserve
-
检查
svnserve状态sudo systemctl status svnserve
如果看到绿色的
active (running),说明服务已成功启动。
第五步:配置 Apache HTTP 服务器
现在配置 Apache,使其也能提供 SVN 服务。
-
检查 Apache 的 SVN 模块是否加载
httpd -M | grep dav_svn
如果看到
dav_svn_module (shared)和authz_svn_module (shared),说明模块已正确加载。 -
创建 SVN 的 Apache 配置文件 在 Apache 的配置目录下创建一个专门用于 SVN 的文件。
sudo vim /etc/httpd/conf.d/svn.conf
# 启用SVN DAV模块 LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so # 定义SV
