如何使用systemctl systemd启动svnserve

问题描述 投票:0回答:6
debian jessie 中的

subversion 软件包不包含 systemd 服务文件。自动启动的最简单解决方案是什么?我试试

[Unit]
Description=Subversion protocol daemon
After=syslog.target network.target

[Service]
Type=forking
#EnvironmentFile=/etc/conf.d/svnserve
#ExecStart=/usr/bin/svnserve --daemon $SVNSERVE_ARGS
ExecStart=/usr/bin/svnserve -d -r /svnFolder/repositories
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target
Alias=svnserve.service

它是 https://bbs.archlinux.org/viewtopic.php?id=190127 的改编版,但我直接将 svnserve 的参数直接放在这里。

有什么可以改进的地方?

svn systemd
6个回答
35
投票

这里建议设置

svnserve
服务“the-Debian-way”,使用专用的
svn
服务帐户运行并进行适当的日志记录。根据 FHS,存储库应存储在
/srv/
:

mkdir -p /srv/svn/repos; chown svn /srv/svn/repos

首先是systemd的服务配置

/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

二、

/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"

为了正常工作,必须使用正确的所有权和 pid 文件的运行位置来创建日志文件的文件夹:

mkdir /var/log/svnserve; chown svn /var/log/svnserve
mkdir -p /run/svnserve; chown svn /run/svnserve

以日志轮换配置结束

/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
}

希望这有帮助。


2
投票

更新:我下面的答案已过时。这些改进和其他改进已纳入Yves Martin 的出色解决方案

我有两个改进:一般建议不要运行root之类的东西。为此创建一个用户,例如“svn”。还建议在使用分叉时显式指定 PID 文件。我的 svnserve.service 看起来很像你的,除了我添加了以下行:

User=svn
Group=svn
PIDFile=/usr/local/svn/svnserve.pid
ExecStart=/usr/bin/svnserve  -d -r /usr/local/svn/repos --pid-file /usr/local/svn/svnserve.pid

1
投票

对上面 Yves Martin 的出色回答的一条评论(我还没有代表点来评论):

当尝试使服务在启动时启动时,我会收到错误:

$ sudo systemctl enable svnserve.service
Failed to execute operation: Invalid argument

经过一些研究,我发现您显然无法将别名设置为与服务相同的名称。从 svnserve.service 的 [Install] 部分删除 Alias 行解决了问题:

[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

0
投票

请考虑替换 xinet -> systemd: (这主要是从http://0pointer.de/blog/projects/inetd.html

收集的

您需要创建两个文件:

svnserve.socket

[Unit]
Description=SVN Socket for Per-Connection Servers

[Socket]
ListenStream=3690
Accept=yes

[Install]
WantedBy=sockets.target

[电子邮件受保护]

[Unit]
Description=SVN Per-Connection Server

[Service]
User=svn
Group=svn
ExecStart=-/usr/bin/svnserve -i -r /srv/repositories/svn/repositories
StandardInput=socket

将这两个文件复制到 /etc/systemd/system/

然后

systemctl enable svnserve.socket
systemctl start svnserve.socket
systemctl status svnserve.socket

0
投票

(我想对 @Yves Martin 的回答发表评论,但这是一个新帐户,我不允许发表评论。:-P )

对于 SELinux,此解决方案不允许自动启动守护进程。我做了一些改变让它高兴。 svnserve 守护进程在 /var/log 树中没有 open 权限。将日志放在 svn 帐户的域中可以解决安全问题。

在 /etc/systemd/system/svnserve.service 中:

ExecStart=/usr/bin/svnserve --daemon \
  --pid-file /var/run/svnserve/svnserve.pid \
  --root /project/svn/repos \
  --log-file /project/svn/log/svnserve.log

在 /etc/logrotate.d/svnserve 中:

/project/svn/log/*.log {  # path changed
...
  create 644 svn svn   # corrected group and made world-readable
...

最后,使 svn repos 和 log 目录具有正确的所有权和安全类型:

sudo mkdir /project/svn
sudo chmod 755 /project/svn
sudo mkdir /project/svn/repos /project/svn/log
sudo chown -R svn:svn /project/svn
sudo semanage fcontext --add --type svnserve_content_t "/project/svn(/.*)?"
sudo restorecon -Rv /project/svn

(显然,将 /project/svn 更改为您决定放置存储库结构的位置。 /var/svn 很常见,并且该目录树的规则已经存在,因此上面的最后几行是不必要的。)


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.