Руководство по установке

Эта страница — технический справочник по инсталлятору. Если вы разворачиваете сервер впервые — идите по пути новичка: АзбукаБольшое руководство, там те же шаги объяснены «на пальцах».

Требования

Параметр Минимум
ОС Linux с systemd. Полная поддержка: Ubuntu 22.04/24.04, Debian 12+. Экспериментально: Rocky/Alma/Fedora (dnf, firewalld-шим, EPEL), openSUSE. Не поддерживаются: Alpine, *BSD, macOS (нет systemd)
Архитектура x86_64 или aarch64
Диск ≥ 10 ГБ свободно на /
RAM ≥ 1 ГБ (при < 2 ГБ автоматически создаётся swap 2 ГБ)
Доступ root (или sudo)
Сеть исходящий доступ в интернет (apt, NodeSource, Docker, GitHub, get.k3s.io)

Установка

git clone https://github.com/your-org/mitdev.git
cd mitdev
sudo ./install.sh

Шаги инсталлятора

1. Проверка окружения (preflight)

Автоматически проверяются: права root, дистрибутив и версия Ubuntu, архитектура, доступ в интернет, тип виртуализации, свободный диск, RAM, занятость APT другим процессом. Критические проблемы останавливают установку с понятным сообщением; предупреждения (например, мало RAM) установку не блокируют.

2. Выбор компонентов

Чекбокс-список. Обязательные модули (система, пользователь, усиление SSH, утилиты, очистка) не отображаются и выполняются всегда.

Компонент По умолчанию Примечание
Node.js 24 + pnpm + yarn NodeSource + corepack
Docker + Compose + Buildx официальный репозиторий
Nginx дефолтный сайт + health-endpoint
PM2 требует Node.js (добавится сам)
Certbot требует Nginx (добавится сам)
UFW SSH открывается до включения
Fail2Ban sshd-jail на вашем порту
PostgreSQL пакет Ubuntu, роль + база для деплоя
PostgreSQL-кластер потоковая репликация, требует PostgreSQL
Redis localhost + requirepass
MongoDB 8.0, официальный репозиторий
RabbitMQ + management-плагин
MinIO бинарник + systemd-юнит
Kubernetes k3s + kubectl + Helm; режимы single / init / join (HA-кластер)
Виртуальный IP PG keepalived, требует PostgreSQL-кластер, только одна L2-сеть

Зависимости разрешаются автоматически: PM2 → Node.js, Certbot → Nginx, PostgreSQL-кластер → PostgreSQL, Виртуальный IP → PostgreSQL-кластер.

3. Пользователь деплоя

Пользователь получает sudo, группу docker (если выбран Docker) и каталоги ~/apps ~/docker ~/logs ~/backups ~/scripts с правами 750.

Сгенерированные приватные ключи хранятся root-only: /root/.mitdev-keys/<пользователь>_ed25519 и /root/.mitdev-keys/root_ed25519. После установки их можно показать командами sudo mitdev ssh-key show deploy и sudo mitdev ssh-key show root, затем импортировать в Termius: Keychain → New Key → Import/Paste private key.

4. Безопасность SSH

Конфигурация пишется в drop-in /etc/ssh/sshd_config.d/99-mitdev.conf и применяется только после успешного sshd -t.

5. PostgreSQL-кластер (если выбран)

Выбор роли сервера:

Watchdog самовосстановления ставится на все узлы кластера (и на primary тоже — для fencing/самопонижения при возврате после failover).

5а. Kubernetes (если выбран)

Режим сервера: single (одиночный), init (первый сервер HA-кластера) или join (присоединение — URL https://<IP>:6443 и токен из mitdev k8s token, плюс IP пиров для файрвола).

5б. База данных проекта (если выбран PostgreSQL)

Инсталлятор спрашивает имя базы, пользователя БД и пароль (пусто — сгенерировать; двойной ввод). Повторный запуск с новым паролем обновляет его у существующей роли. На реплике кластера вопросы не задаются — база и учётные данные приезжают с primary через репликацию. Всё сохраняется в /root/.mitdev-credentials.

6. Подтверждение плана

Полный список модулей (с пометкой «переустановка» для уже выполненных), настройки пользователя, SSH и кластера. Установка начинается только после «Да».

7. Установка

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

8. Итоговая сводка

IP сервера, версия Ubuntu, версии Node/Docker/Compose/PM2, статусы Nginx/UFW/Fail2Ban, имя пользователя, каталоги, пути к журналам и файлу учётных данных.

Повторный запуск (идемпотентность)

Повторный запуск безопасен. Выполненные модули определяются по маркерам в /var/lib/mitdev/state/ и помечаются «(уже установлен)»; на каждом инсталлятор спросит, переустанавливать ли. Внутри модулей все операции проверяют текущее состояние (существующий пользователь, настроенный пароль Redis, работающая реплика PostgreSQL и т.д.) и не ломают его.

Неинтерактивные переопределения

Любое значение из config/defaults.conf переопределяется окружением (полный список — CONFIGURATION.md):

sudo NODE_MAJOR=24 TIMEZONE=Europe/Amsterdam SWAP_SIZE_MB=4096 ./install.sh

Что и куда ставится

Что Куда
Копия проекта /opt/mitdev
Команда mitdev /usr/local/bin/mitdev (симлинк)
Состояние и маркеры /var/lib/mitdev/
Манифесты k8s-приложений /var/lib/mitdev/k8s/
Журналы /var/log/mitdev/install.log, errors.log
Пароли служб /root/.mitdev-credentials (0600, только root)
Drop-in sshd /etc/ssh/sshd_config.d/99-mitdev.conf
Jail Fail2Ban /etc/fail2ban/jail.local
Параметры репликации PG /etc/postgresql/<v>/main/conf.d/99-mitdev-replication.conf

После установки

sudo bash /opt/mitdev/tests/verify.sh   # верификация всех модулей
mitdev doctor                           # диагностика
sudo mitdev ssh-key status              # пути и команды для ключей Termius
sudo mitdev ssh-key show deploy         # приватный ключ deploy-пользователя
sudo mitdev ssh-key show root           # приватный ключ root, если root-вход разрешён
sudo cat /root/.mitdev-credentials      # пароли служб

Важно: если вы сменили порт SSH — проверьте новое подключение (ssh -p <порт> <пользователь>@<ip>), не закрывая текущую сессию.

Типовые сценарии

Веб-сервер под Node-приложения

Компоненты по умолчанию → mitdev app → домен + SSL. Готово.

Docker-хост

Достаточно Docker + Nginx + Certbot + UFW + Fail2Ban. Приложения — через mitdev app (compose-файл подхватывается автоматически).

Kubernetes-нода

Выберите Kubernetes (+ по желанию Nginx: тогда traefik отключится, публикация пойдёт через nginx). Деплой: mitdev k8s deploy <имя> <образ> [порт] [домен].

Кластер PostgreSQL из трёх узлов (рекомендуемая схема)

1 primary + 2 replica с авто-failover и единой строкой подключения через виртуальный IP:

  1. Узел A: модули «PostgreSQL-кластер» (primary, реплики B C) + «Виртуальный IP» (например 10.0.0.100/24, пиры B C).
  2. sudo cat /root/.mitdev-credentials на A → replication_password.
  3. Узлы B и C: те же модули, роль replica, primary = A, авто-failover «Да», тот же VIP. На C задайте PROMOTE_DELAY=45 (приоритет B).
  4. Приложения подключаются к postgresql://…@10.0.0.100:5432/… — строка не меняется даже после failover. Доступ каждому серверу приложений откройте на всех узлах: mitdev pg allow <ip-приложения>.

Ресурсы DB-узла: 1 ГБ RAM / 2 ядра — рабочий минимум для небольших нагрузок (инсталлятор сам создаст swap 2 ГБ); комфортно — от 2 ГБ. Узлы кластера держите выделенными под PostgreSQL — не совмещайте с Docker- приложениями и тем более с Kubernetes (k3s один съедает ~512 МБ).

Узлы в разных дата-центрах (нет общей сети)? Модуль pgvip пропустите — VIP работает только в одной L2-сети. Вместо него на каждом сервере приложений выполните mitdev pg proxy <ip1> <ip2> <ip3>: приложения подключаются к 127.0.0.1:5432, HAProxy сам направляет на текущий primary. Репликация и клиенты между ДЦ — только по TLS (настраивается автоматически). Подробности — в COMMANDS.md.

Полный сценарий и действия после failover — в COMMANDS.md.

Устранение неполадок

См. TROUBLESHOOTING.md.