diff --git a/flake.lock b/flake.lock index c55d575..a05c324 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,25 @@ { "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" + } + }, "nixpkgs": { "locked": { "lastModified": 1782188297, @@ -18,6 +38,7 @@ }, "root": { "inputs": { + "disko": "disko", "nixpkgs": "nixpkgs", "sops-nix": "sops-nix" } diff --git a/flake.nix b/flake.nix index 25eeec7..46a7ac7 100644 --- a/flake.nix +++ b/flake.nix @@ -8,9 +8,14 @@ url = "github:Mic92/sops-nix"; inputs.nixpkgs.follows = "nixpkgs"; }; + + disko = { + url = "github:nix-community/disko"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; - outputs = { self, nixpkgs, sops-nix, ... }: + outputs = { self, nixpkgs, sops-nix, disko, ... }: let system = "x86_64-linux"; @@ -20,6 +25,7 @@ ./hosts/common ./hosts/${hostname} sops-nix.nixosModules.sops + disko.nixosModules.disko { # SOPS для каждого хоста: secrets/.yaml # приватный age-ключ лежит в /etc/sops/age/keys.txt (chmod 600) diff --git a/hosts/muscari/default.nix b/hosts/muscari/default.nix index 2a14a50..a3d31b6 100644 --- a/hosts/muscari/default.nix +++ b/hosts/muscari/default.nix @@ -4,7 +4,7 @@ { config, pkgs, lib, ... }: { imports = [ - ./hardware-configuration.nix + ./disk-config.nix ../../modules/users/mikl.nix ../../modules/services/k3s.nix ]; @@ -20,6 +20,13 @@ ]; }; + # Bootloader — extlinux (совместимо с YC BIOS boot) + boot.loader.grub.enable = false; + boot.loader.generic-extlinux-compatible.enable = true; + + # fileSystems — определяется через disko (см. disk-config.nix) + # Не задаём явно fileSystems."/" чтобы не конфликтовать с disko + # После nixos-anywhere первая установка может быть 26.05, # потом не трогаем (NixOS convention) system.stateVersion = "25.11"; diff --git a/hosts/muscari/disk-config.nix b/hosts/muscari/disk-config.nix new file mode 100644 index 0000000..49a03f8 --- /dev/null +++ b/hosts/muscari/disk-config.nix @@ -0,0 +1,40 @@ +# disk-config.nix для muscari — Yandex Cloud VM +# YC VM из образа Debian 12: один диск /dev/vda (virtio scsi), GPT +# Используем disko для переформатирования под NixOS одну EFI + root +# +# NB: extlinux (не grub) — YC использует MBR для legacy BIOS boot +# YC поддерживает и EFI, и BIOS — выбираем extlinux для совместимости с образом + +{ lib, ... }: +{ + disko.devices = { + disk.disk1 = { + device = lib.mkDefault "/dev/vda"; + type = "disk"; + content = { + type = "gpt"; + partitions = { + ESP = { + name = "ESP"; + size = "512M"; + type = "EF00"; + content = { + type = "filesystem"; + format = "vfat"; + mountpoint = "/boot"; + }; + }; + root = { + name = "root"; + size = "100%FREE"; + content = { + type = "filesystem"; + format = "ext4"; + mountpoint = "/"; + }; + }; + }; + }; + }; + }; +} \ No newline at end of file diff --git a/hosts/muscari/hardware-configuration.nix b/hosts/muscari/hardware-configuration.nix deleted file mode 100644 index defdbf8..0000000 --- a/hosts/muscari/hardware-configuration.nix +++ /dev/null @@ -1,26 +0,0 @@ -# Hardware configuration для muscari (Yandex Cloud VM) -# PLACEHOLDER — будет заменён реальным после создания VM в YC -# (см. ../k3s/NIXOS-SETUP.md, шаг 4-5) - -# Временный placeholder чтобы flake.nix компилировался -# После создания VM в YC с Debian 12: -# 1. SSH в VM как debian -# 2. Сгенерировать реальный hardware-config через nixos-generate-config -# 3. Заменить этот файл -# 4. Перезапустить nixos-anywhere - -{ ... }: -{ - # NixOS ругается без fileSystems и boot.loader, поэтому минимальный placeholder - # ПОМЕНЯТЬ после первого старта VM - fileSystems."/" = { - device = "/dev/vda1"; - fsType = "ext4"; - }; - - boot.loader.grub.enable = false; - boot.loader.generic-extlinux-compatible.enable = true; - - # Для YC: virtio scsi - boot.initrd.availableKernelModules = [ "virtio_pci" "virtio_mmio" "virtio_blk" "virtio_scsi" ]; -} \ No newline at end of file diff --git a/modules/users/mikl.nix b/modules/users/mikl.nix index 62b374f..a44bb79 100644 --- a/modules/users/mikl.nix +++ b/modules/users/mikl.nix @@ -1,28 +1,20 @@ -# mikl — пользователь с SSH-доступом через forgejo .keys endpoint -# Live-ключи с git.iscg.dev/mikl.keys (sha256-pinned) -# Hardcoded fallback для восстановления если forgejo недоступен +# mikl — пользователь с SSH-доступом +# Ключи захардкожены (recovery-friendly — не зависит ни от чего) { pkgs, ... }: -let - # Live-ключи с forgejo — обновляются автоматически при изменении на forgejo - # sha256 защищает от подмены: новое содержимое = явный коммит с новым хэшем - forgejoKeys = pkgs.fetchurl { - url = "https://git.iscg.dev/mikl.keys"; - sha256 = "sha256-4n6QLUPozdhHOmsRCuFn7HR9BU3nF0/GR2E7s5Lpz+Q="; - }; -in { users.users.mikl = { isNormalUser = true; extraGroups = [ "wheel" ]; uid = 1000; - openssh.authorizedKeys.keyFiles = [ forgejoKeys ]; + # Hardcoded ключи — надёжно, не зависит от forgejo + openssh.authorizedKeys.keys = [ + # poppy-legacy (id_ed25519) — основной ключ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH0TxZWagV8rjwJkmspEyLyyW9Uwty99pkVx4/pgO3Zj poppy-legacy" + ]; - # Hardcoded fallback key — НЕ зависит ни от чего - # Вставить сюда свой recovery-ключ когда сгенерируешь (например, YubiKey) - # openssh.authorizedKeys = [ - # "ssh-ed25519 AAAA... my-recovery-key" - # ]; + # TODO: подключить git.iscg.dev/mikl.keys через fetchurl когда починим sha256 + # openssh.authorizedKeys.keyFiles = [ forgejoKeys ]; }; } \ No newline at end of file