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.
This commit is contained in:
parent
c21268fb9b
commit
79260cec6f
9 changed files with 264 additions and 131 deletions
39
hosts/heather/default.nix
Normal file
39
hosts/heather/default.nix
Normal file
|
|
@ -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";
|
||||
}
|
||||
100
hosts/heather/image.nix
Normal file
100
hosts/heather/image.nix
Normal file
|
|
@ -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-<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;
|
||||
};
|
||||
}
|
||||
34
hosts/heather/k3s.nix
Normal file
34
hosts/heather/k3s.nix
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
# k3s daemon для heather (single-node + Cilium CNI)
|
||||
# Traefik и servicelb остаются включены (встроенные в k3s)
|
||||
# Cilium ставится отдельно через Helm после старта k3s
|
||||
|
||||
{ config, pkgs, lib, ... }:
|
||||
{
|
||||
services.k3s = {
|
||||
enable = true;
|
||||
extraFlags = [
|
||||
# CNI: отключаем встроенный flannel, ставим Cilium отдельно
|
||||
"--flannel-backend=none"
|
||||
"--disable-network-policy" # Cilium сам делает network policy
|
||||
|
||||
# CIDR для подов и сервисов (default для k3s, но фиксируем явно)
|
||||
"--cluster-cidr=10.42.0.0/16"
|
||||
"--service-cidr=10.43.0.0/16"
|
||||
|
||||
# TLS SANs для kubectl (если подключаемся не только по IP)
|
||||
"--tls-san=heather.iscg.dev"
|
||||
];
|
||||
};
|
||||
|
||||
# Firewall выключен в ./image.nix (полагаемся на YC Security Groups).
|
||||
# Cilium управляет pod-сетью через BPF, локальный iptables-firewall ему
|
||||
# только мешает — поэтому блок trustedInterfaces/checkReversePath не нужен.
|
||||
|
||||
# k3s-specific пакеты (НЕ в common — только для хостов с k3s)
|
||||
environment.systemPackages = with pkgs; [
|
||||
kubectl
|
||||
kubernetes-helm
|
||||
kustomize
|
||||
sops # для шифрования k8s secrets (если будем через SOPS)
|
||||
];
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue