ServerAdmin.ru
26.7K subscribers
204 photos
24 videos
8 files
2.49K links
Авторская информация о системном администрировании.

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

Второй канал: @srv_admin_live
Сайт: serveradmin.ru
Download Telegram
Скорость развития заболевания или болезненные ощущения при МФС будут у всех сильно разные. Представленные истории людей - это очень тяжёлые случаи, когда люди уже и ходить толком не могли. Конкретно у меня заболевание уже хроническое, но в острой форме оно не проявлялось, так как помогала профилактика. Но профилактика не давала излечения, а переводила болезнь в хроническую стадию.

📌 Основные причины развития МФС:

1️⃣ Травма, в результате которой нарушается симметрия туловища и работа мышц. Скорее всего у меня с этого всё и началось в юности, а далее усугубилось сидячей работой.

2️⃣ Перегрузка мышц, в том числе в результате травмы. Можно что-то поднять очень тяжёлое и надорваться, повредить мышцу. У кого-то само пройдёт, а у кого-то начнёт развиваться триггерная болезнь. Также к перегрузке мышц ведёт длительное статическое положение в неудобной позе. Это как раз наша тема. Долго сидите в неудобной позе, когда, к примеру, голова немного вперёд наклонена. Постоянно вижу таких людей. В итоге перегружаете мышцы шейного отдела. То же самое с поясницей и какими-то другими мышцами.

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

3️⃣ Сильное переохлаждение.

4️⃣ Нехватка железа, витаминов группы Б, гормональные сбои и нарушение работы щитовидной железы.

📌 Основные способы лечения. Как я уже сказал, они все представлены в книге авторов Трэвелл и Симoнс.

1️⃣ Растяжение больных мышц с помощью технологии ПИР (постизометрическая релаксация). Тянуть можно только так. Если растягивать через силу, как обычно все тянутся, то будет хуже. Больные мышцы так просто не растянуть. Растяжка может помочь только на начальной стадии, в самых простых случаях. Во всех остальных она дополняет другие способы.

2️⃣ Растяжение больных мышц, кратковременно охлаждённых какими-то препаратами. Я не видел, чтобы у нас кто-то практиковал подобное, потому что препаратов таких, как я понял, нет в продаже.

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

4️⃣ Миопрессура. Это мануальная терапия, но она не похожа на всё то, что предлагают обычные мануальщики (пример, как это выглядит для шеи). Больные мышцы с триггерами разминают с большим усилием. Это очень болезненно. Обычно миопрессуру совмещают с растяжкой и прокалываниями. Тяжелые случаи без миопрессуры не вылечить. А большинство пациентов очень тяжёлые, так как в попытках излечиться другими способами теряют драгоценное время и превращаются в хроников.

Вот примеры, как должно проходить обследование пациента при болях в спине:
Юрий Верхотуров. Это простой случай и начальная стадия. Тут же показано, как его предлагают лечить только растяжкой.
Эдуард Конкин. В описании к видео вся процедура описана текстом. Помимо просмотра, можете и её прочитать.

Ещё несколько важных моментов:
5 самых частых заблуждений о мышцах
Правда о защемлении нерва
Межпозвонковая грыжа. Делать или нет операцию?

"Болевых рецепторов нет ни в позвонках, ни в межпозвонковых дисках, ни в костях, ни в суставных хрящах, ни в спинном мозге, ни в корешках спинномозговых нервов, ни в самих нервах, как нет их в ногтях и волосах". "...источником боли могут быть только те анатомические структуры, в которых есть болевые рецепторы".

В заключительной части расскажу, что конкретно делаю я для излечения.
👇👇👇

#разное #здоровье #спина
После того, как я узнал про МФС, связался с Эдуардом Конкиным, так как он тоже живёт в Москве. Приехал к нему на приём. Стоит он символических денег. На тот момент я ещё немного сомневался в том, что у меня именно МФС.

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

Он узнал у меня про мои проблемные места: поясница и шея. В пояснице немного размял с усилием триггерную точку. Было очень больно. В шее тоже болючую точку проткнул иглой. Немного ещё посмотрел на меня, покрутил, понажимал. Убедился, что у меня кроме МФС ничего нет. Все признаки именно этой болезни. Дал контакт человека, который занимается миопрессурой (тоже бывший больной).

На следующий день у меня на пояснице, где разминали триггер, был синяк, место болело. Но что самое удивительное, пояснице стало легче. Ушла ноющая боль, растяжка улучшилась. То же самое на шее. Появилась лёгкость движений, головная боль ушла. У меня иногда голова могла болеть по нескольку дней. Это очень выматывает. Я уже научился чувствовать приближение боли. После прокола триггера почувствовал, что вероятность боли в голове ушла дальше.

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

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

📌 Дома для себя сформировал список регулярных утренних мероприятий на основе рекомендаций доктора Лукьянова (один, два):
1️⃣ Самостоятельная прокатка триггеров спины с помощью пластиковых шариков.
2️⃣ Растяжка по рекомендациям из книги Трэвелл и Симонс. За основу взял примеры вот этой женщины.
3️⃣ Прогревание под горячим душем, потом минут 10 лежу под тёплым одеялом.

Ну и регулярные походы в ЛФК и на миопрессуру. Так как туда не удаётся попасть чаще двух раз в неделю, а этого мало, приходится дома трудиться самому. Делаю этот комплекс через день, так как на следующий день после прокатки спины болят мышцы.

Если у вас болит спина или шея, не терпите боль и не откладывайте. Чем быстрее начать лечение, тем оно легче и дешевле будет. В норме у здорового человека ничего болеть не должно. Постарайтесь найти специалиста, который поможет. Самолечением тут себя не вытащить. Можно только временно облегчить ситуацию. Самому все больные мышцы не обработать. Это физически невозможно, так как желательно расслабляться, а когда сам себе делаешь - напрягаешься.

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

Будьте здоровы и не болейте.

#разное #здоровье #спина
​​Кажется, я ни разу не упоминал про простой и быстрый способ отладки bash скрипта. Для этого достаточно в самое начало написать:

set -x

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

Покажу как это работает на простом скрипте по добавлению swap в систему:

#!/bin/bash

set -x

read -p 'Enter swap size in megabytes: ' size_mb
size_kb=$((1024*${size_mb}))
dd if=/dev/zero of=/swap bs=1024 count=${size_kb}
chmod 0600 /swap
mkswap /swap
swapon /swap
if [ "$(grep '/swap' /etc/fstab)" ]; then
  echo "Error: file /etc/fstab already has 'Swap' record"
else
  echo "Add Swap record to /etc/fstab"
  echo -e '\n/swap swap swap defaults 0 0' >> /etc/fstab
fi
swapon --show

Запускаем скрипт:

# ./script.sh 
+ read -p 'Enter swap size in megabytes: ' size_mb
Enter swap size in megabytes: 512
+ size_kb=524288
+ dd if=/dev/zero of=/swap bs=1024 count=524288
524288+0 records in
524288+0 records out
536870912 bytes (537 MB, 512 MiB) copied, 1.26859 s, 423 MB/s
+ chmod 0600 /swap
+ mkswap /swap
Setting up swapspace version 1, size = 512 MiB (536866816 bytes)
no label, UUID=e873faad-881e-4df0-b25f-23580b952738
+ swapon /swap
++ grep /swap /etc/fstab
+ '[' '' ']'
+ echo 'Add Swap record to /etc/fstab'
Add Swap record to /etc/fstab
+ echo -e '\n/swap swap swap defaults 0 0'
+ swapon --show
NAME TYPE SIZE USED PRIO
/swap file 512M  0B  -2

Благодаря set -x мы видим каждое действие, которое выполняет скрипт. Оно начинается с +, а дальше виден стандартный вывод после этого действия. Так разбирать работу скрипта проще, потому что в командах видны все переменные. В этом примере это не очень актуально, а когда они будут неявно указаны, а вычисляемые, то это может сильно помочь.

Когда не знал про set -x, выводил нужные мне переменные в разных местах скрипта с помощью echo во время отладки, чтобы понимать, что там происходит после каждой команды. Но этот путь намного проще.

#bash #script
​​Примерно пол года назад я участвовал во внедрении Rocket.Chat в небольшой организации, где около 50-ти пользователей чата. Делал об этом заметку. Чат прижился, накопился некоторый опыт использования, так что могу поделиться информацией.

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

С установкой и обслуживанием больших проблем не было. Установил всё стандартно, только прикрепляемые файлы в директорию из базы вынул. Об этом писал в первой заметке. Запустил в Docker. Хватило виртуалки 2 CPU, 4GB RAM. Чат ровно один раз протёк по памяти, пришлось ребутнуть виртуальную машину. Мониторинг почти сразу оповестил, что окно логина недоступно, перезагрузил, пользователи даже не успели заметить.

Мониторинг настроил в Zabbix. Ничего особо не придумывал. Стандартный шаблон для Linux и мониторинг стартовой страницы сервиса. Внутренние метрики не стал мониторить. Нужды в этом не возникло.

Явно не нравится перевод на русский язык. Ни мне, ни пользователям. Пытался через встроенную функциональность в админке перевести самостоятельно некоторые вещи. Не получилось. Не знаю, по какой причине, но мой перевод не отображался. В самой админке по настройкам сильно не лазил. Даже не помню, что менял. Что-то по мелочи. Особо можно не вникать, если не хочется. По умолчанию всё нормально работает.

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

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

#info
https://docs.rocket.chat/deploy/updating-rocket.chat#upgrading-rocket.chat-on-docker

docker pull registry.rocket.chat/rocketchat/rocket.chat:6.4.8
mcedit .env #change version

docker compose stop rocketchat
docker compose rm rocketchat
docker compose up -d rocketchat

Обновляется обычно контейнер с Rocket.Chat, а всё состояние живёт в базе MongoDB, которая обновляется редко. Так что всё обновление - это удаление старого контейнера с чатом и запуск нового.

Для бэкапа ничего особо не придумывал. Во-первых, бэкаплю саму виртуалку. Во-вторых, рядом с директорией, где прикрепляемые к сообщениям файлы, сделал ещё пару директорий. В одной дамп базы:

#!/bin/bash
/usr/bin/docker exec rocketchat-mongodb-1 sh -c 'mongodump --archive' > /opt/rocket.chat/backup_db/rocketchat-`date +"%Y-%m-%d_%H-%M"`.dump
/usr/bin/gzip /opt/rocket.chat/backup_db/rocketchat-`date +"%Y-%m-%d_%H-%M"`.dump
/usr/bin/find /opt/rocket.chat/backup_db/ -type f -mtime +10 -exec rm -rf {} \;
/usr/bin/touch /opt/rocket.chat/timestamp

Во второй бэкап volume:

#!/bin/bash
/usr/bin/docker run --rm \
 -v rocketchat_mongodb_data:/backup \
 -v /opt/rocket.chat/backup_volume:/archive \
 --env BACKUP_FILENAME="rocketchat-%Y-%m-%d_%H-%M.tar.gz" \
 --env BACKUP_LATEST_SYMLINK="rocketchat-latest.tar.gz" \
 --entrypoint backup offen/docker-volume-backup:v2

Все три директории бэкап сервер забирает к себе. В итоге имею бэкап виртуалки, дамп базы, сырые файлы контейнера, директорию с прикреплёнными файлами.

Всё это занимает не так много места, так что особо придумывать ничего не надо.

Если есть вопросы, задавайте. Мне лично Рокет не очень нравится. Я им почти не пользуюсь. Какой-то он нелепый немного, тормозной. В админке всё тоже как-то намешано, что путаешься постоянно. Но из бесплатных что-то сильно лучше я не знаю. После Telegram трудно пользоваться другими чатами.

#chat
​​Только я успел написать и в целом похвалить Rocket.Chat за простоту установки, удобство и бесплатность, как прилетает новость о том, что в версии 6.5 теперь бесплатная версия поддерживает только 25 пользователей. Если надо больше - добро пожаловать в платную подписку - от $4.60 в месяц за пользователя.

Я успел обновиться только до 6.4.8 и меня пока это ограничение не затронуло. Пока есть время подумать, как дальше быть. Какое-то время можно не обновляться, но всё равно долго так не протянуть. Будут баги и дыры, которые нужно будет закрывать.

Новость особо нигде не светилась. Пришлось потрудиться и поискать, когда это изменение появилось. Немного информации есть в описании релиза 6.5. Плюс, обновилась документация: "Your workspace will be automatically provisioned a free Starter plan license when you install or upgrade to Rocket.Chat version 6.5 or higher." А на сайте, соответственно, появилось описание этого плана:

STARTER
Everything small teams need to collaborate securely
✔️ Up to 25 users
✔️ Up to 100 monthly active contacts (Omnichannel)

Только я определился с self-hosted бесплатным чатом, как опять придётся выбирать. Я тестировал и изучал почти все популярные чат-серверы:

◽️ Mattermost
◽️ Zulip
◽️ Revolt
◽️ Matrix + Element
◽️ Delta Chat
◽️ Jami
◽️ SimpleX Chat
◽️ NextCloud + Talk
◽️ TrueConf Server Free (бесплатно до 50 юзеров)

На мой взгляд, наиболее зрелые продукты из полностью бесплатных без ограничений по пользователям, которые можно внедрить в организации - Zulip, Rocket.Chat, Mattermost, Matrix + Element. Rocket.Chat соответственно, исключаем, так как 25 пользователей в бесплатной версии слишком мало. Неплохой продукт - TrueConf Server Free. Там и мессенджер, и видеозвонки. Бесплатно до 50-ти пользователей, что довольно неплохо. И сам чат приятный. Но если покупать, то дороговато выходит.

У кого были успешные внедрения бесплатных self-hosted чатов, поделитесь своим опытом. Не понятно, на чём теперь остановиться.

#chat #подборка
​​Для анализа скорости работы сайта, на мой взгляд, лучший сервис - webpagetest.org. И в первую очередь из-за того, что его свободно можно развернуть в любом месте. И это будет полноценная полнофункциональная версия. В этом его главное преимущество. Вы можете локально развернуть его у себя и тестировать локальный же сайт, исключая все возможные помехи.

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

Решил на днях посмотреть свежую версию и немного расстроился, не увидев готового образа Docker для быстрой установки сервиса. Установить можно и вручную. Я так делал, но это хлопотное занятие, так как сервис многокомпонентный. Не знаю, почему разработчики перестали сами его собирать.

Хорошая новость в том, что всё для сборки образа есть, но придётся это делать самостоятельно. В репозитории Docker Compose файл и краткая инструкция для сборки. Я стал собирать и столкнулся с множеством проблем. Со всеми в итоге разобрался и запустил у себя локальный сервис webpagetest. Рассказываю, как это сделал.

Для начала клонируем к себе репозиторий (он очень большой, 1 ГБ):

# git clone https://github.com/WPO-Foundation/webpagetest.git

В корне лежит файл docker-compose.yml, в котором инструкции для сборки с отсылкой к конфигам в docker/local. На момент написания заметки в Dockerfile-php есть проблемы. Я нашёл готовый Pull Request с решением это проблемы с зависимостями. Возможно вскоре он будет принят, но пока рабочий Dockerfile-php можно взять в форке от одного автора.

Второй момент - не собирался wptagent. Я его просто отключил, так как сам по себе он с сервером не связан. Его можно собрать и подключить отдельно. Так что закомментировал в композе всё, что связано с агентом:

# agent:
#  cap_add: #### Allows traffic shapping
#   - NET_ADMIN
#  build:
#   context: .
#   dockerfile: docker/local/Dockerfile-wptagent
#  command: python3 wptagent.py -vvvv --xvfb --dockerized --server http://web/work/ --location Test --key 1

То есть в исходном docker-compose.yml закомментировал строки с агентом и полностью заменил файл /docker/local/Dockerfile-php. Далее собрал сервер:

# docker-compose up

Он соберётся и запустится на 80-м порту сервера. Можно зайти по IP адресу. На странице http://172.26.180.29/install/ можно посмотреть информацию об установке и о подключенных агентах. Скорее всего у вас будет проблема с правами доступа на корневую директорию сервера. Я не стал разбираться, от какого пользователя он стартует и какие конкретно права нужны. Для теста просто дал права 0777 на всю папку www в корне репозитория:

# chmod -R 0777 www/

Теперь нам нужно подключить агента. Он может быть запущен как тут же в докере, так и на любом другом сервере. В этом и удобство webpagetest. Вы можете запустить сервер и любое количество агентов в разных местах.

На dockerhub есть собранный агент двухлетней давности. Я не стал его использовать, а собрал свежий из репозитория WebPageTest.agent. По инструкции всё собралось без проблем. После этого запускаем агента, прицепив его к нашему серверу. Перед этим нужно один модуль ядра загрузить:

# modprobe ifb numifbs=1
# docker run -d \
  -e SERVER_URL="http://172.26.180.29/work/" \
  -e LOCATION="Test" \
  -e NAME="Test" \
  -e KEY="123456789" \
  --cap-add=NET_ADMIN \
  --init \
  wptagent

Параметры в переменных обусловлены настройками Location на сервере в момент сборки, которые живут в docker/local/wptconfig. После этого через пару минут на сервере на странице http://172.26.180.29/install/ вы должны увидеть подключенного агента. После этого сервис полностью готов к выполнению тестов.

Если вам интересен этот сервис, то полное описание настройки есть у меня на сайте. Ни логика работы, ни формат конфигов не изменились. Разница только в том, что контейнеры нужно собирать самому.

#webpagetest
​​Постоянно использую systemctl, чтобы посмотреть статус службы:

# systemctl status mariadb

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

# systemctl status

Заметил случайно, когда забыл указать службу. Удивился выводу, так как увидел впервые. Причём в самом начале было указано и подсвечено красным:

State: degraded
Failed: 1 units

Стал разбираться, о чём тут идёт речь. Что там за сфейлившийся юнит:

# systemctl list-units --failed

Оказалось, что это systemd-modules-load.service юнит сфейлился на этапах ACTIVE и SUB. Мне это вообще ни о чём не сказало, поэтому стал разбираться дальше:

# systemctl status systemd-modules-load.service
# journalctl -u systemd-modules-load.service

Тут уже увидел конкретную ошибку в логе службы. Не загрузился один из модулей ядра, перечисленных в /etc/modules-load.d. Когда-то настроил и забыл об этом. Он и не нужен уже, но при этом он и не грузился, потому что добавил его с ошибкой 😎.

Помимо ошибок запуска юнитов, команда systemctl status покажет:

количество запущенных Units
uptime самой systemd
версию systemd
иерархический список запущенных служб

При этом список служб представлен в удобном виде. Более наглядно, чем в том же htop с иерархическим отображением. Так что команду надо запомнить и пользоваться.

#systemd
​​Если вы никогда не работали с OpenSearch, но хочется на него посмотреть и сравнить с ELK, то можно воспользоваться playground.opensearch.org. Для регистрации достаточно учётки gmail. Но даже если не регистрироваться, то можно что-то посмотреть. Но я не совсем понял, в каком формате. Я сразу зарегистрировался.

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

Я с OpenSearch вообще не знаком, но неплохо знаю ELK. Использую для сбора всевозможных логов: веб серверов, виндовых серверов, файловых, в том числе под виндой, логи микротиков, почтовых серверов и т.д. В общем, всё, что можно, туда засовываю.

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

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

Как и зачем появился OpenSearch, рассказывал в отдельной заметке. Если кто-то знает веские причины, кроме недоступности репозиториев ELK из России, по которым стоит перейти на OpenSearch, прошу поделиться в комментариях.

#elk
​​Почти во всех популярных дистрибутивах Linux в составе присутствует утилита vmstat. С её помощью можно узнать подробную информацию по использованию оперативной памяти, cpu и дисках. Лично я её не люблю, потому что вывод неинформативен. Утилита больше для какой-то глубокой диагностики или мониторинга, нежели простого использования в консоли.

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

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

# vmstat 1 -w -S M

Как можно убедиться, вывод такой себе. Сокращения, как по мне, выбраны неудачно и неинтуитивно. В том же dstat такой проблемы нет. Но в целом привыкнуть можно. В man vmstat они подробно описаны, так что с интерпретацией проблем не должно возникать.

А вообще, эта заметка была написана, чтобы в неё тиснуть необычный однострочник для bash, который меня поразил своей сложностью и непонятностью, но при этом он рабочий. Увидел его в комментариях на хабре и сохранил. Он сравнивает вывод информации об использовании памяти утилиты free и cat /proc/meminfo:

# eval $(free -kw | awk '/Mem/{print "mtotal="$2"\nmused="$3"\nmfree="$4"\nmshared="$5"\nmbuffers="$6"\nmcache="$7"\nmavailable="$8}/Swap/{print "stotal="$2"\nsused="$3"\nsfree="$4}');eval $(awk -F'(: +)| ' '!/\(/{print $1"="$2}' /proc/meminfo);clear; echo -e ";;;;;\nMem;total;$mtotal;│;$MemTotal;MemTotal\nMem;used;$mused;│;$[MemTotal-MemFree-Buffers-Cached-KReclaimable];MemTotal-MemFree-Buffers-Cached-KReclaimable\nMem;free;$mfree;│;$MemFree;MemFree\nMem;shared;$mshared;│;$Shmem;Shmem\nMem;buffers;$mbuffers;│;$Buffers;Buffers\nMem;cache;$mcache;│;$[Cached+KReclaimable];Cached+KReclaimable\nMem;available;$mavailable;│;$MemAvailable;MemAvailable\nSwap;total;$stotal;│;$SwapTotal;SwapTotal\nSwap;used;$sused;│;$[SwapTotal-SwapFree];SwapTotal-SwapFree\nSwap;free;$sfree;│;$SwapFree;SwapFree\n\n" | column -t -s ";" --table-columns " ,free -kw¹,KiB¹, ,KiB²,/proc/meminfo²" --table-right "free -kw¹,KiB¹" --table-truncate "/proc/meminfo²"

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

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

#bash #script #perfomance
​​Короткая заметка для тех, кто использует Docker. Вы знаете, как посмотреть параметры, с которыми запускался контейнер? Я лично не знаю и не изучал этот вопрос.

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

То есть запустив что типа этого:

# docker run \
--name insentry_watch \
--detach \
--restart unless-stopped \
--network host \
--volume insentry-data:/var/lib \
--volume /etc/timezone:/etc/timezone:ro \
--volume /etc/localtime:/etc/localtime:ro \
--stop-timeout 60 \
cr.yandex/crp5a5q503oamalo3iou/insentry-watch/linux/amd64:23.1.0.27

Я сохраню эту команду. А как узнать, с какими параметрами был запущен контейнер, если вы это забыли и не сохранили? Тут поможет runlike. Простое приложение, которое показывает полную команду, с которой был запущен контейнер. Runlike написан на python, так что можно установить через pip:

# pip install runlike

Либо просто запустить через Docker. Для этого он собран в отдельный контейнер:

# docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER

Жаль, что вывод сразу не форматируется. На выходе получается однострочная портянка.

Подозреваю, что всю эту информацию можно вытащить из docker inspect, но там слишком много всего. Не знаю, как оттуда вычленить только параметры запуска.

Исходники

#docker
​​С появлением open source технологии WebRTC связано создание огромного количества продуктов для онлайн разговоров и конференций через браузер. Практически все бесплатные продукты и множество платных построены на его базе. Среди них известный Яндекс.Телемост, Сферум от mail ru, self-hosted сервисы BigBlueButton и Jitsi, и многие другие.

Очень простым сервисом на основе WebRTC, который можно развернуть у себя буквально в несколько действий, является MiroTalk P2P. Его можно вообще не настраивать. По умолчанию всё заработает. Как он работает, можно посмотреть на публичном сервисе:

https://p2p.mirotalk.com

Локально он будет выглядеть один в один.

🟢 Основные возможности:

Полный open source, никаких ограничений.
Аутентификация пользователей, защита конференций паролем.
Оптимизация под смартфоны.
Шаринг экрана, приложения, вкладки браузера, в том числе прямой видео поток.
Качество до 4K и 60 FPS.
Запись конференций.
Поддержка REST API.

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

Чтобы Mirotalk запустить у себя, достаточно воспользоваться инструкцией. Не буду её тут приводить. Я немного с ним поразбирался, поэтому запускал и в Docker, и напрямую через npm (Nodejs). MiroTalk написан на JavaScript.

В инструкции в том числе показано, как запустить сервис за прокси с помощью Nginx или Apache. Если будете так делать, то перепроверьте конфиги из руководства. Они неаккуратно сделаны с некоторыми очень неоптимальными настройками. Например, для редиректа с HTTP на HTTPS в Nginx используется if. Так делать не надо. А вот так надо.

Для тех, кто будет реально устанавливать и пробовать, дам подсказку. Современные браузеры запрещают доступ к микрофону и камере сайтам без HTTPS. MiroTalk можно запустить без шифрования, выбрав в .env настройку HTTPS=false. Всё запустится без каких-либо ошибок. Но в браузере не будет выскакивать запрос на доступ к микрофону. Сервис, соответственно, работать не будет. Я долго возился с сервером, пока не понял, в чём дело и почему не работает. Достаточно включить HTTPS=true и всё заведётся на самоподписанном сертификате. С ним браузеры будут работать.

Я тестировал в локалке, соответственно STUN и TURN просто отключил. По умолчанию используются бесплатный сервер STUN от google и какой-то канадский TURN metered_ca, завязанный на учётку автора программы. Если хотите полностью независимый сервер с p2p между интернет клиентами, то можете поднять свои STUN и TURN серверы с помощью Coturn. Там настройка очень простая.

На картинке снизу я смартфон направил в окно, а у себя расшарил вкладку браузера.

Сайт / Исходники

#видеоконференции
Забавное ироничное интервью с энтузиастом vim, которое пользователи vim могут принять за чистую монету. Если не примут, то могут, наверное, обидеться. Но ярые фанаты vim реально похожи на этого парня:

▶️ Interview with a VIM Enthusiast

Мне ютуб его в предложку закинул, я посмотрел. В рунете не видел упоминания этого видео, хотя оно неплохо сделано. Решил перевести его. Если английский на слух не воспринимаете, смотреть можно с субтитрами, либо в переводе яндекс браузера. Он неплохо перевёл, контекст не теряется.

Ролик был снят как пародия на видео:
▶️ Vim Will Actually Change Your Life
Парень реально рассказывает, как Vim меняет жизнь и навыки работы за компом.

Я сделал сравнение vim и ide. Знаешь ли ты, насколько быстрее запускается vim? На 4,3 секунды. 4,3 секунды я экономлю каждый день. Все эти месяцы обучения того стоили.

Либо ты примешь таблетку vim, либо я не буду с тобой разговаривать. По-моему, vim - лучший редактор на свете. Ты согласен со мной? Какая эффективность!!! В нём всё делается быстро. Супер мощь набора текста. Сделай свою жизнь эффективнее 10-ти пальцевым методом набора текста. Всем нужно научиться работать с vim.
 
Школа? Какая школа? Всем следует изучать vim, как это делал я, а не ходить в школу. Через vim и его набор команд вы изучите алфавит, научитесь управлять текстом. Увеличится продуктивность в вашей жизни.

Тебе нужен vim, чтобы стать разработчиком или хакером. Не очень люблю этот термин. Ну какой я хакер? Просто сижу и смотрю целый день в окно вима. А зачем вам карьера, если у вас есть vim? Он и есть ваша карьера. Великолепная скорость с помощью горячих клавиш. Больше никакой мышки, только клавиатура. Ваши руки всегда на клавиатуре, они приклеены к ней.

Vim всегда с тобой. Его невозможно удалить. У меня нет графического окружения на компе, только vim. И это дорожка в один конец. На серверах то же самое: insert mode, visual mode, j, o, m, q, jq (*команды мог напутать, сам vim не пользуюсь*). И это круто.

Позвольте мне поделиться с вами небольшим набором команд vim, которые вам обязательно нужно изучить. Они позволят вам проводить больше времени в нём. Хотя их изучение и займёт примерно год, но оно того стоит.

Ну и т.д. Устал переводить 😊 На слух это довольно сложно. Ещё немного отдельных перлов:

Я не рекомендую кому-то использовать vim, я настаиваю на этом.

Vim становится продолжением человеческого мозга.

Использовать компьютер и не пользоваться vim, это как ездить на машине без машины.

Пользуетесь VIM? Я - нет.

#юмор
​​Очередная тема выходного дня. На этот раз — дети. Я долго не решался об этом писать, потому что тема личная, очень субъективная. Неделю собирал и структурировал мысли на этот счёт. Надо всё уместить в 4000 символов.

Начну с того, что меня реально беспокоит и печалит. Много взрослых людей сейчас без детей. Вижу их среди моих одноклассников, одногруппников, коллег. Людям уже 30-35+, а у них нет детей. Мне немного жаль их, даже если это осознанный выбор. Они пропускают мимо себя одну из самых ярких граней жизни.

Дети в первую очередь — безграничное, безусловное счастье и радость. Как бы трудно тебе ни было в моральном и финансовом плане. Природа награждает тебя за то, что ты действуешь в русле её замысла, чувством радости, удовлетворения, счастья. После рождения детей становятся понятны строки из песни Я Люблю Тебя Жизнь:

И вершина любви -
Это чудо великое, дети!
Вновь мы с ними пройдем
Детство, юность, вокзалы, причалы,
Будут внуки, потом
Всё опять повторится сначала.

Песня великолепная, мировоззренчески ёмкая, как никакая другая. Люблю её в исполнении Погудина Олега. Рекомендую 👍

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

Дети — естественный и необходимый этап в формировании мужчины. Он принимает на себя долгосрочную ответственность за полностью зависимых от него людей. Это огромный труд и в первую очередь в осознании того, что результат семейной жизни и жизни детей это полностью твоя ответственность. И если что-то не получилось с супругой, с воспитанием детей, то это твоя вина. Сейчас на мужчин давят со всех сторон, делая подобную ответственность трудноподъёмной. Многие не выдерживают, обвиняя жену, государство, общество в том, что у них что-то не получилось. Нужно всё это понимать, работать над собой и действовать в соответствии с внешними условиями, даже если они враждебны к твоим мужским проявлениям.

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

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

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

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

#мысли
На неделе посмотрел несколько интересных роликов на youtube. Каждый по отдельности не тянет на публикацию, поэтому решил их объединить в единый пост.

Денис Астахов, автор канала ADV-IT рассказал о том, где и как он рисует диаграммы. Всегда интересно посмотреть опыт специалиста по горячей теме. Впервые увидел использование Lucidchart.
▶️ АРХИТЕКТУРНЫЕ ДИАГРАММЫ - ГДЕ и КАК СОЗДАВАТЬ

Интересное, красивое, содержательное видео про разработку Envoy. Оно на английском, но с вшитыми в видео субтитрами, так что смотрится легко. Я такие ролики смотрю в том числе, чтобы немного держать уровень английского. Не имея разговорной практики, я вполне сносно на слух перевожу с английского. И это только благодаря роликам с субтитрами.
▶️ Inside Envoy: The Proxy for the Future [OFFICIAL FILM]

Видео с вопросами админу. В основном со всем согласен, кроме некоторых частностей. Просто приятно было послушать коллегу по цеху.
▶️ 10 вопросов Linux-администратору

Герои видео поделились тем, как они пришли в профессию, как преодолевали трудности, как веселились и росли профессионалами. И рассказали, как стать крутым спецом в системном администрировании. Гости приятные, с грамотной речью. Интересно было послушать.
▶️ День системного администратора 2021

Если кому-то есть чем поделиться по теме IT видео, буду рад. Я люблю что-то слушать, смотреть, когда куда-то иду, еду, занимаюсь.

#видео
​​🎓 По компьютерным сетям есть отличный курс "Компьютерные сети", Климанов М.М. от МФТИ (Московский физико-технический институт):
https://www.youtube.com/playlist?list=PLthfp5exSWErPFK_-EAhVtxO3XoY0gsSe
Я уже упоминал про него ранее.

Есть не хуже, а может даже и лучше, если судить про просмотрам и активности в комментариях, курс "Компьютерные сети, учебный курс.", Созыкин Андрей:
https://www.youtube.com/playlist?list=PLtPJ9lKvJ4oiNMvYbOzCmWy6cRzYAh9B1

Там даётся база, азы сетей, поэтому заявлено, что он для программистов, так как сисадмины, по идее, и так должны всё это знать. Если не знаете, то этот курс вам отлично подойдёт. Для самообразования это будет базой для тех, кто не знаком с сетями. Сделан на основе классиков Таненбаум и Олиферы. Записан более 7-ми лет назад, но нисколько не потерял актуальность, так там база, практически неизменная с 80-х годов.

#обучение
У меня часто спрашивают, как начать свой путь в системном администрирование, или в IT в целом. Причём спрашивают очень разные люди. Это могут быть родственники или родители, чьи дети готовятся куда-то поступать после школы. Просят советы взрослые люди и начинающие специалисты. Если есть время, могу просто пообщаться и что-то рассказать. Были и платные консультации, когда мне сразу предлагали заплатить за содержательную беседу.

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

Условно я делю всех вопрошающих на 3 категории:
1️⃣ Старшеклассники.
2️⃣ Молодые специалисты после универа.
3️⃣ Люди 30-35+, пытающиеся войти в IT из другой специальности.

🟢 Несколько лет назад я написал статью для подростков: Куда поступить, чтобы выучиться на программиста или сисадмина. Я советовал сразу вкатываться в IT со школьной скамьи и идти в универ на заочку просто для корочки. Не уверен, что дал там подходящие советы, но на тот момент думал именно так. Более того, подтверждение своих советов позже увидел лично в одном знакомом школьнике, который после окончания 11-го класса уже фактически имел профессию программиста и мог зарабатывать наравне со своими родителями. И он не хотел идти в ВУЗ, чем очень расстраивал своего отца, который просил моего совета, как быть. Я успокоил и сказать, что у вас всё круто. Мало кому так повезло найти себя уже в школе. Так что со школьниками вопрос открыт. Сейчас есть крутые университеты, типа Иннополиса. Я бы хотел там отучиться, или отправить учиться детей, если захотят.

🟡 Для начинающих специалистов у меня обычно другой совет. Денег там чаще всего ещё нет, так что рекомендую устроиться хоть куда за любые деньги, лишь бы была практика. Браться за любую работу, пробовать. По ходу дела вникать в отрасль и решать, что тебе в ней больше нравится. Параллельно изучать бесплатные курсы, материалы, статьи, в общем, всё что есть по понравившейся теме. Семьи ещё нет, времени много. Например, можно бесплатно попасть в какой-то инкубатор или интенсив и ударно там потрудиться. Такие мероприятия обычно организуют крупные вендоры, типа Tinkoff или VK. Там же можно и предложение по работе получить. Тоже таких знаю.

🔴 Для третьей категории рекомендую ещё раз хорошо подумать и если решение твёрдое, то идти на какие-то курсы. Времени на самообразование обычно уже нет, да и голова после 30 начинает хуже соображать. Тут уже нет времени сидеть самому, вникать и тыкаться наугад. Надо, чтобы помогли. Да и деньги к этому времени уже хоть какие-то есть, так что можно себе позволить где-то отучиться. К тому же из-за возраста подход по-любому будет основательный и взвешенный. Есть мотивация, в том числе и финансовая. Больше посоветовать нечего. Если честно, я не знаю, как тут вырулить в итоге. Чем и как нужно впечатлить нанимателей, убедив их, что джун 35-ти лет хороший вариант для их вакансии, если там ещё 50 таких же, только 23-х летних после универа. Если у кого-то есть практические советы на этот счёт, то поделитесь своим мнением. Уверен, среди читателей есть люди, которые вкатились в IT после 30-ти.

Кстати, вот моя заметка про современные онлайн курсы.

Если у вас есть какие-то мысли, советы, примеры по данной теме, поделитесь. Мне хотелось бы лучше разобраться в этой теме, чтобы не надавать вредных советов, которые могут по итогу кому-нибудь навредить, особенно подросткам. К тому же время быстро летит. Ещё лет 5 и мне уже нужно будет что-то думать насчёт старшего сына.

#мысли #обучение
​​Наиболее популярным WAF (Web Application Firewall), как платным, так и бесплатным, является ModSecurity. Компания, которая его разрабатывала, поддерживала и обеспечивала платную техническую поддержку давно уже объявила дату End-of-Life (EOL) - 1 июля 2024 года. После этого код полностью переходит на поддержку open source сообщества. Вряд ли без регулярных денежных вливаний продукт продолжит развитие. А так как он основан на статических сигнатурах, без регулярного обновления быстро потеряет актуальность.

В связи с этим появился шанс у других сервисов получить дополнительную аудиторию. Одним из относительно новых проектов (ему примерно год) из этой сферы является open-appsec. Я его установил, настроил и протестировал в реальной работе. Выглядит он неплохо и результат выдал не хуже, чем в среднем показывают подобные программы. Чтобы разобраться и настроить, я потратил много времени, так что не смогу подробно описать. Но попробую рассказать саму суть и дать основные ссылки, чтобы при желании можно было повторить и попробовать.

В основе open-appsec лежит алгоритм машинного обучения. Используются 3 модели, в зависимости от подписки:

1️⃣ Basic model - бесплатная оффлайновая модель, которая лежит в github и используется по умолчанию.
2️⃣ Advanced model - тоже оффлайновая модель, может быть вручную скачана и установлена из личного кабинета сервиса. Регистрация там бесплатная.
3️⃣ Unsupervised model - работает и обновляется в режиме реального времени. Это платная функция.

Open-appsec существует в виде open-source версии с оффлайновой обученной моделью, которую можно скачать и установить из репозитория. Advanced модель можно использовать, если зарегистрироваться и вручную качать её обновления из личного кабинета, которые периодически выходят с уведомлением на email. Ну а третья модель это платная подписка. Она, соответственно, считается самой надёжной.

Сервис монетизируется по модели SaaS. Есть веб панель управления, через которую можно управлять системой. Там же в этой панели хранятся логи и вся аналитика. Если используете бесплатную версию, то всё управление локально через CLI и yaml конфиги. Логи тоже все хранятся у вас локально. В целом, довольно честно.

Я запускал и тестировал open source версию с basic model, потом подключил её к SaaS и уже там посмотрел отчёты. То есть эффективность работы бесплатной версии не сильно хуже платной, а платить предлагают за удобство управления.

Работает Open-appsec в виде модуля к Nginx. Установка простая. Выполняется автоматически. По сути, нужно просто скачать модуль, подключить его к Nginx, установить агент Open-appsec, который всем управляет. Также сервис интегрирован в Kubernetes и его NGINX Ingress Controller.

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

Отдельно отмечу, что у Open-appsec уже есть интеграция с CrowdSec. Что такое CrowdSec, я писал отдельно. Это современный аналог Fail2ban, только намного более развитый и функциональный.

Продукт довольно сложный. Но тут это скорее норма, чем исключение. Я не видел нигде, чтобы WAF легко настраивался. Чтобы комфортно работать с системой, обязательно придётся куда-то выгружать логи, так как они огромные. Работать с ними локально неудобно, а придётся, так как нужно будет анализировать работу и настраивать исключения. По умолчанию сервис будет работать в режиме обучения, изучения, фиксации атак (detect-learn). Потом его можно переключить в режим отражения (prevent-learn).

В целом, мне продукт понравился. Думаю, он получит активное развитие и распространение в будущем. На текущий момент бесплатный Community
Edition тариф в SaaS весьма функциональный. Эффективность, если верить тестам отсюда, на уровне Free тарифа CloudFlare.

Сайт / Исходники

#waf
​​Продолжу тему WAF, раз уж начал. Я ранее писал про Nemesida WAF. Это коммерческий продукт, у которого есть бесплатная версия. Причём вполне функциональная, можно пользоваться. Существенное отличие от платной версии - только сигнатурный анализ. При этом в платной присутствует AI (Искусственный Интеллект) и ML (Машинное обучение). Это бесплатную Nemesida отличает от бесплатной же Open-appsec, где ML есть в open source версии.

Заметку я хочу написать не об этом, а о бесплатном продукте той же Nemesida - WAF Bypass Tool. Это open source утилита для проверки эффективности работы WAF. Она прогоняет через сайт кучу различных запросов на тестирование всевозможных уязвимостей (Cross Site Scripting (XSS), Open Redirect (OR), Remote File Execution (RCE) и т.д.) и в конце сводит результаты в табличный вид. С её помощью можно быстро оценить качество работы того или иного продукта, а также различных режимов настроек.

Для базовой проверки достаточно указать только адрес сайта и запустить любым удобным способом инструмент. Либо скачать python скрипт:

# git clone https://github.com/nemesida-waf/waf_bypass.git /opt/waf-bypass/
# python3 -m pip install -r /opt/waf-bypass/requirements.txt
# python3 /opt/waf-bypass/main.py --host='example.com'

Либо запустить в контейнере из Docker Hub, тогда вообще ничего делать не надо:

# docker run nemesida/waf-bypass --host='example.com'

Ключами можно управлять настройками. Например, использовать прокси, ограничивать число потоков (имеет смысл сделать, так как утилита выполняет около 3000 тысяч запросов, можно получить бан за интенсивность), выводить результаты в json, управлять детализацией вывода, выбирать отдельные наборы тестов и т.д. Можно писать свои тесты, запускать их на постоянку и забирать результаты в мониторинг.

Утилита проверяет количество ложно-положительных (FP - False Positive) и ложно-отрицательных (FN - False Negative) срабатываний. Это один из наиболее значимых критериев работы WAF. Значение PASSED (OK) покажет количество заблокированных проверок.

#waf
​​Есть любопытный проект под названием WireHole. Это docker-compose файл, который скрещивает в единое целое WireGuard, Pi-hole и Unbound для быстрого и удобного развёртывания VPN инфраструктуры, где клиенты автоматически получают DNS сервер с фильтрацией рекламы на уровне запросов.

Особенно это удобно для смартфонов. Небольшой WG клиент, быстрая настройка с помощью QR кода и на выходе у вас статичный IP от арендованной VPS или домашнего сервера и фильтрация рекламы средствами DNS. Настройка занимает буквально 5 минут.

Всё бы хорошо, но в настоящее время данный проект стал жертвой типичной проблемы, когда используются контейнеры с тэгом latest. Изменился базовый контейнер linuxserver/wireguard, за ним следом сломался ngoduykhanh/wireguard-ui. Ну и теперь ничего не работает. Я и так, и сяк его ковырял, пытаясь исправить. Потратил кучу времени и всё впустую. Уже бы сам быстрее собрал всё это, но каждый раз казалось, что ещё вот-вот и всё получится.

В итоге нашёл форк этой репы - https://github.com/m-karakus/wirehole. Человек просто взял и форкнул более старую версию проекта WireHole, когда использовался веб интерфейс wg-easy, а не wireguard-ui. И теперь всё реально запускается в пару кликов.

Копируете себе репу:

# git clone https://github.com/m-karakus/wirehole.git

Редактируете .env. В переменную MASTER пишите свой внешний IP адрес, указываете пароль для веб панели Wireguard и веб интерфейса Pi-hole. Больше можно ничего не менять. Запускаем:

# docker compose up

Идём в веб интерфейс http://ip-address:51821/ и добавляем клиента. Сканируем на смартфоне QR код и добавляем новое vpn соединение. Подключаемся и выходим в интернет через IP адрес сервера.

Веб интерфейс Pi-hole доступен через внутреннюю сеть по адресу http://10.2.0.100/admin. Там можно что-то настроить, посмотреть статистику. Она ведётся в том числе и по всем DNS запросам. Можно быстро оценить, куда ходит смартфон. А он куда только не ходит.

Удобная штука. Я взял VPS, накатил туда этот композ. Создал 2 учётки - для ноута и смартфона. Проверил, всё работает. Ничего особенного тут нет. Можно и самому всё это настроить. Но потом надо время тратить на поддержку и т.д. Проще взять что-то более ли менее популярное. Думаю, что WireHole в ближайшее время поправят и можно будет пользоваться. Он довольно старый и популярный. Не думаю, что его бросят. К тому же видел уже и в issues обсуждение проблемы и готовые pull requests. Судя по всему, пока некому их проверить и принять в основную ветку.

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

Исходники

#wireguard
​​Вы знали, что curl умеет отправлять почту через внешние smtp серверы? Я в целом знаю, что curl умеет всё, что только можно придумать про передачу данных, но конкретно вопрос не прорабатывал, хотя вскользь уже упоминал об этом, но в рамках решения другой задачи, поэтому особо не погружался в тему. Поэтому для отправки почты из консоли всё время ставлю какую-то дополнительную утилиту, типа mailx. На самом деле это не обязательно. Сейчас покажу, как отправлять почту через curl, не светя пароль в консоли.

Сразу ссылка на документацию. Оправляем почту полностью через ключи curl:

# curl -v --url "smtp://mail.server.ru:25" --mail-from "root@server.ru" --mail-rcpt "user@gmail.com" --user 'root@server.ru:password123' --upload-file ~/mail.txt

Содержимое mail.txt примерно следующее:

From: "Vladimir" <root@server.ru>
To: "User" <user@gmail.com>
Subject: Mail from curl

Hello! How are you?

Причём с помощью curl очень удобно управлять адресом отправителя. В mail.txt его любой указать можно, а не тот, от которого идёт отправка. Впрочем, как и другие заголовки.

Не очень хорошая идея светить почтовый пароль в консоли. Можно его спрятать в .netrc файл. Для этого его надо создать в домашней директории пользователя ~/.netrc. Содержание такое:

machine mail.server.ru login root@server.ru password password123
machine mail.server02.ru login user@server02.ru password password12345

Каждый сервер на новой строке. Удобно, если используется отправка через несколько разных серверов. В соответствии с указанным smtp сервером берутся настройки учётной записи из файла .netrc. Команда на отправку с использованием .netrc будет такая:

# curl -v --url "smtp://mail.server.ru:25" --mail-from "root@server.ru" --mail-rcpt "user@gmail.com" --netrc --upload-file ~/mail.txt

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

Если используется шифрованное соединение и порт 465, то достаточно просто указать адрес сервера в виде smtps://mail.server.ru. Отдельно указывать порт и ключи для ssl не обязательно.

Для того, чтобы явно указать HELO / EHLO при отправке, добавьте его через слеш после адреса сервера. Примерно так:
smtp://mail.server.ru/client_helo.server.ru

#terminal #curl