Настройка DKIM с Postfix в Centos

Для того чтобы письма, отправленные с сервера не попадали в СПАМ, требуется корректно настроить DKIM и SPF, настройка DMARC является желательной, но не обязательной для корректного прохождения почты.

Настройка корректна для версий Centos 7 и 8.

Установим Postfix:

yum install postfix
systemctl enable postfix

Настройки подойдут дефолтные. Обратить внимание стоит на имя сервера, так как по-умолчанию Postfix берет именно его при отправке в качестве FROM.

В случае с PHP переопределить это значение можно используя опцию -f. Например для PHP-FPM просто переопределить отправителя, задав в настройках пула, обслуживающего сайт:

php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f noreply@nagg.ru
Продолжить чтение

MySQL: возможность подключения к localhost, но не к 127.0.0.1

Сегодня на Debian 9 столкнулся с проблемой что я не могу подключиться к 127.0.0.1, используя MySQL (MariaDB), хотя подключение через localhost работает.
Сначала я создал пользователя 'root'@'127.0.0.1':

mysql > CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY '<redacted>';
mysql > GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;

Хэши паролей идентичны:

MariaDB [(none)]> select user,host,password from mysql.user;
+-----------+-----------+-------------------------------------------+
| user      | host      | password                                  |
+-----------+-----------+-------------------------------------------+
| root      | localhost | *B68A25C6C6C902646A985996A0716AD431CFA799 |
| root      | 127.0.0.1 | *B68A25C6C6C902646A985996A0716AD431CFA799 |
+-----------+-----------+-------------------------------------------+
2 rows in set (0.00 sec)
Продолжить чтение

MacOS: sudo по отпечатку пальца

Тем кто часто работает с командной строкой, как и я, приходится каждый раз вбивать пароль при работе через sudo, что не так удобно, как отпечаток пальца, к которому нас приучили Apple с новыми версиями Mac Book :) Чтобы включить ввод пароля по отпечатку, нужно добавить в файл /etc/pam.d/sudo первой строкой:
# sudo: auth account password session
auth       sufficient     pam_tid.so
Продолжить чтение

How to scale kubernetes daemonset to 0?

В случае когда не хочется удалять daemonset, есть один интересный воркэраунд с использованием временного nodeSelector с несуществующим label, например:
kubectl -n <namespace> patch daemonset <name-of-daemon-set> -p '{"spec": {"template": {"spec": {"nodeSelector": {"non-existing": "true"}}}}}'
После этой команды daemonset будет заскейлен в 0. Если нужно восстановить daemonset, то нам просто нужно удалить nodeSelector:
kubectl -n <namespace> patch daemonset <name-of-daemon-set> --type json -p='[{"op": "remove", "path": "/spec/template/spec/nodeSelector/non-existing"}]'
В стандартном варианте можно сделать бэкап daemonset и удалить его, а когда потребуется - восстановить:
kubectl get daemonset <name-of-daemon-set> -n <namespace> -o yaml

Asterisk: определение региона по номеру телефона с использованием PHP и БД

Для реализации решения мы используем данные выписки из реестра российской системы и плана нумерации: https://rossvyaz.gov.ru/deyatelnost/resurs-numeracii/vypiska-iz-reestra-sistemy-i-plana-numeracii, PHP скрипт, который обрабатывает данные и заносит в БД. Скачиваем базу кодов:
wget -N https://rossvyaz.gov.ru/data/DEF-9xx.html
wget -N https://rossvyaz.gov.ru/data/ABC-8xx.html
wget -N https://rossvyaz.gov.ru/data/ABC-4xx.html
wget -N https://rossvyaz.gov.ru/data/ABC-3xx.html
Создаем пользователя и базу данных:
CREATE USER 'asterisk_reg_number'@'localhost' IDENTIFIED BY 'XXXXXXXX';
CREATE DATABASE IF NOT EXISTS `asterisk_reg_number_db` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON `asterisk_reg_number_db`.* TO 'asterisk_reg_number'@'localhost';
Подключаемся к базе под созданным пользователем и создаем таблицу num:
mysql -uasterisk_reg_number -p'XXXXXXXX' asterisk_reg_number_db
CREATE TABLE `num` (
`def` smallint(6) NOT NULL,
`start` int(11) NOT NULL,
`finish` int(11) NOT NULL,
`count` int(11) NOT NULL,
`operator` varchar(64) NOT NULL DEFAULT '',
`region` varchar(128) NOT NULL DEFAULT '',
`region_last` varchar(64) DEFAULT NULL,
`region_first` varchar(64) DEFAULT NULL,
KEY `a_b` (`def`,`start`),
KEY `a` (`def`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Перед подключением убедитесь что у вас в конфигурации my.cnf выставлен параметр log_bin_trust_function_creators = 1 иначе вы получите ошибку. Данный параметр можно выставить налету, но не забудьте прописать его в конфигурации my.cnf. Подключаемся под суперпользователем и создаем хранилку: Продолжить чтение

Kubelet: Observed a panic: “invalid memory address or nil pointer dereference”

При добавлении CPU на ноду, kubelet не запускается, в логах видим ошибку, если выбрать последние записи:
journalctl -u kubelet -n 1000
Observed a panic: "invalid memory address or nil pointer dereference" (runtime error: invalid memory address or nil pointer dereference
Проблема в том что скорее всего kubelet запущен с опцией --cpu-manager-policy=static, который фиксирует конфигурацию по CPU в файле /var/lib/kubelet/cpu_manager_state:
cat /var/lib/kubelet/cpu_manager_state
{"policyName":"static","defaultCpuSet":"0-9","checksum":688938613}
Конфиг kubelet:
/etc/systemd/system/kubelet.service
Продолжить чтение

Антуан де Сент-Экзюпери «Маленький принц»

Люди забираются в скорые поезда, но они сами не понимают, чего они ищут, поэтому они не знают покоя, бросаются то в одну сторону, а то в другую… И все напрасно… Глаза слепы. Искать надо сердцем.

Отладка при неудачном деплое в Kubernetes c Helm Hook в GitLab CI

Используемое ПО: Gitlab CI, Helm, Docker, Kubernetes Цель: в случае неудачного деплоя, получить информацию о проблеме в CI, а не ходить в k8s или Kibana руками и не смотреть логи подов Вводная: для деплоя в кластер Kubernetes используется Helm версии 3 и Gitlab CI, отдельный сервер для сборки (не DinD), с которого доступен Kubernetes API. Данный вариант основан на ключе Helm --atomic, который осуществляет автоматический откат неудавшегося релиза. Идея в том, чтобы не запускать отдельно helm rollback, а использовать Hook с аннотацией pre-delete, которая перед удалением релиза запустит под и соберет логи с NOT READY подов, а далее с помощью after_script выведет данные логи в CI. К реализации... Продолжить чтение