在伺服器上設定SVN

於 2026/11/03 (臺北標準時)
#SVN#Linux

最近買了一個月供5$的美國伺服器,決定把這個伺服器當作SVN伺服器對待

基本服務

拿到VPS後用root連上去

首先是基本的權限分離,創建一個nologin的svn賬戶用以跑svn服務

useradd -r -s /usr/bin/nologin svn

安裝subversion包

pacman -S subversion

然後給svn服務創建一個資料夾,自己一般習慣把對外服務放入/srv內

mkdir /srv/svn
mkdir /srv/svn/repositories

記得把所有權轉給svn賬戶

chown -R svn:svn /srv/svn

隨後創建/etc/systemd/system/svnserve.service,把伺服器的自啓任務交給systemd處理

內部寫入如下內容:

[Unit]
Description=Subversion server
After=network.target

[Service]
Type=forking
User=svn
Group=svn

RuntimeDirectory=svnserve
RuntimeDirectoryMode=0755

ExecStart=/usr/bin/svnserve -d -r /srv/svn/repositories --pid-file=/run/svnserve/svnserve.pid
PIDFile=/run/svnserve/svnserve.pid

Restart=on-failure

[Install]
WantedBy=multi-user.target

記得留一個pidfile給systemd追,不然會被判死

然後給防火牆開3690端口以供svn對外服務

這裏以ufw爲例子

ufw allow 3690/tcp
ufw reload

隨後刷新一下unit,並讓svnserve開機自啓(並現在啓動)

systemctl daemon-reload
systemctl enable --now svnserve

按這個流程順下來,svn服務應當能正常啓動

創建及配置專案

/srv/svn的所有權現在被移到了svn賬戶,所以創建專案的時候要用sudo -u svn

cd /srv/svn/repositories
sudo -u svn svnadmin create project

(選做)svn專案上習慣要創建三個獨立的區域:trunk,branches,tags

這部分自己習慣上用admin名義

svn mkdir -m "[INIT] Initialize standard layout" --username admin file:///srv/svn/repositories/project/{trunk,branches,tags}

打開專案資料夾下的conf/svnserve.conf,編輯並確保以下這些基礎配置被寫入(相關條目一般以註解方式存在,需要取消註解)

[general]
anon-access = read
auth-access = write
password-db = passwd
authz-db = authz
realm = project

anon-access控制匿名賬戶的權限,這裏設定成read,故可以無賬戶簽出

auth-access控制認證賬戶的權限,這裏設定成write,故可以認證後寫入

下面兩個db默認都是同層級的authz,和passwd,稍後會配置這兩個檔案

realm設定成和專案同樣的名字

然後打開authz,寫入如下內容

注意權限配置是基於組的

[aliases]

[groups]
maintainers = Texas0295

[project:/]
@maintainers = rw
$anonymous = r

最後打開passwd,保證以下配置被寫入:

[users]
Texas0295 = <PASSWORD_HERE>

至此伺服器的基本配置已經完成了

多個 repo 可以放在 /srv/svn/repositories 下,彼此獨立管理,但創建的時候記得使用sudo -u svn

測試

用戶端可嘗試匿名讀寫

svn co svn://<IP_FOR_YOUR_VPS>/project/trunk

和認證提交

svn commit -m "MESSAGE" --username Texas0295

如無特殊說明,所有內容採用 CC BY 4.0 協議共享