web-dev-qa-db-ja.com

systemctlsystemdでsvnserveを起動する方法

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の引数を直接ここに配置しました。

何を改善できますか?

7
user855443

これは、適切なロギングを備えた専用のsvnserveサービスアカウントで実行されるsvnサービス「the-Debian-way」をセットアップするための提案です。 [〜#〜] 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"

正しく機能するには、ログファイルのフォルダを適切な所有権で作成する必要があります。

mkdir /var/log/svnserve; chown svn /var/log/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
}

お役に立てれば。

30
Yves Martin

更新:以下の私の回答は廃止されました。これらの改善やその他の改善は、 Yves Martinの優れたソリューションに組み込まれています。

2つの改善点があります。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
2
EricS

上記のイヴ・マーティンの優れた回答に対する1つのコメント(コメントする担当者のポイントはまだありません):

起動時にサービスを開始できるようにしようとすると、エラーが発生します。

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

調査を行った結果、エイリアスをサービスと同じ名前に設定できないことがわかりました。 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
0
Matt Hovey

Xinetのこの置き換えを検討してください-> systemd :(これは主に http://0pointer.de/blog/projects/inetd.html から収集されました

2つのファイルを作成する必要があります。

svnserve.socket

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

[Socket]
ListenStream=3690
Accept=yes

[Install]
WantedBy=sockets.target

およびsvnserve @ .service

[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
vkersten

(これにコメントを付けます @ 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リポジトリとログディレクトリに正しい所有権とセキュリティタイプを持たせます。

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
S. Narum