Установка на master-сервер с помощью инсталлятора
Обзор
Установка системы производится с локальной машины через ssh-подключение к серверу, если доступный адрес сервера совпадает с адресом, на котором система должна быть развернута.
cd /tmp/era_installer bash install_ssh.sh --ui=text
В иных случаях, когда локальный адрес сервера недоступен снаружи, следует сначала распаковать и скопировать инсталлятор на сервер, затем подключиться по ssh и запустить скрипт.
rsync -avrh --progress -e "ssh -p PORT" /tmp/era_installer USER@HOST:/tmp ssh USER@HOST -p PORT cd /tmp/era_installer bash era/scripts/install.sh --ui=text
Папка /tmp выбрана в качестве назначения в связи с тем, что к ней априори для всех юзеров открыт доступ. Так и рекомендуется поступать.
Ключ --ui=text задаёт текстовый режим: вопросы задаются построчно, ответ подтверждается клавишей Enter.
Без него инсталлятор выбирает псевдографику, если на сервере есть подходящий инструмент: whiptail на Debian-подобных ОС, dialog на остальных.
То же самое можно запустить через диспетчер: bash era/era.sh install --ui=text.
Инсталлятор сначала задаёт все вопросы, затем показывает, что собирается сделать, и меняет сервер только после подтверждения.
В любом вопросе доступны: Enter — принять значение по умолчанию, < — вернуться к предыдущему вопросу, ? — подсказка, ! — показать всё введённое.
Алгоритм процесса установки
1) Запустить скрипт установки: на локальной машине bash install_ssh.sh --ui=text, на сервере bash era/scripts/install.sh --ui=text (или bash era/era.sh install --ui=text).
При запуске с локальной машины сначала спрашиваются данные подключения, затем инсталлятор копирует файлы на сервер и продолжает опрос уже там.
Адрес сервера: 192.168.0.115 Пользователь ssh: admin Порт ssh [22]: Файл ключа ssh:
Ключ можно не указывать — тогда будет запрошен пароль. Проверки целевого хоста (ОС, версия bash, права, место, занятые порты) выполняются до копирования.
2) Дождаться копирования файлов на сервер.
Про каждый крупный файл образа спрашивается отдельно: если он уже лежит на сервере с прошлого раза, копирование можно пропустить.
Скопировать era/image/era_1_11_0-2026_8_31_1_docker.tar.gz (1.2G)? (д/н) [y]:
3) Экран Сервер и роль. Указать адрес, постфикс, каталог данных, имя сервера, роль и мастер-домен.
== Сервер и роль == IP-адрес платформы: 192.168.0.115 Постфикс имени инстанса: _01 Путь к данным [/opt]: Имя сервера в конфигурации [box-115]: srv01 Это мастер-сервер? (д/н): y Имя мастер-домена: pbx.company.ru PSK cookie [era2020key]:
IP-адрес платформы — локальный адрес интерфейса, на котором разворачивается система.
Постфикс присутствует в имени контейнера, в имени инстанса СУБД PostgreSQL (если установлена здесь же) и в именах каталогов файловой системы.
Одновременно на сервере может быть установлено несколько экземпляров системы в разных docker-контейнерах.
Рекомендуется сообщать экземплярам одной системы на разных серверах один и тот же постфикс.
Имя сервера участвует в создании распределенной конфигурации, указывая конкретно на этот сервер.
По умолчанию предлагается hostname машины, но может быть указано любое уникальное значение, не повторяющееся на других серверах.
Имя мастер-домена — корневой домен для создания дерева дочерних доменов и генерации лицензии.
Возможно на этот домен будет выписываться wildcard сертификат SSL, и пользователи будут вводить имя этого домена в адресной строке браузера.
Значения по умолчанию у него нет: домен указывается всегда.
PSK cookie — код доступа между нодами кластера.
Код должен совпадать на всех экземплярах системы, работающих в единой конфигурации.
4) Экран Пакеты и сеть. Указать, есть ли на сервере доступ к интернету и нужен ли прокси.
== Пакеты и сеть == Разрешить установщику скачивать пакеты из интернета? (д/н) [y]: Использовать http/https-прокси? (д/н) [n]:
Если доступ к интернету отсутствует, ответьте n.
Инсталлятор проверит наличие нужных пакетов и, если чего-то не хватает, назовёт недостающее — тогда следует прервать установку и выполнить установку пакетов на сервере.
При ответе y на вопрос о прокси спрашиваются адреса http- и https-сервера.
5) Экран PostgreSQL — режим. Указать, ставить ли СУБД и в каком виде.
== PostgreSQL -- режим == Устанавливать PostgreSQL? (д/н) [y]: y Где разместить PostgreSQL? 1) В хосте 2) В docker-контейнере Выберите номер: 1 Роль этого инстанса PostgreSQL 1) Мастер 2) Реплика (recovery) Выберите номер: 1 Настраивать репликацию? (д/н) [n]: y
Если система будет подключаться к внешним уже существующим серверам или фермам PostgreSQL, установка экземпляра СУБД не требуется — ответьте n.
Тогда будут запрошены параметры подключения к готовому серверу, а при настройке конфигурации указываются строки подключения к дополнительным серверам — репликам или дублерам.
При многосерверной установке экземпляры СУБД устанавливаются лишь на выборочных серверах в соответствии с планом развертки.
Для первого сервера кластера выбирается роль Мастер, для второго — Реплика (recovery).
Репликация поддержана только для режима «в хосте».
Если образ PostgreSQL отсутствует в дистрибутиве, для режима «в docker-контейнере» будет предложено взять образ с Docker Hub.
6) Экран PostgreSQL — доступ. Указать порт, пользователей и пароли.
== PostgreSQL -- доступ == Порт PostgreSQL [5441]: Пользователь БД для платформы [platformpgadmin]: Пароль пользователя БД platformpgadmin [••••••]: Пароль пользователя БД postgres [••••••]: Пользователь репликации [era_replica]: Пароль пользователя БД era_replica [••••••]: Группа ОС для пользователя postgres:
Вопрос о пароле называет учётную запись, для которой он вводится, — если вы задали своё имя пользователя, спросят про него.
ВНИМАНИЕ! Необходимо задавать одинаковые пароли для каждого из этих пользователей при установке на все серверы, экземпляры СУБД которых будут находиться в режиме потоковой репликации.
ВНИМАНИЕ! Не следует указывать стандартный порт 5432 во избежание конфликта, поскольку он будет занят дефолтным экземпляром main.
Группа ОС для пользователя postgres нужна, если данные СУБД размещаются в нестандартном смонтированном разделе: пользователь postgres включается в эту группу и получает доступ к каталогу.
Если группы не создавалось, оставьте поле пустым.
Если на предыдущем экране выбрано «не устанавливать PostgreSQL», вместо этих вопросов спрашиваются адрес и порт готового сервера, имя роли и её пароль.
Предполагается, что во внешней СУБД роль уже создана:
CREATE ROLE platformpgadmin ENCRYPTED PASSWORD '<role_pwd>' LOGIN CREATEDB CREATEROLE INHERIT;
Имя роли может быть произвольным.
7) Экран PostgreSQL — каталоги. Указать, где хранить данные и резервные копии.
== PostgreSQL -- каталоги == Каталог данных PostgreSQL [/var/lib/postgresql/17/era_01]: Каталог резервных копий PostgreSQL [/tmp/pg_backups/era_01]: Очистить каталог данных, если он уже существует? (д/н) [y]:
Умолчание каталога данных зависит от режима: для кластера в хосте это путь пакета, для контейнера — каталог внутри инстанса.
Значения следует изменить, если планом развертки предусмотрено размещение в специфическом смонтированном разделе.
8) Экран Тома платформы. Указать каталоги в хосте под тома контейнера.
== Тома платформы == Том для /var/lib/era [/opt/era_01/lib]: Том для /var/log/era [/opt/era_01/log]: Том для /var/lib/era_files/local [/opt/era_01/local]: Том для /var/lib/era_files/rectemp [/opt/era_01/rectemp]: Том для /var/lib/era_files/logstore [/opt/era_01/logstore]: Том для /var/lib/era_files/syncroot [/opt/era_01/syncroot]: Том для /var/lib/era_files/a [/opt/era_01/a]: Том для /var/lib/era_files/b [/opt/era_01/b]: Том для /var/lib/era_files/c [/opt/era_01/c]:
Назначение каталогов:
-
/var/lib/era— рабочие каталоги (recording, mixing, mnesia); -
/var/log/era— лог-журналы; -
/var/lib/era_files/local— временные файлы веб-сервера и скрипт-машины, вложения файл-сервера; -
/var/lib/era_files/rectemp— временные записи разговоров роли MG; -
/var/lib/era_files/logstore— длительное хранилище лог-журналов; -
/var/lib/era_files/syncroot— хранилище, синхронизируемое между всеми серверами; -
/var/lib/era_files/a,b,c— каталоги для перемещения файлов с одного диска на другой; рекомендуется указывать каталоги с разных дисков.
Следует изменить значения по умолчанию, если планом развертки предусмотрено размещение в специфическом смонтированном разделе.
9) Экран NFS. Указать клиентские каталоги и роль сервера NFS.
== NFS == Локальный каталог для /var/lib/recpath [/opt/era_01/era_recpath]: Локальный каталог для /var/lib/siteshare [/opt/era_01/era_siteshare]: Локальный каталог для /var/lib/globalshare [/opt/era_01/era_globalshare]: Поднять на этом хосте NFS-сервер? (д/н) [n]: Адрес сервера NFS:
Назначение каталогов:
-
recpath— хранилище записей разговоров по умолчанию, может быть небыстрым; рекомендуется заранее смонтировать надёжное файловое хранилище; -
siteshare— сетевая папка, доступная всем серверам текущего сайта; -
globalshare— сетевая папка, доступная всем серверам кластера на всех сайтах.
ВНИМАНИЕ! Режим NFS-сервера на этом же хосте не рекомендуется к использованию: при выпадении данного сервера из кластера доступ к NFS заблокируется на всех остальных серверах.
В идеале адресом сервера NFS должен быть виртуальный адрес группы файловых хранилищ, например работающих по протоколу VRRP, либо адрес устройства, выполняющего функцию надёжного файлового хранилища.
Если адрес оставить пустым, монтирование не производится, и shared-каталоги остаются локальными.
Такой режим годится для хранения записей разговоров и вложений, но лишает возможности использовать сетевые папки в сценариях.
Если монтирование не удалось, установка не прерывается: каталог помечается файлом nomount.sign, и платформа не примет его за рабочее хранилище.
ВНИМАНИЕ! При установке многосайтовой системы настройка mount-каталогов должна производиться более тонко, чем предоставляет скрипт инсталлятора.
В частности, должны быть разделены хранилища siteshare и globalshare.
10) Экран Параметры ядра.
== Параметры ядра == Переиспользовать соединения в TIME_WAIT? (д/н) [n]:
Лимит fs.inotify.max_user_watches инсталлятор поднимает сам — платформа следит за большим числом файлов, и штатного значения ей не хватает.
11) Экран Дополнительные серверы. Появляется только у мастера.
== Дополнительные серверы == Планируется ли установка дополнительных серверов? (д/н) [n]: y Сколько дополнительных серверов? [1]: 2 Имя сервера 1: srv02 IP-адрес сервера 1 (srv02): 192.168.0.116 Имя сервера 2: srv03 IP-адрес сервера 2 (srv03): 192.168.0.117
Здесь ничего не устанавливается: по этому списку в конце будут напечатаны готовые команды для каждого сервера.
Имя должно совпадать с именем сервера в конфигурации, созданной на мастере.
Если дополнительных серверов нет, ответьте n — экран на этом закончится.
12) Экран Проверьте параметры установки. Проверить сводку и план.
== Проверьте параметры установки == Сервер и роль ipaddress 192.168.0.115 ввод srvname srv01 ввод master y ввод ... Будет выполнено на 192.168.0.115: 1. Установить docker 2. Создать каталог данных PostgreSQL /var/lib/postgresql/17/era_01 ... Что делаем? 1) Продолжить -- начать изменение сервера [*] 2) Изменить... 3) Показать / скрыть пароли 4) Сохранить ответы и выйти 5) Показать команду повтора 6) Отмена Выберите номер:
До этого момента сервер не изменялся.
У каждого значения показан источник: ввод, командная строка, файл ответов или умолчание.
Пункт «Изменить…» возвращает к выбранному экрану — в том числе чтобы исправить значение, пришедшее из файла ответов или ключом.
13) Дождаться выполнения. Инсталлятор поднимет PostgreSQL, создаст каталоги, настроит NFS и параметры ядра, загрузит образ и запустит контейнер.
== Применение == -> [1/7] PostgreSQL -> [2/7] Каталоги-тома ... -> [7/7] Инициализация контейнера Ждём до 60 с отчёта контейнера об инициализации. Контейнер инициализирован: Install server success!
Если контейнер сообщит об ошибке, инсталлятор завершится с кодом 5 и приведёт её текст.
14) Посмотреть, что изменилось на сервере. Форма печатается сразу после применения.
== Что изменилось на сервере ==
[ ok ] Пакеты docker-ce, docker-ce-cli, containerd.io и ещё 1
[ ok ] PostgreSQL служба postgresql_17_era_01.service, порт 5441
[ ok ] Роли базы данных platformpgadmin
[ ok ] Каталоги-тома 12 в /opt
[ ok ] NFS-сервер служба nfs-kernel-server, экспортировано каталогов: 3
[ ok ] Общие каталоги смонтировано: 3
[ ok ] Параметры ядра fs.inotify.max_user_watches = 10000000
[ ok ] Контейнер платформы era_01, запущен
[ ok ] Инициализация платформы Install server success!
Изменены системные файлы:
/etc/sysctl.conf
/etc/exports.d/era_nfs.exports
Проверяется состояние системы, а не код возврата команд: служба активна, каталог смонтирован, кластер отвечает, контейнер запущен.
[FAIL] в любой строке означает, что изменение не удалось, и инсталлятор завершится с кодом 5 — даже если все команды отработали.
[warn] — сервер работает, но не полностью: например, порт не открыт в firewalld; на код возврата это не влияет.
[skip] — до шага не дошли, применение оборвалось раньше.
15) Сохранить команды, напечатанные в конце.
== Команды для этого сервера ==
Установить этот сервер заново:
bash era/scripts/install.sh --non-interactive --ipaddress=192.168.0.115 ...
Удалить этот сервер:
bash era/scripts/uninstall.sh --non-interactive --datapath=/opt --eracontainername=era_01 ...
Команды для дополнительных серверов:
srv02 (192.168.0.116):
bash era/scripts/install.sh --non-interactive --ipaddress=192.168.0.116 --srvname=srv02 --master=n --micaddress=mic1@192.168.0.115 --dopginstall=n --pghost=192.168.0.115 ...
srv03 (192.168.0.117):
bash era/scripts/install.sh --non-interactive --ipaddress=192.168.0.117 --srvname=srv03 --master=n --micaddress=mic1@192.168.0.115 --dopginstall=n --pghost=192.168.0.115 ...
Команды дополнительных серверов печатаются, если они были перечислены на экране 11.
Каждую остаётся выполнить на своём сервере: роль узла, адрес mic, база и NFS-сервер мастера в них уже подставлены.
Пароли на экране скрыты; готовая команда со всеми значениями лежит рядом с логом в файле .cmd с правами 0600.
Там же сохраняется файл ответов .params — им удобно повторить установку на другом сервере: bash era/scripts/install.sh --answers-file=<файл>.
Установка завершена.