Новости: Linux, Python, SSL and broken bots
08.02.2018


Сообщение о неработоспособности ботов

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


Ох уж эти Линуксы...

линуксобляди идут нахуй лол

Начну немного издалека: с операционных систем. Я не люблю Linux. Не знаю, видимо, у меня недостаточно квалификации для того, чтобы быть его пользователем. Сколько раз я не пытался «перекатываться» на один из его дистрибутивов — всё заканчивалось очередным факапом, когда что-то ломалось и системой становилось всё труднее и труднее пользоваться. Хотешь установить очередной пакет? Нет места. Хочешь очистить мусор от удалённых пакетов и кэш пакетного менеджера? Окей, но при каждой загрузке теперь будет вылезать пяток сообщений об ошибках. Именно это случилось во время моей первой попытки переехать на Ubuntu. Позже я услышал ещё много подобных историй от пользователей этого дистрибутива и тех, кто их знает. Например про отваливающееся переключение языков при обновлении.

Ну да ладно. Не одной «Бубунтой» славится Линукс. Хотя это был самое первое и запоминающееся знакомство с семейством операционных систем UNIX, когда я ещё даже не пытался делать чего-то выходящего за рамки обычного использования. Прочитав где-то, что предшественник Убунты — дистрибутив Debian — славится своей стабильностью и консервативностью, после некоторого перерыва я перешёл на него. А именно на восьмую версию, которая была на тот момент последней.

Сначала ты оказываешься немного в шоке. Ведь теперь тебе надо самому ручками изменять конфигурационные файлы пакетного менеджера, чтобы получить в своё распоряжение различный проприетарный софт (например те же драйвера). А ещё sudo не настроен по умолчанию. Для компьютеров с 64-битным процессором надо дополнительно выполнить специальную команду, чтобы разрешить установку пакетов, скомпилированных под 32-битные системы. В общем ужас. Но на самом деле не всё так плохо! Спустя какое-то время (ну пару дней может быть) ты осваиваешься, настраиваешь всё и системой даже можно вполне безболезненно пользоваться.

Но! Разумеется, не может не быть этого мерзопакастного но. Главной проблемой Дебиана является его же преимущество — стабильность через консервативность. По сути какие-то серьёзные мажорные изменения происходят между релизами. Их хорошо тестируют (особенно на пользователях Убунты, которая со своими жёсткими циклами выпуска релизов не брезгует таскать пакеты из нестабильных веток Дебиана) и проверяют на совместимость друг с другом. Но между релизами, которые выходят где-то раз в два года, программы безбожно устаревают. Нет, к ним выходят какие-то минорные обновления, но, например, в Debian 8 есть только Python 3.4, а за более свежими версиями добро пожаловать в репозитории Debian 9 или собирайте из исходников и ставьте вручную. И тут повествование можно разделить на три ветки.

Во-первых, надо заметить, что минорные релизы тоже довольно жёстко тестируются в сообществе, что замедляет их попадание в официальные репозитории. И не для всех типов программ такое подходит. Да, для каких-нибудь простых линуксовых утилит, в которых уже всё есть и мало что меняется, это нормально. Но для современного софта, находящегося в стадии активной разработки (привет, Agile) — это совершенно неприемлемый вариант. И в итоге мы приходим либо к необходимости ручного скачивания deb-пакетов (в лучшем случае) или каких-нибудь более экзотических форматов файлов (самый мудрёный вариант установки, пожалуй, я видел у Oracle'овского JDK, когда нужно скачать архив, установить из стандартного репозитория какой-то конвертер форматов, потом преобразовать архив в deb-пакет, установить через dpkg и обновить альтернативы), либо к добавлению кучи дополнительных репозиториев в источники пакетного менеджера, либо вообще к распространению ПО в виде архива, который нужно куда-то распаковывать (что жутко неудобно, когда привыкаешь к тому, что это за тебя делает менеджер пакетов и установочные скрипты). Во втором случае, кстати, у Бубунты есть определённое преимущество в виде собственного формата широко распространённых PPA-репозиториев. Для Debian'а порой куда труднее найти подходящие репозитории.

Кстати, именно для решения вышеописанных проблем, офигев при знакомстве с миром Debian'а, я и начал составлять KozConfigurator.

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

В-третьих, это сборка из исходников. Очень больная для меня тема. Прям как «сишники», которые придумали этот ужасный мир и гордятся им. Эта бездушная экосистема без нормальных систем сборки и менеджеров зависимостей, когда отсутствующие библиотеки приходится угадывать с помощью каких-то секретных утилит, о которых знают только они. Ну или гуглить. Если повезёт, то похожие проблемы у кого-то уже возникали на той же системе, а кто-то из сишников снизошёл до простых смертных и подсказал, как всё разрулить. В противном случае придётся становиться одним из них: разбираться в основах Си, учиться пользоваться всеми этими GNUшными утилитами (компилятором, линковщиком, системой сборки и т. п.), познавать дзен makefile'ов... Либо только бог сможет помочь...

На самом деле, конечно, можно ещё задать вопрос самому и, возможно, даже получить на него ответ, но с этим у меня тоже был довольно отрицательный опыт. Сразу подчеркну, что выборка очень нерепрезентативна: я задавал буквально несколько вопросов и преимущественно на Ответах@Mail.Ru — так что мнение является абсолютно субъективным. Как бы то ни было, но ответ на поставленный вопрос я получал ещё реже. Надо понимать, что к такому крайнему средству, как задание вопроса на форуме (условно отнесём к ним и «Ответы»), я прибегал в исключительных случаях, когда прочесал уже все сайты на первых страницах основных поисковых систем, опросил всех знакомых и всё равно ничего не нашёл. И такое уж у меня сложилось впечатление, что если ты чего-то не можешь найти, то никто тебе больше не поможет. Хотя, возможно, это исключительно проблема данного сервиса «для домохозяек», где было глупо искать людей подходящей квалификации. Возможно, на том же StackOverflow всё совсем по-другому. Но пока другие случаи лишь подтверждают это наблюдение.

Ох, что-то эта часть слишком затянулась. Можно бесконечно изливать тонны говна и ненависти, вспоминая каждую проблему, с которой приходилось сталкиваться, пользуясь тем или иным дистрибутивом Linux, но пост не об этом. Я просто хочу подчеркнуть, что Линукс — это ни разу не нормальная система для людей. Даже в якобы дружелюбных дистрибутивах рано или поздно абстракция протечёт, утопив несчастного начинающего линуксоида (rest in peace, buddy). Я даже больше не хочу пытаться туда серьёзно соваться, пока не прочитаю пару книжек по устройству ядра и программированию на Си, документацию на CMake и маны ко всем основным утилитам. И тогда уж точно настрою себе труъ-хакерскую систему с самособранным ядром, тайловым оконным менеджером, кастомизированным Vim'ом и т. п.!

Что уж тут говорить, даже настоящие программисты из подкастов пользуются Макбуками и сидят на macOS, потому что им надоедает бороться с системой и просто хочется иметь работающий UNIX, на котором можно писать код и зарабатывать деньги, а не заниматься вечной настройкой и починкой!

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

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


Сервера и места их обитания

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

В последнем обновлении к боту @kozalo_bot (в частности, в этом коммите) я добавил новую административную функцию: удаление сообщений пользователя, попадающих под заданный администраторами сообщества шаблон. И всё бы ничего, но она оказалось плохо оттестированой (<сарказм>ведь автоматические тесты для лохов</сарказм>) и при включении упала на продакшене. И именно это случилось позавчера.

На самом деле точно определить проблему я так и не смог. Просто вместо множества фильтров для чатика DC там оказался какой-то мусор. Это я выяснил в процессе отладки на продакшене (best practices, ёпт), а потом, временно загрузив нужный хендлер (функция, ассоциированная с командой или какой-то фразой), тупо удалил данные для чата из словаря. И после этого всё заработало! До следующего бага, пофикшенного этим коммитом.

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

Первой проблемой стал отвалившийся FTP. Вот хочешь ты загрузить тестовый код на сервак, а он говорит, что фиг тебе. Ладно, было уже подобное после обновления пакетов. Подключаешься по SSH к VPSке, смотришь список запущенных процессов в top'е и не обнаруживаешь знакомый vsftpd (на самом деле я каждый раз забываю, как он называется, так что сначала просто ищу что-нибудь с «ftp», а потом иду в Google и ищу настоящее название демона). Ну окей. По привычной схеме набираешь:

sudo systemctl start vsftpd

...и получаешь неожиданное сообщение:

sudo: systemctl: command not found

И тут мне стало страшно. Что произошло с VPSкой? Куда девался systemd? Её же никто не трогал! Попробовал вызвать journalctl — тоже мимо. Дрожащими руками набираешь:

ls /bin

и с ужасом не видишь ни одного бинарника от systemd. Неужели взломали? last показывает только мои же сегодняшние входы. Ладно. Хрен знает, что произошло, но надо как-то фиксить.

sudo aptitude install systemd

Упс! 404.

sudo aptitude update && sudo aptitude install systemd

С замиранием сердца пробуем стартовать демон FTP снова... успешно! Ура!


Фейл за фейлом

Но тут мои приключения не закончились, потому что далее я совершил роковую ошибку:

sudo aptitude safe-upgrade

Зря я это сделал, ох зря. Именно после этого действия перезапуск ботов упал с ошибкой.

Отрывок лога с ошибкой

Зависимости сломались и мне нужно было как-то установить недостающую версию библиотеки. Попытка просто установить из репозитория завершилась неудачей: ну нет там уже такой версии. Гуглишь. Советуют подключить к источникам apt'а репозитории Debian 8 и установить из них. Пытаешься быстренько найти их адреса — безуспешно. Ладно, запускаем виртуалку с Debian'ом и подглядываем там. Поскольку буфер обмена между виртуалкой на локальном ПК и Vim'ом на удалённой VPSке отказывается работать (я знаю про "+p и "*p — не работают), то набираю вручную:

deb http://ftp.debian.org/debian jessie-backports main contrib non-free
deb http://ftp.debian.org/debian/ jessie main contrib non-free
deb http://ftp.debian.org/debian/ jessie-updates main contrib non-free
deb http://security.debian.org/ jessie/updates main contrib non-free

Но и это не помогло по двум причинам:

  1. Я поленился набрать последнюю строчку. А нужный мне пакет, как выяснилось потом, располагается именно в ветке security.
  2. Даже если бы я не ступил с предыдущим пунктом, ничего бы всё равно не нашлось, потому что искать надо всё-таки в репозиториях Debian 9.

И теперь мы наконец-то выходим на финишную прямую, ведущую нас к тому, как же всё-таки всё разрешилось. А это было очень просто. Я всего лишь загуглил пакет и нашёл его на сайте Debian. Всё. Тут уже видно, что он находится в ветке security девятой версии (stretch) дистрибутива.

Найденный пакет на сайте Debian

Теперь набираем:

uname -m    # (или uname -p)

Убедившись, что VPSка выполняется на 64-битном процессоре, качаем прямо с сайта deb-пакет для amd64 и «заливаем» его по FTP на сервер.

Нужная версия пакета

Устанавливаем через dpkg, запускаем интерпретатор, пытаемся импортировать модуль ssl... ура! Всё работает! Можно запускать ботов через supervisor.


Послесловие

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

Линукс-системы постоянно бросают тебе вызов. И если ты хороший инженер, то такие вызовы тебе только нравятся, манят. Ты возвращаешься к ним снова и снова, чтобы в очередной раз проверить себя, удостовериться в силе зверя и вновь уйти побеждённым, но только чтобы вернуться позже с новым знанием и новыми силами.

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