Docker is the right answer for evaluation. For production, most labs run SENAITE directly on a Linux server. The reasons are backup procedures, predictable performance, easy integration with instrument interfaces on the same network, and the operational familiarity of a normal Linux service.
This guide walks through a fresh Ubuntu 24.04 LTS server and ends with a SENAITE process under systemd, fronted by nginx, with the ZODB sitting on a disk you can snapshot. It is not the only correct way to install SENAITE. It is the way we deploy it.
What you need
- A server with Ubuntu 24.04 LTS, 4 GB RAM minimum, 8 GB recommended.
- Root SSH access.
- A DNS name pointing at the server if you want HTTPS (you do).
- 30 to 45 minutes.
Update the base system
sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential git curl
Install Python and the build dependencies
SENAITE 2.x runs on Python 3.10+. Ubuntu 24.04 ships Python 3.12, which works.
sudo apt install -y \
python3 python3-venv python3-dev \
libxml2-dev libxslt1-dev libjpeg-dev zlib1g-dev \
libssl-dev libffi-dev \
libopenjp2-7-dev libtiff-dev libfreetype6-dev \
libpq-dev
The image libraries are needed for PDF report generation. The PostgreSQL client header is optional but harmless.
Create a dedicated system user
Running anything as root that does not need to be is bad practice.
sudo adduser --system --group --home /opt/senaite senaite
sudo -u senaite -H mkdir -p /opt/senaite/instance
Clone and bootstrap the buildout
SENAITE deploys via zc.buildout. The canonical entry point is
the senaite/senaite.docker repo, which ships the same buildout
configuration the Docker image uses.
sudo -u senaite -H bash -c '
cd /opt/senaite/instance
git clone https://github.com/senaite/senaite.docker.git .
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip setuptools wheel
pip install -r requirements.txt
buildout
'
The buildout step pulls SENAITE and its dependencies, compiles
extensions, and produces a bin/instance executable. On a fresh
server this takes ten to twenty minutes the first time. Coffee
break.
Create the Plone admin user
sudo -u senaite -H /opt/senaite/instance/bin/instance \
adduser admin <a-strong-password>
This writes an admin entry into /opt/senaite/instance/var/inituser
which Plone reads on first start. Pick a strong password and store
it in the password manager you will actually find it in later.
Run it once in the foreground
sudo -u senaite -H /opt/senaite/instance/bin/instance fg
You will see Zope and Plone startup logging end in something like
INFO Zope Ready to handle requests. Hit Ctrl+C to stop.
If you saw an error before that, the most common cause is a missing system library from the apt step above. Read the trace, install the lib, run again.
Put it under systemd
Create /etc/systemd/system/senaite.service:
[Unit]
Description=SENAITE LIMS Zope instance
After=network.target
[Service]
Type=simple
User=senaite
Group=senaite
WorkingDirectory=/opt/senaite/instance
ExecStart=/opt/senaite/instance/bin/instance fg
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
Reload, enable, start, and check:
sudo systemctl daemon-reload
sudo systemctl enable senaite
sudo systemctl start senaite
sudo systemctl status senaite
status should show active (running) and SENAITE listening on
port 8080.
Front it with nginx and HTTPS
Install nginx and certbot:
sudo apt install -y nginx certbot python3-certbot-nginx
Drop /etc/nginx/sites-available/senaite:
server {
server_name senaite.your-lab.example;
location / {
proxy_pass http://127.0.0.1:8080/VirtualHostBase/https/$host: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;
client_max_body_size 50M;
}
listen 80;
}
The VirtualHostBase/.../VirtualHostRoot block is Zope’s virtual
hosting trick: it rewrites generated URLs so visitors see clean
paths without /senaite/ in them.
Enable and get a certificate:
sudo ln -s /etc/nginx/sites-available/senaite \
/etc/nginx/sites-enabled/senaite
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d senaite.your-lab.example
Certbot reads the nginx config, requests a Let’s Encrypt certificate, and rewrites the server block to listen on 443 with HSTS.
First login
Open https://senaite.your-lab.example and log in as the admin
user you created above. Navigate to the SENAITE site at
/senaite. From here you can install the demo profile (see
Provision SENAITE with demo data),
or start configuring real clients, sample types, and analysis
services.
What comes next
A running SENAITE under systemd behind nginx is the beginning. For production you still need:
- Backups. ZODB packs and offsite snapshots. SENAITE Care Essential covers this from EUR 300 per month.
- Monitoring. Database consistency, response times, scheduled task execution. See Why your SENAITE LIMS needs proactive monitoring.
- Security updates. OS and SENAITE itself.
- Instrument integration. Your analysers, your protocols.
- Configuration of the actual workflow.
We do all of this as our day job under SENAITE Care and custom development. If installing the server was the easy part and the rest looks like work, talk to us.