Привет всем. Всех с днем знаний и началом осени!
Как Белинский Виссарион Григорьевич, а потом уже и сам Владимир Ильич Ленин говорил :
"Учитесь, учитесь и еще раз учитесь! Да здравствует наука!"
Вот и мы возьмемся за знания, рассмотрим, что нам может дать кладезь полезной информации - 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 - за то что навели меня на мысль, как можно улучшить сервисы.