Путь айтишника
129 subscribers
865 photos
1 file
482 links
Путь становления айтишника глазами практикующего специалиста. Личный опыт, полезные инструменты, разбор технологий, план развития и взгляд на индустрию изнутри.
Download Telegram
Досмотрел курс по FreeBSD и в конце научился собирать приложение из исходников. Пообщался с коллегой: хотя исходники есть и они находятся в реестре FreeBSD, чтобы собрать что-то крупнее тетриса, придется постараться. Поэтому буду ставить из бинарников.

Поигрался с Jail во FreeBSD при помощи CBSD (https://www.bsdstore.ru/en/about.html). Jail — это виртуальные машины на базе ядра FreeBSD. Создал виртуальную машину, поменял параметры, удалил её. Интересный опыт, особенно учитывая, что по умолчанию для неё почти всё запрещено. Приходилось открывать дополнительные опции, чтобы виртуальная машина заработала.

Почти всю неделю разбирался с проблемой, почему не проходят звонки из мобильного приложения. Все скрипты, участвующие в этом процессе, я подробно логировал, однако они попросту не выполнялись. Выяснилось, что я проверял работу скриптов от имени пользователя root, тогда как само приложение запускается другим пользователем, которому не хватает прав. После исправления коллеги всё заработало. Составил четырёхстраничный мануал, объясняющий процесс звонка из мобильного приложения. Если бы у меня был такой документ заранее, сэкономил бы 3–5 рабочих дней.

Начали проходить курс по Zabbix (https://www.zabbix.com/ru). Zabbix — это свободно распространяемое ПО для мониторинга серверов, сетевого оборудования и приложений в режиме реального времени. Оно оказалось значительно проще Asterisk.

В книге «7 языков за 7 недель» прочёл главу про Io (https://iolanguage.org/). Это компактный язык программирования, построенный на принципах прототипного наследования и позволяющий изменять собственный синтаксис. Хотя сам язык любопытный, углубляться в изучение не стал, поскольку прототипное наследование хорошо освоил на примере JavaScript.

Следующим изучаемым языком стал Prolog (https://www.swi-prolog.org/). Очень интересный язык логического программирования. Он декларативный как SQL. Работа с языком программирования Prolog включает два ключевых шага. Во-первых, формируется база знаний — набор логических правил и фактов, характеризующих изучаемую область. Далее эта база обрабатывается, и начинается этап постановки вопросов относительно интересующей темы. Запросы бывают разных форматов: одни представляют собой утверждения, на которые система даёт однозначные ответы («yes») либо отрицательные («no»). Вторые содержат переменные, и задача Prolog заключается в поиске значений, позволяющих подтвердить истинность задаваемых условий. Задачи ханойские башни или 8 ферзей на доске решаются очень просто, описывая правила игры и запросом на поиск решения. Однако, исходя из личного опыта, далеко не каждая проблема сводится к формализованной логике. Тем не менее, как инструмент, Prolog показался мне привлекательным.

Завершил годовой курс английского языка на уровне B1+, сдав итоговый экзамен на 82 балла из 100. Решил пока приостановить занятия английским, так как впереди много материалов по системному администрированию и DevOps.

В результате, за прошедшую неделю успешно разобрался с основными аспектами сборки приложений во FreeBSD, освоил виртуализации типа jail, решил критичную проблему авторизации в мобильной платформе и начал знакомиться с инструментами мониторинга, такими как Zabbix. Дополнительно ознакомился с особенностями языков Io и Prolog, расширив кругозор в языках программирования. Завершив курс английского на уровне B1+, планирую сосредоточиться на изучении системного администрирования и DevOps-технологий.
На работе получил первую настоящую DevOps-задачу. Напомню, DevOps — это сисадмин, который умеет программировать.

Наша основная система переезжает с одного сервера на другой, поэтому решили разгрести непонятный мусор. Необходимо было сконвертировать задания для cron в bash-файлах в ini-файлы для docker-планировщика Ofelia https://github.com/mcuadros/ofelia. Всё хорошо, но запланированных заданий сотни в каждом файле, и файлов около десятка. Коллеги где-то неделю побились и плюнули, перевели задачу на меня. Задача осложняется ещё тем, что они что-то уже добавили, а что-то нет. Вот и надо синхронизировать и слить воедино две системы.

Я решил использовать инженерный подход. Всё, что мне устно объяснил главный сисадмин, я перевёл в ТЗ. Т. к. есть пословица «без ТЗ результат ХЗ». Поработал заодно бизнес-аналитиком. Оказалось, если всё расписать, что было рассказано за 15 минут, ТЗ получилось на 4 страницы текста.

Проект стал реализовывать на Typescript. Для парсинга bash-файлов использовал библиотеку web-tree-sitter и tree-sitter-bash. Она из bash-файла создаёт AST (абстрактное синтаксическое дерево). Я учил алгоритмы и думал, ну когда же мне пригодятся деревья в производстве. Вот и пригодилось, после парсинга получилось сильно ветвящееся дерево. Обошёл его в глубину, выделил в нём функции, команды, комментарии и сохранил в хеш-таблицу. В программе одна рекурсия погоняет другой.

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

Пока я сделал только парсинг bash-файлов, те, кто их создавал, оказались с большой фантазией. То имена функций с ошибками напишут. Или напишут большую функцию, которая нигде не вызывается. Комментарии то на русском, то на английском. И на каждую их «фантазию» приходилось писать обработчик и тестировать.

Вишенкой на торте задача из ТЗ: все задания, связанные с RabbitMQ, вынести в отдельный конфиг-файл. А они равномерно «размазаны» по всем конфигам. На следующей неделе продолжу. Лунная призма, дай мне силы завершить этот проект.

Дома у меня в очередной раз «умер» Youtube. Я использую Amnezia в связке с nfqws. Первая создаёт шифрованный канал, вторая «делает» из IP-пакетов «винегрет». Я использовал хостинг Linode с оплатой криптой. Всё хорошо, только дорого, и оплата криптой занимает ну минимум полчаса. Пока деньги сконвертируешь, пока крипта дойдёт, уходит уйма времени.

Я решил купить русский хостинг у компании Aeza. Но компания Aeza на этой неделе попала под санкции, т. к. американцы уверенны, что именно там живут все русские хакеры. Вместе с русскими хакерами и мой VPS был утерян. По деньгам где-то 600 руб., но всё равно неприятно. Затем поднял VPS у Beget. У него мой хостинг живёт уже несколько лет. Купил сервер в Латвии, подключил, настроил. Youtube ожил и показывает рекламу для Великобритании.

В итоге задача получилась не просто DevOps, а полноценный инженерный квест: с анализом, парсингом AST и кучей граничных случаев. Почувствовал себя и программистом, и аналитиком, и даже детективом. Одновременно воевал с чужим кодом и санкциями. Но несмотря ни на что, Youtube снова работает, а проект движется — медленно, но с пониманием, что всё не зря.
👍5
В пятницу завершил создание программы, которая конвертирует задания из bash-файлов в ini-файлы для Ofelia. Задача оказалась на рекурсию и регулярки. Мало bash-файл через рекурсию спарсить, его ещё нужно корректно обработать. Ребята, которые эти файлы, оказались людьми творческими. Мы можем и так, и вот так. Всё хорошо, но программу на каждом их «выверте» клинит, и приходилось писать обработчик. 

Простой пример, есть команда «timeout». Она задаёт максимальное время выполнения программы. И у ней есть параметры, так вот эти параметры можно задавать через пробел, через группу пробелов, через табуляцию. Я сначала наивно разбивал строку через split(" "), а потом смотрю, что у меня уйма непонятных значений, стал разбивать строку через регулярку split(/\s+/). Больше всего добила большая и сложная функция, которая нигде не вызывается, она просто описана. Раньше я думал, что поля формы сложно валидировать, как я ошибался. Или имя задания, состоящее из цифр. Например, задача под именем «1».
Но программа написана, она обрабатывает около 600 заданий. Вручную их перелопать сильно трудоёмко, вот почему коллеги решили всё это автоматизировать.

Самое интересное произошло при деплое скрипта. Я его установил на боевой сервер и перед установкой NodeJS решил обновить систему. Обновился docker и сразу умер. Т. к. версия 28 что-то делает не то в firewall. Коллега показал, как откатиться на 27-ю версию и «заморозить» версию docker. На основе вот этой статьи https://docs.docker.com/engine/install/debian/. Основные команды следующие.
apt-mark hold docker-buildx-plugin docker-ce-cli docker-ce-rootless-extras docker-ce docker-compose-plugin containerd.io

apt-mark showhold

Почему этот функционал нельзя реализовать в apt мне непонятно.
Прошло 3 месяца испытательного срока на этой работе. У меня был начальник, который любил сообщать об увольнении именно в последний день срока. Здесь такого нет. Чисто субъективно коллектив адекватный, хотя во многих бизнес-процессах я ещё не разобрался до конца. Но зарплата не радует.

Начал проходить курс «Ansible для начинающих + практический опыт» https://stepik.org/course/123806/syllabus?search=7292598390. Попробую автоматизировать простые задачи с серверами.

От себя скажу написание конвертора: это был отличный вызов, который показал, насколько важно учитывать все крайние случаи и нестандарты. Работа с такими скриптами — как археология: никогда не знаешь, что откопаешь. Но теперь процесс автоматизирован, ошибок меньше, а времени на ручную проверку — больше не тратим. Теперь есть надёжный инструмент, который обрабатывает сотни заданий, а я могу сосредоточиться на улучшении процессов и прокачке в DevOps через Ansible.
На работе получил задачу: нужно, чтобы через голосовое меню создавался лид в Bitrix24. В качестве CRM у нас используется Bitrix24, и лид — это новый контакт. Когда в голосовом меню нажимается нужная кнопка на телефоне, должен вызываться скрипт, создающий лида.

Почитал документацию по API: [https://apidocs.bitrix24.ru/index.html](https://apidocs.bitrix24.ru/index.html). Оказалось, что в моём случае удобнее всего делать API-запросы через вебхук. Но перед тем как создать лида, нужно проверить номер телефона — возможно, клиент уже звонил. Если звонил, добавить этот контакт к лиду. По сути, требуется выполнить два запроса. Я наивно предполагал, что уложусь в 4 часа, максимум — в день.

Приложение b24-send я решил написать на TypeScript. Делать такие запросы через bash и потом парсить JSON — занятие для мазохистов. Но на Asterisk не был установлен NodeJS.

Поэтому я установил Node 20 из исходников на FreeBSD 13. Честно говоря, очень не хотелось. Пробовал ставить и бинарниками, и собирать из портов — бесполезно. Ошибки становились всё фееричнее. В итоге помогло следующее.

Установил nvm:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
source .bashrc


Система пожаловалась на отсутствие компиляторов.

Установил компиляторы:

pkg install gcc gmake binutils


Но nvm их всё равно не увидел.

Экспортировал переменные:

export CC=gcc13
export CXX=g++13


Запустил установку: nvm install 20. Началась сборка — ждал около часа. Причём нагрузка на 12-ядерный процессор была немаленькая. Но в итоге всё собралось:

node -v
v20.19.3


На Linux эта операция занимает пару минут. FreeBSD умеет превращать простые задачи в сложные, а сложные — в ад.

Решил попробовать разные клиенты для POST-запросов. Протестировал axios, got, но победил стандартный fetch. Он не такой удобный, зато стабильно работает во FreeBSD.

Так как это CLI-приложение, для парсинга аргументов командной строки использовал библиотеку Commander.js: [https://www.npmjs.com/package/commander](https://www.npmjs.com/package/commander). Работа с ней понравилась — обязательные параметры, help, номер версии — всё настроилось легко. На редкость удобная библиотека.

В пятницу наконец всё закончил. Залил на Asterisk, протестировал. А голосовое меню не работает. Оказалось, что под root всё запускается, а под пользователем asterisk — нет.

Запустил:

sudo -u asterisk ./b24-send.sh


Выяснилось, что скрипт не видит NodeJS. Сделал симлинк на бинарник node. В итоге — скрипт написал, но столкнулся с кучей подводных камней, о которых даже не подозревал.

Заодно узнал интересную команду. Команда "дятел" — :> — используется для очистки файла.
Например:

:> ./1.txt


полностью очищает содержимое файла 1.txt.

В общем, задача оказалась не такой уж простой. Казалось бы — создать лида через вебхук, что может пойти не так? А в итоге: сборка NodeJS из исходников, возня с правами, пляски с API и отладка скрипта на Asterisk. Но в этом, пожалуй, и кайф — каждая такая история прокачивает, а знание, добытое с боем, остаётся надолго.
👍5
На работе отпала NFS-шара. Она просто переехала на другой сервер с Debian 12.
Пробую подключаться через FreeBSD 13. Вот такая запись в /etc/fstab:
192.168.7.100:/var/lib/engineer_notification  /mnt/nfs  nfs  rw  0  0
mount -a

А не подключается, пишет Permission denied. Я уже голову сломал, в чём может быть проблема.

Оказалось, на NFS-сервере в файле /etc/exports:
/var/lib/engineer_notification 192.168.7.110(rw,sync,no_subtree_check,no_root_squash)


Оказалось, надо было установить флаг no_root_squash, чтобы root на FreeBSD смог остаться root на Debian. Но флаг достаточно опасный, поэтому подключение к этой шаре я ограничил только одним сервером 192.168.7.110. Ошибка ну сильно неочевидная. 

Мой скрипт для создания лидов из голосового меню не понравился. Теперь буду писать чат-бота для Bitrix24. Теперь, если в бухгалтерию звонит клиент, чат-бот в чат будет писать сообщение, что был звонок, и кто-то из бухгалтеров ответит.
Нашёл хорошее видео «Разработка чат-ботов для Битрикс24» https://www.youtube.com/watch?v=GKmZIFvV5EQ, возьму за основу его. Как я понял, B24 хочет скопировать функционал ботов Telegram, но пока далеко.
Посмотрел ещё одно видео «Как сделать масштабируемое тиражное приложение с роботами за 1 час» https://vkvideo.ru/video-211967493_456240208, и я понял, мне бэкенд ещё учить и учить. Столько нюансов и деталей при разработке простого, но высоконагруженного приложения, что видео буду пересматривать ещё раз.

Коллеги всю неделю «перевозили» приложение со старого сервера на новый. В том числе использовали файлы, сгенерированные моей программой OfeliaMerge. Как я понял, приложение жило на старом сервере где-то лет пять. И скрипты для cron кто только не писал. Сейчас решили контейнизировать и удалить ненужное. Там цирк с конями, много задач не нужно в принципе, часть задач повторяется по несколько раз, хотя и не должны, часть функционала в системе уже отсутствует. Но перенесли.

Вывод такой: даже самые простые вещи — как монтирование NFS или автоматизация задач — могут внезапно превратиться в квест на логику, внимательность и опыт. Всё меняется: и IP-адреса, и подходы, и инфраструктура, но одно остаётся неизменным — чем глубже копаешь, тем больше начинаешь понимать, сколько ещё надо учиться. Особенно, если хочешь делать по уму.
👍1
Прочитал книгу Брюса Э. Тейта «Семь языков за семь недель». Автор разбирает по одному языку программирования каждую неделю. 
Языки следующие: Ruby, Io, Prolog, Scala, Erlang, Clojure, Haskell.

Выбор языков какой-то странный, он взял разные языки на разных подходах, но почему-то «забыл» про низкоуровневое программирование. Я про языки С/С++/Rust. Они, конечно, высокоуровневые, но железо надо знать очень и очень хорошо, чтобы на них программировать. Смотрю канал Ольги Павловой https://www.youtube.com/@olgapavlova, она на C программировала драйвер для клавиатуры, которую собрала сама из запчастей. Драйвер для ядра Linux. В одном видео она пробовала писать свою реализацию протокола USB для этой клавиатуры, плюнула и использовала готовую микросхему. Протокол USB на С написать не так просто, как кажется.

Автор делает упор именно на функциональное программирование (Scala, Erlang, Clojure, Haskell). Что мне понравилось в функциональном программировании, основной принцип: в программе на вход приходят данные, и выходят тоже данные. А связь между входом и выходом можно представить в виде цепочки функций (конвейера). Автор всё агитирует за чистые функции. 
- Чистые (pure) функции  
    – Всегда возвращают одно и то же значение при одинаковых входных параметрах.  
    – Не имеют побочных эффектов (не читают и не пишут внешнее состояние, не делают I/O).  
Но мы живём в реальном мире, нечистых функций намного больше.
- Нечистые (impure) функции  
    – Могут возвращать разные значения на тех же входах или менять поведение в зависимости от внешнего состояния (например, времени, случайных чисел, глобальных переменных).  
    – Имеют побочные эффекты: чтение/запись файлов, сетевые запросы, логирование, мутация данных и т. п.  
Их делят на разные модули. Про это автор умолчал. Также из сложных аспектов выделил только монады, а функторы, аппликативы, ко‑монады?

Не понравился Clojure, это язык с неизменяемостью данных, лаконичный синтаксис Lisp, мощные макросы, высокая параллельность, JVM‑экосистема. Но недостатки всё перевешивают. Очень крутой порог вхождения из‑за Lisp‑нотации. Читаешь код на Clojure — ощущение математики, его создали для роботов. Язык очень мощный, но эту мощность ещё нужно постичь, 2–3 года минимум. Понравилась концепция: код — это данные. А так как это данные, их можно менять. В Clojure можно вводить свои синтаксические конструкции.

А вот Haskell мне понравился. Язык чисто функциональный, ленивые вычисления, сильная статическая типизация с выводом типов, выразительный синтаксис, каррирование и модульность.  Самый чистый из функциональных.
Недостатки: крутая кривая обучения, но не такая, как в Clojure.

А Prolog показал какое-то двойственное отношение. Декларативный язык логического программирования, удобство для задач ИИ и экспертных систем, обработки естественного языка, простая рекурсивная логика, краткость кода. Ключевое здесь — декларативный язык, как SQL. Нужно описать объекты, связи между ними и что хочешь получить в результате, и он найдёт решение (или не найдёт). Но все задачи, которые привёл автор, я видел решение на SQL на Хабре. Популярным Prolog так и не стал.

Понравился Erlang — это язык параллельного программирования. Там процессы процессами погоняют. Основной принцип языка: «Позвольте приложению потерпеть неудачу». Там есть процессы-гипервизоры, которые наблюдают за другими процессами, если процесс «умер», его запускает гипервизор. Гипервизоры наблюдают друг за другом. Горячая замена кода без остановки системы. Чем-то напоминает Kubernetes, меняем одни контейнеры на другие без перезапуска приложения. Про потокобезопасные неизменяемые структуры автор почему-то умолчал.

Scala не понравилась, с одной стороны, объектно-ориентированный подход, с другой — функциональный, скрестили ежа и ужа. Io — убогая пародия на JavaScript, Ruby мне понравился «синтаксическим сахаром», на нём писать легко.

Я решил зайти на HH и посмотреть, сколько вакансий на этих языках:
Scala/Java = 337
Elixir/Erlang = 10
Haskell = 2
Prolog = 0
Подразумевается, те, кто знают Java, знают и Scala. Erlang живёт с Elixir, а вот Haskell и Prolog никому не нужны.

Чисто для себя я решил изучить:
С/С++/RUST для низкоуровневого программирования
Haskell — для функционального
Go — для жизни.
👍3
Неделя выдалась насыщенной: то алкоголик врывается в рабочие процессы, то архитектуру для чат-бота приходится собирать по кусочкам.

В понедельник весь день звонил упорный алкоголик по телефону заказа чековой ленты. 7 раз звонил. В результате я отправил его в блек-лист. Где он нашёл этот старый номер — непонятно.

В нашей фирме есть традиция каждый год переделывать голосовое меню. Я начал анализировать существующее. Ощущение, что старое написано хвостом пьяной обезьяны, уйма логики, которая не делает ничего. Где-то 3 дня разбирался, что было запрограммировано до меня. Переделал под новые требования. Понравился только один момент: есть сайт https://isdayoff.ru/20250727?cc=ru, который говорит, текущий день является выходным или праздничным, и можно к этому привязать голосовое меню.
Продолжил писать чат-бота под Битрикс24 на Typescript. За основу взял сервер Fastify https://fastify.dev/. Для создания веб-серверов во всех курсах используют ExpressJS. Он самый простой, но уже морально устарел. А Fastify более быстрый и типизируемый. Он мне понравился.
Начал писать код и поймал себя на мысли, что файл settings.yml я читаю с нуля в трёх местах. Осознал, что делаю что-то не то. Вспомнил, что во фронте есть же storage. Например, zustand https://zustand-demo.pmnd.rs/. Всё хорошо, только на backend он не работает. Потом вспомнил, что на курсе по NodeJS Антон Ларичев https://www.youtube.com/@PurpleSchool/ рассказывал про внедрение зависимости (Dependency injection) и его применение в виде IoC-контейнеров. Сразу скажу: в ReactJS никаких IoC-контейнеров нет, там одни функциональные компоненты, а обмен между ними идёт через storage. Точнее, есть, но до AngularJS я так и не добрался.
Вот так я познакомился с библиотекой InversifyJS https://inversify.io/, которая реализует IoC-контейнеры в Typescript. Все свои функции я превратил в классы, а классы через интерфейсы поместил в IoC-контейнеры. И это мне понравилось: у приложения появилась архитектура, классы общаются между собой через интерфейсы. Один минус: кода стало больше, но приложение приобрело модульность. В коде появились декораторы и синглтоны из коробки.
Чат-боты под Битрикс24 — это что-то с чем-то. Они явно вдохновлялись Telegram-ботами, но до них им ещё очень и очень далеко. Мне по факту нужно было создать сообщение, что был звонок, и добавить под ним 2 кнопки: «Принять» и «Отклонить». Основная засада была именно с этими кнопками. Знаете, как они называются? Клавиатура (Keyboard) https://apidocs.bitrix24.ru/api-reference/chats/messages/keyboards.html. А что в этой клавиатуре располагается? Клавиши? Нет, команды. Но команды надо сначала зарегистрировать у бота. И при вызове команды приходит событие ONIMCOMMANDADD https://apidocs.bitrix24.ru/api-reference/chat-bots/commands/events/on-im-command-add.html. В результате получилась дивная матрёшка, пока разобрался, чуть не поседел.
По факту весь чат-бот построен на событиях. Подключили чат-бота в чат — возникло событие ONIMBOTJOINCHAT https://apidocs.bitrix24.ru/api-reference/chat-bots/chats/events/on-imbot-join-chat.html. Чат-бот приветствует жителей чата.
И ещё все события сильно заточены под PHP. Я заколебался парсить ответы из Typescript, но справился.
Сейчас более-менее разобрался с написанием чат-бота под Битрикс24, но пришлось тяжко. Примеров нет, доступен только справочник.
Чат-бота почти закончил, осталось его контейнизировать и интегрировать в голосовое меню. Думаю, справлюсь.
Самое интересное: в нашей фирме и программисты есть, но они загружены работой над основным приложением на ближайший год. И моё голосовое меню будет в самом конце беклога. Кстати, я понял простую мысль: проще бэкендеру выучить Javascript, чем фронтендеру стать бэкендером. Новых концепций программирования вагон и маленькая тележка.
👍3❤1
В итоге за неделю я прокачал архитектурное мышление, разобрался с InversifyJS, обошёл подводные камни Bitrix24 и внедрил осмысленную логику в голосовое меню. Стало ясно: если хочешь, чтобы что-то работало — делай сам. Параллельно убедился, что backend на TypeScript — это мощно, а грамотная архитектура экономит кучу времени. Продолжаю развивать проект.
👍4
Последние недели выдались насыщенными — и по рабочим проектам, и по изучению новых технологий. Пришлось и автоматизацию подкрутить, и с «дятлами» разобраться, и пару курсов пройти. Расскажу, что удалось сделать и с какими забавными моментами столкнулся.
На работе реализовал новое голосовое меню. Теперь нет коллективных звонков на весь отдел. Пришёл звонок — мой чат-бот создаёт новую заявку в Bitrix24, на которую необходимо перезвонить. Больше всего возмутилась бухгалтерия, вот когда проект обсуждали, они молчали, а вот когда надо перезванивать, стали возмущаться. 
В одном отделе тупо и на звонки не отвечали, и перезванивать не собираются. Странные люди. Внедрение нового идёт тяжко.
Ещё реализовал защиту от «дятлов». Есть клиенты, которые оставили заявку, подождали ровно 10 секунд, им никто не перезвонил. Они звонят и оставляют ещё одну, и так 3–4 раза. Я их назвал «дятлами». Их заявки забивают всю ленту, теперь мой чат-бот проверяет номер телефона и не создаёт новую заявку, а выводит количество звонков в текущей. Но заявки «дятлов» суммируются только в течение суток, потом всё начинает с начала. Для реализации использовал Redis, там есть фича, запись можно удалить по времени. Теперь Redis сам очищает просроченные записи. Мне «понравилась» установка Redis для Windows из официальной документации. Установите Docker с Linux, а в нём Redis.
Ещё у ряда коллег появилось уйма идей для доработок нового голосового меню, но не всё технически реализуемо. Эти бы силы они направляли на основную деятельность, мы бы давно достигли Марса.
Продолжают звонить какие-то боты через «Манго-офис», за день 6 раз звонят. Звонят, слушают голосовое меню, ничего не делают, и их сбрасывает по таймауту. Секретарь перезванивает, а дозвониться не может. Какие-то жулики. В блеклист их asterisk -rx "database put blacklist 9998887766 1".
Прошёл бесплатный курс на Stepik «Ansible для начинающих» https://stepik.org/course/123806/syllabus. Курс сильно для начинающих, все примеры ну очень простые. Как бы учащиеся не перетрудились. Получил сертификат с отличием. 
Начал проходить другой курс «Ansible На Русском Языке» https://www.youtube.com/playlist?list=PLg5SS_4L6LYufspdPupdynbMQTBnZd31N. Он более серьёзный, но тоже бесплатный.
Вот что мне понравилось в Ansible — это идемпотентность. Идемпотентность — это свойство задач выполняться так, чтобы повторный запуск не изменял систему, если она уже в нужном состоянии. Т. е., например, я внёс в файл hosts запись с IP-адресом и именем сервера. Если Ansible запустить второй раз, она проверит, а есть ли эта запись, и если есть, ничего нового вносить не будет.
В итоге, последние недели прошли под знаком экспериментов, внедрений и борьбы с неожиданными «сюрпризами». Где-то получилось сделать удобнее, где-то — отсеять лишнее, а кое-где — и поломать устоявшиеся привычки коллег. Параллельно прокачал навыки в Ansible, а новые идеи для автоматизации уже лежат в списке «в работу». Так что дальше будет ещё интереснее.
👍2
Последние месяцы у меня проходят под знаком экспериментов и внедрения новых технологий. Периодически кажется, что я одновременно и программист, и админ, и тестировщик — всё в одном лице. Так появился мой чат-бот для Bitrix24. Но вскоре стало ясно: бот без мониторинга — как машина без приборной панели. Вроде едет, но не понимаешь, когда заглохнет.

С этого и начались мои эксперименты с проверками и интеграцией в Zabbix. По совету ChatGPT я реализовал 3 функции: /live, /ready, /status. /live показывает, что сервис просто «жив», /ready ещё делает запросы к БД и Redis, а /status при помощи специального плагина определяет нагрузку памяти и процессора и возвращает 503-ошибку, если пороговые значения превышены.
Начал интегрировать мои наработки в Zabbix. А не получается, хотя и курс по Zabbix прошёл. Позвал коллегу, он объяснил, как настроить узел сети, источники данных, триггер, как правильно парсить JSON-ответ от сервера. Методы /live и /status забраковал. Остался только метод /ready, и ответ из него я доработал в виде «ключ-значение», чтобы было удобней парсить. То, что удобно для программиста, для DevOps оказалось не очень. 
И вот настал ответственный момент, я «уронил» чат-бота, возникла «проблема» в Zabbix. И всё. А как настроить отправку сообщений email и в Telegram или мне сидеть и медитировать перед браузером? Коллега знал, но подзабыл. Я начал разбираться сам. Помогли вот эти видео: https://www.youtube.com/watch?v=zGqzOOA4OeM и https://www.youtube.com/watch?v=yKueieCKiBk и статья https://serveradmin.ru/nastroyka-opoveshheniy-zabbix-v-telegram/. Оказалось не сильно сложно, но уж больно заморочено. Неудивительно, что коллега точный алгоритм не помнил.
Я решил продолжить дальше и настроил мониторинг Asterisk лично для себя, т. к. сообщения об ошибках валяться в общий чат, а там что-то найти трудоёмко. Zabbix оказался сложнее, чем я думал.
Но по голосовому меню затея с отправкой звонков сразу в чат провалилась, сотрудники тупо не перезванивают. А это уже не техническая проблема, поэтому решили вернуть всё взад и создать новое меню, звонок сначала идёт на отдел, а потом, если не удалось дозвониться, в чат, как пропущенный звонок.

Решил, что хватит проходить курсы по Ansible, надо внедрять полученные знания в производство. Кто не знает Ansible — это ещё вид межгалактической связи в фантастических романах. Решил создать playbook (сценарий) для первоначальной настройки Debian. За основу взял вот эту статью https://r4ven.me/it-razdel/zametki/pishem-ansible-playbook-dlya-nachalnoj-nastrojki-linux-servera/. Для Ansible есть репозиторий, где уже находятся готовые playbook https://galaxy.ansible.com/ui/. Скачал один, посмотрел, что-то сильно сложно, решил сделать проще. Я ведь только настраиваю сервер под Debian. Но вот просто не получилось, Debian он очень разных версий от 10 до 13, и то, что работает в одной версии, не работает в другой. Но я всё-таки справился, вот мой сценарий https://github.com/orion55/ansible. Проверил на 5 серверах, вроде работает, но опять же это лично мои настройки. Чтобы смотреть Youtube, я использую сервис из 3 букв, о котором нельзя говорить. За последний год я переезжал на разные серверы раза три, и на первоначальную настройку Debian-сервера уходило в среднем 1 час. На этот сервер мало установить приложения firewall, fail2ban, tmux и т. д., ещё их необходимо настроить. Больше всего времени уходит именно на настройку. Скрипт Ansible делает это за 5 минут.
Решил ещё автоматизировать установку и настройку Docker, начал, оценил объём задачи и взял уже готовый playbook https://galaxy.ansible.com/ui/standalone/roles/geerlingguy/docker/, у которого 23 млн. загрузок. Он всё сделал за меня.
Ansible мне понравился, очень хорошо автоматизирует повторяющиеся задачи на серверах, жаль, что не знал раньше.
👍2
Решил проинтегрировать Asterisk и Bitrix24 через плагин Itgrix https://itgrix.ru/. Всё хорошо, но на FreeBSD он не работает. Мне понравилась фраза из документации: «Мучительно проходит установка на FreeBSD». Я даже написал в техподдержку, часть клиентов как-то настроила на FreeBSD, как разработчики не знают. Если хочется настроить на FreeBSD, настраивай. В результате плагин решил установить на виртуалку с Debian. Пока процесс идёт.

Для себя я сделал вывод: без практики все курсы и статьи остаются просто теорией. Настоящее понимание приходит только тогда, когда сталкиваешься с ошибками и ищешь выход самостоятельно. И пусть не всегда всё работает с первого раза, зато потом результат радует вдвойне. А значит, стоит продолжать пробовать новое, закреплять знания и превращать эксперименты в реальную пользу.
👍5👎1