how-to-install-and-manage Help

Common NixOS

Le common Nixos est un projet qui nous permet d'avoir un ensemble de modules pour NixOS. Ses modules vont représenter une base de configuration qui peut s'apparenter à une distribution NixOS.

Architecture

L'architecture de ce projet est divisé en plusieurs parties : On va retrouver un dossier nixosModules qui va contenir les modules NixOS. Ses modules sont organisés par type de configuration :

  • common: Ce module contient les configurations communes à tous les systèmes.

  • desktop: Ce module contient les configurations pour les systèmes de bureau.

  • vm: Ce module contient les configurations pour les machines virtuelles.

  • server: Ce module contient les configurations pour les serveurs.

Fonctionnalités liées

SSH

Pour la configuration SSH, nous avons décidé de mettre en place les bonnes pratiques, tout d'abord en désactivant l'authentification par mot de passe, puis en désactivant l'authentification par clavier interactif. Nous avons également décidé de désactiver le X11 forwarding. Et le DNS pour éviter les problèmes de résolution de nom.

Ensuite pour les algorithmes de négociation de clé, nous avons décidé d'utiliser les algorithmes recommandés.

# Better defaults for OpenSSH { config, lib, ... }: { services.openssh = { enable = true; settings.X11Forwarding = false; settings.KbdInteractiveAuthentication = false; settings.PasswordAuthentication = false; settings.UseDns = false; # Use key exchange algorithms recommended by `nixpkgs#ssh-audit` settings.KexAlgorithms = [ "curve25519-sha256" "curve25519-sha256@libssh.org" "diffie-hellman-group16-sha512" "diffie-hellman-group18-sha512" "sntrup761x25519-sha512@openssh.com" ]; }; }

Monitoring

Pour le monitoring, de chaque, nous installons par défaut l'agent node_exporter et un agent alloy pour les logs. Ces agents s'install sous forme d'options c'est donc à l'utissateurs de les activer ou non.

Voici à quoi ressemble l'option nixos

{ config, pkgs, lib, ... }: let hostname = config.networking.hostName; cfg = config.monitoring; in with lib; { options = { monitoring.loki.url = mkOption { default = "http://localhost:3100/loki/api/v1/push"; description = "URL to push logs to Loki"; type = types.str; }; }; config = { # Alloy services.alloy = { enable = true; configPath = "/etc/alloy"; }; systemd.services.alloy.serviceConfig = { SupplementaryGroups = ["systemd-journal"]; }; environment.etc."alloy/config.alloy".text = '' // Relabel les logs du journal pour extraire l'unité systemd loki.relabel "journal" { forward_to = [] rule { source_labels = ["__journal__systemd_unit"] target_label = "unit" } } // Source des logs depuis journald loki.source.journal "read" { forward_to = [loki.write.endpoint.receiver] relabel_rules = loki.relabel.journal.rules labels = { component = "loki.source.journal", host = "${hostname}", } } // Envoi des logs à Loki loki.write "endpoint" { endpoint { url = "${cfg.loki.url}" } } // Découverte des métriques de node_exporter //discovery.relabel "default" { // targets = [{ __address__ = "localhost:9100" }] //} //prometheus.scrape "node_exporter" { // targets = discovery.relabel.default.output // forward_to = [] //} ''; }; }

Et pour l'installation de l'agent node_exporter cela est défini dans le moudle server.

Et voici les options à rajouter dans les machines.

monitoring.loki.url = "https://loki.innovalia.cc/loki/api/v1/push";

Serial

La fonction serial est utilisé pour configurer une machine virtuelle via sa sortie série. Cela est utilisé pour les machines déployées dans le cloud. Ce module permet d'activer la sortie série dans le grub et dans le kernel.

{ boot.kernelParams = ["console=tty0" "console=ttyS0,115200"]; boot.loader.grub.extraConfig = '' serial --unit=0 --speed=115/* */200 terminal_input --append serial terminal_output --append serial ''; }

Neovim

Nous installons neovim par défaut sur nos machines. Et nous le configurons avec quelques options de base.

{pkgs, ...}: { programs.neovim = { enable = true; vimAlias = true; viAlias = true; configure = { customRC = '' set number set cursorline set cursorcolumn set mouse=a ''; }; }; }

Localisation

Étant donné que les personnes amené à utiliser ces machines sont francophones, nous avons décidé de mettre en place la localisation française par défaut.

{console.keyMap = "fr";}

Paquets par défaut

Nous décidons d'installer quelques paquets par défaut sur nos machines.

Pour la partie commune à tous les systèmes, nous installons les paquets suivants :

  • htop

  • tmux

  • curl

  • wget

Pour la partie serveur, nous installons les paquets suivants :

  • git

  • netbird

  • dnsutils

Pour la partie bureau, nous installons les paquets suivants :

  • Firefox

  • Vscode

  • Remmina

Template

Les templates sont utilisé pour cloner une base de configuration nixos, pour avoir tous les éléments nécessaire pour installer une machine.

Le template va contenir les éléments suivants :

  • Un fichier flake.nix qui va contenir la configuration de base du template.

  • Un fichier network.nix qui va contenir la configuration réseau du template.

  • Un fichier hardware-configuration.nix qui va contenir la configuration matérielle du template.

  • Un fichier misc.nix qui va contenir la configuration divers du template.

  • Un fichier disko.nix qui va contenir la configuration de disko du template.

  • Un fichier users.nix qui va contenir la configuration des utilisateurs du template.

Last modified: 22 July 2025