Serverbetrieb

Einführung

Für den Betrieb des datasqill Servers sind zwei Softwarekomponenten erforderlich

  • datasqill Server
    • als SpringBoot Applikation oder
    • als TomEE mit datasqill Server App.
  • H2 Datenbank (datasqill Repository)

Software

Der datasqill Server wird entweder in Form einer WebApp in einem TomEE-Server (Version 3.x) oder als SpringBoot Applikation (Version ≥ 4.0) betrieben.

Hinweis: Alle nachfolgenden Unix-Befehle sind als User datasqill abzusetzen!

Unterscheidung Crontab oder Linux-Systemdienste

Es gibt zwei Wege, wie man die beiden datasqill Komponenten starten kann

  1. über Crontab-Einträge
  2. über Linux-Systemdienste

Davon abhängig sind dann die Verfahren unterschiedlich, die man im Betrieb zum Start und Stop der H2 Datenbank und des datasqill Servers verwendet.

Die Überprüfung, welches Verfahren zur Steuerung der Komponenten bei der Installation eingerichtet wurde, kann so erfolgen.

crontab -l | grep -q h2.sh && echo "Server is managed by crontab"
systemctl status h2 >> /dev/null && echo "Server is managed by systemctl"

Es sollte genau eine der folgenden Ausgaben erscheinen:

  • "Server is managed by crontab" oder
  • "Server is managed by systemctl".

Unterscheidung SpringBoot Applikation oder WebApp in TomEE

Bis zur Version 3.5.9 wurde der datasqill Server als WebApp in TomEE ausgeliefert. Mit Wechsel auf 4.0.0 wurde SpringBoot als Container eingesetzt, was den Betrieb vereinfacht.

Welchen Container, SpringBoot oder TomEE, eine datasqill Installation verwendet, kann so geprüft werden:

[[ -f /home/datasqill/datasqill-server/webapps/datasqill-server.war ]] && echo "Deployment as web app in TomEE"
[[ -f /home/datasqill/lib/datasqill-server.war ]] && echo "Deployment as SpringBoot application"

Daraufhin sollte genau eine der beiden folgenden Meldungen erscheinen:

  • "Deployment as SpringBoot application" oder
  • "Deployment as web app in TomEE".

Die verschiedenen Verfahren und die Einrichtung bzw. Kontrolle der Softwarekomponenten sind in den nachfolgenden Abschnitten beschrieben:

Kontrolle mit Crontab

Einrichtung (Crontab)

Um die H2 über Crontab-Einträge automatisch beim Bootvorgang zu starten, muss man als User datasqill den Crontab-Editor aufrufen

$ crontab -e

und dort folgende Zeile eintragen:

@reboot /home/datasqill/h2server/h2.sh 2>&1 >> /home/datasqill/h2.log

Wird der TomEE als Container verwendet, wird über denselben Weg (crontab -e) zusätzlich die folgende Zeile ergänzt:

@reboot . /home/datasqill/bin/datasqill.env && /opt/apache-tomee/bin/catalina.sh start 2>&1 >> /home/datasqill/tomee.log

Bei SpringBoot als Container ist folgender Crontab Eintrag zu ergänzen:

@reboot /home/datasqill/bin/datasqill 2>&1 >> /home/datasqill/datasqill.log

Status (Crontab)

Ob die H2-Datenbank läuft, kann mit folgender Anweisung überprüft werden:

$ pgrep -a h2
1011 /bin/bash /home/datasqill/h2server/h2.sh

Bei Verwendung von TomEE als Container erfolgt die Prüfung mit:

$ pgrep -a -f tomee
1052 /usr/bin/java -Djava.util.logging.config.file=/home/datasqill/datasqill-server/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -javaagent:/opt/apache-tomee/lib/openejb-javaagent.jar -Djdbc.drivers=net.snowflake.client.jdbc.SnowflakeDriver:org.apache.hive.jdbc.HiveDriver -Dde.softquadrat.datasqill.mappertool=/home/datasqill/bin/getkey -Djava.security.egd=file:/dev/urandom -Dtomee.port=17491 -Dtomee.shutdown_port=8005 -Dtomee.shutdown_command=SHUTDOWN -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Xms512M -Xmx1G -Djava.net.preferIPv4Stack=true -Dignore.endorsed.dirs= -classpath /home/datasqill/lib/jdbc/h2-1.4.199.jar:/opt/apache-tomee/bin/bootstrap.jar:/opt/apache-tomee/bin/tomcat-juli.jar -Dcatalina.base=/home/datasqill/datasqill-server -Dcatalina.home=/opt/apache-tomee -Djava.io.tmpdir=/home/datasqill/datasqill-server/temp org.apache.catalina.startup.Bootstrap start

Der SpringBoot Container wird so geprüft:

$ pgrep -a -f /home/datasqill/lib/datasqill-server.war
627 java -Djdbc.drivers=net.snowflake.client.jdbc.SnowflakeDriver:org.apache.hive.jdbc.HiveDriver -Dde.softquadrat.datasqill.mappertool=/home/datasqill/bin/getkey -Dde.softquadrat.datasqill.gui.downloaddir=/home/datasqill/guidownload -Djava.security.egd=file:/dev/urandom -Dserver.port=17491 -Dlogging.file.name=/home/datasqill/logs/datasqill.log -Dlogging.level.de.softquadrat=DEBUG -Dlogging.level.org.springframework.web.servlet.resource.ResourceHttpRequestHandler=DEBUG -Dlogging.level.org.springframework.web.servlet.DispatcherServlet=DEBUG -jar /home/datasqill/lib/datasqill-server.war

Manueller Stop (Crontab)

Bei Verwendung des TomEE als Container setzt man zum Stoppen dieses Kommando ab:

/opt/apache-tomee/bin/shutdown.sh

Ist der SpringBoot Container im Einsatz, erfolgt der Stop mit:

pkill -f /home/datasqill/lib/datasqill-server.war

Um die laufende H2 Datenbank zu stoppen, verwendet man folgenden Befehl;

$ /home/datasqill/h2server/stoph2.sh

Es ist auf die korrekte Reihenfolge zu achten, der datasqill Container muss vor der H2 heruntergefahren werden.

Manueller Start (Crontab)

Um einen manuellen Start der H2 auszuführen, verwendet man:

/home/datasqill/h2server/h2.sh

Wird TomEE als Container eingesetzt, setzt man zum manuellen Start folgendes ab:

/opt/apache-tomee/bin/catalina.sh start 

Bei Einsatz des SpringBoot Containers verwendet man zum manuellen Start:

/home/datasqill/bin/datasqill

Auch hier ist auf die korrekte Reihenfolge zu achten, die H2 muss vor dem datasqill Container gestartet werden.

Kontrolle mit Linux-Systemdiensten

Einrichtung (Systemctl)

Die Einrichtung des Linux-Systemdienstes für die H2 kann mit diesem Skript erfolgen (ggfs ist der Port und der home user anzupassen): Die Ausführung muss als root gemacht werden

#!/bin/bash
H2PORT=9092
H2HOME=/home/datasqill/h2server
if [[ ! -f /etc/systemd/system/h2-$H2PORT.service ]]
then
  echo "  Creating systemd service file for H2"
  cat <<-EOF_SERVICE > /etc/systemd/system/h2-$H2PORT.service
[Unit]
Description=Datasqill H2 Repository $H2PORT
After=network.target

[Service]
ExecStart=$H2HOME/h2ctl.sh --foreground start
ExecStop=$H2HOME/h2ctl.sh --foreground stop
WorkingDirectory=$H2HOME
Restart=always
Type=simple
User=datasqill
Group=datasqill
KillMode=none

StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=h2-9092.service

[Install]
WantedBy=multi-user.target
EOF_SERVICE
  systemctl daemon-reload
else
  echo "  systemd service file for H2 repository already exists, nothing to be done"
fi
if [[ ! -h /etc/systemd/system/multi-user.target.wants/h2-$H2PORT.service ]]
then
  echo "  Install datasqill H2 repository as service"
  systemctl enable h2-$H2PORT.service
  echo "  Starting datasqill H2 repository"
  systemctl start h2-$H2PORT.service
else
  echo "  systemd service for datasqill H2 repository already exists, nothing to be done"
fi
echo "  Display service status"
systemctl status h2-$H2PORT.service

Um den TomEE Container als Linux Service einzurichten, kann folgendes Skript ausgeführt werden:

[Unit]
Description=datasqill TomEE Web Application Container
Wants=network.target
After=network.target

[Service]
Type=forking

Environment=CATALINA_PID=/home/datasqill/datasqill-server/run/tomcat.pid
Environment=CATALINA_HOME=/opt/apache-tomee
Environment=CATALINA_BASE=/home/datasqill/datasqill-server
Environment='CATALINA_OPTS=-Xms512M -Xmx1G -Djava.net.preferIPv4Stack=true'
Environment='JAVA_OPTS=-Djava.awt.headless=true'

ExecStart=/opt/apache-tomee/bin/startup.sh
ExecStop=/opt/apache-tomee/bin/shutdown.sh
WorkingDirectory=/home/datasqill
SuccessExitStatus=143

User=datasqill
Group=datasqill
UMask=0007
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target

Für die Einrichtung des SpringBoot Containers als Linux Service dient dieses Skript (ggfs Port und Home Directotry anpassen): Die Ausführung muss als root gemacht werden

#!/bin/bash

# https://docs.spring.io/spring-boot/docs/current/reference/html/deployment.html
# https://stackoverflow.com/questions/57025605/why-am-i-getting-exec-format-error-when-i-am-writing-my-linux-service

DATASQILLPORT=17491
DATASQILLHOME=/home/datasqill

if [[ ! -f /etc/systemd/system/datasqill-$DATASQILLPORT.service ]]
then
  echo "  Creating systemd service file for datasqill"
  cat <<-EOF_SERVICE > /etc/systemd/system/datasqill-$DATASQILLPORT.service
[Unit]
Description=datasqill $DATASQILLPORT
After=syslog.target

[Service]
ExecStart=$DATASQILLHOME/bin/datasqill --foreground start
WorkingDirectory=$DATASQILLHOME
SuccessExitStatus=143

User=datasqill
Group=datasqill
UMask=0007
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target
EOF_SERVICE
  systemctl daemon-reload
else
  echo "  systemd service file for datasqill already exists, nothing to be done"
fi
if [[ ! -h /etc/systemd/system/multi-user.target.wants/datasqill-$DATASQILLPORT.service ]]
then
  echo "  Install datasqill as service"
  sudo systemctl enable datasqill-$DATASQILLPORT.service
  echo "  Starting datasqill service"
  sudo systemctl start datasqill-$DATASQILLPORT.service
else
  echo "  systemd service for datasqill already exists, nothing to be done"
fi
echo "  Display service status"
systemctl status datasqill-$DATASQILLPORT.service

Status (Systemctl)

Ob die H2-Datenbank läuft, kann mit folgender Anweisung überprüft werden:

$ systemctl status h2-9092
● h2-9092.service - Datasqill H2 Repository 9092
   Loaded: loaded (/etc/systemd/system/h2-9092.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2023-08-11 16:49:56 CEST; 49min ago
 Main PID: 2454 (h2ctl.sh)
   CGroup: /system.slice/h2-9092.service
           ├─2454 /bin/bash /home/datasqill/h2server/h2ctl.sh --foreground start
           └─2461 java -Xmx2G -cp /home/datasqill/h2server/lib/* org.h2.tools.Server -tcp -tcpPort 9092 -tcpAllowOthers -tcpPassword softquadrat -ifExists -baseDir /home/datas...

Falls der TomEE Container verwendet, kann sein Status mit folgendem Befehl überprüft werden:

$ systemctl status tomee
● tomee.service - datasqill TomEE Web Application Container
   Loaded: loaded (/etc/systemd/system/tomee.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2023-07-27 17:06:27 UTC; 36s ago
  Process: 984 ExecStart=/opt/apache-tomee/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 1023 (java)
   CGroup: /system.slice/tomee.service
           └─1023 /usr/bin/java -Djava.util.logging.config.file=/home/datasqill/datasqill-server/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -javaagent:/opt/ap...

Für den SpringBoot Container verwendet man dagegen:

$ systemctl status datasqill-17491
● datasqill-17491.service - datasqill
   Loaded: loaded (/etc/systemd/system/datasqill-17491.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2023-08-11 17:34:29 CEST; 5min ago
 Main PID: 9455 (datasqill)
   CGroup: /system.slice/datasqill-17491.service
           ├─9455 /bin/bash /home/datasqill/bin/datasqill --foreground start
           └─9463 java -Djdbc.drivers=net.snowflake.client.jdbc.SnowflakeDriver:org.apache.hive.jdbc.HiveDriver -Dde.softquadrat.datasqill.mappertool=/home/datasqill/bin/getke...

Manueller Stop (Systemctl)

Bei Verwendung des TomEE als datasqill Container erfolgt ein Stop so:

sudo systemctl stop tomee

Für den SpringBoot Container sieht der Stop-Befehl dagegen so aus:

sudo systemctl stop datasqill-17491

Der Linux Service für die H2 wird mit folgendem Befehl gestoppt werden:

sudo systemctl stop h2-9092

Es ist darauf zu achten, dass der datasqill Container vor der H2 gestoppt wird.

Manueller Start (Systemctl)

Der manuelle Start der Dienste wird mit dem "start" Kommando ausgeführt.

Für die H2 sieht es so aus:

sudo systemctl start h2-9092

Im Falle der Verwendung des TomEE als Container sieht der manuelle Start so aus:

sudo systemctl start tomee

Der SpringBoot Container wird dagegen so gestartet:

sudo systemctl start datasqill-17491

Die H2 Datenbank muss immer vor dem datasqill Container gestartet werden.