diff --git a/flake.lock b/flake.lock index eff8e51..0198836 100644 --- a/flake.lock +++ b/flake.lock @@ -1,25 +1,5 @@ { "nodes": { - "disko": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1781152676, - "narHash": "sha256-RxWs5ND31KzTG7wvMM+PMfUjyNpmIEr999lqNARaM5o=", - "owner": "nix-community", - "repo": "disko", - "rev": "ff8702b4de27f72b4c78573dfb89ec74e36abdf1", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "disko", - "type": "github" - } - }, "home-manager": { "inputs": { "nixpkgs": [ @@ -78,7 +58,6 @@ }, "root": { "inputs": { - "disko": "disko", "home-manager": "home-manager", "nix-darwin": "nix-darwin", "nixpkgs": "nixpkgs", diff --git a/flake.nix b/flake.nix index 91987eb..0810722 100644 --- a/flake.nix +++ b/flake.nix @@ -18,15 +18,10 @@ url = "github:Mic92/sops-nix"; inputs.nixpkgs.follows = "nixpkgs"; }; - - disko = { - url = "github:nix-community/disko"; - inputs.nixpkgs.follows = "nixpkgs"; - }; }; outputs = - { self, nixpkgs, nix-darwin, home-manager, sops-nix, disko, ... }: + { self, nixpkgs, nix-darwin, home-manager, sops-nix, ... }: let mkNixos = hostname: nixpkgs.lib.nixosSystem { @@ -35,14 +30,15 @@ ./hosts/common ./hosts/${hostname} sops-nix.nixosModules.sops - disko.nixosModules.disko home-manager.nixosModules.home-manager { home-manager = { useGlobalPkgs = true; useUserPackages = true; backupFileExtension = "backup"; - users.mikl = import ./home; + # Серверные хосты используют минимульный home (headless). + # Десктоп-хосты (если появятся) могут переопределить users.mikl. + users.mikl = import ./home/server.nix; }; } ]; @@ -67,8 +63,8 @@ in { nixosConfigurations = { - muscari = mkNixos "muscari"; - # rosemary = mkNixos "rosemary"; # TODO: add disk config + heather = mkNixos "heather"; + # rosemary = mkNixos "rosemary"; # TODO: будущий EU сервер (не YC) }; darwinConfigurations = { diff --git a/home/server.nix b/home/server.nix new file mode 100644 index 0000000..f1fbf35 --- /dev/null +++ b/home/server.nix @@ -0,0 +1,109 @@ +# Минимальный home-manager для headless NixOS-серверов (heather и будущие). +# Не тянет десктопный мусор: ollama (~GB), texliveFull (~4GB), kitty, syncthing, +# pass-with-extensions, duti (macOS), pnpm, gita и т.д. +# Цель — лёгкий образ и быстрый rebuild. Только то, что нужно админу на сервере. + +{ config, pkgs, ... }: +{ + home.stateVersion = "25.11"; + + # --- Пакеты: минимальный админский набор --- + home.packages = with pkgs; [ + # Навигация/поиск + eza + bat + ripgrep + fd + fzf + tree + + # Системное + htop + tmux + + # Редактор + vim + + # Git + git + + # Nix + alejandra # форматтер + nix-output-monitor + + # Утилиты + delta # красивый git diff + trash-cli # rm с корзиной + ]; + + # --- FZF --- + programs.fzf = { + enable = true; + enableZshIntegration = true; + defaultCommand = "fd --type f --hidden --exclude .git"; + defaultOptions = [ "--height 40%" "--layout=reverse" "--border" ]; + }; + + # --- Zoxide --- + programs.zoxide = { + enable = true; + enableZshIntegration = true; + options = [ "--cmd cd" ]; + }; + + # --- Bat --- + programs.bat = { + enable = true; + config = { + theme = "Catppuccin Macchiato"; + italic-text = "always"; + style = "numbers,changes,header"; + }; + }; + + # --- Eza --- + programs.eza = { + enable = true; + icons = "auto"; + git = true; + }; + + # --- Git: сервер-минимум. Без SHA-signing/GPG (gpg агента на сервере нет), + # с pull.rebase для чистой истории при правках прямо на хосте. --- + programs.git = { + enable = true; + userName = "mikl"; + userEmail = "mikl@iscg.dev"; + extraConfig = { + init.defaultBranch = "main"; + pull.rebase = true; + push.autoSetupRemote = true; + diff.pager = "delta"; + }; + delta.enable = true; + }; + + # --- Zsh: минимульный, без pure-prompt и fastfetch (это десктоп-флёр) --- + programs.zsh = { + enable = true; + enableCompletion = true; + autosuggestion.enable = true; + syntaxHighlighting.enable = true; + history = { + size = 10000; + save = 10000; + ignoreDups = true; + share = true; + }; + shellAliases = { + ll = "eza -l --icons --git"; + la = "eza -la --icons --git"; + }; + initContent = '' + # Простой промпт для headless: user@host:path$ + autoload -U colors && colors + PROMPT='%F{green}%n@%m%f:%F{blue}%~%f$ ' + RPROMPT='%F{240}%D{%H:%M}%f' + ''; + }; +} diff --git a/home/zsh.nix b/home/zsh.nix index 66e9a70..89f417d 100644 --- a/home/zsh.nix +++ b/home/zsh.nix @@ -87,6 +87,11 @@ # Right prompt - time in gray RPROMPT='%F{240}%D{%H:%M:%S}%f' + # Yandex Cloud CLI completion + if [ -f "$HOME/yandex-cloud/bin/completion.zsh.inc" ]; then + source "$HOME/yandex-cloud/bin/completion.zsh.inc" + fi + # Pure prompt customization zstyle ':prompt:pure:prompt:success' color green zstyle ':prompt:pure:prompt:success' symbol ">" diff --git a/hosts/heather/default.nix b/hosts/heather/default.nix new file mode 100644 index 0000000..6a7775b --- /dev/null +++ b/hosts/heather/default.nix @@ -0,0 +1,39 @@ +# heather — k3s single-node cluster на YC (NixOS 25.11, собирается как qcow2-образ) +# https://git.iscg.dev/mikl/nix-config +# +# Перенесено из muscari (переименование 2026-07-11). +# VM на Yandex Cloud, 2 vCPU / 8 GB / 64 GB SSD (network-ssd), Legacy BIOS. +# Образ NixOS собирается как qcow2 (см. ./image.nix, make-disk-image.nix) и +# заливается как boot disk в YC. НЕ через nixos-anywhere — kexec на YC хрупкий. +# См. memory/yandex-nixos-qcow2.md. + +{ config, pkgs, lib, ... }: +{ + imports = [ + ./image.nix # YC guest profile + qcow2 build target (заменяет disk-config.nix) + ./k3s.nix + ]; + + networking = { + hostName = "heather"; + firewall.allowedTCPPorts = [ + 22 # SSH + 80 # HTTP (Ingress через Traefik) + 443 # HTTPS (Ingress через Traefik) + # 6443 не открываем — kubectl через SSH-туннель + ]; + }; + # useDHCP задаёт ./image.nix (mkDefault) — облачный профиль. + + # SSH ключи для mikl: forgejo .keys endpoint с sha256-pinning. + # Poppy-ключ (этот ноутбук) лежит там последней строкой. + users.users.mikl.openssh.authorizedKeys.keyFiles = [ + (pkgs.fetchurl { + url = "https://git.iscg.dev/mikl.keys"; + sha256 = "sha256-Omc/3NJn0nM8SWeF33trFwOAVgSX0fXB5dfEakcRoTA="; + }) + ]; + + # После первой установки 25.11 не трогаем (NixOS convention) + system.stateVersion = "25.11"; +} \ No newline at end of file diff --git a/hosts/heather/image.nix b/hosts/heather/image.nix new file mode 100644 index 0000000..608808b --- /dev/null +++ b/hosts/heather/image.nix @@ -0,0 +1,100 @@ +# heather — Yandex Cloud guest profile + qcow2 image build target. +# +# Образец: nixpkgs/nixos/modules/virtualisation/google-compute-image.nix +# (YC compute клонировал GCP API/ABI — virtio, metadata по 169.254.169.254). +# +# Строитель: nixos/lib/make-disk-image.nix — то, чем nixpkgs собирает ВСЕ +# официальные облачные образы (AWS/GCP/Azure/DO/...). Без disko, без nixos-anywhere, +# без kexec. partitionTableType = "legacy" → MBR + одна ext4-партиция (label +# "nixos"), ровно как реальные YC-образы (insomnia/iscg-dev: /dev/vda1). +# +# Сборка: +# nix build .#nixosConfigurations.heather.config.system.build.image +# → result/nixos-image-