postfix: свой почтовый релей за 10 минут

Держать полноценный почтовый сервер ради алертов от cron/Zabbix избыточно — обычно хватает postfix в режиме релея через внешний SMTP (например, для отправки на личный ящик). Вся конфигурация — один файл /etc/postfix/main.cf. Минимум для релея через внешний SMTP: relayhost = [smtp.example.com]:587 smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_use_tls = yes mynetworks = 127.0.0.0/8 После правки — postmap /etc/postfix/sasl_passwd и systemctl reload postfix. Диагностика зависших писем — postqueue -p покажет очередь, postcat -q <id> — содержимое конкретного письма, postsuper -d ALL очистит очередь целиком (осторожно, необратимо). ...

September 14, 2026 · llexa

Proxmox #10: cgroups и лимиты ресурсов для LXC

LXC-контейнер в Proxmox — это не VM с гипервизором, а обычные процессы хоста, изолированные namespaces и ограниченные cgroups. Без явных лимитов один контейнер может выесть всю память или CPU ноды, и соседи это почувствуют мгновенно — общее ядро, общие ресурсы. Лимиты через pct set: pct set 101 --cpulimit 2 --cpuunits 512 --memory 2048 --swap 512 cpulimit — жёсткий потолок в ядрах, cpuunits — относительный вес при конкуренции за CPU (по умолчанию 100 под cgroup v2; в legacy cgroup v1 было 1024). Проверить фактическое применение можно в /sys/fs/cgroup/lxc/101/ — Proxmox VE 7+ использует unified cgroup v2 по умолчанию. ...

September 14, 2026 · llexa

FUSE с нуля #3: пишем свою мини-ФС на Python

В прошлых выпусках мы монтировали готовые FUSE-реализации (sshfs, rclone) — теперь свою, минимальную. fusepy оборачивает /dev/fuse питоновским классом: переопределяешь VFS-методы, остальное берёт libfuse. class HelloFS(Operations): def getattr(self, path, fh=None): return dict(st_mode=0o40755) if path == '/' else dict(st_mode=0o100644, st_size=13) def readdir(self, path, fh): return ['.', '..', 'hello.txt'] def read(self, path, size, offset, fh): return b'Hello, FUSE!\n'[offset:offset+size] FUSE(HelloFS(), '/mnt/hello', foreground=True) getattr отвечает на stat(), readdir — список файлов, read — байты по смещению. #fuse

September 11, 2026 · llexa

nftables с нуля #2: NAT — masquerade и port forwarding

Прошлый выпуск серии закрыл базовые table/chain/rule и default drop. NAT — отдельные chain с hook prerouting (для DNAT, до маршрутизации) и postrouting (для SNAT/masquerade, после): table ip nat { chain postrouting { type nat hook postrouting priority 100; oif "eth0" masquerade } chain prerouting { type nat hook prerouting priority -100; tcp dport 8080 dnat to 192.168.1.10:80 } } masquerade — SNAT с автоопределением текущего IP интерфейса, удобен при динамическом внешнем адресе (в отличие от snat to <ip> с фиксированным). dnat to ip:port пробрасывает внешний порт на внутренний хост — тот же принцип, что iptables -t nat -A PREROUTING -j DNAT, только nftables держит NAT как обычную table с полем type nat. ...

September 10, 2026 · llexa

fail2ban: банит по логам, а не ждёт руками

SSH на публичном IP получает перебор паролей с первых минут после старта — fail2ban читает логи (/var/log/auth.log, journald) через filter, находит совпадения по regex и банит IP через iptables/nftables/firewalld на время bantime. jail.local — конфиг поверх дефолтов (jail.conf не трогать, апдейты пакета его перезапишут): [sshd] enabled = true, maxretry = 3 — попыток до бана, findtime = 10m — окно, в котором они считаются, bantime = 1h — срок бана (-1 — навсегда). ...

September 8, 2026 · llexa

iostat и sar: диск и CPU за интервал, не мгновенный снимок

top/vmstat без параметров показывают текущий момент — iostat и sar (пакет sysstat) считают статистику за интервал и показывают тренд: iostat -x 2 5 — расширенный вывод каждые 2 секунды, 5 раз, с %util (загрузка диска) и await (время ожидания I/O). sar идёт дальше — если sysstat настроен таймером (сбор каждые 10 минут), он копит историю в /var/log/sa/, и sar -u -f /var/log/sa/sa15 покажет загрузку CPU за 15-е число без настройки мониторинга заранее — спасает при разборе уже закончившегося инцидента. ...

September 8, 2026 · llexa

Архиваторы #7: squashfs — сжатый read-only образ ФС

В отличие от zstd/xz/lz4 из прошлых выпусков, squashfs — не формат архива, а сжатая файловая система: mksquashfs dir/ image.squashfs -comp zstd собирает целое дерево файлов в один read-only образ, который монтируется напрямую (mount -t squashfs image.squashfs /mnt) без распаковки. Именно так устроены live-образы дистрибутивов и слои Docker/OverlayFS — сжатие в разы экономит место, а доступ на чтение почти не отличается от обычной ФС благодаря постраничному разжатию на лету. unsquashfs -l image.squashfs покажет список файлов без монтирования, -d dir распакует всё целиком, если нужен полный доступ на запись. ...

September 7, 2026 · llexa

FUSE с нуля #2: монтируем облако через rclone

В прошлом выпуске серии sshfs показал главную идею FUSE — файловая система в userspace без единой строчки кода ядра. rclone расширяет это на облако: 40+ бэкендов (S3, Google Drive, WebDAV, Backblaze и т.д.) через один и тот же FUSE-интерфейс. # примонтировать заранее настроенный rclone remote rclone mount remote:bucket /mnt/cloud --daemon # с кэшем на чтение — критично для WebDAV/GDrive, где листинг медленный rclone mount remote:bucket /mnt/cloud --vfs-cache-mode writes --daemon # отмонтировать fusermount -u /mnt/cloud После монтирования каталог ведёт себя как обычная ФС — cp, ls, tail -f работают без клиента. Разница с sshfs: под капотом не SSH-сессия, а HTTP API облака, и --vfs-cache-mode решает, что кэшировать локально. ...

September 4, 2026 · llexa

Обзор новинок #8: 27 августа — 3 сентября

Новые релизы за неделю — только то, что важно для сервера. vscode 1.136.0 nginx 1.31.5 — control API, predicate locations, ngx_http-модуль grafana v12.4.10 homepage v2.2.0 doggo v1.4.0 — bind резолверы к исходному адресу через -b keycloak 26.7.3 — фикс CVE-2026-35563 в LDAP-клиенте sing-box v1.14.0 loki v3.6.16 — флаг игнорировать пропавшие чанки при удалении логов immich v3.2.0-rc.0 bottom 0.14.9 — опция показывать нулевой сетевой трафик при старте #linux #sysadmin #releases

September 4, 2026 · llexa

rsyslog: классический syslog жив и настраивается

journald пишет бинарный журнал локально, но текстовые файлы в /var/log и отправку логов на другой сервер до сих пор делает rsyslog — на Debian он стоит рядом с journald по умолчанию. # /etc/rsyslog.d/10-app.conf if $programname == 'myapp' then /var/log/myapp.log & stop *.emerg :omusrmsg:* mail.* -/var/log/mail.log Фильтр строится по facility.severity или по имени программы. & stop после правила — не отдавать сообщение дальше, иначе строка попадёт ещё и в общий syslog. *.* @logserver.local:514 # UDP *.* @@logserver.local:514 # TCP — надёжнее при нестабильной сети systemctl restart rsyslog logger -p mail.info "test message" # проверить правило без ожидания реального события #linux #logging ...

September 3, 2026 · llexa