Привет всем. Всех с днем знаний и началом осени!
Как Белинский Виссарион Григорьевич, а потом уже и сам Владимир Ильич Ленин говорил :
"Учитесь, учитесь и еще раз учитесь! Да здравствует наука!"
Вот и мы возьмемся за знания, рассмотрим, что нам может дать кладезь полезной информации - Github и куски разрозненной информации из самих глубин глобальной сети, изучение мануалов и немного смекалки.
Мы в прошлой части мы сделали первый шаг в NixOS,работая с "философией" Никсов, как с БашСиблом(Ansible playbook состоящий из bash-вставок ) и сегодня переработаем наш системный конфигурационный файл. и рассмотрим тему мониторинга на этой же бедной машинки (когда перейдем в тему контейнеров и вм - уже вынесем все лишнее из нашей бедной хранилки и что-то улучшим, что-то добавим ).
Что у нас в меню:
Добави�� "репозиторий"( Nix-channel ) с последними (нестабильными) пакетами и посмотрим как ведут себя обновленные пакеты и посмотрим как удалить пакеты.
Обновим configuration.nix
Grafana+Prometheus
Начинаем наше погружение в удивительный мир Nix'ов:
Первое что мы сделаем ,так это сознательно перейдем на темную нестабильную сторону, прекрасно понимая, что это может дать нам и плюсы ,так и минусы
Плюсы:
Решение старых проблем, залатывание дыр в безопасности.
Возможно расширение возможностей ПО и оптимизация.
Актуальная версия Программного Обеспечения
Минусы:
Новые проблемы.
возможное нестабильное, непредсказуемое поведение пакетов(такое встречается везде)
Надо смотреть в документации - какой функционал убрали и(или) на что заменили.
Взвешиваем все "за" и "против" мы идем дальше:
Обновление пакетов
Смотрим количество подключенных репозиторий:
# nix-channel --list nixos https://nixos.org/channels/nixos-23.05
Добавляем канал, с которого система будет получать "нестабильные" пакеты:
nix-channel --add https://nixos.org/channels/nixpkgs-unstable unstable
Добавляем Unstable channel:
{ config, pkgs, lib, modulesPath, ... }: let unstableTarball = fetchTarball https://github.com/NixOS/nixpkgs/archive/nixos-unstable.tar.gz; in ##### { imports = [ # Include the results of the hardware scan. ./hardware-configuration.nix # ./apps/minio-server.nix ]; ######
Обновляем список репозиториев:
# nix-channel --update unpacking channels... и
Поиск и обновление только одного пакета:
# nix search package
# nix-env -f channel:nixpkgs-unstable -iA
Перепишем сейчас блок с caddy:
Было :
Systemd service
systemd.services.caddy = { description = "Caddy" ; wantedBy = [ "multi-user.target" ]; serviceConfig = { EnvironmentFile= "/etc/caddy/Caddyfile"; ExecStart = "${pkgs.caddy}/bin/caddy run --environ --config /etc/caddy/Caddyfile"; ExecStop = " ${pkgs.caddy}/bin/caddy stop"; ExecReload = "${pkgs.caddy}/bin/caddy --config /etc/caddy/Caddyfile --force"; Type = "notify"; Restart = "always"; LimitNOFILE="1048576"; TimeoutStopSec="infinity"; SendSIGKILL="no"; User="root"; #caddy Group="root"; #caddy ProtectProc="invisible"; PrivateTmp="true"; AmbientCapabilities="CAP_NET_BIND_SERVICE"; }; }; systemd.services.caddy.enable=true;
Caddyfile
localhost { header /* { -Server Permissions-Policy interest-cohort=() Strict-Transport-Security max-age=31536000; X-Content-Type-Options nosniff X-Frame-Options DENY Referrer-Policy no-referrer-when-downgrade } route /console/* { uri strip_prefix /console reverse_proxy http://127.0.0.1:9001 } }
Стало:
services.caddy = { enable = true; extraConfig = '' localhost { header /* { -Server Permissions-Policy interest-cohort=() Strict-Transport-Security max-age=31536000; X-Content-Type-Options nosniff X-Frame-Options DENY Referrer-Policy no-referrer-when-downgrade } route /console/* { uri strip_prefix /console reverse_proxy http://127.0.0.1:9001 }''; };
У данного метода есть плюсы :
Как видно из сервиса -занимает место намного меньше и все что нужно у нас на виду.
Удобочитаемо
Продолжим мучить обновлять наши сервисы.
Обновляем Minio.
Мы помним что в прошлый раз, из пакетного менеджера была проблемная версия minio-server,так что ставим его из unstable-channel
nix-env -f channel:nixpkgs-unstable -iA minio
дает нам версию, что на сегодня является самой свежей:
# minio -v minio version RELEASE.2023-08-16T20-17-30Z (commit-id=RELEASE.2023-08-16T20-17-30Z) Runtime: go1.20.7 linux/amd64 License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html> Copyright: 2015-0000 MinIO, Inc.
и удаляем его :
nix-env --uninstall minio
и закомментируем строчки: # minio # minio-client И сервис наш тоже выполняем нашу любимую команду и чистим кэш nixos-rebuild switch && nix-collect-garbage
теперь подумаем, как реализовать это в файле конфигурации:
зайдем в конфиг
nano /etc/nixos/configuration.nix
Дальше идем к полной переустановке Minio
Почистим наше хранилище(так как это тестовая машина и данные не особо нужны ,то делаем рискованные шаги )
# unstable.minio # unstable.minio-client И сервис наш тоже выполняем нашу любимую команду и чистим кэш nixos-rebuild switch && nix-collect-garbage
расскомментируем и обновим наши строчки
unstable.minio unstable.minio-client
обновим конфиг
systemd.services.minioserver = { enable = true; description = "MinioServer" ; wantedBy = [ "default.target" ]; serviceConfig = { EnvironmentFile= "/etc/default/minio"; ExecStart = "${pkgs.minio}/bin/minio server --json $MINIO_OPTS $MINIO_VOLUMES ";# ExecStop = " "; Type = "notify"; Restart = "always"; LimitNOFILE="1048576"; TimeoutStopSec="infinity"; SendSIGKILL="no"; User="root";; Group= "root"; ProtectProc="invisible"; }; }; а этот сервис нам поможет по новой не прописывать алиас на наш сервер. Да и в случае чего можно дополнить нужными нам командами,например- статистикой. systemd.services.minio-config = { enable = true; path = [ pkgs.minio pkgs.minio-client]; requiredBy = [ "multi-user.target" ]; after = [ "minioserver.service" ]; serviceConfig = { Type = "simple"; User = "root"; Group = "root"; }; script = '' set -e mc alias set mys3 http://localhost:9000 barsik barsikpassword ''; };
Осталось обновить конфигурацию .
Переписываем Prometheus
Очищаем все как и в примере minio и перепишем его.
прописываем вместо prometheus environment.systemPackages = with pkgs; [ ... unstable.prometheus #prometheus ... ];
так как наши credentials (скорее всего) больше не действуют и обновляем алиас
#Здесь мы пойдем по пути меньшего сопротивления, # потому что мы уверены на 1000%,что на него имеем доступ только мы. #Но если это не так то делаем по аналогии,как это было в 1й части. mc alias set mylocal http://localhost:3000 barsik barsikpassword
и генерируем конфиг для prometheus:
# mc admin prometheus generate mylocal scrape_configs: - job_name: minio-job bearer_token: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJwcm9tZXRoZXVzIiwic3ViIjoiYmFyc2lrIiwiZXhwIjo0ODQ2OTE2OTU2fQ.TBElC01EHRxMdjmbSmgaZsbA3scZS3FnxCP2CGZacmHEbOCSPj5YWHyLnayWsgK56QwNNSd8OJvrV8sU3t9wbw metrics_path: /minio/v2/metrics/cluster scheme: http static_configs: - targets: ['localhost:9000']
прописываем в сервис:
services.prometheus = { enable = true; scrapeConfigs = [{ job_name = "minio-job"; bearer_token = "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJwcm9tZXRoZXVzIiwic3ViIjoiYmFyc2lrIiwiZXhwIjo0ODQ2OTE2OTU2fQ.TBElC01EHRxMdjmbSmgaZsbA3scZS3FnxCP2CGZacmHEbOCSPj5YWHyLnayWsgK56QwNNSd8OJvrV8sU3t9w> metrics_path = "/minio/v2/metrics/cluster"; scheme = "http"; static_configs = [{ targets = ["localhost:9000"]; labels = { alias = "minio"; }; }]; }]; };
Наше коронное :
nixos-rebuild switch и смотрим ,что с прометеусом: # systemctl status prometheus.service ● prometheus.service Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; preset: enabled) Active: active (running) since Tue 2023-08-29 20:07:12 MSK; 3s ago Main PID: 60628 (prometheus) IP: 0B in, 0B out IO: 140.0K read, 0B written Tasks: 7 (limit: 4694) Memory: 15.6M CPU: 432ms CGroup: /system.slice/prometheus.service
То есть он запущен и графики уже доступны в Web-консоли
Улучшим наш Postgresql.
И подправим service.postgres под единый дизайн:
services.postgresql = { enable = true; ensureDatabases = [ "miniodb" ]; enableTCPIP = true; authentication = pkgs.lib.mkOverride 10 '' #type database DBuser auth-method local all all trust host all all 127.0.0.1/32 trust # ipv6 host all all ::1/128 trust ''; initialScript = pkgs.writeText "backend-initScript" '' CREATE ROLE minio WITH LOGIN PASSWORD 'minio' CREATEDB; CREATE DATABASE minio; GRANT ALL PRIVILEGES ON DATABASE minio TO minio; ''; };
И идем в веб-консоль и находим Events:

Настраиваем наше подключение:

Cмотрим результат:

если хотим посмотреть что именно в БД и таблице:
# sudo -u postgres psql psql (14.9) Type "help" for help. postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- minio | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres + | | | | | postgres=CTc/postgres+ | | | | | minio=CTc/postgres miniodb | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (5 rows)
minio=# \dt List of relations Schema | Name | Type | Owner --------+-------+-------+------- public | minio | table | minio (1 row) minio=# \dt+ List of relations Schema | Name | Type | Owner | Persistence | Access method | Size | Description --------+-------+-------+-------+-------------+---------------+------------+------------- public | minio | table | minio | permanent | heap | 8192 bytes | (1 row)
# SELECT * FROM minio; key | value -----+------- (0 rows)
Теперь зайдем в веб-консоль->Buckets и увидим,:

создаем Бакет

Смотрим эвенты

Нажимаем на Subscribe to event (подписаться на события) и попадаем в :

или в консоли:
устанавливаем jq: nixos-env -i jq Ищем наш ARN mc admin info --json mys3/backup | jq .info.sqsARN arn:minio:sqs::PG1:postgresql прописываем ARN mc event add --event "put,get,delete" mys3/backup arn:minio:sqs::PG1:postgresql
Попробуем закинуть данные с папки "Download":
mc cp . mys3/backup --recursive
И проверяем наши эвенты:
sudo -u postgres psql psql (14.9) Type "help" for help. postgres=#\c minio You are now connected to database "minio" as user "postgres". minio=# SELECT * FROM minio1; minio=# minio=# SELECT * FROM minio;

Разбираемся с Backup'ами
Обновляем и restic.
environment.systemPackages = with pkgs; [ unstable.restic ];
инициализируем бакет:
export AWS_ACCESS_KEY_ID=barsik export AWS_SECRET_ACCESS_KEY=barsikpassword # restic -r s3:http://localhost:9000/resticbackup init enter password for new repository: enter password again: created restic repository f906e494c7 at s3:http://localhost:9000/resticbackup
И пишем Сам конфиг с удалением устаревших бэкапов через час(по факту у нас не так часто меняются данные здесь, поэтому это не особо нужно):
systemd.services.s3backup= { enable = true; script = '' export AWS_ACCESS_KEY_ID=barsik export AWS_SECRET_ACCESS_KEY=barsikpassword ${pkgs.restic}/bin/restic -r s3:http://localhost:9000/resticbackup backup /home/vasya -p /home/vasya/password ${pkgs.restic}/bin/restic -r s3:http://localhost:9000/resticbackup forget -p /home/vasya/password --keep-last 1 ''; }; systemd.timers.s3backup = { wantedBy = [ "timers.target" ]; partOf = [ "s3backup.service" ]; timerConfig = { OnCalendar = "OnCalendar=*:0/15"; #every 15 minutes Unit = "s3backup.service"; }; };
Настраиваем Grafana:
в /etc/nixos/configuration.nix добавляем:
в environment.systemPackages = with pkgs; [ ... unstable.grafana ... ]; В сервисе Caddy прописываем: ... route /grafana* { uri strip_prefix /grafana reverse_proxy http://127.0.0.1:3000 } ... добавляем сервис: services.grafana = { enable = true; settings = { server = { http_addr = "0.0.0.0"; http_port = 3000; root_url = "https://localhost/grafana"; own_from_sub_path="true"; }; }; };
нас встречает окно приветствия со стандартным admin/admin

Меня в��третило

Подключаем наш прометеус, настраиваем нужные графики и радуемся нашему Dashboard:

Теперь осталось обновить строку:
networking.firewall.allowedTCPPorts = [22 9000 80 443 ];
Обновляем конфиг и у нас теперь меньше точек входа на наш сервер, а значит он немного но стал более безопасен от внешних вторжений.
Спасибо всем за внимание, надеюсь данная статья оказалась полезной.
И теперь осталось перевести дух и начать писать 3 часть.
P.S. Хочу выразить благодарность всем кто прочитал и отреагировал (оказалось, что я поднял узкую тему, которая интересна не только мне) и NixOS Ru Community - за то что навели меня на мысль, как можно улучшить сервисы.
