воскресенье, 19 февраля 2023 г.

systemd restart=always

 так, памятка чтобы системд вечно рестартил сервис

Необходимо, но не достаточно restart=always :

The default limit is to allow 5 restarts in a 10sec period. If a service goes over that threshold due to the Restart= config option in the service definition, it will not attempt to restart any further.


The rates are configured with the StartLimitIntervalSec= and StartLimitBurst= options and the Restart= option controls when SystemD tries to restart a service.

среда, 15 февраля 2023 г.

python3: ubuntu 16 и ошибки про docker

Проблемы только на Ubuntu16 и ниже.

apt install -y python3-pip

pip3 install --upgrade pip

После предыдущего шага pip сломается, нужно переустановить из скрипта

curl https://bootstrap.pypa.io/pip/3.5/get-pip.py -o get-pip.py; python3 get-pip.py --force-reinstall

Нужно переподключиться, чтобы подтянулись новые енвы.

pip3 install --upgrade --force-reinstall docker

pip3 install docker-compose

Если на предыдущем шаге ломается с ошибкой установки cffi : "fatal error: ffi.h: No such file or directory"

apt install libffi-dev

еще раз: 

pip3 install docker-compose

Docker: volumes, bind vs volume

https://maximorlov.com/docker-compose-syntax-volume-or-bind-mount/

https://docs.docker.com/storage/

Есть 4 вида "внешнего" хранения: volume, bind, tmpfs, named pipes. Обычно используются первые три, но tmpfs это "диск в памяти" - место ограничено рам, при перезагрузке очищается.. для чего-то временного. А вот для постоянного хранения - первые два. И разницы на самом деле не так много, volume можно управлять через docker volume, и описывать в конфиге как new_volume:/app/data. При этом, если указать в первой части полный путь, то если нет такого файла/каталога то будет создан каталог, если есть то просто подцепит. Если путь не полный то будет в /var/lib/docker/volumes/, а если первую часть (имя опустили) то /.../some_uuid. Но инфу можно получить через docker volume ls

В случае бинда всё проще, создаётся обычный mount bind, если каталога нет - будет ошибка, плюс если это не RO вольюм то его обязательно описывать ещё и в главном блоке в отдельном volume, иначе будет ошибка. Так же, данный вид более опасен тем, что можно примонтировать например /etc

суббота, 4 февраля 2023 г.

nginx redirect с исключениями

 Типовой редирект в nginx (нужен например для сео, чтобы одна страница не открывалась по двум урлам)

rewrite ^/(.*)/$ /$1 permanent;

Но иногда нужно пропустить отдельные пути, например /api/...

Оказывается, можно это сделать красиво и элегантно

rewrite ^(/(?!api/).*)/$ $1 permanent;

(но чаще слэши добавляются, читать про browsing context)

суббота, 28 января 2023 г.

mysql proxy?

 Когда-то может понадобиться mysql proxy. Была версия "официальная", которая так и называлась, но в репе последнее обновление 8 лет назад - по факту оно мертво.

Была найдена живая замена: https://github.com/sysown/proxysql/

После установки по README подключаться так

$ mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '

Есть в докере, например proxysql/proxysql, percona/proxysql

Мониторинг:

Интегрировать будем с графаной, и например, можно взять proxysql-exporter (или proxysql-grafana-prometheus - нужно ставить и проверять), но в целом есть такое

https://proxysql.com/documentation/backend-monitoring/

Что почитать:

ProxySQL — еще один mysql-proxy

Оптимизация запросов MySQL с помощью кеширования ProxySQL в Ubuntu 16.04 (по названию конечно старое, но дока за 2020, плюс там важны "азы")

https://mydbops.wordpress.com/2018/08/20/proxysql-series-percona-cluster-mariadb-cluster-galera-read-write-split/

https://mydbops.wordpress.com/2020/01/30/monitoring-mysql-using-proxysql/

(вообще на этом сайте много полезных статей про proxysql)

Есть и какая-то интеграция с реликом, другой вопрос кому он нужен при таких ценах..

https://newrelic.com/blog/how-to-relic/how-to-monitor-mysql


PS

Впрочем, можно и свой прокси написать, например как тут

https://xakep.ru/2017/02/22/mysql-proxy/

вторник, 3 января 2023 г.

Апи к нескольким хостерам

 У herzner например есть cloud, и там вполне внятное апи. Но вот к физическим серверам (которые robot) - найти не удалось... подкинули ссылку

https://docs.hetzner.com/robot/dedicated-server/robot-interfaces/

Описание

https://robot.hetzner.com/doc/webservice/en.html#preface

и для питона там есть.. чья-то левая репа. Могли бы хоть для приличия себе склонировать и синхронизироваться.

https://github.com/aszlig/hetzner

Требуется предоставить логин-пароль, что возможно не всегда. Ломается при включенном 2fa.

PS есть https://robot.hetzner.com/doc/webservice/en.html#get-ip

clo

https://clo.ru/help/terraformforclo

воскресенье, 27 ноября 2022 г.

edgecenter/gcore certbot plugin

1) git clone https://github.com/G-Core/gcore-dns-certbot-plugin

2) https://accounts.edgecenter.ru/profile/api-tokens

и добавляем токен, на данный момент достаточно уровня User

3) cd gcore-dns-certbot-plugin

vim gcore.ini

# G-Core API token used by Certbot
dns_gcore_apitoken = 000xxx

4) 

sed -i'' -e 's/gcorelabs.com/edgecenter.ru/g' certbot_dns_gcore/api_gcore.py

ИЛИ

dns_gcore_api_url = https://api.edgecenter.ru
5) получаем
certbot certonly --authenticator dns-gcore --dns-gcore-credentials=./gcore.ini -d 'example.com'

6) продлеваем
certbot renew --authenticator dns-gcore --dns-gcore-credentials=./gcore.ini

вторник, 8 ноября 2022 г.

Особенности работы с python-netbox

 Речь о той версии, которая pip install python-netbox (потому что их несколько)

Держим под рукой доку https://demo.netbox.dev/api/docs/ (можно на свой ипам открыть, /api/docs)

понедельник, 31 октября 2022 г.

Netbox в докере

 Как быстро запустить нетбокс в докере?

docker run -ti netboxcommunity/netbox

Но... оно не запустится. Потому что базы нет. И редиса, по хорошему. И конфигов..

Поэтому правильнее так

git clone -b release https://github.com/netbox-community/netbox-docker.git

Далее читаем про docker-compose.override.yml - в частности, нужно настроить правильный проброс портов nginx, это есть в доке

https://hub.docker.com/r/netboxcommunity/netbox

оно же

https://github.com/netbox-community/netbox-docker

И

docker-compose pull
docker-compose up

пятница, 28 октября 2022 г.

Парсинг сайтов через selenium

Скрейпинг сайтов с помощью библиотеки Selenium

Парсинг сайтов через python+bs4

 Понадобилось распарсить сайт хецнера для netbox, выбор пал на python+bs4

from bs4 import BeautifulSoup

import requests

Подключение, парсинг
 >>> r = requests.get('https://robot.hetzner.com/server/index/page/'+str(page), cookies=cookies)
>>> parsed = BeautifulSoup(page, "html.parser")

А теперь сами запросы

>>> print(parsed.head.title)

<title>Hetzner Online GmbH - Robot</title>

Вроде, несложно. Глянем заголовки meta

>>> print(parsed.head.meta)

<meta content="width=device-width, initial-scale=1, shrink-to-fit=no" name="viewport"/>

И.. всё? Бага, их там много. Но нужно запросить через find_all

>>> parsed.find_all('meta')

Выберет меты по всей доке и выдаст массивом. Также, можно например так найти див с классом box_wide

>>> servers = parsed.findAll('div', class_='box_wide')

Можно запросить поле из тэга, например - итог запроса выше присвоили переменной и дальше через for server in servers при такой записи тэга <div class="box_wide" id="555">

>>> server.get('id')

будет 555
Далее, есть такая конструкция
              <td class="title server_article">
               <span class="tooltip_underline jquery-tooltip" tooltip="This server includes unlimited traffic.">
                PX61-SSD #555
               </span>
значение "внутри" тэгов span читается через .string (или .text), например так
server.find('td', class_='server_name').find('span').string

Есть ещё такой вариант
server.find_all('span', class_='tooltip_underline jquery-tooltip')

но в данном случае будет 3 таких поля и нужно выделить нужный номер

Вообще, таблички лучше парсить через тот же pandas или на худой конец HTMLTableParser

Также, можно извратиться так
>>> parsed.find_all('table')[3].tr.td.span.string
и это даже будет работать, но читаемость - сами понимаете. Ну и чуть изменят поля и привет, поэтому лучше find_all (или findAll, что одно и то же)

links
https://www.crummy.com/software/BeautifulSoup/bs4/doc/ - тут есть всё нужное, но читать - много.


четверг, 15 сентября 2022 г.

mysql - некоторые хитрости

 Задача - скопировать таблицы из одной базы в другую, поменяв имя таблиц (добавить префикс). Можно сделать через mysqldump | sed | mysql, а можно так:

Первое заполнение можно сделать примерно так

SELECT concat('CREATE TABLE maindb.', TABLE_NAME, ' LIKE tmpdb.', TABLE_NAME, ';') FROM information_schema.TABLES  WHERE TABLE_SCHEMA = 'tmpdb';

SELECT concat('INSERT INTO maindb.', TABLE_NAME, ' SELECT * FROM tmpdb.', TABLE_NAME, ';') FROM information_schema.TABLES  WHERE TABLE_SCHEMA = 'tmpdb';

Но.. надо сохранить вывод в файл (например через mysql -b -e '...' > tmp.sql) и выполнить, а можно прямо в консоли mysql, будет дальше.

Без временного файла это будет выглядеть так

T1=$(mysql -b -s -r -e "SELECT concat('CREATE TABLE maindb.prefix_', TABLE_NAME, ' LIKE tmpdb.', TABLE_NAME, ';') FROM information_schema.TABLES  WHERE TABLE_SCHEMA = 'tmpdb';")

mysql -e "$T1"

T2=$(mysql -b -s -r -e "SELECT concat('INSERT INTO maindb.prefix_', TABLE_NAME, ' SELECT * FROM tmpdb.', TABLE_NAME, ';') FROM information_schema.TABLES  WHERE TABLE_SCHEMA = 'tmpdb';")

mysql -e "$T2"

Но, заполнили первый раз базу, обновляем - а теперь нужно сначала удалить все старые таблицы.

https://phoenixnap.com/kb/mysql-drop-table

(нюанс: мария 10.5 - не работает select * FROM information_schema.tables WHERE @schema = database();  - нужно убрать @schema = database(); )



вторник, 30 августа 2022 г.

Очередной косяк убунты

 За что я ненавижу убунту...

Ubuntu 21.10 - это далеко не EoL.

apt update

E: The repository 'http://archive.ubuntu.com/ubuntu impish Release' does not have a Release file.

N: Updating from such a repository can't be done securely, and is therefore disabled by default.

N: See apt-secure(8) manpage for repository creation and user configuration details.

E: The repository 'http://archive.ubuntu.com/ubuntu impish-updates Release' does not have a Release file.

N: Updating from such a repository can't be done securely, and is therefore disabled by default.

N: See apt-secure(8) manpage for repository creation and user configuration details.

E: The repository 'http://archive.ubuntu.com/ubuntu impish-security Release' does not have a Release file.

N: Updating from such a repository can't be done securely, and is therefore disabled by default.

N: See apt-secure(8) manpage for repository creation and user configuration details.

E: The repository 'http://archive.ubuntu.com/ubuntu impish-backports Release' does not have a Release file.

N: Updating from such a repository can't be done securely, and is therefore disabled by default.

N: See apt-secure(8) manpage for repository creation and user configuration details.

Нужно править /etc/sources.list и менять там какую-то ботву. В не-еол продукте! В той же центоси такой маразм начиная с 5 версии приходилось делать ровно 0 раз. А тут года не прошло. Уроды криворукие.

понедельник, 29 августа 2022 г.

про серты LE

 Для большинства баян, но.. если стоит очень старая система и не принимает даже валидные LE серты

curl: (60) SSL certificate problem: certificate has expired

sudo apt install -y ca-certificates
sudo sed -i '/^mozilla\/DST_Root_CA_X3.crt$/ s/^/!/' /etc/ca-certificates.conf
sudo update-ca-certificates

https://stackoverflow.com/questions/69408776/how-to-force-older-debian-to-forget-about-dst-root-ca-x3-expiration-and-use-isrg