凌峰创科服务平台

linux如何搭建svn服务器

我们将使用 svnserve 这个轻量级、独立的 SVN 服务器程序,它非常适合中小型团队使用。

linux如何搭建svn服务器-图1
(图片来源网络,侵删)

总览步骤

  1. 安装 SVN 服务端软件
  2. 创建 SVN 仓库
  3. 配置仓库访问权限
  4. 启动 SVN 服务
  5. 客户端连接测试
  6. 配置开机自启(可选)

第一步:安装 SVN 服务端软件

在大多数主流的 Linux 发行版上,SVN 的服务端软件包都叫做 subversion

对于 Debian / Ubuntu 系统

使用 apt 包管理器进行安装:

# 更新软件包列表
sudo apt update
# 安装 subversion
sudo apt install subversion

对于 CentOS / RHEL / Rocky Linux / AlmaLinux 系统

使用 yumdnf 包管理器进行安装:

# 对于 CentOS 7, RHEL 7 或使用 yum 的系统
sudo yum install subversion
# 对于 CentOS 8+, RHEL 8+, Rocky Linux 8+ 或使用 dnf 的系统
sudo dnf install subversion

安装完成后,可以验证一下是否安装成功:

linux如何搭建svn服务器-图2
(图片来源网络,侵删)
svnserve --version

如果显示出版本信息,说明安装成功。


第二步:创建 SVN 仓库

我们约定将所有的 SVN 仓库统一存放在 /var/svn 目录下。

  1. 创建仓库根目录

    sudo mkdir -p /var/svn
  2. 创建第一个仓库 假设我们的项目名为 my-project

    sudo svnadmin create /var/svn/my-project
  3. 设置仓库目录所有者 为了避免权限问题,建议将仓库目录的所有者设置为运行 svnserve 服务的用户(通常是 rootsvn),这里我们简单起见,先设置为 root

    sudo chown -R root:root /var/svn/my-project

执行完上述命令后,/var/svn/my-project 目录下会生成一系列文件和文件夹,如 conf, db, hooks, format 等,这表明 SVN 仓库已经成功创建。


第三步:配置仓库访问权限

这是最关键的一步,我们需要配置哪些用户可以读写,哪些用户只读。

  1. 进入仓库的配置目录

    cd /var/svn/my-project/conf

    该目录下有三个重要的配置文件:

    • svnserve.conf: SVN 服务的主配置文件。
    • passwd: 存储用户名和密码的文件。
    • authz: 定义用户和用户组权限的文件。
  2. 配置 svnserve.conf 用你喜欢的编辑器打开 svnserve.conf 文件(sudo nano svnserve.conf),并确保以下几行是取消注释(即去掉行首的 和空格)并且内容正确的:

    [general]
    # 匿名用户无任何权限
    anon-access = none
    # 认证用户有读写权限
    auth-access = write
    # 密码文件路径
    password-db = passwd
    # 权限配置文件路径
    authz-db = authz
    # 使用 realms,建议与仓库名一致,用于提示用户
    realm = My Project Repository

    关键点解释:

    • anon-access = none: 不允许匿名用户访问,这是安全的基本要求。
    • auth-access = write: 要求用户必须通过认证才能进行读写操作。
    • password-db = passwd: 指定了密码文件是当前目录下的 passwd 文件。
    • authz-db = authz: 指定了权限控制文件是当前目录下的 authz 文件。
  3. 配置 passwd 文件 打开 passwd 文件,添加用户名和密码,格式为 用户名 = 密码

    [users]
    # harry = harry_secret
    # sally = sally_secret
    # 添加我们自己的用户
    zhangsan = zhangsan_password
    lisi = lisi_password

    这里我们创建了两个用户:zhangsanlisi

  4. 配置 authz 文件 这个文件非常强大,可以精细控制每个用户或用户组对不同仓库或仓库中不同目录的访问权限。

    打开 authz 文件,进行如下配置:

    [groups]
    # 定义一个管理员组
    admin = zhangsan
    # 定义一个开发组
    dev_team = zhangsan, lisi
    [/]
    # 根目录 `/` 的权限
    # @dev_team 表示 dev_group 组内的所有成员
    @dev_team = rw
    # lisi 用户单独设置
    # lisi = rw
    # * 表示所有其他认证用户
    * = r
    [/my-project/trunk/doc]
    # 特定目录的权限,doc 目录只允许 zhangsan 访问
    @admin = rw
    * =

    关键点解释:

    • [groups]:定义用户组,方便管理。
    • [/]:代表整个仓库的根目录。
    • @组名:表示对该组内的所有用户生效。
    • 用户名:对特定用户生效。
    • rw:读和写权限。
    • r:只读权限。
    • 无权限。
    • 匹配所有认证用户。

第四步:启动 SVN 服务

仓库和权限都已配置好,可以启动 svnserve 服务了。

  1. 启动服务 建议使用以下命令,它会以后台守护进程模式运行,并监听在 3690 端口(SVN 的默认端口)。

    sudo svnserve -d -r /var/svn

    参数解释:

    • -d: 以 daemon(守护进程)模式运行。
    • -r /var/svn: 指定 SVN 仓库的根目录,这样客户端就可以通过 svn://服务器IP/my-project 的方式访问,而不需要输入完整路径。
  2. 检查服务状态

    # 检查端口是否被监听
    netstat -tulnp | grep 3690
    # 或者使用 ss 命令 (新版本 Linux 推荐)
    ss -tulnp | grep 3690

    如果看到类似 LISTEN 0 5 *:3690 *:* 的输出,说明服务已经成功启动。


第五步:客户端连接测试

现在你可以从另一台机器(或者本机)使用 SVN 客户端来测试了。

  1. 检出仓库 打开终端,使用 svn checkout (或 svn co) 命令,将 <服务器IP> 替换为你的 Linux 服务器的实际 IP 地址。

    # 格式: svn://<服务器IP>/<仓库名>
    svn co svn://192.168.1.100/my-project
  2. 输入用户名和密码 执行上述命令后,SVN 客户端会提示你输入用户名和密码。

    Authentication realm: <svn://192.168.1.100:3690> My Project Repository
    Username: zhangsan
    Password: (输入 zhangsan 的密码)
  3. 验证结果 如果一切正常,它会提示你 Checked out revision 0.,并且会在当前目录下创建一个 my-project 文件夹,里面包含了 SVN 仓库的 .svn 文件,说明检出成功。

  4. 测试写入权限 进入 my-project 文件夹,创建一个新文件,然后尝试提交。

    cd my-project
    echo "Hello, SVN!" > test.txt
    svn add test.txt
    svn commit -m "Add test file"

    同样,它会要求你输入 zhangsan 的密码,提交成功后,说明写入权限配置正确。


第六步:配置开机自启(可选)

为了让 SVN 服务器在系统重启后能自动启动,可以创建一个 systemd 服务单元文件。

  1. 创建服务文件

    sudo nano /etc/systemd/system/svnserve.service
  2. 写入以下内容

    [Unit]
    Description=Subversion Protocol Daemon
    After=network.target
    [Service]
    Type=forking
    ExecStart=/usr/bin/svnserve -d -r /var/svn
    ExecReload=/bin/kill -HUP $MAINPID
    KillMode=process
    Restart=on-failure
    [Install]
    WantedBy=multi-user.target
  3. 重新加载 systemd 并启用服务

    # 重新加载 systemd 配置
    sudo systemctl daemon-reload
    # 启用 svnserve 服务,并设置为开机自启
    sudo systemctl enable svnserve.service
    # 立即启动服务(如果还没启动的话)
    sudo systemctl start svnserve.service

你的 SVN 服务器就搭建完成了,并且具备开机自启的能力。

总结与常见问题

  • 防火墙问题:如果客户端无法连接,请检查 Linux 服务器上的防火墙是否允许 3690 端口的流量。
    • 对于 iptables (CentOS 7 之前): sudo iptables -I INPUT -p tcp --dport 3690 -j ACCEPT
    • 对于 firewalld (CentOS 7+ / RHEL 7+ / Fedora): sudo firewall-cmd --permanent --add-port=3690/tcp && sudo firewall-cmd --reload
  • SELinux 问题:在 CentOS/RHEL 系统上,如果启用 SELinux,可能会阻止 svnserve 访问 /var/svn 目录,可以先临时关闭 SELinux 来测试:sudo setenforce 0,如果确认是 SELinux 问题,则需要配置相应的策略,这是一个更高级的话题。
  • 数据备份:SVN 仓库本质上就是一个文件系统,定期使用 tarrsync 等工具备份 /var/svn 目录即可。
  • 更高级的方案:对于需要 HTTPS 访问、与 Apache 集成或更复杂权限管理的场景,可以考虑使用 svn+https 方案,但这需要额外配置 Apache 服务器和 SSL 证书,比 svnserve 复杂得多。svnserve 已经能满足绝大多数中小团队的需求。
分享:
扫描分享到社交APP
上一篇
下一篇