muscari: add disko config, hardcode mikl ssh key

This commit is contained in:
mikl 2026-06-26 00:40:19 +03:00
parent aedf727849
commit 99b887e97f
6 changed files with 85 additions and 45 deletions

View file

@ -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"
}

View file

@ -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/<hostname>.yaml
# приватный age-ключ лежит в /etc/sops/age/keys.txt (chmod 600)

View file

@ -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";

View file

@ -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 = "/";
};
};
};
};
};
};
}

View file

@ -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" ];
}

View file

@ -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 ];
};
}