Привет всем. Всех с днем знаний и началом осени!

Как Белинский Виссарион Григорьевич, а потом уже и сам Владимир Ильич Ленин говорил :

"Учитесь, учитесь и еще раз учитесь! Да здравствует наука!"

Вот и мы возьмемся за знания, рассмотрим, что нам может дать кладезь полезной информации - 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 - за то что навели меня на мысль, как можно улучшить сервисы.

Комментарии (0)