Осовремененный Unix Way или pipe в браузер

в 11:08, , рубрики: django, linux, open source, pipe, python, sockjs, tornado, WebSocket, Веб-разработка, метки: , , , , ,

Наверное, каждый, кому когда-нибудь приходилось следить одновременно за большим количеством окошек с логами, подумывал о переносе некоторых из них на экран планшета или телефона.
А, находясь далеко от компьютера, следить за выхлопом недавно запущенного большого и страшного сервиса?
Конечно, можно поставить ssh клиент на телефон, но это не особо удобно.
Поэтому я решил сделать мини-сервис упрощающий «удалённый» просмотр логов.


Осовремененный Unix Way или pipe в браузерОсовремененный Unix Way или pipe в браузер

Краткое резюме

Сервис cantail.me с открытым исходным кодом, выложенным на github.
Свободный консольный клиент (github). Для простой отправки данных достаточно:

long-runnig-app | tailme

И скопировать ссылку из открывшегося окна браузера. Или можно добавить параметр -s и просто скопировать её из терминала.

Для примера сейчас запущена публикация лога nginx'а командной:

tail -f /var/log/nginx/cantailme.access.log | tailme -s

Установка клиента

В ubuntu 11.10+ приложение можно установить из ppa:

add-apt-repository ppa:nvbn-rm/ppa
apt-get update
apt-get install tailme

В других дистрибутивах можно установить через pip:

pip install -e git+https://github.com/nvbn/cantailme-client.git#egg=tailme

Либо через установочный скрипт:

git clone https://github.com/nvbn/cantailme-client.git
cd cantailme-client
python setup.py install

Под капотом

Осовремененный Unix Way или pipe в браузер

Реализация клиента очень простая — цикл читающий stdin и отправляющий на сервер новые строчки.
Для предотвращения подмены данных сервер при инициализации сессии отдаёт хеш-идентификатор и «секрет», которые в дальнейшем используются для отправки «строк».

Серверная часть немного сложнее, её можно разделить на 3 условных сущности:

  • http «сервер» занимающийся рендеренгом 2 вьюх;
  • jsonrpc api, с помощью которого консольный клиент инициализирует сессию и отправляет данные на сервер;
  • push сервер для отправки полученных через api строк клиентам в реальном времени.

Взаимодействие между частями системы проходит при помощи RabbitMQ.
Push работает через tornado-sockjs.
Для экономии ресурсов логи загружаются сразу в файл и отдаются через nginx, минуя django.
Для желающих залить /dev/urandom или большие логи раз в 5 минут запускается «суровый» скриптик.

Деплой

Осовремененный Unix Way или pipe в браузер

В данном случае он нетривиален, но я уже сталкивался с похожей ситуацией. Основные причины выбора такой схемы:

  • нередка ситуация, когда нестандартные порты порезаны, поэтому tornado и django должны висеть на одном стандартном порту;
  • заставить nginx работать нормально с WebSocket'ами проблематично;
  • HAProxy не раздаёт статику;
  • эту схему я успел погонять в продакшене на неэкспериментальных проектах =)

В случае возникновения ошибок пишиет багрепорты в трекере для сервера и клиента. Либо в комментариях к этому посту =)

PS с habrastorage произошёл какой-то косяк, перезалил картинки к себе.

Автор: nvbn

* - обязательные к заполнению поля