1.1.Переписываем наш Object Cloud

—

от автора

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

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

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

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


ссылка на оригинал статьи https://habr.com/ru/articles/758418/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *