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-userlegt 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.1bedeutet, 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.