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 locale / routeur.

  • enable bool Activer 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 Activer le service forgejo local
darkone.service.forgejo.enable = false;

Un service Garage S3 local entièrement configuré.

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

  • enable bool Activer le service Garage S3 local
  • srvPort port Port S3 API exposé sur l’IP interne
  • s3Region str Nom de la région S3 (doit correspondre à la config du consommateur)
  • capacity str Indice de capacité de stockage du nœud transmis à garage layout assign. Utilisé uniquement au premier démarrage pour l’initialisation de la disposition ; n’agit pas comme un quota strict sur le système de fichiers sous-jacent. Suffixes supportés : 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 en HTTP brut (port 5000), signés avec la clé de cache binaire du déploiement. Activation par hôte depuis usr/config.yaml (services.harmonia), comme tout autre service DNF.

  • enable bool Activer 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é).

  • enable bool Activer l’authentification unique locale avec Kanidm
  • oauth2 attrs Modèles de client OAuth2/OIDC fournis par les modules de service. Kanidm provisionne un client par entrée correspondante dans network.services, avec clientId = dnfLib.oauth2ClientName.
    • enable bool Indique s’il faut provisionner des clients OAuth2 pour ce modèle.
    • clientName nullOr str Remplacer le nom du client kanidm. Par défaut : dnfLib.oauth2ClientName.
    • displayName str Nom lisible montré sur l’écran de consentement kanidm.
    • imageFile path Icône de l’application. Téléchargée de nouveau à chaque exécution de kanidm-provision.
    • redirectPaths listOf str Chemins de redirection OAuth2 (un par URL de rappel acceptée).
    • landingPath str Chemin du point d’entrée de connexion automatique sur le service.
    • enableLegacyCrypto bool Autoriser les anciens algorithmes de signature JWT (par ex. RS256).
    • allowInsecureClientDisablePkce bool Désactiver PKCE sur le client (uniquement pour les clients qui ne l’implémentent pas).
    • preferShortUsername nullOr bool Utiliser le nom d’utilisateur court (sans domaine) dans la réclamation preferred_username.
    • extra attrs Attributs supplémentaires fusionnés dans le client provisionné (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 + la source de données Grafana (colocalisée avec Grafana).
  • isClient bool Déploie Alloy pour collecter les journaux d’accès Caddy locaux.
  • retentionTime str Durée de rétention des journaux dans Loki (30 jours par défaut).
darkone.service.loki = {
enable = config.darkone.service.monitoring.enable;
isClient = config.services.caddy.enable;
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 est configurable 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 d’autorisation (entrante + sortante).

La découverte reste verrouillée quoi qu’il arrive (salons absents des annuaires distants, profils privés en fédération) donc le réseau est joignable mais pas explorable.

L’auto-inscription d’amis (friendRegistration.enable) ouvre des comptes locaux avec mot de passe protégés par jeton, en complément des utilisateurs OIDC Kanidm. La création d’un jeton nécessite un administrateur du serveur (API admin Synapse / interface Synapse-Admin) ; avec MAS activé, créez-le avec mas-cli manage issue-user-registration-token sur l’hôte à la place.

mas.enable délègue toute l’authentification à Matrix Authentication Service (nécessaire pour Element X, connexion par QR, portail libre-service /account). Kanidm reste la source d’identité : MAS devient le client OIDC à la place de synapse, et synapse ne fait plus qu’interroger MAS pour l’inspection des jetons. Servi sur le même vhost : MAS possède la racine et les endpoints d’auth compat, synapse garde /_matrix/* et /_synapse/* ; la découverte client est automatique (synapse sert auth_metadata lui-même), donc aucun changement de well-known.

Secrets sops requis (openssl rand -hex 32 sauf indication contraire) : mas-encryption-secret, mas-synapse-secret, et mas-rsa-private-key (openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096).

  • enable bool Activer le service matrix (synapse)
  • federation.enable bool Autoriser la fédération entre serveurs. False bloque toute fédération.
  • federation.whitelist listOf str Vide = fédérer avec tous les serveurs ; non vide = seuls ces domaines (entrante + sortante).
  • mas.enable bool Déléguer toute l’authentification à Matrix Authentication Service (support Element X).
  • friendRegistration.enable bool Permettre aux amis de s’inscrire avec un jeton d’invitation (protégé par jeton).
  • bridges.whatsapp.enable bool Pont Mautrix WhatsApp (connexion par QR code).
  • bridges.signal.enable bool Pont Mautrix Signal (connexion par QR code).
  • bridges.telegram.enable bool Pont Mautrix Telegram (connexion par numéro de téléphone).
  • bridges.messenger.enable bool Pont Mautrix Facebook Messenger (connexion par cookies).
  • bridges.discord.enable bool Pont Mautrix Discord (connexion par QR code, expérimental).
darkone.service.matrix = {
enable = false;
federation.enable = true;
federation.whitelist = [ ];
mas.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. Surchargé 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 complètement configuré.

  • enable bool Activer le service Nextcloud local
  • adminUser str Nom d’utilisateur admin pour Nextcloud
  • plugins listOf (enum (appstoreApps ++ shippedToggleableApps)) Applications Nextcloud à activer. Seules calendar et contacts sont activées par défaut ; Talk (spreed), le tableau de bord, le flux d’activité, les photos et toute autre application restent désactivées tant qu’elles ne sont pas listées 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";
plugins = [ ];
};

Serveur NFS + client pour les partages résidentiels.

  • enable bool Activer le serveur NFS DNF (éviter d’activer manuellement)
  • 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 zone pour qu’un déploiement sur tout le parc tire chaque closure du WAN une fois, puis la serve sur le LAN à tous les autres hôtes. Les chemins construits localement sont servis directement depuis harmonia (voir harmonia.nix) ; ce proxy ne fait jamais face à harmonia.

  • enable bool le proxy de cache binaire Nix par zone (nginx devant cache.nixos.org)
  • maxSize str Taille maximale du cache disque ; nginx évince les entrées les moins récemment utilisées au-delà.
  • roaming bool Hôte nomade (portable déplacé entre zones) : remplace les substituters lié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 deviennent instantanément NXDOMAIN et Nix se rabat 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 monitoring Prometheus avec escalade déclarative via Alertmanager.

  • enable bool Active le serveur de métriques + alerting Prometheus
  • retentionTime str Durée de rétention des métriques Prometheus
  • alerting.enable bool Active Alertmanager (activé par défaut une fois les salons d’alerte Matrix provisionnés)
  • alerting.matrix.enable bool Envoie les alertes dans les salons Matrix via le bot matrix-alertmanager
  • alerting.matrix.userId str ID Matrix du bot d’alerte (par défaut depuis network.matrix.bot)
  • alerting.matrix.warningsRoom str ID Matrix du salon pour les warnings (par défaut depuis network.matrix.warningsRoom)
  • alerting.matrix.incidentsRoom str ID Matrix du salon pour les incidents (par défaut depuis network.matrix.incidentsRoom)
  • alerting.email.enable bool Envoie 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 Sonde la reachabilité réseau (passerelle/tailnet/DNS) avec blackbox_exporter
  • alerting.network.internetProbeTargets listOf str IPs externes que la passerelle de zone ping pour détecter une panne WAN. Quand toutes échouent, ZoneInternetDown se déclenche et inhibe les alertes (faussement) down des hôtes joignables uniquement via le WAN (ex. : le HCS). Vide désactive.
  • 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 qui méritent une surveillance. Les redirections vers un SSO (3xx) comptent comme up ; l’expiration du cert est lue depuis la handshake TLS, indépendamment du statut HTTP.
  • alerting.silenceOnRebuild bool Envoie le flag dnf-maintenance (collecteur textfile) pour que les rebuilds inhibent les alertes d’un nœud
  • alerting.thresholds attrs Surcharge les seuils d’alerte ressource (voir les défauts dans dnf/lib/alerts.nix)
darkone.service.prometheus = {
enable = false;
retentionTime = "30d";
alerting.enable = roomsReady;
alerting.matrix.enable = true;
alerting.matrix.userId = "@alertbot:poncon.fr";
alerting.matrix.warningsRoom = "!warnings:poncon.fr";
alerting.matrix.incidentsRoom = "!incidents:poncon.fr";
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 = { };
};

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" ]; }
];
};

Arborescence du dépôt par cible :

<root>/<hostname>/system <- catégorie « system » (/) moins les exclusions
<root>/<hostname>/srv/nfs <- catégorie « nfs » (/srv/nfs/<...>)
<root>/<hostname>/srv/medias <- catégorie « medias » (/srv/medias/<...>)
  • enable bool Active le client de sauvegarde restic
  • enableDryRun bool Mode essai (dry run)
  • enableWaitRemoteFs bool Exécuter les sauvegardes seulement après remote-fs.target
  • enableServer bool Active le serveur REST restic
  • serverDataDir str Racine de stockage locale du serveur REST (dépôts de tous les hôtes)
  • targets listOf ( submodule { options = { name = lib.mkOption { type = str; default = "main"; description = "Identifiant de cible, utilisé dans les noms d'unités de sauvegarde (<catégorie>-<nom>)"; }; root = lib.mkOption { type = str; default = "/mnt/backup/restic"; example = "rest:http://restic.${zone.domain}:${toString srvPort}"; description = "Racine du dépôt : chemin local ou URL REST"; }; zone = lib.mkOption { type = str; default = zone.name; description = "Zone sélectionnant la phrase de passe du dépôt (restic-password-<zone>)"; }; categories = lib.mkOption { type = listOf ( enum [ "system" "nfs" "medias" ] ); default = [ "system" ]; description = "Éléments à sauvegarder sur cette cible"; }; }; } ) Destinations de sauvegarde pour cet hôte (chemin local ou URL REST)
    • name str Identifiant de cible, utilisé dans les noms d’unités de sauvegarde (<catégorie>-<nom>)
    • 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" ] ) Éléments à sauvegarder sur cette cible
  • nfsPaths listOf str Répertoires NFS (/srv/nfs/<xxx>) inclus dans la catégorie « nfs »
  • mediasPaths listOf str Répertoires medias (/srv/medias/<xxx>) inclus dans la catégorie « medias »
darkone.service.restic = {
enable = false;
enableDryRun = false;
enableWaitRemoteFs = false;
enableServer = 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 HCS.

  • enable bool Activer le client Tailscale pour connecter 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 Watchdog : détecter une déconnexion headscale et redémarrer tailscaled.
  • autoPauseOnLan.enable bool Client itinérant : mettre en pause tailscale (down) lorsqu’il est branché sur un réseau local DNF connu, le reprendre ailleurs. Clients NetworkManager non-passerelle 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;
};