Мониторинг серверов c Grafana и Influxdb
Есть меня несколько серверов которые бы мне хотелось постоянно мониторить на предмет оперативной памяти, диского пространства и т.п. Хотя сами сервера расположены в разных местах все они объединены между собой по openvpn. Для того чтобы решить задачку мой выбор пал на связку influxdb+grafana.
Influxdb это так называемая timeseries база данных, в которой мы можем хранить данные которые изменяются во времени. Grafana - это универсальный UI который удобно использовать для визуального представления таких данных. InfuxDB и Grafana поднимаются на при помощи docker-compose. К при этом для того, чтобы послать данные состояния сервера используется баш скрипт который периодически запускается через cron и при помощи curl посылает данные на сервер
Таким образом я всегда могу видеть состояние того или иного сервера. Все системы будем подымать в докере для этого достаточно склонировать репозиторий с docker-compose который содержит в себе 3 образа - influxdb, grafana и chronograph.
git clone git@github.com:maxistar/docker-compose-influxdb-grafana.git
cd docker-compose-influxdb-grafana
git checkout influx1_8
docker-compose up -d
Influxdb версии 2.x требует авторизации и поэтому я использовал версию 1.8. Исправленный docker-compose.yaml живет в ветке influx1_8 где я использую именно эту версию, возможно в будущем разберусь как использовать и последнюю версию.
После того как InfluxDB и Grafana запущены, на сервере, который будем мониторить, создаем bash скрипт (script.sh).
#!/bin/bash
dbName="db0"
stat=`free | awk -v RS="" '{print "memory,host=acentauri used=" $9 "\nmemory,host=acentauri total=" $8 "\nmemory,host=acentauri swap=" $15 "\nmemory,host=acentauri swapused=" $16}'`
curl -s -i -XPOST "http://10.8.0.100:8086/write?db=db0" \
--data-binary "$stat"
делаем файл исполнимым и добавляем команду для запуска скрипта в cron:
chmod +x script.sh
contab -e
в открывшимся файле добавляем следующую строчку:
* * * * * /home/maxim/infrastructure/utils/memusage/script.sh
После того как данные начали посылаться на сервере настраиваем dashboard и наслаждаемся.
После того как начал мониторить состояние asterisk сервера он волшебным образом перестал зависать! Возможно его зависания были связаны с тем что зависает wifi модуль и я его перестаю видеть по сети.
Компилируем Android приложения в Docker
Давно хотел научиться компилировать свои приложения для андроид без необходимости устанавливать и настраивать на компьютере кучи ненужного софта. В самом деле - на дворе двадцать первый век, у нас есть докер и нам совершенно не обязательно для сборки приложения устанавливать весь софт на рабочую станцию чтобы собрать приложение. Это можно сделать в докере.
Посидев пару вечеров, собрал простенький образ, который будет делать за меня всю черновую работу. Теперь, чтобы собрать любое приложение для android, достаточно выполнить вот такую команду из корня проекта:
docker run --rm -v ${PWD}:/var/app maxistar/android:latest bash \
-c "gradle build && gradle compileDebugSources"
Готовый apk файл будет сохранен в папку app/build/outputs/apk/debug/app-debug.apk - его можно сразу скопировать не телефон и установить его (не забудьте разрешить установку приложений из неизвестных источников).
Как был сделан этот образ? За основу взял образ Debian 9.
Установил Java 8 (Java 11 у меня не завелась если знаете как подружить gradle и java 11 поделитесь секретом)
apt-get update
apt-get -y install git wget unzip default-jdk
Для сборки нам нужен gradle установим его
wget https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip -P /tmp
unzip -d /opt/android /tmp/sdk-tools-linux-3859397.zip
Скачаем Android SDK:
wget https://services.gradle.org/distributions/gradle-6.8.3-bin.zip -P /tmp
unzip -d /opt/gradle /tmp/gradle-6.8.3-bin.zip
Еще нужно установить переменные окружения.
ENV ANDROID_SDK_ROOT=/opt/android ENV GRADLE_HOME=/opt/gradle/gradle-6.8.3 ENV PATH=${GRADLE_HOME}/bin:${ANDROID_SDK_ROOT}/tools/bin:${PATH}
Теперь нужно скачать инструменты для сборки android приложений.
sdkmanager --update
sdkmanager "build-tools;30.0.2" "platform-tools" "platforms;android-30"
sdkmanager --licenses
Готовый Dockerfile выглядит вот так:
FROM debian:9
MAINTAINER Max Starikov <maxim.starikov@gmail.com>
ENV ANDROID_SDK_ROOT=/opt/android
ENV GRADLE_HOME=/opt/gradle/gradle-6.8.3
ENV PATH=${GRADLE_HOME}/bin:${ANDROID_SDK_ROOT}/tools/bin:${PATH}
RUN apt-get update && apt-get -y install git wget unzip default-jdk
RUN wget https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip -P /tmp && \
unzip -d /opt/android /tmp/sdk-tools-linux-3859397.zip && \
wget https://services.gradle.org/distributions/gradle-6.8.3-bin.zip -P /tmp && \
unzip -d /opt/gradle /tmp/gradle-6.8.3-bin.zip && \
sdkmanager --update && \
yes | sdkmanager --licenses && \
sdkmanager "build-tools;30.0.2" "platform-tools" "platforms;android-30" && \
yes | sdkmanager --licenses && \
mkdir /var/app
WORKDIR /var/app
Следует заметить, что образ довольно большой (примерно 850Mb) - и для его использования нужно быстрое интернет соединение, но зато, единожды скачав, скачивать повторно docker его больше не будет.
Образ доступен на docker hub. Исходник находится на github.
Оффлайн распознование текста - Kaldi ASR
Попробовал недавно систему распознавания речи Kaldi и оказалось, что все не так уж плохо, а даже на удивление хорошо. Качество распознавания оказалась ненамного хуже чем это делают это Гугл и Яндекс в онлайн, при этом совершенно бесплатно, без регистрации и СМС. На хабре есть хорошая статья для на эту тему.
При этом голосовой движок находятся на локальном компьютере и неплохо справляется с поставленной задачей. Немного смущает количество ресурсов которые требуются для того чтобы скомпилировать софт. В моем случае я потратил вечер для того чтобы скомпилировать систему, но уже после все заработало как надо. Если компилировать самому не хочется, уже имеется скомпилированный Docker образ, но пока не понятно как к нему подключить языковую модель.
Имеется также и очень неплохая языковая русская модель. Если покопаться в сети можно найти модели и для других языков. Если покопаться в сети можно найти модели и для других языков.
Этот текст был наговорен в процессе движения на работу а затем распознан этой штуковиной. Да, я очень ленив.
Запуск Linux GUI приложений из под Android без рута
Обнаружил интересный способ запустить GUI приложение для Linux на Андроид без рута. Есть такой интересный эмулятор Linux окружения под Android - Termux. Эмулятор умеет много чего, например, имеется встроенный пакетный менеджер apt и можно полноценно установить nodejs и использовавать его для своих нужд.
К сожалению, в репозитории приложения нет GUI программ, однако умельцы научились запускать из него docker образ Linux Fedora Dektop, на котором уже можно запускать полноценные GUI приложения. Так как Fedora работает chroot окружении - накладные расходы на виртуализацию не сильно большие. В качестве графического сервера можно использовать XServer XSDL, который является нативным Андроид приложением.
Таким образом получается, что почти на любом телефоне с процессором ARM можно запускать Linux так же эффективно, как и на настольном компьютере или на ноутбуке. Мне пока удалось запустить таким образом gimp и gedit, однако, в сети полно скриншётов с полными экранами KDE и LXDE - так что имеет смысл попробовать.
Учитывая, что сейчас телефоны практически такие-же мощные как и настольные компьютеры, тема видится мне весьма интересной.