Einführung
Zunächst die Basics. Wir haben 2 Server
- Teefax, unser Hauptserver
- Verleihnix, unser Testserver (wo wir leider zu wenig testen)
Auf beiden diesen Server läuft NixOS. Teenix ist die Konfiguration die diese NixOS Systeme beschreibt.
Übersicht
- Teenix ist (offensichtlich) deklarativ. Wir möchten imperativen Zustand möglichst vermeiden.
- Teenix setzt nicht auf docker, sondern auf NixOS Container. Diese können vollständig aus nix heraus konfiguriert werden und verhalten sich effektiv wie eine NixOS Maschine. Einige Services laufen trotzdem noch in docker, das wollen wir aber langfristig komplett abschaffen.
- Teenix ist “impernanent”. Das heißt, das standardmässig alle Dateien bei einem Reboot gelöscht werden. Es ist jedoch möglich Dateien/Ordner als “persistent” zu markieren, diese liegen dann unter
/persist
. Der Vorteil davon ist das das Dateisystem standardmässig aufgeräumt bleibt und sich nicht Müll über Ratsgenerationen ansammelt, von dem niemand weiß ob er noch gebraucht wird.
Dateistruktur
Keine vollständige Auflistung, dient nur der groben Übersicht
├─ doc - ein mdbook, die dokumentation die du gerade liest
├─ lib - erweiterung der nixpkgs lib, verfügbar unter lib.teenix
├┬ mod - das herz von teenix, hier liegen module die zwischen den verschiedenen hosts
││ unterschiedlich konfiguriert werden können.
│└── services - die module für all unsere services
├┬ nixos - konfigurationen der einzelnen hosts
│└─┬ keys -
│ ├ secrets - sops secrets
│ ├ teefax - die konfiguration von teefax
│ ├ verleihnix - die konfiguration von testfax
│ └ share - geteilte konfiguration, sollte in jedem host unbedingt importiert werden
├─ pkgs - eigene packages
├─ flake.nix - der "einstieg" in die konfiguration
├─ overlays.nix - nixpkgs overlays
└─ .sops.yaml - konfigurationsdatei für sops, nur wer hier eingetragen ist kann die secrets lesen
Container und Services
Hier eine kurze Einführung in Container und Systemd Services.
Systemd Services
Eine systemd Instanz verwaltet (unter anderem) mehrere Services. Diese bestehen aus einem einzelnen
Prozess, einer einzelnen Komponente.
Der Webserver unserer Fachschaftswebsite ist ein Service, die dazugehörige Datenbank ein weiterer.
Die Services sind nicht sonderlich isoliert voneinander, sie reden z.B. mit dem selben Netzwerk
Interface und teilen sich ein Dateisystem.
Container
Container hingegen sind stärker voneinander isoliert, sie sind quasi ein eigenes System. Sie haben ein eigenes Dateisystem und ein eigens Netzwerk Interface. Unter anderem haben sie auch eine eigene Systemd Instanz.
Sie fassen quasi Komponenten zusammen. Um wieder die Fachschaftswebsite als Beispiel zu nehmen:
Es gibt einen Container fscshhude
der diese als ganzes repräsentiert. Innerhalb dessen läuft der
Webserver und die Datenbank, von außen gesehen interessiert uns das aber nicht. Wir können es von
außen auch nicht (ohne weiteres) feststellen, den das “äußere” systemd weiß nicht was das “innere”
systemd tut.
Netzwerk
Jedem Container wird automatisch eine eigene IP zugeordnet, außerhalb ist diese 192.18.<id>.11
und innerhalb 192.168.<id>.10
.
Dateisystem
Unsere Container sind “ephemeral”, das heißt das das Dateisystem nicht über Container Neustarts
persistent ist. Natürlich brauchen sie trotzdem persistente Daten, wir möchten aber entscheiden
können welche das sind. Auf dem Host hat jeder Container seinen eigenen Ordner unter /persist
wo
diese Daten liegen. Damit diese im Container zu sehen sind werden sie in den Container gemountet,
z.B. /persist/vaultwarden/data
nach /var/lib/vaultwarden
Updating
Es gibt 2 Größenordnungen von Updates:
- Update eines spezifischen Inputs (z.B. nur die Fachschafts Website)
- meist trivial (außer bei
nixpkgs
aus offensichtlichen Gründen) - kann meistens mal kurz nebenbei geschehen
- meist trivial (außer bei
- Update aller Inputs
- hier gehen meistens Dinge kaputt
- man sollte Zeit zum troubleshooten mitbringen
Update eines einzelnen Inputs
Die Namen der Inputs stehen entweder in der flake.nix
oder einfach per <TAB>
completion.
nix flake update <input>
und dann deployen.
Update aller Inputs
nix flake update
und dann deployen.
Nach einem Update
Gucken ob alles noch funktioniert.
- Auf status.phynix-hhu.de. Ist manchmal etwas hinterher, also direkt nach einem Update vielleicht nicht zuverlässig
- Im Grafana Dashboard unter traefik gibt es eine live Aufschlüsselung
- Nextcloud?
- funktioniert Nexcloud Office noch? Gibt es hier ein Preview?
- Nawi Website? Die Healthchecken wir nicht
- Matrix
- Federation Tester
- Einfach mal nen Client öffnen und irgendwie “test” in Server Admin interna schreiben
Troubleshooting
Too many open Files
In die Ecke setzen und weinen. Dann Arthur schreiben, dey kommt dazu und weint mit.
Command Cheatsheet
Services
Der Service Name ist meistens am besten per <TAB>
herauszufinden. (Außer bei journalctl, dessen completion ist etwas kaputt)
Liste aller Services
Mit /
kann man in dieser Liste auch suchen.
systemctl -atservice
Status eines Service
systemctl status <service>
Service Starten/Stoppen
sudo systemctl stop <service>
sudo systemctl start <service>
sudo systemctl restart <service>
Logs
Das -e
springt an das Ende des Logs (was man ja meistens auch möchte). Falls dies nicht gewünscht ist, das -e
einfach weglassen
journalctl -xe
Um den Log kontinuierlich zu sehene (neue einträge werden sofort angezeigt)
journalctl -xf
Logs eine spezifischen Services
journalctl -xeu <service>
Auch diese kann man kontinuierlich anzeigen lassen
journalctl -xfu <service>
NixOS-Container
Container auflisten
Reine Auflistung
nixos-container list
Etwas detailreicher, Machines ist ein anderes Wort für Container
machinectl
Container Starten/Stoppen
sudo nixos-container stop <container>
sudo nixos-container start <container>
sudo nixos-container restart <container>
In einen Container einloggen
sudo nixos-container root-login <container>
Logs eines Containers
sudo journalctl -xeM <container>
(Oder im Grafana)
Sops
Secret Keys updaten
Synchronisiert alle secrets mit .sops.yaml
und rotiert ihre encryption keys
find nixos/secrets -type f -exec sops updatekeys --yes {} \; -exec sops rotate -i {} \;
Aufräumen
Subvolumes die nicht deklariert sind
Dieser Command printet ordner in /persist, die nicht in teenix deklariert sind.
bash -c 'comm -3 <(find /persist/ -maxdepth 1 -mindepth 1 -type d| sort) <(cat /etc/teenix-persistence.json | jq -r "keys|sort|.[]")'
Passwörter rotieren
Jedes Jahr kommt der tolle Moment wo der Rat sich neu konstituiert und alle Passwörter rotiert werden sollten.
Mir ist bewusst das sich all das ein bisschen overkill anfühlt. Aber in diesem Fall ist Vorsicht besser als Nachsicht
Diese Doku hat Lücken, ist aber besser als nichts
SSH Zugang entfernen
User von Menschen die keinen Zugang mehr haben, sollten aus nixos/share/users.nix
entfernt werden.
Sops Secret Keys updaten
ACHTUNG: Vor diesem Schritt sollten Tokens und Passwörter von Diensten geändert werden, siehe unten.
Keys von Menschen die nicht mehr Zugang haben sollten aus nixos/keys/users/
gelöscht werden und ihr Eintrag aus .sops.yaml
entfernt werden.
Anschließend sollten alle Keys mit
find nixos/secrets -type f -exec sops updatekeys --yes {} \; -exec sops rotate -i {} \;
rotiert und updated werden. Es ist zu beachten das das rotieren nur etwas bringt wenn auch ihr Inhalt verändert wird. Neue/Alte User sollten natürlich trozdem hinzugefügt/entfernt werden damit sie (nicht weiterhin) auf neue Secrets Zugang haben.
OAuth Secrets anpassen
Kein eigener Schritt, wird von Schritten weiter unten referenziert.
- In Authentik in die Admin Ansicht gehen
- Unter Applications auf Provider gehen
- Den gewünschten Provider auswählen
- Ein neues Secret mit
nix run nixpkgs#pwgen 128 1
generieren - Im Provider dies unter Edit Client Secret eintragen
- Das Secret im entsprechenden Service eintragen (von wo auf mich referenziert wurde)
- Speichern
Dienste mit Config Files
Attic
nixos/secrets/attic.yml
Den JWT neu generieren mit
nix run nixpkgs#openssl -- genrsa -traditional 4096 | base64 -w0
und dann das Secret anpassen.
Außerdem müssen Access Tokens ausgetauscht werden:
Tokens neu generieren und austauschen
Github
Den Token generieren(im atticd container) mit
atticd-atticadm make-token --sub "fscs" --validity "1y" --pull "fscs-public" --push "fscs-public"
Den resultierenden Token hier einfügen
Authentik
nixos/secrets/authentik.yml
Der Admin Token mit dem Authentik Cookies signiert sollte abgeändert werden.
nix run nixpkgs#pwgen 128 1
und dann im secret austauschen.
Campus Guesser
nixos/secrets/campus-guesser-server.yml
Das OAuth Secret für den campus-guesser-oauth
Provider muss angepasst werden. Siehe hier
Inphima Discord Bot
nixos/secrets/discord-inphima-bot.yml
Discord Bots sind doof. Beten das eins hier Zugriff hat und den Token zurücksetzen. Dann im Secret eintragen
fscs.hhu.de
nixos/secrets/fscshhude.yml
Das OAuth Secret für den FSCS Website
Provider muss angepasst werden. Siehe hier
Außerdem muss der Signing Key angepasst werden, nix run nixpkgs#pwgen 128 1
drauf werfen.
Gitlab Runner
nixos/secrets/gitlab_runner.yml
Leider müssen alle Runner gelöscht und wieder neu erstellt werden.
Alle Runner brauchen bei Tags
, nix
eingetragen. Sonst muss nichts eingetragen werden. Sobald der Runner erstellt wurde kann der Token unter Step 1
kopiert werden.
Der fscs
Namespace hat 3 Runner
Der phynix
Namespace hat 1 Runner
Immich
nixos/secrets/immich.yml
Das OAuth Secret für den immich
Provider muss angepasst werden. Siehe hier
Matrix
Hier hatte ich Angst irgendwas anzufassen.
Nextcloud
Hier hatte ich Angst irgendwas anzufassen. Das Admin Pass zu ändern bringt auch nichts.
Root Passwörter
nixos/secrets/passwords.yml
Neu generieren mit
bash -c 'pw="$(nix run nixpkgs#pwgen 128 1)"; echo Passwort: $pw; echo -n "Hash: " ;echo -n $pw | mkpasswd -s'
Die erste Zeile ist das Klartext Passwort, die zweite Zeile ist die gehashte Version die im Secret eingetragen werden sollte. Der Klartext sollte im Vaultwarden hinterlegt werden.
Wordpress Seiten
Hier könnte eins das MySql Passwort ändern, das kann eins aber auch lassen. Ist eh nicht exposed.
Scanner
nixos/secrets/passwords.yml
Passwort neu generieren, wie bei den Root Passwörtern auch. Dann im Drucker neu eintragen. Weil die Druckertastatur so Arsch ist, das Passwort etwas kürzer
bash -c 'pw="$(nix run nixpkgs#pwgen 32 1)"; echo Passwort: $pw; echo -n "Hash: " ;echo -n $pw | mkpasswd -s'
Vaultwarden
nixos/secrets/vaultwarden.yml
Den Admin Token neu generieren und in Vaultwarden umändern
bash -c 'pw="$(nix run nixpkgs#pwgen 64 1)"; echo Passwort: $pw; echo "Hash: " ; echo -n $pw | nix run nixpkgs#libargon2 -- "$(nix run nixpkgs#openssl -- rand -base64 32)" -e -id -k 65540 -t 3 -p 4'
Nutzer und Berechtigungen
In der Admin Console sollten Menschen die keine Rechte mehr haben entfernt werden. Bei allen anderen muss überprüft werden ob sie noch Zugang zu ihren Collections haben sollten.
Unter /admin
können User auch gelöscht werden, das sollte aber nur passieren wenn ihre “Entries” 0 sind, sie also keine privaten Passwörter haben. In dem Fall sollte Rücksprache mit der jeweiligen Person gehalten werden
Deploy A New Service
Repository Struktur
Um einen neuen Service zu deployen sollte man unter mod/nixos/services eine Datei erstellen, welche den Service am besten über einen NixOS Container deployed. Die wenigsten Services sollten auf Teefax selbst laufen. sollte der Service nicht in eine Datei sinnvoll strukturiert werden können, so sollte der service in einen Ordner verschoben werden. Die Struktur in dem Ordner sollte z.B. wie folgt aussehen:
Servicename
| -> default.nix
| -> container.nix
Deployen eines Beispiel Services
Wenn man die wie in Repository Struktur beschriebene Ordnerstruktur erstellt hat, so werden die Dateien automatisch geladen und sind verfügbar. Um die Services konfigurierbar zu machen sollte man also umbeding auf Options setzen. Einige Beispiel Options die wir fast immer haben sind:
- Enable (enable)
- Hostname (hostname)
- Environment File (secretFile)
options.teenix.services.vaultwarden = {
enable = lib.mkEnableOption "setup vaultwarden";
hostname = lib.teenix.mkHostnameOption;
secretsFile = lib.teenix.mkSecretsFileOption "vaultwarden";
};
Die reguläre NixOS config kann nun in eien config block geschreieben werden.
config =
let
opts = config.teenix.services.vaultwarden;
in
lib.mkIf opts.enable {
...
}
Wir verwenden Sops um Secrets zu verschlüsseln und zu verwalten. Um diese einzubinden, muss das secret in die NixOS config eingebunden werden. Hier Doku
Wichtig Um die secrets für alle entschlüsselbar zu machen, muss gpgagent installiert sein und laufen. Des weiteren muss die devSell genutz werden, damit alle Keys der User als auch die von Teefax geladen werden.
NixOS Container
Um die Verwaltung der NixOS Container zu verbessern, haben wir ein eigenes Container Module geschrieben. dieses verwaltet die IP Pools und sämtliche Grundfunktionen, die die meisten unserer Container brauchen. Dies erspart Gehirnschmalz und Tipparbeit. Doku zum Modul
Docker Container
Um Docker Dienste zu deployen ist einiges mehr an aufwand nötig. Hierzu muss
die docker-compose.yml
in Nix Code umgewandelt werden. Ein tolles Tool dazu
ist compose2nix. Nun muss der gnerierte
Nix Code noch etwas modifiziert werden und die Secrets über sops eingefügt werden.
Wichtig keine Secrets in die nix File schreiben.
Service accessible machen
Um von Aussen auf den Service zuzugreifen, muss der jeweilige Port im Container geöffnet werden:
teenix.containers.vaultwarden = {
networking = {
useResolvConf = true;
ports.tcp = [ 8222 ];
};
};
Der Service muss nun auch noch durch unsere Reverse Proxy Traefik.
Hierzu haben wir natürlich auch ein Modul Geschrieben. Dies
erlaubt uns, unsere Services einfach in Traefik einzubinden.
Der einfachste Fall ist ein Service ohne Middleware o.ä.
Doku zum Moul
Alloy
Exportiert unsere SystemD Journals nach Loki
Options
teenix.services.alloy.enable
Whether to enable enable grafana alloy.
Type: boolean
Default:
false
Example:
true
teenix.services.alloy.extraConfig
extra config for alloy
Type: strings concatenated with “\n”
teenix.services.alloy.loki.exporterName
name of the loki exporter
Type: non-empty string
Default:
"loki_write"
teenix.services.alloy.loki.exporterUrl
loki url to export to
Type: non-empty string
Attic
Ein Nix Binary Cache. Hier liegen selbst geschriebene Projekte von uns in gebauter Form, damit eins das nicht immer selbst machen muss.
Administration
Um Attic zu konfigurieren braucht eins einen Access Token. Diese sollten immer nur on-demand erstellt werden.
Dazu muss eins im atticd
container den Token erstellen
atticd-atticadm make-token --sub admin --validity "1 hour" --create-cache \* --pull \* --push \* --delete \* --configure-cache \* --configure-cache-retention \* --destroy-cache \*
Im Output steht jetzt eine komische Fehlermeldung, aber auch der Access Token.
Dann lokal eine nix-shell mit attic-client
öffnen und sich einloggen
attic login fscs https://attic.hhu-fscs.de DER_TOKEN
Options
teenix.services.atticd.enable
Whether to enable the attic binary cache.
Type: boolean
Default:
false
Example:
true
teenix.services.atticd.hostname
hostname for attic
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.atticd.secretsFile
path to the secrets file for attic
Type: absolute path
Example:
./secrets/myservice.yml
Authentik
Ein SSO (Single Sign On) Provider mit vielen Anbindungsmöglichkeiten. Ein universeller Login für alle Dienste
Options
teenix.services.authentik.enable
Whether to enable authentik.
Type: boolean
Default:
false
Example:
true
teenix.services.authentik.hostname
hostname for authentik
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.authentik.secretsFile
path to the secrets file for authentik
Type: absolute path
Example:
./secrets/myservice.yml
Bahn Monitor
Tolles Bahn tool das auch essen zeigt. Steht in der FS Info
Options
teenix.services.bahn-monitor.enable
Whether to enable fscs-monitor-plus, a train monitoring service.
Type: boolean
Default:
false
Example:
true
teenix.services.bahn-monitor.hostname
hostname for fscs-monitor-plus
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
Campus Guesser
GeoGuesser für den Campus
Options
teenix.services.campus-guesser-server.enable
Whether to enable campus-guesser-server.
Type: boolean
Default:
false
Example:
true
teenix.services.campus-guesser-server.hostname
hostname for campus-guesser-server
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.campus-guesser-server.secretsFile
path to the secrets file for campus-guesser-server
Type: absolute path
Example:
./secrets/myservice.yml
NextCloud Office
Backend für NextCloud Office, wir nutzen es für z.B. MS-Office Dateien(würg)
Options
teenix.services.collabora.enable
Whether to enable collabora.
Type: boolean
Default:
false
Example:
true
teenix.services.collabora.hostname
hostname for collabora
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.collabora.nextcloudHost
Url of the connected NextCloud Instance
Type: string
Teenix Containers
Wie bereits erwähnt benutzt Teenix sehr viele NixOS Container. Um uns die Arbeit etwas einfacher zu machen haben wir uns ein eigenes Modul geschrieben was die containers
und teenix.persist
Optionen “wrapped” um häufige Konfigurationen umzusetzen.
- Überblick
- Options
- teenix.containers
- teenix.containers.
.backup - teenix.containers.
.config - teenix.containers.
.extraConfig - teenix.containers.
.machineId - teenix.containers.
.mounts.data.enable - teenix.containers.
.mounts.data.name - teenix.containers.
.mounts.data.ownerUid - teenix.containers.
.mounts.extra - teenix.containers.
.mounts.extra. .hostPath - teenix.containers.
.mounts.extra. .isReadOnly - teenix.containers.
.mounts.extra. .mode - teenix.containers.
.mounts.extra. .mountPoint - teenix.containers.
.mounts.extra. .ownerUid - teenix.containers.
.mounts.mysql.enable - teenix.containers.
.mounts.postgres.enable - teenix.containers.
.mounts.sops.secrets - teenix.containers.
.mounts.sops.templates - teenix.containers.
.networking.id - teenix.containers.
.networking.ports.tcp - teenix.containers.
.networking.ports.udp - teenix.containers.
.networking.useResolvConf - teenix.containers.
.privateUsers
Überblick
Diese Defaults sind:
- Den Container Autostarten
- Das Dateisystem des Containers ephemeral (nicht-persistent) zu machen
- Dem Container ein eigenes Netzwerk Interface zu geben und diesem IPs zuzuordnen
- Das Journal (Logs) des Containers in
/var/log/containers
verfügbar zu machen
Auf Bedarf kann auch:
- Dem Container DNS Zugriff gewährt werden (standardmässig ist das nämlich nicht der Fall)
- Ein Subvolume in
/persist/<container-name>
für persistente Daten erstellt werden - Standard Ordner von Datenbanken (postgres, mysql) dorthin mounten
- Die “data dir” des containers dorthin gemounted werden (
/var/lib/<container-name>
) - TCP/UDP Ports in der Firewall des Containers geöffnet werden
- Sops Secrets/Templates an den Container weitergereicht werden (damit der Container die Schlüssel nicht kennt)
Options
teenix.containers
Type: attribute set of (submodule)
Default:
{ }
Example:
{
config = {
services = {
postgresql = {
enable = true;
};
};
system = {
stateVersion = "24.11";
};
};
networking = {
ports = {
tcp = [
8000
];
};
};
}
teenix.containers.<name>.backup
Automatically snapshot this containers persisted subvolume.
In addition to time-based snapshotting, a snapshot is also taken every time the container restarts
Type: boolean
Default:
true
Example:
false
teenix.containers.<name>.config
The containers NixOS configuration, specified as a file, attribute set or NixOS Module function.
The special arg “host-config” can be used to access the hosts configuration from within the container.
Type: module
Example:
{
services = {
postgresql = {
enable = true;
};
};
system = {
stateVersion = "24.11";
};
}
teenix.containers.<name>.extraConfig
Extra Options/Overrides to pass to the underlying container option
Type: attribute set
Default:
{ }
Example:
{
timeoutStartSec = "15min";
}
teenix.containers.<name>.machineId
The containers machine-id, uniquely identifiying this container. You shouldn’t ever have to set this yourself.
Used for mounting the systemd journals back to the host.
Type: string matching the pattern ^[a-f0-9]{32} $
Default:
lib.substring 0 32 (builtins.hashString "sha256" name) + "\n"
teenix.containers.<name>.mounts.data.enable
Mount (from the containers perspective) /var/lib/<containerName> into persisted storage (at /persist/container/data)
This is a really common pattern. A service named “example” will propably have a container called “example” and place its data within a folder under /var/lib.
Nonetheless, verify if this is actually the case. This option is just a really stupid shortcut.
Type: boolean
Default:
false
Example:
true
teenix.containers.<name>.mounts.data.name
Change the folder name under /var/lib
This makes this option at least a bit more versatile, and should be used to achieve consistency (data dir at /persist/container/data)
Type: non-empty string
Default:
"container name"
Example:
"myservice"
teenix.containers.<name>.mounts.data.ownerUid
Owner of the data dir. Since the desired user may not exist on the host, this option takes an id instead of a name.
Be ware, that if set this is enforced and set to this value on a regular basis.
If set to null, the folder will at first be owned by root and its left up to the service to set the correct owner.
The privateUsers option may interfere with this.
Type: null or signed integer
Default:
null
Example:
config.containers.myservice.config.users.users.myservice.uid
teenix.containers.<name>.mounts.extra
Additional Mounts for the container
Type: attribute set of (submodule)
Default:
{ }
teenix.containers.<name>.mounts.extra.<name>.hostPath
Path on the host to mount from.
If unset, defaults to /persist/<container-name>/<name-of-the-extra-mount>
Type: null or non-empty string
Default:
null
Example:
"/mnt/netapp/Nextcloud"
teenix.containers.<name>.mounts.extra.<name>.isReadOnly
Make the mount read-only, prohibiting any modifications (from anything) from within the container
Type: boolean
Default:
true
teenix.containers.<name>.mounts.extra.<name>.mode
Be ware, that if set this is enforced and set to this value on a regular basis.
If set to null, the folder will at first be owned by root and its left up to the service to set the correct owner.
The privateUsers option may interfere with this.
Type: non-empty string
Default:
"0700"
Example:
"0755"
teenix.containers.<name>.mounts.extra.<name>.mountPoint
Path inside the container to mount to
Type: non-empty string
Example:
"/var/lib/nextcloud/data"
teenix.containers.<name>.mounts.extra.<name>.ownerUid
Be ware, that if set this is enforced and set to this value on a regular basis.
If set to null, the folder will at first be owned by root and its left up to the service to set the correct owner.
The privateUsers option may interfere with this.
Type: null or signed integer
Default:
null
Example:
config.users.users.nextcloud.uid
teenix.containers.<name>.mounts.mysql.enable
Mount the container’s mysql data dir into persisted storage (at /persist/container/mysql).
If a mysql database is used within the container, you’ll always want this enabled.
Type: boolean
Default:
false
Example:
true
teenix.containers.<name>.mounts.postgres.enable
Mount the container’s postgresql data dir into persisted storage (at /persist/container/postgres)
If a postgresql database is used within the container, you’ll always want this enabled.
Type: boolean
Default:
false
Example:
true
teenix.containers.<name>.mounts.sops.secrets
Names of sops-nix secrets to mount into the container.
Use host-config.sops.secrets.my-secret.path
to access the path within the container
Type: list of non-empty string
Default:
[ ]
Example:
[ "my-secret" ]
teenix.containers.<name>.mounts.sops.templates
Names of sops-nix templates to mount into the container
Use host-config.sops.templates.my-template.path
to access the path within the container
Type: list of non-empty string
Default:
[ ]
Example:
[ "my-template" ]
teenix.containers.<name>.networking.id
Network id this container should be placed in. If null, one is picked automatically
Type: null or non-empty string
Default:
null
Example:
"192.168.1"
teenix.containers.<name>.networking.ports.tcp
TCP Ports to open in the containers firewall
Type: list of 16 bit unsigned integer; between 0 and 65535 (both inclusive)
Default:
[ ]
Example:
[
8080
]
teenix.containers.<name>.networking.ports.udp
UDP Ports to open in the containers firewall
Type: list of 16 bit unsigned integer; between 0 and 65535 (both inclusive)
Default:
[ ]
Example:
[
25565
]
teenix.containers.<name>.networking.useResolvConf
Whether to enable Make a resolv.conf file available in the container.
This is required if the container wants to do DNS lookups. .
Type: boolean
Default:
false
Example:
true
teenix.containers.<name>.privateUsers
Whether to give the container its own private UIDs/GIDs space (user namespacing). This greatly enhances security.
In addition to the options provided by nixos containers, this option also takes a boolean. If true, privateUsers is set to “pick”, If set to false, privateUsers is set to “no”
Type: boolean or 32 bit unsigned integer; between 0 and 4294967295 (both inclusive) or one of “no”, “identity”, “pick”
Default:
false
Example:
true
Crab.Fit
When2Meet Alternative
Options
teenix.services.crabfit.enable
Whether to enable crab.fit, a meeting scheduler.
Type: boolean
Default:
false
Example:
true
teenix.services.crabfit.hostnames.backend
hostname for backend for crabfit
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.crabfit.hostnames.frontend
hostname for frontend for crabfit
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
Awareness Tool
Awareness Tool
Options
teenix.services.cryptpad.enable
Whether to enable cryptpad.
Type: boolean
Default:
false
Example:
true
teenix.services.cryptpad.hostname
hostname for cryptpad
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
INPhiMa(PhyNIx) Discord Bot
INPhiMa Reaktion und zuweis Bot für Studiengänge
Options
teenix.services.discord-inphima-bot.enable
Whether to enable discord-inphima-bot.
Type: boolean
Default:
false
Example:
true
teenix.services.discord-inphima-bot.secretsFile
path to the secrets file for discord-inphima-bot
Type: absolute path
Example:
./secrets/myservice.yml
Dokumentation
Hier liegt diese Website
Options
teenix.services.docnix.enable
Whether to enable serve the documentation.
Type: boolean
Default:
false
Example:
true
teenix.services.docnix.hostname
hostname for documentation
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
Freescout
Ticketsystem
Options
teenix.services.freescout.enable
Whether to enable freescout.
Type: boolean
Default:
false
Example:
true
teenix.services.freescout.hostname
hostname for freescout
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.freescout.secretsFile
path to the secrets file for freescout
Type: absolute path
Example:
./secrets/myservice.yml
Fachschafts Website
Die Fachschafts Website, wie man sie kennt und liebt.
Options
teenix.services.fscshhude.enable
Whether to enable fscshhude.
Type: boolean
Default:
false
Example:
true
teenix.services.fscshhude.secretsFile
path to the secrets file for fscshhude
Type: absolute path
Example:
./secrets/myservice.yml
Nawi Website
Sie haben keinen Server und wir sind nett.
Options
teenix.services.fsnawide.enable
Whether to enable fsnawide.
Type: boolean
Default:
false
Example:
true
teenix.services.fsnawide.hostname
hostname for fsnawide
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.fsnawide.secretsFile
path to the secrets file for fsnawide
Type: absolute path
Example:
./secrets/myservice.yml
Gatus
Unsere Status Seite
Options
teenix.services.gatus.enable
Whether to enable gatus, a status page.
Type: boolean
Default:
false
Example:
true
teenix.services.gatus.groups
groups of healthchecks
Type: attribute set of (submodule)
teenix.services.gatus.groups.<name>.endpoints
endpoints of this group
Type: attribute set of (submodule)
teenix.services.gatus.groups.<name>.endpoints.<name>.extraConfig
extra config options for this endpoint
Type: YAML 1.1 value
Default:
{ }
teenix.services.gatus.groups.<name>.endpoints.<name>.interval
interval to healthcheck on
Type: non-empty string
Default:
cfg.interval
teenix.services.gatus.groups.<name>.endpoints.<name>.name
name of this service
Type: non-empty string
teenix.services.gatus.groups.<name>.endpoints.<name>.status
returned status code to consider the service healthy
Type: null or integer between 0 and 599 (both inclusive)
Default:
200
teenix.services.gatus.groups.<name>.endpoints.<name>.url
url to healthcheck
Type: non-empty string
teenix.services.gatus.groups.<name>.name
display name of this group
Type: non-empty string
teenix.services.gatus.hostname
hostname for gatus
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.gatus.interval
default interval to healthcheck on
Type: non-empty string
Default:
"5m"
VPN
Self-Hosted VPN
Options
teenix.services.headscale.enable
Whether to enable headscale VPN.
Type: boolean
Default:
false
Example:
true
teenix.services.headscale.hostname
hostname for headscale VPN
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.headscale.secretsFile
path to the secrets file for headscale VPN
Type: absolute path
Example:
./secrets/myservice.yml
Hockeypuck
PGP Keyserver
Options
teenix.services.hockeypuck.enable
Whether to enable hockeypuck openpgp key server.
Type: boolean
Default:
false
Example:
true
teenix.services.hockeypuck.hostname
hostname for pgp keyserver
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
Home Assistant
Unser smartes Heim
Options
teenix.services.home-assistant.enable
Whether to enable home-assistant.
Type: boolean
Default:
false
Example:
true
teenix.services.home-assistant.hostname
hostname for home-assistant
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.home-assistant.secretsFile
path to the secrets file for home-assistant
Type: absolute path
Example:
./secrets/myservice.yml
Immich
Unser Photo Server
Options
teenix.services.immich.enable
Whether to enable immich, a photo server.
Type: boolean
Default:
false
Example:
true
teenix.services.immich.hostname
hostname for immich
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.immich.secretsFile
path to the secrets file for immich
Type: absolute path
Example:
./secrets/myservice.yml
INPhiMa Website
Die INPhiMa Website, legacy crap vom feinsten
Options
teenix.services.inphimade.enable
Whether to enable setup inphimade.
Type: boolean
Default:
false
Example:
true
teenix.services.inphimade.hostname
hostname for inphimade
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.inphimade.secretsFile
path to the secrets file for inphimade
Type: absolute path
Example:
./secrets/myservice.yml
Matrix
Matrix. Man kennt es, man liebt es, man hat große Angst das es kaputt geht und alle Sessions gelöscht werden.
Options
teenix.services.matrix.enable
Whether to enable matrix.
Type: boolean
Default:
false
Example:
true
teenix.services.matrix.hostnames.element-web
hostname for element-web
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.matrix.hostnames.homeserver
hostname for homeserver name
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.matrix.hostnames.hookshot
hostname for hookshot
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.matrix.hostnames.mas
hostname for matrix authentication service
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.matrix.hostnames.matrix
hostname for matrix
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.matrix.hostnames.sydent
hostname for sydent
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.matrix.secretsFile
path to the secrets file for matrix
Type: absolute path
Example:
./secrets/myservice.yml
Interner Matrix Bot
Matrix Bot für unseren internen Matrix Space
Options
teenix.services.matrix-intern-bot.enable
Whether to enable setup matrix-intern-bot.
Type: boolean
Default:
false
Example:
true
teenix.services.matrix-intern-bot.secretsFile
path to the secrets file for matrix-intern-bot
Type: absolute path
Example:
./secrets/myservice.yml
MediaMTX
Video Streaming Server für die Alarmanlage
Options
teenix.services.mediamtx.enable
Whether to enable media mtx.
Type: boolean
Default:
false
Example:
true
teenix.services.mediamtx.hostnames.api
hostname for api url
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.mediamtx.hostnames.rtsp
hostname for rtsp url
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
Minecraft
Ein Minecraft Server! Darf nicht fehlen
Options
teenix.services.minecraft.enable
Whether to enable minecraft server.
Type: boolean
Default:
false
Example:
true
Mosquitto
MQTT Broker
Options
teenix.services.mosquitto.enable
Whether to enable mosquitto.
Type: boolean
Default:
false
Example:
true
teenix.services.mosquitto.hostname
hostname for mosquitto
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.mosquitto.secretsFile
path to the secrets file for mosquitto
Type: absolute path
Example:
./secrets/myservice.yml
n8n
Logic thingy für die Kasse
Options
teenix.services.n8n.enable
Whether to enable n8n.
Type: boolean
Default:
false
Example:
true
teenix.services.n8n.hostname
hostname for n8n
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.n8n.secretsFile
path to the secrets file for n8n
Type: absolute path
Example:
./secrets/myservice.yml
NextCloud
Unser besonderes Baby
Options
teenix.services.nextcloud.enable
Whether to enable nextcloud.
Type: boolean
Default:
false
Example:
true
teenix.services.nextcloud.extraApps
nextcloud apps to install
Type: list of string
Default:
[ ]
teenix.services.nextcloud.hostname
hostname for nextcloud
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.nextcloud.secretsFile
path to the secrets file for nextcloud
Type: absolute path
Example:
./secrets/myservice.yml
Node Exporter
Prometheus Exporter für Node Statistiken, wie CPU Auslastung etc
Options
teenix.services.node_exporter.enable
Whether to enable node_exporter.
Type: boolean
Default:
false
Example:
true
Ntfy
Notification Service, worüber wir unsere Alerts verschicken
Options
teenix.services.ntfy.enable
Whether to enable ntfy.
Type: boolean
Default:
false
Example:
true
teenix.services.ntfy.hostname
hostname for ntfy
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
Paperless
Kassen automatisierungs Software
Options
teenix.services.paperless.enable
Whether to enable paperless.
Type: boolean
Default:
false
Example:
true
teenix.services.paperless.hostname
hostname for paperless
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.paperless.secretsFile
path to the secrets file for paperless
Type: absolute path
Example:
./secrets/myservice.yml
Persistent Storage
Hier sollte dringend mehr Text stehen!
Options
teenix.persist.enable
A wrapper arround impermanence and btrbk. Expects a btrfs filesystem with the following layout:
- /root <- The actual root mounted at /
- /nix <- The root for all things nix. Mounted at /nix
- /persist <- The root of all other persistent storage, mounted at /persist
Note: For systems that use more than one (logical) drive, simply mount more
Type: boolean
Default:
false
Example:
true
teenix.persist.path
The root directory for all of non generated persistent storage, except /nix and /boot.
Type: non-empty string
Default:
"/persist"
teenix.persist.subvolumes
Subvolumes that should be persistent.
Type: attribute set of (submodule)
Default:
{ }
teenix.persist.subvolumes.<name>.backup
Whether to enable automatic snapshotting of this subvolume.
Type: boolean
Default:
true
Example:
true
teenix.persist.subvolumes.<name>.backupUnitTriggers
List of unit names. If any of these units get started or restarted during activation, backup this subvolume.
Type: list of string matching the pattern [a-zA-Z0-9@%:_.\-]+[.](service|socket|device|mount|automount|swap|target|path|timer|scope|slice)
Default:
[ ]
teenix.persist.subvolumes.<name>.bindMountDirectories
Whether all directories inside this subvolume should be bind-mounted to their respective paths in / (according to their name).
Type: boolean
Default:
false
Example:
true
teenix.persist.subvolumes.<name>.directories
Directories that should be created per default inside the subvolume
Type: attribute set of (submodule)
Default:
{ }
teenix.persist.subvolumes.<name>.directories.<name>.group
Group for this directory. If set to null, the group will not be enforced
Type: null or signed integer or non-empty string
Default:
"root"
teenix.persist.subvolumes.<name>.directories.<name>.mode
Mode for this directory. If set to null, the mode will not be enforced
Type: null or non-empty string
Default:
"0755"
teenix.persist.subvolumes.<name>.directories.<name>.owner
Owner for this directory. If set to null, the owner will not be enforced
Type: null or signed integer or non-empty string
Default:
"root"
teenix.persist.subvolumes.<name>.group
The group of the subvolume. If set to null, the group will not be enforced
Type: null or signed integer or non-empty string
Default:
"root"
teenix.persist.subvolumes.<name>.mode
The mode of the subvolume. If set to null, the mode will not be enforced
Type: null or non-empty string
Default:
"0755"
teenix.persist.subvolumes.<name>.owner
The owner of the subvolume. If set to null, the owner will not be enforced
Type: null or signed integer or non-empty string
Default:
"root"
teenix.persist.subvolumes.<name>.path
Path this subvolume will be mounted at
Type: non-empty string (read only)
Default:
"/persist/‹name›"
PhyNIx Website
PhyNIx Website
Options
teenix.services.phynixhhude.enable
Whether to enable phynixhhude.
Type: boolean
Default:
false
Example:
true
teenix.services.phynixhhude.hostname
hostname for phynixhhude
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.phynixhhude.secretsFile
path to the secrets file for phynixhhude
Type: absolute path
Example:
./secrets/myservice.yml
Pretix
System um Tickets für die Erstifahrt zu buchen
Options
teenix.services.pretix.enable
Whether to enable pretix.
Type: boolean
Default:
false
Example:
true
teenix.services.pretix.email
from email address
Type: string
teenix.services.pretix.hostname
hostname for pretix
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
Prometheus
Metrics für alles mögliche. Irgendwie ist in dem Module auch noch ein Grafana und ein Loki drinne, sollte mal jemand refactorn
Options
teenix.services.prometheus.enable
Whether to enable prometheus.
Type: boolean
Default:
false
Example:
true
teenix.services.prometheus.hostnames.grafana
hostname for prometheus
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.prometheus.hostnames.prometheus
hostname for prometheus
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.prometheus.secretsFile
path to the secrets file for prometheus
Type: absolute path
Example:
./secrets/myservice.yml
Sitzungsverwaltung
Sitzungsverwaltung verwaltet Sitzungen
Options
teenix.services.sitzungsverwaltung.enable
Whether to enable sitzungsverwaltung.
Type: boolean
Default:
false
Example:
true
teenix.services.sitzungsverwaltung.hostname
hostname for sitzungsverwaltung
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
static-files Datenschutz und So
static-files Datenschutz und So
Options
teenix.services.static-files.enable
Whether to enable static-files. simple, stupid http file serving.
Type: boolean
Default:
false
Example:
true
teenix.services.static-files.hostname
hostname for static-files
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
Traefik
Unser Reverse Proxy
Options
teenix.services.traefik.enable
Whether to enable traefik.
Type: boolean
Default:
false
Example:
true
teenix.services.traefik.dashboard.enable
Whether so serve the traefik dashboard.
It will only be accessible from within the PhyNIx HHU Subnet
Type: boolean
Default:
false
Example:
true
teenix.services.traefik.dashboard.url
url to serve the dashboard on
Type: non-empty string
teenix.services.traefik.dynamicConfig
Traefik’s dynamic config options.
This is passed through sops-nix templating, so you can use sops.placeholders to insert secrets into the config
Type: YAML 1.1 value
Default:
{ }
teenix.services.traefik.entryPoints
Traefik’s entrypoints, as defined in the static config
Type: null or (attribute set of (submodule))
Default:
null
teenix.services.traefik.entryPoints.<name>.extraConfig
Extra config options for this entrypoint
Type: YAML 1.1 value
Default:
{ }
teenix.services.traefik.entryPoints.<name>.host
Host address to bind this entrypoint on. Leave empty (default) for all host addresses
Type: string
Default:
""
teenix.services.traefik.entryPoints.<name>.port
Port of this entrypoint
Type: 16 bit unsigned integer; between 0 and 65535 (both inclusive)
teenix.services.traefik.entryPoints.<name>.protocol
Protocol of this entrypoint
Type: one of “tcp”, “udp”
Default:
"tcp"
teenix.services.traefik.httpMiddlewares
Traefik’s middlewares, as defined in the dynamic config
Type: null or YAML 1.1 value
Default:
null
teenix.services.traefik.httpServices
http based services, each using a single per-service router
Type: null or (attribute set of (submodule))
Default:
null
teenix.services.traefik.httpServices.<name>.extraConfig
Extra config options for this services, as defined in the dynamic config
Type: YAML 1.1 value
Default:
{ }
teenix.services.traefik.httpServices.<name>.healthCheck.enable
Whether to enable health checking for this service.
Type: boolean
Default:
true
Example:
true
teenix.services.traefik.httpServices.<name>.healthCheck.interval
Interval between health checks
Type: non-empty string
Default:
"10s"
teenix.services.traefik.httpServices.<name>.healthCheck.path
Path to healthcheck on
Type: string
Default:
"/"
teenix.services.traefik.httpServices.<name>.router.entryPoints
Entry Points for this router
Http Services uses websecure as default
Type: list of non-empty string
Default:
[ ]
teenix.services.traefik.httpServices.<name>.router.extraConfig
Extra config options for this router
Type: YAML 1.1 value
Default:
{ }
teenix.services.traefik.httpServices.<name>.router.middlewares
List of middlewares for this router
Type: list of non-empty string
Default:
[ ]
teenix.services.traefik.httpServices.<name>.router.rule
Rule for this router, see https://doc.traefik.io/traefik/routing/routers/#configuring-http-routers
Type: non-empty string
teenix.services.traefik.httpServices.<name>.router.tls.enable
Whether to enable tls for this router.
Type: boolean
Default:
true
Example:
true
teenix.services.traefik.httpServices.<name>.router.tls.certResolver
Certificate resolver to use for this router
Type: non-empty string
Default:
"letsencrypt"
teenix.services.traefik.httpServices.<name>.servers
Hosts for this service
Type: list of non-empty string
Default:
[ ]
teenix.services.traefik.letsencryptMail
The email address used for letsencrypt certificates
Type: non-empty string
teenix.services.traefik.redirects
Redirect one URL to another
Type: null or (attribute set of (submodule))
Default:
null
Example:
{
fscs_phynix = {
from = "fscs.phynix-hhu.de";
to = "fscs.hhu.de";
};
}
teenix.services.traefik.redirects.<name>.from
Domain to redirect from
Type: string
teenix.services.traefik.redirects.<name>.to
Domain to redirect to
Type: string
teenix.services.traefik.secretsFile
path to the secrets file for traefik
Type: absolute path
Example:
./secrets/myservice.yml
teenix.services.traefik.staticConfig
Traefik’s static config options.
This is passed through sops-nix templating, so you can use sops.placeholders to insert secrets into the config
Type: YAML 1.1 value
Default:
{ }
teenix.services.traefik.tcpMiddlewares
Traefik’s middlewares, as defined in the dynamic config
Type: null or YAML 1.1 value
Default:
null
teenix.services.traefik.tcpServices
tcp based services, each using a single per-service router
Type: null or (attribute set of (submodule))
Default:
null
teenix.services.traefik.tcpServices.<name>.extraConfig
Extra config options for this services, as defined in the dynamic config
Type: YAML 1.1 value
Default:
{ }
teenix.services.traefik.tcpServices.<name>.router.entryPoints
Entry Points for this router
Http Services uses websecure as default
Type: list of non-empty string
Default:
[ ]
teenix.services.traefik.tcpServices.<name>.router.extraConfig
Extra config options for this router
Type: YAML 1.1 value
Default:
{ }
teenix.services.traefik.tcpServices.<name>.router.middlewares
List of middlewares for this router
Type: list of non-empty string
Default:
[ ]
teenix.services.traefik.tcpServices.<name>.router.rule
Rule for this router, see https://doc.traefik.io/traefik/routing/routers/#configuring-http-routers
Type: non-empty string
teenix.services.traefik.tcpServices.<name>.router.tls.enable
Whether to enable tls for this router.
Type: boolean
Default:
false
Example:
true
teenix.services.traefik.tcpServices.<name>.router.tls.certResolver
Certificate resolver to use for this router
Type: non-empty string
Default:
"letsencrypt"
teenix.services.traefik.tcpServices.<name>.servers
Hosts for this service
Type: list of non-empty string
Default:
[ ]
teenix.services.traefik.udpServices
udp based services, each using a single per-service router
Type: null or (attribute set of (submodule))
Default:
null
teenix.services.traefik.udpServices.<name>.extraConfig
Extra config options for this services, as defined in the dynamic config
Type: YAML 1.1 value
Default:
{ }
teenix.services.traefik.udpServices.<name>.router.entryPoints
Entry Points for this router
Type: list of non-empty string
Default:
[ ]
teenix.services.traefik.udpServices.<name>.servers
Hosts for this service
Type: list of non-empty string
Default:
[ ]
Tür Sensor
Tür auf? Tür zu? Schrödingers Tür?
Options
teenix.services.tuer-sensor.enable
Whether to enable was-letzte-tuer, ein toller tür sensor.
Type: boolean
Default:
false
Example:
true
teenix.services.tuer-sensor.hostname
hostname for tuer-sensor
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
Uptime Kuma
Uptime Monitor der uns anschreit wenn ein ganzer Host down ist
Options
teenix.services.uptime-kuma.enable
Whether to enable uptime-kuma.
Type: boolean
Default:
false
Example:
true
teenix.services.uptime-kuma.hostname
hostname for uptime-kuma
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
Vaultwarden
Unser Passwort Manager, Bitwarden self-hosted edition
Options
teenix.services.vaultwarden.enable
Whether to enable vaultwarden.
Type: boolean
Default:
false
Example:
true
teenix.services.vaultwarden.hostname
hostname for vaultwarden
Type: non-empty string
Example:
"nextcloud.phynix-hhu.de"
teenix.services.vaultwarden.secretsFile
path to the secrets file for vaultwarden
Type: absolute path
Example:
./secrets/myservice.yml