К содержимому

О панели

Самое дорогое — не ошибка на экране, а молчание

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

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

Панель на сервере знает только свой сервер

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

Ему нужно знать, что происходит на восемнадцати машинах разом; выдать сотруднику доступ к одной из них, не отдав остальные; увидеть трафик всех клиентов одним отчётом; вернуть файл на машине, которую он не поднимал. Внутри одной машины этих ответов нет физически — лицензия и права кончаются на её границе.

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

Панель

данные, права, деньги и рецепты

Агент

типизированные действия, подписи

Шина

очередь, которая доезжает позже

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

Что значит «работает»

Проверено значит сверено на самой машине

У нас «работает» — это не «тесты зелёные». Это: действие выполнено через интерфейс панели на настоящем сервере, а результат сверен на самой машине. Зелёное сообщение в панели проверкой не считается — оно и есть то, что чаще всего врёт.

Чем сверяем

  • ssh файл, права, служба — глазами на машине
  • curl снаружи сайт отвечает из другой сети, а не из localhost
  • mysql строка в базе, версия, выданные права
  • crontab задание действительно легло владельцу
  • sha256 вернувшийся из копии файл — тот же, что был

Что это даёт

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

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

проверено живьём только проверками кода не проверялось

Правило продукта

Панель говорит «принято», а не «готово»

Между нажатием кнопки и изменением на сервере всегда есть расстояние: очередь, шина, ожидание другой операции на том же ресурсе. Пока расстояние не пройдено, «готово» — ложь.

Как делать нельзя

«Сертификат выпущен»

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

Как у нас

«Принято · идёт · чем кончилось»

Операция уходит в журнал с ходом построчно в браузер. Итог — отдельным словом, с причиной отказа, если он был. Ждущая операция так и говорит: «Ждёт: идёт „Создание сайта“ (№ 58)».

Из этого же правила

  • Неполнота названа вслух и стоит перед итогом, а не под катом: в отчёте по трафику видно, какая машина молчит и у какой данные отстали на 36 часов.
  • Сайт без обращений остаётся строкой с нулём и пометкой «за период обращений не было» — он не исчезает из отчёта, оставляя его красивым.
  • Канал уведомлений без ключей честно пишет «не настроено», а не делает вид, что письмо ушло.
  • Копия считается готовой только после того, как её скачали обратно, расшифровали и сверили число таблиц.

Отказ — это тоже работа

Когда нельзя, панель объясняет почему

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

Кривая директива nginx

Проверка не прошла — файл возвращён, причина на экране, сайт продолжает отвечать.

Удаление сервера с сайтами

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

Выключение входа по паролю SSH

Если ни у root, ни у пользователей нет ключа, агент отказывает: иначе машина закрылась бы от владельца.

Правило, оставляющее SSH открытым не всем

Требует отметки «понимаю», и порт проверяют оба — панель и агент, по тому, что sshd слушает на самом деле.

Понижение версии MySQL

Нечем, и на экране объяснено почему, а не спрятано серой кнопкой.

Оплата картой, пока ключи не подключены

Отказ словами: «приём оплаты не подключён, счёт можно оплатить по реквизитам». Счёт закрывается вручную.

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

Безопасность подробнее

Честно

Что ещё не готово

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

Нет вовсе

  • Список разрешённых адресов для входа в панель

    Есть только защита от перебора. Механизм целиком зависит от правильных доверенных прокси, и выкладывать его вслепую хуже, чем не иметь: он либо не сработает, либо запрёт всех.

  • Выдача запроса на подпись (CSR) наружу

    Панель собирает его только внутри своего выпуска сертификата. Отдать тело запроса для чужого центра сертификации пока нечем.

  • Вторая панель наготове

    Восстановление — подъём из проверенной копии, десятки минут. Осознанный обмен: простой кабинета не роняет сайты клиентов.

  • Отдельная копия базы без сайта

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

Написано, но живьём не проверено

  • Почта клиентов и свой DNS

    Сделаны целиком — ящики, подписи DKIM, доставляемость, своя веб-почта. На боевой машине ни одна не сделана ни почтовой, ни сервером имён.

  • Выпуск сертификата через запись в DNS

    Свой клиент ACME написан, но живым центром сертификации путь не проходили: по DNS не выпущен ни один сертификат.

  • Сверка баз, доступов FTPS и заданий планировщика с машиной

    Механизм есть и данные с машин приходят, но живой сверкой его не проверяли ни разу.

  • Подъём панели с нуля по плану восстановления

    Команды плана сверены с выкладкой (до этого они не работали вовсе), но целиком порядок живым подъёмом не проходили.

Сделано наполовину

  • Шина одним узлом

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

  • Возврат копии «в свою базу»

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

  • Подтверждение падения сайта при одной машине в парке

    Панель стала вторым свидетелем — стучит в порт. Но если закрыты все порты, вердикт по-прежнему «не подтверждено»: одним свидетелем «машина мертва» и «сети нет у панели» не различить.

  • Письма самой панели

    Отправка не настроена: подтверждение адреса и сброс пароля не уезжают. Экраны так и говорят «письмо не уйдёт» и зовут в «Поддержку».

Есть и решения, которые выглядят как дыры, но дырами не являются. Сервер нельзя передать в другую организацию: она зашита в конфигурацию агента и в права на шине, а не в одно поле панели — машину отдают, подключая её заново в кабинете клиента. Три узла шины на одной машине мы не ставим: они умрут вместе с ней. Такое объясняется на месте, а не замалчивается.

Проверьте сами на одной машине

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