З’явився у нас новий інстанс, 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:
І додаємо правило 2222 з хоста на 22 в віртуальній машині:
Установка 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-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:
І власне метрики:
Готово.
Далі ще треба буде налаштувати моніторинг NVIDIA та метрик SGlang, зробити всякі дашборди та алерти, ну і багато чого ще. Так що, скоріш за все, у цієї історії будуть наступні пости 🙂
![]()





