Install an engine, in the version you choose
Install PostgreSQL, MySQL, MariaDB, Redis, Valkey or MongoDB on the host, and create a database on the engine and version you choose.
Part of Databases.
Installing an engine
noust db catalog # what this server can install, and why not
noust db install postgresql --version 17 # from the PostgreSQL project's repository
noust db install mariadb --version 11.4
noust db install mysql --version 8.4 # Oracle's long-term series, on Debian too
noust db install valkeyUpstream repositories are added with their signing keys pinned by fingerprint. MySQL and MariaDB, and Redis and Valkey, are never installed beside each other.
Rocky Linux, AlmaLinux, Red Hat Enterprise Linux and openSUSE Leap. Noust installs an engine on the
host with dnf on the RHEL family, major 9 (Rocky Linux, AlmaLinux, Red Hat Enterprise Linux, CentOS
Stream and Oracle Linux, which are rebuilds of the same sources), and with zypper on openSUSE Leap 16.0
and 15.6. The tables were read from the real repositories and every cell was installed, used and removed
in a container of that release (tests/integration/engines_run.py, scenarios rpm_el9, rpm_leap16 and
rpm_leap156):
| Engine | RHEL family 9 | openSUSE Leap 16.0 / 15.6 |
|---|---|---|
| PostgreSQL | 13 (the plain package), 15, 16, 18 (AppStream module streams), 14 and 17 (PGDG) | 14 to 18, from the distribution |
| MariaDB | 10.5 (plain), 10.11, 11.8 (module streams), 11.4 (MariaDB's repository) | 11.8 / 10.11 |
| MySQL | 8.0 (plain), 8.4 (module stream) | not in any Leap repository: an instance |
| Redis | 6.2 (plain), 7.2 (module stream) | needs a configuration file first: an instance |
| Valkey | 8.0 | an instance |
| MongoDB | 7.0, 8.0 (MongoDB's repository) | not in any Leap repository: an instance |
A repository Noust adds (PGDG, MariaDB, MongoDB) is a .repo file of its own (noust-<name>.repo, with
the "Generated by Noust" mark) whose key is the file Noust verified: it downloads the key, compares its
fingerprint with the one pinned in the source and only then writes it where dnf or zypper trusts it,
exactly as for apt. A repository the package manager then cannot read is taken back out. noust db uninstall removes the packages that are exactly the engine's (never a pattern) and the repository Noust
added for it.
A release, an engine or a version that is not in the tables is refused before anything is touched, and the
refusal names the two ways that do work: an instance, an engine in a container that needs no package
manager and runs the same on any host with Docker (noust db instance create NAME --engine postgresql), or
the distribution's own tool (dnf install postgresql-server, zypper install mariadb), after which Noust
manages the engine it finds: users, databases, dumps and restores. Fedora, the next RHEL major and
Tumbleweed are not in the tables yet. On the RHEL family and openSUSE an engine's settings and resource
limits assume the Debian layout and say so when they do not find it.
MySQL comes from the distribution where the release ships it (Ubuntu) and from Oracle's own APT
repository (repo.mysql.com) where it does not (Debian) or when a long-term series the release does
not ship is asked for: 8.4 and 9.7 on Debian 12 and 13 and on Ubuntu 22.04, 24.04 and 26.04.
Oracle publishes for amd64 only, so on an arm64 server Noust says so and points at an instance
(noust db instance create NAME --engine mysql), whose official image is built for both
processors. 8.0 is not offered from Oracle: it reached the end of its support in April 2026.
A database on the engine and version you choose
noust db choices # what a database can be created on, and how
noust db provision shop.example.com -e postgresql --version 17 --install
noust db provision shop.example.com -e postgresql --version 16 # on an instance that runs 16
noust db provision shop.example.com -e postgresql --instance pg16
noust create -d shop.example.com -s github:me/shop --database postgresql:shop --database-version 17
noust create -d shop.example.com -s github:me/shop --database postgresql:shop --database-instance pg16--version is numbers and dots (17, 11.4) and matches by components: 17 is any 17.x, and
11 is not 10.11. Without it nothing changes: the database is created on the engine that is
installed. The host's engine is the primary one, so:
- the version that runs is used;
- another version than the one that runs is answered by the instance that runs it, by itself when
exactly one does, and by name with
--instance(instancein the API) when several do or you want to say which. With none, it is refused with what runs (PostgreSQL 17 was asked for, but this server runs PostgreSQL 16.4) and the command that makes an instance of it, before anything is created. An instance is never made as a side effect; - MariaDB is not MySQL and Valkey is not Redis: asking for the one that is not installed on the host is answered by an instance of it, or refused the same way;
- an engine that is not installed is installed first only with
--install(install: truein the API, which needsdatabases.manageand sudo mode, the install's own), from the catalog (noust db catalog), pinned keys and all; without it the refusal namesnoust db install. A version the release cannot have lists the ones it can.
The API: GET /api/databases/provisioning/choices lists each flavour with the version that runs and
each version as installed, installable or unavailable; GET /api/databases/provisioning/plan?domain=...&engine=...&version=17 says what would be written and
whether the engine would be installed (will_install); POST /api/apps/{domain}/databases takes
version and install, and POST /api/apps takes database.version, checked when the request
arrives.