Cloud-init и образы машин
Два способа пропустить ручную установку: вставить шаблон cloud-init при создании VPS или собрать образ машины, где уже всё установлено.
Cloud-init (по одному серверу за раз)
panel/deploy/cloud-init.yaml — это шаблон user-data. Отредактируйте несколько
настроек вверху, вставьте его в поле «user data» вашего провайдера при создании
сервера, и панель поднимается, когда сервер завершит загрузку. Прогресс и любые
сбои попадают в /var/log/nimbopanel-provision.log.
Не воспринимайте user data как хранилище секретов
Это та часть, которую стоит прочитать дважды. У каждого крупного провайдера
user data остаётся доступным изнутри работающего инстанса по HTTP на
169.254.169.254 — и этот адрес достижим любым процессом на машине,
включая PHP-скрипт клиента хостинга.
Так что лицензионный ключ, вставленный в user data, читается каждым клиентом, которого вы хостите, если что-то этому не помешает. Шаблон мешает этому в два шага, именно в этом порядке:
- он закрывает службу метаданных для всех, кроме root, до того как ключ попадёт на диск;
- после того как установщик сохранил ключ в конфигурации, доступной только root, он затирает копию user data на диске.
Если вы предпочли бы не помещать ключ туда вовсе, оставьте поле пустым и введите его из панели позже. Сервер работает без лицензии, пока вы этого не сделаете, — это поддерживаемое состояние.
Образы машин (много серверов из одной сборки)
panel/deploy/packer/nimbopanel.pkr.hcl собирает образ с установленным всем
стеком. Именно на это уходят минуты — пакеты, PHP, почта, DNS, база данных — и
ничего из этого не отличается между серверами.
Ошибка, из-за которой каждый клон становится одним и тем же сервером
Образ не должен содержать никакой идентичности. Если содержит, каждый сервер, собранный из него, разделяет эту идентичность:
| Ошибочно вшито | Что происходит на каждом клоне |
|---|---|
| Ключи хоста SSH | Все они предъявляют один и тот же ключ. Любой, кто находится между клиентом и его сервером, может выдать себя за него — на всех них, без единого предупреждения |
| Instance-id Nimbopanel | Из него выводится отпечаток лицензии, а установщик никогда не пересевает уже существующий id — так тысяча серверов выглядит как одна активация |
/etc/machine-id |
Идентичности systemd, аренд DHCP и journald сталкиваются |
| База данных и конфигурация панели | Пароль администратора, лицензионный ключ и каждый аккаунт едут внутри файла, который скачивают посторонние |
| Ключи DKIM, TLS-сертификаты | Выпущены для сборочной машины; бессмысленны на клоне и утекли всем, у кого есть образ |
Ни одно из этого не заявляет о себе. Это находят позже — кто-то другой.
panel/deploy/image-deidentify.sh удаляет всё это, и сборка Packer запускает
его последним шагом, а затем перезапускает с --check, так что сборка
падает, а не выдаёт снимок, который лишь выглядит чистым. Всё удалённое
пересоздаётся при первой загрузке клона: sshd генерирует новые ключи хоста,
systemd записывает новый machine-id, установщик сеет свежий instance-id.
/etc/machine-id оставляется пустым, а не удаляется — systemd читает пустой
файл как «сгенерировать при загрузке», тогда как отсутствующий файл вообще
мешает некоторым образам загружаться.
Проверьте перед публикацией
sudo ./image-deidentify.sh # remove
sudo ./image-deidentify.sh --check # confirm, exits non-zero if anything survives
Запустите проверку и на загруженном клоне, а не только во время сборки. Если она что-то сообщает, не публикуйте образ.
Размещение на маркетплейсах
Программы «приложение в 1 клик» у провайдеров (Vultr, DigitalOcean, Linode, Contabo) у каждого свой формат подачи и проверку. Образ выше — это артефакт, который они просят; оформление — на стороне каждого провайдера, и это не то, что данный инструментарий может сделать за вас.