View | Details | Raw Unified | Return to bug 40901
Collapse All | Expand All

(-)a/debian/control.in (+16 lines)
Lines 3-8 Maintainer: Mason James <mtj@kohaaloha.com> Link Here
3
Section: web
3
Section: web
4
Priority: optional
4
Priority: optional
5
Standards-Version: 3.8.4
5
Standards-Version: 3.8.4
6
# koha-systemd package provides systemd units only
6
# WARNING: The "control" file is automatically generated from the "control.in" file.
7
# WARNING: The "control" file is automatically generated from the "control.in" file.
7
# Do not manually edit "control" or your changes will be clobbered when you
8
# Do not manually edit "control" or your changes will be clobbered when you
8
# run update-control
9
# run update-control
Lines 146-148 Description: integrated (physical) library management system Link Here
146
 systems such as MariaDB, RabbitMQ, et cetera.
147
 systems such as MariaDB, RabbitMQ, et cetera.
147
 .
148
 .
148
 This package is EXPERIMENTAL and not recommended for production use.
149
 This package is EXPERIMENTAL and not recommended for production use.
150
151
Package: koha-systemd
152
Architecture: all
153
Depends: ${misc:Depends}, systemd, koha-common
154
Description: systemd units for Koha ILS
155
 Koha is an Integrated Library Management system for real-world libraries
156
 (the kinds with books).
157
 .
158
 This package provides native systemd service units for managing Koha
159
 instances. Each service type (Plack, Zebra, SIP, Z3950, workers, indexers)
160
 is managed as a separate systemd unit using instance templates.
161
 .
162
 This allows granular control over individual services per instance and
163
 leverages systemd features like dependency management, resource limits,
164
 and journald logging.
(-)a/debian/koha-systemd.README.Debian (+88 lines)
Line 0 Link Here
1
# Koha systemd Units
2
3
This package provides native systemd service units for Koha ILS.
4
5
## Architecture
6
7
Each Koha service type runs as a separate systemd unit using instance templates:
8
9
- `koha-plack@.service` - Plack/Starman web application server
10
- `koha-zebra@.service` - Zebra search indexing server
11
- `koha-sip@.service` - SIP2 circulation protocol server
12
- `koha-z3950@.service` - Z39.50/SRU server
13
- `koha-worker@.service` - Background job worker (default queue)
14
- `koha-worker-long@.service` - Background job worker (long_tasks queue)
15
- `koha-indexer@.service` - Zebra indexing daemon
16
- `koha-es-indexer@.service` - Elasticsearch indexing daemon
17
18
Instance grouping:
19
- `koha@.target` - Groups all services for a single instance
20
- `koha.target` - Groups all Koha instances
21
22
## Usage
23
24
### Managing a complete instance
25
26
```bash
27
# Start all services for instance "library"
28
systemctl start koha@library.target
29
30
# Enable at boot
31
systemctl enable koha@library.target
32
33
# Check status
34
systemctl status koha@library.target
35
```
36
37
### Managing individual services
38
39
```bash
40
# Start only Plack for instance "library"
41
systemctl start koha-plack@library.service
42
43
# Restart SIP server
44
systemctl restart koha-sip@library.service
45
46
# Check worker status
47
systemctl status koha-worker@library.service
48
systemctl status koha-worker-long@library.service
49
```
50
51
### Logs
52
53
```bash
54
# View logs for all services of an instance
55
journalctl -u 'koha-*@library.service'
56
57
# View Plack logs
58
journalctl -u koha-plack@library.service -f
59
60
# View all Koha logs
61
journalctl -u 'koha-*.service'
62
```
63
64
## Service Enablement
65
66
Some services are conditionally enabled based on configuration files:
67
68
- **SIP**: Requires `/var/lib/koha/{instance}/sip.enabled` and `/etc/koha/sites/{instance}/SIPconfig.xml`
69
- **Z3950**: Requires `/etc/koha/sites/{instance}/z3950/config.xml`
70
71
## Migration from init scripts
72
73
The koha-systemd package is designed to coexist with koha-common but provides
74
an alternative service management approach. To migrate:
75
76
1. Stop services via init script: `service koha-common stop`
77
2. Install koha-systemd package
78
3. Enable instance target: `systemctl enable koha@{instance}.target`
79
4. Start services: `systemctl start koha@{instance}.target`
80
81
## Advantages
82
83
- **Granular control**: Start/stop individual services per instance
84
- **Resource limits**: Apply CPU/memory limits via systemd
85
- **Dependency management**: Proper service ordering and failure handling
86
- **Logging**: Centralized logging via journald
87
- **Security**: Modern sandboxing options available
88
- **Monitoring**: Native systemd health checks and status reporting
(-)a/debian/koha-systemd.dirs (+1 lines)
Line 0 Link Here
1
usr/lib/systemd/system
(-)a/debian/koha-systemd.install (+3 lines)
Line 0 Link Here
1
debian/systemd/*.service usr/lib/systemd/system
2
debian/systemd/*.target usr/lib/systemd/system
3
debian/systemd/koha-systemd-ctl usr/sbin
(-)a/debian/koha-systemd.postinst (+13 lines)
Line 0 Link Here
1
#!/bin/sh
2
set -e
3
4
case "$1" in
5
    configure)
6
        # Reload systemd daemon
7
        systemctl daemon-reload || true
8
        ;;
9
esac
10
11
#DEBHELPER#
12
13
exit 0
(-)a/debian/koha-systemd.prerm (+14 lines)
Line 0 Link Here
1
#!/bin/sh
2
set -e
3
4
case "$1" in
5
    remove|deconfigure)
6
        if [ -d /run/systemd/system ]; then
7
            systemctl --system daemon-reload >/dev/null || true
8
        fi
9
        ;;
10
esac
11
12
#DEBHELPER#
13
14
exit 0
(-)a/debian/systemd/koha-es-indexer@.service (+19 lines)
Line 0 Link Here
1
[Unit]
2
Description=Koha Elasticsearch indexer daemon for %i
3
PartOf=koha@%i.target
4
After=koha@%i.target
5
6
[Service]
7
Type=simple
8
User=%i-koha
9
Group=%i-koha
10
WorkingDirectory=/var/lib/koha/%i
11
Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml
12
Environment=KOHA_HOME=/usr/share/koha
13
Environment=PERL5LIB=/usr/share/koha/lib
14
ExecStart=/usr/share/koha/bin/workers/es_indexer_daemon.pl
15
Restart=on-failure
16
RestartSec=30s
17
18
[Install]
19
WantedBy=koha@%i.target
(-)a/debian/systemd/koha-indexer@.service (+19 lines)
Line 0 Link Here
1
[Unit]
2
Description=Koha Zebra indexer daemon for %i
3
PartOf=koha@%i.target
4
After=koha@%i.target koha-zebra@%i.service
5
6
[Service]
7
Type=simple
8
User=%i-koha
9
Group=%i-koha
10
WorkingDirectory=/var/lib/koha/%i
11
Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml
12
Environment=KOHA_HOME=/usr/share/koha
13
Environment=PERL5LIB=/usr/share/koha/lib
14
ExecStart=/usr/share/koha/bin/migration_tools/rebuild_zebra.pl -daemon -sleep 5
15
Restart=on-failure
16
RestartSec=30s
17
18
[Install]
19
WantedBy=koha@%i.target
(-)a/debian/systemd/koha-plack@.service (+21 lines)
Line 0 Link Here
1
[Unit]
2
Description=Koha Plack server for %i
3
PartOf=koha@%i.target
4
After=koha@%i.target
5
6
[Service]
7
Type=forking
8
User=%i-koha
9
Group=%i-koha
10
WorkingDirectory=/var/lib/koha/%i
11
Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml
12
Environment=KOHA_HOME=/usr/share/koha
13
Environment=PERL5LIB=/usr/share/koha/lib
14
PIDFile=/var/run/koha/%i/plack.pid
15
ExecStart=/usr/bin/plackup -s Starman --daemonize --pid /var/run/koha/%i/plack.pid --listen /var/run/koha/%i/plack.sock /etc/koha/plack.psgi
16
ExecReload=/bin/kill -HUP $MAINPID
17
Restart=on-failure
18
RestartSec=5s
19
20
[Install]
21
WantedBy=koha@%i.target
(-)a/debian/systemd/koha-sip@.service (+21 lines)
Line 0 Link Here
1
[Unit]
2
Description=Koha SIP server for %i
3
PartOf=koha@%i.target
4
After=koha@%i.target
5
ConditionPathExists=/var/lib/koha/%i/sip.enabled
6
ConditionPathExists=/etc/koha/sites/%i/SIPconfig.xml
7
8
[Service]
9
Type=simple
10
User=%i-koha
11
Group=%i-koha
12
WorkingDirectory=/var/lib/koha/%i
13
Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml
14
Environment=KOHA_HOME=/usr/share/koha
15
Environment=PERL5LIB=/usr/share/koha/lib
16
ExecStart=/usr/bin/perl /usr/share/koha/lib/C4/SIP/SIPServer.pm /etc/koha/sites/%i/SIPconfig.xml
17
Restart=on-failure
18
RestartSec=30s
19
20
[Install]
21
WantedBy=koha@%i.target
(-)a/debian/systemd/koha-systemd-ctl (+56 lines)
Line 0 Link Here
1
#!/bin/bash
2
# koha-systemd-ctl - Helper for managing Koha instances via systemd
3
4
set -e
5
6
usage() {
7
    cat <<EOF
8
Usage: $(basename $0) <command> <instance> [service]
9
10
Commands:
11
  enable <instance>          Enable all services for instance
12
  disable <instance>         Disable all services for instance
13
  start <instance>           Start all services for instance
14
  stop <instance>            Stop all services for instance
15
  restart <instance>         Restart all services for instance
16
  status <instance>          Show status of all services for instance
17
  
18
  enable <instance> <svc>    Enable specific service for instance
19
  disable <instance> <svc>   Disable specific service for instance
20
  start <instance> <svc>     Start specific service for instance
21
  stop <instance> <svc>      Stop specific service for instance
22
  restart <instance> <svc>   Restart specific service for instance
23
  status <instance> <svc>    Show status of specific service for instance
24
25
Services: plack, zebra, sip, z3950, worker, worker-long, indexer, es-indexer
26
27
Examples:
28
  $(basename $0) enable library
29
  $(basename $0) start library plack
30
  $(basename $0) status library
31
  $(basename $0) restart library worker
32
EOF
33
    exit 1
34
}
35
36
[ $# -lt 2 ] && usage
37
38
CMD=$1
39
INSTANCE=$2
40
SERVICE=${3:-}
41
42
if [ -n "$SERVICE" ]; then
43
    UNIT="koha-${SERVICE}@${INSTANCE}.service"
44
else
45
    UNIT="koha@${INSTANCE}.target"
46
fi
47
48
case "$CMD" in
49
    enable|disable|start|stop|restart|status)
50
        systemctl "$CMD" "$UNIT"
51
        ;;
52
    *)
53
        echo "Unknown command: $CMD"
54
        usage
55
        ;;
56
esac
(-)a/debian/systemd/koha-worker-long@.service (+21 lines)
Line 0 Link Here
1
[Unit]
2
Description=Koha background worker (long_tasks queue) for %i
3
PartOf=koha@%i.target
4
After=koha@%i.target
5
StartLimitIntervalSec=60
6
StartLimitBurst=3
7
8
[Service]
9
Type=simple
10
User=%i-koha
11
Group=%i-koha
12
WorkingDirectory=/var/lib/koha/%i
13
Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml
14
Environment=KOHA_HOME=/usr/share/koha
15
Environment=PERL5LIB=/usr/share/koha/lib
16
ExecStart=/usr/share/koha/bin/workers/background_jobs_worker.pl --queue long_tasks
17
Restart=on-failure
18
RestartSec=5s
19
20
[Install]
21
WantedBy=koha@%i.target
(-)a/debian/systemd/koha-worker@.service (+21 lines)
Line 0 Link Here
1
[Unit]
2
Description=Koha background worker (default queue) for %i
3
PartOf=koha@%i.target
4
After=koha@%i.target
5
StartLimitIntervalSec=60
6
StartLimitBurst=3
7
8
[Service]
9
Type=simple
10
User=%i-koha
11
Group=%i-koha
12
WorkingDirectory=/var/lib/koha/%i
13
Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml
14
Environment=KOHA_HOME=/usr/share/koha
15
Environment=PERL5LIB=/usr/share/koha/lib
16
ExecStart=/usr/share/koha/bin/workers/background_jobs_worker.pl --queue default
17
Restart=on-failure
18
RestartSec=5s
19
20
[Install]
21
WantedBy=koha@%i.target
(-)a/debian/systemd/koha-z3950@.service (+21 lines)
Line 0 Link Here
1
[Unit]
2
Description=Koha Z39.50/SRU server for %i
3
PartOf=koha@%i.target
4
After=koha@%i.target
5
ConditionPathExists=/etc/koha/sites/%i/z3950/config.xml
6
7
[Service]
8
Type=forking
9
User=%i-koha
10
Group=%i-koha
11
WorkingDirectory=/var/lib/koha/%i
12
Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml
13
Environment=KOHA_HOME=/usr/share/koha
14
Environment=PERL5LIB=/usr/share/koha/lib
15
PIDFile=/var/run/koha/%i/z3950-responder.pid
16
ExecStart=/usr/share/koha/bin/z3950_responder.pl -c /etc/koha/sites/%i/z3950 -u %i-koha -p /var/run/koha/%i/z3950-responder.pid -D -d %i-koha-z3950 -l /var/log/koha/%i/z3950.log
17
Restart=on-failure
18
RestartSec=30s
19
20
[Install]
21
WantedBy=koha@%i.target
(-)a/debian/systemd/koha-zebra@.service (+19 lines)
Line 0 Link Here
1
[Unit]
2
Description=Koha Zebra indexing server for %i
3
PartOf=koha@%i.target
4
After=koha@%i.target
5
6
[Service]
7
Type=forking
8
User=%i-koha
9
Group=%i-koha
10
WorkingDirectory=/var/lib/koha/%i
11
Environment=KOHA_CONF=/etc/koha/sites/%i/koha-conf.xml
12
Environment=KOHA_HOME=/usr/share/koha
13
PIDFile=/var/run/koha/%i/zebra.pid
14
ExecStart=/usr/bin/zebrasrv -f /etc/koha/sites/%i/koha-conf.xml -p /var/run/koha/%i/zebra.pid -D
15
Restart=on-failure
16
RestartSec=30s
17
18
[Install]
19
WantedBy=koha@%i.target
(-)a/debian/systemd/koha.target (+6 lines)
Line 0 Link Here
1
[Unit]
2
Description=Koha ILS - All instances
3
After=network.target memcached.service mysql.service
4
5
[Install]
6
WantedBy=multi-user.target
(-)a/debian/systemd/koha@.target (-1 / +7 lines)
Line 0 Link Here
0
- 
1
[Unit]
2
Description=Koha ILS instance %i
3
After=network.target memcached.service mysql.service
4
StopWhenUnneeded=yes
5
6
[Install]
7
WantedBy=koha.target

Return to bug 40901