Installation

difuzio installs from Debian packages, on Debian 13 or Ubuntu 24.04. This page is the shortest path to a running service. The operator manual covers every step in detail, including installing without packages.

Choosing a backend

The engine compiles against one backend or the other, and the choice is made once and for all: a database is not convertible from one to the other.

Both server packages install the same executable, so they are mutually exclusive.

Prerequisites

Getting the packages

The shortest way is the signed package repository, so that updates then follow apt upgrade. The Download page gives the few lines that declare the repository and its key.

Packages can also be built from the public repository. The build needs network access and a Go toolchain of 1.23 or newer.

git clone https://inligit.fr/cap-rel/difuzio.git
cd difuzio
make deb

Three packages land in dist/: difuzio-mariadb, difuzio-sqlite and difuzio-webui, the administration console.

Installing

With SQLite, a single command brings the service up:

apt install difuzio-sqlite difuzio-webui

From locally built files, these are the very same packages:

apt install ./difuzio-sqlite_<version>_amd64.deb
apt install ./difuzio-webui_<version>_all.deb

Installation creates the system account, the directories, the signing keys - generated once and never regenerated - the database and its schema, then starts the services.

With MariaDB, first create the database and its two accounts - an application account with no schema privileges, and a migration account - fill in the connection string in /etc/difuzio/config.yaml, then:

apt install ./difuzio-mariadb_<version>_amd64.deb
apt install ./difuzio-webui_<version>_all.deb
systemctl enable --now difuzio-web.service difuzio-lmtp.service \
    difuzio-worker@1.service difuzio.target

First administrator, first domain

No package creates an administrator: that is an operator's decision.

export CREDENTIALS_DIRECTORY=/etc/difuzio/secrets

difuzio bootstrap-admin --config /etc/difuzio/config.yaml \
    --email you@example.org --password-stdin

difuzio add-domain --config /etc/difuzio/config.yaml \
    --name lists.example.org --base-url https://lists.example.org

difuzio create-list --config /etc/difuzio/config.yaml \
    --domain lists.example.org --name announce \
    --owner you@example.org --type newsletter

The password is read from standard input, so it never reaches your shell history. As long as no administrator exists, the console's /setup page can create one too; the moment there is one, that page disappears.

Connecting the mail server

difuzio mta-config --domain lists.example.org

The command prints the lines to copy into the Postfix configuration. The whole domain - posts, bounce addresses, complaints - is routed to the LMTP socket. Then check the DNS zone:

difuzio check-dns --domain lists.example.org

Verifying

difuzio doctor --config /etc/difuzio/config.yaml

doctor prints the installed version, the linked backend, database reachability and the schema state. The console, for its part, reports a mismatched deployment when the server and the interface are not on the same revision.

Next