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 reacheddns 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