Сообщество - Лига Сисадминов

Лига Сисадминов

2 712 постов 19 172 подписчика

Популярные теги в сообществе:

Aeza топовое железо по честной цене

Mы даём максимум. Серверы, которые не проседают под нагрузкой для сайтов, ботов, игровых серверов, 1С и highload-проектов.

⚡️ AMD Ryzen 9 9950X — до 5.7 ГГц, топовый процессор
🌐 Канал до 25 Гбит/с
💾 NVMe-диски — в разы быстрее обычного SSD
🛡 DDoS-защита включена без доплат
Безлимитный трафик — никаких лимитов и переплат
🌍 11 локаций (RU · EU · US) + /48 IPv6

💰 От 593 ₽/мес · активация за 2 минуты

👉 aeza.net

ООО «АЕЗА ГРУПП»
Показать полностью
19

Я написал свой self-hosted MDM для смешанного парка корпоративных устройств

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

Готового, что легло бы на мою ситуацию, я так и не нашёл — и в итоге сел писать своё. Ниже — разбор инженерных решений, которые по дороге пришлось принять, и карта того, где у этой конструкции проходит настоящая граница безопасности. Последнее для меня важнее всей остальной механики: MDM по определению даёт слишком много власти над чужими машинами, и делать вид, что это не так, я не стал. Поэтому архитектуру ниже я описываю как ответ на вопрос «где это ломается».

Откуда взялась задача

Требований у меня было немного, но именно они всё и отсеяли: сервер должен стоять у меня, телеметрия парка не утекать на сторону, и всё это работать на смешанном парке сразу. Self-hosted-вариантов под такое оказалось немного, и те, что были, спотыкались об одно и то же: либо только маки, либо платные и при этом недоступны в России, либо разваливались на простом вопросе — а что с устройством, если агент две недели просидел офлайн. Ближе всего в этом поиске подобрался Fleet — серьёзный открытый проект, к нему я ещё вернусь ниже. Но развернуть его у себя оказалось тем ещё квестом: я в России, а fleetdm на российский IP не але, так что и сервер, и сборку агентов приходилось поднимать через VPN. Вдобавок агент на macOS в моём случае вставал через раз, а то и вовсе не ставился. Инструмент, который в итоге получился, я назвал RoutineOps; дальше по тексту буду говорить «агент», «сервер» и «панель».

Ещё одно соображение, которое я держал в голове: базовую защиту управляющего канала — mTLS, аудит, вменяемую политику паролей, подпись обновлений — я считаю БАЗОЙ, и держать её за пейволлом мне казалось неправильным. Это моё мнение, не претензия к рынку. Проект в итоге открыт под Apache-2.0; платный уровень существует, но вся базовая защита — в открытой части, и это не тема статьи.

Почему постоянный gRPC/mTLS-канал, а не опрос через VPN

Вечная головная боль: как дотянуться до ноутбука, который сейчас сидит в кафе за чужим NAT. Классических ответов два, и оба мне не понравились. Загнать всех в VPN — это лишняя инфраструктура и ещё одна точка отказа. Сделать агент, который раз в N минут дёргает HTTP-эндпоинт «не прилетело ли чего», — это шторм пустых запросов, а задержка команд упирается в период опроса.

Я пошёл третьим путём. Агент — Go-бинарь, который держит постоянный gRPC-стрим поверх mTLS наружу, по обычному интернету. Соединение инициирует сам агент: оно исходящее, а значит дружит с NAT. По этому же двунаправленному стриму сервер в любой момент проталкивает команду — запусти скрипт, заблокируй экран. Задержка доставки тут — это задержка сети, а не интервал, на который выставлен опрос.

Стек намеренно скучный — скучное не будит меня в три ночи.

  • Агент и сервер — Go, сервер монолитом, без зоопарка микросервисов.

  • Связь — gRPC + Protocol Buffers поверх mTLS: TLS 1.3, приватный CA с пиннингом на всём канале агентов.

  • База — PostgreSQL 16, источник правды.

  • Очередь задач — Redis + Asynq, с ретраями.

  • Веб-интерфейс — React + TypeScript (Vite), раздаётся nginx-контейнером.

  • Развёртывание — Docker Compose.

Порты минимальны: 443 — веб-интерфейс, REST API, enroll, отдача бинарей; 50051 — постоянный gRPC-канал агентов. Postgres и Redis наружу не торчат вообще. На парк до 50 устройств хватает 1 vCPU / 2 GB RAM / 20 GB SSD — и это стартовая планка. Heartbeat дешёвый, инвентарь редкий, поэтому один узел спокойно тянет тысячи устройств: предел задаёт железо машины, не архитектура.

Сертификат — это идентичность, и всё

Самый важный архитектурный вопрос: как агент доказывает, что он именно то устройство, за которое себя выдаёт. Ответ короткий. device_id — это CN клиентского сертификата, и только он. Идентификаторам в теле сообщений сервер не верит вообще. Прилетел heartbeat, а внутри указан чужой device_id? Игнорируется. Значение имеет одно — чем подписан TLS-хендшейк.

Отсюда и enrollment, устроенный так, чтобы приватный ключ устройства никогда не покидал устройство:

  1. Админ в панели заводит устройство и получает одноразовый токен: TTL 24 часа, single-use, гонка при погашении закрыта на уровне БД.

  2. Агент локально генерирует пару ключей и отправляет CSR на POST /api/v1/enroll.

  3. Сервер подписывает сертификат своим приватным CA и сам проставляет CN. Повлиять на свой CN агент не может.

Подделать чужое устройство без его ключа не выйдет — и не потому, что «мы проверяем поля», а потому, что проверять тут в принципе нечего. Криптография здесь вырезает целый класс авторизационной логики. Решение нравится мне тем, что после него кода становится меньше.

Heartbeat и инвентаризация разведены нарочно

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

Heartbeat — лёгкий и частый, примерно раз в 30 секунд, по постоянному стриму; по нему же едут задачи. Дёшево, потому что данных в нём кот наплакал. Инвентаризация — тяжёлая и редкая, примерно раз в 5 минут: ОС, железо, серийник, установленное ПО (на Linux — из dpkg/rpm/pacman/apk), версия агента.

Такое разделение держит постоянный канал дешёвым при любом размере парка. Если устройство пропало с радаров и heartbeat не приходит дольше порога (порог настраивается через AGENT_UNREACHABLE_MINUTES) — поднимается алерт agent_unreachable, с подавлением дребезга от сна и modern standby, иначе каждый закрытый на ночь ноут спамил бы в Telegram Max :).

Результаты скриптов идемпотентны. У каждого запуска есть run_id, и повторная доставка дедуплицируется на сервере. Связь рвётся, ack теряется, агент шлёт результат заново — без этой механики ловил бы дубли, а на неидемпотентных командах ещё и двойное исполнение.

Агенту не нужна постоянная связь

Постоянный канал удобен, но агент не должен превращаться в кирпич, стоит серверу отвалиться. Cron-скрипт-политики крутит локальный планировщик прямо на устройстве: сервер лёг на обновление — политики по расписанию всё равно отработают.

Сложнее всего с блокировкой экрана. В офлайне полноэкранный overlay держится, а разблокировка идёт по локально хранимому bcrypt-хешу пароля — ходить за ней к серверу не нужно. Это осознанный компромисс: если бы разблокировка требовала сервер, любой обрыв связи превращал бы блокировку в невозможность войти в систему — а это уже хуже самой угрозы. Результаты и события тем временем копятся локально и досылаются, когда связь вернётся.

Временные админ-права — без поездки к машине

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

Теперь пользователь запрашивает временные локальные админ-права прямо из трея агента, я одобряю заявку в панели — и он ставит нужное сам, а по истечении срока повышение снимается. Ни подходить к машине, ни поднимать удалённую сессию ради одной инсталляции не надо. Мелочь на фоне остальной механики, но именно из таких мелочей и складывалось то самое «здраво администрировать парк», ради которого всё и затевалось.

Fail-closed self-update и миграции

Самообновление — самый опасный канал из всех. Тот, кто им рулит, кладёт свой бинарь на все устройства как root. Поэтому здесь всё fail-closed. Примерно раз в 6 часов агент тянет манифест и проверяет sha256 и ed25519-подпись по полному манифесту: версия, ОС, архитектура, хеш подписаны одним набором сразу. Так нельзя подсунуть валидный бинарь под чужую версию или платформу. Дальше агент атомарно заменяет себя и перезапускается. Даунгрейд невозможен — есть anti-rollback floor: битый релиз чинится только версией вперёд, назад дороги нет. Приватный ключ подписи уникален для конкретной инсталляции; потеря не катастрофа — новый раздаётся через переэнролл.

На сервере тот же принцип. Схему накатывает отдельный migrate-сервис — до старта сервера. Не прошла миграция — сервер просто не поднимется на несовместимой схеме. Down-миграций нет, и это намеренно: откат — только из бэкапа, причём бэкап БД update.shснимает сам перед каждым обновлением. Пережить факап из снапшота я предпочту тому, чтобы полагаться на корректность down-скрипта, накатываемого поверх наполовину применённого состояния.

Модель доверия: god-mode by design

А вот тут льстить не буду — и это, пожалуй, самая важная часть текста. MDM по своей природе — это god-mode над парком. Скрипт-канал исполняет произвольный bash -c / powershell -Command как root/SYSTEM на каждом устройстве. Это не дыра, которую я забыл заткнуть. Это и есть продукт: весь смысл MDM в том, чтобы раскатать одну команду на сотню машин разом. А такой инструмент по определению — санкционированный RCE.

Скажу прямо.

  • Подписи на скрипт-канале нет. И не будет. Ed25519-подпись защищает только канал самообновления — анти-тампер и анти-даунгрейд бинаря. Она никак не ограничивает то, что вы запускаете на устройствах. Тезис «скомпрометированный сервер не сможет выполнить код на парке» — неверное прочтение. Ещё как сможет: выполнение произвольного кода на парке — это его штатная функция.

  • JWT_SECRET (симметричный HS256) — единственный корень доверия панели. Кто прочитал этот секрет, тот печатает себе сколько угодно валидных admin-токенов. Не «подобрать пароль», не «обойти MFA» — просто сгенерировать подписанный токен и зайти админом.

  • Отсюда единственный вывод: реальный периметр безопасности — это хост, на котором крутится сервер. Не TLS, не RBAC, не аудит. Они важны, но вторичны. Увели сервер — увели весь парк.

Харденинг этого хоста — работа оператора, и в SECURITY.md под неё лежит чеклист: SSH только по ключам, наружу открыты только два порта, Postgres и Redis — на localhost, JWT_SECRET генерируется через openssl rand -base64 48 и лежит в режиме 600, панель — за VPN или IP-allowlist, аудит-лог — в append-only хранилище с алертом на появление новых админов.

Я специально не прячу этот раздел в мелкий шрифт. Любой MDM устроен ровно так же — просто не каждый проговаривает это вслух. Мне важно, чтобы человек ставил такой инструмент с открытыми глазами: в безопасности честность — это техническое свойство, а не тон голоса.

Что закрыто по умолчанию

Периметр — на операторе. Но всё, что можно закрыть кодом, закрыто по умолчанию, без единой галочки:

  • Не стартует на слабом секрете. Требует JWT_SECRET от 32 байт и минимум 16 различных байт. Случайно уехать в прод на changeme не получится.

  • Admin-JWT живёт 8 часов. Logout реально ревокирует токен через jti-блоклист. Смена или сброс пароля обнуляет все ранее выданные токены пользователя разом — через token-epoch.

  • Lockout по IP и по аккаунту, bcrypt cost 12. Форма входа не выдаёт, какие аккаунты вообще существуют.

  • Политика сложности пароля — для всех, включая seed-админа: от 8 символов, минимум 3 класса символов из 4. Даже первый администратор не заведётся с admin/admin.

  • RBAC на две роли — it_admin (всё) и viewer (только чтение), с проверкой на сервере. Viewer, дёрнувший мутирующий эндпоинт прямо из DevTools, упрётся в 403 ещё на сервере.

  • Плюс одноразовые enroll-токены, журнал аудита на каждое привилегированное действие (retention по умолчанию 365 дней), security-заголовки (HSTS/CSP/X-Frame-Options/nosniff), rate-limit и cap на размер запроса.

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

Честные ограничения

Раз обещал честность — вот граница, без прикрас.

  • Один узел — одна точка отказа. Для парка в режиме «поставил и работает» этого достаточно, но иллюзий про отказоустойчивость держать не стоит.

  • Нет SSO и MFA. Вход по паролю плюс RBAC. Пока разумно держать панель за VPN или allowlist.

  • macOS .pkg не подписан Apple. По двойному клику встретит Gatekeeper — ставится через installer из терминала.

  • Скрипт-канал — это RCE by design. Подробно — в разделе про модель доверия выше.

Про Fleet

Ближайший открытый аналог, который я смотрел, — Fleet, тоже open source, ядро под MIT. Инструмент серьёзный и зрелый, и во многом он сильнее моего: настоящий нативный MDM с профилями конфигурации и zero-touch-энроллментом, live-запросы osquery по всему парку, расчёт на масштаб в сотни тысяч машин. Построен вокруг osquery, инфраструктура — MySQL плюс Redis за балансировщиком, под горизонтальное масштабирование.

Под мой случай он просто не сошёлся по устройству. Чтобы реально управлять маками, Fleet опирается на нативный Apple MDM — а это APNs-сертификат от Apple с ежегодным продлением плюс Apple Business Manager для zero-touch. Мне не нужна была SQL-аналитика по всему парку; нужен был лёгкий агент, офлайн-лок без APNs, инвентарь и скрипты. А поверх этого архитектурного несовпадения легли те самые бытовые проблемы с развёртыванием из России и капризным macOS-агентом, о которых я писал в начале.

Чему это меня научило

Самое неожиданное в проекте — что львиная доля инженерных решений оказалась не про «как добавить», а про «как убрать». Идентичность через CN вырезала целый класс серверной авторизации; fail-closed на миграциях и обновлениях — ветки «а что если накатилось наполовину». Разведённые heartbeat и инвентарь сняли лишний трафик. А карта модели доверия избавила меня самого от иллюзии, будто TLS и RBAC — это и есть безопасность. Настоящий периметр оказался в одном месте — на хосте сервера.

Исходники я открыл под Apache-2.0; прямую ссылку на репозиторий оставлю тут :). Если вам будет интересно я бы с радостью пообщался по замечаниям именно по модели доверия — по местам, где приложение должно что-то enforce-ить, но не делает.

Показать полностью 5
27

Почему Nginx пишет IP прокси вместо IP клиента

Сидишь за reverse proxy, CDN или балансировщиком - открываешь access-лог, а там один и тот же IP на всех запросах. Обычно 127.0.0.1, адрес ingress-контроллера или внутренний IP прокси.

На этом фоне ломаются rate limiting, fail2ban, аудит и любые расследования: Nginx честно пишет адрес своего непосредственного соседа, а не исходного клиента.

Почему так.

$remote_addr - это адрес узла, который напрямую установил соединение с Nginx. Если перед ним стоит прокси, то для Nginx клиентом является именно прокси.

Настоящий IP пользователя обычно приезжает отдельно:

  • в X-Real-IP;

  • в X-Forwarded-For;

  • в заголовке конкретного CDN;

  • через PROXY protocol, если перед нами L4-балансировщик.

Но просто взять значение HTTP-заголовка и записать его в лог - плохая идея:

log_format main '$http_x_real_ip - $request';

Любой клиент может сам отправить:

X-Real-IP: 1.1.1.1

и подложить в ваши логи произвольный адрес.

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

Для этого в Nginx есть штатный ngx_http_realip_module.

Проверяем, собран ли он в текущем бинарнике:

nginx -V 2>&1 | tr ' ' '\n' | grep -- --with-http_realip_module

Если Nginx собираете сами, понадобится флаг:

--with-http_realip_module

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

Настраиваем доверенный прокси:

set_real_ip_from 10.42.0.10;

set_real_ip_from 10.42.0.11;

real_ip_header X-Real-IP;

После этого Nginx будет заменять $remote_addr адресом из X-Real-IP, но только если соединение пришло от узла из set_real_ip_from.

Важно: указывайте точные адреса или минимальную подсеть балансировщиков.

Вот так делать нежелательно:

set_real_ip_from 10.0.0.0/8;

Этой настройкой вы разрешаете любому узлу из всей сети 10.0.0.0/8 подменять клиентский IP. Лучше доверять конкретным адресам прокси или выделенному сегменту.

Сам origin при этом желательно закрыть от прямого доступа извне через firewall, security group или network policy. Иначе клиент сможет обойти прокси и прийти непосредственно к Nginx.

На самом прокси X-Real-IP должен перезаписываться, а не слепо передаваться от клиента:

proxy_set_header X-Real-IP $remote_addr;

Не так:

proxy_set_header X-Real-IP $http_x_real_ip;

Во втором случае прокси просто протащит значение, которое прислал пользователь.

В чём ловушка с X-Forwarded-For

Этот заголовок содержит цепочку адресов через запятую:

X-Forwarded-For: client, proxy-1, proxy-2

Если в инфраструктуре несколько доверенных прокси, можно настроить Nginx так:

set_real_ip_from 10.42.0.10;

set_real_ip_from 10.42.0.11;

real_ip_header X-Forwarded-For;

real_ip_recursive on;

Тогда Nginx будет разбирать цепочку справа налево, пропуская доверенные адреса из set_real_ip_from, и выберет последний недоверенный адрес.

Например:

X-Forwarded-For: 1.1.1.1, 203.0.113.25, 10.42.0.10

Если 10.42.0.10 - доверенный внутренний прокси, а 203.0.113.25 - адрес клиента, добавленный доверенным edge-прокси, Nginx выберет 203.0.113.25, а не подставленный пользователем 1.1.1.1.

Но это работает безопасно только тогда, когда вся доверенная цепочка прокси известна и перечислена в set_real_ip_from.

После обработки модулем:

  • $remote_addr - восстановленный адрес клиента;

  • $realip_remote_addr - исходный адрес узла, который подключился к Nginx;

  • $http_x_forwarded_for - заголовок в том виде, в котором он приехал.

Для диагностики удобно логировать всё сразу:

log_format main

'client=$remote_addr '

'peer=$realip_remote_addr '

'xff="$http_x_forwarded_for" '

'request="$request" '

'status=$status';

Так можно понять не только какой IP выбрал Nginx, но и от какого прокси пришло соединение и какую цепочку тот передал.

Rate limiting после этого тоже сможет работать по реальному клиентскому адресу - если ключ зоны построен на $remote_addr или $binary_remote_addr:

limit_req_zone $binary_remote_addr

zone=per_ip:10m

rate=10r/s;

Использовать для лимитов сырой $http_x_forwarded_for не стоит: это строка с цепочкой адресов, которую при неправильной настройке прокси можно подделать или постоянно менять.

С fail2ban та же логика: он увидит реальный адрес только в том случае, если анализирует поле лога, в котором записан обработанный $remote_addr.

Если перед Nginx стоит TCP-балансировщик, HTTP-заголовков может не быть вообще. Тогда обычно используется PROXY protocol:

server {

listen 443 ssl proxy_protocol;

set_real_ip_from 10.42.0.10;

real_ip_header proxy_protocol;

}

PROXY protocol также нельзя принимать от кого угодно: источник соединения должен быть ограничен доверенными балансировщиками.

После изменения конфигурации:

nginx -t && systemctl reload nginx

Проверяем:

tail -f /var/log/nginx/access.log

Смотрим одновременно на client, peer и xff. Проверка только первого поля лога мало что доказывает: важно видеть всю цепочку и понимать, почему Nginx выбрал именно этот адрес.

Очень краткий вывод

Не доверяйте заголовку с IP.
Доверяйте конкретному прокси, который этот заголовок сформировал.

Показать полностью
9

Какими инструментами пользуетесь для резервного копирования?

Всем привет! Поделитесь в комментариях вашим опытом, какими инструментами пользуетесь для резервного копирования данных в организации.

Какими инструментами пользуетесь для резервного копирования?
Всего голосов:

Расскажу и про свой опыт. Работал в основном в небольших организациях, где не было второго админа и поэтому приходилось всё постигать самому. Сейчас работаю в компании - операторе связи. У нас своя сетевая инфраструктура в ЦОДах и небольшое количество серверов, на которых крутятся внутренние сервисы. Компания относительно молодая и первый сервер появился с моим приходом в 2022м году. Что бэкапим:

- виртуалки (Proxmox) - начинали с заимстованного доступа к PBS, со временем переехали на свой PBS. Ежедневно бэкапим все виртуалки (74 шт на сегодня). Уведомления о сбоях приходят на почту. Задания и уведомления настраиваются из самого Proxmox.

- 1С клиент-серверная (Linux), базы в Postgres, из баз вынесены двоичныt данных в локальное хранилище. Пока нет технической возможности использовать S3 как внешнее хранилище для рабочих данных (но используем для бэкапов). Бэкаплю на данный момент самописными скриптами (дамп sql, архивирование, перемещение в S3 с помощью rclone, уведомления в телеграм), ежедневно в нерабочие часы. Аналогично с хранилищем двоичных данных, каталоги архивируются и загружаются в S3. Сталкивался с проблемой, когда 1С ломала метаданные хранилища, восстанавливался из бэкапа и разбирался, проблема была устранена в платформе 8.5.

- Бухгалтерский софт на windows сервере в другой юрисдикции. У этого софта есть механизмы для бэкапа, но немного кривые + база файловая. В планировщике настроил задание, создаёт архив в локальной ФС. Как резервный вариант бэкаплю и рабочий каталог самого софта. Снапшоты снимаю с помощью KopiaUI в S3 хранилище, пинги настроены через веб-хуки в сервис Healthcecks. Он может прислать уведомление на почту или в тг, если пинг не пришёл.

- CRM Битрикс24 - бэкапится база Mysql, аналогично как в 1С

- Конфиги сетевых устройств. С самого начала мы используем Netbox для нашей сетевой инфраструктуры. Сетью я не занимаюсь (только на серверах и виртуалках), хотя доступы к железкам у меня есть. Настроен отдельный доступ для API пользователя. Все конфиги можно смотреть в интерфейсе самого Netbox. Там же прикручен плагин DanSheps/netbox-config-backup. Периодически он глючит и в добавок мы ограничены последним релизом Netbox 3.x из-за того, что у нас достаточно много самописного кода для автоматизаций и не можем обновить плагин до последних версий (хотя... было бы желание). Помимо того, что этот плагин глючит, нет возможности мониторинга. Был написан плагин, который работает поверх него, обнаруживает новые железки и для них создаёт задания для бэкапов, отдаёт данные в Zabbix для Discovery новых бэкапов, мониторит протухшие бэкапы.

- Nextcloud - пока бэкапим только виртуалку + есть корзина с удалёнными файлами. Пока этого хватало для восстановления. Был случай когда сотрудник увольнялся и удалил все свои документы (трудовой договор и т.п.), которые ещё нужны были бухгалтерии. Пришлось их восстановить. Да, у нас не ограничиваются доступы сотрудников, разве что к самим сервисам (группами в LDAP) как таковым - менеджерам доступы к железкам не нужны, такова политика компании. В перспективе думаю создавать отдельно копии на уровне ФС.

- Кодовая база - ну тут всё просто, отдельная виртуалка с GitLab CE, бэкапим её. Думаю ещё в перспективе настроить репликацию всех репозиториев.

Как сказал, компания растёт и приходится всё поднимать с нуля. Есть и дальнейшие планы для снижения RTO/RPO: 2 независимых кластера Proxmox с Ceph, репликации для VM, которые не умеют резервироваться на уровне приложений, резервирование на уровне приложений, настройка балансировщиков, NAT+VRRP, HA Proxy, синхронные/асинхронные репликации СУБД. резервирование PBS на разных площадках.

Да, использовал в прошлом и Veeam для VmWare и облачные решения типа MTS Backup, и различные Restic, BorgBackup, rsync. Тем не менее, среда разнородная, если с виртуалками всё относительно просто, то с файлами/базами начинается зоопарк. Давно есть мысли как то упростить этот процесс и перейти на одно универсальное решение. Сейчас появляются открытые решения на github для оркестрации бэкапов (backrest, borgmatic и т.п.), но пока не вижу решения, которое закрывало бы все потребности - универсальность, независимо от платформы, декларативное описание заданий, настройка уведомлений, мониторинг. До этого было ещё одно из требований - наличие веб-интерфейса для управления архивами, но этот пункт успешно закрылся S3 решением RustFS (замена MinIO. Да, он ещё в бете, но кажется вполне перспективным и пока что успешно справляется).

Спасибо, что уделили время. Буду рад услышать про ваш опыт.

Показать полностью 2 1
11

Раздача WiFi и Ethernet одновременно

Уважаемые знатоки, помогите! В общем есть ноут на вин7, который через адаптер USB принимает WiFi от роутера, к ноуту по кабелю Ethernet подключена смарт-приставка для тв, работает в режиме моста.

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

Пробовал через консоль - в режиме моста нельзя давать общий доступ к интернет на встроенный адаптер. То есть работает или одно или другое.

Пробовал Virtual Roter Plus - ошибка не удается запустить виртуальный маршрутизатор.

Пробую MyPublicWiFi - при нажатии Включить ТД, надпись "Настройка сети", в сетевых подключениях появляется созданная точка с подключением к интернет буквально на секунду и сразу исчезает. После этого кнопка Включить ТД опять становится активна.

Замучился уже, что не так-то?

27

«Вконтакте» переходит на домен vk.ru

Серия Чебурнет

Помнится, в 2012 году «Вконтакте» не просто использовал домен vk.com на международном рынке, но и перевел соцсеть на него в Российской Федерации. Тогда же было открыто официальное представительство в Киеве — так дальновидно и своевременно!

И вот, после череды удалений из магазинов приложений, отзывов сертификатов и введения санкций загнивающим Западом, «Вконтакте» возвращается к использованию домена vk.ru. Того гляди, история повернет вспять, и вернут стену.

«Вконтакте» объявило о полном «переезде» на домен .ru // РБК, 16.07.2026 (15:52)

Пользователям ВК начали приходить уведомления, что соцсеть переходит на домен RU // Хабр, 16.07.2026 (15:57)

«Вконтакте» завершает переход на единый домен vk.ru // РИА-новости, 17.07.2026 (9:35)

Домен VK в иностранной зоне начал переводить пользователей на vk.ru // ТАСС, 17.07.2026 (12:10)

VK.RU стал основным адресом для пользователей «Вконтакте» // Коммерсантъ, 17.07.2026 (12:30)

VK.RU стал основным адресом для пользователей «Вконтакте» // Вконтакте, 17.07.2026

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

Переходите на vk.ru. Здесь все тот же «ВКонтакте», но быстрее и надежнее, чем vk.com.

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

Ой, а что же это случилось? А как так вышло? Проверим, что же это за сценарии у нас не загружаются с CDN.

Ой, только недавно полученный сертификат уже отозван.

Я, пожалуй, никак комментировать это не буду.

Показать полностью 4
38

Как я обнаружил, что бекапы Proxmox не работали целую неделю

Как я обнаружил, что бекапы Proxmox не работали целую неделю

Обновил я Proxmox с 8.x до 9.2. Всё прошло гладко — ВМ запустились, LXC стартанули, веб-морда радовала глаз новыми фишками. Я довольный пошёл пить чай. Через день захожу проверить бекапы — а последний успешный был... неделю назад. Сердце ёкнуло.

Показать полностью
13

Мы тут сделали первый стабильный релиз IncidentRelay 1.1

Это open-source система для on-call дежурств и алертов, которую можно поставить у себя.

Если по-человечески: когда ночью что-то ломается, IncidentRelay помогает понять, кому звонить, куда отправлять уведомление, кто сейчас дежурный, почему алерт попал именно в эту команду, и что вообще произошло. Ну то есть занимается тем, что обычно в маленьких командах живёт в голове у одного человека, который “вроде помнит, как оно настроено”. Спойлер: он не всегда помнит.

Мы сделали IncidentRelay self-hosted, потому что не всем хочется тащить весь incident workflow во внешний SaaS. Иногда хочется просто поставить у себя, подключить Alertmanager/Grafana/Zabbix/Sentry/LibreNMS/что-нибудь-webhook, настроить команды, ротации, каналы и жить чуть спокойнее. Хотя “спокойнее” в мире on-call звучит как смелое заявление.

IncidentRelay Heartbeat

IncidentRelay Heartbeat

Что умеет:

- принимать алерты из разных систем мониторинга;
- маршрутизировать их по командам и сервисам;
- понимать, кто сейчас дежурит;
- слать уведомления в Mattermost, Slack, Telegram, email, browser push, webhook и даже voice call;
- делать ACK/Resolve;
- напоминать и эскалировать;
- учитывать maintenance windows;
- глушить шумные алерты через silences;
- показывать календарь дежурств;
- делать CalDAV/ICS-подписки;
- группировать похожие алерты;
- показывать Explain Trace: почему система решила именно так;
- отслеживать сервисы, зависимости и impact;
- проверять Heartbeats, когда задача должна была прислать “я жива”, но решила уйти в молчание.

За 5 месяцев от первой версии до 1.1 проект оброс довольно большим количеством функций. Начиналось всё с базового alert flow, Telegram-действий и фильтров. Потом понеслось: ротации стали многоуровневыми, появились escalation policies, сервисный каталог, SLI/SLO, Business Services, heartbeats и отдельная логика impact.

Самым сложным неожиданно оказался не “принять webhook и отправить сообщение”. Это как раз весёлая часть. Сложным оказалось понять, как правильно считать влияние сервисов друг на друга.

Вот есть сервис A, от него зависит B, от B зависит C, у C алерт, у A degraded, у B maintenance, где-то P2, где-то critical, а бизнес-сервис сверху должен показать понятный статус. И желательно не писать пользователю “всё горит”, если на самом деле горит только маленький угол. Но и не писать “всё нормально”, если этот маленький угол держит половину продукта. Тут начинаются настоящие разговоры с графом зависимостей. Иногда граф смотрит в ответ. Осуждающе.

Отдельно пришлось повозиться с визуализацией графа. Потому что граф сервисов в UI легко превращается в тарелку лапши: линии везде, подписи пересекаются, root cause где-то спрятался, downstream impact убежал за край экрана. Пришлось продумывать расположение, уровни, подсветку и то, как показать пользователю не просто красивую картинку, а полезную информацию.

Ещё одна штука, которой мы довольны, - Explain Trace. Это когда можно открыть алерт и увидеть: какой route сработал, какие matchers совпали, почему алерт сгруппировался, почему уведомление ушло или не ушло. Очень помогает в ситуации “почему меня разбудило в 03:17”, хотя честный ответ иногда всё равно “потому что ты дежурный, прости”.

В релизе 1.1 также есть Heartbeats. Это проверки для задач, которые должны периодически сообщать “я завершилась успешно”. Backup, ETL, watchdog, агент на сервере. Если ping не пришёл - создаётся обычный алерт. Есть multi-instance режим, чтобы один живой сервер не прикрывал пятерых молча умерших товарищей.

Разворачивается через Docker Compose, RPM, systemd или Helm. Маленькие установки могут жить на SQLite, для production лучше PostgreSQL. Лицензия MIT.

GitHub: https://github.com/roxy-wi/IncidentRelay

Сайт: https://incidentrelay.io/

Показать полностью 2
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества