Though subversion package provides a lightweight subversion server, svnserve, it does not provide means for running this server as a service. Here we will discuss two ways to run it.
Running svnserve using systemd
Modern Debian uses systemd for service running and management, so it is better to start svnserve server using systemd.
First, create a system user for running the service (root is not really needed and is a bit insecure)
# useradd -r svn
Then create an svn repository root and grant it to svn user
# mkdir -p /srv/svn/repos; chown svn /srv/svn/repos
Create systemd service configuration for svnserve /etc/systemd/system/svnserve.service:
[Unit] Description=Subversion protocol daemon After=syslog.target network.target [Service] Type=forking RuntimeDirectory=svnserve PIDFile=/run/svnserve/svnserve.pid EnvironmentFile=/etc/default/svnserve ExecStart=/usr/bin/svnserve $DAEMON_ARGS User=svn Group=svn KillMode=control-group Restart=on-failure [Install] WantedBy=multi-user.target
Then add service startup options at /etc/default/svnserve:
# svnserve options DAEMON_ARGS="--daemon --pid-file /run/svnserve/svnserve.pid --root /srv/svn/repos --log-file /var/log/svnserve/svnserve.log"
These options will be used by service for starting svnserve.
After that, create a place for log files and grant svn user rights to use it:
# mkdir /var/log/svnserve; chown svn /var/log/svnserve
And add configure file for logrotate to properly archive this log from time to time. /etc/logrotate.d/svnserve:
/var/log/svnserve/*.log { daily missingok rotate 14 compress notifempty create 640 svn adm sharedscripts postrotate if /bin/systemctl status svnserve > /dev/null ; then \ /bin/systemctl restart svnserve > /dev/null; \ fi; endscript }
And finally enable service, start it, and check that it works as expected
# systemctl enable svnserve.service # systemctl start svnserve.service # systemctl status svnserve.service * svnserve.service - Subversion protocol daemon Loaded: loaded (/etc/systemd/system/svnserve.service; enabled) Active: active (running) since Tue 2019-12-31 21:53:16 MSK; 39s ago Process: 798 ExecStart=/usr/bin/svnserve $DAEMON_ARGS (code=exited, status=0/SUCCESS) Main PID: 799 (svnserve) CGroup: /user.slice/user-1000.slice/session-31211.scope/system.slice/svnserve.service `-799 /usr/bin/svnserve --daemon --pid-file /run/svnserve/svnserve.pid --root /srv/svn/repos --log-file /var/log/svnserve/svnserve.log Dec 31 21:53:16 svn svnserve[798]: DIGEST-MD5 common mech free Dec 31 21:53:16 svn systemd[1]: Started Subversion protocol daemon.
After this, svnserve service should start automatically on system startup.
This guide is based on this stackoverflow entry
Running svnserve from inetd
For the svn:// protocol, you'll want to add a line to /etc/inetd.conf to start svnserve automatically, something like this:
svn stream tcp nowait my_svn_user /usr/bin/svnserve svnserve -i -r /srv/svn
Where /srv/svn is where your shared repositories live (so users don't have to have /srv/svn included in their URLs), and my_svn_user is a user with permission to read and write the repositories. You'll probably want to create a user specifically for running the svnserve service.
After editing /etc/inetd.conf you run
# update-inetd --enable svn
The idea of -r is twofold:
- Makes URLs shorter.
- Makes sure remote users can only get into a designated part of your Unix filesystem.
Note: if you are looking for a tutorial about subversion client usage, look at SVNTutorial