Modules de service
✨ darkone.service.adguardhome
Section intitulée « ✨ darkone.service.adguardhome »AdGuard Home entièrement configuré pour passerelle / routeur local.
- enable
boolActive le service adguardhome local
darkone.service.adguardhome.enable = false;✨ darkone.service.ai
Section intitulée « ✨ darkone.service.ai »Intelligence artificielle locale (open-webui + ollama + llms).
- enable
boolActiver le service d’IA local
darkone.service.ai.enable = false;✨ darkone.service.audio
Section intitulée « ✨ darkone.service.audio »Services audio : alsa, pulse (pas jack pour le moment).
Ajoute automatiquement les utilisateurs au groupe audio quand il est activé.
- enable
boolActiver le système sonore
darkone.service.audio.enable = false;✨ darkone.service.dnsmasq
Section intitulée « ✨ darkone.service.dnsmasq »dnsmasq pré-configuré pour la passerelle locale / routeur.
- enable
boolActiver le service dnsmasq local
darkone.service.dnsmasq.enable = false;✨ darkone.service.docs
Section intitulée « ✨ darkone.service.docs »Un module LaSuite Docs entièrement configuré.
- enable
boolActiver le service de documentation local - s3Host
strNom d’hôte du backend S3 - s3Port
portPort du backend S3 - s3Bucket
strNom 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";};✨ darkone.service.element
Section intitulée « ✨ darkone.service.element »Client web Element pour le service matrix local.
- enable
boolActiver le service element local
darkone.service.element.enable = false;✨ darkone.service.fail2ban
Section intitulée « ✨ darkone.service.fail2ban »Module fail2ban spécifique à DNF.
- enable
boolActiver fail2ban avec les spécificités DNF
darkone.service.fail2ban.enable = false;✨ darkone.service.forgejo
Section intitulée « ✨ darkone.service.forgejo »Une forge git forgejo entièrement configurée.
- enable
boolActiver le service forgejo local
darkone.service.forgejo.enable = false;✨ darkone.service.garage
Section intitulée « ✨ darkone.service.garage »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
boolActiver le service Garage S3 local - srvPort
portPort S3 API exposé sur l’IP interne - s3Region
strNom de la région S3 (doit correspondre à la config du consommateur) - capacity
strIndice 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";};✨ darkone.service.geneweb
Section intitulée « ✨ darkone.service.geneweb »GeneWeb — Service de généalogie puissant.
- enable
boolActiver le service de généalogie GeneWeb local - enablePasswords
boolActiver les mots de passe sops (non recommandé)
darkone.service.geneweb = { enable = false; enablePasswords = false;};✨ darkone.service.harmonia
Section intitulée « ✨ darkone.service.harmonia »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
boolActiver un serveur de cache binaire Nix Harmonia local
darkone.service.harmonia.enable = false;✨ darkone.service.headscale
Section intitulée « ✨ darkone.service.headscale »Un service headscale entièrement configuré pour HCS.
- enable
boolActiver le service DNF headscale - enableGRPC
boolOuvrir le port TCP GRPC
darkone.service.headscale = { enable = false; enableGRPC = false;};✨ darkone.service.home-assistant
Section intitulée « ✨ darkone.service.home-assistant »Un Home Assistant avec certains plugins (en cours).
- enable
boolActiver home-assistant
darkone.service.home-assistant.enable = false;✨ darkone.service.homepage
Section intitulée « ✨ darkone.service.homepage »Tableau de bord de page d’accueil configuré dynamiquement pour votre réseau local.
- enable
boolActiver le tableau de bord de la page d’accueil + httpd + hôte - protect
boolRestreindre la page d’accueil aux utilisateurs Kanidm authentifiés (oauth2-proxy forward auth) - localServices
listOf attrsServices à ajouter dans la section Applications locales - globalServices
listOf attrsServices communs du réseau & accessibles publiquement - remoteServices
listOf attrsServices à ajouter dans la section Applications distantes - bookmarks
listOf attrsRemplacer les favoris par défaut (liens) - widgets
listOf attrsRemplacer les widgets par défaut
darkone.service.homepage = { enable = false; protect = true; localServices = [ ]; globalServices = [ ]; remoteServices = [ ]; bookmarks = [ ]; widgets = [ ];};✨ darkone.service.idm
Section intitulée « ✨ darkone.service.idm »Service DNF Kanidm (gestionnaire d’identité).
- enable
boolActiver l’authentification unique locale avec Kanidm - oauth2
attrsModèles de client OAuth2/OIDC fournis par les modules de service. Kanidm provisionne un client par entrée correspondante dansnetwork.services, avecclientId = dnfLib.oauth2ClientName.- enable
boolIndique s’il faut provisionner des clients OAuth2 pour ce modèle. - clientName
nullOr strRemplacer le nom du client kanidm. Par défaut : dnfLib.oauth2ClientName. - displayName
strNom lisible montré sur l’écran de consentement kanidm. - imageFile
pathIcône de l’application. Téléchargée de nouveau à chaque exécution de kanidm-provision. - redirectPaths
listOf strChemins de redirection OAuth2 (un par URL de rappel acceptée). - landingPath
strChemin du point d’entrée de connexion automatique sur le service. - enableLegacyCrypto
boolAutoriser les anciens algorithmes de signature JWT (par ex. RS256). - allowInsecureClientDisablePkce
boolDésactiver PKCE sur le client (uniquement pour les clients qui ne l’implémentent pas). - preferShortUsername
nullOr boolUtiliser le nom d’utilisateur court (sans domaine) dans la réclamationpreferred_username. - extra
attrsAttributs supplémentaires fusionnés dans le client provisionné (claimMaps, etc.).
- enable
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 = { };};✨ darkone.service.immich
Section intitulée « ✨ darkone.service.immich »Service Immich (gestion de photos) entièrement configuré.
- enable
boolActiver le service immich local - enableMachineLearning
boolActiver les fonctionnalités d’apprentissage automatique (reconnaissance faciale, détection d’objets) - enableRedis
boolActiver Redis pour la mise en cache (recommandé pour les performances)
darkone.service.immich = { enable = false; enableMachineLearning = false; enableRedis = false;};✨ darkone.service.jellyfin
Section intitulée « ✨ darkone.service.jellyfin »Un serveur jellyfin entièrement configuré.
- enable
boolActiver le service jellyfin
darkone.service.jellyfin.enable = false;✨ darkone.service.jitsi-meet
Section intitulée « ✨ darkone.service.jitsi-meet »Un service jitsi-meet entièrement configuré.
- enable
boolActiver le service jitsi-meet local
darkone.service.jitsi-meet.enable = false;✨ darkone.service.loki
Section intitulée « ✨ darkone.service.loki »Loki + Alloy, statistiques HTTP avec grafana.
- enable
boolDéploie le serveur Loki + la source de données Grafana (colocalisée avec Grafana). - isClient
boolDéploie Alloy pour collecter les journaux d’accès Caddy locaux. - retentionTime
strDuré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";};✨ darkone.service.matrix
Section intitulée « ✨ darkone.service.matrix »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 »).
Fédération
Section intitulée « Fédération »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.
Authentification nouvelle génération (MAS)
Section intitulée « Authentification nouvelle génération (MAS) »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
boolActiver le service matrix (synapse) - federation.enable
boolAutoriser la fédération entre serveurs. False bloque toute fédération. - federation.whitelist
listOf strVide = fédérer avec tous les serveurs ; non vide = seuls ces domaines (entrante + sortante). - mas.enable
boolDéléguer toute l’authentification à Matrix Authentication Service (support Element X). - friendRegistration.enable
boolPermettre aux amis de s’inscrire avec un jeton d’invitation (protégé par jeton). - bridges.whatsapp.enable
boolPont Mautrix WhatsApp (connexion par QR code). - bridges.signal.enable
boolPont Mautrix Signal (connexion par QR code). - bridges.telegram.enable
boolPont Mautrix Telegram (connexion par numéro de téléphone). - bridges.messenger.enable
boolPont Mautrix Facebook Messenger (connexion par cookies). - bridges.discord.enable
boolPont 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;};✨ darkone.service.mealie
Section intitulée « ✨ darkone.service.mealie »Gestion de recettes Mealie
- enable
boolActiver le service mealie
darkone.service.mealie.enable = false;✨ darkone.service.minio
Section intitulée « ✨ darkone.service.minio »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
boolActiver le service MinIO S3 local
darkone.service.minio.enable = false;✨ darkone.service.monitoring
Section intitulée « ✨ darkone.service.monitoring »Module de supervision : tableaux de bord Grafana + exportateur par nœud.
- enable
boolActiver la supervision avec Prometheus, Grafana et l’exportateur de nœud - isNode
boolEst un nœud de supervision - kioskTarget
strCible (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";};✨ darkone.service.nextcloud
Section intitulée « ✨ darkone.service.nextcloud »Service Nextcloud complètement configuré.
- enable
boolActiver le service Nextcloud local - adminUser
strNom d’utilisateur admin pour Nextcloud - plugins
listOf (enum (appstoreApps ++ shippedToggleableApps))Applications Nextcloud à activer. Seulescalendaretcontactssont 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 = [ ];};✨ darkone.service.nfs
Section intitulée « ✨ darkone.service.nfs »Serveur NFS + client pour les partages résidentiels.
- enable
boolActiver le serveur NFS DNF (éviter d’activer manuellement) - serverDomain
strFQDN du serveur NFS
darkone.service.nfs = { enable = hasServer && (isServer || isClient); serverDomain = "nfs";};✨ darkone.service.nix-cache
Section intitulée « ✨ darkone.service.nix-cache »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
boolle proxy de cache binaire Nix par zone (nginx devant cache.nixos.org) - maxSize
strTaille maximale du cache disque ; nginx évince les entrées les moins récemment utilisées au-delà. - roaming
boolHô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;};✨ darkone.service.outline
Section intitulée « ✨ darkone.service.outline »Un wiki outline complètement configuré.
- enable
boolActiver le service outline local
darkone.service.outline.enable = false;✨ darkone.service.oxicloud
Section intitulée « ✨ darkone.service.oxicloud »OxiCloud — Cloud souverain rapide (stockage de fichiers, WebDAV, CalDAV et CardDAV).
- enable
boolActiver le service OxiCloud local
darkone.service.oxicloud.enable = false;✨ darkone.service.postfix
Section intitulée « ✨ darkone.service.postfix »Relais SMTP Postfix.
- enable
boolActiver le relais SMTP Postfix
darkone.service.postfix.enable = false;✨ darkone.service.printing
Section intitulée « ✨ darkone.service.printing »Imprimantes et scanners.
- enable
boolPaquets utiles par défaut - loadAll
boolImprimantes et scanners complets - enableScanners
boolActiver les scanners - enableHpPrinters
boolImprimantes HP uniquement - enableManualInstall
boolInstallation manuelle des pilotes
darkone.service.printing = { enable = false; loadAll = false; enableScanners = false; enableHpPrinters = false; enableManualInstall = false;};✨ darkone.service.prometheus
Section intitulée « ✨ darkone.service.prometheus »Serveur de monitoring Prometheus avec escalade déclarative via Alertmanager.
- enable
boolActive le serveur de métriques + alerting Prometheus - retentionTime
strDurée de rétention des métriques Prometheus - alerting.enable
boolActive Alertmanager (activé par défaut une fois les salons d’alerte Matrix provisionnés) - alerting.matrix.enable
boolEnvoie les alertes dans les salons Matrix via le bot matrix-alertmanager - alerting.matrix.userId
strID Matrix du bot d’alerte (par défaut depuis network.matrix.bot) - alerting.matrix.warningsRoom
strID Matrix du salon pour les warnings (par défaut depuis network.matrix.warningsRoom) - alerting.matrix.incidentsRoom
strID Matrix du salon pour les incidents (par défaut depuis network.matrix.incidentsRoom) - alerting.email.enable
boolEnvoie aussi les alertes critiques par mail (via le relais Postfix local) - alerting.email.to
strDestinataire des mails d’alerte critique - alerting.network.enable
boolSonde la reachabilité réseau (passerelle/tailnet/DNS) avec blackbox_exporter - alerting.network.internetProbeTargets
listOf strIPs externes que la passerelle de zone ping pour détecter une panne WAN. Quand toutes échouent,ZoneInternetDownse 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 strURLs 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
boolEnvoie le flag dnf-maintenance (collecteur textfile) pour que les rebuilds inhibent les alertes d’un nœud - alerting.thresholds
attrsSurcharge 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 = { };};✨ darkone.service.restic
Section intitulée « ✨ darkone.service.restic »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
boolActive le client de sauvegarde restic - enableDryRun
boolMode essai (dry run) - enableWaitRemoteFs
boolExécuter les sauvegardes seulement après remote-fs.target - enableServer
boolActive le serveur REST restic - serverDataDir
strRacine 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
strIdentifiant de cible, utilisé dans les noms d’unités de sauvegarde (<catégorie>-<nom>) - root
strRacine du dépôt : chemin local ou URL REST - zone
strZone 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
- name
- nfsPaths
listOf strRépertoires NFS (/srv/nfs/<xxx>) inclus dans la catégorie « nfs » - mediasPaths
listOf strRé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 = [ ];};✨ darkone.service.searx
Section intitulée « ✨ darkone.service.searx »Un moteur de recherche durci et entièrement configuré.
- enable
boolActiver le proxy de recherche local
darkone.service.searx.enable = false;✨ darkone.service.tailscale
Section intitulée « ✨ darkone.service.tailscale »Service client Tailscale pour HCS.
- enable
boolActiver le client Tailscale pour connecter HCS - isGateway
boolCe nœud Tailscale est une passerelle de sous-réseau - isExitNode
boolConfigurer ce client comme nœud de sortie - selfHeal.enable
boolWatchdog : détecter une déconnexion headscale et redémarrer tailscaled. - autoPauseOnLan.enable
boolClient 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;};✨ darkone.service.turn
Section intitulée « ✨ darkone.service.turn »Serveur Coturn (matrix).
Ajouter des entrées DNS pour optimiser :
Type,Name,Priority,Pds,Port,TargetSRV,_stun._udp,0,0,3478,turn.mydomain.tldSRV,_stun._tcp,0,0,3478,turn.mydomain.tldSRV,_turn._udp,0,0,3478,turn.mydomain.tldSRV,_turn._tcp,0,0,3478,turn.mydomain.tldSRV,_turns._tcp,0,0,5349,turn.mydomain.tld- enable
boolActiver le service turn local (visio)
darkone.service.turn.enable = false;✨ darkone.service.vaultwarden
Section intitulée « ✨ darkone.service.vaultwarden »Un serveur vaultwarden entièrement configuré (wip).
- enable
boolActiver le service Vaultwarden local - enableSmtp
boolActiver SMTP pour envoyer des emails (recommandé)
darkone.service.vaultwarden = { enable = false; enableSmtp = true;};