Skip to main content

Install on Debian / Ubuntu (no Docker)

Install Drumee directly on the host as native .deb packages via apt. No Docker involved — the packages configure the machine itself (reverse proxy, database, process manager, TLS).

Use a dedicated host

The native install reconfigures the whole machine (nginx, MariaDB, and optionally BIND/Postfix/Prosody). Run it on a fresh, dedicated Debian 13 or Ubuntu server/VM — not your laptop or a box already running other services.

Requirements​

  • A fresh Debian 13 (trixie) or recent Ubuntu host — a VPS or VM.
  • Root / sudo.
  • A domain pointed at the host if you want a public certificate. Not required: the installer detects whether the host has a public address and offers a LAN-only or localhost install instead (see How the installer asks).

Everything else (Node.js 22, MariaDB, nginx, Redis, pm2) is pulled in automatically.

Install​

curl -fsSL https://apt.drumee.net/debian.sh | sudo bash

This bootstrap:

  1. adds the signed Drumee APT repository,
  2. installs Node.js 22 from NodeSource — required, not merely preferred: Trixie ships Node 20, and drumee-node-runtime (which supplies pm2) declares nodejs (>= 22), so apt install drumee cannot resolve on Debian's own packages,
  3. installs BIND9 ahead of Drumee, then runs apt install drumee — the drumee metapackage pulls the components in the correct order (infra → schemas → static → server → ui),
  4. each component's post-install configures the host: renders the reverse-proxy + TLS, restores the MariaDB schema, stocks the entity pool, creates your admin account, and launches the app under pm2,
  5. → Drumee is serving at your domain.

How the installer asks​

The installer asks for every setting itself, reading the keyboard directly, and preseeds the answers for the packages. It has to: on the curl … | sudo bash path above, the script is standard input, so the packages' own prompts would never see a terminal and would silently take every default.

Before asking anything it looks at the host's addresses and picks one of three shapes:

DetectedShapeDomainCertificate
a public addresswanyours, e.g. example.comreal wildcard, via a DNS-01 challenge
only private addresseslandrumee.lanself-signed, with BIND9 serving the zone on your LAN
no routable addresslocalhostlocalhostself-signed

On the lan shape it also asks how the instance should be reached — dns for LAN-only, or wireguard to be reachable from outside without opening a router port, which then makes a real certificate possible over DNS-01. The two are mutually exclusive.

Every prompt offers a default; pressing Enter accepts it.

Unattended install​

Either preseed everything from a config file:

# produce a debconf preseed from your config
node config/render.mjs debconf --config drumee.yaml > install.conf

sudo PRESEED=install.conf bash debian.sh

…or answer with environment variables and disable prompting:

sudo DRUMEE_NONINTERACTIVE=1 \
DRUMEE_DOMAIN=example.com \
DRUMEE_ADMIN_EMAIL=admin@example.com \
DRUMEE_TLS_METHOD=acme-dns-api \
bash debian.sh

DRUMEE_NONINTERACTIVE unset or 0 means prompt; any other value means never prompt. Setting any individual variable answers that one question and skips its prompt, so a partly-scripted install just needs the answers you already know. The full list is in the script's header comment.

What gets installed​

PackageProvides
drumee-infraReverse proxy, TLS, host config, the pm2 launcher
drumee-schemasMariaDB schema + seed + the populate step (accounts, pool, keys)
drumee-server-podBackend (REST + page/WebSocket), runs under pm2
drumee-ui-podFrontend assets
drumee-staticStatic assets, fonts, locales
drumee-node-runtimepm2 and the pinned global Node modules — Debian packages no pm2. Pulls in nodejs (>= 22)

Installed paths follow the standard layout: config in /etc/drumee/, runtime in /srv/drumee/, data in your chosen data directory.

Manage it​

The native install ships a systemd unit plus the drumee CLI:

sudo systemctl status drumee-server-pod      # unit status
sudo drumee list # pm2 process list
sudo drumee restart # restart the app
sudo drumee log main # tail logs for one process
/etc/init.d/drumee is gone as of drumee-server-pod 2.9.96

The CLI now lives only at /usr/sbin/drumee (already on PATH, hence plain drumee above). It used to be installed at /etc/init.d/drumee as well, and because nothing declared a systemd unit of that name, systemd generated a second one from it that fought drumee-server-pod.service over the same pm2 daemon — costing a five-minute stop job on every shutdown. Upgrading removes the old copies for you.

Database and config live on the host (/etc/drumee/, your data dir, MariaDB).

Upgrade​

sudo apt update && sudo apt upgrade

New package versions bring their schema patches; the post-install applies them.

Add the repository by hand​

If you'd rather not pipe the bootstrap into a shell, the repository is served over both https and http (apt verifies its GPG signature either way):

sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://apt.drumee.net/drumee-archive-keyring.gpg \
| sudo tee /etc/apt/keyrings/drumee-archive-keyring.gpg >/dev/null
sudo tee /etc/apt/sources.list.d/drumee.sources >/dev/null <<'SOURCES'
Types: deb
URIs: https://apt.drumee.net
Suites: trixie
Components: main
Signed-By: /etc/apt/keyrings/drumee-archive-keyring.gpg
SOURCES

# Node 22 from NodeSource — Trixie's own Node is 20, which cannot satisfy
# drumee-node-runtime's `nodejs (>= 22)`
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo bash -

sudo apt update && sudo apt install drumee

Suites is the release channel: trixie is stable, with trixie-beta and trixie-edge for pre-release trains. Architectures is deliberately left out so apt uses your machine's own — the repository publishes both amd64 and arm64.

Upgrading from an older install

Installs made before release 1.0.23 use a flat repository stanza in /etc/apt/sources.list.d/drumee.list. That repository is frozen — it keeps working but receives no new releases. Re-running the installer replaces the old stanza with the one above; nothing else is needed.

Manual install (from local packages)​

If you already have the .debs (e.g. on an air-gapped host), copy them over and:

# Node 22 first, for the reason above
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo bash -
sudo apt-get install -y nodejs

# install the packages (apt resolves MariaDB / nginx / etc.)
sudo apt-get install -y --no-install-recommends \
-o Dpkg::Options::=--force-confold \
-o Dpkg::Options::=--force-confdef ./drumee-*.deb

Both --force-conf* options matter: drumee-infra renders MariaDB's 50-server.cnf / 50-client.cnf, so when mariadb-client is configured afterwards dpkg finds files "created by you or by a script" and stops to ask. Unanswered, that prompt fails the whole transaction and takes MariaDB, drumee-schemas and every mariadb plugin with it. These options keep the Drumee-rendered versions and never prompt.

Where to next​