From 17b0cdfbac5d9267f790fc2b36b30c82dc0c3511 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Tue, 10 Mar 2026 13:10:52 +0300 Subject: [PATCH] feat: add comprehensive NixOS configuration documentation and structure - Introduced `08-structure.md` detailing project structure, main files, and versioning. - Created `README.md` for documentation overview and quick start guide. - Added user-specific configurations for Alacritty, Vim, Micro, Git, Zsh, Tmux, and tools. - Implemented system modules for desktop environment (KDE Plasma), audio (PipeWire), networking, and services (OpenSSH, GnuPG). - Configured Nix settings with flakes support and garbage collection. - Established user management for `ada` with necessary groups and shell settings. - Enabled VirtualBox guest additions for improved VM experience. --- nixos/.gitignore | 63 ++++ nixos/README.md | 338 ++++++++++++++++++++ nixos/configuration.nix | 187 ++--------- nixos/docs/01-install-packages.md | 130 ++++++++ nixos/docs/02-shell-environment.md | 203 ++++++++++++ nixos/docs/03-networking.md | 234 ++++++++++++++ nixos/docs/04-devshell.md | 188 +++++++++++ nixos/docs/05-git-config.md | 228 +++++++++++++ nixos/docs/06-adding-modules.md | 302 +++++++++++++++++ nixos/docs/07-troubleshooting.md | 285 +++++++++++++++++ nixos/docs/08-structure.md | 222 +++++++++++++ nixos/docs/README.md | 39 +++ nixos/flake.nix | 72 ++++- nixos/home/ada/alacritty.nix | 121 +++++++ nixos/home/ada/default.nix | 45 +++ nixos/home/ada/git.nix | 126 ++++++++ nixos/home/ada/micro.nix | 32 ++ nixos/home/ada/packages.nix | 90 ++++++ nixos/home/ada/tmux.nix | 29 ++ nixos/home/ada/tools.nix | 27 ++ nixos/home/ada/vim.nix | 112 +++++++ nixos/home/ada/zsh.nix | 154 +++++++++ nixos/modules/desktop/pipewire.nix | 18 ++ nixos/modules/desktop/plasma.nix | 43 +++ nixos/modules/networking/default.nix | 16 + nixos/modules/services/default.nix | 65 ++++ nixos/modules/system/boot.nix | 17 + nixos/modules/system/locale.nix | 21 ++ nixos/modules/system/nix.nix | 60 ++++ nixos/modules/users/ada.nix | 14 + nixos/modules/virtualisation/virtualbox.nix | 10 + 31 files changed, 3327 insertions(+), 164 deletions(-) create mode 100644 nixos/.gitignore create mode 100644 nixos/README.md create mode 100644 nixos/docs/01-install-packages.md create mode 100644 nixos/docs/02-shell-environment.md create mode 100644 nixos/docs/03-networking.md create mode 100644 nixos/docs/04-devshell.md create mode 100644 nixos/docs/05-git-config.md create mode 100644 nixos/docs/06-adding-modules.md create mode 100644 nixos/docs/07-troubleshooting.md create mode 100644 nixos/docs/08-structure.md create mode 100644 nixos/docs/README.md create mode 100644 nixos/home/ada/alacritty.nix create mode 100644 nixos/home/ada/default.nix create mode 100644 nixos/home/ada/git.nix create mode 100644 nixos/home/ada/micro.nix create mode 100644 nixos/home/ada/packages.nix create mode 100644 nixos/home/ada/tmux.nix create mode 100644 nixos/home/ada/tools.nix create mode 100644 nixos/home/ada/vim.nix create mode 100644 nixos/home/ada/zsh.nix create mode 100644 nixos/modules/desktop/pipewire.nix create mode 100644 nixos/modules/desktop/plasma.nix create mode 100644 nixos/modules/networking/default.nix create mode 100644 nixos/modules/services/default.nix create mode 100644 nixos/modules/system/boot.nix create mode 100644 nixos/modules/system/locale.nix create mode 100644 nixos/modules/system/nix.nix create mode 100644 nixos/modules/users/ada.nix create mode 100644 nixos/modules/virtualisation/virtualbox.nix diff --git a/nixos/.gitignore b/nixos/.gitignore new file mode 100644 index 0000000..c7fbadb --- /dev/null +++ b/nixos/.gitignore @@ -0,0 +1,63 @@ +# ══════════════════════════════════════════════════════════════════ +# Nix & Flake +# ══════════════════════════════════════════════════════════════════ +# Результаты build (должны игнорироваться) +result +result-* + +# Lock файлы (можно коммитить для воспроизводимости, но часто игнорируется) +# flake.lock + +# ══════════════════════════════════════════════════════════════════ +# Резервные и временные файлы +# ══════════════════════════════════════════════════════════════════ +*.backup +*.bak +*~ +.backup +.old + +# ══════════════════════════════════════════════════════════════════ +# Редакторы и IDE +# ══════════════════════════════════════════════════════════════════ +.vscode/ +.idea/ +*.swp +*.swo +*.kate-swp +.vimrc.local +.nvimrc.local + +# ══════════════════════════════════════════════════════════════════ +# ОС +# ══════════════════════════════════════════════════════════════════ +.DS_Store +.AppleDouble +.LSOverride +Thumbs.db +ehthumbs.db +Desktop.ini +$RECYCLE.BIN/ +.Trash-* + +# ══════════════════════════════════════════════════════════════════ +# Разработка +# ══════════════════════════════════════════════════════════════════ +.envrc +.direnv/ +target/ +dist/ +build/ +.cache/ + +# ══════════════════════════════════════════════════════════════════ +# Логи +# ══════════════════════════════════════════════════════════════════ +*.log +*.logs/ +.DS_Store +Thumbs.db + +# Temporary files +*.tmp +*.temp diff --git a/nixos/README.md b/nixos/README.md new file mode 100644 index 0000000..84ae2d6 --- /dev/null +++ b/nixos/README.md @@ -0,0 +1,338 @@ +# NixOS Configuration + +Модульная конфигурация NixOS на базе Flakes с Home Manager для виртуальной машины. + +## 📚 Документация + +Атомарные гайды по отдельным задачам находятся в папке [`docs/`](docs/): + +- **[docs/README.md](docs/README.md)** - Индекс всех гайдов +- **[docs/01-install-packages.md](docs/01-install-packages.md)** - Добавление/удаление пакетов +- **[docs/02-shell-environment.md](docs/02-shell-environment.md)** - Shell alias и переменные +- **[docs/03-networking.md](docs/03-networking.md)** - SSH, Firewall, сеть +- **[docs/04-devshell.md](docs/04-devshell.md)** - Разработка конфигурации +- **[docs/05-git-config.md](docs/05-git-config.md)** - Git конфигурация +- **[docs/06-adding-modules.md](docs/06-adding-modules.md)** - Создание новых модулей +- **[docs/07-troubleshooting.md](docs/07-troubleshooting.md)** - Отладка проблем +- **[docs/08-structure.md](docs/08-structure.md)** - Структура проекта + +## Структура проекта + +``` +nixos/ +├── README.md # Главная страница (ты здесь) +├── flake.nix # Главный флейк с inputs и outputs +├── configuration.nix # Главная конфигурация (импортирует модули) +├── hardware-configuration.nix # Автогенерированная конфигурация железа +│ +├── docs/ # 📚 Документация (атомарные гайды) +│ ├── README.md # Индекс документации +│ ├── 01-install-packages.md # Как ставить программы +│ ├── 02-shell-environment.md # Shell alias и переменные +│ ├── 03-networking.md # SSH, Firewall, сеть +│ ├── 04-devshell.md # Разработка конфигурации +│ ├── 05-git-config.md # Git конфигурация +│ ├── 06-adding-modules.md # Создание новых модулей +│ ├── 07-troubleshooting.md # Отладка проблем +│ └── 08-structure.md # Структура проекта +│ +├── modules/ # Системные модули +│ ├── system/ # Ядро системы +│ │ ├── boot.nix # GRUB, kernel modules +│ │ ├── nix.nix # Nix конфигурация +│ │ └── locale.nix # Язык, таймзона +│ │ +│ ├── desktop/ # Рабочее окружение +│ │ ├── plasma.nix # KDE Plasma 6 + Wayland +│ │ └── pipewire.nix # Audio система +│ │ +│ ├── networking/ # Сеть +│ │ └── default.nix # NetworkManager, Firewall +│ │ +│ ├── services/ # Сервисы +│ │ └── default.nix # SSH, Firefox и др. +│ │ +│ ├── users/ # Пользователи +│ │ └── ada.nix # Пользователь ada +│ │ +│ └── virtualisation/ # Виртуализация +│ └── virtualbox.nix # VirtualBox Guest +│ +└── home/ # Home Manager (пользователь) + └── ada/ + ├── default.nix # Главный файл (импорты) + ├── packages.nix # Пакеты (~50) + ├── git.nix # Git конфиг + ├── zsh.nix # Shell алиасы + ├── vim.nix # Vim конфиг + ├── alacritty.nix # Терминал + ├── micro.nix # Micro редактор + ├── tmux.nix # Tmux конфиг + └── tools.nix # CLI утилиты +``` + +## Особенности конфигурации + +### ✨ Система +- **Flakes**: Современная система управления зависимостями Nix +- **Home Manager**: Управление пользовательским окружением +- **KDE Plasma 6**: Последняя версия с поддержкой Wayland +- **PipeWire**: Современная аудиосистема +- **Русская раскладка**: Настроено переключение по Caps Lock + +### 🛠 Утилиты для работы с Nix + +**`nh` (рекомендуется)** - современный помощник для работы с NixOS: +- ✅ Автоматически показывает diff между поколениями после сборки +- ✅ Использует nix-output-monitor для красивого вывода +- ✅ Интерактивная очистка с предпросмотром удаляемых пакетов +- ✅ Более простой и короткий синтаксис команд +- ✅ Автоматически определяет конфигурацию из текущей директории + +**Другие утилиты:** +- `nix-output-monitor` (nom) - красивый вывод при сборке +- `nvd` - diff между поколениями системы +- `nix-tree` - визуализация зависимостей +- `nix-index` - поиск файлов в nixpkgs +- `comma` - запуск программ без установки +- `nix-du` - анализ использования диска +- `nixfmt-classic` - форматирование Nix кода + +### 💻 Development tools +- **Editors**: Vim, Neovim, VS Code, IntelliJ IDEA Community +- **Shell**: ZSH с Oh-My-Zsh и кастомными алиасами +- **Git**: Git, GitHub CLI (gh), LazyGit +- **Terminal**: Tmux с улучшенной конфигурацией +- **Modern CLI tools**: eza, bat, fzf, ripgrep, fd + +### 🔧 VirtualBox +- Drag & Drop включен +- Shared clipboard включен +- Guest additions настроены + +## Как использовать + +### Первоначальная сборка + +```bash +cd /home/ada/.dotfiles/nixos + +# Обновить зависимости flake +nix flake update + +# Стандартный способ: +sudo nixos-rebuild switch --flake .#nixos-vm + +# Или с помощью nh (рекомендуется): +nh os switch +``` + +### Применение изменений + +```bash +# Тестовая сборка (без добавления в boot menu) +sudo nixos-rebuild test --flake .#nixos-vm +# С nh: +nh os test + +# Применить и добавить в boot menu +sudo nixos-rebuild switch --flake .#nixos-vm +# С nh: +nh os switch + +# Собрать и добавить в boot menu без активации сейчас +sudo nixos-rebuild boot --flake .#nixos-vm +# С nh: +nh os boot +``` + +### Алиасы (доступны в ZSH после первой сборки) + +```bash +# Пересборка системы (использует nh) +nixos-rebuild + +# Тестовая сборка (использует nh) +nixos-test + +# Сборка без активации (использует nh) +nixos-boot + +# Обновление флейка и пересборка +nixos-update + +# Список поколений системы +nixos-list +``` + +> **Примечание**: Алиасы в этой конфигурации используют утилиту `nh` для более удобной работы. +> Если хотите использовать стандартные команды напрямую, см. разделы выше. + +### Обновление flake inputs + +```bash +cd /home/ada/.dotfiles/nixos + +# Обновить зависимости +nix flake update + +# Применить изменения - стандартный способ: +sudo nixos-rebuild switch --flake .#nixos-vm + +# Или с nh: +nh os switch +``` + +### Сравнение поколений системы + +```bash +# Сравнить текущее и предыдущее поколение - стандартный способ: +nvd diff /run/current-system /run/booted-system + +# С nh (автоматически показывает diff после сборки): +nh os switch # автоматически покажет изменения + +# Красивый вывод при сборке с nom: +nom build .#nixosConfigurations.nixos-vm.config.system.build.toplevel + +# nh по умолчанию использует nom для красивого вывода +``` + +### Просмотр зависимостей пакета + +```bash +nix-tree /run/current-system +``` + +## Добавление нового пакета + +### Системный пакет +Отредактируйте нужный модуль в `modules/` и добавьте пакет в `environment.systemPackages`. + +### Пользовательский пакет +Отредактируйте `home/ada/default.nix` и добавьте пакет в `home.packages`. + +## Создание нового модуля + +1. Создайте файл в соответствующей директории `modules/` +2. Добавьте import в [configuration.nix](configuration.nix) +3. Примените изменения + +Пример: +```nix +# modules/services/docker.nix +{ pkgs, ... }: +{ + virtualisation.docker.enable = true; + users.users.ada.extraGroups = [ "docker" ]; +} +``` + +## Полезные команды + +### Поиск и установка пакетов + +```bash +# Поиск пакета - стандартный способ: +nix search nixpkgs + +# С nh (быстрее и удобнее): +nh search + +# Запустить программу без установки: +nix run nixpkgs# + +# Или с помощью comma: +, +``` + +### Управление системой + +```bash +# Garbage collection - стандартный способ: +sudo nix-collect-garbage -d +sudo nix-collect-garbage --delete-older-than 7d + +# С nh (интерактивно, безопаснее): +nh clean all # очистить всё старое +nh clean user # только пользовательские профили +nh clean system # только системные поколения + +# Оптимизация store: +nix-store --optimise + +# Починить права в /nix/store: +sudo nix-store --verify --check-contents --repair +``` + +## Кастомизация + +### Изменить email в Git +Отредактируйте `home/ada/default.nix`: +```nix +programs.git = { + userEmail = "ваш-email@example.com"; +}; +``` + +### Добавить ZSH плагины +Отредактируйте `home/ada/default.nix`: +```nix +programs.zsh.oh-my-zsh.plugins = [ + "git" + "sudo" + "docker" + "ваш-плагин" +]; +``` + +### Изменить тему ZSH +```nix +programs.zsh.oh-my-zsh.theme = "agnoster"; +``` + +## Troubleshooting + +### Ошибка при сборке +```bash +# Посмотрите логи - стандартный способ: +sudo nixos-rebuild switch --flake .#nixos-vm --show-trace + +# С nh (более подробный вывод по умолчанию): +nh os switch -- --show-trace + +# Проверьте синтаксис: +nix flake check +``` + +### Откатиться на предыдущее поколение +```bash +# Список поколений - стандартный способ: +sudo nix-env --list-generations --profile /nix/var/nix/profiles/system + +# С nh: +nh os list # показать все поколения системы + +# Откат на предыдущее поколение - стандартный способ: +sudo nixos-rebuild switch --rollback + +# С nh (откат на конкретное поколение): +nh os switch --generation <номер> +``` + +### Обновить только Home Manager +```bash +# Стандартный способ: +home-manager switch --flake .#ada + +# С nh: +nh home switch +``` + +## Ссылки + +- [NixOS Manual](https://nixos.org/manual/nixos/stable/) +- [Home Manager Manual](https://nix-community.github.io/home-manager/) +- [Nixpkgs Search](https://search.nixos.org/packages) +- [NixOS Options Search](https://search.nixos.org/options) +- [Nix Flakes](https://nixos.wiki/wiki/Flakes) diff --git a/nixos/configuration.nix b/nixos/configuration.nix index 2dffa3c..1c03702 100644 --- a/nixos/configuration.nix +++ b/nixos/configuration.nix @@ -1,168 +1,37 @@ -{ - config, - pkgs, - lib, - ... -}: +{ config, pkgs, lib, ... }: { - imports = - [ # Include the results of the hardware scan. - ./hardware-configuration.nix - ]; + imports = [ + # Конфигурация железа + ./hardware-configuration.nix - # Bootloader. - boot.loader.grub.enable = true; - boot.loader.grub.device = "/dev/sda"; - boot.loader.grub.useOSProber = true; + # Системные модули + ./modules/system/boot.nix + ./modules/system/nix.nix + ./modules/system/locale.nix - boot.kernelParams = [ "quiet" ]; - boot.extraModulePackages = [ config.boot.kernelPackages.amneziawg ]; - boot.kernelModules = [ "amneziawg" ]; + # Окружение рабочего стола + ./modules/desktop/plasma.nix + ./modules/desktop/pipewire.nix - programs.nix-ld.enable = true; - programs.nix-ld.libraries = with pkgs; [ - stdenv.cc.cc - zlib - fuse3 - icu - nss - openssl - curl - expat + # Сеть + ./modules/networking/default.nix + + # Сервисы + ./modules/services/default.nix + + # Виртуализация + ./modules/virtualisation/virtualbox.nix + + # Пользователи + ./modules/users/ada.nix ]; - networking.hostName = "nixos-vm"; - networking.networkmanager.enable = true; - time.timeZone = "Europe/Moscow"; - - i18n.defaultLocale = "en_US.UTF-8"; - - i18n.extraLocaleSettings = { - LC_ADDRESS = "ru_RU.UTF-8"; - LC_IDENTIFICATION = "ru_RU.UTF-8"; - LC_MEASUREMENT = "ru_RU.UTF-8"; - LC_MONETARY = "ru_RU.UTF-8"; - LC_NAME = "ru_RU.UTF-8"; - LC_NUMERIC = "ru_RU.UTF-8"; - LC_PAPER = "ru_RU.UTF-8"; - LC_TELEPHONE = "ru_RU.UTF-8"; - LC_TIME = "ru_RU.UTF-8"; - }; - - services.xserver.enable = true; - services.xserver.displayManager.sddm.enable = true; - services.xserver.displayManager.sddm.wayland.enable = true; - services.xserver.desktopManager.plasma5.enable = true; - - environment.sessionVariables.NIXOS_OZONE_WL = "1"; - - # Configure keymap in X11 - services.xserver.xkb = { - layout = "us"; - variant = ""; - }; - - # Enable CUPS to print documents. - services.printing.enable = true; - - services.pulseaudio.enable = false; - security.rtkit.enable = true; - services.pipewire = { - enable = true; - alsa.enable = true; - alsa.support32Bit = true; - pulse.enable = true; - }; - - # Define a user account. Don't forget to set a password with ‘passwd’. - users.users.ada = { - isNormalUser = true; - description = "ada"; - extraGroups = [ "networkmanager" "wheel" ]; - packages = with pkgs; [ - vim - neovim - code - jetbrains.idea-community - tmux - zsh - oh-my-zsh - fzf - ripgrep - fd - bat - eza - lsd - git - gh - lazygit - curl - wget - jq - nix-output-monitor - nvd - nix-tree - comma - htop - btop - tree - ]; - }; - - - - environment.systemPackages = with pkgs; [ - vim - wget - git - curl - amneziawg-tools - nix-output-monitor - nvd - nix-tree - comma - htop - neofetch - ]; - - nix = { - package = pkgs.nix; - settings = { - experimental-features = [ "nix-command" "flakes" ]; - auto-optimise-store = true; - }; - gc = { - automatic = true; - dates = "weekly"; - options = "--delete-older-than 7d"; - }; - }; - - nixpkgs.config.allowUnfree = true; - - programs.firefox.enable = true; - programs.amnezia-vpn.enable = true; - programs.mtr.enable = true; - programs.gnupg.agent = { - enable = true; - enableSSHSupport = true; - }; - - services.openssh = { - enable = true; - settings = { - PasswordAuthentication = false; - PubkeyAuthentication = true; - }; - }; - - # Open ports in the firewall. - networking.firewall.allowedTCPPorts = [ 22 ]; - - virtualisation.virtualbox.guest.enable = true; - virtualisation.virtualbox.guest.dragAndDrop = true; - virtualisation.virtualbox.guest.clipboard = true; - + # Версия релиза NixOS + # Это значение определяет релиз NixOS, из которого были взяты настройки по умолчанию + # для stateful данных, таких как расположение файлов и версии баз данных в вашей системе. + # Рекомендуется оставить это значение таким, каким оно было при первой установке системы. + # Перед изменением этого значения прочитайте документацию для этой опции + # (например, man configuration.nix или https://nixos.org/nixos/options.html). system.stateVersion = "25.05"; } diff --git a/nixos/docs/01-install-packages.md b/nixos/docs/01-install-packages.md new file mode 100644 index 0000000..f4b14e4 --- /dev/null +++ b/nixos/docs/01-install-packages.md @@ -0,0 +1,130 @@ +# Добавление и удаление пакетов + +Как управлять программами в конфигурации. + +## Где пакеты? + +Пакеты описаны в файле: +``` +home/ada/packages.nix +``` + +## Добавить пакет + +### Способ 1: Через редактор + +1. Открыть `home/ada/packages.nix` +2. Найти подходящую категорию (например "Средства разработки") +3. Добавить пакет: + +```nix +# Было: +htop # Интерактивный монитор процессов + +# Стало: +htop # Интерактивный монитор процессов +lazygit # Интерактивный git UI +``` + +4. Собрать конфигурацию: +```bash +nh os switch +``` + +### Способ 2: Найти пакет в nixpkgs + +Если не знаешь точное имя пакета: + +```bash +# Поиск в nixpkgs +nix search nixpkgs + +# Пример: +nix search nixpkgs git-lfs +``` + +## Удалить пакет + +1. Открыть `home/ada/packages.nix` +2. Удалить строку с пакетом +3. Собрать: +```bash +nh os switch +``` + +## Категории пакетов + +В файле `packages.nix` пакеты организованы по категориям: + +``` +Редакторы → vim, neovim, micro +IDE → vscode, idea-community, zed +Терминал → alacritty +Dev tools → tmux, fzf, ripgrep, fd, bat, eza +Git tools → git, gh, lazygit +Сеть → curl, wget, ssh, mosh, nmap +БД → sqlite, postgresql +Утилиты → jq, yq, zip, unzip, gnupg +Шрифты → nerdfonts (FiraCode) +``` + +## Правила оформления + +```nix +# ✅ Хорошо - с комментарием +ripgrep # Быстрый поиск в файлах (rg) + +# ❌ Плохо - без комментария +ripgrep + +# ✅ Хорошо - выровнены +fzf # Интерактивный поиск +ripgrep # Быстрый поиск + +# ❌ Плохо - не выровнены +fzf # Интерактивный поиск +ripgrep # Быстрый поиск +``` + +## Проверка перед сборкой + +```bash +# Проверить синтаксис +nix flake check + +# Или просто пробуй собрать: +nh os test # Тестовая сборка (без применения) +``` + +## Примеры + +### Добавить lazydocker + +1. Открыть `home/ada/packages.nix` +2. В разделе "Dev tools" добавить: +```nix +lazydocker # Docker UI +``` +3. Собрать: +```bash +nh os switch +``` + +### Добавить несколько пакетов + +```nix +# Быстрее найти нужные команды +fzf # Поиск +ripgrep-all # Поиск по всем типам +fd # find аналог + +# Анализ и визуализация +tokei # Анализ кода +nitch # Системная информация +``` + +## Рядом интересные пакеты + +- `comma` - запустить пакет без установки: `, package` +- `nix-index` - найти файл в nixpkgs +- `nixpkgs-fmt` - форматирование Nix кода diff --git a/nixos/docs/02-shell-environment.md b/nixos/docs/02-shell-environment.md new file mode 100644 index 0000000..12fe511 --- /dev/null +++ b/nixos/docs/02-shell-environment.md @@ -0,0 +1,203 @@ +# Shell окружение и алиасы + +Как настроить ZSH, добавить alias и переменные окружения. + +## Где окружение? + +Конфигурация ZSH находится в: +``` +home/ada/zsh.nix +``` + +## Добавить alias + +1. Открыть `home/ada/zsh.nix` +2. Найти секцию `shellAliases` +3. Добавить новый alias: + +```nix +# Было: +ls = "eza --icons --group-directories-first"; +la = "eza -la --icons --group-directories-first --git"; + +# Стало: +ls = "eza --icons --group-directories-first"; +la = "eza -la --icons --group-directories-first --git"; +lh = "eza -la --icons --group-directories-first --git | head -20"; # Первые 20 +``` + +4. Собрать: +```bash +nh os switch +``` + +## Добавить переменную окружения + +Переменные находятся в секции `sessionVariables`: + +```nix +sessionVariables = { + EDITOR = "micro"; + VISUAL = "code --wait"; + PAGER = "less"; + # Добавить новую переменную: + MY_CUSTOM_VAR = "value"; +}; +``` + +## Примеры alias + +### Быстрая навигация + +```nix +dl = "cd ~/Downloads"; +dt = "cd ~/Desktop"; +dev = "cd ~/dev"; +``` + +### Безопасность + +```nix +rm = "rm -i"; # Подтверждение удаления +cp = "cp -i"; # Подтверждение копирования +mv = "mv -i"; # Подтверждение перемещения +``` + +### Работа с Git + +```nix +g = "git"; +gs = "git status"; +ga = "git add"; +gp = "git push"; +gl = "git log --oneline"; +``` + +### Docker + +```nix +d = "docker"; +dps = "docker ps"; +dpsa = "docker ps -a"; +dex = "docker exec -it"; +``` + +## Организация алиасов + +В `zsh.nix` алиасы организованы по категориям: + +``` +Навигация (cd ...) +Файлы (ls variants) +Безопасность (rm, cp, mv) +Система (grep, df, du) +Сеть (ping, ports) +NixOS (nixos-rebuild и т.д.) +Git +Docker +Kubectl +Lazy инструменты +``` + +## История ZSH + +История настраивается в секции `history`: + +```nix +history = { + size = 50000; # Размер истории + save = 50000; # Сохранять 50000 команд + ignoreDups = true; # Не сохранять дубликаты + ignoreSpace = true; # Не сохранять команды начинающиеся с пробела + share = true; # Делиться историей между сессиями +}; +``` + +## Интеграции + +### Zoxide (быстрая навигация) + +```bash +z # Перейти в папку +zi # Интерактивный выбор +``` + +### Direnv (окружения) + +```bash +# .envrc файл в папке с переменными +cat > .envrc << EOF +export MY_VAR=value +EOF + +direnv allow # Разрешить автоматическое применение +``` + +### FZF (интерактивный поиск) + +```bash +Ctrl+R # Поиск по истории +Ctrl+T # Поиск файлов +``` + +## Проверка после изменения + +```bash +# Просто применить и проверить +nh os switch + +# Потом проверить alias +alias ls # Показать что это такое +``` + +## Примеры полезных alias + +```nix +# Список процессов +ps = "ps aux | grep"; + +# Размер папок +du_sort = "du -sh * | sort -hr"; + +# Network +ip_local = "ip -4 addr show | grep -oP '(?<=inet\\s)\\d+(\\.\\d+){3}' | grep -v 127.0.0.1"; + +# Поиск по типу файла +find_py = "find . -name '*.py'"; +``` + +## Переменные окружения + +### Полезные переменные + +```nix +sessionVariables = { + # Главный редактор + EDITOR = "micro"; + VISUAL = "code --wait"; + + # Пейджер + PAGER = "less"; + + # Данные + XDG_CONFIG_HOME = "$HOME/.config"; + XDG_DATA_HOME = "$HOME/.local/share"; + XDG_CACHE_HOME = "$HOME/.cache"; + + # Язык + LANG = "en_US.UTF-8"; + + # Git + GIT_AUTHOR_NAME = "Dmitry"; + GIT_AUTHOR_EMAIL = "ada.dmitry@gmail.com"; +}; +``` + +## Часто изменяемое + +Самые частые изменения: +1. Добавить новый alias +2. Изменить EDITOR +3. Добавить PATH переменную + +Всё это делается в `zsh.nix` в соответствующих секциях. diff --git a/nixos/docs/03-networking.md b/nixos/docs/03-networking.md new file mode 100644 index 0000000..76278c3 --- /dev/null +++ b/nixos/docs/03-networking.md @@ -0,0 +1,234 @@ +# Сеть: SSH, Firewall, NetworkManager + +Как настроить сетевые сервисы. + +## Где сетевые настройки? + +Сеть находится в двух местах: + +``` +modules/networking/default.nix ← NetworkManager, Firewall +modules/services/default.nix ← SSH и другие сервисы +``` + +## SSH настройки + +SSH находится в `modules/services/default.nix`. + +### Текущие настройки + +```nix +settings = { + # Только публичные ключи + PasswordAuthentication = false; + PubkeyAuthentication = true; + + # root не может логиниться + PermitRootLogin = "no"; + + # Максимум попыток: 3 + MaxAuthTries = 3; + + # Максимум сессий: 2 + MaxSessions = 2; +}; +``` + +### Открыть SSH на определённый порт + +В `modules/networking/default.nix`: + +```nix +# По умолчанию открыт порт 22 +networking.firewall.allowedTCPPorts = [ 22 ]; + +# Если хочешь другой порт (например 2222): +networking.firewall.allowedTCPPorts = [ 2222 ]; +``` + +И в `modules/services/default.nix`: + +```nix +services.openssh.settings = { + Port = 2222; # Добавить эту строку +}; +``` + +## Firewall + +Firewall находится в `modules/networking/default.nix`. + +### Открыть порты + +```nix +networking.firewall.allowedTCPPorts = [ 22 ]; # SSH + +# Добавить новые порты: +networking.firewall.allowedTCPPorts = [ 22 8080 3000 ]; +``` + +### Открыть приложение + +```nix +# Автоматически открыть порты для приложения +services.transmission.openFirewall = true; +services.minecraft-server.openFirewall = true; +``` + +## NetworkManager + +NetworkManager позволяет управлять Wi-Fi и Ethernet. + +### Статус + +```bash +# Статус сети +nmcli status + +# Список Wi-Fi сетей +nmcli dev wifi list + +# Подключиться к Wi-Fi +nmcli dev wifi connect "SSID" password "password" +``` + +## Настройка Hostname + +В `modules/networking/default.nix`: + +```nix +networking.hostname = "nixos-vm"; + +# Изменить на: +networking.hostname = "my-machine"; +``` + +## Интернет соединение + +### Справка: NetworkManager управляет: + +- Wi-Fi (connect/disconnect) +- Ethernet (автоматическое подключение) +- VPN (при установке клиента) +- Прокси (конфигурация) + +### Команды + +```bash +# Включить/выключить Wi-Fi +nmcli radio wifi on/off + +# Список подключений +nmcli con show + +# Отключиться от сети +nmcli con down "connection-name" +``` + +## VPN + +VPN поддержка уже подготовлена в `modules/services/default.nix`: + +```nix +# AmneziaVPN поддержка +services.amnezia.enable = true; # Если добавлено +``` + +## DNS + +Если нужно изменить DNS серверы: + +```nix +# В modules/networking/default.nix +networking.nameservers = [ "1.1.1.1" "8.8.8.8" ]; +``` + +## Проверка после изменений + +```bash +# Применить конфигурацию +nh os switch + +# Проверить статус +systemctl status networking +systemctl status ssh + +# Проверить firewall +sudo firewall-cmd --list-ports # Если используется firewalld +``` + +## Диагностика + +### SSH не работает? + +```bash +# Проверить статус +systemctl status ssh + +# Посмотреть логи +sudo journalctl -u sshd -f + +# Перезагрузить SSH +sudo systemctl restart ssh +``` + +### Нет интернета? + +```bash +# Проверить соединение +ping 8.8.8.8 + +# Проверить DNS +nslookup google.com + +# NetworkManager статус +nmcli status + +# Перезагрузить NetworkManager +sudo systemctl restart NetworkManager +``` + +### Firewall блокирует? + +```bash +# Проверить открытые порты +sudo nftables list tables # Или через nmap + +nmap localhost # Сканирование локального машина + +# Проверить конкретный порт +sudo netstat -tlnp | grep :8080 +``` + +## SSH ключи + +### Генерировать ключ (если нет) + +```bash +ssh-keygen -t ed25519 -C "ada.dmitry@gmail.com" +# или +ssh-keygen -t rsa -b 4096 -C "ada.dmitry@gmail.com" +``` + +### Добавить публичный ключ + +Содержимое `~/.ssh/id_ed25519.pub` нужно добавить на сервер в `~/.ssh/authorized_keys`. + +## Общие команды + +```bash +# Сетевые интерфейсы +ip link show + +# IP адреса +ip addr show + +# Маршруты +ip route show + +# Слушающие порты +sudo netstat -tlnp + +# DNS кэш +systemctl status systemd-resolved +``` diff --git a/nixos/docs/04-devshell.md b/nixos/docs/04-devshell.md new file mode 100644 index 0000000..6d2ffdb --- /dev/null +++ b/nixos/docs/04-devshell.md @@ -0,0 +1,188 @@ +# DevShell: Окружение для разработки + +Как использовать devShell для работы с конфигурацией. + +## Что такое devShell? + +DevShell - это временное окружение с инструментами для разработки конфигурации. + +## Войти в devShell + +```bash +cd /home/ada/.dotfiles/nixos +nix develop +``` + +После этого ты находишься в окружении с дополнительными инструментами. + +## Что в devShell? + +Когда входишь в devShell, доступны: + +``` +nix-output-monitor (nom) - Красивый вывод Nix +nvd - Сравнение версий +nix-tree - Дерево зависимостей +nixfmt-classic - Форматер Nix кода +vim, nano - Редакторы +git, ripgrep, fd - Утилиты +``` + +## Использование devShell + +### Форматировать код + +```bash +# Внутри devShell: +nixfmt-classic home/ada/*.nix +nixfmt-classic modules/**/*.nix +``` + +### Проверить зависимости + +```bash +# Посмотреть дерево +nix-tree nixpkgs# + +# Сравнить версии между поколениями +nvd diff /nix/var/nix/profiles/system /run/current-system +``` + +### Красивый вывод сборки + +```bash +# С красивым выводом +nix-output-monitor -- nix build . +``` + +## Редактировать конфигурацию + +Внутри devShell можно редактировать файлы и сразу их форматировать: + +```bash +vim home/ada/packages.nix + +# После редактирования: +nixfmt-classic home/ada/packages.nix +``` + +## Автоматический вход + +Если у тебя есть `.envrc`, devShell загружается автоматически при входе в папку: + +```bash +cd /home/ada/.dotfiles/nixos +# Если есть direnv - автоматически загрузится devShell +``` + +Спросит разрешение первый раз: +```bash +direnv allow +``` + +## Использование с IDE + +### VS Code + +Если открыть папку в VS Code, он автоматически предложит использовать devShell. + +### Vim/Neovim + +Перед запуском vim: +```bash +nix develop +vim home/ada/zsh.nix +``` + +## Выход из devShell + +```bash +exit +# или +Ctrl+D +``` + +## Типичный workflow + +```bash +# 1. Войти в devShell +cd /home/ada/.dotfiles/nixos +nix develop + +# 2. Отредактировать файл +vim home/ada/packages.nix + +# 3. Форматировать +nixfmt-classic home/ada/packages.nix + +# 4. Проверить синтаксис +nix flake check + +# 5. Вернуться в нормальный shell +exit + +# 6. Собрать конфигурацию (вне devShell) +nh os switch +``` + +## Команды в devShell + +```bash +# Форматирование +nixfmt-classic **/*.nix + +# Проверка +nix flake check +nix flake show --all-systems + +# Анализ +nix-tree +nvd diff + +# Сборка +nom -- nix build . + +# Поиск +rg "pattern" +fd "pattern" +``` + +## Возможные проблемы + +### "command not found" + +Если команда не найдена, убедись что ты внутри devShell: + +```bash +# Проверить +echo $IN_NIX_SHELL + +# Если пусто, войти: +nix develop +``` + +### Долгая загрузка devShell + +Первая загрузка может быть долгой. После этого будет быстрее. + +### Нужен другой инструмент? + +Открой `flake.nix`, найди секцию `devShell` и добавь пакет: + +```nix +devShells.${system}.default = pkgs.mkShell { + buildInputs = with pkgs; [ + # Существующие + nix-output-monitor + + # Добавить новый: + your-package + ]; +}; +``` + +Потом собери: +```bash +exit # Выйти из старого devShell +nix develop # Войти в новый +``` diff --git a/nixos/docs/05-git-config.md b/nixos/docs/05-git-config.md new file mode 100644 index 0000000..e38bb55 --- /dev/null +++ b/nixos/docs/05-git-config.md @@ -0,0 +1,228 @@ +# Git конфигурация + +Как настроить Git алиасы и конфигурацию. + +## Где Git конфиг? + +Git конфигурация находится в: +``` +home/ada/git.nix +``` + +## Пользователь + +```nix +programs.git = { + enable = true; + userName = "Dmitry"; + userEmail = "ada.dmitry@gmail.com"; +``` + +Изменить имя и email: + +```nix +userName = "Твоё имя"; +userEmail = "твой@email.com"; +``` + +## Добавить alias + +Алиасы находятся в `aliases`: + +```nix +aliases = { + # Базовые + st = "status"; + co = "checkout"; + br = "branch"; + + # Твой новый alias: + quick-commit = "commit -am"; +}; +``` + +### Примеры полезных алиасов + +```nix +# Быстрая работа с коммитами +cm = "commit -m"; +amend = "commit --amend"; +undo = "reset --soft HEAD^"; + +# Логи +lg = "log --graph --oneline --all"; +recent = "log -10 --oneline"; + +# Ветки +new-branch = "checkout -b"; +sync = "pull --rebase"; + +# Простые проверки +changed = "diff --name-only"; +staged = "diff --cached"; +``` + +## Глобальный gitignore + +Файлы которые всегда игнорируются: + +```nix +ignores = [ + ".DS_Store" # macOS + "Thumbs.db" # Windows + ".vscode/" # VS Code + ".idea/" # IntelliJ + "*.swp" # Vim + # Добавить свой: + ".myfile" +]; +``` + +## Цвета + +Визуальная конфигурация разных элементов: + +```nix +"color \"branch\"" = { + current = "yellow bold"; + local = "green"; + remote = "cyan"; +}; + +"color \"diff\"" = { + meta = "yellow"; + old = "red bold"; + new = "green bold"; +}; +``` + +Можешь изменять цвета на свой вкус. + +## Основные настройки + +```nix +extraConfig = { + # Ветка по умолчанию + init.defaultBranch = "main"; + + # Автоматический rebase при pull + pull.rebase = true; + + # Редактор для коммитов + core.editor = "micro"; +}; +``` + +## Проверка конфигурации + +После изменений собери конфигурацию: + +```bash +nh os switch +``` + +Проверить что применилось: + +```bash +git config --list | grep user +git config user.name +git alias # Если есть такой alias +``` + +## Использование алиасов + +```bash +# Вместо: +git status + +# Используешь: +g st # Если есть alias g = git +``` + +## Работа с удалёнными репозиториями + +Если нужны специальные алиасы для pull/push: + +```nix +# В алиасах: +pom = "push origin main"; +plm = "pull origin main"; +``` + +## Слияние веток + +```nix +# Алиасы для слияния +merge-main = "merge main"; +merge-dev = "merge develop"; +``` + +## Интерактивные операции + +Хорошие алиасы для интерактивной работы: + +```nix +interactive = "rebase -i"; +fixup = "rebase -i --autosquash"; +``` + +## Проверка перед применением + +```bash +# Посмотреть текущие алиасы +git config --get-regexp alias + +# Проверить синтаксис после редактирования +nix flake check +``` + +## Git UI + +Если хочешь использовать интерактивный Git UI: + +```bash +lazygit # Уже установлен в пакетах +``` + +## Частые операции + +### Быстрый коммит + +```nix +# Добавить алиас +quick = "commit -am"; +``` + +```bash +git quick "commit message" +``` + +### История файла + +```nix +# Алиас +history = "log --oneline"; +``` + +```bash +git history +``` + +### Визуальное дерево + +```bash +# Уже есть +git lg # или git l +``` + +## Если что-то сломалось + +Вернуть конфиг по умолчанию: + +```bash +# Отменить последние изменения +git checkout home/ada/git.nix + +# Пересобрать +nh os switch +``` diff --git a/nixos/docs/06-adding-modules.md b/nixos/docs/06-adding-modules.md new file mode 100644 index 0000000..9159f0e --- /dev/null +++ b/nixos/docs/06-adding-modules.md @@ -0,0 +1,302 @@ +# Добавление новых модулей + +Как создавать расширяющие конфигурацию новые модули. + +## Что такое модуль? + +Модуль - это файл `.nix` который описывает часть конфигурации: + +``` +modules/system/boot.nix - Загрузчик +modules/desktop/plasma.nix - Рабочий стол +home/ada/vim.nix - Vim конфигурация +``` + +## Структура модуля + +Простой модуль выглядит так: + +```nix +{ pkgs, ... }: + +{ + # Здесь твоя конфигурация + services.myservice.enable = true; +} +``` + +## Создание системного модуля + +### Пример: Добавить Transmission (торрент клиент) + +1. Создать файл `modules/services/transmission.nix`: + +```nix +{ pkgs, ... }: + +{ + services.transmission = { + enable = true; + openFirewall = true; + + settings = { + # Конфигурация + rpc-port = 6969; + download-dir = "/home/ada/Downloads"; + }; + }; +} +``` + +2. Добавить импорт в `configuration.nix`: + +```nix +imports = [ + # ... существующие + ./modules/services/transmission.nix # Добавить эту строку +]; +``` + +3. Собрать: + +```bash +nh os switch +``` + +### Пример: Добавить VirtualBox (уже есть) + +Модуль находится в `modules/virtualisation/virtualbox.nix`: + +```nix +{ ... }: + +{ + virtualisation.virtualbox.host.enable = true; + virtualisation.virtualbox.guest.enable = true; +} +``` + +## Создание Home Manager модуля + +### Пример: Конфигурировать Neovim + +1. Создать файл `home/ada/neovim.nix`: + +```nix +{ pkgs, ... }: + +{ + programs.neovim = { + enable = true; + + extraConfig = '' + set number + set relativenumber + set tabstop=2 + ''; + + plugins = with pkgs.vimPlugins; [ + vim-sensible + nord-vim + ]; + }; +} +``` + +2. Добавить импорт в `home/ada/default.nix`: + +```nix +imports = [ + # ... существующие + ./neovim.nix # Добавить +]; +``` + +3. Собрать: + +```bash +nh os switch +``` + +## Распространённые системные модули + +### Принтер CUPS + +```nix +{ ... }: + +{ + services.printing.enable = true; +} +``` + +### PostgreSQL + +```nix +{ ... }: + +{ + services.postgresql = { + enable = true; + package = pkgs.postgresql; + }; +} +``` + +### MySQL + +```nix +{ ... }: + +{ + services.mysql = { + enable = true; + package = pkgs.mysql; + }; +} +``` + +### Docker + +```nix +{ ... }: + +{ + virtualisation.docker.enable = true; + + users.extraGroups.docker = { + members = [ "ada" ]; + }; +} +``` + +## Распространённые Home Manager модули + +### Kitty терминал + +```nix +{ ... }: + +{ + programs.kitty = { + enable = true; + + settings = { + font_family = "FiraCode"; + font_size = 14; + }; + }; +} +``` + +### Helix редактор + +```nix +{ ... }: + +{ + programs.helix = { + enable = true; + }; +} +``` + +### Starship (красивый prompt) + +```nix +{ ... }: + +{ + programs.starship = { + enable = true; + }; +} +``` + +## Правила при создании модулей + +✅ **Делай:** +- Используй русские комментарии +- Оставляй пустые строки между секциями +- Документируй нетривиальные вещи + +❌ **Не делай:** +- Не смешивай систему и Home Manager в одном файле +- Не создавай огромные модули (разбей на части) +- Не создавай дублирующие друг друга файлы + +## Организация модулей + +Системные модули по категориям: + +``` +modules/ + ├── system/ - Ядро системы + │ ├── boot.nix - Загрузчик + │ ├── nix.nix - Nix конфиг + │ └── locale.nix - Язык/время + ├── desktop/ - Рабочий стол + │ ├── plasma.nix + │ └── pipewire.nix + ├── networking/ - Сеть + ├── services/ - Сервисы + ├── users/ - Пользователи + └── virtualisation/ - Виртуализация +``` + +Home Manager модули: + +``` +home/ada/ + ├── default.nix - Главный файл (импорты) + ├── packages.nix - Пакеты + ├── alacritty.nix - Терминал + ├── vim.nix - Vim + ├── git.nix - Git + ├── zsh.nix - Shell + └── ... +``` + +## Типичный workflow + +```bash +# 1. Создать файл модуля +cat > modules/services/myservice.nix << 'EOF' +{ ... }: + +{ + # конфигурация +} +EOF + +# 2. Добавить импорт в configuration.nix +vim configuration.nix + +# 3. Протестировать +nh os test + +# 4. Собрать +nh os switch + +# 5. Проверить +systemctl status myservice +``` + +## Отладка моего модуля + +```bash +# Проверить синтаксис +nix flake check + +# Полный check +nix flake check --all-systems + +# Посмотреть ошибки собственного файла +nix-instantiate modules/services/myservice.nix +``` + +## Полезные ресурсы + +- [NixOS options search](https://search.nixos.org/options) +- [Nixpkgs документация](https://github.com/nixos/nixpkgs) +- [Home Manager опции](https://nix-community.github.io/home-manager/options.html) diff --git a/nixos/docs/07-troubleshooting.md b/nixos/docs/07-troubleshooting.md new file mode 100644 index 0000000..9c776bf --- /dev/null +++ b/nixos/docs/07-troubleshooting.md @@ -0,0 +1,285 @@ +# Отладка и решение проблем + +Что делать когда что-то не работает. + +## Конфигурация не собирается + +### Ошибка синтаксиса + +```bash +# Проверить синтаксис +nix flake check + +# Посмотреть ошибку +nh os test +``` + +Читай ошибку внимательно - она указывает на строку файла. + +## Ошибка: пакет не найден + +```bash +# Проверить существует ли пакет +nix search nixpkgs package-name + +# Полное имя может быть другим +nix search nixpkgs git-lfs +``` + +Если пакет не найден: +1. Проверь имя в [https://search.nixos.org](https://search.nixos.org) +2. Возможно пакет устарел +3. Попробуй альтернативу + +## Ошибка: модуль не импортируется + +```bash +# Если добавил новый модуль и он не применяется +nix flake check + +# Проверить импорт в configuration.nix +grep "./modules/mymodule" configuration.nix + +# Проверить путь (должен быть правильный относительный путь) +``` + +Старые импорты кэшируются. Попробуй: +```bash +rm -rf .direnv # Если использует direnv +nix flake update +``` + +## Сборка зависает + +Обычно при первой сборке это может быть долгим (20-30 минут). + +Если зависает надолго: +```bash +# Прервать (Ctrl+C) + +# Очистить кэш +nix flake update + +# Пробовать снова +nh os test +``` + +## Команда не работает после apply + +```bash +# Обновить PATH +exec $SHELL + +# Или перезагрузить terminal +# В новом окне терминала попробуй команду +``` + +## SSH не работает + +```bash +# Проверить статус +sudo systemctl status ssh + +# Посмотреть логи +sudo journalctl -u sshd -f + +# Перезагрузить +sudo systemctl restart ssh + +# Проверить firewall +sudo nftables list tables +nmcli device show +``` + +## Git алиасы не работают + +```bash +# Применить конфигурацию +nh os switch + +# Проверить что установилась +git config --list | grep alias + +# Перезагрузить shell +exec $SHELL +``` + +## Пакет not found после добавления + +```bash +# Пересобрать +nh os switch + +# Обновить PATH если нужно +exec $SHELL + +# Проверить пакет +which package-name +``` + +## Система не загружается + +Если сломал конфигурацию и система не грузится: + +```bash +# При загрузке в GRUB выбери предыдущую версию системы +``` + +Или откати изменения: +```bash +cd /home/ada/.dotfiles/nixos +git checkout configuration.nix +nh os switch +``` + +## Firewall блокирует + +```bash +# Проверить статус +sudo nftables list tables + +# Открыть порт (редактор файл) +# modules/networking/default.nix +networking.firewall.allowedTCPPorts = [ 22 8080 ]; + +# Собрать +nh os switch +``` + +## Нет интернета + +```bash +# Проверить связь +ping 8.8.8.8 + +# Проверить DNS +nslookup google.com + +# Перезагрузить NetworkManager +sudo systemctl restart NetworkManager + +# Посмотреть статус +nmcli status +``` + +## Логирование и отладка + +### Посмотреть логи системы + +```bash +# Последние ошибки +sudo journalctl -b | tail -50 + +# Логи конкретного сервиса +sudo journalctl -u ssh -f + +# По уровню важности +sudo journalctl -p err +``` + +### Проверить что загрузилось + +```bash +# Посмотреть текущую конфигурацию +systemctl status +ps aux + +# Проверить конкретный сервис +systemctl status sshd +systemctl status NetworkManager +``` + +## Производительность + +Если система медленная: + +```bash +# Посмотреть процессы +btop + +# Посмотреть использование диска +du -sh ~/* + +# Нулевые файлы +find / -size 0 2>/dev/null + +# GC собрал много? +du -sh /nix/store +nix store gc +``` + +## Вернуть рабочее состояние + +### Откатить последнее изменение + +```bash +# В git +git checkout HEAD -- home/ada/packages.nix + +# Пересобрать +nh os switch +``` + +### Посмотреть историю поколений + +```bash +nh os list + +# Откатить на предыдущее поколение +sudo nix-env -p /nix/var/nix/profiles/system --switch-generation N +``` + +### Резервная копия + +Есть файл конфигурации до изменений: +``` +configuration.nix.backup +``` + +Если что-то критичное сломалось: +```bash +cp configuration.nix configuration.nix.broken +cp configuration.nix.backup configuration.nix +nh os switch +``` + +## Получить помощь + +### Проверить логи + +```bash +# Полные логи последней сборки +nixos-rebuild dry-run 2>&1 | head -100 +``` + +### Читать ошибки + +Обычно в ошибке указывается: +1. **Файл** - какой файл конфига проблема +2. **Строка** - на какой строке +3. **Ошибка** - что именно не так + +### Поиск в документации + +```bash +# Поиск опции +nixos-option services.openssh + +# Поиск в nixpkgs +nix search nixpkgs pattern +``` + +## Когда ничего не помогает + +```bash +# 1. Откатить на рабочее состояние +git checkout HEAD~1 + +# 2. Собрать +nh os switch + +# 3. Проверить что работает +systemctl status + +# 4. Медленнее добавить изменения по одному +``` diff --git a/nixos/docs/08-structure.md b/nixos/docs/08-structure.md new file mode 100644 index 0000000..f08472c --- /dev/null +++ b/nixos/docs/08-structure.md @@ -0,0 +1,222 @@ +# Структура проекта + +Как устроена конфигурация. + +## Главные файлы + +``` +flake.nix - Главная входная точка +configuration.nix - Системная конфигурация +``` + +## Папки + +``` +modules/ - Системные модули +home/ada/ - Конфигурация пользователя (Home Manager) +docs/ - Документация (этот гайд) +``` + +## Версионирование + +### flake.nix + +```nix +inputs = { + # Откуда берёмся пакеты + nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11"; + + # Управление пользовательским окружением + home-manager.url = "github:nix-community/home-manager/release-25.11"; +}; +``` + +- NixOS версия: **25.11** (стабильный релиз) +- Home Manager версия: **25.11** (синхронизирована) + +## Системные модули + +### `modules/system/` + +Ядро системы: + +- **boot.nix** - GRUB загрузчик, kernel modules +- **nix.nix** - Nix конфигурация (flakes, gc, substituters) +- **locale.nix** - Таймзона (Europe/Moscow), системные locale + +### `modules/desktop/` + +Рабочее окружение: + +- **plasma.nix** - KDE Plasma 6, Wayland, X11, раскладка клавиатуры +- **pipewire.nix** - Audio система (PipeWire + ALSA) + +### `modules/networking/` + +Сетевые сервисы: + +- **default.nix** - NetworkManager, Firewall + +### `modules/services/` + +Системные сервисы: + +- **default.nix** - SSH (hardened), Firefox, GnuPG, VPN support + +### `modules/users/` + +Управление пользователями: + +- **ada.nix** - Пользователь `ada` (groups, shell: zsh) + +### `modules/virtualisation/` + +Виртуализация: + +- **virtualbox.nix** - VirtualBox Guest Additions + +## Home Manager (Пользователь ada) + +### `home/ada/default.nix` + +Главный файл (импорты всех модулей): + +```nix +home.username = "ada"; +home.homeDirectory = "/home/ada"; +home.stateVersion = "25.05"; +``` + +### Модули пользователя + +| Файл | Назначение | +|------|-----------| +| packages.nix | 50+ пакетов (организованы по категориям) | +| alacritty.nix | Терминальный эмулятор (Nord тема, FiraCode) | +| vim.nix | Vim редактор (Nord тема, плагины) | +| micro.nix | Micro редактор (простой редактор) | +| git.nix | Git конфигурация (15+ алиасов, colors) | +| zsh.nix | ZSH shell (30+ алиасов, интеграции) | +| tmux.nix | Tmux терминальный мультиплексер (VI mode) | +| tools.nix | CLI утилиты (bat, fzf, direnv) | + +## Информационный поток + +``` +flake.nix (входная точка) + ↓ + ├─→ nixpkgs (версия 25.11) + ├─→ home-manager (версия 25.11) + └─→ nixos-hardware + +configuration.nix (система) + ├─→ hardware-configuration.nix + ├─→ modules/system/* (boot, nix, locale) + ├─→ modules/desktop/* (plasma, pipewire) + ├─→ modules/networking/* (network) + ├─→ modules/services/* (ssh, firefox, etc.) + ├─→ modules/users/* (пользователь) + ├─→ modules/virtualisation/* (vbox) + └─→ Home Manager (через special args) + +home/ada/default.nix (пользователь) + ├─→ packages.nix (50+ пакетов) + ├─→ alacritty.nix (терминал) + ├─→ vim.nix (editor) + ├─→ micro.nix (editor) + ├─→ git.nix (git config) + ├─→ zsh.nix (shell) + ├─→ tmux.nix (multiplexer) + └─→ tools.nix (utilities) +``` + +## Категории пакетов + +В `packages.nix` пакеты организованы так: + +``` +Редакторы vim, neovim, micro +IDE vscode, idea-community, zed +Терминал alacritty +Dev tools tmux, fzf, ripgrep, fd, bat, eza... +Git git, gh, lazygit +Сеть curl, wget, ssh, mosh, nmap... +БД sqlite, postgresql +Утилиты jq, yq, zip, unzip, gnupg... +Шрифты nerdfonts (FiraCode) +``` + +## Какой файл менять? + +| Задача | Файл | +|--------|------| +| Добавить переменную окружения | `home/ada/zsh.nix` | +| Добавить программу | `home/ada/packages.nix` | +| Изменить Git конфиг | `home/ada/git.nix` | +| Добавить Shell alias | `home/ada/zsh.nix` | +| Настроить SSH | `modules/services/default.nix` | +| Открыть firewall порт | `modules/networking/default.nix` | +| Добавить язык/locale | `modules/system/locale.nix` | +| Установить новый сервис | Создать новый модуль в `modules/` | +| Конфигурировать программу | Создать новый модуль в `home/ada/` | + +## Версия конфигурации + +```nix +# configuration.nix +system.stateVersion = "25.05"; + +# home/ada/default.nix +home.stateVersion = "25.05"; + +# Обновить можно когда готов к миграции +# Но ОСТОРОЖНО - читай документацию NixOS +``` + +## Как это всё работает? + +1. **flake.nix** - говорит Nix где брать пакеты и как их собрать +2. **configuration.nix** - импортирует все системные модули +3. **modules/** - каждый модуль отвечает за часть системы +4. **home/ada/default.nix** - импортирует все пользовательские модули +5. **home/ada/** - каждый модуль конфигурирует программу + +### Когда ты делаешь `nh os switch`: + +``` +1. Нужно собрать конфигурацию +2. Nix читает flake.nix +3. Понимает что использовать из inputs (nixpkgs, home-manager) +4. Собирает configuration.nix (импортирует все modules/) +5. Собирает home/ada/default.nix через Home Manager +6. Создаёт результат (нов поколение системы) +7. Переключается на него +``` + +## Быстрая справка + +```bash +# Посмотреть версию +cat configuration.nix | grep stateVersion + +# Посмотреть импорты +head -30 configuration.nix + +# Список всех модулей +ls -la modules/**/*.nix + +# Список Home Manager модулей +ls -la home/ada/*.nix + +# Найти файл по названию +find . -name "*ssh*" +``` + +## Следующие шаги + +Если хочешь что-то изменить: + +1. Найди нужный файл (выше таблица) +2. Отредактируй его +3. Собери: `nh os switch` +4. Если не работает → см. docs/07-troubleshooting.md diff --git a/nixos/docs/README.md b/nixos/docs/README.md new file mode 100644 index 0000000..553227b --- /dev/null +++ b/nixos/docs/README.md @@ -0,0 +1,39 @@ +# 📚 Документация NixOS конфигурации + +Каждый файл в этой папке - это небольшой гайд по конкретной задаче. + +## 📖 Гайды + +- **[01-install-packages.md](01-install-packages.md)** — Добавление и удаление пакетов +- **[02-shell-environment.md](02-shell-environment.md)** — Shell alias, переменные окружения +- **[03-networking.md](03-networking.md)** — SSH, firewall, сетевые настройки +- **[04-devshell.md](04-devshell.md)** — Работа с devShell для разработки +- **[05-git-config.md](05-git-config.md)** — Git конфигурация и алиасы +- **[06-adding-modules.md](06-adding-modules.md)** — Создание новых модулей +- **[07-troubleshooting.md](07-troubleshooting.md)** — Отладка проблем +- **[08-structure.md](08-structure.md)** — Структура проекта + +## ⚡ Быстрый старт + +```bash +cd /home/ada/.dotfiles/nixos + +# Собрать конфигурацию +sudo nixos-rebuild switch --flake . + +# Или с nh (проще): +nh os switch +``` + +## 🔍 Найти нужное + +| Задача | Файл | +|--------|------| +| Добавить пакет | 01-install-packages.md | +| Добавить shell alias | 02-shell-environment.md | +| Конфигурировать SSH | 03-networking.md | +| Использовать devShell | 04-devshell.md | +| Настроить Git | 05-git-config.md | +| Создать новый модуль | 06-adding-modules.md | +| Что-то не работает | 07-troubleshooting.md | +| Как всё устроено | 08-structure.md | diff --git a/nixos/flake.nix b/nixos/flake.nix index 4f310da..b27554c 100644 --- a/nixos/flake.nix +++ b/nixos/flake.nix @@ -1,23 +1,85 @@ { - description = "NixOS Configuration Flake"; + description = "Модульная конфигурация NixOS 25.11 на Flake с Home Manager для виртуальной машины"; inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + # Nixpkgs - главный репозиторий пакетов + # Используем nixos-25.11 для стабильности вместо unstable + nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11"; + + # Hardware profiles для различных машин nixos-hardware.url = "github:nixos/nixos-hardware"; + + # Home Manager для управления конфигурацией пользователя + home-manager = { + url = "github:nix-community/home-manager/release-25.11"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; - outputs = { self, nixpkgs, nixos-hardware }: + outputs = { self, nixpkgs, nixos-hardware, home-manager }: let + # Переменные для переиспользования system = "x86_64-linux"; - pkgs = nixpkgs.legacyPackages.${system}; + version = "25.11"; + + pkgs = import nixpkgs { + inherit system; + config.allowUnfree = true; + }; in { + # Главная конфигурация NixOS nixosConfigurations.nixos-vm = nixpkgs.lib.nixosSystem { inherit system; + specialArgs = { + inherit pkgs; + }; + modules = [ - ./nixos/configuration.nix + ./configuration.nix + + # Модуль Home Manager для управления конфигурацией пользователя + home-manager.nixosModules.home-manager + { + home-manager.useGlobalPkgs = true; + home-manager.useUserPackages = true; + home-manager.users.ada = import ./home/ada/default.nix; + } ]; }; + + # Окружение для разработки конфигурации + devShells.${system}.default = pkgs.mkShell { + description = "Development environment для NixOS конфигурации"; + buildInputs = with pkgs; [ + # Инструменты Nix + nix-output-monitor + nvd + nix-tree + nixfmt-classic + + # Редакторы + vim + nano + + # Утилиты для работы + git + ripgrep + fd + ]; + + shellHook = '' + echo "🚀 Development environment loaded" + echo "📚 Доступные утилиты:" + echo " - nixfmt: Форматирование Nix кода" + echo " - nvd: Сравнение версий" + echo " - nix-tree: Дерево зависимостей" + echo "💡 Совет: запусти 'nh os switch' для применения конфигурации" + ''; + }; + + # Форматеры кода + formatter.${system} = pkgs.nixfmt-classic; }; } diff --git a/nixos/home/ada/alacritty.nix b/nixos/home/ada/alacritty.nix new file mode 100644 index 0000000..99e077a --- /dev/null +++ b/nixos/home/ada/alacritty.nix @@ -0,0 +1,121 @@ +{ pkgs, ... }: + +{ + # Alacritty - GPU-ускоренный эмулятор терминала + programs.alacritty = { + enable = true; + + settings = { + # Оболочка по умолчанию с автоматическим запуском tmux + shell = { + program = "${pkgs.zsh}/bin/zsh"; + args = [ "-l" "-c" "tmux new-session -A -s main" ]; + }; + + # Настройки окна + window = { + decorations = "None"; # Без рамок и заголовка + startup_mode = "Maximized"; # Растянуто на весь экран + opacity = 0.80; + padding = { + x = 10; + y = 5; + }; + }; + + # Шрифты + font = { + size = 15.0; + normal = { + family = "FiraCode Nerd Font Mono"; + style = "Regular"; + }; + bold = { + family = "FiraCode Nerd Font Mono"; + style = "Bold"; + }; + italic = { + family = "FiraCode Nerd Font Mono"; + style = "Italic"; + }; + }; + + # Прокрутка + scrolling = { + history = 10000; + multiplier = 5; + }; + + # Выделение + selection = { + save_to_clipboard = true; + semantic_escape_chars = "@-./_~?&=%+#"; + }; + + # Мышь + mouse = { + hide_when_typing = false; + }; + + # Курсор + cursor = { + blink_interval = 500; + thickness = 0.15; + style = { + shape = "Beam"; + blinking = "On"; + }; + }; + + # Звуковой сигнал (отключен) + bell = { + animation = "EaseOutExpo"; + duration = 0; + }; + + # Nord цветовая схема + # https://www.nordtheme.com/ + colors = { + primary = { + background = "#2E3440"; + foreground = "#D8DEE9"; + }; + cursor = { + text = "#2E3440"; + cursor = "#D8DEE9"; + }; + selection = { + text = "#D8DEE9"; + background = "#434C5E"; + }; + normal = { + black = "#3B4252"; + red = "#BF616A"; + green = "#A3BE8C"; + yellow = "#EBCB8B"; + blue = "#81A1C1"; + magenta = "#B48EAD"; + cyan = "#88C0D0"; + white = "#E5E9F0"; + }; + bright = { + black = "#4C566A"; + red = "#BF616A"; + green = "#A3BE8C"; + yellow = "#EBCB8B"; + blue = "#81A1C1"; + magenta = "#B48EAD"; + cyan = "#8FBCBB"; + white = "#ECEFF4"; + }; + }; + + # Горячие клавиши + keyboard.bindings = [ + { key = "C"; mods = "Control|Shift"; action = "Copy"; } + { key = "V"; mods = "Control|Shift"; action = "Paste"; } + { key = "Return"; mods = "Control|Shift"; action = "SpawnNewInstance"; } + ]; + }; + }; +} diff --git a/nixos/home/ada/default.nix b/nixos/home/ada/default.nix new file mode 100644 index 0000000..1fb493e --- /dev/null +++ b/nixos/home/ada/default.nix @@ -0,0 +1,45 @@ +{ config, pkgs, ... }: + +{ + + # Импорт модульных конфигураций + imports = [ + # Визуальные программы + ./alacritty.nix + ./vim.nix + ./micro.nix + + # Конфигурация оболочеки и инструментов + ./git.nix + ./zsh.nix + ./tmux.nix + + # Утилиты и пакеты + ./tools.nix + ./packages.nix + ]; + + + # Основные настройки Home Manager + + + # Информация о пользователе + home.username = "ada"; + home.homeDirectory = "/home/ada"; + + # Версия Home Manager + # Это значение определяет релиз Home Manager, с которым совместима конфигурация. + # Это помогает избежать поломок при выходе новых релизов с несовместимыми изменениями. + home.stateVersion = "25.11"; + + # Разрешить Home Manager управлять собой + programs.home-manager.enable = true; + + + # Общие переменные окружения + + home.sessionVariables = { + EDITOR = "micro"; + VISUAL = "code --wait"; + }; +} diff --git a/nixos/home/ada/git.nix b/nixos/home/ada/git.nix new file mode 100644 index 0000000..a282078 --- /dev/null +++ b/nixos/home/ada/git.nix @@ -0,0 +1,126 @@ +{ config, pkgs, ... }: + +{ + # Git - система контроля версий + programs.git = { + enable = true; + userName = "Dmitry"; + userEmail = "ada.dmitry@gmail.com"; + + extraConfig = { + # Основные настройки + init.defaultBranch = "main"; + pull.rebase = true; + core = { + editor = "micro"; + filemode = false; + autocrlf = "input"; + whitespace = "trailing-space,space-before-tab"; + pager = "less -FRXS"; + }; + + # Цвета + color = { + ui = "auto"; + branch = "auto"; + diff = "auto"; + status = "auto"; + }; + + "color \"branch\"" = { + current = "yellow bold"; + local = "green"; + remote = "cyan"; + }; + + "color \"diff\"" = { + meta = "yellow"; + frag = "magenta bold"; + old = "red bold"; + new = "green bold"; + whitespace = "red reverse"; + }; + + "color \"status\"" = { + added = "green bold"; + changed = "yellow bold"; + untracked = "red bold"; + }; + }; + + # Алиасы из .gitconfig + aliases = { + # Базовые сокращения + st = "status"; + co = "checkout"; + br = "branch"; + ci = "commit"; + cm = "commit -m"; + ca = "commit --amend"; + + # Добавление файлов + a = "add"; + aa = "add --all"; + ap = "add --patch"; + + # Логи + l = "log --oneline --graph --decorate"; + lg = "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"; + ll = "log --pretty=format:'%C(yellow)%h%Cred%d %Creset%s%Cblue [%cn]' --decorate --numstat"; + ls = "log --pretty=format:'%C(yellow)%h %Cred%ad %Cblue%an%Creset%d %s' --date=short"; + lol = "log --graph --decorate --pretty=oneline --abbrev-commit"; + lola = "log --graph --decorate --pretty=oneline --abbrev-commit --all"; + + # История файла + filelog = "log -u"; + fl = "log -u"; + + # Diff + d = "diff"; + ds = "diff --staged"; + dc = "diff --cached"; + + # Показать последний коммит + last = "log -1 HEAD --stat"; + + # Отменить последний коммит (сохранив изменения) + undo = "reset --soft HEAD^"; + + # Показать изменения в файле + blame = "blame -w -M -C"; + }; + + # Глобальный gitignore + ignores = [ + # OS Generated + ".DS_Store" + ".AppleDouble" + ".LSOverride" + "._*" + "*~" + ".directory" + ".Trash-*" + "Thumbs.db" + "ehthumbs.db" + "Desktop.ini" + "$RECYCLE.BIN/" + + # IDEs & Editors + ".vscode/" + "*.code-workspace" + ".history/" + ".idea/" + "*.iml" + "*.ipr" + "*.iws" + ".idea_modules/" + "*.swp" + "*.swo" + ".*.sw?" + "Session.vim" + "#*#" + ".#*" + ".projectile" + ]; + }; +} diff --git a/nixos/home/ada/micro.nix b/nixos/home/ada/micro.nix new file mode 100644 index 0000000..ff97f7d --- /dev/null +++ b/nixos/home/ada/micro.nix @@ -0,0 +1,32 @@ +{ pkgs, ... }: + +{ + # Micro - современный терминальный редактор + programs.micro = { + enable = true; + + settings = { + # Автосохранение и undo + autosu = true; + saveundo = true; + savecursor = true; + + # Цветовая схема + colorscheme = "simple"; + + # Поведение + mkparents = true; # Создавать родительские директории + rmtrailingws = true; # Удалять trailing whitespace + tabstospaces = true; # Заменять табы на пробелы + scrollbar = true; # Показывать scrollbar + + # Строка состояния + statusformatl = "$(filename) $(modified)($(line),$(col)) $(opt:filetype) $(opt:fileformat)"; + }; + }; + + # Добавить micro в $PATH и установить как основной редактор + home.sessionVariables = { + EDITOR = "micro"; + }; +} diff --git a/nixos/home/ada/packages.nix b/nixos/home/ada/packages.nix new file mode 100644 index 0000000..54937e6 --- /dev/null +++ b/nixos/home/ada/packages.nix @@ -0,0 +1,90 @@ +{ config, pkgs, ... }: + +{ + # Списование пакетов для различных нужд + home.packages = with pkgs; [ + # ══════════════════════════════════════════════════════════════════ + # Редакторы + # ══════════════════════════════════════════════════════════════════ + neovim + micro + + # ══════════════════════════════════════════════════════════════════ + # IDE + # ══════════════════════════════════════════════════════════════════ + vscode + jetbrains.idea-community + zed-editor + + # ══════════════════════════════════════════════════════════════════ + # Терминал + # ══════════════════════════════════════════════════════════════════ + alacritty + + # ══════════════════════════════════════════════════════════════════ + # Средства разработки и навигации + # ══════════════════════════════════════════════════════════════════ + tmux # Мультиплексер терминала + fzf # Интерактивный поиск + ripgrep # Быстрый поиск в файлах (rg) + ripgrep-all # Ripgrep для всех типов файлов (rga) + fd # Альтернатива find + bat # Замена cat с подсветкой + eza # Замена ls с иконками + lsd # Ещё одна замена ls + htop # Интерактивный монитор процессов + btop # Современный монитор ресурсов + bottom # Альтернатива top/htop + tree # Вывод дерева директорий + zoxide # Умная навигация (z, zi) + just # Альтернатива make для скриптов + tokei # Анализатор кода (строки, блоки кода) + nitch # Минималистичный neofetch аналог + difftastic # Красивый синтаксис для diff + + # ══════════════════════════════════════════════════════════════════ + # Инструменты Git + # ══════════════════════════════════════════════════════════════════ + git # Система контроля версий + gh # GitHub CLI + lazygit # Интерактивный git UI + + # ══════════════════════════════════════════════════════════════════ + # Разработка и интеграция + # ══════════════════════════════════════════════════════════════════ + pre-commit # Git hooks framework + nodePackages.prettier # Code formatter (Markdown, JSON, YAML, etc.) + + # ══════════════════════════════════════════════════════════════════ + # Сетевые утилиты + # ══════════════════════════════════════════════════════════════════ + curl # Загрузка файлов через URL + wget # Загрузчик файлов + openssh # SSH клиент и сервер + mosh # SSH альтернатива с поддержкой мобильности + nmap # Сканер портов и сетевая диагностика + net-tools # Классические утилиты (netstat, arp и т.д.) + drill # DNS утилита (альтернатива dig) + + # ══════════════════════════════════════════════════════════════════ + # Базы данных и хранилище + # ══════════════════════════════════════════════════════════════════ + sqlite # Встраиваемая реляционная БД + postgresql # Клиент PostgreSQL + + # ══════════════════════════════════════════════════════════════════ + # Утилиты + # ══════════════════════════════════════════════════════════════════ + jq # Обработка JSON + yq # Обработка YAML (аналог jq для YAML) + unzip # Распаковка zip архивов + zip # Создание zip архивов + p7zip # 7-Zip архиватор + gnupg # Шифрование и подписание + + # ══════════════════════════════════════════════════════════════════ + # Шрифты + # ══════════════════════════════════════════════════════════════════ + (pkgs.nerdfonts.override { fonts = [ "FiraCode" ]; }) + ]; +} diff --git a/nixos/home/ada/tmux.nix b/nixos/home/ada/tmux.nix new file mode 100644 index 0000000..b5e831a --- /dev/null +++ b/nixos/home/ada/tmux.nix @@ -0,0 +1,29 @@ +{ config, pkgs, ... }: + +{ + # Tmux - мультиплексер терминала + programs.tmux = { + enable = true; + terminal = "screen-256color"; + keyMode = "vi"; + mouse = true; + prefix = "C-a"; + + extraConfig = '' + # Разделить панели используя | и - + bind | split-window -h + bind - split-window -v + unbind '"' + unbind % + + # Перезагрузить конфигурацию + bind r source-file ~/.tmux.conf + + # Переключение панелей используя Alt-стрелки без prefix + bind -n M-Left select-pane -L + bind -n M-Right select-pane -R + bind -n M-Up select-pane -U + bind -n M-Down select-pane -D + ''; + }; +} diff --git a/nixos/home/ada/tools.nix b/nixos/home/ada/tools.nix new file mode 100644 index 0000000..ee19db1 --- /dev/null +++ b/nixos/home/ada/tools.nix @@ -0,0 +1,27 @@ +{ config, pkgs, ... }: + +{ + # Утилиты для работы с CLI + + # Bat - замена cat с подсветкой синтаксиса + programs.bat = { + enable = true; + config = { + theme = "TwoDark"; + pager = "less -FR"; + }; + }; + + # FZF - интерактивный поиск + programs.fzf = { + enable = true; + enableZshIntegration = true; + }; + + # Direnv - управление окружением по директориям + programs.direnv = { + enable = true; + enableZshIntegration = true; + nix-direnv.enable = true; + }; +} diff --git a/nixos/home/ada/vim.nix b/nixos/home/ada/vim.nix new file mode 100644 index 0000000..95d68be --- /dev/null +++ b/nixos/home/ada/vim.nix @@ -0,0 +1,112 @@ +{ pkgs, ... }: + +{ + # Vim - легковесный редактор + programs.vim = { + enable = true; + + # Включить все улучшения по умолчанию + defaultEditor = false; # Micro - основной редактор + + # Настройки + settings = { + # Отображение + number = true; + relativenumber = true; + + # Отступы + expandtab = true; + shiftwidth = 2; + tabstop = 2; + smartindent = true; + + # Поиск + ignorecase = true; + smartcase = true; + + # Файлы + swapfile = false; + undofile = true; + + # История команд + history = 1000; + }; + + # Конфигурация из .vimrc + extraConfig = '' + " Ada's Vim config — lightweight and close to Neovim setup + scriptencoding utf-8 + set nocompatible + + " Leader + let mapleader = " " + + " UI + set cursorline + set signcolumn=yes + set termguicolors + + " Performance + set updatetime=200 + set timeoutlen=400 + + " Splits + set splitbelow + set splitright + + " Clipboard (prefer system clipboard if available) + if has('unnamedplus') + set clipboard=unnamedplus + endif + + " Keymaps + nnoremap j gj + nnoremap k gk + nnoremap w :w + nnoremap q :q + nnoremap h :nohlsearch + + " Windows + nnoremap sv v + nnoremap sh s + nnoremap se = + nnoremap sx :close + + " Buffers + nnoremap :bnext + nnoremap :bprevious + + " Quickfix + nnoremap ]q :cnext + nnoremap [q :cprev + + " Autocommands + augroup AdaCore + autocmd! + " Resize splits equally on terminal resize + autocmd VimResized * tabdo wincmd = + " Disable auto comment on new line + autocmd FileType * setlocal formatoptions-=o formatoptions-=r + augroup END + ''; + + # Плагины через vim-plug (устанавливается автоматически) + plugins = with pkgs.vimPlugins; [ + # Тема Nord + nord-vim + + # Fuzzy finder + fzf-vim + + # Файловое дерево + nerdtree + + # Редактирование + vim-surround + vim-commentary + + # Git + vim-gitgutter + ]; + }; +} diff --git a/nixos/home/ada/zsh.nix b/nixos/home/ada/zsh.nix new file mode 100644 index 0000000..43f15a2 --- /dev/null +++ b/nixos/home/ada/zsh.nix @@ -0,0 +1,154 @@ +{ config, pkgs, ... }: + +{ + # ZSH - расширенная оболочка + programs.zsh = { + enable = true; + enableCompletion = true; + autosuggestion.enable = true; + syntaxHighlighting.enable = true; + + # Переменные окружения + sessionVariables = { + EDITOR = "micro"; + VISUAL = "code --wait"; + PAGER = "less"; + + # XDG Base Directories + XDG_CONFIG_HOME = "$HOME/.config"; + XDG_DATA_HOME = "$HOME/.local/share"; + XDG_CACHE_HOME = "$HOME/.cache"; + XDG_STATE_HOME = "$HOME/.local/state"; + + # История + HISTFILE = "$XDG_STATE_HOME/zsh/history"; + HISTSIZE = "50000"; + SAVEHIST = "50000"; + + # Less + LESS = "-R -M -i -j10"; + + # Цвета + CLICOLOR = "1"; + + # FZF + FZF_DEFAULT_OPTS = "--height 40% --layout=reverse --border --inline-info"; + FZF_DEFAULT_COMMAND = "fd --type f --hidden --follow --exclude .git"; + + # Go + GOPATH = "$HOME/go"; + + # Rust + CARGO_HOME = "$HOME/.cargo"; + + # Python + PYTHONDONTWRITEBYTECODE = "1"; + }; + + shellAliases = { + # Навигация + ".." = "cd .."; + "..." = "cd ../.."; + "...." = "cd ../../.."; + "....." = "cd ../../../.."; + + # Быстрый доступ + dl = "cd ~/Downloads"; + dt = "cd ~/Desktop"; + doc = "cd ~/Documents"; + dev = "cd ~/dev"; + + # Списки файлов (eza) + ls = "eza --icons --group-directories-first"; + ll = "eza -l --icons --group-directories-first --git"; + la = "eza -la --icons --group-directories-first --git"; + lt = "eza --tree --level=2 --icons"; + l = "eza -lah --icons --group-directories-first --git"; + + # Безопасность + rm = "rm -i"; + cp = "cp -i"; + mv = "mv -i"; + + # Системные + grep = "grep --color=auto"; + df = "df -h"; + du = "du -h"; + free = "free -h"; + + # Сеть + ping = "ping -c 5"; + ports = "netstat -tulanp"; + localip = "ip -4 addr show | grep -oP '(?<=inet\\s)\\d+(\\.\\d+){3}' | grep -v 127.0.0.1"; + + # NixOS - используем nh для удобства + nixos-rebuild = "nh os switch"; + nixos-test = "nh os test"; + nixos-boot = "nh os boot"; + nixos-update = "cd /home/ada/.dotfiles/nixos && nix flake update && nh os switch"; + nixos-list = "nh os list"; + + # Git + g = "git"; + gs = "git status"; + gst = "git --no-pager status"; + ga = "git add"; + gaa = "git add ."; + gc = "git commit"; + gcm = "git commit -m"; + gp = "git push"; + gpl = "git pull"; + gd = "git diff"; + gco = "git checkout"; + gb = "git branch"; + gl = "git log --oneline --graph --decorate"; + glog = "git log --oneline --graph --decorate --all"; + + # Docker + d = "docker"; + dc = "docker-compose"; + dps = "docker ps"; + dpsa = "docker ps -a"; + di = "docker images"; + dex = "docker exec -it"; + dlog = "docker logs -f"; + + # Kubectl + k = "kubectl"; + kgp = "kubectl get pods"; + + # Lazy инструменты + lg = "lazygit"; + }; + + # История + history = { + size = 50000; + save = 50000; + path = "$HOME/.local/state/zsh/history"; + ignoreDups = true; + ignoreSpace = true; + share = true; + }; + + initExtra = '' + # Включить zoxide (умная навигация) + eval "$(zoxide init zsh)" + + # Включить direnv + eval "$(direnv hook zsh)" + + # FZF конфигурация с Catppuccin цветами + export FZF_DEFAULT_OPTS="$FZF_DEFAULT_OPTS \ + --color=bg+:#313244,bg:#1e1e2e,spinner:#f5e0dc,hl:#f38ba8 \ + --color=fg:#cdd6f4,header:#f38ba8,info:#cba6f7,pointer:#f5e0dc \ + --color=marker:#f5e0dc,fg+:#cdd6f4,prompt:#cba6f7,hl+:#f38ba8" + + # FZF используем fd вместо find + export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND" + + # Создать директорию для истории если не существует + [[ ! -d "$(dirname $HISTFILE)" ]] && mkdir -p "$(dirname $HISTFILE)" + ''; + }; +} diff --git a/nixos/modules/desktop/pipewire.nix b/nixos/modules/desktop/pipewire.nix new file mode 100644 index 0000000..18d4bbe --- /dev/null +++ b/nixos/modules/desktop/pipewire.nix @@ -0,0 +1,18 @@ +{ ... }: + +{ + # Отключение PulseAudio + services.pulseaudio.enable = false; + + # Включение RealtimeKit для низколатентного аудио + security.rtkit.enable = true; + + # Включение PipeWire + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + # jack.enable = true; # Раскомментируйте для поддержки JACK + }; +} diff --git a/nixos/modules/desktop/plasma.nix b/nixos/modules/desktop/plasma.nix new file mode 100644 index 0000000..78c3e81 --- /dev/null +++ b/nixos/modules/desktop/plasma.nix @@ -0,0 +1,43 @@ +{ pkgs, ... }: + +{ + # Включение X11 и Wayland + services.xserver.enable = true; + + # Окружение рабочего стола KDE Plasma 6 + services.displayManager.sddm = { + enable = true; + wayland.enable = true; + }; + + services.desktopManager.plasma6.enable = true; + + # Настройка раскладки клавиатуры + services.xserver.xkb = { + layout = "us,ru"; # Английская и русская раскладки + variant = ""; + options = "grp:caps_toggle"; # Переключение раскладки по Caps Lock + }; + + # Поддержка Wayland для Electron приложений + environment.sessionVariables.NIXOS_OZONE_WL = "1"; + + # Включение CUPS для печати + services.printing.enable = true; + + # Дополнительные пакеты KDE/Qt + environment.systemPackages = with pkgs; [ + kdePackages.plasma-browser-integration + kdePackages.kio-extras + kdePackages.kio-fuse + kdePackages.kate + kdePackages.kcalc + kdePackages.kcharselect + kdePackages.filelight + kdePackages.partitionmanager + kdePackages.ark + kdePackages.okular + kdePackages.gwenview + kdePackages.spectacle + ]; +} diff --git a/nixos/modules/networking/default.nix b/nixos/modules/networking/default.nix new file mode 100644 index 0000000..43b979c --- /dev/null +++ b/nixos/modules/networking/default.nix @@ -0,0 +1,16 @@ +{ ... }: + +{ + # Имя хоста + networking.hostName = "nixos-vm"; + + # Включение NetworkManager + networking.networkmanager.enable = true; + + # Конфигурация фаервола + networking.firewall = { + enable = true; + allowedTCPPorts = [ 22 ]; # SSH + # allowedUDPPorts = [ ... ]; + }; +} diff --git a/nixos/modules/services/default.nix b/nixos/modules/services/default.nix new file mode 100644 index 0000000..d636621 --- /dev/null +++ b/nixos/modules/services/default.nix @@ -0,0 +1,65 @@ +{ pkgs, ... }: + +{ + # Сервер OpenSSH с усиленной безопасностью + services.openssh = { + enable = true; + + settings = { + # Аутентификация + PasswordAuthentication = false; + PubkeyAuthentication = true; + PermitRootLogin = "no"; + KbdInteractiveAuthentication = false; + ChallengeResponseAuthentication = false; + PermitEmptyPasswords = false; + + # Сессии и доступ + LoginGraceTime = 30; + MaxAuthTries = 3; + MaxSessions = 2; + ClientAliveInterval = 300; + ClientAliveCountMax = 2; + + # Отключить устаревшие возможности + X11Forwarding = false; + AllowAgentForwarding = false; + PermitUserEnvironment = false; + }; + + # Дополнительная конфигурация + extraConfig = '' + # Authentication methods + AuthenticationMethods publickey + + # Reduce legacy or risky features + IgnoreRhosts yes + HostbasedAuthentication no + TCPKeepAlive no + + # Connection throttling + MaxStartups 10:30:60 + ''; + }; + + # Агент GnuPG + programs.gnupg.agent = { + enable = true; + enableSSHSupport = true; + }; + + # MTR для сетевой диагностики + programs.mtr.enable = true; + + # Firefox + programs.firefox.enable = true; + + # AmneziaVPN + programs.amnezia-vpn.enable = true; + + # Системные пакеты + environment.systemPackages = with pkgs; [ + amneziawg-tools + neofetch + ]; +} diff --git a/nixos/modules/system/boot.nix b/nixos/modules/system/boot.nix new file mode 100644 index 0000000..231d13f --- /dev/null +++ b/nixos/modules/system/boot.nix @@ -0,0 +1,17 @@ +{ config, lib, pkgs, ... }: + +{ + # Конфигурация загрузчика + boot.loader.grub = { + enable = true; + device = "/dev/sda"; + useOSProber = true; + }; + + # Параметры ядра + boot.kernelParams = [ "quiet" ]; + + # Модуль ядра AmneziaWG + boot.extraModulePackages = [ config.boot.kernelPackages.amneziawg ]; + boot.kernelModules = [ "amneziawg" ]; +} diff --git a/nixos/modules/system/locale.nix b/nixos/modules/system/locale.nix new file mode 100644 index 0000000..fb83659 --- /dev/null +++ b/nixos/modules/system/locale.nix @@ -0,0 +1,21 @@ +{ ... }: + +{ + # Часовой пояс + time.timeZone = "Europe/Moscow"; + + # Интернационализация + i18n.defaultLocale = "en_US.UTF-8"; + + i18n.extraLocaleSettings = { + LC_ADDRESS = "ru_RU.UTF-8"; + LC_IDENTIFICATION = "ru_RU.UTF-8"; + LC_MEASUREMENT = "ru_RU.UTF-8"; + LC_MONETARY = "ru_RU.UTF-8"; + LC_NAME = "ru_RU.UTF-8"; + LC_NUMERIC = "ru_RU.UTF-8"; + LC_PAPER = "ru_RU.UTF-8"; + LC_TELEPHONE = "ru_RU.UTF-8"; + LC_TIME = "ru_RU.UTF-8"; + }; +} diff --git a/nixos/modules/system/nix.nix b/nixos/modules/system/nix.nix new file mode 100644 index 0000000..b040a52 --- /dev/null +++ b/nixos/modules/system/nix.nix @@ -0,0 +1,60 @@ +{ pkgs, ... }: + +{ + # Конфигурация Nix с flakes и оптимизациями + nix = { + package = pkgs.nixVersions.latest; + + settings = { + experimental-features = [ "nix-command" "flakes" ]; + auto-optimise-store = true; + + # Substituters для более быстрой загрузки + substituters = [ + "https://cache.nixos.org/" + "https://nix-community.cachix.org" + ]; + + trusted-public-keys = [ + "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" + "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" + ]; + }; + + # Автоматическая сборка мусора + gc = { + automatic = true; + dates = "weekly"; + options = "--delete-older-than 7d"; + }; + }; + + # Разрешить проприетарные пакеты + nixpkgs.config.allowUnfree = true; + + # Системные пакеты для удобства работы с Nix + environment.systemPackages = with pkgs; [ + # Утилиты Nix + nix-output-monitor # Красивый вывод Nix + nvd # Инструмент сравнения версий Nix + nix-tree # Просмотр зависимостей Nix store + nix-index # База данных файлов для nixpkgs + comma # Запуск без установки + nh # Ещё один помощник для Nix + nix-du # Визуализация использования диска + nixfmt-classic # Форматтер Nix кода + ]; + + # nix-ld для запуска непропатченных бинарников + programs.nix-ld.enable = true; + programs.nix-ld.libraries = with pkgs; [ + stdenv.cc.cc + zlib + fuse3 + icu + nss + openssl + curl + expat + ]; +} diff --git a/nixos/modules/users/ada.nix b/nixos/modules/users/ada.nix new file mode 100644 index 0000000..126fa88 --- /dev/null +++ b/nixos/modules/users/ada.nix @@ -0,0 +1,14 @@ +{ pkgs, ... }: + +{ + # Определение учётной записи пользователя + users.users.ada = { + isNormalUser = true; + description = "ada"; + extraGroups = [ "networkmanager" "wheel" ]; + shell = pkgs.zsh; + }; + + # Включение ZSH системно + programs.zsh.enable = true; +} diff --git a/nixos/modules/virtualisation/virtualbox.nix b/nixos/modules/virtualisation/virtualbox.nix new file mode 100644 index 0000000..b547835 --- /dev/null +++ b/nixos/modules/virtualisation/virtualbox.nix @@ -0,0 +1,10 @@ +{ ... }: + +{ + # VirtualBox Guest additions + virtualisation.virtualbox.guest = { + enable = true; + dragAndDrop = true; # Перетаскивание файлов + clipboard = true; # Общий буфер обмена + }; +}