пятница, 5 ноября 2021 г.

Prometheus mysqld_exporter

https://grafana.com/oss/prometheus/exporters/mysql-exporter/?tab=installation

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

wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.12.1/mysqld_exporter-0.12.1.linux-amd64.tar.gz
tar -zxvf mysqld_exporter*

воскресенье, 31 октября 2021 г.

oracle cloud + kubernetes

https://dragonflybsd.blogspot.com/2021/09/always-free-oracle-cloud.html


 Есть у оракла облако, и весьма интересно оно тем, что там можно получить 2 машинки по 1 гигу рам + 1 ядро, а также есть arm-based машины, зовётся Ampere, и там уже суммарно дают 4 ядра и 24 гига рам, то есть можно сделать хоть 1-1 (4 шт, дальше упрёмся в нехватку ядер), хоть 2-12+2-12, хоть 1 машину на все доступные ресурсы. Итого можно сделать от 1 до 4 виртуалок на арме + 2 на x86. Правда, есть нюансы с наличием, мне только через 2 недели повезло поймать завоз нового железа.

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

$ uname -i
aarch64

Так что, если есть желание разобраться, сначала читаем "что такое кубер"

И офсайт, в том числе по установке

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

Впрочем, есть автоустановка через kubespray

https://kubernetes.io/docs/setup/production-environment/tools/kubespray/

потом про кубер на арме, например на raspberry pi

https://habr.com/ru/company/flant/blog/435526/

https://habr.com/ru/company/skillfactory/blog/553212/

Читать интересно в том числе потому, что там есть и про диагностику, и более глубокое понимание системы.

Ну и обязательно для себя выбрать - k8s, MicroK8s, k3s, minicube


https://docs.oracle.com/en/operating-systems/oracle-linux/kubernetes/

суббота, 23 октября 2021 г.

Бэкапы mysql в 2021

 Кроме штатно mysqldump, который лочит таблицы, что вызывает в работе прода, есть весьма известный percona xtrabackup и сильно менее известный mariabackup

Отличия 2 утилит в том, что mariabackup это форк от xtrabackup, но там нужна целая матрица совместимостей -- тут можно только одним, там только другим, и между собой они совместимы не полностью. НО. Даже xtrabackup есть 2.4 и 8.0, и они тоже применимы в своих случаях! То есть 8.0 это только для mysql 8.0, для всех других версий ставить нужно строго 2.4.

Но и это не всё. mariabackup - судя по их сайту минимальная версия 10.2

The following MariaDB versions are currently supported:

mariadb-10.2

mariadb-10.3

mariadb-10.4

mariadb-10.5

Про xtrabackup можно почитать например это

https://habr.com/ru/post/520458/

Но сам бэкап ещё только пол дела, часто нужна информация о позиции в бинлоге (для поднятия слейва). Но и тут есть помощь, см

https://www.percona.com/doc/percona-xtrabackup/2.3/howtos/setting_up_replication.html

Ну и ещё чуть интересных ссылок

https://serveradmin.ru/polnyj-i-inkrementnyj-backup-mysql/

https://itc-life.ru/nastrojka-replikacii-mysql-s-pomoshhyu-xtrabackup-utility-percona/

https://minervadb.com/index.php/setup-mysql-slave-replication-with-percona-xtrabackup/

четверг, 14 октября 2021 г.

wscat vs websocat?

 Есть 2 утилиты для работы с ws

https://www.npmjs.com/package/wscat

https://github.com/vi/websocat

Первая ставится через npm, вторую можно просто скачать 1 файлом. А вот есть ли принципиальная разница?..

воскресенье, 3 октября 2021 г.

Некоторые особенности zfs

https://jrs-s.net/2017/03/15/zfs-clones-probably-not-what-you-really-want/

А всего-лишь нужно легковесное копирование, которое "поблочный клон данных и метаданных". У нас же CoW, там штатно используются "хардлинки" внутри фс, на тех же снапшотах. В лине реализуется cp --reflink, говорят btrfs умеет, а zfs - нет.

Костыль:

https://manpages.debian.org/testing/zfsutils-linux/zfs-promote.8.en.html

воскресенье, 26 сентября 2021 г.

terraform+aws, первые шаги

 Установка: если раньше надо было качать архивы и распаковывать, то уже (давно) есть фирменные репы, например 

https://www.terraform.io/docs/cli/install/apt.html

Дальше есть видео на офсайте

https://learn.hashicorp.com/tutorials/terraform/aws-build

В частности, надо поставить aws cli и получить Access Key (нужные линки под видео)

Дальше описываем provider и resource. При этом даже офдока создаёт путаницу, где описан в первом варианте единственный блок

module "ec2_instance" {

(под terraform >= 0.13.1)
Хотя если читать дальше, что это вроде как "наследовано" и классическая схема с resource работать будет ровно также.

После установки и запуска базового примера крайне советую смотреть лист от adv-it, там очень многое рассказано.


Далее, на одном из сайтов из топ-5 гугла есть такое описание ресурса
public_key = "${file("terraform-demo.pub")}"
но уже с 0.11 оно устарело:
Terraform 0.11 and earlier required all non-constant expressions to be
provided via interpolation syntax, but this pattern is now deprecated. To
silence this warning, remove the "${ sequence from the start and the }"
sequence from the end of this expression, leaving just the inner expression.

Вообще, если нашли какую-то доку и там проверили версию - смотрите чтобы было ну хотя бы 0.12, если меньше то относитесь к материалу скептически, оно могло устареть напрочь.

среда, 8 сентября 2021 г.

How to collect and manage all of your multi-line logs

https://www.datadoghq.com/blog/multiline-logging-guide/

Рассматривается в контексте elasticsearch, но применимо к любым обработчикам.

Вкратце: при выводе ошибки в несколько строк, их неудобно обрабатывать. Поэтому нужно или перейти на формат json, или применить "log shipper" -- парсеры, которые умеют склеивать сообщения в одно.

logstash, rsyslog, fluentd, syslog-ng, nxlog, datadog

 

понедельник, 6 сентября 2021 г.

Always Free oracle cloud

 Штатно оракл даёт 2 машины формата амазона t2.micro, а именно 2 машины по 1 ядру и 512 мб рам. А также - машины на базе арма с лимитом 4 ядра, 24 гиг рамы, то есть можно создать от 1 до 4 серверов (упираемся именно в ядра, потому что можно создать машину формата 1 ядро, 1 гиг рамы)

Но косяк в том, что услуга востребована и часто машин просто нет, поэтому надо изучать oracle CLI и регистрировать машины через крон.

https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/cliinstall.htm


Получаем бесплатные сервера в Oracle Cloud Free Tier

Oracle Cloud: PHP скрипт, когда сильно хочется бесплатный VPS 4 ядра ARM/24ГБ памяти

Создаём мини PHP SDK для подписи запросов к Oracle Cloud Infrastructure API

https://docs.oracle.com/en-us/iaas/Content/API/Concepts/cliconcepts.htm

Oracle Cloud: бесплатный VPS 4 ядра ARM/24ГБ памяти: решаем проблему большого спроса (OCI CLI)

https://blogs.oracle.com/cloud-infrastructure/post/moving-to-ampere-a1-compute-instances-on-oracle-cloud-infrastructure-oci


суббота, 4 сентября 2021 г.

Сломанная ubuntu 20.04 (LTS)

https://serverfault.com/questions/1041031/nginx-sometimes-gets-killed-after-reloading-it-using-systemd

https://bugs.launchpad.net/ubuntu/+source/perl/+bug/1897561/

Короче, если ставим nginx-extras то ставится бажный перл

Быстрофикс: удаляем /etc/nginx/modules-enabled/50-mod-http-perl.conf

Проблема в том, что баге уже год, но "дебиан стабилен" (ubuntu - debian based), так что и в багах он тоже стабилен...

вторник, 31 августа 2021 г.

Дроп базы postgesql

Первым делом смотрим базы

\l

!!! и выбираем базу

\c our_database

Ну а теперь удаляем 

DROP SCHEMA public CASCADE;
CREATE SCHEMA public;
 

If you are using PostgreSQL 9.3 or greater, you may also need to restore the default grants.

GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;

https://stackoverflow.com/questions/3327312/how-can-i-drop-all-the-tables-in-a-postgresql-database/13823560#13823560

Если не выбрать базу - удалим вообще всю информацию...

Масштабируем / без LVM

 Взяли сервер в gcore, а там / оказался всего 3гб по умолчанию. Увеличили в панели до 10, а дальше -- всего 2 команды

growpart /dev/sda 1

resize2fs /dev/sda1

Всё, у нас в системе 10 гиг.

среда, 21 июля 2021 г.

ansible, vault, strings

 Есть удобная утилитка ansible-vault, но она шифрует сразу весь файл. Если это файл с переменными - удобнее когда шифрованы только значения ключей, в том числе при контроле гитом - любое изменение локализуется легко, в случае волта меняется весь файл.

Дешифрование строки

Вот с расшифровкой такого файла беда, ansible-vault уже не понимает что от него хотят (будет ERROR! input is not vault encrypted data. (file) is not a vault encrypted file for (file)), поэтому есть несколько вариантов посмотреть:

1) копируем строку после !vault в файл и далее ansible-vault view ...

2) через дешифровальную буку

   - hosts: localhost

     tasks:

       - debug:

           msg: "{{ secret_value }}"

3) через ansible -m debug, но оно работало до 2.8, там синтаксис будет такой

ansible localhost -m debug -a var="some_var" -e "@file.yml" --ask-vault-pass

Вместо ask можно использовать --vault-password-file (file)

Шифрование строки

А как же зашифровать эту строку?

ansible-vault encrypt_string --ask-vault-pass --stdin-name some_var

спросит два раза пароль волта. 

!!! Потом вводим значение и не нажимая энтер нажимаем два раза ctrl-d

вторник, 13 июля 2021 г.

postgres, расширенный вывод

 Иногда бывает нужно вывести записи как в mysql \G, тут для этого есть тоже команда

\x
select * from sometable;

Вариант 2, с переключением формата

select * from users \x\g\x

И третий, выводить всегда в расширенном виде, даже если уже сделано \x

select * from sometable \gx

https://serverfault.com/questions/34741/postgres-equivalent-to-mysqls-g

postgresql проверка репликации


I use following SQL queries to check status on Postgres v11 usually.

On master:

select * from pg_stat_replication;

On replica (streaming replication in my case):

select * from pg_stat_wal_receiver;
https://stackoverflow.com/questions/43388243/check-postgres-replication-status
И очень полезный совет
For vertical output replace ; with \x\g\x

Такой вот замороченный аналог mysql-ного \G

Ещё несколько запросов для слейвов
select pg_is_in_recovery();
select pg_last_xlog_receive_location();
select pg_last_xlog_replay_location();
SELECT CASE WHEN pg_last_xlog_receive_location() = pg_last_xlog_replay_location()
                  THEN 0
                ELSE EXTRACT (EPOCH FROM now() - pg_last_xact_replay_timestamp())
              END AS log_delay;



пятница, 9 июля 2021 г.

Работаем с логами

 Для начала, очень рекомендую познакомиться с journalctl, это весьма гибкая система, сделанная как замена syslog-у. Главные отличия - кольцевой буфер для логов, что с одной стороны значит "место не может кончиться от жирного лога", с другой - если нам нужны эти логи то нужны ещё сервисы по их извлечению, парсингу, хранению, ротации; а также вместо Local* работаем по именам сервисов

При этом есть и другие удобные плюшки, вида выдачи лога в нужном формате (-o json)

Если нужен вывод в syslog, есть штатные механизмы (но очень редко они сбоят)

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

Очень годная статья по journalctl

https://www.digitalocean.com/community/tutorials/how-to-use-journalctl-to-view-and-manipulate-systemd-logs

По настройке связки

https://www.loggly.com/ultimate-guide/centralizing-with-syslog/

И теперь мы можем использовать journalbeat для выгрузки логов.

понедельник, 28 июня 2021 г.

Dell USB3.0 dock D3100 + ubuntu

 Вроде неплохой док, но его особенность - "из коробки" он работает по сути только как усб хаб + аудио, а вот видео порты не работают. Нужно качать драйвера, но на сайте dell их просто нет (точнее, там заявлена поддержка только windows). И гуглинг находит такой линк

http://www.displaylink.com/downloads/ubuntu

новая ссылка

https://www.synaptics.com/products/displaylink-graphics/downloads/ubuntu

суббота, 19 июня 2021 г.

CI/CD и .NET в докере

Есть несколько вариантов сборки

windows  based

Если открыть шаблоны гитлаб, там есть несколько вариантов под с шарп, но там в основе идут виндовые образы


linux based

mcr.microsoft.com/dotnet/core/sdk:3.1

! note

Bear in mind that since the release of .NET 5, the repository path changed to mcr.microsoft.com/dotnet/sdk:3.1. Here is a link to the rename anouncement: github.com/dotnet/dotnet-docker/issues/2375

при это стадии сборки будут такие

dotnet restore

dotnet build

dotnet publish

На самом деле, там чуть более сложный синтаксис, например для restore можно указать имя проекта, для publish - куда публиковать итог, -o ./publish/

и так далее.

Есть вариант с image: microsoft/dotnet:latest
но там есть какие-то нюансы с версиями

Чуть линков: 1 (кодероад помойка, но оригинал не нагуглился), 2, 3, 4, 5


versions in docker-compose

В начале docker-compose.yml всегда пишется версия компоуза, что когда появилось - нужно читать тут (матрица версий, полная дока). При этом может быть так, что пишем версию 3.9 - а докер что у нас установлен такой версии не знает, нужно снижать. Но снизив версию и больше не получая ошибок про указанную версию, можно получать ошибки про использование новых атрибутов. Например, убунта 18.04, докер и docker.io, вписываем версию 3.5-3.7 (выше ругается), но при этом ошибка (ниже в ошибки впишу)


Про ошибки

ERROR: Version in "./Docker/docker-compose.yml" is unsupported. You might be seeing this error because you're using the wrong Compose file version. Either specify a supported version (e.g "2.2" or "3.3") and place your service definitions under the `services` key, or omit the `version` key and place your service definitions at the root of the file to use version 1.

Снижаем версию или ищем как обновить инсталляцию

ERROR: The Compose file './Docker/docker-compose.yml' is invalid because:
networks.form_constructor value Additional properties are not allowed ('name' was unexpected)
То, что описано выше. При этом данный тэг заявлен в 3.5 и на неё валидатор не ругался.

пятница, 4 июня 2021 г.

phpipam - знакомство и api

Если уж довелось работать с phpipam, начать лучше с чтения оф доки и его установки в докере. Например, отсюда

https://github.com/pierrecdn/phpipam

если взять блок из docker-compose, не надо ставить ни баз, ничего.

!! Это хорошо для ознакомления, но база в докере в проде - не лучшее решение !!

Есть другой вариант

https://hub.docker.com/r/phpipam/phpipam-www (github)


 Тепреь посмотрим  на его апи

https://phpipam.net/api/api_documentation/

Клиенты:

https://phpipam.net/api/phpipam-api-clients/

https://github.com/phpipam/phpipam-api-clients


После установки в докере (да и скорее всего в любой) если включить PowerDNS то он не заработает. Во-первых, надо прописать правильный хост. Во-вторых, подключиться к БД и завести юзера и базу ИЛИ указать текущего рута.. и создать базу. Так что лучше создать всё самому. В-третьих, база сама не заполнится (что я вполне могу назвать рукожопством, могли бы чуть доделать и по предоставленному рутовому доступу всё заполнить + иметь кнопку в вебе для деплоя нужного дампа бд), нужно найти порядок действий (линк ниже) и пролить базу руками.

https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-powerdns-with-a-mariadb-backend-on-ubuntu-14-04 step 4

!!! Схема бд - "не та". Нет disabled полей как минимум. Второе рукожопство - открываем оф доку, берём оттуда дамп

https://doc.powerdns.com/authoritative/backends/generic-mysql.html#default-schema

Вроде всё ок, но после создания домена опять получаем Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'change_date' in 'field list'. Находим issue и видим ещё линк

https://doc.powerdns.com/md/authoritative/howtos/#basic-setup-configuring-database-connectivity

Что на выходе? На сайте phpipam нет нужной схемы. И в репе нет. И линков нет, только по issue собирать. И даже офсайт схемы pdns противоречат друг другу.

Вишенка на торте. Днс не заработает после активации, так как нужно сам pdns поставить ОТДЕЛЬНО. В общем, очередная формальная вещь, которую никто нигде не смог нормально описать.

Берите netbox...


О репликации есть такое
https://www.digitalocean.com/community/tutorials/how-to-configure-dns-replication-on-a-slave-powerdns-server-on-ubuntu-14-04

но надо ещё изучить вопрос. Дело в том, что можно поднять несколько powerdns в режиме подключения к БД (одной или нескольких с репликацией), а также про режим без общей БД с NOTIFY. И powerdns native vs master

среда, 26 мая 2021 г.

Инвентаризация хостов и сетей

 Когда много хостов и/или сетей, нужно вести их учёт. Это называется IPAM - IP address management.

Типичные представители

- phpIPAM

- netbox (и его форк nautobot)

- RackTables

- SolarWinds IP Address Manager

- Opendcim

По моему мнению, лучше смотреть на netbox.

четверг, 20 мая 2021 г.

LogStash vs filebeat

 https://logz.io/blog/filebeat-vs-logstash/

Если очень вкратце, они друг друга не заменяют, а дополняют. logstash написан на жаве и весьма тяжёл, при этом filebeat (является частью Beats, подробнее тоже в линке выше) написан на go и потому лёгкий, но не умеет в серьёзную обработку. Поэтому для прода лучше вынести logstash вообще на отдельную машину, и закидывать туда данные через filebeat.

И по настройке - смотрим статью.

Есть и офдока

https://www.elastic.co/guide/en/beats/filebeat/7.0/filebeat-getting-started.html

Но. Иногда можно и отказаться от logstash совсем, используя ingress pipeline и перенеся обработку тех же access_log сразу в elasticsearch.


Итого.

filebeat - сбор и доставка логов (плюс предобработка через фильтры)

logstash - парсит логи в документы

Elasticsearch - хранит и индексирует документы

Kibana - поиск, аггрегирование, показ нужных данных.

вторник, 18 мая 2021 г.

Мониторинг для Kubernetes

 Если мы взяли не готовый продукт, а чистый кубер, там нет многого нужного. Сейчас рассмотрим мониторинг. Статья содержит много ссылок, потому что информации много, читать лучше в первоисточнике, и понимать все варианты. При этом не стоит читать только статьи вида "9 утилит" - нужно понимать, КАК оно будет работать, раскатываться, собирать, куда заливать... Что такое heapster, DaemonSet, operator и так далее.

Установка Kubernetes через kubeadm

 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/

Установку kubectl kubeadm kubelet пропускаем, это по доке делается на раз.

Перед настройкой нужно доставить некоторые пакеты

# Pull images (apiserver, controller-manager, scheduler, proxy, etcd, coredns)

kubeadm config images pill

И теперь совсем базовая инициализация выглядит так

sudo kubeadm init --pod-network-cidr 10.244.0.0/16

В итоге, нам
1) создаст /etc/kubernetes/admin.conf
2) выдаст строку для подключения других нод к нашему мастеру, начинаться будет с kubeadm join
3) поставит и запустит нужные сервисы

И теперь мы можем работать под своим юзером с кластером (команды пускаем от юзера!)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Если что-то запороли -- ничего страшного!
sudo kubeadm reset

Но.. у нас не работает сеть. Потому что теперь нужно поставить сеть :) Гуглим calico, flannel или в общем случае - CNI. Тоже обязательно понять, что там происходит и как оно работает.

Линки

понедельник, 17 мая 2021 г.

Что такое kubernetes operator

Операторы для Kubernetes: как запускать stateful-приложения


И пример оператора

shell-operator v1.0.0: долгожданный релиз нашего проекта для Kubernetes-операторов

Другой пример - framawork для создания своих операторов

https://github.com/nolar/kopf

Kopf —Kubernetes Operator Pythonic Framework— is a framework and a library to make Kubernetes operators development easier, just in a few lines of Python code.


Правда, чаше операторы используют для БД или мониторинга.

четверг, 29 апреля 2021 г.

Ubuntu: passwordless login with YubiKey 5

https://askubuntu.com/questions/1167691/passwordless-login-with-yubikey-5-nfc



Читать лучше целиком. И краткий пересказ

sudo apt install libpam-u2f

pamu2fcfg | sudo tee /etc/u2f_mappings

# По комментам, лучше писать

# pamu2fcfg -u USERNAME | tee /etc/u2f_mappings

# OR (from root only)


# pamu2fcfg -u USERNAME >> /etc/u2f_mappings

После этого обновляем pam.d/ конфиги, добавляя auth sufficient pam_u2f.so ко всем связанным сервисам: gdm-password lightdm sudo login

sudo -i
cd /etc/pam.d
echo 'auth sufficient pam_u2f.so authfile=/etc/u2f_mappings cue' > common-u2f
for f in gdm-password lightdm sudo login; do
mv $f $f~
awk '/@include common-auth/ {print "@include common-u2f"}; {print}' $f~ > $f
done
exit

Момент в том, что проверять ключ нужно ДО @include common-auth

При этом можно сделать нормальный 2FA, ожидая касания ключа ПОСЛЕ ввода пароля. Для этого строка чуть меняется (и ставится ПОСЛЕ @include common-auth):

auth required pam_u2f.so
Нужно понимать, что так без ключа войти не получится!

суббота, 24 апреля 2021 г.

postfix, dkim, debian

Установка

sudo apt install opendkim opendkim-tools

После установки конфиг лежит в /etc/opendkim.conf

Теперь надо настроить - создать несколько файликов и ключи

mkdir -p /etc/opendkim/keys
chown -R opendkim:opendkim /etc/opendkim
chmod go-rw /etc/opendkim/keys

 Теперь нам нужно в /etc/postfix/main.cf указать, где искать dkim файлы

ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts
InternalHosts            refile:/etc/opendkim/TrustedHosts
KeyTable                 refile:/etc/opendkim/KeyTable
SigningTable             refile:/etc/opendkim/SigningTable

Также, там есть ещё ряд настроек

AutoRestart             Yes
AutoRestartRate         10/1h
UMask                   002
Syslog                  yes
SyslogSuccess           Yes
LogWhy                  Yes

Canonicalization        relaxed/simple

Mode                    sv

UserID                  opendkim:opendkim

Umask, Syslog уже есть в оригинальном конфиге, их можно не копировать.

Замечание на тему Socket: если нужно работать через tcp, формат такой: inet:12301@localhost, но по умолчанию открывается Unix socket в /var/run/opendkim/opendkim.sock (легко проверяется через netstat -plan | grep dkim). И если надо переопределить, то по ряду мануалов это делается в /etc/default/opendkim

Ключ генерируется так

sudo -u opendkim opendkim-genkey -s <some_name> -D /etc/opendkim/keys -d <yourdomain.com> -b 2048

!!! В некоторых мануалах перепутаны -b и -s. -b это СКОЛЬКО БИТ ключ, а -s это префикс для dns, так называемый селектор! Тот что <some_name>._domainkey, если планируется несколько мест для отправки - лучше использовать технический префикс сервера типа srv01, и избегать имён вида mail - может быть конфликт с рядом сервисов автогенерации, включая почту от яндекса - мне и такое довелось увидеть...

И второй момент -- после создания ключа файлы создаются только по селектору без учёта доменов, поэтому лучше в keys сразу создать папку с доменом и в -D поправить на keys/<yourdomain.com>. Ниже keyTable с учётом этой папки.

Теперь лучше записать публичную часть в dns

cat /etc/opendkim/keys/<yourdomain.com>/<some_name>.txt

Теперь надо заполнить файл, где описаны для каких доменов какие селекторы подключать.

В /etc/opendkim/KeyTable

 <some_name>._domainkey.<yourdomain.com> <yourdomain.com>:<some_name>:/etc/opendkim/keys/<yourdomain.com>/<some_name>.private

В /etc/opendkim/TrustedHosts пишем хосты, которые будут подписаны нашей подписью, обычно это только сама машина

127.0.0.1
localhost
# можно указать подсети, вида 192.168.0.0/24

В /etc/opendkim/SigningTable пишем, каким ключом что подписываем

*@<yourdomain.com> <some_name>._domainkey.<yourdomain.com>

 Не путаем KeyTable и TrustedHosts! В KeyTable - где искать ключи по домену и селектору, а TrustedHosts - каким ключом подписываем почту для каких адресов. Можно вообще сделать отдельные ключи для отдельных ящиков.

проверьте, что в /etc/postfix/main.cf

    # Milter configuration
    # Postfix ≥ 2.6 milter_protocol = 6, Postfix ≤ 2.5 milter_protocol = 2
    milter_protocol = 6
    milter_default_action = accept
    smtpd_milters = unix:/var/spool/postfix/var/run/opendkim
    non_smtpd_milters = unix:/var/spool/postfix/var/run/opendkim

И перезапустите opendkim, postfix

 

Проверка

после настройки opendkim можно обнаружить в mail.log:

postfix/cleanup[13428]: warning: connect to Milter service unix:/var/run/opendkim/opendkim.sock: No such file or directory

Хотя и файл такой есть, и с правами всё хорошо. Но, слава chroot, работать так не будет.

Фикс:

  1. Then do the following

    sudo adduser postfix opendkim
  2. Postfix running in chroot

    Modify /etc/default/opendkim, change SOCKET option to postfix chroot location

    SOCKET="local:/var/spool/postfix/var/run/opendkim/opendkim.sock"

    You will have to create directory /var/spool/postfix/var/run/opendkim and change its permission

    sudo mkdir -p /var/spool/postfix/var/run/opendkim
    sudo chown opendkim:opendkim /var/spool/postfix/var/run/opendkim
    
  3. Restart opendkim

    sudo service opendkim restart
    https://unix.stackexchange.com/questions/74477/postfix-smtpd-warning-connect-to-milter-service-unix-var-run-opendkim-opendki

 

Links

Относительно свежая дока, но читать аккуратно

https://www.linode.com/docs/guides/configure-spf-and-dkim-in-postfix-on-debian-9/

Вроде и официальная, но очень старая

https://wiki.debian.org/opendkim

пятница, 23 апреля 2021 г.

Выбор платформы для Kubernetes

 Если хочется поставить k8s, есть несколько путей, которые будут чуть ниже. При этом готовые продукты это не просто "красивый инсталлер", это ещё и дополнительное ПО - веб из коробки, мониторинг из коробки, RBAC, автомасштабирование, сбор логов -- это "базовый набор". При этом часто автоматом настраивается CI/CD, хранилища.

Rancher

По сути это веб-интерфейс с некоторыми плюшками типа мониторинга, автомасштабирования из коробки.

Сам rancher - изначально делался для расширения возможностей докера, чем потом стал заниматься docker swarm. rancher был "надстройкой" с выбором основы: Cattle, Docker Swarm, Apache Mesos (upstream project for DCOS) or Kubernetes, но похоже что в 2.х оставили только kubernetes.
Ветку советую глянуть.
Если я правильно понял доку, rancher даёт возможность собрать кластер, где часть нод - условный aws eks, часть - gcp, а часть вообще свои сервера.

На обычный хост ставится несложно, но требует установленный докер
sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 --privileged rancher/rancher

В облака ставится через terraform


kubeflow

В некотором смысле аналог ранчера, но больше с заточкой под ML.
Пара статей для более быстрого введения

OpenShift

Платный продукт от RedHat. Если хочется серьёзное решение, с серьёзной платной поддержкой - это сюда. То, что называется Enterprise Kubernetes. С нужными сертификатами и прочим. Дорого.

Kubernetes by Canonical

Да, есть и такое.

Облачные решения

Имеются в виду такие вещи как aws eks, mail.ru kubernetes (главная страница), yandex kubernetes и так далее, продуктов сотни. Развёртывание - на уровне "создать кластер скриптами", проблемы под капотом обычно неизвестны, но предсказать из невозможно, обезопаситься - сложно. Если нет кучи кубер спецов -- не самый дешёвый, но хороший вариант, снимающий много головной боли и убирающий потребность в сильной DevOps команде.

Руками

Имеется в виду kubeadm, kubespray и подобное. Надо понимать, что будет поставлена только "база", хранилища (ceph, glusterfs), обрабтку логов (ELK и аналоги), мониторинг (prometheus+grafana) надо ставить и сопровождать отдельно.

Готовые сравнения продуктов


Место для тренировок

Есть 4 часа, можно поднять несколько серверов и собрать в кластер.

Итого

Мало взять rancher или openshift. Кластер может просто сломаться, может не пройти миграция на новую версию и всё что угодно. Поэтому если цель - быстро развернуть демо-стенд или поднять дома тестовый кластер, то такие вещи как rancher удобны и адекватны. Но если планируется зарабатывать так деньги -- нужно или купить платную поддержку, или хорошо знать устройство того что стоит, уметь это мониторить, диагностировать и отлаживать. И для готовых образов вопросы мониторинга важнее чем установленной системы руками. Потому что всё когда-то ломается, нужно уметь видеть узкие места и прогнозировать - что, когда и где может пойти не так, как уменьшить шанс отказов и как чинить если отказ был. И по мере установки руками многие моменты становятся понятны, и если там что-то начало сбоить - понятно какие там компоненты применялись и примерно что могло сломаться.

И отдельный вопрос - как хранить данные.

Напоследок - всегда помнить про бэкапы. Лучше несколько дней быть недоступным, но в итоге опять развернуться, чем не развернуться больше никогда (тут привет тем, кто был в датацентре OVZ). Ну и иметь просто возможность отката при любых авариях/косяках.

Provisioning Grafana

 Перейдя сразу к сути:

https://grafana.com/docs/grafana/latest/administration/provisioning/

Пишутся .yaml файлы, которые нужно потом положить в папку provisioning и далее по типам, например datasources, plugins, dashboards, notifiers. Сами же файлики очень удобно при этом хранить в гите, получая полный контроль над тем, что и как показывается и кто, что, когда правил.

Формат там несложный и хорошо описан в доке. Так что доку читать обязательно и в любом случае!

четверг, 22 апреля 2021 г.

yubikey+ubuntu

 Есть такой интересный аппаратный ключик YubiKey (2) (также есть редакции TypeC и мелкие nano). Так вот, для настройки ключа есть пакет yubikey-manager (в маке opensc+ykman). Но что делать, если такого нет, например в убунте 18.04?

среда, 14 апреля 2021 г.

Более быстрые варианты дисков

 Бывает, что нужно много IOPS, и/или очень много пропускной способности, и нам на помощь приходит NVME. Многие знают его по слоту m.2 на материнках, но также есть "внешние" варианты NF1 и более "привычный" формат U.2

Описание формата

https://habr.com/ru/company/kingston_technology/blog/369729/


Примеры:

U.2

https://www.supermicro.com/en/products/system/1U/1029/SYS-1029U-TN10RT.cfm

NF1

https://nvme.smb-solution.ru/supermicro-1029p-nmr36l-32x-nvme-nf1/

четверг, 18 марта 2021 г.

Немного о говнокодерах в убунте

 Есть обычная LTS убунта, никого не трогает, по apt install php ставится версия 7.4 (в 20.04). Но нам нужен пхп 5.6 ВТОРЫМ. Ок, ставим

sudo apt install software-properties-common

sudo add-apt-repository ppa:ondrej/php

Теперь по apt install php5.6 ставится 5.6, вроде всё хорошо... А нет.


# apt info php | grep Version

Version: 2:8.0+82+ubuntu20.04.1+deb.sury.org+1

# apt-cache policy php

php:

  Installed: 2:7.4+75

  Candidate: 2:8.0+82+ubuntu20.04.1+deb.sury.org+1

То есть теперь, если мы используем штатную версию 7.4, по условному apt install php-curl нам прилетит совершенно бесполезная версия 8.0. Что называется, ПРЕВЕД. При этом reconfigure не помогает

# dpkg-reconfigure php

#
# update-alternatives --config php 
это тоже чуть про другое, выбор версии из уже установленных.

Впрочем, это рукожопство лечится. Идём в /etc/apt/preferences.d/ и пишем файлик (какой? Синтаксис там совершенно мерзейший, типичный говнокод в действии - у того же центос прямо в .repo пишем что исключаем из данной репы и живём спокойно). Так что вариант - ppa поставили, нужное поставили, потом из /etc/apt/sources.list.d убрали/удалили.


среда, 17 марта 2021 г.

ubuntu, php, xhprof

"XHProf был разработан Facebook и заброшен , когда они переехали в HHVM. Теперь есть fork проекта под названием Tideways , который обещает добавить поддержку PHP версий 5.6 и 7."

Хотя если перейти на http://pecl.php.net/package/xhprof то версия 2.2.3 там от конца 2020 года...

Итого: можно ставить так

apt install php-pear

apt install php-dev # phpize

pecl install -f xhprof
Build process completed successfully
Installing '/usr/lib/php/20190902/xhprof.so'
install ok: channel://pecl.php.net/xhprof-2.2.3
configuration option "php_ini" is not set to php.ini location
You should add "extension=xhprof.so" to php.ini
Вносим в /etc/php/7.4/mods-available/xhprof.ini

extension=xhprof.so
xhprof.output_dir="/tmp/xhprof"

и в /etc/php/7.4/cli/conf.d делаем ln -s /etc/php/7.4/mods-available/xhprof.ini 20-xhprof.ini

повторить для апача или fpm


или через tideways (веб версия - платно! Сам xhprof вроде нет, но там формат другой, нужно переписывать код)

https://tideways.com/profiler/xhprof-for-php7

https://github.com/tideways/php-xhprof-extension

https://github.com/tideways/php-xhprof-extension/releases

https://gist.github.com/snoek09/72d0563d350fcc9ea6117790eeb6e60f


GUI

https://github.com/perftools/xhgui

apt install mongodb

#pecl install mongodb

apt install php-mongodb

systemctl enable mongodb

grep bind /etc/mongodb.conf # обязательно проверяем что есть bind_ip и он не выставлен в 0.0.0.0 - это чревато! Должно быть 127.0.0.1

systemctl restart mongodb

echo 'extension=mongodb.so' > /etc/php/7.4/mods-available/mongodb.ini

и повторяем включения

apt install composer

composer install --no-dev

curl 127.0.0.1:8080/install.php


вторник, 16 марта 2021 г.

werf+Jenkins

Настраиваем Continuous Integration для Jenkins и Bitbucket с werf

werf

 Есть такая надстройка над helm - werf

Утилита не сложная, по набору документации быстро изучается (русский язык там есть, и проработан неплохо).

Но очень важный момент - на данный момент stable - версия 1.1, а дока пишется под пока ещё beta 1.2. И есть существенные отличия в синтаксисе, поэтому на 1.1 по доке 1.2 будут нюансы. Есть и по 1.1 (сверху переключатель), но там нет руководств по быстрой настройке таких вещей как nodejs (2), ruby, django...

А так, есть куча видео на ютубе и куча статей на хабре, зачем нужна эта утилита.

суббота, 13 марта 2021 г.

Быстрое введение в Clickhouse

 Есть такая бд от яндекса, и неплохое описание на хабре и офсайте.

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

Также нюанс, который редко описывают в доках. Там нет штатной бэкапилки, работа вида "скопировать и потом вернуть на место файлы бд".

Второй нюанс - внутри оно обмазано ZooKeeper-ом, так что его надо уметь ставить, обслуживать и чинить.

Ну и SQL вроде типовой, а вроде и не очень, есть нюансы.

И небольшая обучалка

четверг, 4 марта 2021 г.

k8s - livenessProbe vs readinessProbe

 https://stackoverflow.com/questions/55423405/k8s-livenessprobe-vs-readinessprobe

Liveness probes в Kubernetes могут быть опасны

Настройка Liveness, Readiness и Startup проб

Ubuntu 20.04 и сканер отпечатков

 Fingerprint GUI is no longer maintained and is not compatible with Ubuntu 20.04 and newer. There is a built-in fingerprint login feature in 20.04 under Settings->Users->Authentication & Login.

https://askubuntu.com/questions/1231357/fingerprint-gui-not-installing-in-ubuntu-20-04

Некоторые нюансы с mysql

20 советов по оптимальному использованию MySQL (в том числе про ORDER BY RAND() - а как это лучше заменить, есть несколько решений)

 почему * это плохо

пятница, 12 февраля 2021 г.

k3s

По сути, установка k3s сводится к запуску команды

curl -sfL https://get.k3s.io | sh -s

После этого всё поставится, поднимутся мастер и воркер.

вторник, 2 февраля 2021 г.

Yandex.cloud + Packer

 https://cloud.yandex.ru/docs/solutions/infrastructure-management/packer-quickstart

А вообще интересная дока, можно ещё много интересного почитать, в том числе по другим утилитам (сборка через jenkins, gitlab итд)