Skip to main content

Introduction aux Flakes

Qu’est-ce qu’un Flake ?

Les Flakes sont une fonctionnalité expérimentale de Nix qui améliore la reproductibilité et la gestion des dépendances. Un Flake verrouille les versions exactes de toutes les dépendances.

Pourquoi utiliser les Flakes ?

  • Reproductibilité totale : versions exactes verrouillées dans flake.lock
  • Pas de canaux : les sources sont explicites
  • Meilleure organisation : structure standardisée
  • Composition facile : réutilisation de configurations

Activer les Flakes

Dans configuration.nix :

{
  nix.settings.experimental-features = [ "nix-command" "flakes" ];
}

Puis sudo nixos-rebuild switch.

Structure d’un Flake

Un Flake est défini par un fichier flake.nix :

{
  description = "Ma configuration NixOS";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05";
  };

  outputs = { self, nixpkgs }: {
    nixosConfigurations.mon-serveur = nixpkgs.lib.nixosSystem {
      system = "x86_64-linux";
      modules = [
        ./configuration.nix
      ];
    };
  };
}

Convertir une configuration existante en Flake

Structure de fichiers :

/etc/nixos/
├── flake.nix
├── flake.lock          # généré automatiquement
├── configuration.nix
└── hardware-configuration.nix

Créer flake.nix :

{
  description = "Configuration NixOS";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05";
  };

  outputs = { self, nixpkgs }: {
    nixosConfigurations.mon-serveur = nixpkgs.lib.nixosSystem {
      system = "x86_64-linux";
      modules = [
        ./configuration.nix
      ];
    };
  };
}

Générer le lock file :

cd /etc/nixos
sudo nix flake update

Appliquer la configuration :

sudo nixos-rebuild switch --flake .#mon-serveur

Commandes Flake courantes

Mettre à jour les dépendances :

nix flake update

Mettre à jour une seule dépendance :

nix flake lock --update-input nixpkgs

Voir les entrées du Flake :

nix flake show

Vérifier le Flake :

nix flake check

Exemple avec Home Manager

Les Flakes permettent d’intégrer facilement Home Manager :

{
  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05";
    home-manager = {
      url = "github:nix-community/home-manager/release-24.05";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = { self, nixpkgs, home-manager }: {
    nixosConfigurations.mon-serveur = nixpkgs.lib.nixosSystem {
      system = "x86_64-linux";
      modules = [
        ./configuration.nix
        home-manager.nixosModules.home-manager
        {
          home-manager.useGlobalPkgs = true;
          home-manager.useUserPackages = true;
          home-manager.users.admin = import ./home.nix;
        }
      ];
    };
  };
}

Multi-machines avec Flakes

Un Flake peut définir plusieurs configurations :

{
  outputs = { self, nixpkgs }: {
    nixosConfigurations = {
      serveur-web = nixpkgs.lib.nixosSystem {
        system = "x86_64-linux";
        modules = [ ./machines/serveur-web.nix ];
      };

      serveur-db = nixpkgs.lib.nixosSystem {
        system = "x86_64-linux";
        modules = [ ./machines/serveur-db.nix ];
      };
    };
  };
}

Déployer :

sudo nixos-rebuild switch --flake .#serveur-web
sudo nixos-rebuild switch --flake .#serveur-db

Avantages des Flakes

Sans FlakesAvec Flakes
Canaux systèmeSources explicites
Versions flottantesVersions verrouillées
Difficile à partagerFacilement reproductible
Mise à jour globaleMise à jour granulaire