Bug 40901: (QA follow-up) Polish the per-component units

- Order services Before= their instance target instead of After=. With
  After=, koha@<inst>.target (and therefore koha.target) reported active
  before a single daemon had started, so its state meant nothing to
  anything ordered after Koha. koha@.target is likewise Before=koha.target.
- Add SyslogIdentifier=%i-koha-<service> to every unit so journal lines
  can be filtered per instance and component (the template this series
  removed already did this) and Documentation= pointing at each helper's
  man page.
- koha-plack@: stop with SIGQUIT and a 30s timeout. Starman treats QUIT
  as graceful shutdown and TERM as immediate; the SysV path used
  QUIT/30/KILL/5, so the default SIGTERM cut in-flight requests on every
  restart. Drop the redundant --user/--group starman flags, User=/Group=
  already apply.
- koha-worker@, koha-worker-long_tasks@: KillMode=mixed with a 120s
  timeout so the parent is signalled but a running forked job gets a
  chance to finish before it is killed.
- koha-zebra@: remove every *socket file in the run directory rather
  than the two default names, so sites with customised <listen> entries
  get the same stale-socket protection.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: Martin Renvoize <martin.renvoize@openfifth.co.uk>
Signed-off-by: Pedro Amorim <pedro.amorim@openfifth.co.uk>
This commit is contained in:
Martin Renvoize 2026-09-15 17:34:02 +01:00 committed by Pedro Amorim
parent 5562b26bb0
commit 1a81cf9bc7
No known key found for this signature in database
GPG Key ID: 06B75BA7F3894D55
9 changed files with 46 additions and 10 deletions

View File

@ -1,8 +1,10 @@
[Unit] [Unit]
Description=Koha Elasticsearch indexer daemon for %i Description=Koha Elasticsearch indexer daemon for %i
Documentation=man:koha-es-indexer(8)
PartOf=koha@%i.target PartOf=koha@%i.target
Requires=koha-create-dirs@%i.service Requires=koha-create-dirs@%i.service
After=koha@%i.target koha-create-dirs@%i.service Before=koha@%i.target
After=koha-create-dirs@%i.service
StartLimitIntervalSec=60 StartLimitIntervalSec=60
StartLimitBurst=3 StartLimitBurst=3
@ -10,6 +12,7 @@ StartLimitBurst=3
Type=simple Type=simple
User=%i-koha User=%i-koha
Group=%i-koha Group=%i-koha
SyslogIdentifier=%i-koha-es-indexer
WorkingDirectory=/var/lib/koha/%i WorkingDirectory=/var/lib/koha/%i
Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml
Environment=KOHA_HOME=/usr/share/koha Environment=KOHA_HOME=/usr/share/koha

View File

@ -1,8 +1,10 @@
[Unit] [Unit]
Description=Koha Zebra indexer daemon for %i Description=Koha Zebra indexer daemon for %i
Documentation=man:koha-indexer(8)
PartOf=koha@%i.target PartOf=koha@%i.target
Requires=koha-create-dirs@%i.service Requires=koha-create-dirs@%i.service
After=koha@%i.target koha-zebra@%i.service koha-create-dirs@%i.service Before=koha@%i.target
After=koha-zebra@%i.service koha-create-dirs@%i.service
StartLimitIntervalSec=60 StartLimitIntervalSec=60
StartLimitBurst=3 StartLimitBurst=3
@ -10,6 +12,7 @@ StartLimitBurst=3
Type=simple Type=simple
User=%i-koha User=%i-koha
Group=%i-koha Group=%i-koha
SyslogIdentifier=%i-koha-indexer
WorkingDirectory=/var/lib/koha/%i WorkingDirectory=/var/lib/koha/%i
Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml
Environment=KOHA_HOME=/usr/share/koha Environment=KOHA_HOME=/usr/share/koha

View File

@ -1,8 +1,10 @@
[Unit] [Unit]
Description=Koha Plack server for %i Description=Koha Plack server for %i
Documentation=man:koha-plack(8)
PartOf=koha@%i.target PartOf=koha@%i.target
Requires=koha-create-dirs@%i.service Requires=koha-create-dirs@%i.service
After=koha@%i.target koha-create-dirs@%i.service Before=koha@%i.target
After=koha-create-dirs@%i.service
StartLimitIntervalSec=60 StartLimitIntervalSec=60
StartLimitBurst=3 StartLimitBurst=3
@ -10,6 +12,7 @@ StartLimitBurst=3
Type=forking Type=forking
User=%i-koha User=%i-koha
Group=%i-koha Group=%i-koha
SyslogIdentifier=%i-koha-plack
WorkingDirectory=/var/lib/koha/%i WorkingDirectory=/var/lib/koha/%i
Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml
Environment=KOHA_HOME=/usr/share/koha Environment=KOHA_HOME=/usr/share/koha
@ -21,7 +24,6 @@ ExecStart=/usr/bin/starman \
-M FindBin \ -M FindBin \
--max-requests ${PLACK_MAX_REQUESTS} \ --max-requests ${PLACK_MAX_REQUESTS} \
--workers ${PLACK_WORKERS} \ --workers ${PLACK_WORKERS} \
--user %i-koha --group %i-koha \
--pid /run/koha/%i/plack.pid \ --pid /run/koha/%i/plack.pid \
--daemonize \ --daemonize \
--access-log /var/log/koha/%i/plack.log \ --access-log /var/log/koha/%i/plack.log \
@ -30,6 +32,10 @@ ExecStart=/usr/bin/starman \
--listen /run/koha/%i/plack.sock \ --listen /run/koha/%i/plack.sock \
${PLACK_PSGIFILE} ${PLACK_PSGIFILE}
ExecReload=/bin/kill -HUP $MAINPID ExecReload=/bin/kill -HUP $MAINPID
# Starman shuts down gracefully on QUIT (TERM is immediate); matches the
# QUIT/30/KILL/5 retry schedule the SysV path used.
KillSignal=SIGQUIT
TimeoutStopSec=30s
ProtectSystem=full ProtectSystem=full
ProtectHome=yes ProtectHome=yes
PrivateTmp=yes PrivateTmp=yes

View File

@ -1,8 +1,10 @@
[Unit] [Unit]
Description=Koha SIP server for %i Description=Koha SIP server for %i
Documentation=man:koha-sip(8)
PartOf=koha@%i.target PartOf=koha@%i.target
Requires=koha-create-dirs@%i.service Requires=koha-create-dirs@%i.service
After=koha@%i.target koha-create-dirs@%i.service Before=koha@%i.target
After=koha-create-dirs@%i.service
AssertPathExists=/etc/koha/sites/%i/SIPconfig.xml AssertPathExists=/etc/koha/sites/%i/SIPconfig.xml
StartLimitIntervalSec=60 StartLimitIntervalSec=60
@ -12,6 +14,7 @@ StartLimitBurst=3
Type=simple Type=simple
User=%i-koha User=%i-koha
Group=%i-koha Group=%i-koha
SyslogIdentifier=%i-koha-sip
WorkingDirectory=/var/lib/koha/%i WorkingDirectory=/var/lib/koha/%i
Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml
Environment=KOHA_HOME=/usr/share/koha Environment=KOHA_HOME=/usr/share/koha

View File

@ -1,8 +1,10 @@
[Unit] [Unit]
Description=Koha background worker (long_tasks queue) for %i Description=Koha background worker (long_tasks queue) for %i
Documentation=man:koha-worker(8)
PartOf=koha@%i.target PartOf=koha@%i.target
Requires=koha-create-dirs@%i.service Requires=koha-create-dirs@%i.service
After=koha@%i.target koha-create-dirs@%i.service Before=koha@%i.target
After=koha-create-dirs@%i.service
StartLimitIntervalSec=60 StartLimitIntervalSec=60
StartLimitBurst=3 StartLimitBurst=3
@ -10,6 +12,7 @@ StartLimitBurst=3
Type=simple Type=simple
User=%i-koha User=%i-koha
Group=%i-koha Group=%i-koha
SyslogIdentifier=%i-koha-worker-long_tasks
WorkingDirectory=/var/lib/koha/%i WorkingDirectory=/var/lib/koha/%i
Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml
Environment=KOHA_HOME=/usr/share/koha Environment=KOHA_HOME=/usr/share/koha
@ -19,6 +22,10 @@ ProtectSystem=full
ProtectHome=yes ProtectHome=yes
PrivateTmp=yes PrivateTmp=yes
NoNewPrivileges=yes NoNewPrivileges=yes
# The worker forks a child per job: signal only the parent and give running
# jobs a chance to finish before the remaining processes are killed.
KillMode=mixed
TimeoutStopSec=120s
Restart=on-failure Restart=on-failure
RestartSec=5s RestartSec=5s

View File

@ -1,8 +1,10 @@
[Unit] [Unit]
Description=Koha background worker (default queue) for %i Description=Koha background worker (default queue) for %i
Documentation=man:koha-worker(8)
PartOf=koha@%i.target PartOf=koha@%i.target
Requires=koha-create-dirs@%i.service Requires=koha-create-dirs@%i.service
After=koha@%i.target koha-create-dirs@%i.service Before=koha@%i.target
After=koha-create-dirs@%i.service
StartLimitIntervalSec=60 StartLimitIntervalSec=60
StartLimitBurst=3 StartLimitBurst=3
@ -10,6 +12,7 @@ StartLimitBurst=3
Type=simple Type=simple
User=%i-koha User=%i-koha
Group=%i-koha Group=%i-koha
SyslogIdentifier=%i-koha-worker
WorkingDirectory=/var/lib/koha/%i WorkingDirectory=/var/lib/koha/%i
Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml
Environment=KOHA_HOME=/usr/share/koha Environment=KOHA_HOME=/usr/share/koha
@ -19,6 +22,10 @@ ProtectSystem=full
ProtectHome=yes ProtectHome=yes
PrivateTmp=yes PrivateTmp=yes
NoNewPrivileges=yes NoNewPrivileges=yes
# The worker forks a child per job: signal only the parent and give running
# jobs a chance to finish before the remaining processes are killed.
KillMode=mixed
TimeoutStopSec=120s
Restart=on-failure Restart=on-failure
RestartSec=5s RestartSec=5s

View File

@ -1,8 +1,10 @@
[Unit] [Unit]
Description=Koha Z39.50/SRU server for %i Description=Koha Z39.50/SRU server for %i
Documentation=man:koha-z3950-responder(8)
PartOf=koha@%i.target PartOf=koha@%i.target
Requires=koha-create-dirs@%i.service Requires=koha-create-dirs@%i.service
After=koha@%i.target koha-create-dirs@%i.service Before=koha@%i.target
After=koha-create-dirs@%i.service
StartLimitIntervalSec=60 StartLimitIntervalSec=60
StartLimitBurst=3 StartLimitBurst=3
@ -10,6 +12,7 @@ StartLimitBurst=3
Type=forking Type=forking
User=%i-koha User=%i-koha
Group=%i-koha Group=%i-koha
SyslogIdentifier=%i-koha-z3950
WorkingDirectory=/var/lib/koha/%i WorkingDirectory=/var/lib/koha/%i
Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml
Environment=KOHA_HOME=/usr/share/koha Environment=KOHA_HOME=/usr/share/koha

View File

@ -1,8 +1,10 @@
[Unit] [Unit]
Description=Koha Zebra indexing server for %i Description=Koha Zebra indexing server for %i
Documentation=man:koha-zebra(8)
PartOf=koha@%i.target PartOf=koha@%i.target
Requires=koha-create-dirs@%i.service Requires=koha-create-dirs@%i.service
After=koha@%i.target koha-create-dirs@%i.service Before=koha@%i.target
After=koha-create-dirs@%i.service
StartLimitIntervalSec=60 StartLimitIntervalSec=60
StartLimitBurst=3 StartLimitBurst=3
@ -10,13 +12,14 @@ StartLimitBurst=3
Type=forking Type=forking
User=%i-koha User=%i-koha
Group=%i-koha Group=%i-koha
SyslogIdentifier=%i-koha-zebra
WorkingDirectory=/var/lib/koha/%i WorkingDirectory=/var/lib/koha/%i
Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml
Environment=KOHA_HOME=/usr/share/koha Environment=KOHA_HOME=/usr/share/koha
PIDFile=/run/koha/%i/zebra.pid PIDFile=/run/koha/%i/zebra.pid
ExecStartPre=+/usr/sbin/koha-generate-env zebra %i ExecStartPre=+/usr/sbin/koha-generate-env zebra %i
# Clean up leftover Zebra socket files so Zebra can rebind on startup. # Clean up leftover Zebra socket files so Zebra can rebind on startup.
ExecStartPre=+/bin/rm -f /run/koha/%i/bibliosocket /run/koha/%i/authoritysocket ExecStartPre=+/bin/sh -c 'rm -f /run/koha/%i/*socket'
EnvironmentFile=-/run/koha/%i/zebra.env EnvironmentFile=-/run/koha/%i/zebra.env
ExecStart=/usr/bin/zebrasrv \ ExecStart=/usr/bin/zebrasrv \
-v ${ZEBRA_LOGLEVELS} \ -v ${ZEBRA_LOGLEVELS} \

View File

@ -2,6 +2,7 @@
Description=Koha ILS instance %i Description=Koha ILS instance %i
After=network.target memcached.service mysql.service After=network.target memcached.service mysql.service
PartOf=koha.target PartOf=koha.target
Before=koha.target
[Install] [Install]
WantedBy=koha.target WantedBy=koha.target