Перейти к основному содержимому

Управление конфигурацией: Nix и dotfiles

Оглавление

Два подхода к управлению конфигурацией, используемые параллельно:

МетодИнструментОбласть примененияПреимущества
ДекларативныйNixOS Flakes + Home ManagerСистема, пакеты, сервисыВоспроизводимость, атомарные откаты, тестирование
Традиционныйchezmoi / git + symlinksПользовательские конфиги, кроссплатформаГибкость, поддержка не-Nix систем, минимальный оверхед

Оба метода версионируются в Git, деплоятся через pull + apply, поддерживают мультихост-конфигурации.


🧊 Nix: Декларативная конфигурация
#

Архитектура nixcfg
#

nixcfg/
├── flake.nix              # Точка входа: определения систем, входные данные
├── profiles/
│   ├── base/              # Базовые настройки: timezone, locale, networking
│   ├── common/            # Общие для всех хостов: users, security, nix settings
│   ├── desktop/           # Графическое окружение: Wayland, portals, fonts
│   ├── laptop/            # Специфика ноутбуков: блютуз, fingerprint, power
│   ├── mobile/            # Nix-on-Droid: пакеты для Android
│   └── workstation/       # Серверные настройки: Wake-on-LAN, sysctl
├── hosts/
│   ├── potatoWork/        # Конфигурация хоста: hostname, kernel params, микрокод
│   ├── potatoLaptop/
│   ├── potatoPhone/       # Nix-on-Droid хост
│   └── potatoTablet/
├── modules/
│   ├── docker.nix         # Модуль: включение Docker, настройки daemon
│   ├── flatpak.nix        # Flatpak: репозитории, пакеты
│   ├── ollama.nix         # Локальные LLM: сервис, модели, API
│   ├── waydroid.nix       # Android-контейнеры в Linux
│   └── home-manager/      # Пользовательская среда
│       ├── common.nix     # Bash, Git, Firefox, алиасы
│       ├── packages.nix   # Пользовательские пакеты
│       ├── potatoWork.nix # Хост-специфичные пакеты
│       └── potatoLaptop.nix
└── scripts/               # Утилиты: обновление, сборка, откат

Ключевые принципы
#

  1. Flakes-первый подход:
# flake.nix
outputs = { self, nixpkgs, home-manager, ... }@inputs: {
  nixosConfigurations.potatoWork = nixpkgs.lib.nixosSystem {
    system = "x86_64-linux";
    modules = [
      ./profiles/base
      ./profiles/common
      ./profiles/desktop
      ./hosts/potatoWork/default.nix
      ./modules/docker.nix
      home-manager.nixosModules.home-manager
    ];
  };
};
  1. Модульность через imports:
# profiles/base/default.nix
{ config, pkgs, lib, ... }: {
  time.timeZone = "Europe/Moscow";
  i18n.defaultLocale = "ru_RU.UTF-8";
  networking.networkmanager.enable = true;
  security.polkit.enable = true;
}
  1. Хост-специфичные настройки:
# hosts/potatoWork/default.nix
{ config, pkgs, ... }: {
  networking.hostName = "potatoWork";
  boot.kernelParams = [
    "i915.enable_fbc=1"
    "i915.enable_guc=2"
    "intel_pstate=active"
  ];
  hardware.cpu.intel.updateMicrocode = true;
}
  1. Home Manager для пользовательской среды:
# modules/home-manager/common.nix
{ config, pkgs, ... }: {
  programs.git = {
    enable = true;
    settings.user = {
      name = "ponfertato";
      email = "ponfertato@ya.ru";
    };
    ignores = [ "*~" ".DS_Store" ".idea/" ];
  };
  programs.firefox = {
    enable = true;
    profiles.default = {
      isDefault = true;
      search.default = "ddg";
    };
  };
}

Обслуживание и обновления
#

# Полное обновление системы (рекомендуется)
nix flake update && sudo nixos-rebuild switch --flake .#$(hostname) --impure

# Откат к предыдущей конфигурации
sudo nixos-rebuild switch --rollback

# Сборка без активации (тест)
sudo nixos-rebuild build --flake .#$(hostname) --impure

# Проверка конфигурации
nix flake check

# Очистка старых поколений
nix-collect-garbage -d

Алиасы для удобства (modules/home-manager/common.nix):

home.shellAliases = {
  nix-apply = "sudo nixos-rebuild switch --flake .#$(hostname) --impure";
  nix-apply-user = "home-manager switch --flake .#$(hostname)";
  nix-build = "sudo nixos-rebuild build --flake .#$(hostname) --impure";
  nix-roll = "sudo nixos-rebuild switch --rollback";
  nix-update = "nix flake update";
};

Поддержка мобильных устройств (Nix-on-Droid)
#

# flake.nix
nixOnDroidConfigurations = {
  potatoPhone = mkNixOnDroidConfig "potatoPhone" [];
  potatoTablet = mkNixOnDroidConfig "potatoTablet" [];
};

# hosts/potatoPhone/default.nix
{ config, pkgs, ... }: {
  environment.packages = with pkgs; [ termux-api curl git lazygit nano openssh wget ];
  time.timeZone = "Europe/Moscow";
  i18n.defaultLocale = "ru_RU.UTF-8";
}

Сборка для Android:

nix-on-droid switch --flake ~/.config/nixpkgs#potatoPhone

📁 Dotfiles: Традиционный подход
#

Архитектура dotfiles
#

dotfiles/
├── install                 # Скрипт установки: symlink, bootstrap
├── shell/
│   ├── bash/
│   │   ├── bashrc          # Базовые настройки: PATH, PS1, aliases
│   │   └── functions/      # Пользовательские функции
│   ├── zsh/
│   │   ├── zshrc           # Oh-my-zsh конфиг, плагины
│   │   ├── aliases.zsh     # Алиасы
│   │   └── functions.zsh   # Функции
│   └── powershell/
│       ├── settings.json   # Terminal settings
│       ├── profile.ps1     # PowerShell профиль
│       └── modules/        # Кастомные модули
├── git/
│   └── gitconfig           # Глобальный Git конфиг
├── ssh/
│   └── config              # SSH хосты, ключи, ForwardAgent
├── nvim/                   # Neovim конфиг (или ссылка на внешний репо)
├── wsl/
│   └── .wslconfig          # Настройки WSL: память, ядро
├── browser/
│   └── firefox/user.js     # Firefox about:config настройки
└── wakatime/
    └── .wakatime.cfg       # Трекинг времени разработки

Ключевые особенности
#

  1. Кроссплатформенность:
# install - кроссплатформенный скрипт
#!/usr/bin/env bash
OS=$(uname -s)
case "$OS" in
  Linux)
    ln -sf "$PWD/shell/bash/bashrc" ~/.bashrc
    ln -sf "$PWD/git/gitconfig" ~/.gitconfig
    ;;
  Darwin)
    # macOS специфика
    ;;
  MINGW*|CYGWIN*)
    # Windows (Git Bash / WSL)
    ;;
esac
  1. Условная загрузка конфигов:
# ~/.bashrc
if [ -f ~/.bash_aliases ]; then
  source ~/.bash_aliases
fi
if [ -d ~/.bash_functions ]; then
  for f in ~/.bash_functions/*.sh; do source "$f"; done
fi
  1. SSH конфигурация с шаблонами:
# ~/.ssh/config
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_github
  AddKeysToAgent yes
  ForwardAgent no

Host *.potatoenergy.ru
  User ponfertato
  IdentityFile ~/.ssh/id_ed25519_potato
  ForwardAgent yes
  ControlMaster auto
  ControlPath ~/.ssh/cm-%r@%h:%p
  ControlPersist 10m
  1. Firefox пользовательские настройки:
// user.js
user_pref("privacy.resistFingerprinting", true);
user_pref("privacy.tracking_protection.enabled", true);
user_pref("network.dns.disablePrefetch", true);
user_pref("browser.startup.page", 3); // restore session

Интеграция с Nix
#

Dotfiles могут использоваться внутри NixOS-конфигурации:

# modules/home-manager/common.nix
home.file.".bashrc".source = ../../../dotfiles/shell/bash/bashrc;
home.file.".gitconfig".source = ../../../dotfiles/git/gitconfig;
home.file.".ssh/config".source = ../../../dotfiles/ssh/config;

# Или через генерацию:
programs.bash.bashrcExtra = builtins.readFile ../../../dotfiles/shell/bash/bashrc;

Преимущества:

  • ✅ Единый источник истины для конфигов
  • ✅ Версионирование и ревью изменений через Git
  • ✅ Атомарное применение: home-manager switch или nixos-rebuild

🔀 Когда что использовать
#

ЗадачаРекомендуемый подходПочему
Конфигурация ОС, сервисов, пакетовNixOS FlakesВоспроизводимость, тестирование, откаты
Пользовательские алиасы, темы, плагиныHome Manager (в Nix)Интеграция с системой, версионирование
Конфиги для не-Nix систем (Windows, macOS)Dotfiles + chezmoiКроссплатформенность, минимальные зависимости
Быстрое прототипирование конфиговПрямое редактирование + GitСкорость, гибкость
Командная стандартизация конфиговDotfiles-репо + CI-проверкиЕдиный стиль, автоматическая валидация

Гибридный подход (рекомендуется)
#

  1. Системный слой (NixOS):

    • Пакеты, сервисы, пользователи, сеть, безопасность
    • Управление через flake.nix + nixos-rebuild
  2. Пользовательский слой (Home Manager):

    • Оболочка, редактор, браузер, ключи
    • Управление через home-manager switch
  3. Кроссплатформенный слой (Dotfiles):

    • SSH, Git, общие алиасы
    • Синхронизация через Git, установка через install-скрипт

⚙️ Автоматизация и тестирование
#

Проверка конфигурации перед применением
#

# Nix: проверка синтаксиса и зависимостей
nix flake check

# Home Manager: dry-run
home-manager switch --flake .#$(hostname) --dry-run

# Dotfiles: валидация конфигов
bash -n ~/.bashrc          # Синтаксис bash
zsh -n ~/.zshrc           # Синтаксис zsh
git config --global --get user.name  # Проверка загрузки

Тестирование в изолированной среде
#

# Nix: сборка в chroot (если включено)
sudo nixos-rebuild build --flake .#test-host --impure --option build-users-group ""

# Dotfiles: тестовая установка в temp-директорию
export HOME=$(mktemp -d)
./install --dry-run

CI/CD для конфигов (опционально)
#

# .github/workflows/check.yml
name: Validate Configs
on: [push, pull_request]
jobs:
  nix:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: cachix/install-nix-action@v25
      - run: nix flake check
  dotfiles:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: bash -n shell/bash/bashrc
      - run: zsh -n shell/zsh/zshrc

⚠️ Частые проблемы
#

# Nix: "flake input 'nixpkgs' has changed"
→ Обновить лок: `nix flake lock --update-input nixpkgs`

# Home Manager: конфликт файлов
→ Удалить существующий файл или использовать `home.file.<name>.force = true`

# Dotfiles: symlink уже существует
→ Использовать `install --force` или предварительно сделать бэкап

# Кроссплатформенные алиасы не работают
→ Проверить, что файл загружается: `echo $BASH_VERSION`, `echo $ZSH_VERSION`

# SSH ключи не подхватываются
→ Проверить права: `chmod 600 ~/.ssh/id_*`, `chmod 644 ~/.ssh/config`

Ссылки
#

Здесь пока нет статей.