Recently in Статьи Category

Настройка связки Graphite+uwsgi+nginx

Задача: Установить и настроить Graphite для последующей его интеграции с icinga1/icinga2/Nagios/Grafana.
Мануалы предлагают установить это посредством pip и прикрутить с боку apache+mod_wsgi. На мой взгляд это ресурсоемко, да и не для того придумали бинарные дистрибутивы, чтобы из сырцов что то собирать.

Итак

Гуглим установку и настройку Graphite на любимый дистрибутив, благо мануалов по его установке, как говна за баней. Единственно там предлагается установить apache+mod_wsgi, который я и заменяю на nginx+uwsgi. Приведу свои конфиги с Debian 9.

/etc/uwsgi/apps-enabled/graphite.ini
[uwsgi]
processes = 2
uid = _graphite
gid = _graphite
chdir = /usr/share/graphite-web
pythonpath = "['/usr/share/graphite-web'] + sys.path"
manage-script-name = true
mount = /graphite=/usr/share/graphite-web/graphite.wsgi
socket = 127.0.0.1:3031
plugins = python
module = wsgi:application

plugins = carbon
enable-metrics = true
carbon-use-metrics = true
carbon-id = %n
carbon = 127.0.0.1:2003
/etc/nginx/sites-enabled/graphite.local`
server {
        listen      80;
        server_name graphite.local;
        charset     utf-8;
        location / {
                include uwsgi_params;
                uwsgi_pass 127.0.0.1:3031;
        }
}
Так же предлагаю обмазаться вот этим циклом статей.

Раздача IPv6 по OpenVPN туннелю

IPv6 когда то придет в массы. Быть может к нашей пенсии. Мы же, как можем, приближаем этот момент. С выделенными адресами ситуация все ухудшается. В некоторых регионах страны Ростелеком перестал выдавать белые адреса физическим лицам. А белый адрес страсть как нужен, для адекватной работы 4to6. Можно периодически дергать API туннельного брокера, сообщая свой IPv4, но кому это нужно, когда проще купить виртуалку со статикой?
IPv6 это круто, модно, молодежно. И порой даже быстро. Но нафиг не нужно провайдерам.
Задача: Выпустить корпоративную сеть в мир по IPv6.
Имеется: VDS на flops.ru со статикой и туннель от he.net.
Настройка тунеля хорошо описана на сайте he.net, при создании туннеля даже выдается конфиг под разные ОС. Дополнительно нужно получить /48 подсеть.
Шаманим на сервере:
apt-get install openvpn radvd iptables-persistent
echo ipv6 >> /etc/modules
echo net.ipv6.conf.all.forwarding=1 >> /etc/sysctl.conf
echo net.ipv6.conf.default.forwarding=1 >> /etc/sysctl.conf
iptables -A FORWARD -s 10.0.1.0/24 -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o eth0 -j MASQUERADE
service iptables-persistent save
touch /etc/openvpn/route.sh
chmod +x /etc/openvpn/route.sh
Как генерировать сертификаты описано в документации к OpenVPN, приводить не буду.
Конфиг OpenVPN /etc/openvpn/server.conf:
# Тип севера
tls-server
# Порт сервера
port 1194
# Разработчик OpenVPN рекомендует UDP, но его не умеет Mikrotik, который я юзаю.
proto tcp
# Интерфейс
dev tap
# Сертификаты сервера
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem
tls-auth /etc/openvpn/keys/ta.key 0
# Список заблокированых сертификатов
crl-verify /etc/openvpn/keys/crl.pem
# Директория с конфигами статических клиентов
client-config-dir /etc/openvpn/ccd
# Адрес внутренней VPN сети
server 10.0.1.0 255.255.255.0
ifconfig 10.0.1.1 255.255.255.0
# DNS сервер
push "dhcp-option DNS 10.0.1.1"
# Адрес I
Pv6 шлюза в мир
push "route-ipv6 2001:470:xxxx:1::/64"
# Не «передергивать» сетевое устройство при перезапуске демона
persist-tun
#
script-security 3
# Скрипт который правит роутинг при запуске сервера
up /etc/openvpn/route.sh
#
client-to-client
# Каждые 10 секунд посылать ping на удаленный хост, и, если за 30 секунд не было получено ни одного пакета - то перезапускать туннель
keepalive 10 30
# Шифрование
cipher BF-CBC
# Файл статуса сервера
status /var/log/openvpn-stat
# Файл лога сервера
log-append /var/log/openvpn.log
Файл /etc/openvpn/route.sh:
#!/bin/sh
ip addr add 2001:470:xxxx:1::1/64 dev tap0
Конфиг radvd /etc/radvd.conf:
interface tap0
{
    AdvSendAdvert on;
    prefix 2001:470:xxx:1::/64
    {
        AdvOnLink on;
        AdvAutonomous on;
        };
};
Конфиг сети (eth0 смотрит в мир) /etc/network/interfaces:
auto eth0
iface eth0 inet static
	# IP адрес 
	address xxx.xxx.xxx.xxx
	# Маска сети
	netmask 255.255.255.0
	# Широковещательный адрес
	broadcast xxx.xxx.xxx.xxx
	# Шлюз 
	gateway xxx.xxx.xxx.xxx
	# DNS
	dns-nameserver 127.0.0.1
	# IPv6 адрес
	up ip addr add 2001:470:xxxx:0::1/64 dev eth0
Конфиг OpenVPN клиента выглядит примерно так:
tls-client
client
proto tcp
remote xxx.xxx.xxx.xxx 1194
dev tap
tls-auth /etc/openvpn/keys/ta.key 1
dh /etc/openvpn/keys/dh1024.pem
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/10.0.1.2.crt
key /etc/openvpn/keys/10.0.1.2.key
cipher BF-CBC
keepalive 10 30
log-append /var/log/openvpn.log
persist-tun
Перезагружаем сервер. Для фанатов работы без перезагрузки могу сказать, что устройство sit0 (на котором поднимается туннель) не придет, даже если включить модуль ipv6 руками. Ну вот не придет, хоть ты тресни. Ну или я ниасилил.
Подключаемся клиентом к vpn и проверяем:
ping6 -n ya.ru -c 4
Должно выйти примерно так:
PING ya.ru(2a02:6b8::3) 56 data bytes
64 bytes from 2a02:6b8::3: icmp_seq=1 ttl=56 time=158 ms
64 bytes from 2a02:6b8::3: icmp_seq=2 ttl=56 time=123 ms
64 bytes from 2a02:6b8::3: icmp_seq=3 ttl=56 time=121 ms
64 bytes from 2a02:6b8::3: icmp_seq=4 ttl=56 time=122 ms

--- ya.ru ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 121.274/131.460/158.149/15.443 ms
Дело было вечером, затем ночью, затем еще одним вечером и т.д., до победного.
У меня имелись Intel Core 2 CPU 6300 @ 1.86GHz, ASUS P5L-MX, HDD Maxtor 80Gb, 2Gb ОЗУ, Debian Wheezy в качестве хост-системы, некий NoName в качестве второй сетевой карты и пяток шурупов. Все вместе это выглядит так. Не то чтобы из этого хлама стоило собирать какие либо корпоративные решения, но если начал городить виртуалки, остановится довольно сложно.

"Демонизация" MetatTader for Linux

После того как торговый терминал MetaTrader успешно установился и запустился на OS Debian GNU/Linux без графического окружения, возникла нужда запускать его автоматически при старте системы/падении терминала.
Изначально это осуществлялось по cron, но потом захотелось "демонизировать" терминал (запускать как сервис из rc.d). В результате получился Debian-like rc.d скрипт.
Итак:
nano /etc/init.d/metatrader
#! /bin/sh
### BEGIN INIT INFO
# Provides:          metatrader
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: MetaTrader init script
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.
### END INIT INFO

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
export DISPLAY=:2
USER="metatrader"
NAME=$USER
TERMINAL="/usr/bin/wine /home/$USER/.wine/drive_c/metatrader/terminal.exe"
SCRIPTNAME=/etc/init.d/$NAME
XVFB=/usr/bin/Xvfb
XVFB_ARGS="$DISPLAY -screen 0 800x600x16 -nolisten tcp"
XVFB_PIDFILE=/var/run/xvfb.$NAME.pid

[ -x "$XVFB" ] || exit 0

. /lib/init/vars.sh
. /lib/lsb/init-functions

do_start()
{
        log_daemon_msg "Starting $NAME" "MetaTrader"

        log_daemon_msg "Starting" "Xvfb"
        start-stop-daemon --start --quiet \
            --make-pidfile --chuid $USER \
            --pidfile $XVFB_PIDFILE --exec $XVFB -- \
            $XVFB_ARGS > /dev/null 2>&1 &
        log_end_msg 0

        log_daemon_msg "Starting" "terminal"
        start-stop-daemon --start --quiet \
                        --chuid $USER  --exec $TERMINAL > /dev/null 2>&1 &
        log_end_msg 0
}


do_stop()
{
        log_daemon_msg "Stoping $NAME" "MetaTrader"
        start-stop-daemon --stop --retry 5 --quiet \
            --pidfile $XVFB_PIDFILE --name Xvfb
        rm $XVFB_PIDFILE > /dev/null 2>&1 &
        log_end_msg 0
}
case "$1" in
  start)
        do_start
        ;;
  stop)
        do_stop
        ;;
  restart)
        do_stop
        do_start
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
        exit 3
        ;;
esac
exit 0
update rc.d metatrader defaults
Собственно и все. Так же можно поставить alertmon для мониторинга работы терминала. Лично у меня alertmon следит за процессом работы терминала и при его падении делает service metatrader restart.

Запуск uTorrent-server на Linux

На шлюзе конторы, в коей я сейчас работаю, потребовалось поднять торрент-клиент с веб-мордой, для себя и сотрудников. rTorrent из SVN отказался корректно работать. идущий же в родных репозиториях Debian, стар. Супер-стар, я бы сказал. Погуглилось, поспрашивалось, в итоге выбор пал на uTorrent-Server. Поскольку пакета с этим добром для Debian нет, залил руками и написал rc-скрипт для каноничного запуска.
#! /bin/sh
### BEGIN INIT INFO
# Provides:          utserver
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: uTorrent Server init script
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.
### END INIT INFO

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="uTorrent Server"
NAME="utserver"
DAEMON=/usr/bin/utserver
# Опции командной строки
DAEMON_ARGS="-configfile /etc/utserver/utserver.conf -settingspath /var/lib/utserver -logfile /var/log/utserver.log"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

[ -x "$DAEMON" ] || exit 0

# Подключаем встроенные функции
. /lib/init/vars.sh
. /lib/lsb/init-functions

do_start()
{
        log_daemon_msg "Starting $NAME\n"
        start-stop-daemon --start --quiet --make-pidfile \
                 --pidfile $PIDFILE --exec $DAEMON -- \
                $DAEMON_ARGS > /dev/null &
}


do_stop()
{
        log_daemon_msg "Stoping $NAME\n"
        start-stop-daemon --stop --retry 5 --quiet \
            --pidfile $PIDFILE \
            --name utserver
        rm $PIDFILE
}
case "$1" in
  start)
        do_start
        ;;
  stop)
        do_stop
        ;;
  restart)
        do_stop
        do_start
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
        exit 3
        ;;
esac
exit 0
Cохраним по пути /etc/init.d/utserver и добавим в автозагрузку:
update-rc.d utserver defaults

Расширение для работы с QIWI

Заказчик пожелал прикрутить к некой своей системе прием финансов через платежные терминалы QIWI. Поскольку данная контора весьма противна в плане взаимодействия с гражданами этой страны, убедить их добавить свою кнопку в терминал не получилось по целому ряду причин. Пришлось использовать их сервис "QIWI Кошелек", но не обычный, а который для интернет-магазинов и фрилансеров.
Поскольку разрабатываю я в основном на фреймворке Yii, а расширения для работы с QIWI нет, пришлось писать свое. Что в итоге получилось, можно глянуть тут
P.S.: Собственно за эту поделку я и получил инвайт на Habrahabr.

Debian + Flyer U2 3G USB-modem

Попался в руки как то гордый китайский универсальный 3G модем Flyer U2. При цене в 1.4 тыс. руб., сей девайс помимо всеядности в плане SIM-карт имеет на борту картридер под microSD, ZeroCD (ну а куда без него?) и работает с HSUPA/HSDPA/UMTS/EDGE/GPRS/GSM сетями. Заявлена поддержка WinXP/Vista/Win7 а так же Linux/Mac OS. После вставки данного устройства в USB-порт моего ноутбука с Debian GNU/Linux на борту, это самое USB отвалилось вместе с модемом, и подниматься обратно без живительного ребута никак не соглашалось. Сразу подумалось, кому бы из знакомых линуксоидов подогреть сие чудо в качестве подарка :-) А все потому что udev назначал устройству неправильный режим. Некоторое время гугления показало что с данной проблемой столкнулись многие, только у них сей девайс либо не узнавался как модем, либо не узнавался вообще никак. Из обрывков информации получилось следующее кривое решение (которое не всем нужно, ибо на борту модема есть пакет с аналогом usb-modeswitch и скрипт лечения этой железки).
И так, ставим usb-modeswitch и правим правила для udev:
В /lib/udev/rules.d/40-usb_modeswitch.rules комментируем строчку с правилом для устройства  1c9e:f000
#ATTRS{idVendor}=="1c9e", ATTRS{idProduct}=="f000", RUN+="usb_modeswitch '%b/%k'"

Файл /etc/usb_modeswitch.d/1c9e:f000 приводим к следующему виду:
DefaultVendor=0x1c9e
DefaultProduct=0xf000
TargetVendor=0x1c9e
TargetProduct="9605"
WaitBefore=5
CheckSuccess=20
MessageContent="55534243123456788000000080000606f50402527000000000000000000000"
В /etc/udev/rules.d/ создаем файл 45-flyer-u2.rules с следующим содержимым:
ATTRS{idVendor}=="1c9e", ATTRS{idProduct}=="f000", RUN+="/etc/udev/scripts/mount-flyer-u2"

Ну и соответственно /etc/udev/scripts/mount-flyer-u2
#!/bin/sh
usb_modeswitch -c /etc/usb_modeswitch.d/1c9e:f000
rmmod -f -s usbserial
modprobe usbserial vendor=0x1c9e product=0x9605
Даем ему права на исполнение и ребутаем udev.После таких манипуляций железка узнается как модем и картридер и не ломает usb.

Forex + MetaTrader + Linux

Есть такая штука как Валютный рынок Forex, где предприимчивые люди могут заработать на хлеб, а очень предприимчивые еще и на масло. Можно конечно получить высшее образование в финансовой сфере и засесть в брокерской конторе или на бирже, но зачем нам, красноглазикам это надо?

Процесс торговли научились автоматизировать с помощью платформ типа MetaTrader и языка программирования торговых стратегий MQL4. Просто скачиваем терминал к себе на компьютер, регистрируем счет, ставим какого либо советника и пробуем "срубить бабла". Но это теория. А речь пойдет о том, как из этого всего создать торгового бота на Linux.

Прежде чем браться за установку и настройку на Linux, настоятельно рекомендую понять как работать с терминалом в привычном графическом рабочем окружении, дабы не возникало вопросов что такое советник и как его установить.

В наличии имеется:

  1. VDS на Debian GNU/Linux без иксов
  2. Установщик MetaTrader 4 под Windows
  3. Торговый советник (бот)

На моем VDS нет иксов (да и зачем же нам иксы?), а терминал мало того что гуевый, да еще и под винды. Открываем рутовую консоль и шаманим:

root@phoenix~: aptitude install wine x11vnc screen xvfb xfonts-100dpi xfonts-75dpi xfonts-cyrillic ttf-mscorefonts-installer

Дальнейшие действия все же лучше выполнять от пользователя.

Запускаем установщик:

nek@phoenix~: export DISPLAY=:1 
nek@phoenix~: xvfb-run -n 1 -s "-screen 0 800x600x16" wine itc4setup.exe &

Запускаем vnc сервер:

nek@phoenix~: x11vnc &

Подключаемся любым VNC клиентом к нашему серверу и устанавливаем наш терминал. Поскольку установленный терминал не запустится без некоторых библиотек, то устанавливаем winetricks:

nek@phoenix~: wget http://winetricks.org/winetricks
nek@phoenix~: chmod+x  ./winetricks
nek@phoenix~: xvfb-run -n 1 ./winetricks vcrun6
nek@phoenix~: x11vnc

Далее снова подключаемся по vnc и устанавливаем vcrun6.

Переходим в директорию experts установленного терминала и скопируем туда нашего советника, запустим терминал в скрине:

nek@phoenix~: screen -AmdS sh sh
nek@phoenix~: screen -R sh

Запустим терминал:

nek@phoenix~: xvfb-run -n 1 -s "-screen 0 800x600x16" wine .wine/drive_c/Program\ Files/InstaTrader/terminal.exe

Выйдем из скрина путем нажатия Ctrl+A+D и снова запустим vnc сервер:

nek@phoenix~: x11vnc

Снова подключаемся к серверу по vnc и видим окно с регистрацией нового аккаунта. Ну а далее думаю все понятно, заводим счет, ставим советника на выбранный таймфрейм и валютную пару и запускаем. Рекомендую потренироваться на демо счете.

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

Конечно можно не парится и вынести это дело на VDS/VPS на Windows, но такой сервер неоправданно дорог.

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

Хорошего советника можно взять тут.