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

HP Мини-ПК ProDesk 400 G9 Mini (Intel Core i5 14500T, RAM 32 ГБ, SSD 1024 ГБ, Intel UHD Graphics 770, Без ОС), CV9L4AT/32GB/1TB
HP Мини-ПК ProDesk 400 G9 Mini (Intel Core i5 14500T, RAM 32 ГБ, SSD 1024 ГБ, Intel UHD Graphics 770, Без ОС), CV9L4AT/32GB/1TB

Сначала — короткое отступление про то, как я сам себя напугал

Один из читателей моей прошлой статьи, Иван, оставил комментарий: посоветовал перепроверить, какие порты на моём боевом сервере торчат наружу в интернет. Я открыл конфиг — и у меня волосы встали дыбом: в docker-compose (файле, который описывает, какие сервисы и на каких портах запускаются) наружу без всякой защиты выглядели доступными порт базы данных PostgreSQL, административный бэкенд, Docker Registry (хранилище образов приложений) и ещё пара сервисов. Я бросился всё закрывать.

Закрыл, задеплоил, выдохнул — вроде в безопасности. Вернулся к обычной разработке. Примерно через день, починил какой-то баг, сделал пуш — и тут заметил, что деплой завис. Начал разбираться и обнаружил: пропала связь между контуром разработки, где крутится Drone (система CI/CD — автоматической сборки и доставки кода), и registry на проде — Drone просто не мог достучаться до порта, который я сам же и закрыл.

Полез разбираться дальше — и вот тут выяснилась главная деталь. Порты оказались закрыты, а раньше были открыты наружу и защищены firewall (файрвол — программа-фильтр сетевого трафика), который пускал только доверенные адреса, а я про него банально забыл. Испугался я, в общем, собственной забывчивости больше, чем реальной дыры в безопасности. Но раз уж полез разбираться — заодно пересмотрел всю политику доступа и сделал её основательнее: включил логирование подключений к базе (раньше даже проверить не мог, ломился ли кто-то снаружи), закрыл лишние порты, которые правда были не нужны, и оставил открытым только то, что требуется CI/CD и защищено по IP.

И раз уж я обещал Ивану, что он станет героем следующей статьи за свою бдительность — считайте обещание выполненным. Спасибо, что заметили.

А теперь — к главной теме.

Почему аренда серверов перестала устраивать

Для проекта mesty.ru у меня было два арендованных VPS (виртуальных сервера): один под продакшен (боевую версию сайта), второй под разработку. У каждого — 2 ГБ RAM, 40 ГБ SSD, 2 CPU, и это стоило 800₽ в месяц за штуку.

В какой-то момент мощности перестало хватать. Смотрю на апгрейд — до 60 ГБ SSD и 4 CPU — и цена сразу прыгает до 1600₽ за сервер, то есть 3200₽ за оба. При этом прироста производительности на этот скачок цены явно недостаточно.

Я обзвонил и посмотрел альтернативных хостеров — везде плюс-минус одинаковые условия, сэкономить получится максимум пару сотен рублей, принципиально ситуацию это не меняет.

Первая мысль, конечно — посмотреть в сторону сервера enterprise-уровня. Глянул ценники — конские, для соло-разработчика неподъёмные. Стал думать, как вообще эту проблему решают другие. Начал копать — и нашёл на YouTube целое комьюнити хоумлабберов (энтузиастов домашних серверов): кто-то печатает стойки и крепления на 3D-принтере, кто-то собирает всё на Raspberry Pi, кто-то принципиально берёт технику Apple. Раз люди годами так живут — почему бы не попробовать и мне.

Тонкий клиент — мимо

Сперва захотелось взять что-то совсем компактное и дешёвое, например тонкий клиент (устройство, которое обычно используют для удалённого подключения к чужому серверу, а не для самостоятельной работы). Быстро отклонил: тонкие клиенты проектируются под рендеринг RDP/VDI-сессий (удалённый рабочий стол), а не под серверную нагрузку — слабый процессор без многопоточности, память часто впаяна намертво и не расширяется, обычно нет нормального NVMe (быстрого твердотельного накопителя, подключаемого напрямую к материнской плате, а не через привычный SATA-разъём).

Категория устройства: бизнес-десктоп компактного форм-фактора

Открываю браузер вбиваю адрес маркетплейса и вижу экспансию китайских мини-ПК. Но, немного изучив вопрос, доверия к ним не сложилось: молодая отрасль, незнакомые бренды, непонятно, кто вообще стоит за производством. А я в принципе никогда не беру самое дешёвое — беру среднее или хорошее, а ещё если повезет, по цене ниже рынка. Так что переключился на линейку компактных бизнес-десктопов от знакомых брендов — Lenovo ThinkCentre Tiny, ASUS Mini PC и HP ProDesk Mini, конкурирующие линейки одного класса у разных производителей. В отличие от потребительских мини-ПК, они изначально рассчитаны на длительную непрерывную эксплуатацию — что и нужно для сервера, который работает 24/7/365.

Критерии, по которым я отбирал модель:

  • Многоядерность важнее частоты одного ядра. Моя нагрузка параллельна: одновременно крутятся PostgreSQL (база данных), FastAPI (бэкенд), несколько процессов парсинга через Playwright — им важно количество ядер, а не скорость одного.
  • Обязательно 2 слота SO-DIMM (разъёмы для модулей оперативной памяти в компактных устройствах) — чтобы можно было нарастить память в будущем.
  • Wake-on-LAN — возможность включить компьютер удалённо с другого устройства, отправив специальный сетевой пакет, который его «пробуждает».
  • Без дискретной видеокарты и NPU (нейропроцессора) — локальный ИИ-инференс пока не нужен, есть сторонний API.
  • Поддержка Power-On after AC power loss в BIOS — это критично: сервер должен сам включаться после сбоя электричества, без моего ручного участия.
  • Только новое устройство, никакого б/у — риск скрытых дефектов слишком высок.

Рассмотрел несколько вариантов и по очереди их отклонил:

  • HP ProDesk 600 G3 SFF (i5-7500) — устаревшая платформа 2017 года, 4 ядра без Hyper-Threading (технологии, позволяющей одному ядру обрабатывать два потока задач одновременно), накопитель — медленный SATA, а не NVMe.
  • HP800 G5 (условный «i9») — несмотря на громкое имя, процессор слабее по многопоточной производительности, чем современный i5: 8 старых ядер 2019 года против 14 ядер новой архитектуры. А ещё косвенные признаки (страна-изготовитель, комплект периферии, формальные поля карточки) намекали, что это, скорее всего, списанный американский корпоративный лизинг, выдаваемый за новое устройство — прямое нарушение моего же требования.
  • ASUS Mini PC на Core Ultra 5 — переплата за неиспользуемую лицензию Windows 11 Pro, потребительский, а не бизнес-класс, маленький корпус с риском перегрева под долгой нагрузкой, ненужный NPU.

Финальный выбор — HP ProDesk 400 G9 Mini: Intel Core i5-14500T, 32 ГБ DDR5, 1 ТБ SSD, ~97 000₽. У ближайшего конкурента, Lenovo ThinkCentre M70q, меньше ядер (10 против 14) и ниже частота буста.

Кстати, попытка получить технические подтверждения у продавца (количество слотов M.2, поддержка автовключения после сбоя питания) до заказа провалилась — продавец отказался отвечать вне чата по уже оформленному заказу. Пришлось искать ответы самому — через официальные спецификации HP и видео-разборки модели.

Откуда взялись требования к памяти и диску

Тут — личная история, которая многое объясняет. Один раз у меня случайно запустились две сборки фронтенда одновременно, и они начали драться за ресурсы сервера — загрузка процессора показывала 120%. Да, именно так, не 100, а 120 — сервер завис почти на час, пришлось перезагружать его жёстко. С тех пор я жёстко ограничил конфигурацию CI/CD (систему автоматической сборки и развёртывания): одновременно может стартовать только одна сборка.

Вторая история — про диск. У меня на сервере крутится Docker Registry (хранилище готовых образов приложений), и он забивает диск примерно за месяц — приходится регулярно чистить вручную. Так что 1 ТБ SSD вместо привычных 40 ГБ — это не роскошь, а необходимость.

UPS — источник бесперебойного питания

ИБП CyberPower 1000ВА, 900 Вт, 4 розетки IEC 320 C13 (OLS1000E)
ИБП CyberPower 1000ВА, 900 Вт, 4 розетки IEC 320 C13 (OLS1000E)

Отдельная история — источник бесперебойного питания (UPS), защита от отключений электричества.

Критерии были жёсткие:

  • Online (double-conversion) топология вместо более дешёвой line-interactive — при пропадании питания online-UPS переключается за ноль миллисекунд, сервер вообще не замечает проблему.
  • Чистая синусоида на выходе — грубо говоря, максимально «правильное» электричество, безопасное для чувствительной техники.
  • Поддержка EBM (External Battery Module — внешнего блока батарей) для расширения автономности в будущем.
  • Обязательная поддержка NUT (Network UPS Tools — программы, которая умеет сама аккуратно выключать сервер при разрядке батареи, чтобы не терять данные).

Выбрал CyberPower OLS1000E (1000VA/900W) — CyberPower и APC оказались наиболее надёжными брендами по совместимости с NUT. Между OLS1000E и более мощной моделью OLS1500E выбрал младшую: моя реальная нагрузка сейчас не превышает 100W, а с будущим расширением (ещё пара мини-ПК) — 250W, так что переплата за 1200W не оправдана.

Забавный (и полезный) момент: на маркетплейсе наткнулся на карточку товара с явно перепутанными характеристиками — заявлен line-interactive вместо online, вес 1.8 кг вместо ожидаемых ~15 кг для UPS такого класса. Хороший урок: перед покупкой проверять физический вес и тип батареи как маркер, что карточка товара вообще достоверна.

UPS обошёлся в 45 178₽.

Считаем деньги

Итого вложение: 96 911₽ (мини-ПК) + 45 178₽ (UPS) = 142 089₽ одноразово.

Погуглил, во сколько обошлась бы аренда сервера с похожими характеристиками (14-ядерный процессор той же линейки, что и у меня). Ближайшая по параметрам готовая конфигурация у хостера — с процессором того же поколения, но вдвое большими объёмами памяти и диска (64 ГБ RAM, 2 ТБ SSD против моих 32 ГБ и 1 ТБ) — стоит около 13 400₽ в месяц. Точного совпадения по моей конфигурации не нашёл, поэтому произвёл честную прикидку в меньшую сторону.

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

Кстати, у меня сейчас ноль подписчиков в канале «Mesty: за кулисами разработки». Совсем. Ноль. Но просмотры под постами растут — значит, читают, просто пока не подписываются. Так что если ты дочитал до этого места и решишь подписаться — ты мгновенно станешь причиной 100%-ного роста моей аудитории. Для меня это будет маленькая, но настоящая победа. Заранее — ты красавчик.

Подписывайся в Telegram или Max — где тебе удобнее, дублирую контент в оба.

1