ServerAdmin.ru
31.3K subscribers
664 photos
55 videos
22 files
2.86K links
Авторская информация о системном администрировании.

Информация о рекламе: @srv_admin_reklama_bot
Автор: @zeroxzed

Второй канал: @srv_admin_live
Сайт: serveradmin.ru

Регистрация в РКН: https://vk.cc/cG1Urj
Download Telegram
Настраивал на днях арендованный сервер без прямого доступа к консоли. Ещё и конфигурация была нестандартная, так что техподдержка вручную установила туда ОС и отдала мне с доступом по SSH. Нужно было настроить дополнительные диски и добавить их в fstab. Несмотря на то, что в современных ОС реально монтирует диски systemd, я по старинке предпочитаю добавлять новые точки монтирования в fstab.

В этом деле самое главное – не ошибиться и сразу после изменения файла проверить, что там всё в порядке. Иначе после перезагрузки можно получить проблемы. Без прямого доступа к консоли это может быть фатально.

Я обычно добавляю новые диски в систему следующим образом. Смотрю список дисков через fstab:

# fdisk -l | grep /dev/

Сразу видно диски без разметки. Добавлять разделы предпочитаю в cfdisk, а не напрямую в консоли через fstab. В TUI как-то нагляднее, меньше шансов ошибиться.

# cfdisk /dev/sdb

Создаю раздел, выбираю тип раздела, сохраняю. После этого можно создавать файловую систему.

# mkfs -t ext4 /dev/sdb1

Монтирую в систему:

# mkdir /mnt/disk1
# mount /dev/sdb1 /mnt/disk1

Теперь нам надо добавить эту точку монтирования в fstab. По имени диска категорически нельзя добавлять. Диски могут менять свои имена. Причём это стало актуально в какой-то момент с очередным обновлением железа. Когда я только начинал изучать Linux, спокойно монтировал по именам дисков и проблем не было. В какой-то момент они начались. И сейчас я сам часто наблюдаю, что диски, как и сетевые интерфейсы, могут изменить свои имена после перезагрузки. Если используете LVM, то можно добавлять точки монтирования по имени LV.

Смотрим UUID раздела:

# blkid | grep /dev/sdb1

Добавляем его в fstab отдельной строкой:

UUID=eaf5c153-08b7-4ea8-8037-e6baad4cac0d /mnt/disk1 ext4 errors=remount-ro 1 0

А теперь проверяем, всё ли мы правильно добавили.

# findmnt --verify --verbose

Findmnt проверил все монтирования. В моём случае я получил предупреждение на /media/cdrom0.

[W] unreachable source: /dev/sr0: No such file or directory

Судя по всему систему ставили с какого-то диска, локального или сетевого, не знаю, но он остался в fstab. Делать ему там больше нечего, можно закомментировать строку с ним.

Более кратко можно получить информацию только об ошибках:

# findmnt -x

☝️Отдельно обращаю внимание на такой момент. До перехода управления к systemd было критически важно оставлять в fstab в конце файла переход на новую строку. Сейчас даже если этого не сделать, то проблем не будет. Всё нормально загрузится. Насколько я понимаю, это тянется из далёкого прошлого и POSIX-совместимой практики, когда файлы конфигурации заканчивались переходом на новую строку. Я лично до сих пор на всякий случай везде этой практики придерживаюсь.

Ещё один способ проверить корректность записей в fstab – использовать mount. Можно не монтировать вручную новый диск, а сразу добавить его в fstab. Потом запустить:

# mount -a -v

Утилита смонтирует все записи из файла, где не указан параметр noauto. Если вы всё верно добавили, то ошибок не увидите и получите смонтированным новый диск.

Расскажу, что будет, если, к примеру, ошибётесь с диском в fstab или он просто перестанет быть видим в системе. Я лично с этим не раз сталкивался. А однажды это привело к дальней дороге. Добавили наживую новый диск в сервер, я его добавил с ошибкой в fstab и не проверил. Сервер аварийно перезагрузился через полгода из-за обесточивания серверной. Возникли какие-то проблемы с доступом туда, ещё и сервер по неизвестной на тот момент мне причине не стартанул. Приехал туда ножками и увидел примерно то же самое, что вы видите на втором скрине.

Сразу понял, в чём дело, зашёл в режим обслуживания и поправил fstab. Так что внимательно относитесь к его настройке. Этой проблемы можно избежать, если использовать nofail в параметрах монтирования. Но с ним могут быть нюансы. Иногда лучше не загрузиться, если с разделом проблемы.

❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.

#linux
2👍242👎4
Я написал большую и насколько смог подробную статью по настройке кластера на базе Proxmox VE. По современным требованиям законодательства я вынужден промаркировать её как реклама, так как сервера для её написания мне предоставил хостер Selectel, а я оставил на него ссылки. Никаких требований непосредственно по рекламе предъявлено не было, кроме одного – в статье должно быть показано, как я заказываю услуги через панель управления. По содержанию и тексту не было ни единой правки. Всё продумал, настроил и написал лично я от и до.

Статья получилась универсальной без привязки к конкретным услугам, так как я использую обычные арендные сервера с установленной бесплатной версией Proxmox VE, а в качестве общих хранилищ для кластера – сетевые диски, подключаемые через iSCSI интерфейс. Настройка подобных дисков плюс-минус везде одинаковая. Разница если и будет, то в типе аутентификации или её отсутствии.

В статье отражены следующие моменты:

▪️Настройка Proxmox VE на серверах с двумя NVMe M.2 дисками, объединёнными в программный RAID1 на базе mdadm для отказоустойчивости на уровне дисков.
▪️Объединение трёх идентичных серверов в обычный кластер с локальными дисками и ручной миграцией виртуальных машин без их остановки.
▪️Настройка сети виртуальных машин с VLAN с помощью встроенной Proxmox SDN.
▪️Подключение к серверам сетевых дисков по iSCSI, добавление их в Proxmox и создание на их базе общих хранилищ для дисков виртуальных машин в формате LVM.
▪️Настройка HA (High Availability) на примере виртуальной машины и LXC контейнера. Я настраиваю HA, аварийно выключаю одну из нод кластера и показываю, как с неё автоматически переезжают ресурсы на работающие ноды.

На выходе мы получаем универсальное и относительно бюджетное (в сравнении с другими кластерами) решение для размещения виртуальных машин и LXC контейнеров. Оно закрывает задачи размещения нагрузки на локальных дисках для максимальной производительности и отказоустойчивой нагрузки высокой доступности на базе сетевых дисков с общим доступом.

Остались нерассмотренными пара других полезных конфигураций:

◽️Репликация виртуальных машин в кластере на базе файловых хранилищ в формате zfs.
◽️Использование кластера Ceph для виртуальных машин, построенного на базе этих же трёх нод кластера.

Изначально хотел всё это рассмотреть, но по факту материал получился и так очень большой, потратил на него много времени и банально не осилил. Возможно получится это сделать в будущих статьях.

Установка и настройка кластера Proxmox VE

Настройка кластера высокой доступности на базе Proxmox VE представляет из себя относительно простую, рядовую задачу. При этом выполнить её можно на любом железе, от самого бюджетного десктопного оборудования до серверных платформ. Сочетание софтовых решений по отказоустойчивости дисков на базе mdadm или zfs вкупе с функциональностью HA кластера Proxmox позволяют реализовать относительно (!) высокую доступность на любом поддерживаемом этой системой оборудовании. А так как сама система на базе ОС Debian и ядра Linux, поддерживает она практически любое более-менее современное железо.

❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.

#proxmox #статья
12👍378👎5
Расскажу кратенько с конкретными примерами, как я настраиваю ограничение на доступ к серверам и сервисам по статическим IP адресам и потом подключаюсь к ним, используя некоторое количество арендованных VPS для этих целей.

Я уже давно практикую и остальным советую не оставлять публичный доступ через интернет к сервисам, которые не являются публичными. Например, тот же SSH я открываю только для белого списка своих IP адресов. Для iptables это обычно выглядит так:

SSH_WLIST=100.189.229.125,141.73.66.12,187.91.13.196,83.208.103.44,194.139.219.214
iptables -A INPUT -i enp5s0 -s $SSH_WLIST -p tcp --dport 22 -j ACCEPT

В скрипте с правилами задана переменная со списком моих IP адресов и правило для SSH на его основе.

На VPS с перечисленными IP адресами настроены сервера OpenVPN. Они используются для различных задач, в том числе в качестве шлюзов для подключения к закрытым серверам. При подключении со своих рабочих машин я не направляю весь трафик в VPN. Это неудобно и мешает работе. В общем случае я использую прямой выход в интернет для типовых задач в виде сёрфинга в интернете, просмотра видео и т.д.

При подключении по VPN я получаю только те маршруты, что мне нужны. Например, я хочу подключаться к серверу c IP адресом 233.129.58.85 через конкретный OpenVPN сервер. Я иду на него и добавляю на сервере к конфигурации, привязанной к сертификату, который я использую при подключении, следующую настройку:

push "route 233.129.58.85 255.255.255.255"

При подключении по VPN ко мне в систему приедет маршрут до 233.129.58.85 через этот сервер. Подключение по SSH к этому серверу пойдёт через VPN. В настройке маршрута можно указать не только IP адрес, но и DNS имя. Примерно так:

push "route ya.ru 255.255.255.255"

Чтобы это сработало, в конфигурации клиента, для которого добавлен такой маршрут, должен быть добавлен параметр:

allow-pull-fqdn

В итоге на рабочей машине у меня настроен клиент OpenVPN с готовыми подключениями к различным VPN серверам. Когда мне надо подключиться к той или иной инфраструктуре, я подключаюсь к нужному VPN серверу и получаю маршруты только туда. Всё остальное остаётся неизменным. Весь трафик в VPN я не направляю, уже существующие соединения не рвутся. Одновременно могут быть активны разные OpenVPN соединения. Все маршруты управляются с серверов. На самом клиенте я ничего не меняю.

В такую схему легко добавляются новые VPS, новые пользователи (❗️), новые сертификаты со своими привязанными к ним настройками, и всё это управляется централизованно через сервера. Сами клиенты трогать не надо.

📌 Полезные ссылки по теме:

▪️Основные преимущества OpenVPN сервера
▪️Настройка allow-pull-fqdn
▪️Одновременный запуск нескольких клиентов OpenVPN
▪️Запуск OpenVPN сервера на разных внешних IP адресах
▪️Запускаем OpenVPN сервер за 443 портом веб сервера

На днях на одном из моих серверов протух CA, который был выпущен 10 лет назад. Такие встречаются долгожители. И это не первый случай. Писал и заметки здесь по этой теме, и статья на сайте есть.

❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.

#openvpn
2👍165👎6
Я анонсировал ранее подборку сайтов IT блогеров со статьями на различные темы, связанные с настройкой и эксплуатацией IT систем. Собралось небольшое сообщество авторов. Полный список сайтов есть в прошлой подборке. А пока анонс новых статей тех авторов, кто согласился участвовать и прислал свои материалы. 

Разрабатываем мини-автоматизацию по оповещению администратора о факте НСД в Astra Linux
Оповещения администратора безопасности при попытках подключения незарегистрированных носителей информации к Astra Linux. Реализовано через правило udev, которое запускает скрипт при подключении носителя, скрипт отправляет запись в локальный syslog сервер, а тот пересылает в удалённый.

Человеческий фактор или вредные советы по Astra Linux
Несколько примеров из практики на тему того, как не работают внедрённые регламенты и правила.

Установка Astra Linux 1.8. Как установить и что нового?
Подробная статья на тему установки новой Astra Linux 1.8 от создания загрузочной флешки до разбивки диска и начальной настройки.

🔥 Windows и оперативная память
Подробная статья на тему работы с памятью в Windows: чем виртуальная отличается от физической, как происходит выделение памяти процессам, что такое рабочий набор, swap и др. Работа с утилитами RAMMap, Process Explorer, Testlimit, Strings, NotMyFault и poolmon. Кому не интересно всё это, можете перемотать в раздел Диспетчер задач Windows и память и посмотреть описание метрик памяти в диспетчере задач.

Как установить сертификат ECC (Elliptic Curve Cryptography) в Exchange Server
ECC сертификаты приехали в Exchange. Я давно начал их использовать для SSH и вам советую. Если быть точным, ECC - это алгоритм Elliptic Curve Cryptography (криптография на эллиптических кривых), а я имею ввиду ключи на базе алгоритма Ed25519, который основан на эллиптических кривых.

Как установить RSAT на Windows 11
Установка Remote Server Administration Tools для управления различными ролями Windows Server: AD, DNS, DHCP и другие.

Как исправить спам-сообщения в средстве просмотра очереди Exchange Server
Письма, отправленные на несуществующие адреса в вашем домене, обрабатываются, формируются отчёты о недоставке (NDR) и отправляются обратно отправителю. В статье рассказано, как с этим бороться.

Как настроить учетную запись службы для присоединения к домену
Создание учётки с ограниченными правами, предназначенной только для присоединения устройств к домену.

Установка контроллера ZeroTier на свой сервер с помощью ZTNET
Selfhosted размещение ZeroTier контроллера со встроенной панелью администратора.

Построение защищенных виртуальных сетей с помощью Nebula
Объединение распределенных устройств в отдельную изолированную сеть с помощью Nebula.

Собираем docker образ DNS сервера Unbound
Создание собственного Docker образа популярного DNS сервера. Процесс рассмотрен очень подробно, так что материал можно использовать как пример сборки собственных образов других сервисов.

Поднимаем свой DNS сервер Unbound и блокировщик рекламы Pihole в docker
К собранному ранее образу с Unbound добавляется Pi-hole для блокировки рекламы.

Пользователи в Linux
Небольшая справочная статья по работе с пользователями в Linux - создание, удаление и т.д.

Использование sudo в Linux
База по установке и настройке Sudo. Кому любопытно, когда-то давно я написал статью Sudo не нужен при работе в консоли сервера.

SSH – Тонкая настройка клиента в Linux: config файл и ssh-agent
Примеры некоторых настроек клиента SSH, а также использование ssh-agent.

Ollama — Локальный ИИ на вашем Linux ПК
Установка Ollama и запуск на ней бесплатных моделей разной сложности.

RabbitMQ. Практика. Troubleshooting. CLI. Отсутствует утилита rabbitmqadmin
Небольшая заметка по установке консольной утилиты rabbitmqadmin.

Как полностью удалить Microsoft Office с компьютера
Использование утилиты Office Scrubber для очистки компа от следов офиса.

Основы SQL на примере PostgreSQL
База по синтаксису SQL на основе примеров в PostgreSQL.

#статьи
👍148👎4
Покажу небольшой bash трюк, который поможет грепнуть информацию, когда обычный способ не работает. Демонстрирую сразу на примере, с которым сам постоянно сталкиваюсь.

Вам нужно узнать, есть ли необходимый модуль в составе Nginx. По идее всё просто:

# nginx -V

На выходе портянка, в которой глазами трудно что-то найти. Пробуем грепнуть:

# nginx -V | grep http_realip_module

Вообще ноль изменений. И причины тут на самом деле не одна, а сразу две:

1️⃣ nginx -V выводит информацию не в стандартный поток с данными stdout, с которым работает grep и прочие консольные утилиты, а в stderr;

2️⃣ все модули перечислены одной строкой, так что грепнуть её содержимое не получится.

Показываю решение обоих проблем:

# nginx -V 2>&1 | tr ' ' '\n' | grep http_realip_module
--with-http_realip_module

Видим нужный нам модуль. Я сначала через 2>&1 направил поток stderr в stdout, чтобы с ним можно было работать консольными утилитами, а затем с помощью tr заменил все пробелы символами перехода на новую строку \n. В итоге у нас весь вывод nginx -V разбился на отдельные фразы, каждая в новой строке и после этого успешно грепнулся.

В принципе, можно обойтись без разбивки одной строки на несколько, так как grep скорее всего подсветит найденную фразу, но это зависит от различных настроек. Где-то может и не подсветить. Если всё же разбить, то будет нагляднее.

❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.

#bash
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍238👎2
Парочка наглядных примеров вранья ИИ, в частности ChatGPT. Последнее время регулярно им пользуюсь, практически каждый день, для решения различных задач и поиска информации. Фактически он мне стал заменять поиск. Я не использую каких-то больших промтов для решения масштабных задач. Скорее использую его как базу данных и расширенный поиск. Соответственно и пишу туда примерно то же самое, что я бы спросил у поисковика. Результат получается лучше.

При этом постоянно сталкиваюсь с тем, что ИИ врёт. Просто сходу придумывает факты, решения, ключи к утилитам и т.д. При этом не ставит под сомнение свои ответы, не делает акцент на том, что вот тут я выдумываю и могу быть не прав. Так как я уже специалист с опытом, мне это больших проблем не доставляет.

А как быть тем, кто только учится и использует в качестве помощника ИИ? По идее это делать нельзя, а в процессе обучения и наработки опыта вообще противопоказанно им пользоваться. Нужно всё перепроверять, а это потеря времени. А если ты не специалист, то узнаешь, что надо перепроверять только тогда, когда уже случится ошибка и тебе на неё кто-то укажет.

В примере с mount ошибка сразу видна, а вот в первом неочевидна, так как проверить её весьма затратно. И если перепроверять все результаты, которые выдал ИИ, то окажется, что самому составить список было бы быстрее. И такое случается нередко. Иногда ИИ ходит вокруг да около решения, предлагая тебе нерабочие варианты, а на отладку тратится времени больше, чем если бы ты сам его сделал с помощью подсказок со stackoverflow.

У меня отношение средненькое к современным ИИ. Зачастую не понимаю восторгов в их адрес. Да, пользоваться можно и нужно. Результат хороший в вопросах анализа и обобщения информации, клонировании контента в заданном стиле с заданными правками, создания изображений, инфографики. И очень посредственный в создании чего-то нового. Те же скрипты он пишет, но без отладки и исправления ошибок практически никогда не обходится. И это в довольно простых задачах, которые в общем-то можно сходу нагуглить. Более сложные не пытался решать, так как задач под это нет. Возможно у программистов другие выводы по этой теме.

#AI #chatgpt
👍140👎10
Искал на днях материалы на тему Playwright. Это фреймворк для веб тестирования и автоматизации, более современный аналог Selenium. Последний я немного учил, но он довольно замороченный, с полтычка не освоишь. Playwright показался немного попроще в каких-то базовых вещах.

Рассказать сегодня хотел не об этом. Я попал на сайт к какому-то девопсу, где были материалы по Playwright. Я немного походил по нему и набрёл на раздел DevTools. Он там собрал то ли свои, то ли просто open source инструменты для решения простых прикладных задач. Вроде ничего особенного, но некоторые вещи я просто не знал, что вообще существуют. Всегда их делал вручную.

Покажу сразу на примерах, что мне показалось полезным:

- Docker Run to Docker Compose Converter
Отправляем в форму однострочник с docker run и получаем файл для docker compose. Вроде мелочь, но я всегда это делал вручную. Не думал, что кому-то придёт в голову написать конвертер.

- Docker Compose to Docker Run Converter
И соответственно в обратную сторону преобразование из docker compose в однострочник для docker run. Не припоминаю, чтобы мне приходилось такие преобразования делать, но в тему к первому упоминаю.

- Bash Command Formatter
Эта штука тоже очень понравилась. Она длинный однострочник разбивает на строки с переходами через \ То есть вот такую колбасу:

curl -v --url "smtp://mail.server.ru:25" --mail-from "[email protected]" --mail-rcpt "[email protected]" --user '[email protected]:password123' --upload-file ~/mail.txt

Нарезает на кусочки:

curl -v \
 --url "smtp://mail.server.ru:25" \
 --mail-from "[email protected]" \
 --mail-rcpt "[email protected]" \
 --user '[email protected]:password123' \
 --upload-file ~/mail.txt

Я тоже всегда это вручную делал, особенно для публикации сюда. Можно упростить себе задачу.

- URL Extractor
Просто кидаешь сюда любой текст, а на выходе получаешь набор ссылок, если они в нём присутствуют.

Там много всяких конвертеров и анализаторов синтаксиса для json, yaml, toml, csv. Не стал обращать на них внимание, так как их существует десятки. Обычно просто в гугле ищут что-то подобное, когда надо преобразовать. Посмотрите список, может вам что-то ещё приглянётся. Меня впечатлили только эти четыре штуки.

#devops #docker #bash
👍110👎2
Часто возникают ситуации, когда хочется силами веб сервера закрыть доступ к какому-то непубличному ресурсу. Причём не обязательно у этого ресурса нет своей аутентификации. Если нет явной необходимости то и её стоит закрыть от посторонних глаз. Расскажу, какими способами это можно сделать в веб сервере Angie/Nginx.

1️⃣ Basic Authentication. Самый простой и быстрый способ, известный очень давно. Для аутентификации используется текстовый файл с сохранёнными там парами логин-пароль. Очевидное неудобство – этот файл нужно вести отдельно от любых других хранилищ учётных записей.

2️⃣ Модуль ngx_http_auth_request_module. Это модуль от команды Nginx, который работает относительно просто. Он создаёт подзапрос к какому-то внешнему сервису и если получает от него код ответа 2xx, доступ разрешается, если 401 и 403, то запрещается. В качестве внешнего сервиса могут использоваться разные системы с разными бэкендами для хранения учётных данных. Например, для аутентификации через LDAP обычно используют nginx-ldap-auth. Полная схема работы с ним есть в статье на сайте Nginx.

Удобство этой схемы в том, что конфигурация веб сервера не содержит в себе логики аутентификации, не привязана к ней. А внешний сервис может располагаться где угодно.

3️⃣ Модуль ngx_http_auth_ldap_module. Это внешний модуль стороннего разработчика для аутентификации через внешний LDAP сервис. Его отличие от предыдущего варианта в намного более простой настройке. Вся логика подключения к LDAP каталогу настраивается в конфигурации веб сервера. Он делает все запросы к каталогу и выполняет аутентификацию.

4️⃣ Модуль ngx_http_auth_spnego_module. Этот модуль позволяет настроить аутентификацию через Active Directory с помощью Kerberos. Его удобство относительно описанных выше способов в том, что если у вас браузер поддерживает сквозную аутентификацию Kerberos, то доменные пользователи будут автоматически попадать на закрытые ресурсы без необходимости отдельно вводить учётные данные.

5️⃣ Сервис SSO, например, Authentik. Решил вынести этот способ в отдельный пункт, хотя это и не совсем корректно. Это может быть комбинация различных методов аутентификации, так как тот же Authentik, к примеру, может выступать в качестве LDAP каталога, либо реализовывать тот же метод Basic Authentication, только с хранением учётных данных у себя.

Если будете использовать внешние модули, то удобнее взять Angie, так как там в базовом репозитории они все уже есть. Для Nginx скорее всего что-то придётся собирать самому в зависимости от дистрибутива. Где-то в репозиториях есть модули, где-то нет.

Современным и удобным способом является использование сервиса SSO. Наиболее известные - Keycloak, Authentik, Authelia, ZITADEL. Список составлен от сложного и тяжёлого к более простому и лёгкому. Они реализуют в том числе современные технологии типа OAuth2, OTP (one-time password), OpenID Connect и т.д. Но и, соответственно, требуют больше внимания и времени на настройку. Если какой-то модуль Nginx можно быстро установить и настроить, то с SSO придётся повозиться. Для простых ситуаций это может быть неоправданно.

❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.

#nginx #angie
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍106👎2
Существует удобный и функциональный инструмент для добавления интерактива в shell скрипты под названием Gum. Я посмотрел несколько примеров, в том числе на ютубе, как люди решают те или иные задачи с его помощью. Синтаксис очень простой, особо разбираться не надо. Можно сходу брать и писать скрипт.

Я для примера решил сделать поиск по директории с выводом топ 10 самых больших файлов, из которых можно какие-то выбрать и удалить. Сделал просто в лоб на bash – сформировал список, отправил его в gum и добавил действие для выбранных файлов:

#!/bin/bash

DIR="/tmp/backup"
files=$(find "$DIR" -type f -exec du -b {} + 2>/dev/null | sort -nr | head -n 10 | awk '{print $2}')
selected=$(echo "$files" | gum choose --no-limit)
delete=$(echo -e "$selected")

if [[ -z "$delete" ]]; then
echo "Ничего не выбрано."
exit 0
fi

gum confirm "Удалить выбранные файлы?" &&
echo "$delete" | xargs -d '\n' rm -f && echo "Выбранное удалено."


Понял, что всё получилось и решил как-то это усложнить и сделать более удобным. Дай, думаю, попрошу Chatgpt что-то написать. На самом деле не рассчитывал на успех, так как это не особо популярный инструмент. Откуда ему взять навык написания скриптов для gum? Вряд ли их много в интернете можно найти.

Отправил ему адрес репозитория и попросил сделать 2 списка: один с самыми большими файлами, второй – с самыми старыми. Причём вывести их вместе на один экран, в списках отобразить размер файлов и их даты.

Задача не сильно сложная, но немного муторная, так как списки надо правильно сформировать, объединить, пункты выбора насытить дополнительной информацией в виде размера файлов и даты. Потом всё это надо очистить, чтобы передать на удаление только имя файла. Чтобы самому это сделать, надо потратить какое-то время.

Chatgpt меня удивил, когда практически сразу же выдал рабочее решение. Там были ошибки по части bash. Нужно было что-то экранировать, а что-то получше очистить. А вот в части непосредственно Gum он на удивление сразу же всё корректно оформил в соответствии с его возможностями. Я думал, что-то выдумает от себя нерабочее, но нет.

В итоге минут за 15-20 со всеми тестами я получил рабочий вариант скрипта. Реально, был очень удивлён. Не так давно его мучал конфигурациями Nginx, по которым море примеров в сети, но так и не добился того, что хотел. А тут какой-то Gum и сразу всё заработало.

☝️ Какое в итоге резюме. Gum – прикольная штука, которую можно приспособить под какие-то свои задачи. Например, выбор подключений по SSH, работа с ветками GIT, работа со списками файлов и т.д. Тут уж каждому своё. А второй момент – используйте ИИ для своих задач. Где-то он мимо советует, а где-то сразу рабочий вариант даёт. Причём в таких небольших прикладных задачах он нормально работает. На bash пишет уверенно. Есть проблемы, но поправить после него намного проще, чем написать самому, вспомнив все возможности и ключи консольных утилит.

Итоговый скрипт

Использовать:

# ./cleanup-with-gum.sh /mnt/backup

❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.

#bash #AI #script
👍111👎5
Современная веб разработка и частично эксплуатация плотно завязаны на Docker контейнеры. Они используются повсеместно. Недавние истории с временной блокировкой docker hub и внедрением новых лимитов одним днём усложнили жизнь тем, кто завязан на публичное хранилище образов в виде Docker Hub. При этом нет никаких проблем использовать своё Docker Registry, причём как для хранения своих образов, так и кэширования запросов с Docker Hub.

Использовать своё хранилище образов имеет смысл уже при наличии хотя бы пары разработчиков, которые с ними работают. Я уже кратенько упоминал, что существуют различные бесплатные self-hosted решения:

🔹Gitlab Registry или Gitea Registry. Их имеет смысл использовать, если у вас используется одноимённая инфраструктура для хранения кода. С Gitlab Registry проблем особых нет, кроме некоторых заморочек с проксированием, а у Gitea Registry после релиза были некоторые баги. Сейчас не знаю как, наверное уже поправили.

🔹Nexus - известное хранилище для репозиториев и Docker образов. Это комбайн, где можно хранить всё, что угодно: deb и rpm репы, репозиторий контейнеров, npm репозиторий, pypi и многие другие. Если у вас задача только для Docker, то наверное такой комбайн большого смысла использовать нет. Хотя каких-то особых проблем с установкой и настройкой не будет. Я не раз его настраивал. Установить и запустить в работу относительно просто. Всё управление через веб интерфейс.

🔹Docker Registry - продукт от самого Docker. Это был маленький легковесный проект без GUI. Сейчас глянул, а он уже deprecated, его кому-то отдали и переименовали в Distribution. Не знаю даже, что про него сказать. Описание куцее. Посмотрел документацию. На вид это продолжение того же небольшого проекта без GUI, что не очень удобно. Есть веб интерфейс от стороннего разработчика - docker-registry-ui.

🔹Harbor. На нём я хочу остановиться подробно. Это самостоятельное open source хранилище для образов Docker с встроенным веб интерфейсом и хорошим набором возможностей в open source версии. Вот основные:

◽️управление доступом на основе ролей (RBAC)
◽️поддержка LDAP для аутентификации
◽️автоматическая проверка образов с помощью Trivy
◽️режим работы как proxy/кэш-сервер для Docker Hub или других Registry

Имеем универсальное, бесплатное и функциональное решение для собственного хранилища образов. Для небольшой установки подойдёт обычная VPS с 2CPU и 4GB оперативной памяти. Показываю пошаговую установку:

# curl https://get.docker.com | bash -
# wget https://github.com/goharbor/harbor/releases/download/v2.12.3/harbor-online-installer-v2.12.3.tgz
# tar xzvf harbor-online-installer-v2.12.3.tgz
# cd harbor/
# cp harbor.yml.tmpl harbor.yml

В конфигурации надо указать:

hostname: domain.example.com # или IP-адрес

Для использования HTTPS надо предварительно получить сертификаты и указать их:

https:
 port: 443
 certificate: /etc/letsencrypt/live/338365.simplecloud.ru/fullchain.pem
 private_key: /etc/letsencrypt/live/338365.simplecloud.ru/privkey.pem

Можно получить как бесплатные от Let's Encrypt, так и использовать самоподписанные. Я получил бесплатные так:

# apt install certbot
# certbot certonly -d 338365.simplecloud.ru

Укажите пароль для admin и место для хранилища образов. Остальные настройки можно не трогать.

harbor_admin_password: Harbor12345
data_volume: /data

Устанавливаем Harbor:

# ./prepare
# ./install.sh --with-trivy

Дожидаемся загрузки и запуска всех контейнеров. После этого идём в веб интерфейс по настроенному ранее домену. Логинимся под учётной записью admin и паролем из конфигурации.

В разделе Registries добавляем Endpoint и указываем Provider - Docker Hub. Cоздаём новый проект, ставим галочку Proxy Cache, указываем созданный Endpoint.

На рабочей машине логинимся:

# docker login <harbor-host>
# docker pull <harbor-host>/cache/nginx

Сache - имя созданного проекта. Образ nginx будет скачан через Harbor и останется там в кэше.

❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.

#devops #docker
👍102👎2
Столкнулся вчера со странной ошибкой на одном из веб серверов. В мониторинг прилетело оповещение, что протухает сертификат от Let's Encrypt через 10 дней. Если всё нормально, то такого быть не должно, так как он должен обновиться за 20 дней до протухания.

Иду на сервер разбираться. Запускаю обновление и получаю странную ошибку:

ERROR: Problem connecting to server (get for https://acme-v02.api.letsencrypt.org/directory; curl returned with 7)

Судя по всему сетевая ошибка. Делаю в консоли простой запрос:

# curl https://acme-v02.api.letsencrypt.org/directory

Он отваливается по таймауту. Пробую пинговать acme-v02.api.letsencrypt.org, не пингуется. Думаю, может с DNS проблемы. Иду на другие сервера, проверяю. Везде этот домен нормально резолвится и отвечает. И на этом сервере отвечал раньше, сертификаты же регулярно обновлялись.

Пингую этот домен по IP адресу, тоже нет ответа. Призадумался. Думаю, неужели этот сервер так жёстко забанили в сервисе, что ему даже на icmp запросы отвечать перестали. Проверяю ping ya.ru, работает. Да и сам веб сервер на вид в порядке. Всё работает, как обычно.

Начинаю выборочно пинговать разные адреса. И тут начинаются чудеса. Например, не пингуются 8.8.8.8 и 8.8.4.4, но при этом пингуется 1.1.1.1 и многие другие. Смотрю системные логи, никаких ошибок. Не понимаю, что происходит.

Пошёл в панель управления хостера и создал запрос, описав ситуацию. С других серверов этого хостера всё нормально работает, все адреса доступны. Я сначала решил, что это какие-то сетевые проблемы со стороны инфраструктуры хостера. Потом вспомнил, что этот веб сервер работает в виртуальной машине. Захожу на гипервизор, проверяю эти же адреса там – всё в порядке. Они доступны.

Тикет отменил, успел написать текст, приложить скрин, но не отправил. Ещё раз внимательно посмотрел на сервер. В исходящих правилах файрвола никаких запретов, в системных логах никаких ошибок. Не понимаю, в чём проблема.

«Семь бед – один Reset»

Перезагружаю сервер, захожу, проверяю. Всё в порядке. Все адреса доступны, сертификаты обновились.

Первый раз с таким сталкиваюсь. Хотя смутно припоминаю, что вроде как-то раз что-то подобное было и тоже вылечил перезагрузкой. Но никаких подробностей не помню. Если и было, то очень давно. У кого-нибудь есть идеи, что это могло быть? Уже когда сервер перезагрузился, я подумал, что возможно были какие-то проблемы в таблице маршрутизации, но после перезагрузки там уже всё в порядке. Ничего необычного не было.

#ошибка
👍97👎3
Вчера в публикации про сетевые проблемы в комментариях подписчик упомянул проблемы с сетевой картой Realtek. Я сталкивался с ними несколько раз и прилично натерпелся, так что мне есть что сказать. Возможно кому-то это сэкономит время, если столкнётся с похожими проблемами.

Проблема эта всплывает, когда ставишь Proxmox на десктопное железо. Я нередко его использовал для различных вспомогательных задач – тестирование бэкапов, временный запасной гипервизор и т.д. В прод ставить не рекомендую, хоть и будет работать, и может показаться это выгодным. Я всегда настаивал на покупке хоть какого, старого, бушного, но сервера на полноценной серверной платформе с IPMI.

Итак, проблемы могут возникнуть, когда у вас будет примерно такая сетевая карта:

# lspci | grep Ethernet
04:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller

По умолчанию у вас будет установлен драйвер r8169. Проверить так:

# lsmod | grep r81
r8169

С ним сетевая карта может быть как вообще недоступна, так и на вид полностью рабочей, но с вероятностью непрогнозируемого зависания. Причём зависать она может очень редко, например, раз в месяц в момент сильной сетевой загрузки. Выглядит это так, что сеть как-будто вообще не работает. Причём проявляться это может как на гипервизоре, так и в каких-то отдельных виртуальных машинах. Они перестают быть доступны по сети.

Проблема может через 10 минут пройти сама, а может и нет, и поможет только перезагрузка. В логах могут быть какие-то упоминания проблем с сетевой картой, типа таких:

[01448.532276] r8169 0000:09:00.0 enp3s0: rtl_rxtx_empty_cond == 0 (loop: 42, delay: 100).

А может и вообще ничего не быть. Известное мне решение только одно – использовать драйвер r8168. Это решение широко освещено на официальном форуме Proxmox. Там можно найти множество веток с обсуждением подобной проблемы.

Драйвер можно скачать самому и собрать его. Взять можно, например, тут. Там есть инструкция по сборке, она несложная. Можно взять готовый пакет для Debian из non-free репозитория: r8168-dkms. Установить его можно так. Добавляем себе в систему репозитории non-free и non-free-firmware. То есть в файле /etc/apt/sources.list должна быть строка:

deb https://ftp.ru.debian.org/debian bookworm main contrib non-free non-free-firmware

Ставим необходимые пакеты:

# apt install pve-headers r8168-dkms

Во время установки r8168-dkms должен собраться и установиться драйвер r8168, а предыдущий r8169 отключиться и добавиться к заблокированным во время загрузки.

Есть ещё один пакет с этим драйвером, собранный специально под PVE. Я не знаю, чем он отличается от обычного дебиановского. Брать тут. Его достаточно просто скачать и установить:

# wget https://github.com/nathanhi/r8168/releases/download/pve8%2F8.054.00-1-bpo12/r8168-dkms_8.054.00-1-bpo12_all.deb
# dpkg -i r8168-dkms_8.054.00-1-bpo12_all.deb

Описанные выше действия могут как помочь, так и нет. Например, на одном сервере я вообще не видел сетевой карты. После установки драйвера r8168, она определялась в системе и начинала нормально работать. А иногда ничего не менялось и сеть как отваливалась периодически, так и продолжала отваливаться. Тогда приходилось делать что-то типа такого:

#!/bin/bash
IP="10.20.1.2"
if ! ping -c 1 -W 5 "$IP" > /dev/null 2>&1; then
  echo "$(date): $IP недоступен. Перезапуск сетевой службы..."
  systemctl restart networking
else
  echo "$(date): $IP доступен."
fi

Ставил подобный bash скрипт в cron на исполнение каждую минуту. В моменты редких зависаний он перезапускал сеть и всё продолжало нормально работать.

☝️ А резюме всего этого такое. Если у вас сетевая карта Realtek, то либо замените её, либо не ставьте туда Proxmox. Есть высокая вероятность, что нормально он всё равно работать не будет, а вы только время потеряете на отладку и решение проблем.

❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.

#proxmox #ошибка
2👍207👎2
Просматривал на днях блог Zabbix. Обратил внимание на статью про интерактивные дашборды. Они вроде бы в 7-й версии появились. Может чуть раньше, уже точно не помню. Я анонсы и картинки посмотрел, немного потыкался у себя, но настраивать ничего не стал. Нужды особой не было. А тут понравились картинки, решил всё же разобраться и настроить.

В итоге всё получилось и это действительно удобно. Сделал себе основной дашборд с тремя страницами. Расскажу про каждую.

1️⃣ Страница с проблемами. У меня она всегда основная. Все проблемы на виду. Тут никаких изменений. Это старый виджет, появившийся с незапамятных времён.

2️⃣ Навигатор хостов. С ним немного повозился, так как не сразу понял, как всё это должно работать.

▪️Первый виджет - Навигатор по узлам сети с группировкой по группам.

▪️Второй - Навигатор по элементам данных. Сначала никак не мог понять, как их связать между собой, чтобы навигатор элементов отображал элементы того хоста, который выбран в навигаторе хостов. В итоге догадался, что в виджете с элементами, там где мы выбираем хост, к которому он должен быть привязан, надо выбрать не хост, а предыдущий виджет с текущей страницы.

▪️Третий виджет - Карточка хоста. Там тоже в качестве хоста указываем виджет с навигатором хостов.

▪️Четвёртый виджет - Значение элемента данных. В качестве элемента данных выбираем виджет с навигатором элементов.

▪️Пятый виджет - Топ узлов сети, отсортированных по потреблению CPU. Он сам по себе, ни к чему не привязан.

В итоге прямо на дашборде я получил обзор всех хостов с группировкой по группам. При выборе хоста я тут же получаю основную информацию по нему со ссылками на настройки хоста, последние данные, проблемы, а также навигатор по всем его элементам данных. При выборе элемента данных я получаю информацию по нему с графиком изменений. При нажатии на этот элемент, открывается график из последних данных, где можно оценить исторические изменения.

Теперь нет необходимости через меню перемещаться к списку хостов в разделе МониторингУзлы сети. Из дашборда быстрее и удобнее посмотреть всю информацию по узлу. И нет необходимости отдельно ходить в Последние данные. Опять же быстрее попасть туда из дашборда, сразу получив информацию по нужному элементу данных.

3️⃣ Третья страница у меня такая же, как вторая, но в навигаторе хостов сортировка по важности триггеров. Сразу видно все активные триггеры и их хосты. При выборе хоста в отдельном виджете отображается список активных триггеров. На этой странице удобно пробежаться по всем проблемам и оценить их.

Не зря потратил время на разбирательства. Интерактивные дашборды в Zabbix реально удобны. Мало того, что они действительно неплохо выглядят, но лично я для красоты обычно ничего не настраиваю, но и добавляют функциональность, которая упрощает эксплуатацию мониторинга. Так что ещё немного поковыряюсь с интерактивными виджетами и скорее всего распространю их на все серверы. Надо будет немного попользоваться и подумать, как их можно улучшить и сделать более удобными.

❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.

#zabbix
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍117👎2