Home Manager: Kullanıcı Ortamını Nix ile Yönetmek

Linux kullanıyorsanız, muhtemelen şu deneyimi yaşamışsınızdır: yeni bir makine kuruyorsunuz, her şeyi bir daha ayarlıyorsunuz — .bashrc’yi kopyalıyorsunuz, Git kullanıcı adını giriyorsunuz, favori editörünüzü yüklüyorsunuz, terminal temasını buluyorsunuz. Bir süre sonra iki makineniz arasında hangisinin “doğru” konfigürasyona sahip olduğundan emin olamıyorsunuz.

Bu problemi çözmek için geliştiricilerin çoğu dotfile yönetimi yapıyor: ~/.config ve ~/.bashrc gibi konfigürasyon dosyalarını Git’e atıp elle senkronize ediyorlar. stow, chezmoi, yadm gibi araçlar bu süreci kolaylaştırıyor.

Home Manager, NixOS ekosistemindeki yanıt. Ama biraz daha ileri gidiyor: sadece dosyaları yönetmiyor, kurulacak paketleri, araç konfigürasyonlarını ve kullanıcı ortamının tamamını Nix diliyle tanımlamanızı sağlıyor.

Geleneksel Dotfile Yönetiminden Farkı

Klasik dotfile yaklaşımında .gitconfig dosyasını düzenleyip Git’e atarsınız. Yeni bir makinede repo’yu çekip symlink kurarsınız.

Home Manager’da aynı şeyi Nix ile yazıyorsunuz:

programs.git = {
  enable = true;
  settings = {
    user = {
      name = "kullanici";
      email = "kullanici@example.com";
    };
  };
};

nixos-rebuild switch komutuyla bu konfigürasyon uygulanıyor. Git kurulumu da bu satırlardan geliyor — ayrıca apt install git ya da pacman -S git gerekmez. Paket kurulumu ve konfigürasyon aynı yerde, birbirinden ayrılmaz.

NixOS’a Entegrasyonu

Home Manager iki şekilde kullanılabilir: bağımsız (standalone) ya da NixOS modülü olarak. Ben NixOS modülü yolunu tercih ettim — sistem ve kullanıcı konfigürasyonu tek nixos-rebuild komutuyla uygulanıyor.

flake.nix’te entegrasyon:

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

# modules listesinde:
home-manager.nixosModules.home-manager
{
  home-manager.useGlobalPkgs = true;
  home-manager.useUserPackages = true;
  home-manager.users.kullanici = import ./home/kullanici.nix;
}

İki önemli seçenek:

Konfigürasyon Yapısı

Ana giriş noktası home/kullanici.nix. Bu dosya alt modülleri import ediyor, tüm konfigürasyonu tek dosyaya sığdırmak zorunda değilsiniz:

{
  imports = [
    ./terminal.nix      # Fish, Starship, Kitty, Neovim, tmux
    ./theme.nix         # GTK teması, ikon seti
    ./desktop.nix       # Masaüstü kısayolları
  ];

  home.stateVersion = "26.05";
  home.username = "kullanici";
  home.homeDirectory = "/home/kullanici";

  programs.home-manager.enable = true;
}

home.stateVersion önemli: Home Manager’ın kırıcı değişikliklerini hangi sürümde kabul ettiğinizi belirtiyor. NixOS sürümünüzle eşleşmeli, rastgele değiştirilmemeli.

Gerçek Kullanım: Ne Yönetiyorum?

Git ve SSH

programs.git = {
  enable = true;
  package = pkgs.gitFull;  # git-credential-libsecret dahil
  settings.user = {
    name = "kullanici";
    email = "kullanici@example.com";
  };
  signing = {
    key = "GPG_KEY_ID";
    signByDefault = true;
  };
};

programs.ssh = {
  enable = true;
  enableDefaultConfig = false;
  settings = {
    "codeberg.org".IdentityFile = "~/.ssh/id_ed25519";
    "github.com".IdentityFile   = "~/.ssh/id_ed25519";
  };
};

enableDefaultConfig = false neden? Home Manager varsayılan olarak Host * bloğu ekliyor ama bu yeni sürümlerde deprecation uyarısına yol açıyor. Kapatmak daha temiz.

Kullanıcı Paketleri

Sistem genelinde gerekmeyen ama kullanıcı olarak istediğim araçlar:

home.packages = with pkgs; [
  eza        # ls yerine (ikonlu, git-aware)
  bat        # cat yerine (syntax highlighting)
  ripgrep    # grep yerine
  fd         # find yerine
  fzf        # bulanık arama
  zoxide     # akıllı cd
  lazygit    # Git TUI
  jq         # JSON işlemci
];

Bu paketler sistem konfigürasyonuna değil, kullanıcı ortamına kurulur. root olarak eza çalıştırılmaz, gerekmez de.

Fish Shell

Shell konfigürasyonu — alias’lar, plugin’ler, başlangıç komutları:

programs.fish = {
  enable = true;
  plugins = [
    { name = "fzf-fish"; src = pkgs.fishPlugins.fzf-fish.src; }
  ];
  shellAliases = {
    ls  = "eza --icons --git -a";
    cat = "bat";
    grep = "rg";
    cd  = "z";         # zoxide
    update = "nh os switch /persist/nixos-config";
  };
  interactiveShellInit = ''
    zoxide init fish | source
  '';
};

programs.fish.enable = true aynı zamanda Fish’i kuruyor — home.packages’a ayrıca eklemeye gerek yok.

Terminal Araçları

Starship prompt, Kitty terminal, tmux — hepsinin kendi programs.* bloğu var:

programs.starship = {
  enable = true;
  enableFishIntegration = true;
  settings = {
    add_newline = true;
    # prompt formatı, renkler...
  };
};

programs.kitty = {
  enable = true;
  themeFile = "tokyo_night_storm";
  font.name = "JetBrainsMono Nerd Font";
  font.size = 12;
};

programs.neovim = {
  enable = true;
  defaultEditor = true;
  vimAlias = true;
  extraPackages = with pkgs; [
    lua-language-server
    nixd   # Nix LSP
  ];
};

Her araç için .config/starship.toml, .config/kitty/kitty.conf gibi dosyaları elle oluşturmaK gerekmez — Home Manager bunları /nix/store’daki Nix çıktısından üretiyor ve ~/.config altına symlink kuruyor.

Home Manager’ın ürettiği konfigürasyon dosyaları ~/.config altında görünür ama bunlar /nix/store içindeki read-only dosyalara symlink:

~/.config/starship.toml -> /nix/store/abc123.../starship.toml
~/.config/kitty/kitty.conf -> /nix/store/def456.../kitty.conf

Bu dosyaları doğrudan düzenleyemezsiniz — read-only. Değişiklik yapmak için home/terminal.nix’i düzenleyip nixos-rebuild switch komutu çalıştırırsınız. İlk başta alışılmadık geliyor; sonra “bu dosyayı nereye koymuştum?” sorusunu sormadığınızı fark ediyorsunuz.

Ne Kazanıyorsunuz?

Tüm kullanıcı ortamı tek bir Git repo’sunda. Yeni bir makine kurduğunuzda nixos-config repo’sunu çekip nixos-rebuild switch çalıştırıyorsunuz — Fish alias’larınız, Neovim LSP paketleriniz, Git imzalama ayarlarınız hepsi geliyor.

Başka bir dağıtımdan geçiyorsanız da referans alınabilir: hangi aracı hangi ayarla kullandığınız Nix dilinde yazılı, okunabilir, versiyon kontrolünde.


İlgili: NixOS: Kaostan Düzene Declarative Bir Yolculuk

EOF.