First dnf test

This commit is contained in:
Darkone 2025-10-27 00:08:16 -02:00
commit d481a5e669
165 changed files with 41270 additions and 0 deletions

360
README.md Normal file
View file

@ -0,0 +1,360 @@
# Darkone NixOS Framework
> [!NOTE]
> A [documentation](https://darkone-linux.github.io) 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](https://github.com/zhaofengli/colmena) et [just](https://github.com/casey/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](https://github.com/nix-community/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](https://github.com/gethomepage/homepage) automatique** en fonction des services activés.
- **Sécurisation facile et fiable** avec [sops](https://github.com/Mic92/sops-nix).
## Organisation
A la racine :
- `dnf` -> modules, users, hosts (framework)
- `usr` -> Projet local (en écriture)
- `var` -> Fichiers générés et logs
- `src` -> Fichiers source du générateur
- `doc` -> Documentation du projet
La [structure complète est documentée ici](https://darkone-linux.github.io/doc/introduction/#structure).
> [!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
```shell
# Lancer le générateur
just generate
# Génération + formattages + checks
just clean
```
![Darkone NixOS Framework Generator](doc/src/assets/arch.webp)
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 :
```nix
# 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` :
```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 `users` et/ou `groups`.
- 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.
>
> ```sh
> # Création de l'iso d'installation
> nix build .#start-img-iso
> ```
>
> Création du poste et mises à jour :
>
> ```sh
> # 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.
```yaml
# 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 :
```sh
just apply gateway
```
## Justfile
```shell
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](https://wiki.nixos.org/wiki/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](https://github.com/authelia/authelia) ([module nix](https://search.nixos.org/options?channel=unstable&query=services.authelia))
- Intégration du module Authelia (cf. mes notes, fichier `PAM`).
- Gestion auto `secrets/users_database.yml` de authelia (via module ?).
- Conf auto pour nginx, immich, nextcloud...
- [ ] Stratégie de sauvegarde, plusieurs options :
- Ecosystème [Borg](https://github.com/borgbackup/borg) + [Borgmatic](https://github.com/borgmatic-collective/borgmatic) + [BorgWeb](https://github.com/borgbackup/borgweb) (plus maintenu ?) + [BorgWarehouse](https://github.com/ravinou/borgwarehouse) (bien mais pas intégré à nix) + [Vorta](https://vorta.borgbase.com/).
- Ecosystème [Restic](https://github.com/kopia/kopia), bon module nix, plus simple, plus "CLI", plus de connexions que Borg, moins performant.
- [Kopia](https://github.com/kopia/kopia) : très prometteur mais pas encore de module officiel pour NixOS.
- [ ] 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](https://github.com/juanfont/headscale) + [WireGuard](https://www.wireguard.com/)
### Planifié (secondaire)
- [ ] Intégration de [nixvim](https://nix-community.github.io/nixvim/).
- [ ] Gestion du secure boot avec [lanzaboote](https://github.com/nix-community/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](https://search.nixos.org/options?channel=unstable&from=0&size=50&sort=relevance&type=packages&query=services.mattermost), [mastodon](https://search.nixos.org/options?channel=unstable&from=0&size=50&sort=relevance&type=packages&query=services.mastodon), [matrix](https://nixos.wiki/wiki/Matrix), [gotosocial](https://search.nixos.org/options?channel=24.11&from=0&size=50&sort=relevance&type=packages&query=services.gotosocial), [zulip](https://zulip.com/self-hosting/)...
### Fait
- [x] Architecture modulaire.
- [x] Configuration colmena.
- [x] Configuration transversale générale.
- [x] Déploiements avec Just (build regular + apply colmena).
- [x] Générateur de configuration nix statique.
- [x] Modules système de base (hardware, i18n, doc, network, performances).
- [x] Modules console de base (zsh, git, shell).
- [x] Modules graphic de base (gnome, jeux de paquetages).
- [x] Hosts préconfigurés : minimal, serveur, desktop, laptop.
- [x] [Justfile](https://github.com/casey/just) pour checker et fixer les sources.
- [x] Postes types (bureautique, développeur, administrateur, enfant).
- [x] Builder d'[ISOs d'installation](https://github.com/nix-community/nixos-generators) pour les machines à intégrer.
- [x] Multi-réseaux.
- [x] Fixer les UIDs (des users).
- [x] Normaliser les données générées en séparant hosts et users.
- [x] Configuration multi-architecture (x86_64 & aarch64).
- [x] Passerelle type (dhcp, dns, ap, firewall, adguard, AD, VPN).
- [x] Documentation FR et EN.
- [x] [Nix Cache Proxy Server](https://github.com/kalbasit/ncps).
- [x] Homepage automatique en fonction des services activés.
- [x] Générateur automatique de documentation à partir des sources.
- [x] Sécurisation avec [fail2ban](https://github.com/fail2ban/fail2ban) ([module](https://search.nixos.org/options?channel=unstable&from=0&size=50&sort=relevance&type=packages&query=services.fail2ban)).
- [x] Gestion des mots de passe avec [sops](https://github.com/Mic92/sops-nix).
- [x] Passerelle : ajouter [adguard home](https://wiki.nixos.org/wiki/Adguard_Home).
### En pause
- [ ] Création de noeuds avec [nixos-anywhere](https://github.com/nix-community/nixos-anywhere) + [disko](https://github.com/nix-community/disko).
- [ ] Gestion centralisée des utilisateurs avec [lldap](https://github.com/lldap/lldap).
## Idées en cours d'étude
> [!CAUTION]
> Pas encore fonctionnel.
### Installation K8S préconfigurée
Master (déclaration qui fonctionne sans autre configuration) :
```nix
{
# 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) :
```nix
{
# Host k8s-slave-01
darkone.k8s.slave = {
enable = true;
master.hostname = "k8s-master";
};
}
```
Master avec options :
```nix
{
# 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
```shell
# 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](https://github.com/saltstack/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.
>
> ![Archi prévisionnelle avec Salt](doc/src/assets/new-network-architecture-black-tr.png)