Comment gérer ses dotfiles?

Bonjour à tous,

## ~/.dotfiles
configuration.nix                  -> /etc/nixos/configuration.nix
flake.lock                         -
flake.nix                          -
gnome.nix                          -> /etc/nixos/gnome.nix
hardware-configuration.nix         -> /etc/nixos/hardware-configuration.nix
hdd.nix                            -> /etc/nixos/hdd.nix
home.nix                           -> ~/.config/home-manager/home.nix
pcloud.nix                         -> /etc/nixos/pcloud.nix
starship.toml                      -> ~/.config/starship.toml
vm.nix                             -> /etc/nixos/vm.nix

Comment gérer ses fichiers ils sont tous centralisés dans ~/.dotflies et viennent de différents endroits ?
Utilise t’on des liens symboliques pour gérer tout ça ?
Si oui ‘stow’ ou ‘ln’ ?
Je suis entrain de lire : “Enabling NixOS with Flakes | NixOS & Flakes Book” et il parle de mettre flake.nix dans /etc/nixos/
Qu’en pensez vous ?

Avec nix, la solution usuelle est d’utiliser Home Manager (c.f. Home Manager Manual).

Home Manager is a Nix-powered tool for reproducible management of the contents of users’ home directories. This includes programs, configuration files, environment variables and, well… arbitrary files.

1 Like

Je l’utilise, c’est lui qui m’as fait me poser ce genre de questions, car depuis la creation de mon dossier .dotfiles j’ai le double de fichiers à gérer.

car depuis la creation de mon dossier .dotfiles j’ai le double de fichiers à gérer

Il faudrait que tu détailles un peu ton setup pour que l’on puisse comprendre si c’est un problème…

D’après ce que tu as partagé dans le premier post, il semblerait que tu mettes dans ton repository .dotfiles des fichiers qui sont à la fois à destination de l’installation de l’host (e.g. configuration.nix), et à la fois pour ton utilisateur (e.g. home.nix).

Ce n’est pas un problème en soit de tout avoir dans le même repository (chacun s’organise comme il le souhaite). Mais du coup, c’est un peu “naturel” d’avoir le double de fichiers.

1 Like

Je n’avais pas lu cette ressource avant, et j’en doute. Je viens de confirmer ce doute en lisant un peu en diagonale.

flake.nix ne va pas nécessairement dans le /etc/nixos. En fait, la solution canonique en utilisant flake, c’est de déclarer les configurations pour les hôtes dans outputs.nixosConfigurations.<name>.
Ensuite, il devient possible de sudo nixos-rebuild switch --flake .#<name> pour déployer sa machine (en utilisant --target-host pour déployer sur une machine distante).

1 Like

Ce qui nous amène à l’intégration de la configuration d’un hôte et d’utilisateurs sur cet hôte en utilisant home-manager.

home-manager propose un module qui permet de déclarer quelle configuration appliquer à un utilisateur, directement dans la configuration d’un hôte :

{
  // ... reste de la configuration de ton hôte
  home-manager.users.Breizil29 = import ./home.nix;
}

Ça s’utilise très bien avec flake ou non (en ce cas, ça vit dans /etc/nixos).
Mais du coup, ça permet d’élégamment faire vivre tous les fichiers de configuration dans le même repository. Certains sont pour l’hôte, d’autres pour l’utilisateur.

Personnellement, mon repository de configurations suit la structure suivante :

somePath/
├── flake.nix
├── machines/
│ ├── laptop-foo.nix
│ └── server-bar.nix
└── home.nix
1 Like

alias rebuild=‘sudo nixos-rebuild switch’

[I] gg@nixos ~/.dotfiles> rebuild --flake .
building the system configuration...
updating GRUB 2 menu...
stopping the following units: accounts-daemon.service
activating the configuration...
setting up /etc...
reloading user units for gg...
restarting sysinit-reactivation.target
reloading the following units: dbus.service
restarting the following units: polkit.service
starting the following units: accounts-daemon.service
the following new units were started: home-manager-gg.service, nix-daemon.service, run-credentials-systemd\x2dtmpfiles\x2dresetup.service.mount, sysinit-reactivation.target, systemd-tmpfiles-resetup.service

Au redémarrage je suis obligé de lancer cet commande pour recupérer mon bureau complet, car il ne charge pas home.nix.

car il ne charge pas home.nix

home.nix n’est jamais “chargé” au runtime du système. Lors du nixos-rebuild, il est buildé, les composants qu’il déclare mis dans le /nix/store, et hooké au reste du système par un service systemd (systemctl status home-manager-gg pour voir le statut).

La question est plutôt de savoir pourquoi le système booté est différent de celui sur lequel tu as switch avant le reboot :thinking:

➜ systemctl status home-manager-gg 
● home-manager-gg.service - Home Manager environment for gg
     Loaded: loaded (/etc/systemd/system/home-manager-gg.service; enabled; preset: enabled)
     Active: active (exited) since Wed 2024-08-21 08:56:16 CEST; 2h 5min ago
 Invocation: b06eee34d9e343b0a8532bbe8feb76f0
    Process: 5746 ExecStart=/nix/store/sjk40sk2njkfaf3ar66sr8kx5qy3imxk-hm-setup-env /nix/store/s7aa8jqwvz7pl80wnsrbl659z2m9mkxc-home-manager-generation (code=exited, status=0/SUCCESS)
   Main PID: 5746 (code=exited, status=0/SUCCESS)
         IP: 0B in, 0B out
   Mem peak: 6.6M
        CPU: 246ms

Aug 21 08:56:16 nixos hm-activate-gg[5746]: Activating checkLinkTargets
Aug 21 08:56:16 nixos hm-activate-gg[5746]: Activating writeBoundary
Aug 21 08:56:16 nixos hm-activate-gg[5746]: Activating installPackages
Aug 21 08:56:16 nixos hm-activate-gg[5746]: Activating linkGeneration
Aug 21 08:56:16 nixos hm-activate-gg[5746]: Cleaning up orphan links from /home/gg
Aug 21 08:56:16 nixos hm-activate-gg[5746]: Creating profile generation 4
Aug 21 08:56:16 nixos hm-activate-gg[5746]: Creating home file links in /home/gg
Aug 21 08:56:16 nixos hm-activate-gg[5746]: Activating onFilesChange
Aug 21 08:56:16 nixos hm-activate-gg[5746]: Activating reloadSystemd
Aug 21 08:56:16 nixos systemd[1]: Finished Home Manager environment for gg.

home.nix

{ config, pkgs, ... }:

{
  home.username = "gg";
  home.homeDirectory = "/home/gg";

  home.stateVersion = "24.11";

  home.packages = with pkgs; [
  firefox geany google-chrome alacritty spotify goodvibes gimp
  songrec strawberry keepassxc cherrytree flameshot feh vlc virt-manager
  gnome-tweaks gnome-terminal gnome-themes-extra
  font-awesome ttf_bitstream_vera fira-code hack-font ibm-plex jetbrains-mono cascadia-code
  starship fish papirus-icon-theme materia-theme pcloud
  ];

  # Allow unfree packages
  nixpkgs.config.allowUnfree = true;

  # Home Manager is pretty good at managing dotfiles. The primary way to manage
  # plain files is through 'home.file'.
  #home.file = {
    # # Building this configuration will create a copy of 'dotfiles/screenrc' in
    # # the Nix store. Activating the configuration will then make '~/.screenrc' a
    # # symlink to the Nix store copy.
    # ".screenrc".source = dotfiles/screenrc;

    # # You can also set the file content immediately.
    # ".gradle/gradle.properties".text = ''
    #   org.gradle.console=verbose
    #   org.gradle.daemon.idletimeout=3600000
    # '';

  # Home Manager can also manage your environment variables through
  # 'home.sessionVariables'. These will be explicitly sourced when using a
  # shell provided by Home Manager. If you don't want to manage your shell
  # through Home Manager then you have to manually source 'hm-session-vars.sh'
  # located at either
  #
  #  ~/.nix-profile/etc/profile.d/hm-session-vars.sh
  #
  # or
  #
  #  ~/.local/state/nix/profiles/profile/etc/profile.d/hm-session-vars.sh
  #
  # or
  #
  #  /etc/profiles/per-user/gg/etc/profile.d/hm-session-vars.sh
  #
  #home.sessionVariables = {
    # EDITOR = "emacs";
  #};

  # Let Home Manager install and manage itself.
  programs.home-manager.enable = true;
  programs.starship.enable = true;
 #};

}

flake.nix

{
  description = "NixOS configuration";

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

  outputs = inputs@{ nixpkgs, home-manager, ... }: {
    nixosConfigurations = {
      nixos = 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.gg = import ./home.nix;

            # Optionally, use home-manager.extraSpecialArgs to pass
            # arguments to home.nix
          }
        ];
      };
    };
  };
}

➜ home-manager switch --flake .
warning: updating lock file '/home/gg/.dotfiles/flake.lock'
error: flake 'path:/home/gg/.dotfiles' does not provide attribute 'packages.x86_64-linux.homeConfigurations', 'legacyPackages.x86_64-linux.homeConfigurations' or 'homeConfigurations'
error: flake 'path:/home/gg/.dotfiles' does not provide attribute 'packages.x86_64-linux.homeConfigurations', 'legacyPackages.x86_64-linux.homeConfigurations' or 'homeConfigurations'
error: flake 'path:/home/gg/.dotfiles' does not provide attribute 'packages.x86_64-linux.homeConfigurations', 'legacyPackages.x86_64-linux.homeConfigurations' or 'homeConfigurations'
error: flake 'path:/home/gg/.dotfiles' does not provide attribute 'packages.x86_64-linux.homeConfigurations."gg".activationPackage', 'legacyPackages.x86_64-linux.homeConfigurations."gg".activationPackage' or 'homeConfigurations."gg".activationPackage'

Ce flake.nix démarre toutes mes applications

{

  description = "NixOS configuration";

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

  outputs = { self, nixpkgs, home-manager, ... }:
    let
      lib = nixpkgs.lib;
      system = "x86_64-linux";
      pkgs = nixpkgs.legacyPackages.${system};
  in {
    nixosConfigurations = {
      nixos = lib.nixosSystem {
        inherit system;
        modules = [ ./configuration.nix ];
      };
    };
    homeConfigurations = {
      gg = home-manager.lib.homeManagerConfiguration {
        inherit pkgs;
        modules = [ ./home.nix ];
      };
    };
  };

}