凌峰创科服务平台

svn ubuntu 服务器搭建

我们将使用 svnserve 这个轻量级的、独立的服务器程序来搭建 SVN 服务器,它通过一个自定义的 TCP 端口(默认 3690)与客户端通信,配置相对简单,非常适合中小型团队使用。

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

第一步:更新系统并安装 SVN

登录到你的 Ubuntu 服务器,确保系统包列表是最新的,然后安装 subversion 包。

# 更新 apt 包索引
sudo apt update
# 安装 subversion
sudo apt install subversion

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

svnserve --version

你应该能看到类似下面的版本信息,表示安装成功。

svnserve, version 1.14.1 (r1886148)
   compiled Aug 18 2025, 17:01:35 on x86_64-pc-linux-gnu
Copyright (C) 2025 the Apache Software Foundation.
This software consists of contributions made by many people; see the
NOTICE file for more information.
Subversion is open source software, see http://subversion.apache.org/
The following repository back-end (FS) modules are available:
* fs_base : Module for working with a Berkeley DB repository.
  - handles symlinks
  - handles large files
* fs_fs : Module for working with a plain file (FSFS) repository.
  - handles symlinks
  - handles large files

第二步:创建 SVN 仓库

SVN 仓库是存储所有版本数据的地方,我们会创建一个专门的目录来存放所有仓库。

svn ubuntu 服务器搭建-图2
(图片来源网络,侵删)
  1. 创建仓库根目录 我们选择在 /var/svn 下创建仓库,这是一个常见的实践,因为该目录通常具有合适的权限。

    sudo mkdir -p /var/svn
  2. 创建第一个仓库 假设我们要创建一个名为 myproject 的仓库。

    sudo svnadmin create /var/svn/myproject

    执行此命令后,/var/svn/myproject 目录下会生成一系列文件和文件夹,这就是你的仓库结构。

  3. 设置仓库所有者 为了方便管理和避免权限问题,我们将仓库的所有者设置为当前运行 svnserve 的用户(通常是 root,但我们不推荐以 root 运行服务),这里我们创建一个 svn 用户来专门管理 SVN。

    svn ubuntu 服务器搭建-图3
    (图片来源网络,侵删)
    # 创建 svn 用户(如果不存在)
    sudo adduser --system --group --no-create-home svn
    # 将仓库目录的所有权赋给 svn 用户
    sudo chown -R svn:svn /var/svn/myproject

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

SVN 的权限和用户信息存储在仓库配置文件中,我们需要编辑两个关键文件:passwd(用户密码)和 authz(权限控制)。

  1. 配置用户密码 (passwd)

    编辑 myproject 仓库下的 conf/passwd 文件。

    sudo nano /var/svn/myproject/conf/passwd

    这个文件的格式是 [users] 段落下,用户名 = 密码,取消注释并添加你的用户。

    [users]
    # harry = harryssecret
    # sally = sallyssecret
    admin = mysecretpassword
    developer = devpassword
  2. 配置权限 (authz)

    编辑 myproject 仓库下的 conf/authz 文件。

    sudo nano /var/svn/myproject/conf/authz

    这个文件定义了用户和用户组对不同仓库路径的读写权限。

    [groups]
    # 定义用户组
    admin_group = admin
    dev_group = developer
    [/]
    # 根目录 `/` 的权限
    @admin_group = rw
    * = r
    [/trunk]
    # trunk 目录,开发组有读写权限
    @dev_group = rw
    [/branches]
    # branches 目录,开发组有读写权限
    @dev_group = rw
    [/tags]
    # tags 目录,只有管理员有读写权限
    @admin_group = rw

    权限说明:

    • r: 读权限
    • w: 写权限
    • rw: 读写权限
    • 匹配任何匿名用户(未在 passwd 中定义的用户)。
  3. 配置仓库基本选项 (svnserve.conf)

    这是仓库最重要的配置文件,它告诉 svnserve 去哪里查找用户和权限信息。

    sudo nano /var/svn/myproject/conf/svnserve.conf

    确保以下几行被取消注释并且设置正确:

    [general]
    # 匿名用户访问权限设置为无
    anon-access = none
    # 认证用户访问权限设置为读写
    auth-access = write
    # 密码文件路径,相对于当前 conf 目录
    password-db = passwd
    # 权限控制文件路径,相对于当前 conf 目录
    authz-db = authz
    # 使用 realm(领域)来区分不同的认证空间,建议设置为仓库名称
    realm = My First Repository

    注意: svnserve.conf 文件中,每一项的键和值左右两侧的空格和制表符都非常敏感,最好直接使用 号,不要有多余的空格。


第四步:启动 SVN 服务

我们已经准备好了仓库,可以启动 svnserve 服务了。

  1. 手动启动(用于测试)

    你可以手动启动 svnserve 来测试一下。

    # -d 表示后台守护进程运行
    # -r 指定仓库的根目录,这样客户端就可以直接通过 svn://server/myproject 访问
    sudo svnserve -d -r /var/svn
  2. 使用 Systemd 持久化运行(推荐)

    为了让 SVN 服务在服务器重启后自动启动,并且方便管理,我们应该创建一个 systemd 服务单元文件。

    创建服务文件:

    sudo nano /etc/systemd/system/svnserve.service

    粘贴进去,并根据你的实际情况修改 User, Group, 和 --root 参数。

    [Unit]
    Description=Subversion Protocol Daemon
    After=network.target
    [Service]
    Type=simple
    User=svn
    Group=svn
    ExecStart=/usr/bin/svnserve -i -r /var/svn
    # 如果想使用非标准端口,可以添加以下行
    # Environment="SVNSERVE_LISTEN_PORT=3690"
    [Install]
    WantedBy=multi-user.target

    参数解释:

    • -i: 以“独立”模式运行,而不是 inetd 模式。
    • -r /var/svn: 指定仓库根目录。

    启动并启用服务:

    # 重新加载 systemd 配置
    sudo systemctl daemon-reload
    # 启动 svnserve 服务
    sudo systemctl start svnserve
    # 设置开机自启
    sudo systemctl enable svnserve

    检查服务状态:

    sudo systemctl status svnserve

    如果看到绿色的 active (running),说明服务已成功启动。


第五步:客户端连接测试

你可以在你的客户端电脑(可以是另一台 Linux, Windows 或 macOS)上使用 SVN 客户端(如 svn 命令行或 TortoiseSVN)来连接服务器。

假设你的服务器 IP 地址是 168.1.100

  1. 检出仓库 (Checkout)

    这会在你的本地电脑上创建一个仓库的副本。

    # 在命令行中执行
    svn checkout svn://192.168.1.100/myproject

    系统会提示你输入用户名和密码,就是我们之前在 passwd 文件中设置的 admindeveloper

    Authentication realm: <svn://192.168.1.100:3690> My First Repository
    Username: admin
    Password: ********
    A    myproject/trunk
    A    myproject/branches
    A    myproject/tags
    Checked out revision 1.

    检出成功后,你的本地就会有一个 myproject 文件夹。

  2. 提交更改 (Commit)

    你可以修改本地文件,然后提交回服务器。

    cd myproject
    echo "Hello from SVN" > README.md
    svn add README.md
    svn commit -m "Add initial README file"

    同样需要输入用户名和密码,提交成功后,你的更改就已经保存在服务器上了。


防火墙配置

如果你的服务器启用了 UFW (Uncomplicated Firewall),你需要开放 SVN 服务的默认端口 3690。

# 允许来自任何 IP 的 3690 端口访问(不推荐在生产环境中)
sudo ufw allow 3690/tcp
# 更安全的做法是只允许特定 IP 访问
# sudo ufw allow from 192.168.1.0/24 to any port 3690 proto tcp

总结与最佳实践

  1. 备份!备份!备份! 定期备份你的 SVN 仓库 /var/svn,可以使用 svnadmin hotcopy 命令创建一个热备份,不影响服务运行。
  2. 使用 SSH 协议 (可选):对于更安全的场景,可以考虑使用 svn+ssh:// 协议,它通过 SSH 隧道传输数据,利用了系统现有的用户认证和加密,无需单独配置 svnserve 和用户密码,但配置相对复杂,且每个开发者都需要一个系统账户。
  3. 使用 HTTPS 协议 (可选):如果需要通过 Web 浏览器访问仓库,或者集成到现有的 Web 服务器(如 Apache)中,可以使用 svn+https:// 协议,这需要配置 Apache 和 WebDAV,功能最强大,但也最复杂。
  4. 用户管理:当用户数量增多时,手动编辑 passwdauthz 会变得很麻烦,可以考虑使用 LDAP 或其他集中式的用户认证系统来集成 SVN。

通过以上步骤,你就成功在 Ubuntu 服务器上搭建了一个功能完善的 SVN 服务器。svnserve 是一种简单、高效且易于维护的解决方案,非常适合中小型项目的版本控制需求。

分享:
扫描分享到社交APP
上一篇
下一篇