NixOS: знайомство, установка пакетів та конфігурація системи
5 (1)

Автор |  05/08/2026
Click to rate this post!
[Total: 1 Average: 5]

З’явився у нас новий інстанс, hardware server, на якому будуть наші self-hosted LLM.

На сервері буде NixOS – вибір не мій, але система цікава, давно про неї чув – і зараз є чудова нагода з нею познайомитись.

Що треба зробити особисто мені – це поки що тільки налаштувати моніторинг: стандартні CPU/RAM/диски, метрики NVIDIA і пізніше – LLM runtime, в ролі якого, мабуть, буде SGLang.

Ну і перше, з чим треба розібратись – це як встановлювати пакети в NixOS і взагалі виконувати різні налаштування.

Не буду детально заглиблюватись в деталі того, як це все в NixOS організовано – цей пост більше суто практичний з прикладами, ну і HowTo для мене самого потім.

Що будемо робити:

  • створимо віртуалку в VirtualBox, встановимо туди NixOS
  • там подивимось на основні конфіги і як встановлюються нові пакети
  • потім напишемо конфіги для нашого вже існуючого реального серверу
  • і подивимось, як деплоїти ці зміни по SSH

Забігаючи наперед – система дійсно прикольна: мати всі налаштування в GitHub, всі зміни робити через пул-реквести, деплоїти на remote host по SSH – виглядає дуже прикольно. Такий собі “Ansible з коробки”, ще і з всякими rollback-опціями.

NixOS на VirtualBox

Тут все стандартно – завантажуємо ISO зі сторінки NixOS : the Linux distribution, підключаємо до віртуалки.

Для доступу по SSH на VirtualBox з NAT – додаємо port-forwarding:

NixOS: знайомство та установка пакетів з nixos-rebuild

І додаємо правило 2222 з хоста на 22 в віртуальній машині:

NixOS: знайомство та установка пакетів з nixos-rebuild

Установка NixOS

Установка дуже схожа на Arch Linux – мінімалістично, без всяких інтерактивних інсталяторів, все робимо ручками.

Запускаємо віртуалку, попадаємо в installer:

Завантажуємо в Live, задаємо пароль root, включаємо SSH – тут все стандартно, з systemd:

# passwd
# systemctl start sshd
# systemctl status sshd

Підключаємось з хоста:

[setevoy@setevoy-work ~] $ ssh -p 2222 root@localhost
...
(root@localhost) Password: 

[root@nixos:~]# 

Перевіряємо диски:

[root@nixos:~]# lsblk
NAME  MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0   7:0    0  1.5G  1 loop /nix/.ro-store
sda     8:0    0   20G  0 disk 
sr0    11:0    1  1.6G  1 rom  /iso

Створюємо розділ на /dev/sda:

[root@nixos:~]# parted /dev/sda -- mklabel msdos
Information: You may need to update /etc/fstab.

                                                                          
[root@nixos:~]# parted /dev/sda -- mkpart primary ext4 1MiB 100%
Information: You may need to update /etc/fstab.

                                                                          
[root@nixos:~]# parted /dev/sda -- set 1 boot on
Information: You may need to update /etc/fstab.

Створюємо файлову систему на /dev/sda1:

[root@nixos:~]# mkfs.ext4 -L nixos /dev/sda1

Перевіряємо:

[root@nixos:~]# lsblk -f /dev/sda1
NAME FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sda1 ext4   1.0   nixos 2090a4d7-d0c3-42d8-bd3b-43e032906e9c

Монтуємо до /mnt:

[root@nixos:~]# mount /dev/disk/by-label/nixos /mnt

З nixos-generate-config генеруємо базові конфіги системи:

[root@nixos:~]# nixos-generate-config --root /mnt
writing /mnt/etc/nixos/hardware-configuration.nix...
writing /mnt/etc/nixos/configuration.nix...

Перевіряємо зміст файлу hardware-configuration.nix – там тут цікавий блок fileSystems, бо він потім буде використаний для /etc/fstab та GRUB:

[root@nixos:~]# cat /mnt/etc/nixos/hardware-configuration.nix
# Do not modify this file!  It was generated by ‘nixos-generate-config’
# and may be overwritten by future invocations.  Please make changes
# to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:

{
  imports = [ ];

  boot.initrd.availableKernelModules = [ "ata_piix" "ohci_pci" "ehci_pci" "sd_mod" "sr_mod" ];
  boot.initrd.kernelModules = [ ];
  boot.kernelModules = [ "kvm-amd" ];
  boot.extraModulePackages = [ ];

  fileSystems."/" =
    { device = "/dev/disk/by-uuid/97f9af58-4659-40c3-ae99-5ecf780f499f";
      fsType = "ext4";
    };

  swapDevices = [ ];

  nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
  virtualisation.virtualbox.guest.enable = true;
}

configuration.nix – GRUB, Users та Services

Редагуємо файл /mnt/etc/nixos/configuration.nix, якщо нема – то додаємо boot options.

Опис всіх опцій можна знайти на search.nixos.org, наприклад – boot.loader.grub.enable.

Для цієї віртуалки і MBR – включаємо GRUB і задаємо grub.device в корінь /dev/sda:

...

  boot.loader.grub.enable = true;
  boot.loader.grub.devices = [ "/dev/sda" ];

...

Тут жеж в users.users можемо описати і юзерів в системі – додаємо в кінець файлу, перед закриваючою “}“, відступи ролі не грають – просто для зручності:

  users.users.setevoy = {
    isNormalUser = true;
    extraGroups = [ "wheel" ];
  };

Включаємо сервіс SSH:

  ..
  services.openssh.enable = true;
}

Запускаємо установку:

# nixos-install
...
setting root password...
New password: 
Retype new password: 
passwd: password updated successfully
installation finished!

Задаємо пароль юзеру setevoy – хоча можна було задати прямо в конфігу з опціями initialPassword або initialHashedPassword:

[root@nixos:~]# nixos-enter --root /mnt
setting up /etc...

[root@nixos:/]# passwd setevoy
New password: 
Retype new password: 
passwd: password updated successfully

Перезавантажуємо віртуалку – і система готова до роботи:

NixOS: знайомство та установка пакетів і конфігурація системи

Установка пакетів – nixos-rebuild та nix-shell

В конфігу vim не додав, тому окремо – заодно глянути, як взагалі додавати нові пакети в систему.

З nix-shell можемо запустити окремий тимчасовий шел відразу з пакетом vim (хоча nix-shell це наче legacy, і можна робити з nix shell nixpkgs#vim):

[root@nixos:~]# nix-shell -p vim
these 2 paths will be fetched (12.4 MiB download, 43.2 MiB unpacked):
  /nix/store/b0ga0wazy69p0264ki9jaxd5wqxyvcm4-stdenv-linux
  /nix/store/39shwxhbkgnfr9qfysmwby7ma1rcckp0-vim-9.2.0541
copying path '/nix/store/b0ga0wazy69p0264ki9jaxd5wqxyvcm4-stdenv-linux' from 'https://cache.nixos.org'...
copying path '/nix/store/39shwxhbkgnfr9qfysmwby7ma1rcckp0-vim-9.2.0541' from 'https://cache.nixos.org'...

[nix-shell:~]# 

Установка vim

Аби vim був в системі постійно – редагуємо /etc/nixos/configuration.nix і з environment.systemPackages додаємо все, що треба для роботи:

environment.systemPackages = with pkgs; [
  vim
  git
  curl
];

Так як робимо на вже інстальованій системі – то для застосування змін запускаємо nixos-rebuild – він прочитає всі зміни в файлах конфігурації і встановить пакети:

[root@nixos:~]# nixos-rebuild switch
building the system configuration...
...
Done. The new configuration is /nix/store/q7m7yygrwgr710iyhhi7yq01hjm753r1-nixos-system-nixos-26.05.6503.21ea275a7c46

Історія змін в системі та rollback

Опція switch для nixos-rebuild створює новий generation системи – окремий набір конфігів на кожну зміну, яку робимо в системі.

З nix-env --list-generations можна подивитись історію змін:

[root@nixos:~]# sudo nix-env --list-generations --profile /nix/var/nix/profiles/system
   1   2026-07-31 13:33:51   
   2   2026-07-31 13:53:21   
   3   2026-07-31 14:42:43   (current)

А з nixos-rebuild switch --rollback – відкотитись до попередньої.

Виглядає круто, хоча rollback не тестив.

Установка node_exporter

vim ми встановлювали з environment.systemPackages – але в такому випадку Nix просто встановлює сам бінарник і додає його до $PATH.

Якщо треба додати саме системний сервіс – з systemd-конфігами, портами, фаерволом, автостартом – для Node Exporter є окремий сабмодуль services.prometheus.exporters.node.

Всі Prometheus-експортери описані в exporters.nix, а сам node_exporter імпортується з файлу node.nix.

Сам бінарник якщо є готовий – то буде взятий з репозиторію cache.nixos.org, а інші пакети можна пошукати на search.nixos.org/packages.

Редагуємо /etc/nixos/configuration.nix – включаємо сам node_exporter, дозволяємо до нього доступ на фаерволі, включаємо поки один колектор systemd (див. сам Node Exporter > Collectors):

services.prometheus.exporters.node = {
  enable = true;
  port = 9100;
  openFirewall = true;
  enabledCollectors = [ "systemd" ];
};

Перевірити чи включений сервіс, наприклад Firewall – nixos-option:

[root@nixos:~]# nixos-option networking.firewall.enable
Value:
  true

Default:
  true
...

Ще раз запускаємо nixos-rebuild switch – але цього разу білд впав з “SIGKILL 9“:

[root@nixos:~]# nixos-rebuild switch
building the system configuration...
evaluation warning: `boot.zfs.forceImportRoot` is using the default value of `true`. It is highly recommended to set it to `false`, the new default from 26.11 on, to reduce the risk of data loss. Alternatively, you can silence this warning by explicitly setting it to `true`.
Command 'nix-build '<nixpkgs/nixos>' --attr config.system.build.toplevel --no-out-link' died with <Signals.SIGKILL: 9>.

Дивимось логи:

[root@nixos:~]# journalctl -k -b | grep -iE 'out of memory|oom|killed process' | tail -20
Jul 31 13:35:49 nixos systemd[1]: Listening on Userspace Out-Of-Memory (OOM) Killer Socket.
...
Jul 31 13:42:56 nixos kernel: Out of memory: Killed process 1048 (nix-build) total-vm:1072896kB, anon-rss:876128kB, file-rss:292kB, shmem-rss:256kB, UID:0 pgtables:1912kB oom_score_adj:0

Додаємо пам’яті до віртуалки, бо я задав 2 гігабайти – не вистачило ¯\_(ツ)_/¯

Після установки – перевіряємо сервіс:

[root@nixos:~]# systemctl status prometheus-node-exporter
● prometheus-node-exporter.service
     Loaded: loaded (/etc/systemd/system/prometheus-node-exporter.service; enabled; preset: ignored)
     Active: active (running) since Fri 2026-07-31 14:42:44 UTC; 44s ago

І метрики:

[root@nixos:~]# curl -s http://localhost:9100/metrics | grep node_ | head
# HELP node_arp_entries ARP entries by device
# TYPE node_arp_entries gauge
node_arp_entries{device="enp0s3"} 2
# HELP node_boot_time_seconds Node boot time, in unixtime.
# TYPE node_boot_time_seconds gauge
node_boot_time_seconds 1.785505763e+09
# HELP node_context_switches_total Total number of context switches.
# TYPE node_context_switches_total counter
node_context_switches_total 344789
# HELP node_cooling_device_cur_state Current throttle state of the cooling device

Власне – з віртуалкою все.

Можна готувати деплої на реальний хост.

NixOS Flakes та реальний проект

Що треба буде зробити – це додати Node Exporter на наш реальний сервер і змінити параметри мережі, бо там зараз DHCP – а мені треба static.

Аби розуміти де робити зміни в репозиторії – коротко про структуру файлів в репозиторії:

[setevoy@setevoy-work ~] $ tree .
.
├── flake.lock
├── flake.nix
├── hosts
│   └── matrix
│       ├── default.nix
│       ├── disko.nix
│       ├── hardware.nix
│       ├── monitoring.nix
│       ├── networking.nix
│       └── nvidia.nix

Тут використовується Flake – структурований формат файлів і записів в них.

Файли тут:

  • flake.nix: головна точка входу описує залежності й конфігурації систем
  • flake.lock: версії залежностей
  • hosts/matrix/default.nix: конфігурація конкретного сервера (hostname=”matrix”)
  • інші файли *.nix: модулі цього сервера

В файлі flake.nix є блок inputs (зовнішні залежності як Git-репозиторії), а інші можуть мати imports – додаткові локальні файли, в яких ми будемо додавати свої конфіги.

Що треба буде зробити – це створити файл hosts/matrix/monitoring.nix, підключити його в imports файлу hosts/matrix/default.nix, перевірити та задеплоїти.

Створення monitoring.nix

Додаємо файл monitoring.nix, в ньому описуємо той самий prometheus.exporters.node, як робили в тестах вище:

{...}: {
  services.prometheus.exporters.node = {
    enable = true;
    port = 9100;
    openFirewall = true;
    enabledCollectors = ["systemd"];
  };
}

Оскільки це Flake з типом git, то новий файл monitoring.nix має бути доданий до Git index, інакше Nix поверне помилку “error: Path ‘hosts/matrix/monitoring.nix’ … is not tracked by Git“.

Додаємо:

[setevoy@setevoy-work ~] $ git add hosts/matrix/monitoring.nix hosts/matrix/default.nix

default.nix та imports []

В блок imports[] файлу default.nix додаємо наш новий monitoring.nix.

Порядок значення не має, але краще в алфавітному:

imports = [
  ./disko.nix
  ./hardware.nix
  ./monitoring.nix
  ./networking.nix
  ./nvidia.nix
];

Nix на Arch Linux

Це прям класно виявилось – можна встановити Nix собі на будь-який Linux, і тестити та деплоїти прямо зі своєї машини.

Тут робив на Arch Linux, для тесту перед пушем в GitHub, а далі вже буде приклад з Amazon Linux.

На Arch Linux додаємо пакет nix:

[setevoy@setevoy-work ~] $ sudo pacman -S nix
[setevoy@setevoy-work ~] $ sudo systemctl enable --now nix-daemon

Перевіряємо сервіс:

[setevoy@setevoy-work ~] $ systemctl status nix-daemon.socket
○ nix-daemon.socket - Nix Daemon Socket
     Loaded: loaded (/usr/lib/systemd/system/nix-daemon.socket; disabled; preset: disabled)

Для Nix Flakes додаємо у /etc/nix/nix.conf:

experimental-features = nix-command flakes

Перезапускаємо сервіс:

[setevoy@setevoy-work ~] $ sudo systemctl restart nix-daemon.service

Перевіряємо, що він працює:

[setevoy@setevoy-work ~] $ nix store info
Store URL: daemon
Version: 2.35.1
Trusted: 0

І запускаємо тест наших конфігів:

[setevoy@setevoy-work ~] $ nix flake check --no-build
warning: Git tree '/home/setevoy/Work/hOS/atlas-llm' is dirty

Git tree .. is dirty” – то я файл до Git додав, але не комітив – поки можна ігнорувати.

NixOS та налаштування Static IP

Node Exporter додали, ще треба змінити налаштування мережі.

Тут в цілому нічого нового – знайти поточні параметри, змінити параметри у вже існуючому файлі networking.nix.

На реальному хості перевіряємо що у нас в мережі – нам треба ім’я інтерфейсу, Gateway IP, адреса DNS.

Знаходимо поточний IP, MAC та ім’я інтерфейсу:

[neo@matrix:~]$ ip -4 address show dev enp36s0f0
4: enp36s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    altname enx04421ae605fb
    inet 192.168.124.14/24 metric 1024 brd 192.168.124.255 scope global dynamic enp36s0f0
       valid_lft 5624sec preferred_lft 5624sec

Знаходимо поточний Gateway, тут це 192.168.124.1:

[neo@matrix:~]$ ip -4 route
default via 192.168.124.1 dev enp36s0f0 proto dhcp src 192.168.124.14 metric 1024 
...

І DNS:

[neo@matrix:~]$ resolvectl dns enp36s0f0
Link 4 (enp36s0f0): 192.168.128.254

Редагуємо файл hosts/matrix/networking.nix – вносимо зміни в systemd.network.networks, див. також systemd-networkd.

Зараз там був описаний один конфіг DHCP з іменем “10-x550-primary“, де “10” – пріоритет, а “x550” – ім’я карти (“Ethernet controller [0200]: Intel Corporation Ethernet Controller X550“):

networks."10-x550-primary" = {
  matchConfig = {
    Name = "enp36s0f0";
    PermanentMACAddress = "04:42:1a:e6:05:fb";
  };
  networkConfig = {
    DHCP = "yes";
    IPv6AcceptRA = true;
  };
  linkConfig.RequiredForOnline = "routable";
};

Тепер описуємо static config:

networks."10-x550-primary" = {
  matchConfig = {
    Name = "enp36s0f0";
    PermanentMACAddress = "04:42:1a:e6:05:fb";
  };

  address = [
    "192.168.124.14/24"
  ];

  routes = [
    {
      Gateway = "192.168.124.1";
    }
  ];

  networkConfig = {
    DHCP = "no";
    DNS = [
      "192.168.128.254"
    ];
    IPv6AcceptRA = true;
  };

І, трохи забігаючи наперед, після деплою перевіряємо, що тепер дійсно static.

Самий простий варіант – глянути роути, має бути static:

[root@matrix:~]# ip -4 route
default via 192.168.124.1 dev enp36s0f0 proto static 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 
192.168.124.0/24 dev enp36s0f0 proto kernel scope link src 192.168.124.14 
...

Власне, далі про деплой.

Nix on Amazon Linux та deploy по SSH

Деплоїти буду з окремого EC2 в AWS, бо там WireGuard тунель на наш “дата-центр” в США.

В принципі – все аналогічно тому, як робили на Arch Linux – встановити Nix, перевірити, і задеплоїти.

Тільки на Arch Linux деплой не робили – а тут зробимо, ще і по SSH.

Єдиний нюанс тут був в тому, що інстанс я робив t3.micro – бо там планувався тільки VPN/WG, а для Nix краще мати запас пам’яті – тому збільшимо до t3.medium.

Ну і сама установка  – для Fedora є пакет nix і можна встановити з dnf, але на Amazon Linux ставив інсталятором самого Nix.

На EC2 додаємо залежності:

[ec2-user@ip-10-0-13-13 ~]$ sudo dnf install -y curl xz

Встановлюємо Nix:

[ec2-user@ip-10-0-13-13 ~]$ curl -L https://nixos.org/nix/install | sh -s -- --daemon
...
~~> Setting up the nix-daemon systemd service
Created symlink /etc/systemd/system/nix-daemon.service → /nix/var/nix/profiles/default/lib/systemd/system/nix-daemon.service.
Created symlink /etc/systemd/system/nix-daemon.socket → /nix/var/nix/profiles/default/lib/systemd/system/nix-daemon.socket.
Created symlink /etc/systemd/system/sockets.target.wants/nix-daemon.socket → /nix/var/nix/profiles/default/lib/systemd/system/nix-daemon.socket.
Alright! We're done!

Виходимо з login-сесії, заходимо знову, перевіряємо:

[ec2-user@ip-10-0-13-13 ~]$ nix --version
nix (Nix) 2.35.1

І сервіс:

[ec2-user@ip-10-0-13-13 ~]$ systemctl status nix-daemon --no-pager
● nix-daemon.service - Nix Daemon
     Loaded: loaded (/etc/systemd/system/nix-daemon.service; linked; preset: disabled)
     Active: active (running) since Tue 2026-08-04 09:48:45 UTC; 1min 8s ago
...

Редагуємо /etc/nix/nix.conf, включаємо Flakes:

experimental-features = nix-command flakes

Перезапускаємо сервіс:

[ec2-user@ip-10-0-13-13 ~]$ sudo systemctl restart nix-daemon

Клонуємо репозиторій з нашими змінами:

[ec2-user@ip-10-0-13-13 ~]$ cd atlas-llm/
[ec2-user@ip-10-0-13-13 atlas-llm]$ git status --short --branch
## master...origin/master

Запускаємо перевірку конфігів:

[ec2-user@ip-10-0-13-13 atlas-llm]$ nix flake check --no-build
Stack size hard limit is 10485760, which is less than the desired 62914560. If possible, increase the hard limit, e.g. with 'ulimit -Hs 61440'.
[ec2-user@ip-10-0-13-13 atlas-llm]$ echo $?
0

Завершилось успішно – але маємо warning про ліміти.

Linux ulimits для Nix

Редагуємо /etc/security/limits.d/90-nix.conf, додаємо user ulimits:

ec2-user soft stack 65536
ec2-user hard stack 65536

Ще раз re-login, перевіряємо, що ліміти застосовані:

[ec2-user@ip-10-0-13-13 ~]$ ulimit -Ss
65536
[ec2-user@ip-10-0-13-13 ~]$ ulimit -Hs
65536

Ще раз перевірку – тепер без warnings:

[ec2-user@ip-10-0-13-13 atlas-llm]$ nix flake check --no-build
[ec2-user@ip-10-0-13-13 atlas-llm]$ echo $?
0

SSH та Nix nixos-rebuild test

Запускаємо тестову установку – все збілдиться і задеплоїться, але при наступному reboot системи буде використаний старий конфіг.

Дуже зручно.

Для деплою з SSH – в змінній $NIX_SSHOPTS задаємо опції з ключем:

[ec2-user@ip-10-0-13-13 atlas-llm]$ export NIX_SSHOPTS="-i /home/ec2-user/.ssh/barn_self_llm"

Запускаємо тестовий деплой:

[ec2-user@ip-10-0-13-13 atlas-llm]$ nix run github:NixOS/nixpkgs/nixos-26.05#nixos-rebuild -- \
test \
--flake .#matrix \
--build-host [email protected] \
--target-host [email protected]
...
starting the following units: systemd-tmpfiles-resetup.service
the following new units were started: prometheus-node-exporter.service 
Done. The new configuration is /nix/store/5x016qjx58fkq4dnk8k1vn54xz7fma5y-nixos-system-matrix-26.05.20260726.8623c4c

Перевіряємо Node Exporter на хості з NixOS:

[root@matrix:~]# systemctl status prometheus-node-exporter.service
● prometheus-node-exporter.service
     Loaded: loaded (/etc/systemd/system/prometheus-node-exporter.service; enabled; preset: ignored)
     Active: active (running) since Tue 2026-08-04 10:18:01 UTC; 50s ago

І метрики:

[root@matrix:~]# curl -s localhost:9100/metrics | head
# HELP go_gc_duration_seconds A summary of the wall-time pause (stop-the-world) duration in garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 8.777e-06
go_gc_duration_seconds{quantile="0.25"} 1.09e-05
go_gc_duration_seconds{quantile="0.5"} 1.1713e-05
go_gc_duration_seconds{quantile="0.75"} 1.2955e-05
go_gc_duration_seconds{quantile="1"} 1.3205e-05
go_gc_duration_seconds_sum 5.755e-05
go_gc_duration_seconds_count 5

Якщо все ок – запускаємо ще раз nixos-rebuild, але вже з опцією switch замість test:

[ec2-user@ip-10-0-13-13 atlas-llm]$ nix run github:NixOS/nixpkgs/nixos-26.05#nixos-rebuild -- switch --flake .#matrix --build-host [email protected] --target-host [email protected]

І потім перевіряємо сервіс в systemd autostart:

[root@matrix:~]# systemctl is-enabled prometheus-node-exporter
enabled

Nix profiles та перевірка актуального стану

Стало цікаво як саме впевнитись, що зараз застосовані саме ті зміни, які бачили в результаті виконання nixos-rebuild -- switch.

В кінці роботи nixos-rebuild показаний шлях до конфігурації – /nix/store/ll36l8ml5znscmppa2rpwnp5s8k7rp86[...]:

...
restarting the following user units: nixos-activation.service
restarting sysinit-reactivation.target
Done. The new configuration is /nix/store/ll36l8ml5znscmppa2rpwnp5s8k7rp86-nixos-system-matrix-26.05.20260726.8623c4c

Це директорія зі згенерованими конфігами:

[root@matrix:~]# ll /nix/store/ll36l8ml5znscmppa2rpwnp5s8k7rp86-nixos-system-matrix-26.05.20260726.8623c4c
total 256
-r-xr-xr-x 1 root root   4977 Jan  1  1970 activate
dr-xr-xr-x 1 root root    110 Jan  1  1970 bin
-r--r--r-- 1 root root   1232 Jan  1  1970 boot.json
-r-xr-xr-x 1 root root   1971 Jan  1  1970 dry-activate
lrwxrwxrwx 1 root root     51 Jan  1  1970 etc -> /nix/store/z8jq92jch9rk9r354rj598q52rdf4b9b-etc/etc
...

І там можемо побачити файл /nix/store/ll36l8[...]/etc/systemd/network/10-x550-primary.network з тими змінами, які ми описували вище:

[root@matrix:~]# cat /nix/store/ll36l8ml5znscmppa2rpwnp5s8k7rp86-nixos-system-matrix-26.05.20260726.8623c4c/etc/systemd/network/10-x550-primary.network
[Match]
Name=enp36s0f0
PermanentMACAddress=04:42:1a:e6:05:fb

[Link]
RequiredForOnline=routable

[Network]
DHCP=no
DNS=192.168.128.254
IPv6AcceptRA=true
Address=192.168.124.14/24

[Route]
Gateway=192.168.124.1

Ще можна глянути generations:

[root@matrix:~]# nix-env --profile /nix/var/nix/profiles/system --list-generations
   1   2026-07-27 12:39:58   
   2   2026-07-27 12:58:50   
   3   2026-07-27 13:56:07   
   4   2026-07-27 14:12:35   
   5   2026-07-27 14:23:59   
   6   2026-07-31 13:04:34   
   7   2026-08-04 13:32:35   
   8   2026-08-04 13:44:05   (current)

Тут Current == 8, по номеру дивимось профайли в /nix/var/nix/profiles/:

[root@matrix:~]# ll /nix/var/nix/profiles/system-8-link/
total 256
-r-xr-xr-x 1 root root   4977 Jan  1  1970 activate
dr-xr-xr-x 1 root root    110 Jan  1  1970 bin
-r--r--r-- 1 root root   1232 Jan  1  1970 boot.json
-r-xr-xr-x 1 root root   1971 Jan  1  1970 dry-activate
...

А файл /nix/var/nix/profiles/system-8-link – це сімлінк на /nix/store/:

[root@matrix:~]# readlink -f /nix/var/nix/profiles/system-8-link
/nix/store/ll36l8ml5znscmppa2rpwnp5s8k7rp86-nixos-system-matrix-26.05.20260726.8623c4c

ll36l8ml5znscmppa2rpwnp5s8k7rp86” – це hash part імені, який використовується в /nix/store/ll36l8ml5znscmppa2rpwnp5s8k7rp86-nixos-system-matrix-26.05.20260726.8623c4c (Closures – A Nix package’s dependency tree):

[root@matrix:~]# nix-store --query --requisites \
  /nix/store/ll36l8ml5znscmppa2rpwnp5s8k7rp86-nixos-system-matrix-26.05.20260726.8623c4c \
  | grep y4abaz675xl40vw09700b7ma50cl5ks8
/nix/store/y4abaz675xl40vw09700b7ma50cl5ks8-unit-10-x550-primary.network

І якщо ми глянемо вже файл самого systemd – то це теж сімлінк як раз на цей файл:

[root@matrix:~]# readlink -f /run/current-system/etc/systemd/network/10-x550-primary.network
/nix/store/y4abaz675xl40vw09700b7ma50cl5ks8-unit-10-x550-primary.network/10-x550-primary.network

І, звісно, він містить ті самі налаштування, які ми описували:

[root@matrix:~]# cat /run/current-system/etc/systemd/network/10-x550-primary.network
[Match]
Name=enp36s0f0
PermanentMACAddress=04:42:1a:e6:05:fb

[Link]
RequiredForOnline=routable

[Network]
DHCP=no
DNS=192.168.128.254
IPv6AcceptRA=true
Address=192.168.124.14/24

[Route]
Gateway=192.168.124.1

VictoriaMetrics та метрики

Ну і останнє – перевірити, що VMAgent збирає метрики в нашу VictoriaMetrics.

В values Helm-чарту VMAgent додаємо inlineScrapeConfig:

- job_name: matrix-node-exporter
  metrics_path: /metrics
  static_configs:
    - targets: ["matrix.neoc.vpn.ops.example.co:9100"]

Деплоїмо, перевіряємо targets:

NixOS: знайомство та установка пакетів і конфігурація системи

І власне метрики:

NixOS: знайомство та установка пакетів і конфігурація системи

Готово.

Далі ще треба буде налаштувати моніторинг NVIDIA та метрик SGlang, зробити всякі дашборди та алерти, ну і багато чого ще. Так що, скоріш за все, у цієї історії будуть наступні пости 🙂

Loading