Přeskočit obsah

Systemd skripty

Jednotlivé mikroslužby jsou v případě on-premise spouštěny přes (dnes již běžně používané) systemd skripty.

Příprava skriptů

  • systemd skripty nahrajeme do složky /opt/tsm/systemd.d/
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$ ls -la /opt/tsm/systemd.d
celkem 76
drwxrwxr-x. 2 tsm tsm 4096 11. čen 10.30 .
drwxr-xr-x. 7 tsm tsm 4096 11. čen 12.42 ..
-rw-r--r--. 1 tsm tsm  511 11. čen 09.48 tsm-address-management.service
-rw-r--r--. 1 tsm tsm  481 11. čen 09.48 tsm-calendar.service
-rw-r--r--. 1 tsm tsm  478 11. čen 09.48 tsm-catalog.service
-rw-r--r--. 1 tsm tsm  490 11. čen 09.48 tsm-config-form.service
-rw-r--r--. 1 tsm tsm  481 11. čen 09.48 tsm-customer.service
-rw-r--r--. 1 tsm tsm  466 11. čen 09.49 tsm-dms.service
-rw-r--r--. 1 tsm tsm  480 11. čen 09.49 tsm-gateway.service
-rw-r--r--. 1 tsm tsm  484 11. čen 09.49 tsm-inventory.service
-rw-r--r--. 1 tsm tsm  481 11. čen 09.49 tsm-ordering.service
-rw-r--r--. 1 tsm tsm  511 11. čen 09.49 tsm-process-definition.service
-rw-r--r--. 1 tsm tsm  510 11. čen 09.49 tsm-service-discovery.service
-rw-r--r--. 1 tsm tsm  475 11. čen 09.49 tsm-ticket.service
-rw-r--r--. 1 tsm tsm  502 11. čen 09.49 tsm-user-management.service
Kompletní sada skriptů

Ukázky systemd skriptů jsou dostupné na adrese: https://tsm-proxy-distro.datalite.cloud/systemd.d/

Ukázka systemd souboru s konfigurací pro službu tsm-address-management (opět, ostatní služby to mají podobně). Soubor se jmenuje tsm-address-management.service:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
[Unit]
Description=TSM address-management
Requires=default.target
After=default.target

[Service]
EnvironmentFile=/opt/tsm/tsm.env
WorkingDirectory=/opt/tsm/app
ExecStart=/bin/bash -ce "exec ${JAVA_HOME}/bin/java -Xms1G -Xmx1500M -jar tsm-address-management-postgres.jar >> ${APP_LOGS}/tsm-address-management.stdout.log 2>&1"
ExecStop=/bin/kill -15 $MAINPID
Restart=on-failure
PrivateTmp=true
User=tsm-admin
Group=tsm-admin
KillSignal=SIGTERM
SuccessExitStatus=143

[Install]
WantedBy=default.target

Na co je potřeba dávat pozor v nastavení dodávaných systemd skriptů:

  • základní proměnné prostředí jsou umístěny v souboru /opt/tsm/tsm.env, v systemd souboru je to řádek:
1
EnvironmentFile=/opt/tsm/tsm.env

Obsah souboru /opt/tsm/tsm.env je:

1
2
3
4
BASEDIR=/opt/tsm
JAVA_HOME=/opt/tsm/sw/java
APP_HOME=/opt/tsm/app
APP_LOGS=/opt/tsm/logs/app
  • pracovní adresář, tj. adresář, kde jar balíček startuje je nastaven na /opt/tsm/app, v systemd skriptu je to řádek:
1
WorkingDirectory=/opt/tsm/app
Důležité

Pracovní adresář je důležité nastavení, protože v podadresáři config/ pak aplikace "hledá" yml konfigurační soubory (jedná se o chování SpringBoot aplikace - Java framework, v němž jsou mikroslužby TSM vyvíjené).

  • nastavení uživatele a skupiny, pok kterou aplikace poběží, v systemd skriptu jsou to dva řádky:
1
2
User=tsm-admin
Group=tsm-admin
  • logování mikroslužeb, v systemd skriptu je uvedeno na řádku, kde je volba ExecStart:
1
2
3
4
ExecStart=/bin/bash -ce \
    "exec ${JAVA_HOME}/bin/java -Xms1G -Xmx1500M \
    -jar tsm-address-management-postgres.jar >> \
    ${APP_LOGS}/tsm-address-management.stdout.log 2>&1"

Výstup je přesměrován do souboru ${APP_LOGS}/tsm-address-management.stdout.log. Proměnná APP_LOGS ukazuje do složky /opt/tsm/logs/app. Jak již bylo zmíněno, proměnná se bere ze souboru /opt/tsm/tsm.env (v systemd se jedná o nastavení EnvironmentFile=/opt/tsm/tsm.env).

Zprovoznění přes systemd

Když máme všechny skripty umístěné ve složce /opt/tsm/systemd.d připraveny, můžeme přejít k samotnému zprovoznění přes systemd.

  • přepneme se na uživatele root pomocí sudo:
1
sudo su
  • nastavíme proměnnou BASEDIR, ta musí obsahovat cestu ke složce s našimi upravenými systemd skripty, v v našem případě provedeme v terminálu:
1
export BASEDIR=/opt/tsm
  • přejdeme do složky /usr/lib/systemd/system
1
cd /usr/lib/systemd/system

A spustíme následující sadu příkazů v terminálu:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
ln -sf ${BASEDIR}/systemd.d/tsm-address-management.service
ln -sf ${BASEDIR}/systemd.d/tsm-calendar.service
ln -sf ${BASEDIR}/systemd.d/tsm-catalog.service
ln -sf ${BASEDIR}/systemd.d/tsm-config-form.service
ln -sf ${BASEDIR}/systemd.d/tsm-customer.service
ln -sf ${BASEDIR}/systemd.d/tsm-dms.service
ln -sf ${BASEDIR}/systemd.d/tsm-gateway.service
ln -sf ${BASEDIR}/systemd.d/tsm-inventory.service
ln -sf ${BASEDIR}/systemd.d/tsm-ordering.service
ln -sf ${BASEDIR}/systemd.d/tsm-process-definition.service
ln -sf ${BASEDIR}/systemd.d/tsm-service-discovery.service
ln -sf ${BASEDIR}/systemd.d/tsm-ticket.service
ln -sf ${BASEDIR}/systemd.d/tsm-user-management.service

Následně povolíme automatický start systemd služeb, v terminálu spustíme:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
systemctl enable tsm-address-management
systemctl enable tsm-calendar
systemctl enable tsm-catalog
systemctl enable tsm-config-form
systemctl enable tsm-customer
systemctl enable tsm-dms
systemctl enable tsm-gateway
systemctl enable tsm-inventory
systemctl enable tsm-ordering
systemctl enable tsm-process-definition
systemctl enable tsm-service-discovery
systemctl enable tsm-ticket
systemctl enable tsm-user-management
systemctl daemon-reload
  • zkusíme nastartovat službu tsm-service-discovery:
1
systemctl start tsm-service-discovery
  • podívat se jestli služba běží:
1
2
3
4
5
6
7
8
systemctl status tsm-service-discovery

● tsm-service-discovery.service - TSM service-discovery
   Loaded: loaded (/opt/tsm/systemd.d/tsm-service-discovery.service; enabled; vendor preset: disabled)
   Active: active (running) since Ne 2021-06-13 23:34:41 CEST; 12h ago
 Main PID: 3582 (java)
   CGroup: /system.slice/tsm-service-discovery.service
           └─3582 /opt/tsm/sw/java/bin/java -Xms512M -Xmx1G -jar tsm-service-discovery-postgres.jar
  • případně se podívat do výstupního logu:
1
less /opt/tsm/logs/app/tsm-service-discovary.stdout.log

Pokud vše funguje, nastartujeme zbytek služeb:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
systemctl start tsm-address-management
systemctl start tsm-calendar
systemctl start tsm-catalog
systemctl start tsm-config-form
systemctl start tsm-customer
systemctl start tsm-dms
systemctl start tsm-gateway
systemctl start tsm-inventory
systemctl start tsm-ordering
systemctl start tsm-process-definition
systemctl start tsm-service-discovery
systemctl start tsm-ticket
systemctl start tsm-user-management

Systemd skripty pro ostatní služby

Zprovoznění ostatních skriptů pro infrastrukturní služby probíhá obdobně jako pro mikro-služby. Nejprve je nutné připravit soubory ve složce /opt/tsm/systemd.d:

  • zook.service
  • kafka.service
  • elastic.service
  • kibana.service
  • proxy.service

Zookeeper

Obsah souboru /opt/tsm/systemd.d/zook.service:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
[Unit]
Description=Zookeeper
Requires=default.target
After=default.target

[Service]
EnvironmentFile=/opt/tsm/tsm.env
Environment="KAFKA_HEAP_OPTS=-Xms512M -Xmx1G"
WorkingDirectory=/opt/tsm/sw/kafka
ExecStart=/bin/bash -ce "exec ${BASEDIR}/sw/kafka/bin/zookeeper-server-start.sh ${BASEDIR}/sw/kafka/config/zookeeper.properties"
KillMode=process
KillSignal=SIGTERM
SuccessExitStatus=143
TimeoutStopSec=10
PrivateTmp=true
Restart=on-failure
User=tsm-admin
Group=tsm-admin

[Install]
WantedBy=default.target

Kafka

Obsah souboru /opt/tsm/systemd.d/kafka.service:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[Unit]
Description=Kafka
Requires=default.target
After=default.target

[Service]
EnvironmentFile=/opt/tsm/tsm.env
WorkingDirectory=/opt/tsm/sw/kafka
LimitNOFILE=65535
LimitNPROC=65535
Environment="KAFKA_HEAP_OPTS=-Xms1G -Xmx2G"
ExecStart=/bin/bash -ce "exec ${BASEDIR}/sw/kafka/bin/kafka-server-start.sh ${BASEDIR}/sw/kafka/config/server.properties"
KillMode=process
KillSignal=SIGTERM
SuccessExitStatus=143
TimeoutStopSec=10
PrivateTmp=true
Restart=on-failure
User=tsm-admin
Group=tsm-admin

[Install]
WantedBy=default.target

Elasticsearch

Obsah souboru /opt/tsm/systemd.d/elastic.service:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
[Unit]
Description=Elastic
Requires=default.target
After=default.target

[Service]
EnvironmentFile=/opt/tsm/tsm.env
WorkingDirectory=/opt/tsm/sw/elastic
LimitNOFILE=65535
LimitNPROC=65535
ExecStart=/bin/bash -ce "exec ${BASEDIR}/sw/elastic/bin/elasticsearch"
KillMode=process
KillSignal=SIGTERM
SuccessExitStatus=143
TimeoutStopSec=10
PrivateTmp=true
Restart=on-failure
User=tsm-admin
Group=tsm-admin

[Install]
WantedBy=default.target

Kibana

Obsah souboru /opt/tsm/systemd.d/kibana.service:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
[Unit]
Description=Kibana
Requires=default.target
After=default.target

[Service]
EnvironmentFile=/opt/tsm/tsm.env
WorkingDirectory=/opt/tsm/sw/kibana
LimitNOFILE=65535
LimitNPROC=65535
ExecStart=/bin/bash -ce "exec ${BASEDIR}/sw/kibana/bin/kibana"
KillMode=process
PrivateTmp=true
Restart=on-failure
User=tsm-admin
Group=tsm-admin

[Install]
WantedBy=default.target

Proxy (nginx)

Obsah souboru /opt/tsm/systemd.d/proxy.service:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
[Unit]
Description=NGINX (with virtual host stats, openssl, ldap auth, jwt auth, lua)
After=syslog.target network-online.target
Wants=network-online.target

[Service]
Type=forking
ExecStartPre=/opt/tsm/proxy/nginx/sbin/nginx -t
ExecStart=/opt/tsm/proxy/nginx/sbin/nginx
ExecStop=/opt/tsm/proxy/nginx/sbin/nginx -s stop
ExecReload=/opt/tsm/proxy/nginx/sbin/nginx -s reload
PrivateTmp=true
User=tsm-admin
Group=tsm-admin

[Install]
WantedBy=default.target

Zprovoznění infra služeb přes systemd

  • přepneme se na uživatele root pomocí sudo:
1
sudo su
  • nastavíme proměnnou BASEDIR, ta musí obsahovat cestu ke složce s našimi upravenými systemd skripty, v v našem případě provedeme v terminálu:
1
export BASEDIR=/opt/tsm
  • přejdeme do složky /usr/lib/systemd/system
1
cd /usr/lib/systemd/system

A spustíme následující sadu příkazů v terminálu:

1
2
3
4
5
ln -sf ${BASEDIR}/systemd.d/zook.service
ln -sf ${BASEDIR}/systemd.d/kafka.service
ln -sf ${BASEDIR}/systemd.d/elastic.service
ln -sf ${BASEDIR}/systemd.d/kibana.service
ln -sf ${BASEDIR}/systemd.d/proxy.service

Následně povolíme automatický start systemd služeb, v terminálu spustíme:

1
2
3
4
5
6
systemctl enable zook
systemctl enable kafka
systemctl enable elastic
systemctl enable kibana
systemctl enable proxy
systemctl daemon-reload