Aller au contenu

Modules de service

AdGuard Home entièrement configuré pour passerelle / routeur local.

  • enable bool Active le service adguardhome local
darkone.service.adguardhome.enable = false;

Intelligence artificielle locale (open-webui + ollama + llms).

  • enable bool Activer le service d’IA local
darkone.service.ai.enable = false;

Services audio : alsa, pulse (pas jack pour le moment). Ajoute automatiquement les utilisateurs au groupe audio quand il est activé.

  • enable bool Activer le système sonore
darkone.service.audio.enable = false;

dnsmasq pré-configuré pour la passerelle / routeur local.

  • enable bool Active le service dnsmasq local
darkone.service.dnsmasq.enable = false;

Un module LaSuite Docs entièrement configuré.

  • enable bool Activer le service de documentation local
  • s3Host str Nom d’hôte du backend S3
  • s3Port port Port du backend S3
  • s3Bucket str Nom du bucket S3 pour le stockage des documents
darkone.service.docs = {
enable = false;
s3Host = "127.0.0.1";
s3Port = dnfConfig.network.ports.garage;
s3Bucket = "docs";
};

Client web Element pour le service matrix local.

  • enable bool Activer le service element local
darkone.service.element.enable = false;

Module fail2ban spécifique à DNF.

  • enable bool Activer fail2ban avec les spécificités DNF
darkone.service.fail2ban.enable = false;

Une forge git forgejo entièrement configurée.

  • enable bool Active le service forgejo local
darkone.service.forgejo.enable = false;

Un service Garage S3 local entièrement configuré.

Fournit un stockage d’objets interne compatible S3 accessible uniquement sur 127.0.0.1:3900.

  • enable bool Activer le service Garage S3 local
  • srvPort port Port de l’API S3 exposé sur l’IP interne
  • s3Region str Nom de la région S3 (doit correspondre à la config du consommateur)
  • capacity str Indication de capacité de stockage du nœud transmise à garage layout assign. Utilisée uniquement au premier démarrage pour l’initialisation du layout ; n’agit pas comme un quota strict sur le système de fichiers sous-jacent. Suffixes pris en charge : B, KB, MB, GB, TB, PB.
darkone.service.garage = {
enable = false;
srvPort = srvPort;
s3Region = s3Region;
capacity = "500GB";
};

GeneWeb — Service de généalogie puissant.

  • enable bool Activer le service de généalogie GeneWeb local
  • enablePasswords bool Activer les mots de passe sops (non recommandé)
darkone.service.geneweb = {
enable = false;
enablePasswords = false;
};

Harmonia : serveur local de cache binaire Nix (sert le /nix/store de cet hôte).

Expose les chemins du store construits / réalisés localement sur HTTP simple (port 5000), signés avec la clé de cache binaire déployée sur tout le réseau. À activer par hôte depuis usr/config.yaml (services.harmonia), comme tout autre service DNF.

  • enable bool Active un serveur de cache binaire Nix Harmonia local
darkone.service.harmonia.enable = false;

Un service headscale entièrement configuré pour HCS.

  • enable bool Activer le service DNF headscale
  • enableGRPC bool Ouvrir le port TCP GRPC
darkone.service.headscale = {
enable = false;
enableGRPC = false;
};

Un Home Assistant avec certains plugins (en cours).

  • enable bool Activer home-assistant
darkone.service.home-assistant.enable = false;

Tableau de bord de page d’accueil configuré dynamiquement pour votre réseau local.

  • enable bool Activer le tableau de bord de la page d’accueil + httpd + hôte
  • protect bool Restreindre la page d’accueil aux utilisateurs Kanidm authentifiés (oauth2-proxy forward auth)
  • localServices listOf attrs Services à ajouter dans la section Applications locales
  • globalServices listOf attrs Services communs du réseau & accessibles publiquement
  • remoteServices listOf attrs Services à ajouter dans la section Applications distantes
  • bookmarks listOf attrs Remplacer les favoris par défaut (liens)
  • widgets listOf attrs Remplacer les widgets par défaut
darkone.service.homepage = {
enable = false;
protect = true;
localServices = [ ];
globalServices = [ ];
remoteServices = [ ];
bookmarks = [ ];
widgets = [ ];
};

Service DNF Kanidm (gestionnaire d’identités).

  • enable bool Activer le SSO local avec Kanidm
  • oauth2 attrs Modèles de clients OAuth2/OIDC fournis par les modules de services. Kanidm provisionne un client pour chaque entrée correspondante dans network.services, avec clientId = dnfLib.oauth2ClientName.
    • enable bool Whether to provision OAuth2 clients for this template.
    • clientName nullOr str Override the kanidm client name. Defaults to dnfLib.oauth2ClientName.
    • displayName str Human-readable name shown on the kanidm consent screen.
    • imageFile path Application icon. Re-uploaded on every kanidm-provision run.
    • redirectPaths listOf str OAuth2 redirect paths (one per accepted callback URL).
    • landingPath str Auto-connect entry point path on the service.
    • enableLegacyCrypto bool Allow legacy JWT signing algorithms (eg. RS256).
    • allowInsecureClientDisablePkce bool Disable PKCE on the client (only for clients that do not implement it).
    • preferShortUsername nullOr bool Use the short username (no domain) in the preferred_username claim.
    • extra attrs Extra attributes merged into the provisioned client (claimMaps, etc).
darkone.service.idm = {
enable = false;
oauth2.enable = true;
oauth2.clientName = null;
oauth2.displayName = null;
oauth2.imageFile = null;
oauth2.redirectPaths = [ ];
oauth2.landingPath = "/";
oauth2.enableLegacyCrypto = false;
oauth2.allowInsecureClientDisablePkce = false;
oauth2.preferShortUsername = null;
oauth2.extra = { };
};

Service Immich (gestion de photos) entièrement configuré.

  • enable bool Activer le service immich local
  • enableMachineLearning bool Activer les fonctionnalités d’apprentissage automatique (reconnaissance faciale, détection d’objets)
  • enableRedis bool Activer Redis pour la mise en cache (recommandé pour les performances)
darkone.service.immich = {
enable = false;
enableMachineLearning = false;
enableRedis = false;
};

Un serveur jellyfin entièrement configuré.

  • enable bool Activer le service jellyfin
darkone.service.jellyfin.enable = false;

Un service jitsi-meet entièrement configuré.

  • enable bool Activer le service jitsi-meet local
darkone.service.jitsi-meet.enable = false;

Loki + Alloy, statistiques HTTP avec Grafana.

  • enable bool Déploie le serveur Loki + le datasource Grafana (co-localisé avec Grafana).
  • isClient bool Déploie Alloy pour collecter les logs d’accès Caddy locaux.
  • retentionTime str Durée de rétention des logs dans Loki (30 jours par défaut).
darkone.service.loki = {
enable = config.darkone.service.monitoring.enable;
isClient = config.services.caddy.enable && hasMonitoringHost;
retentionTime = "720h";
};

Serveur Matrix (synapse) DNF avec les ponts mautrix.

Les ponts (whatsapp, signal, telegram, messenger, discord) sont utilisables par tout compte local : chaque utilisateur lie son propre compte distant en discutant avec le bot du pont (@whatsappbot, @signalbot, … puis login) ; les sessions sont isolées par utilisateur. Le network.matrix.admin déclaré administre les ponts.

Le double puppeting utilise la méthode officielle appservice (https://docs.mau.fi/bridges/general/double-puppeting.html 🡕) : un jeton doublepuppet appservice partagé permet aux ponts d’envoyer les messages provenant du distant en tant que vrai compte matrix de l’utilisateur. Secrets sops requis : mautrix-doublepuppet-as-token et mautrix-doublepuppet-hs-token (openssl rand -hex 32 chacun).

Les jetons as/hs appservice de chaque pont sont fournis par sops plutôt qu’auto-générés : le fichier d’enregistrement devient une fonction pure des secrets, donc réinitialiser le répertoire d’état d’un pont n’invalide jamais l’enregistrement que synapse a chargé (ce qui autrement nécessiterait un wipe d’enregistrement + redémarrage de synapse et produirait des erreurs « as_token was not accepted »).

La fédération se configure via darkone.service.matrix.federation :

  • enable = false : bloque toute fédération (liste blanche de domaines vide).
  • enable = true; whitelist = [ ] : fédération ouverte avec tous les serveurs.
  • enable = true; whitelist = [ "ami.org" ] : liste blanche (entrante + sortante).

La découverte reste verrouillée dans tous les cas (salles absentes des annuaires distants, profils privés sur la fédération), donc le réseau est joignable mais pas recherchable.

L’auto-inscription des proches (friendRegistration.enable) ouvre des comptes locaux protégés par jeton aux côtés des utilisateurs OIDC Kanidm. Sans MAS, la frappe d’un jeton passe par l’API admin de Synapse (un admin serveur est requis) ; avec MAS, frappez-le sur l’hôte avec sudo dnf-mas manage issue-user-registration-token.

mas.enable délègue toute l’authentification au Matrix Authentication Service (requis par Element X, la connexion par QR code, le portail self-service /account). Kanidm reste la source d’identité : MAS devient le client OIDC à la place de synapse, et synapse se contente de demander à MAS d’inspecter les jetons. Servi sur le même vhost : MAS possède la racine + les points d’entrée d’auth compat, synapse conserve /_matrix/* et /_synapse/* ; la découverte client est automatique (synapse sert lui-même auth_metadata), donc pas de changement well-known.

Secrets sops requis, tous créés par just configure-admin-host : mas-encryption-secret, mas-synapse-secret et mas-rsa-private-key.

dnf-mas (racine) encapsule mas-cli pour l’administration côté hôte : jetons d’inscription, promote-admin, register-user, syn2mas. MAS tourne avec DynamicUser et lit ses secrets depuis les credentials systemd, qui n’existent pas en dehors de l’unité en cours ; le wrapper reconstitue un répertoire de credentials équivalent à partir des fichiers sops, ce qui fonctionne que le service soit en marche ou non (syn2mas nécessite qu’il soit arrêté).

  • enable bool Activer le service matrix (synapse)
  • federation.enable bool Autoriser la fédération serveur-à-serveur. Faux bloque toute la fédération.
  • federation.whitelist listOf str Vide = fédérer avec tous les serveurs ; non vide = uniquement ces domaines (entrant + sortant).
  • mas.enable bool Déléguer toute l’authentification au Matrix Authentication Service (support Element X).
  • matrixRtc.enable bool Activer le backend MatrixRTC (LiveKit SFU) pour les appels de groupe Element Call.
  • friendRegistration.enable bool Autoriser les amis à s’auto-inscrire avec un jeton d’invitation (contrôlé par jeton).
  • bridges.whatsapp.enable bool Bridge Mautrix WhatsApp (connexion par QR code).
  • bridges.signal.enable bool Bridge Mautrix Signal (connexion par QR code).
  • bridges.telegram.enable bool Bridge Mautrix Telegram (connexion par numéro de téléphone).
  • bridges.messenger.enable bool Bridge Mautrix Facebook Messenger (connexion par cookies).
  • bridges.discord.enable bool Bridge Mautrix Discord (connexion par QR code, expérimental).
darkone.service.matrix = {
enable = false;
federation.enable = false;
federation.whitelist = [ ];
mas.enable = false;
matrixRtc.enable = false;
friendRegistration.enable = false;
bridges.whatsapp.enable = true;
bridges.signal.enable = true;
bridges.telegram.enable = true;
bridges.messenger.enable = true;
bridges.discord.enable = false;
};

Gestion de recettes Mealie

  • enable bool Activer le service mealie
darkone.service.mealie.enable = false;

Un service MinIO S3 local entièrement configuré. (wip)

Fournit un backend de stockage d’objets compatible S3 interne accessible uniquement sur 127.0.0.1:9000. L’interface Web de la console s’exécute sur 127.0.0.1:9001 pour l’administration et le débogage.

  • enable bool Activer le service MinIO S3 local
darkone.service.minio.enable = false;

Module de supervision : tableaux de bord Grafana + exportateur par nœud.

  • enable bool Activer la supervision avec prometheus, grafana et l’exportateur de nœud
  • isNode bool Est un nœud de supervision
  • kioskTarget str Cible (relative, sans /) pour la redirection automatique vers Grafana depuis la racine du domaine de supervision. Remplacée par le module Loki lorsqu’il est actif pour pointer vers un tableau de bord d’accueil multi-sources.
darkone.service.monitoring = {
enable = false;
isNode = lib.hasAttrByPath [ "features" "monitoring-node" ] host;
kioskTarget = "d/dnf-monitoring-home/home?kiosk";
};

Service Nextcloud entièrement configuré.

  • enable bool Activer le service nextcloud local

  • adminUser str Nom d’utilisateur administrateur pour Nextcloud

  • enableSsoRedirect bool Envoyer les utilisateurs directement à Kanidm au lieu d’afficher le formulaire de connexion Nextcloud (user_oidc allow_multiple_user_backends). Économise un clic à chaque connexion, y compris le Login Flow v2 du client desktop.

    Sans effet lorsque Kanidm est absent du réseau.

  • plugins listOf (enum (appstoreApps ++ shippedToggleableApps)) Applications Nextcloud à activer. Seuls calendar et contacts sont activés par défaut ; Talk (spreed), le tableau de bord, le flux d’activité, les photos et toutes les autres applications restent désactivés tant qu’ils ne figurent pas ici.

    user_oidc est requis pour le SSO Kanidm et est inclus de force indépendamment de cette liste.

darkone.service.nextcloud = {
enable = false;
adminUser = "admin";
enableSsoRedirect = true;
plugins = [ ];
};

Serveur + client NFS pour les partages domestiques.

  • enable bool Active le serveur NFS DNF (éviter l’activation manuelle)
  • serverDomain str FQDN du serveur NFS
darkone.service.nfs = {
enable = hasServer && (isServer || isClient);
serverDomain = "nfs";
};

Proxy de cache binaire Nix par zone (nginx proxy_cache).

Met en cache le cache Nix public (cache.nixos.org) sur la passerelle de la zone afin qu’un déploiement à l’échelle de la flotte tire chaque closure du WAN une seule fois, puis la sert sur le LAN à tous les autres hôtes. Les chemins construits localement sont servis directement par harmonia (voir harmonia.nix) ; ce proxy ne se place jamais devant harmonia.

  • enable bool le proxy de cache binaire Nix par zone (nginx devant cache.nixos.org)
  • maxSize str Taille maximale du cache sur disque ; au-delà, nginx évince les entrées les moins récemment utilisées.
  • roaming bool Hôte nomade (portable déplacé entre zones) : remplacer les substituters épinglés à la zone par les noms neutres de zone que le DNS de chaque zone résout vers ses propres services de cache. En dehors de toute zone DNF, les noms répondent NXDOMAIN instantanément et Nix retombe sur cache.nixos.org.
darkone.service.nix-cache = {
enable = false;
maxSize = "40g";
roaming = false;
};

Un wiki outline complètement configuré.

  • enable bool Activer le service outline local
darkone.service.outline.enable = false;

OxiCloud — Cloud souverain rapide (stockage de fichiers, WebDAV, CalDAV et CardDAV).

  • enable bool Activer le service OxiCloud local
darkone.service.oxicloud.enable = false;

Relais SMTP Postfix.

  • enable bool Activer le relais SMTP Postfix
darkone.service.postfix.enable = false;

Imprimantes et scanners.

  • enable bool Paquets utiles par défaut
  • loadAll bool Imprimantes et scanners complets
  • enableScanners bool Activer les scanners
  • enableHpPrinters bool Imprimantes HP uniquement
  • enableManualInstall bool Installation manuelle des pilotes
darkone.service.printing = {
enable = false;
loadAll = false;
enableScanners = false;
enableHpPrinters = false;
enableManualInstall = false;
};

Serveur de supervision Prometheus avec escalade déclarative via Alertmanager.

  • enable bool Activer le serveur de métriques + d’alerting Prometheus

  • retentionTime str Durée de rétention des métriques Prometheus

  • alerting.enable bool Activer Alertmanager (activé par défaut une fois les salons Matrix d’alerte provisionnés)

  • alerting.matrix.enable bool Diffuser les alertes dans les salons Matrix via le bot matrix-alertmanager

  • alerting.matrix.userId str ID utilisateur Matrix du bot d’alerte (par défaut depuis network.matrix.bot)

  • alerting.matrix.warningsRoom str ID du salon Matrix pour les avertissements (par défaut depuis network.matrix.warningsRoom)

  • alerting.matrix.incidentsRoom str ID du salon Matrix pour les incidents (par défaut depuis network.matrix.incidentsRoom)

  • alerting.email.enable bool Envoyer aussi les alertes critiques par mail (via le relais Postfix local)

  • alerting.email.to str Destinataire des mails d’alerte critique

  • alerting.network.enable bool Sonder l’atteignabilité réseau (passerelle/tailnet/DNS) avec blackbox_exporter

  • alerting.network.internetProbeTargets listOf str Adresses IP externes que la passerelle de zone ping pour détecter une coupure WAN. Si toutes échouent, ZoneInternetDown se déclenche et inhibe les alertes de down (erronées) des hôtes accessibles uniquement via le WAN (par ex. le HCS). Liste vide = désactivé.

  • alerting.network.httpProbeUrls listOf str URLs HTTP(S) sondées pour la vivacité (ServiceEndpointDown) et l’expiration du certificat TLS (CertificateExpiringSoon/Critical). Vide par défaut : lister les endpoints web publics à surveiller. Les redirections vers un login SSO (3xx) sont comptées comme up ; l’expiration du certificat est lue depuis la poignée de main TLS quelle que soit la réponse HTTP.

  • alerting.silenceOnRebuild bool Émettre le flag dnf-maintenance (textfile collector) afin que les reconstructions inhibent les alertes d’un nœud

  • alerting.thresholds attrs Remplacer les seuils d’alerte de ressources (voir les valeurs par défaut dans dnf/lib/alerts.nix)

  • alerting.silences listOf submodule Alertes connues et acceptées qui ne doivent jamais notifier. Chaque entrée devient une route Alertmanager vers le récepteur null : l’alerte se déclenche toujours et reste visible dans les interfaces Prometheus/Alertmanager/Grafana, elle ne parvient simplement plus à Matrix ni par mail.

    Déclaré sur l’hôte qui fait tourner Prometheus, car c’est là que les règles et routes de la zone sont générées. Un module consommateur à l’échelle de la flotte (usr/modules/alerts.nix) est l’endroit pratique : il est importé partout et ne prend effet que là où Prometheus tourne.

    • alert str Nom de l’alerte à mettre en sourdine (label alertname). Toujours restreint, afin que les niveaux de gravité voisins restent armés.
    • host nullOr str Restreindre le silence à un seul hôte. Null met en sourdine l’alerte pour toute la flotte.
    • matchers attrs Étiquettes de correspondance exacte supplémentaires, combinées en ET avec les autres (par ex. le point de montage ou le device visé par l’alerte).
    • reason str Pourquoi cette alerte est acceptée, et ce qui rendrait le silence supprimable.
darkone.service.prometheus = {
enable = false;
retentionTime = "30d";
alerting.enable = roomsReady;
alerting.matrix.enable = true;
alerting.matrix.userId = "@alertbot:domain.tld";
alerting.matrix.warningsRoom = "!warnings:domain.tld";
alerting.matrix.incidentsRoom = "!incidents:domain.tld";
alerting.email.enable = true;
alerting.email.to = "admin@${network.domain}";
alerting.network.enable = true;
alerting.network.internetProbeTargets = [ ];
alerting.network.httpProbeUrls = [ ];
alerting.silenceOnRebuild = true;
alerting.thresholds = { };
alerting.silences = [ ];
alerting.silences.alert = "DiskSpaceLow";
alerting.silences.host = "srv-main";
alerting.silences.matchers = { };
alerting.silences.reason = null;
};

Module de sauvegarde Restic : serveur REST + cibles de sauvegarde par hôte.

Exemple (configuration machine) :

darkone.service.restic = {
enable = true;
targets = [
{ name = "main"; root = "rest:http://restic.my-zone.my-domain.tld:8888";
zone = "ag"; categories = [ "system" "nfs" ]; }
];
};

Structure du dépôt par cible : un dépôt par catégorie, nommé d’après celle-ci.

<root>/<hostname>/system <- catégorie "system" (/ moins les exclusions)
<root>/<hostname>/nfs <- catégorie "nfs" (/srv/nfs/<...>)
<root>/<hostname>/medias <- catégorie "medias" (/srv/medias/<...>)
  • enable bool Activer le client de sauvegarde restic
  • enableDryRun bool Mode simulation
  • enableWaitRemoteFs bool Lancer les sauvegardes uniquement après remote-fs.target
  • enableServer bool Activer le serveur REST restic
  • listenAll bool Lier le serveur REST sur 0.0.0.0 (clients hors site)
  • serverDataDir str Racine de stockage locale du serveur REST (dépôts de tous les hôtes)
  • targets listOf submodule Destinations de sauvegarde pour cet hôte (chemin local ou URL REST)
    • name str Identifiant de cible, utilisé dans les noms de sauvegarde/unités (<category>-<name>)
    • root str Racine du dépôt : chemin local ou URL REST
    • zone str Zone sélectionnant la phrase de passe du dépôt (restic-password-<zone>)
    • categories listOf ( enum [ "system" "nfs" "medias" ] ) Contenu à sauvegarder vers cette cible
  • nfsPaths listOf str Répertoires NFS (/srv/nfs/<xxx>) inclus dans la catégorie ‘nfs’
  • mediasPaths listOf str Répertoires Médias (/srv/medias/<xxx>) inclus dans la catégorie ‘medias’
darkone.service.restic = {
enable = false;
enableDryRun = false;
enableWaitRemoteFs = false;
enableServer = false;
listenAll = false;
serverDataDir = "/mnt/backup/restic";
targets = [ ];
targets.name = "main";
targets.root = "rest:http://restic.${zone.domain}:${toString srvPort}";
targets.zone = zone.name;
targets.categories = [ ];
nfsPaths = [ ];
mediasPaths = [ ];
};

Un moteur de recherche durci et entièrement configuré.

  • enable bool Activer le proxy de recherche local
darkone.service.searx.enable = false;

Service client Tailscale pour le HCS.

  • enable bool Activer le client tailscale pour connecter le HCS
  • isGateway bool Ce nœud tailscale est une passerelle de sous-réseau
  • isExitNode bool Configurer ce client comme nœud de sortie
  • selfHeal.enable bool Chien de garde : détecter la déconnexion de headscale et redémarrer tailscaled.
  • autoPauseOnLan.enable bool Client nomade : mettre en pause tailscale (down) tant qu’il est branché sur un LAN d’une zone DNF connue, le reprendre ailleurs. Clients NetworkManager non-passerelles uniquement.
darkone.service.tailscale = {
enable = false;
isGateway = false;
isExitNode = false;
selfHeal.enable = true;
autoPauseOnLan.enable = false;
};

Serveur Coturn (matrix).

Ajouter des entrées DNS pour optimiser :

Type,Name,Priority,Pds,Port,Target
SRV,_stun._udp,0,0,3478,turn.mydomain.tld
SRV,_stun._tcp,0,0,3478,turn.mydomain.tld
SRV,_turn._udp,0,0,3478,turn.mydomain.tld
SRV,_turn._tcp,0,0,3478,turn.mydomain.tld
SRV,_turns._tcp,0,0,5349,turn.mydomain.tld
  • enable bool Activer le service turn local (visio)
darkone.service.turn.enable = false;

Un serveur vaultwarden entièrement configuré (wip).

  • enable bool Activer le service Vaultwarden local
  • enableSmtp bool Activer SMTP pour envoyer des emails (recommandé)
darkone.service.vaultwarden = {
enable = false;
enableSmtp = true;
};