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