| dnf | ||
| doc | ||
| src | ||
| usr | ||
| var | ||
| .gitignore | ||
| flake.lock | ||
| flake.nix | ||
| Justfile | ||
| LICENSE | ||
| README.md | ||
Darkone NixOS Framework
Note
A documentation is available.
Une infrastructure réseau déclarative complète :
- Structure cohérente et modulaire.
- Outils préconfigurés et fonctionnels.
- Organisation pensée pour la scalabilité.
Fonctionnalités
- Multi-hosts et multi-users, déploiements avec colmena et just.
- Profils de hosts pour serveurs, conteneurs et machines de travail.
- Profils de users proposant des confs types pour de nombreux utilisateurs.
- Modules complets et 100% fonctionnels avec un simple
.enable = true. - Modules "mixin" qui activent et configurent plusieurs modules en même temps.
- Architecture extensible, scalable, cohérente, personnalisable.
- Gestion des paramètres utilisateur avec home manager + profils de homes.
- Configuration transversale pour assurer la cohérence du réseau.
- Multi-réseaux, possibilité de déclarer plusieurs réseaux en une configuration.
- Homepage automatique en fonction des services activés.
- Sécurisation facile et fiable avec sops.
Organisation
A la racine :
dnf-> modules, users, hosts (framework)usr-> Projet local (en écriture)var-> Fichiers générés et logssrc-> Fichiers source du générateurdoc-> Documentation du projet
La structure complète est documentée ici.
Note
Cette structure peut être clonée pour chaque configuration et les parties communes synchronisées dans un dépôt "upstream" commun.
Le générateur
# Lancer le générateur
just generate
# Génération + formattages + checks
just clean
Son rôle est de générer une configuration statique pure à partir d'une définition de machines (hosts), utilisateurs et groupes en provenance de diverses sources (déclarations statiques, ldap, etc. configurées dans usr/config.yaml). La configuration nix générée est intégrée au dépôt afin d'être fixée et utilisée par le flake.
Exemples
Un poste bureautique complet :
# usr/modules/nix/host/admin-laptop.nix
{ lib, config, ... }:
let
cfg = config.darkone.host.admin-laptop;
in
{
options = {
darkone.host.admin-laptop.enable = lib.mkEnableOption "An admin laptop";
};
config = lib.mkIf cfg.enable {
# Darkone modules
darkone = {
# Based on laptop framework profile
host.laptop.enable = true;
# Advanced user (developper / admin)
theme.advanced.enable = true;
# Nix administration features
admin.nix.enable = true;
};
# Host specific state version
system.stateVersion = "25.05";
};
}
On déclare des machines correspondantes dans usr/config.yaml :
hosts:
static:
- hostname: "darkone-laptop"
name: "A PC"
profile: admin-laptop
users: [ "darkone", "john" ]
- Il existe aussi des profils de hosts pré-configurés dans
dnf/modules/nix/host. - Les utilisateurs liés au host sont déclarés via
userset/ougroups. - Utilisateurs et groupes peuvent être déclarés dans la configuration ou dans LDAP.
Note
On peut créer un nouveau poste informatique depuis l'iso d'installation.
# Création de l'iso d'installation nix build .#start-img-isoCréation du poste et mises à jour :
# Mettre à jour la passerelle pour enregistrer le poste sur le DNS just apply gateway # Echange les clés, récupère la conf hardware, génère la conf et applique just install pc01 # On peut ensuite mettre à jour à tout moment just apply pc01
Créer une passerelle complète
Elle contient un serveur DHCP + DNS auto-configurés avec tous les postes déclarés dans la conf.
# usr/config.yaml
network:
domain: "arthur.lan"
locale: "fr_FR.UTF-8"
timezone: "America/Miquelon"
gateway:
hostname: "gateway" # required (if a gateway exists)
wan:
interface: "enp1s0" # required
lan:
interfaces: ["enp2s0", "wlo1", "wlp0s20f0u1"] # required
ip: "192.168.1.1"
prefixLength: 24
dhcp-range:
- "192.168.1.200,192.168.1.230,24h"
hosts:
static:
- hostname: "gateway"
name: "Local Gateway"
profile: local-gateway
groups: [ "nix-admin" ]
Déploiement :
just apply gateway
Justfile
❯ just
Available recipes:
[apply]
apply on what='switch' # Apply configuration using colmena
apply-force on what='switch' # Apply with build-on-target + force repl. unk profiles
apply-local what='switch' # Apply the local host configuration
apply-verbose on what='switch' # Apply force with verbose options
[check]
check # Recursive deadnix on nix files
check-flake # Check the main flake
check-statix # Check with statix
[dev]
clean # format: fix + check + generate + format [alias: c]
develop # Launch a "nix develop" with zsh (dev env)
fix # Fix with statix [alias: f]
format # Recursive nixfmt on all nix files
generate # Update the nix generated files [alias: g]
pull # Pull common files from DNF repository
push # Push common files to DNF repository
[install]
copy-hw host # Extract hardware config from host
copy-id host # Copy pub key to the node (nix user must exists)
format-dnf-on host dev # Format and install DNF on an usb key (danger)
format-dnf-shell # Nix shell with tools to create usb keys
install host # New host: ssh cp id, extr. hw, clean, commit, apply
install-admin-host # Framework installation on local machine (builder / admin)
passwd user # Update a user password
passwd-default # Update the default DNF password
push-key host # Push the infrastructure key to the host
[manage]
enter host # Interactive shell to the host
fix-boot on # Multi-reinstall bootloader (using colmena)
fix-zsh on # Remove zshrc bkp to avoid error when replacing zshrc
gc on # Multi garbage collector (using colmena)
halt on # Multi-alt (using colmena)
reboot on # Multi-reboot (using colmena)
A faire (todo)
En cours
- Nextcloud + configuration multi-postes.
- Services distribués (aujourd'hui les services réseau sont sur la passerelle).
Planifié (prioritaire)
- just clean: détecter les fails, les afficher et s'arrêter.
- Serveurs et postes "externes" (administrable mais ne faisant pas partie du LAN).
- Configuration pour réseau extérieur (https, dns, vpn...).
- Accès externe au réseau : fqdn + lets encrypt + sécurité.
- Partages Samba pour windows + linux.
- Stratégie de synchronisation avec syncthing.
- SSO avec Authelia (module nix)
- Intégration du module Authelia (cf. mes notes, fichier
PAM). - Gestion auto
secrets/users_database.ymlde authelia (via module ?). - Conf auto pour nginx, immich, nextcloud...
- Intégration du module Authelia (cf. mes notes, fichier
- Stratégie de sauvegarde, plusieurs options :
- Optimisations réseau :
- Domaines locaux des machines -> 127.0.0.1 (shunt dnsmasq + adguard)
- Homepage GW -> accès aux services globaux installés sur le réseau hors GW
- Réseau distribué avec Headscale + WireGuard
Planifié (secondaire)
- Intégration de nixvim.
- Gestion du secure boot avec lanzaboote.
- Commandes d'introspection pour lister les hosts, users, modules activés par host, etc.
- Attributions d'emails automatiques par réseaux.
- Serveur de mails.
- Générateur / gestionnaire d'UIDs (pour les grands réseaux).
- Réseau social à voir : mattermost, mastodon, matrix, gotosocial, zulip...
Fait
- Architecture modulaire.
- Configuration colmena.
- Configuration transversale générale.
- Déploiements avec Just (build regular + apply colmena).
- Générateur de configuration nix statique.
- Modules système de base (hardware, i18n, doc, network, performances).
- Modules console de base (zsh, git, shell).
- Modules graphic de base (gnome, jeux de paquetages).
- Hosts préconfigurés : minimal, serveur, desktop, laptop.
- Justfile pour checker et fixer les sources.
- Postes types (bureautique, développeur, administrateur, enfant).
- Builder d'ISOs d'installation pour les machines à intégrer.
- Multi-réseaux.
- Fixer les UIDs (des users).
- Normaliser les données générées en séparant hosts et users.
- Configuration multi-architecture (x86_64 & aarch64).
- Passerelle type (dhcp, dns, ap, firewall, adguard, AD, VPN).
- Documentation FR et EN.
- Nix Cache Proxy Server.
- Homepage automatique en fonction des services activés.
- Générateur automatique de documentation à partir des sources.
- Sécurisation avec fail2ban (module).
- Gestion des mots de passe avec sops.
- Passerelle : ajouter adguard home.
En pause
- Création de noeuds avec nixos-anywhere + disko.
- Gestion centralisée des utilisateurs avec lldap.
Idées en cours d'étude
Caution
Pas encore fonctionnel.
Installation K8S préconfigurée
Master (déclaration qui fonctionne sans autre configuration) :
{
# Host k8s-master
darkone.k8s.master = {
enable = true;
modules = {
nextcloud.enable = true;
forgejo.enable = true;
};
};
}
Slave (connu et autorisé par master car déclaré dans la même conf nix) :
{
# Host k8s-slave-01
darkone.k8s.slave = {
enable = true;
master.hostname = "k8s-master";
};
}
Master avec options :
{
# Host k8s-master
darkone.k8s.master = {
enable = true;
modules = {
nextcloud.enable = true;
forgejo.enable = true;
};
preemtibleSlaves = {
hosts = [ "k8s-node-01" "k8s-node-02" ];
xen.hypervisors = [
{
dom0 = "xenserver-01";
vmTemplate = "k8s-node";
minStatic = 3;
maxPreemptible = 20;
}
];
};
};
}
Commandes d'introspection
# Host list with resume for each
just host
# Host details : settings, activated modules, user list...
just host my-pc
# User list with resume (name, mail, host count)
just user
# User details : content, feature list, host list...
just user darkone
Warning
Après de nombreuses heures d'utilisation, il apparaît que Colmena et Deploy-rs ne répondent pas à une gestion de postes NixOS à large échelle. Je vais remplacer la configuration colmena actuelle par un équivalent non-nix, certainement salt, pour administrer de nombreux postes en parallèle. Enfin, je ferai également en sorte de pouvoir builder et switcher chaque poste indépendemment au besoin, plutôt qu'être tributaire de la machine maître.

