Bash Days | Linux | DevOps
23.4K subscribers
168 photos
24 videos
695 links
Авторский канал от действующего девопса

Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу.

Автор: Роман Шубин
Реклама: @maxgrue

MAX: https://max.ru/bashdays

Курс: @tormozilla_bot
Блог: https://bashdays.ru
Download Telegram
Разбираемся с options и inputs в gitlab

Частенько ребята с LF стали приходить с такой проблемой:

stages:
- deploy
variables:
ENVIRONMENT:
description: "Deployment environment"
value: "N/A"
options:
- "N/A"
- "STAGE"
- "PRODUCTION"
deploy:
stage: deploy
script:
- echo "Выбрано окружение:" "${ENVIRONMENT}"
rules:
- when: manual


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

НО — этот список перестал появляться. Причем избрано, у кого-то есть, у кого-то хуй с маслом.


Ошибок синтаксиса в ямликах нет, каких-то разумных сообщений и наводок от гитлаба тоже нет. Чё делать?

➡️ Решение

Идем: Settings → CI/CD → Variables и кликаем в радио-батон — Developer.

Всё! Теперь выпадающие списки вновь начинают работать.

А еще людей смущает новая штука inputs, которая совсем недавно появилась. Работает она с 17й версии.

spec:
inputs:
environment:
description: "Куда деплоим?"
type: string
default: "N/A"
options:
- "N/A"
- "STAGE"
- "PRODUCTION"
---
stages:
- deploy

deploy:
stage: deploy
rules:
- when: manual
script:
- echo "Выбрано окружение: $[[ inputs.environment ]]"


Оно будет пиздеть во внутреннем редакторе - Incorrect type. Expected "string | array".yaml-schema, но будет работать если запустить пайплайн.

Ошибка возникает, потому, что Pipeline Editor использует старый YAML-валидатор. Так что, не обращай внимание на этот пиздёж.


А зачем нам этот input ведь с options и так всё работает?

Ну хотя бы из-за типизированных параметров:

type: string | number | boolean | array


То есть:

- можно сделать чекбокс (boolean)
- можно сделать список (array)
- можно сделать ограничение по диапазону (number)
- можно сделать строгие варианты (options)
- можно сделать regex-валидацию

А обычный variables такого не умеют.

GitLab постепенно превращает CI в настоящий «Pipeline as Functions».

Например, в проекте А:

spec:
inputs:
env:
type: string
options: [stage, prod]
---
deploy-job:
script: deploy_to $[[ inputs.env ]]


И проекте B можно вызвать:

deploy:
trigger:
project: A
inputs:
env: prod


Это как вызов функции с аргументом.

Что еще:

- Inputs работают даже при trigger-пайплайнах
- Inputs могут быть required
- Inputs отображаются отдельно и аккуратно в UI
- Inputs часть нового стандарта GitLab CI Components

Короче одни плюсы. Но есть большое НООООО!

Это пиздец усложняет процесс разработки и отладку пайплайна.

Да, стало удобнее и гибче, но всё это превращается в безумное ООП, где без базы и документации к проекту — ты хуй разберешься.

Пока тебе хватает обычных options используй их. Не лезь в это ООП, оно пока рано и избыточно, особенно если ты новичок.

Изучай!

Как говорится — и не такие метели в ебало летели!

🛠 #devops #cicd #linuxfactory

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
743
Надоел и приелся VirtualBox/VMWare? Хочется новенького?

Да легко, опять же эта новая херабора как-то мимо многих прошла, включая меня. Нет это не LXC, vagrant и даже не docker.

Дело пахнет писюнами…


Короче, это — Multipass от Canonical. И да, полностью бесплатная и с мордой.

Выдумать ничего не буду, лови нативку с сайта:

Получите по ебалу мгновенную виртуальную машину Ubuntu с помощью одной команды. Multipass может запускать виртуальные машины и настраивать их с помощью cloud-init, как в общедоступном облаке. Прототип вашего облака запускается локально и бесплатно.


Работает под Linux, Wiundows, Mac

Что же это за зверь?

Multipass использует доступный гипервизор в зависимости от платформы:

- Linux — KVM
- macOS — HyperKit или QEMU
- Windows — Hyper-V или VirtualBox (в новых версиях QEMU)

Можно управлять как через морду, так и через командную строку. Это развязывает руки. Например, можно накодить себе bash скрипт и через него поднимать виртуалки под лабы.

Чё прикольно, для него есть Terraform провайдер, ну прям не инструмент, а золото.

terraform {
required_providers {
multipass = {
source = "larstobi/multipass"
version = "~> 1.4.2"
}
}
}


Работает элементарно, если через морду — выбираешь дистрибутив, накручиваешь ползунки и жмешь Launch, через 40 секунд у тебя готовая виртуалка.

Ну либо headless (через командную):

Основные команды:

multipass launch --name foo
multipass exec foo -- lsb_release -a
multipass list
multipass stop foo bar
multipass start foo
multipass delete bar
multipass purge
multipass find
multipass launch -n bar --cloud-init cloud-config.yaml
multipass help


Из дистрибутивов только Ubuntu, но этого достаточно чтобы что-то протестировать либо погонять. Ребята в LF активно этим инструментом пользуются и создают тестовые кубер-кластера, ну и ансибл оттачивают.

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

В общем рекомендую, инструмент зачетный, никакой ёбли как VBox и VMWare.

🛠 #devops #vm #linux

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
562
А вот это нам надо!

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

Называется всё это добро — pvetui

Работает под всеми операционками, так как реализован на GO.

А зачем? Ну я заебался каждый раз лезть в браузер, чтобы сделать какие-то рутинные действия, да и айпишники я никогда не помню чтобы к ним по ssh подключиться. А через pvetui такое можно провернуть в два счета.

Ты скажешь — дак сделай алиасы для айпишников и цепляйся к нужным виртуалкам. Справедливо, но мне лень. Тем более виртуалки у меня постоянно создаются, удаляеются и я ебал каждый раз алиасы делать.


Установка и запуск:


go install github.com/devnullvoid/pvetui/cmd/pvetui@latest
/home/user/go/bin/pvetui


Под другие ОС:


yay -S pvetui-bin
yay -S pvetui-git
brew install --cask devnullvoid/pvetui/pvetui
scoop bucket add pvetui https://github.com/devnullvoid/scoop-pvetui
scoop install pvetui

# либо из исходников
git clone https://github.com/devnullvoid/pvetui.git
cd pvetui
make install


При первом запуске утилита попросит сконфигурировать её. Жмем пару раз Enter, открывается редактор конфига, заполняем необходимые поля.

Я заполнил URL, логин и пароль от панели Proxmox. Чтобы оно не орало, нужно стереть данные в полях API, тогда оно даст сохранить конфигурационный файл.

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


Инициализация, закончена, видим сообщение:

 Configuration is ready!
🔄 Please re-run 'pvetui' to start the application with your new configuration.
🚪 Exiting.


Запускаем морду и смотрим что получилось.

/home/user/go/bin/pvetui


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

А получилось у нас прям заебись. Теперь я нажимаю ALT+2 и попадаю в список всех своих виртуальных машин. Стрелочками выбираю нужную мне машину и нажимаю букву «m», открывается менюшка.

В менюшке можно сразу провалиться в машину по SSH, что мне и нужно. Но это еще не всё, там и ребуты и миграции, даже VNC есть (нужен xdg). Короче базовый минимум поадминить присутствует.

Да, если нажать «ESC» то откроется еще одна глобальная менюшка для конфигурации самой утилиты, выбор профилей, управление плагинами и т.п.

Короче явки-ссылки я тебе дал, дальше сам смотри, всё там гибко конфигурируется и настраивается. И тем более TUI интерфейсы сейчас прям в трендах.

Хорошей тебе рабочей недели! Не болей!

🛠 #selfhosting #linux #devops

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
769
Как я обновил Proxmox и остался жив

Здрасти, приехали. Сегодня будем обновлять proxmox 8 на 9.1 Оно в принципе и необязательно, но очень хотелось потыкать новую фичу с OCI.

OCI это способ запускать контейнеры из Docker-образов. То есть proxmox теперь умеет скачивать Docker-образы (OCI-images) и превращать их в LXC-контейнеры.


А нахуя? Чтобы проще запускать приложения, которые уже существуют в виде Docker-образов. Теперь в LXC не нужно поднимать отдельно докер демон, все работает из коробки.

Ладно, отвлеклись. Про OCI отдельно распишу. Сегодня обновляем всю эту трихомудию до нужной версии.

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

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


По классике сюда всё не влезло, поэтому гоу в блог читать продолжение 👇

🅰️🅰️🅰️🅰️🅰️🅰️🅰️🅰️
➡️ https://two.su/4ui2c
🅰️🅰️🅰️🅰️🅰️🅰️🅰️🅰️

🛠 #proxmox #devops #selfhosting

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
1141
В Proxmox 9.1 завезли OCI. В предыдущем посте про обновление с 8ки на 9ку я это уже упоминал, поэтому повторяться не буду.

➡️ Как я обновлял Proxmox и остался жив


Сегодня посмотрим как OCI работает на практике.

OCI это не какая-то отдельная сущность, это тот же самый LXC контейнер в котором будет запущен нужный тебе контейнер.

Тут важное замечание — тебе не нужно устанавливать руками docker демона в LXC и только затем запускать контейнер. OCI все сделает само. Это не какой-то встроенный docker или k8s. Всё так или иначе работает под управлением LXC.

К примеру возьмем заезженный образ nginx, который валяется в dockerhub:

nginx:latest


Заходим в Proxmox и идем в раздел с шаблонами, там будет кнопка Pull from OCI Registry.

➡️ ЧИТАТЬ ПРОДОЛЖЕНИЕ


🛠 #proxmox #devops #selfhosting

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
623
Сегодня будем хакать Proxmox и создавать работоспособный кластер из 2х нод.

Ты скажешь - фии… Легкотня! Да, добавить ноду в кластер легко, но если у тебя всего 2 ноды в кластере, ни о каком кворуме речь не идет. Кворум предполагает наличие 3х нод. Либо Q-Device сервера.

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

Да, если кластер развален, то файловая система переходит в режим R/O. И хуй ты че с этим сделаешь.

Если кластер потерял кворум, /etc/pve автоматически монтируется только для чтения, и никакие chmod/chown/chattr не помогут, т.к. это не обычный ext4/xfs.


Прям вызов! И че делать? Очевидно вернуть ноду в кластер и произвести некие манипуляции пока кластер не развален.

Мыж с тобой не пальцем деланные, давай наебем хакнем эту поеботу. И подтасуем результаты кворума в нашу пользу.

Сразу скажу — так делать нельзя!

Включаем ноду, чтобы кластер восстановился. Заходим по ssh на proxmox ноду, которая включена 24/7 (у меня она называется pvx).

vim /etc/pve/corosync.conf


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


В файле видим описания кластера:

nodelist {
node {
name: pvx
nodeid: 1
quorum_votes: 1
ring0_addr: 192.168.10.60
}
node {
name: wenom
nodeid: 2
quorum_votes: 1
ring0_addr: 192.168.10.55
}
}


Видим quorum_votes. Это и есть ключевая опция для хака. Для pvx ноды я меняю 1 на 2. То есть искусственно присваиваю два голоса без кворума.

И ниже в блоке totem меняем параметр config_version: c 2 на 3. Все! Ничего перезагружать не нужно.

Чтобы проверить, запускаем:

pvecm status

Membership information
----------------------
Nodeid Votes Name
0x00000001 2 192.168.10.60 (local)
0x00000002 1 192.168.10.55


И видим что нода pvx получила 2 голоса. Теперь если выключить вторую ноду. Файловая система не перейдет в режим R/O и всё будет работать, как и раньше с одной нодой.

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

Развлекайся!

🛠 #selfhosting #proxmox #devops

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1156
Синхронизируем настройки Pi-Hole между инстансами.

У меня в сети живет несколько нод с pi-hole, которые раскиданы по разным устройствам (proxmox, raspberry pi и т.п.). И сразу встала необходимость, чтобы все ноды с pi-hole имели одинаковые настройки.

Pi-hole — это сетевой DNS‑фильтр и блокировщик рекламы с открытым исходным кодом. Он работает как свой DNS‑сервер, перехватывает DNS‑запросы от устройств в локальной сети и блокирует домены из списков рекламы, трекеров и вредоносных сайтов, возвращая «пустой» ответ вместо IP‑адреса рекламного ресурса.


Стратегия такая, одна нода будет master, где производятся все основное настройки, затем все эти настройки раскатываются на другие ноды (slave).

Раньше такой кейс разруливали с помощью Orbital Sync, Nebula Sync и т.п. Но одно сдохло, другое работает через хуй-пизда-копыто. Короче нужно рабочее решение.

Пишем свой велосипед

#!/usr/bin/env bash

set -euo pipefail

PRIMARY_PIH_DIR="/etc/pihole"

SECONDARY_USER="root"
SECONDARY_PIH_DIR="/etc/pihole"
SECONDARY_HOSTS=(
"192.168.10.97"
"192.168.10.98"
"192.168.10.99"
)

RSYNC_EXCLUDES=(
"--exclude=pihole-FTL.db"
"--exclude=macvendor.db"
"--exclude=*.log"
)

echo "[pihole-sync] $(date): start"

for host in "${SECONDARY_HOSTS[@]}"; do
echo "[pihole-sync] ---- host ${host} ----"

rsync -az \
"${RSYNC_EXCLUDES[@]}" \
"${PRIMARY_PIH_DIR}/" \
"${SECONDARY_USER}@${host}:${SECONDARY_PIH_DIR}/"

echo "[pihole-sync] ${host}: restart dns"
ssh "${SECONDARY_USER}@${host}" "pihole restartdns >/dev/null 2>&1" || \
echo "[pihole-sync] ${host}: FAILED to restart dns"

done

echo "[pihole-sync] $(date): done"


В SECONDARY_HOSTS забиваем айпишники slave инстансов, этакий массив. На этом настройка скрипта закончена. Весь лишний мусор вроде логов и статистики синхронизироваться не будет.

Сохраняем, чмодим, кидаем в крон (а лучше в systemd с таймерами):

Про таймеры подробно писал тут и тут.


crontab -e
*/5 * * * * /usr/local/sbin/pihole-sync.sh >> /var/log/pihole-sync.log 2>&1


Не забываем прокинуть ssh ключи с master на slave, чтобы скрипт не уперся рогом в логин и пароль.

Вроде мелочь, а полезная, да еще и на bash. Хороших тебе предстоящих выходных и береги себя!

🛠 #bash #linux #devops #selfhosting

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
532
Stop Using Pi-Hole – Technitium DNS Is Better

В комментах к посту про «ПИ-ДЫРКУ» ребята посоветовали присмотреться к Technitium DNS. Ну вот я и присмотрелся, прислушался к авторитетному мнению.

Ключевым фактором стало — кластеризация и синхронизация из коробки, без велосипедов на Bash скриптах. Да и по интерфейсу нет ебанутых новогодних ёлок и гирлянд.

Поднял я это у себя на 2х нодах в докерах, одну на малине, другую в proxmox, ну и на роутере прописал чтобы по DHCP раздавались DNSки в локальную сеть.

Поднимается элементарно:

services:
dns-server:
container_name: technitium-dns1
hostname: technitium-dns1
image: technitium/dns-server:latest
ports:
- 5380:5380/tcp # Web console (HTTP)
- 53:53/udp # DNS service
- 53:53/tcp # DNS service
- "53443:53443/tcp" # Web console (HTTPS)

# Optional ports - uncomment as needed:
# - "853:853/udp" # DNS-over-QUIC
# - "853:853/tcp" # DNS-over-TLS
# - "443:443/udp" # DNS-over-HTTPS (HTTP/3)
# - "443:443/tcp" # DNS-over-HTTPS (HTTP/1.1, HTTP/2)
# - "67:67/udp" # DHCP service

# environment:
# - DNS_SERVER_DOMAIN=dns.local
# - DNS_SERVER_FORWARDERS=10.1.149.10

# Production options:
# - DNS_SERVER_ADMIN_PASSWORD=your_secure_password
# - DNS_SERVER_PREFER_IPV6=false
# - DNS_SERVER_RECURSION=AllowOnlyForPrivateNetworks

volumes:
- technitium-dns-data:/etc/dns
restart: unless-stopped
sysctls:
- net.ipv4.ip_local_port_range=1024 65000
volumes:
technitium-dns-data:
driver: local
networks: {}


Если нужны енвы или порты, расскоментируй строчки по потребностям, мне хватило минимальных вмешательств.

Затем заходим в морду: http://<IP>:5380 и конфигурируем по необходимости.

Зоны добавляются в разделе Zones, после добавления зоны, создаешь «A» запись например для домена nextcloud.local и прописываешь IP своего nginx proxy manager (далее NPM), ну а дальше в NPM разруливаешь на нужные IP адреса и порты.

Создаём кластер

Чтобы создать кластер, идем во вкладку AdministrationCluster. Создаем кластер, а на второй ноде в этом же разделе жмем кнопку Join Cluster. Заполняем очевидные поля, явки, пароли и радуемся синхронизации.

Теперь при добавлении новой зоны на первой ноде, эта зона улетит на вторую ноду. Главное не забыть выбрать Catalog Zone при добавлении зоны.

Никаких танцев с бубном. Ааа.. Есть танцы, возможно ты столкнешься с ошибкой, что 53 порт уже занят. Это нормально, фиксим:

sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
sudo rm /etc/resolv.conf
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf


Если у тебя какие-то другие резолверы стоят, то:

sudo systemctl stop dnsmasq
sudo systemctl disable dnsmasq
sudo systemctl stop bind9
sudo systemctl disable bind9


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

Изучай!

🛠 #selfhosting #proxmox #devops

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
549
Volume VS Bind в Docker

Сегодня рассмотрим, как и в каких случаях правильно использовать bind или volume при запуске docker контейнеров.

Пересмотрев кучу docker compose файлов, можно сделать вывод — большинство даж не понимают что они делают. Что печально, прожжённые девопс-инженеры продолжают харкодить и творить дичь. Видимо придерживаются методологии — у меня работает, остальное похуй.

Вообще есть правило:

- Если нужно редактировать файлы руками с хоста, используешь Bind Mount.

- Если данные нужны только приложению (БД, логи, кэш) используешь Volumes.

Шпаргалка, что есть что:

# Это docker volume, данные хранятся в
# /var/lib/docker/volumes/

volumes:
- nginx_data:/etc/data

# Это bind mount, данные хранятся рядом
# с файлом docker-compose.yml

volumes:
- ./data:/etc/data


Ну и никто не запрещает это совмещать, но старайся разделять. Тем более при работе с volumes, в docker есть удобные команды, ну и через midnight commander можешь физически потыкать файлы, при условии если есть рутовый доступ к файловой системе.

Самое главное не делай так:

Про этот случай я и писал в начале поста, вроде человек 20 лет отрубил в айтишке, а пишет хуйню.

volumes:
- /home/anus/conf.d:/etc/nginx/cond.f
- /home/anus/data/logs:/var/log/nginx


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

Я лично предпочитаю volumes и порой даже конфиги в нем храню, потому что этот volume можно легко примаунтить к любому другому контейнеру и получить доступ к этим файлам.
Банально возьмем связку nginx + php-fpm, используем один общий volume и php скрипты корректно выполняются.


Bind mount удобен при разработке и отладки. Ты монтируешь папку с исходным кодом проекта. Правишь код в IDE на хосте и изменения мгновенно подхватываются приложением внутри контейнера.

А еще есть полезный флаг: «RO», используется в ситуациях, когда тебе нужно что-бы приложение в контейнере не перезаписывало данные в примонтированном каталоге. Удобно для отладки или для каких-то ограничений.

Пример:

services:
web:
image: nginx:alpine
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./logs:/var/log/nginx


При всём желании, конфиг nginx.conf нельзя модифицировать из приложения в контейнере. Это можно сделать только на хостовой машине. Второй же bind mount по умолчанию - «RW».

Ну и пожелания:

- Используйте именованные тома, вместо анонимных томов (которые выглядят как длинный хеш 4f32a...) всегда давайте томам осмысленные имена: db_data, app_uploads

- Придерживайся принципа - «Один контейнер — один вольюм». Старайтесь не монтировать один и тот же вольюм в 10 разных контейнеров на запись. Если нужно делиться данными, один контейнер должен быть «владельцем» (RW), а остальные — «потребителями» (RO).

- Бэкап: Правило «3-2-1». Volume — это не бэкап, это просто место хранения. Если ты случайно ёбнешь вольюм командой prune, данные исчезнут.

Используйте временный контейнер для создания архива:

docker run --rm -v db_data:/data -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data


- Docker со временем накапливает «висячие» (dangling) вольюмы — это те, что остались от удаленных контейнеров. Периодически запускай docker volume prune. Оно удалит только те тома, которые не подключены ни к одному контейнеру (включая остановленные).

- Разницы в скорости между Bind и Volume почти нет, оба работают напрямую через ядро. Но это зависит от операционной системы, если у тебя винда и 100500 абстракций, то будут тормоза.

Вот такие пироги, если есть чё добавить, жду тебя в комментариях.

🛠 #docker #linux #devops

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
660
Почтовый сервер у себя дома

Вчера решал интересную задачку. У меня в интернетах крутится собственный почтовый сервер на домене, сервер ежемесячно поджирает стабильно около 2к рублей. Хотя за месяц от силы я получаю 10-20 писем.

Избыточно в плане инфраструктуры и затрат? Конечно! Разумно перетащить его к себе на домашний proxmox и избавиться от одной статьи расходов.

Во время проектирования миграции, было много вопросов и самый главный — у меня нет белого IP в домашнем сегменте, как быть? DynDNS я ебал, да и с микротиком возиться не хочется.

Всё оказалось достаточно просто. Создаем условно за 100 рублей сервер в интернетах с белым IP, втыкаем на него angie с модулем stream, объединяем этот сервер с домашней сетью с помощью netbird или другой технологией. И просто проксипасим все запросы в домашний сегмент.

Про MX, SPF, DKIM писать не буду, все это настраивается отдельно, не сложно.


Звучит логично. Но на практике пришлось поебстись и почитать спецификации всей этой кухни.

Конфиг для angie получился такой, он работает при условии наличия модуля stream.

nginx
upstream imap_backend {
server 100.106.7.8:993;
}

upstream smtp_backend {
server 100.106.7.8:587;
}

upstream sieve_backend {
server 100.106.7.8:4190;
}

server {
listen 993;
proxy_pass imap_backend;
proxy_timeout 1h;
proxy_connect_timeout 30s;
}

server {
listen 587;
proxy_pass smtp_backend;
proxy_timeout 1h;
proxy_connect_timeout 30s;
}

server {
listen 4190;
proxy_pass sieve_backend;
proxy_timeout 1h;
proxy_connect_timeout 30s;
}

дополнительные порты сам добавь, сюда всё не влезло


Суть тут такая, все запросы на определенные порты, перенаправляются в netbird сеть, а 100.106.7.8 это IP адрес как раз моего LXC контейнера с почтовым сервером в домашнем proxmox.

Получилась банальная прокся. Великолепно то, что angie автоматом получает SSL сертификаты и в почтовых программах с этим заморачиваться не нужно, просто указываем домен, порт и всё работает как часы.

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

Я использую nextcloud mail, и там есть поддержка sieve из коробки. Потыкал еще roundcube для морды, но чёт не зашла, топорная какая-то штука, хотя рабочая.


Да, в роле почтового сервера у меня установлен docker-mailserver. Штука классная, установил, пару тычек выписал в конфиг и оно работает. Морды в ней нет, чисто логическая часть, что-то вроде бекенда.

Еще нюанс в конфиге docker-mailserver я прописал SSL сертификаты, эти сертификаты я взял в angie после того как он мне их выдал. В этом плане нужно еще придумать, как организовать передачу этих сертов к себе в proxmox.

environment:
- SSL_TYPE=manual
- SSL_CERT_PATH=/tmp/dms/custom-certs/certificate.pem
- SSL_KEY_PATH=/tmp/dms/custom-certs/private.key

volumes:
- ./ssl:/tmp/dms/custom-certs/:ro


Банально можно через scp копировать, но в идеале поднять vault hashicorp и хранить серты там и по необходимости дергать от туда в любое место.


Ну и важное уточнение, отправлять почту во вне, тебе в нынешних реалиях никто не даст (25 порт на отправку везде заблочен), поэтому используем какой-нибудь relay для этого. Благо есть полно таких, кто дает отправить 10-15к писем в месяц легально и бесплатно. Я пользуюсь этим сервисом несколько лет.

Что еще. Возможно будут проблемы с SPF, но если оно тебе в хуй не уперлось, то отключаем в конфиге docker-mailserver - ENABLE_POLICYD_SPF=0.

Ну и SIEVE включается там же через ENABLE_MANAGESIEVE=1.

Плюсом можешь воткнуть mail archiver и вообще горя не знать. Теперь все твои письки письма под контролем и ты сам себе хозяин этой суеты. Ну и дополнительная экономия на избыточной инфраструктуре.

На этом всё, изучай. Концепт я тебе показал, нюансы рассказал, так что дерзай, всё решаемо.

🛠 #selfhosting #proxmox #devops

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
347