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.
- SQLite - one file, no database server to administer. For a single host with moderate volume. The package goes all the way: database created, schema applied, services started.
- MariaDB - version 10.6 or newer. For deployments that scale or span several hosts. The package enables nothing until you have provided the database and its accounts.
Both server packages install the same executable, so they are mutually exclusive.
Prerequisites
- A Debian 13 or Ubuntu 24.04 server.
- A TLS reverse proxy in front of the console (nginx or Apache), served on the same origin as the API.
- For the full profile: a Postfix server routing the list domain to difuzio's LMTP socket. For the external-mailbox profile: a mailbox and its credentials are enough.
- DNS records for the list domain: SPF, DKIM and DMARC.
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
- Operator manual - full configuration, deployment profiles, backups, monitoring, upgrades (in French).
- Subscriber guide - what subscribed people see and do (in French).
- Questions?