RIDING BYTES
← Alle Insights

30. Dezember 2024 · 10 min Lesezeit

SENAITE LIMS auf einem frischen Ubuntu 24.04 Server installieren

Eine Serverinstallation von SENAITE 2.x auf Ubuntu 24.04: Python 2.7 mit pyenv, das senaite.starter-Buildout, ein systemd-Dienst, nginx mit TLS und Backups. Mit den Entscheidungen, die vorher fallen sollten, und den Fehlern, die wir am häufigsten sehen.

SENAITE LIMS auf einem frischen Ubuntu 24.04 Server installieren

Für einen ersten Blick ist Docker das richtige Werkzeug. Ein Labor, das seine Daten in SENAITE hält, betreibt es meist als normalen Dienst auf einem Linux-Server, wo Backups, Updates und Netzwerk so laufen, wie die IT-Abteilung alles andere auch betreibt.

Diese Anleitung baut genau das auf Ubuntu 24.04 LTS: eine SENAITE-Instanz unter systemd, nur über nginx mit TLS erreichbar, mit nächtlichen Backups. Unser eigener Produktionsaufbau läuft auf Debian und ergänzt einen ZEO-Cluster, einen Load Balancer und Monitoring. Diesen Aufbau liefern wir als SENAITE Enterprise VM aus. Was folgt, ist der Teil, den jeder SENAITE-Server braucht.

Vor der Installation entscheiden

Einige Fragen lassen sich jetzt billiger beantworten als nach dem Go-live.

  • Python 2.7. SENAITE 2.x läuft auf Python 2.7, nicht auf dem Python 3, das Ubuntu mitbringt. Sie bauen 2.7 für das SENAITE-Konto mit pyenv, getrennt vom System-Python. Verbietet Ihre IT-Richtlinie einen nicht mehr gepflegten Interpreter auf einem Server, führen Sie dieses Gespräch zuerst.
  • Ein Prozess oder mehrere. Eine einzelne Instanz bedient ein kleines Labor gut. Warten regelmäßig mehrere Personen auf Berichte oder große Arbeitsblätter, brauchen Sie einen ZEO-Server mit mehreren Clients, einen pro CPU-Kern. Diese Anleitung richtet eine einzelne Instanz ein; die Ablage der Daten lässt sich übernehmen.
  • Hostname und Zertifikat. Die meisten LIMS-Server stehen in einem internen Netz. Dann kommt das Zertifikat von der Zertifizierungsstelle Ihrer Organisation. Let’s Encrypt funktioniert nur, wenn der Server aus dem Internet erreichbar ist.
  • Zeitzone. Sie steckt in jedem Zeitstempel, den SENAITE speichert. Stellen Sie sie vor allem anderen ein.
  • Wohin die Backups gehen. Ein Backup auf derselben Platte schützt vor einem Fehler, nicht vor dem Verlust der Maschine. Legen Sie jetzt fest, welche andere Maschine die Kopien abholt.

Das Grundsystem

sudo timedatectl set-timezone Europe/Berlin
sudo apt update && sudo apt upgrade -y
sudo adduser --disabled-password --gecos "" senaite

Dem Konto senaite gehören Code und Daten, und es führt die Instanz aus. Nichts in dieser Anleitung startet SENAITE als root. Buildout verweigert den Lauf als root ohnehin, und das zu Recht: Ein Buildout-Lauf lädt Code herunter und führt ihn aus.

Systembibliotheken

SENAITE erzeugt PDFs, verarbeitet XML und Bilder über C-Bibliotheken, und der Bau von Python 2.7 braucht einige weitere. Installieren Sie beide Gruppen und dazu die Schriften, die der PDF-Renderer verwendet:

sudo apt install -y git build-essential curl \
  libxml2 libxml2-dev libxslt1.1 libxslt1-dev \
  libcairo2 libpango-1.0-0 libpangocairo-1.0-0 \
  libgdk-pixbuf2.0-0 zlib1g zlib1g-dev libjpeg-dev \
  libbz2-dev libssl-dev libsqlite3-dev libffi-dev uuid-dev \
  libnss3-dev libgdbm-dev libgdbm-compat-dev libncursesw5-dev \
  liblzma-dev libreadline-dev \
  fonts-dejavu fonts-liberation

Ein Bericht, der auf dem Laptop stimmt und auf dem Server Kästchen statt Buchstaben zeigt, ist jedes Mal eine fehlende Schrift.

Python 2.7 mit pyenv

Als Benutzer senaite:

sudo -iu senaite
curl https://pyenv.run | bash

Legen Sie die pyenv-Einrichtung in eine eigene Datei und binden Sie sie in die Login-Shell ein:

cat > ~/.pyenv_profile <<'EOF'
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
EOF
echo '. ~/.pyenv_profile' >> ~/.bashrc
. ~/.pyenv_profile

Dann bauen Sie den Interpreter und eine virtuelle Umgebung für SENAITE:

pyenv install 2.7.18
pyenv virtualenv 2.7.18 python2.7-senaite
pyenv activate python2.7-senaite
python -V        # Python 2.7.18

pyenv install kompiliert Python aus dem Quellcode. Bricht es mit einer Meldung über ein fehlendes Modul ab, fehlt ein -dev-Paket aus der Liste oben. Installieren Sie es und starten Sie den Befehl neu.

Benennen Sie die Umgebung wie gezeigt, mit der Version vor senaite. Ein Name, der mit python- beginnt, kollidiert mit der Art, wie pyenv ab Version 2.8 Namen auflöst.

Das Buildout

SENAITE wird mit zc.buildout zusammengesetzt. Der öffentliche Ausgangspunkt ist senaite.starter. Seine buildout.cfg pinnt ein veröffentlichtes SENAITE (zum Zeitpunkt dieses Artikels 2.6.0) zusammen mit den passenden Kernpaketen.

git clone https://github.com/senaite/senaite.starter.git ~/senaitelims
cd ~/senaitelims
pip install -r requirements.txt

Bauen Sie die buildout.cfg nicht unverändert. Sie enthält zwei Voreinstellungen, die auf einem Laptop passen und auf einem Server falsch sind: Die Instanz lauscht auf allen Netzwerkschnittstellen (0.0.0.0:8080), und der Admin-Zugang ist admin:admin. Legen Sie Ihre Änderungen in eine eigene Datei, damit ein Update des Starters sie nicht überschreibt:

# ~/senaitelims/production.cfg
[buildout]
extends = buildout.cfg
parts += backup
senaite-user = admin:ein-langes-zufaelliges-passwort

[instance]
http-address = 127.0.0.1:8080

[backup]
recipe = collective.recipe.backup

[versions]
collective.recipe.backup = 4.2.0
  • senaite-user legt das erste Admin-Konto an. Setzen Sie es vor dem ersten Start. Eine spätere Änderung in der Datei ändert ein bestehendes Konto nicht zuverlässig; ändern Sie das Passwort dann im Benutzerordner der Instanzwurzel.
  • 127.0.0.1 bedeutet, dass nur Prozesse auf dieser Maschine die Instanz erreichen. nginx wird das Einzige sein, das im Netz lauscht.
  • Das Backup-Rezept ist gepinnt, weil seine neueren Versionen Python 3 voraussetzen. Ohne Pin nimmt Buildout die neueste und scheitert.

Bauen:

buildout -c production.cfg

Der erste Lauf lädt alle Pakete herunter und dauert eine Weile. Starten Sie die Instanz danach einmal im Vordergrund:

bin/instance fg

Endet das Log mit Ready to handle requests, beenden Sie sie mit Ctrl+C. Scheitert sie vorher, lesen Sie den ersten Traceback. Die übliche Ursache ist eine fehlende Systembibliothek.

Ein systemd-Dienst

# /etc/systemd/system/senaite.service
[Unit]
Description=SENAITE LIMS
After=network.target

[Service]
Type=simple
User=senaite
Group=senaite
WorkingDirectory=/home/senaite/senaitelims
ExecStart=/home/senaite/senaitelims/bin/instance console
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now senaite
sudo systemctl status senaite

Zwei Details sind hier wichtig. Der Dienst verwendet console, nicht fg. Beide halten den Prozess im Vordergrund, was systemd erwartet, aber fg schaltet zusätzlich den Debug-Modus ein, den Sie in Produktion nicht wollen. Und der Dienst braucht das pyenv-Profil nicht: Die Skripte, die Buildout nach bin/ schreibt, enthalten den vollen Pfad des Interpreters, mit dem sie gebaut wurden.

nginx davor

sudo apt install -y nginx
# /etc/nginx/sites-available/senaite
server {
    listen 80;
    server_name lims.example.org;

    client_max_body_size 64m;

    location / {
        proxy_pass http://127.0.0.1:8080/VirtualHostBase/https/lims.example.org:443/senaite/VirtualHostRoot/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_read_timeout 300s;
    }
}

Der Pfad VirtualHostBase ... VirtualHostRoot teilt der Instanz mit, welches Protokoll, welchen Hostnamen und welchen Port der Benutzer sieht und welche Site in der Datenbank ausgeliefert wird. Jeder Link, den SENAITE erzeugt, zeigt dann auf https://lims.example.org/... statt auf 127.0.0.1:8080/senaite. Das senaite in der Mitte ist der Path identifier, den Sie der Site beim Anlegen geben.

Die beiden anderen Zeilen verhindern die zwei Beschwerden, die wir nach einem Go-live am häufigsten hören. nginx weist Uploads über 1 MB standardmäßig ab, ein eingescanntes Dokument oder eine Gerätedatei scheitert dann ohne brauchbare Meldung. Und das Veröffentlichen eines Stapels Berichte kann länger dauern als die 60 Sekunden, die nginx standardmäßig wartet. Für den Benutzer sieht das aus wie ein verlorener Bericht.

Site aktivieren und TLS ergänzen:

sudo ln -s /etc/nginx/sites-available/senaite /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

Ist der Server aus dem Internet erreichbar, holt und erneuert certbot ein Let’s-Encrypt-Zertifikat und ergänzt den listen 443-Block:

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d lims.example.org

In einem internen Netz ergänzen Sie stattdessen einen Block listen 443 ssl mit dem Zertifikat Ihrer eigenen Zertifizierungsstelle. Lassen Sie Ihre Benutzer nicht mit einem selbstsignierten Zertifikat arbeiten: Wer gelernt hat, Browserwarnungen wegzuklicken, kann eine Fehlkonfiguration nicht mehr von einem Abhörversuch unterscheiden.

Die Site anlegen

Öffnen Sie die Instanzwurzel über einen SSH-Tunnel, damit sie nie nach außen freigegeben werden muss:

ssh -L 8080:127.0.0.1:8080 sie@lims.example.org

Gehen Sie dann auf http://localhost:8080, klicken Sie auf Create a new SENAITE site, melden Sie sich mit dem Admin-Konto aus production.cfg an und verwenden Sie senaite als Path identifier. Danach ist die Site unter https://lims.example.org erreichbar.

Backups

Der Backup-Teil hat bin/backup und bin/restore erzeugt. Der erste Lauf schreibt eine vollständige Kopie von Datenbank und Anhängen, spätere Läufe schreiben Inkremente, und standardmäßig bleiben zwei Vollbackups erhalten. Die Kopie ist auch bei laufender Instanz konsistent.

# crontab -e, als senaite
30 2 * * * cd /home/senaite/senaitelims && bin/backup

Die Backups landen in var/backups und var/blobstoragebackups. Datenbank und Anhänge gehören zusammen: Eine Wiederherstellung, die Generationen mischt, liefert Proben mit fehlenden oder falschen Anhängen.

Dann tun Sie die zwei Dinge, die ein Backup erst wertvoll machen:

  • Kopieren Sie var/ auf eine andere Maschine, und zwar von dort abgeholt, damit ein kompromittierter oder defekter Server die Kopien nicht mitnehmen kann.
  • Stellen Sie es einmal auf einer zweiten Maschine wieder her und öffnen Sie eine Probe mit Anhang. Vor dem Go-live und danach einmal im Jahr.

Packen

Die Datenbank von SENAITE überschreibt nie. Jede Änderung hängt eine neue Revision an. Das macht die Historie eines Datensatzes möglich und lässt die Datei wachsen. Packen entfernt Revisionen, die älter als eine gegebene Anzahl Tage sind. Bei einer einzelnen Instanz packen Sie in der Verwaltungsoberfläche der Instanzwurzel unter /Control_Panel/Database/main/manage_main (über den SSH-Tunnel von oben). In einem ZEO-Aufbau erledigt das bin/zeopack per Cron.

Packen Sie nach einem Backup und nie, weil die Platte voll ist: Ein Pack braucht während des Laufs Platz für eine zweite Kopie der Datei. Und ein Pack lässt sich nicht rückgängig machen. Die entfernten Revisionen sind weg, das Audit-Log, das SENAITE als Inhalt führt, bleibt.

Was diesem Aufbau noch fehlt

  • Monitoring. Ob Backup und Pack der letzten Nacht gelaufen sind, ob die Datenbank konsistent ist, ob die Antwortzeiten steigen. Siehe Warum Ihr SENAITE LIMS proaktives Monitoring braucht.
  • Updates. Ubuntu-Sicherheitsupdates nach Plan und SENAITE-Updates mit einem Test auf einer Kopie vorab. Eine neue SENAITE-Version bringt oft Upgrade-Schritte mit, die nach dem Build laufen müssen, bevor wieder jemand auf der Site arbeitet.
  • Mehrere Prozesse. Ein ZEO-Server mit mehreren Clients und ein Load Balancer, sobald ein Prozess nicht mehr reicht.
  • Ihre Konfiguration. Probentypen, Analyseleistungen, Spezifikationen, das Berichtslayout. Hier liegt der größte Teil der Arbeit einer Einführung.

Diese Arbeit erledigen wir im Rahmen von SENAITE Care und im 3-Tage-Workshop. War der Server der leichte Teil und sieht der Rest nach einem Projekt aus, sprechen Sie uns an.

Zwei Personen prüfen Notizen auf Papier neben einem Laptop

Bringen Sie das in Ihr Labor

Ob Sie SENAITE evaluieren, über mehrere Standorte skalieren oder Geräte und Monitoring anbinden — das Team, das die Plattform geschrieben hat, ist das Team, mit dem Sie sprechen.