Заметки по вчерашнему падению сервера.
Архив рубрики: Системное администрирование
Mediawiki, закрываемся от ботов
В последнее время на фоне ИИ-бума прямо нашествие ботов на всех сайтах. Robots.txt стал не особо актуален; отсеивание по User Agent’у — тоже. Паразитный трафик вырос в десятки, а то и сотни раз. Буквально вчера добавлял правила у fail2ban для находящегося на публике RSS Bridge — через него повадились сканировать самые разные ТГ-каналы.
Так что достаточно вовремя я сделал кэширование и отдачу статики на своих вики-проектах, однако на сейчас уже и этого мало. Боты залазят на такие URL, куда живой человек вряд ли догадался бы зайти. Например, за 18 лет JabberWorld’а я практически никогда не пользовался разделом «Информация о странице», сейчас же в логах — тонны запросов с «action=info«. В итоге — да, для «живых людей» отдача статики, конечно, помогает, страничка будет отдаваться моментально, однако из-за хождения ботов по «особым» страницам все равно будет постоянно дергаться PHP, база и все, что с этим связано. Лишние затраты оперативной памяти, которую можно было выделить на что-то более полезное.
Пришлось принимать меры: порезать доступ на ряд страниц для незалогиненных пользователей — в чем-то не особо значимо, а в чем-то пришлось ущемить в возможностях.
Multips в Munin
Решил тут сделать стату в Munin для каждого PHP-FPM-пула в отдельности, на глаза попался (ок, гуглоИИ подсказал) плагин multips. Плагин в итоге не подошел (толку мне с простого числа процессов, я хочу подробную стату, как в proc), но суть не в том. В процессе разбора того, как заставить эту хрень работать — дошел до основного кода за неизвестным авторством:
for name in $names; do
***
PGREP=$(command -v pgrep)
if [ -n "$PGREP" ] && [ -x "$PGREP" ]; then
"$PGREP" -f -l "$name" | grep "$REGEX" | wc -l
***
else
ps auxwww | grep "$REGEX" | grep -v grep | wc -l
fi
done
Т.е., если у нас в системе есть pgrep — значит, имя в конфиге должно строго соответствовать процессу, который ищешь. А если нет — ты волен называть сущность в конфиге как хочешь.
В итоге конфиг вида:
[multips]
env.names jw_wiki
env.jw_wiki php-fpm.*jabberworld.info
не работал прежде всего из-за наличия pgrep.
А всего-то надо было сделать что-то в стиле "$PGREP" -a -c -f -l "$REGEX"
Ollama 0.30+ и CUDA на Debian 13
Только что игрался с апдейтами ollama на своем ИИ-хосте — выяснилось, что свежие версии перестали использовать CUDA и работают только на CPU.
Если заглянуть в journalctl:
msg="NVIDIA driver too old" device="NVIDIA GeForce GTX 1080 Ti" compute=6.1 driver=550 required_driver="570 or newer"
И, собственно, да, в репозитории Debian stable есть только 550-й драйвер. В бэкпортах чего-то более нового не вижу. Так что или ставить драйвер вручную, или пока что сидеть на старой ollama. Последняя «рабочая» версия — 0.24. Поставить определенную версию можно так:
curl -fsSL https://ollama.com/install.sh | OLLAMA_VERSION=0.24.0 sh
Обновил вики JW. Кэширование статики
Прошлая попытка обновления Mediawiki-движков на JabberWorld.info и linuxoid.in закончилась без особого успеха. Сейчас снова вернулся к теме — и то ли в конфиге сервера что-то поменялось, то ли из-за обновления через консоль, но все же удалось успешно обновиться сначала до 1.39, а потом и до текущего (1.43) LTS. Чуть поменялся конфиг: потребовалось убрать инклуд DefaultSettings.php, а также старое определение минимальной длины пароля.
Debian, Xen и большой initrd
Заметка между делом.
Столкнулся с тем, что на домашних серверах (на данный момент один обновил до Debian 13) стало мало места в /boot/efi. initrd занимал 47 МБ, что как-то неприлично много, особенно с учетом MODULES=dep в /etc/initramfs-tools/initramfs.conf.
Оказалось, что у xen-tools свое мнение на этот счет в /etc/initramfs-tools/conf.d/xen-tools: «To make the Dom0’s initramfs working inside DomUs, too, most modules need to be included». В моем случае initrd из dom0 никак не использовался для domU, поэтому копировать все доступные модули в образ для dom0 было излишним.
Экспорт переписки пользователя из MAM в ejabberd
В MySQL / MariaDB:
SELECT timestamp, created_at, peer, txt FROM archive WHERE username = 'USER' and txt != '' INTO OUTFILE '/tmp/USER.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"';
Далее режем на отдельные файлы:
awk 'BEGIN {FS="\",\"";RS="\"\n"} {peer=$3; gsub(/\/.*|\+/, "", peer); gsub(/"/, "", $1); gsub(/\\\n/, "\n", $4); print $1, $2, $4 >> peer}' /tmp/USER.csv
Debian 13, Ollama + OpenwebUI и Fluux Agent: заводим персональный AI в Jabber
Первый раз щупаю эту тему.
В целом, не так давно на слуху появился jabber-клиент Fluux Messenger — примечателен тем, что от Process One, разработчиков одного из самых популярных jabber-серверов. Как минимум, находится среди их репозиториев.
А еще там появился Fluux Agent. Роадмап многообещающий: на сейчас он уже может выступать интерфейсом к Ollama или работать с «облачными» сервисами; может работать 1 на 1 или через конференцию; выступать в качестве бота или компонента сервера. А в будущем планируется возможность сделать общение между такими ботами — федеративную AI-сеть.
Идеей заинтересовался; возможностью попробовать запустить локального AI-агента и посмотреть, на что оно вообще годно — тоже. Подсобрал по разным уголкам дома железо и решил развернуть все на нем. В ход пошла старая основа от NAS’а — Athlon 740 и 32 ГБ оперативки с той же материнкой, на которой все было установлено. А в качестве GPU-основы для вычислений — пара видеокарт от майнинг-ригов. Самыми мощными у меня в хозяйстве были Nvidia 1080TI с 11 ГБ памяти, пару из них и задействовал.
Читать далее Debian 13, Ollama + OpenwebUI и Fluux Agent: заводим персональный AI в Jabber
Nextcloud и отправка почты
Наконец-то спустя долгое время наткнулся на решение проблемы отправки почты через простенький локальный почтовик. Что-то «сломали» или переделали несколько версий назад, с тех пор попытка отправки тестового письма в веб-интерфейсе выдавала ошибку. Полез в логи — при настройке None/StartTLS NC таки ломится на почтовик со StartTLS, после чего обламывается.
Закидываем в config/config.php такое:
'mail_smtpstreamoptions' =>
array (
'ssl' =>
array (
'allow_self_signed' => true,
'verify_peer' => false,
'verify_peer_name' => false,
),
),
Update 2026-06-11: нашел альтернативу. В config/config.php меняем такие опции:
'mail_smtpmode' => 'sendmail',
'mail_sendmailmode' => 'pipe',
В таком случае оно хотя бы начинает использовать отправку через консольную утилиту без оглядки на сертификаты — но нет, не через то, что указано в sendmail_path в PHP, а старательно выискивает бинарник sendmail на диске и если не находит — использует захардкоженный путь.
ejabberd и инвайты
Тема Easy Onboarding вполне активно развивается и в последних версиях ejabberd (26.01/26.02) появилось создание учетных записей по приглашениям: добавлен mod_invites, а в штатной поставке сделана landing-страница, с помощью которой новички могут выбрать себе клиент и перейти к регистрации.
Общий смысл в том, что более опытный — имеющий учетную запись — пользователь берет на себя придумывание Jabber ID и разрешает регистрироваться другу на том сервере, которым пользуется сам. Пароль обычно в опробованных клиентах генерируется. Т.е., вся регистрация у новичка сводится к паре кликов «далее».
У себя поделал красивости в стиле субдоменов «Join ${DOMAIN}» (например, https://join.jabber.name), куда идут ссылки приглашений — а также туда смотрит и штатная веб-форма регистрации, которую на сейчас не использую.
Пока остается один нерешенный момент: у меня в mod_register использовался параметр redirect_url, чтобы любая попытка регистрации из клиента вела на веб-форму. С инвайтами вылез косяк — редирект блокирует завершение регистрации. Тикет уже заведен — надеюсь, в следующей версии ejabberd поправят.
