nix-config/hosts/heather/image.nix
mikl 79260cec6f heather: switch to make-disk-image (qcow2 for YC), drop disko
- Rename muscari -> heather (YC VM). rosemary reserved for future EU server.
- Add hosts/heather/image.nix: YC guest profile + qcow2 build target based on
  nixos/lib/make-disk-image.nix (the nixpkgs-standard cloud image builder).
  partitionTableType=legacy (MBR + single ext4 root, label nixos), GRUB in MBR
  on /dev/vda, virtio drivers, console=ttyS0, cloud-init (Ec2 datasource) so
  poppy ssh key auto-lands from YC metadata, growPartition.
- Drop disko flake input + disk-config.nix (was only for nixos-anywhere runtime
  install; replaced by make-disk-image build-time approach, no kexec).
- Add home/server.nix: minimal headless home for NixOS hosts (no ollama/
  texliveFull/kitty/syncthing/pass). flake mkNixos uses it instead of full ./home.
- k3s.nix: drop dead firewall block (firewall off in image.nix -> trustedInterfaces
  was a no-op). Cilium manages pod networking via BPF.
- image.baseName=heather, configurationLimit=1, remove virtio dups (qemu-guest
  profile already provides most).
- Fix sha256 pin on forgejo mikl.keys (was stale, would break fetchurl).
- home/zsh.nix: source yandex-cloud yc completion.
2026-07-11 21:13:38 +03:00

100 lines
4.6 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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-<label>-x86_64-linux.qcow2
# Потом: загрузить в YC Object Storage → yc compute image create → создать ВМ.
#
# Этот модуль импортируется в default.nix ВСЕГДА — облачный профиль (virtio,
# cloud-init, grub, fileSystems) нужен и при nixos-rebuild на живой ВМ, не только
# при сборке образа. Цель сборки (system.build.image) при обычном rebuild
# ничего не меняет.
{ config, lib, pkgs, modulesPath, ... }:
with lib;
{
imports = [
(modulesPath + "/profiles/qemu-guest.nix")
(modulesPath + "/virtualisation/disk-size-option.nix")
(modulesPath + "/image/file-options.nix")
];
# --- Диск: одна ext4-партиция на label "nixos", растёт при первом буте ---
fileSystems."/" = {
fsType = "ext4";
device = "/dev/disk/by-label/nixos";
autoResize = true;
};
boot.growPartition = true;
# --- Загрузка: GRUB в MBR на весь диск (YC = legacy BIOS) ---
# make-disk-image внутри build-VM видит диск как /dev/vda и symlink-ает
# grub.devices на него. На реальной YC-ВМ virtio-scsi тоже даёт /dev/vda.
boot.loader.grub.enable = mkDefault true;
boot.loader.grub.device = "/dev/vda";
boot.loader.grub.configurationLimit = 1; # только текущее, но механизм выбора есть
boot.loader.grub.timeout = 0;
boot.loader.systemd-boot.enable = mkForce false;
boot.loader.efi.canTouchEfiVariables = mkForce false;
# --- Ядро: virtio-драйверы для YC.
# Большую часть даёт профиль qemu-guest.nix (virtio_net/pci/scsi/blk + balloon/
# console/rng/gpu в initrd). Здесь добавляем только то, чего профиль не даёт:
# virtio_scsi в initrd.kernelModules (грузить модуль, а не просто available) и
# virtio_pci/net в runtime kernelModules для горячих устройств. ---
boot.initrd.kernelModules = [ "virtio_scsi" ];
boot.kernelModules = [ "virtio_pci" "virtio_net" ];
boot.kernelParams = [
"console=ttyS0" # serial — для отладки через `yc compute connect-to-serial-port`
"panic=1"
"boot.panic_on_fail"
];
# --- Сеть: DHCP на eth0, firewall off (полагаемся на YC Security Groups) ---
networking.useDHCP = mkDefault true;
networking.firewall.enable = mkDefault false;
# --- SSH: только по ключам ---
services.openssh.enable = mkDefault true;
services.openssh.settings.PermitRootLogin = mkDefault "prohibit-password";
services.openssh.settings.PasswordAuthentication = mkDefault false;
# --- cloud-init: Ec2 datasource. YC отдаёт metadata по 169.254.169.254
# в AWS-совместимом формате. Тогда ssh-keys из metadata сами прилетают в
# authorized_keys (как сегодня у insomnia/iscg-dev). ---
services.cloud-init.enable = true;
services.cloud-init.ext4.enable = true;
services.cloud-init.settings = {
datasource_list = [ "Ec2" "NoCloud" "None" ];
datasource = {
Ec2 = {
strict_id = false;
metadata_urls = [ "http://169.254.169.254" ];
};
};
ssh_pwauth = false;
};
# --- Цель сборки образа: system.build.image ---
image.baseName = "heather";
image.extension = "qcow2";
system.nixos.tags = [ "yandex-cloud" ];
system.build.image = import (modulesPath + "/lib/make-disk-image.nix") {
name = "heather-image";
inherit (config.image) baseName;
partitionTableType = "legacy"; # MBR + single ext4 root
format = "qcow2"; # make-disk-image сам конвертит raw→qcow2
inherit (config.virtualisation) diskSize;
inherit config lib pkgs;
};
}