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:
useGlobalPkgs = true— Home Manager, sistemnixpkgs’ini kullanır. İki ayrı paket kümesi oluşmaz, daha az tekrar ve tutarlı sürümler.useUserPackages = true— Home Manager paketleri~/.nix-profileyerine sistem profil yoluna kurulur.which gitbeklenmedik bir yol göstermez.
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.
Symlink mi, Gerçek Dosya mı?
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