Top.Mail.Ru
Упаковка приложения в RPM- или DEB-дистрибутив | Tarantool
Tarantool
Узнайте содержание релиза 2.8
Tarantool Cartridge Cartridge CLI Команды Cartridge CLI Упаковка приложения Упаковка приложения в RPM- или DEB-дистрибутив

Упаковка приложения в RPM- или DEB-дистрибутив

Команда cartridge pack rpm|deb создает RPM- или DEB-пакет.

Локальной упаковкой дистрибутива RPM или DEB можно управлять с помощью параметров ниже. Параметры, общие для всех типов дистрибутивов, вы найдете на странице с описанием команды pack.

--deps Зависимости пакета.
--deps-file Путь к файлу, содержащему зависимости пакета. По умолчанию это package-deps.txt в директории приложения.
--preinst Путь к скрипту, выполняемому перед установкой RPM-/DEB-пакета.
--postinst Путь к скрипту, выполняемому после установки RPM-/DEB-пакета.
--unit-template Путь к шаблону юнит-файла для systemd.
--instantiated-unit-template Путь к шаблону юнит-файла для systemd, позволяющего запускать экземпляры приложения (instantiated unit file).
--stateboard-unit-template Путь к шаблону юнит-файла для systemd, позволяющего запустить stateboard-экземпляр приложения.
--unit-params-file Путь к файлу, содержащему параметры юнит-файла для systemd. По умолчанию — systemd-unit-params.yml в директории приложения.

Итоговый артефакт получит следующее название: <имя_приложения>-<версия>[-<суффикс>].{rpm,deb}.

Имя пакета аналогично имени приложения и не зависит от имени артефакта.

Если вы используете для разработки версию Tarantool с открытым исходным кодом, пакет будет содержать зависимость tarantool с версией >= <major>.<minor> и < <major+1>, где <major>.<minor> — версия Tarantool, которую вы использовали для упаковки приложения.

В пакет будут помещены следующие файлы:

  • Содержимое директории приложения. Будет распаковано в /usr/share/tarantool/<имя_приложения>. Если вы используете Tarantool Enterprise, директория также будет содержать бинарные файлы tarantool и tarantoolctl.
  • Юнит-файлы, позволяющие запускать приложение как сервис systemd. Будут распакованы как /etc/systemd/system/<имя_приложения>.service и /etc/systemd/system/<имя_приложения>@.service.
  • Юнит-файл stateboard-экземпляра приложения. При распаковке помещается в /etc/systemd/system/<имя_приложения>-stateboard.service. Будет упакован, только если в корневом каталоге приложения есть файл stateboard.init.lua.
  • Файл /usr/lib/tmpfiles.d/<имя_приложения>.conf, благодаря которому экземпляр перезапускается после перезагрузки сервера.

При установке пакета создаются следующие директории:

  • /etc/tarantool/conf.d/, где хранится конфигурация экземпляров;
  • /var/lib/tarantool/, где хранятся снимки данных экземпляров;
  • /var/run/tarantool/, где хранятся PID-файлы и сокеты консоли (console sockets).

Параметры --deps и --deps-file требуют схожих форматов информации о зависимостях. Однако параметр --deps не позволяет указывать мажорные и минорные версии:

# Так сделать не удастся:
cartridge pack rpm --deps dependency_06>=4,<5 appname

# Вместо этого укажите версии так:
cartridge pack rpm --deps dependency_06>=4,dependency_06<5 appname

# Или так:
cartridge pack rpm --deps dependency_06>=4 --deps dependency_06<5 appname

С помощью параметра --deps-file можно указать файл, где перечислены зависимости. По умолчанию это файл package-deps.txt, расположенный в корневой директории приложения. Если вы создали приложение по шаблону, файл package-deps.txt уже находится в корневой директории.

dependency_01 >= 2.5
dependency_01 <
dependency_02 >= 1, < 5
dependency_03==2
dependency_04<5,>=1.5.3

Каждая строка описывает одну зависимость. Для каждой зависимости можно указать мажорную и/или минорную версию, а также минимальную и максимальную совместимую версию.

Вы можете добавить Bash-скрипты, которые будут запущены до установки вашего RPM/DEB-пакета и после нее соответственно. Это может пригодиться, например, если вы хотите настроить символические ссылки (symlinks). Поместите эти файлы в корневую директорию приложения.

Скрипт, выполняемый перед установкой, по умолчанию носит имя preinst.sh, а скрипт, выполняемый после установки — postinst.sh.

Чтобы указать скрипты с другими именами, используйте соответствующие параметры --preinst и --postinst в cartridge pack.

Укажите абсолютные пути к исполняемым файлам скриптов или используйте /bin/sh -c ''.

/bin/sh -c 'touch file-path'
/bin/sh -c 'mkdir dir-path'
# или
/bin/mkdir dir-path

Используйте параметры --unit-template, --instantiated-unit-template и --stateboard-unit-template, чтобы сделать юнит-файлы приложения отличными от стандартных.

Вам может понадобиться модифицировать стандартные юнит-файлы, если необходимо развернуть RPM-/DEB-пакет на платформе, отличной от той, на которой вы его собирали. В этом случае ExecStartPre может содержать неверный путь к mkdir. Редактирование юнит-файлов позволяет без труда решить эту проблему.

Юнит-файлы могут содержать текстовые шаблоны.

Это юнит-файл, позволяющий запускать экземпляры приложения.

[Unit]
Description=Tarantool Cartridge app {{ .Name }}@%i
After=network.target

[Service]
Type=simple
ExecStartPre=/bin/sh -c 'mkdir -p {{ .InstanceWorkDir }}'
ExecStart={{ .Tarantool }} {{ .AppEntrypointPath }}
Restart=on-failure
RestartSec=2
User=tarantool
Group=tarantool

Environment=TARANTOOL_APP_NAME={{ .Name }}
Environment=TARANTOOL_WORKDIR={{ .InstanceWorkDir }}
Environment=TARANTOOL_CFG={{ .ConfPath }}
Environment=TARANTOOL_PID_FILE={{ .InstancePidFile }}
Environment=TARANTOOL_CONSOLE_SOCK={{ .InstanceConsoleSock }}
Environment=TARANTOOL_INSTANCE_NAME=%i

LimitCORE=infinity
# Отключение OOM killer
OOMScoreAdjust=-1000
# Увеличение лимита fd для Vinyl
LimitNOFILE=65535

# Systemd ожидает, пока все логи xlog не будут восстановлены
TimeoutStartSec=86400s
# Ожидание, пока логи xlog не закроются
TimeoutStopSec=10s

[Install]
WantedBy=multi-user.target
Alias={{ .Name }}.%i

Name Имя приложения.
StateboardName Имя stateboard-экземпляра приложения (<имя_приложения>-stateboard).
DefaultWorkDir Рабочая директория экземпляра, заданная по умолчанию (/var/lib/tarantool/<имя_приложения>.default).
InstanceWorkDir Рабочая директория приложения, заданная по умолчанию (/var/lib/tarantool/<имя_приложения>.<имя_экземпляра>).
StateboardWorkDir Рабочая директория stateboard-экземпляра (/var/lib/tarantool/<имя_приложения>-stateboard).
DefaultPidFile PID-файл экземпляра, заданный по умолчанию (/var/run/tarantool/<имя_приложения>.default.pid).
InstancePidFile PID-файл экземпляра приложения (/var/run/tarantool/<имя_приложения>.<имя_экземпляра>.pid).
StateboardPidFile PID-файл stateboard-экземпляра (/var/run/tarantool/<имя_приложения>-stateboard.pid).
DefaultConsoleSock Сокет консоли экземпляра, заданный по умолчанию (/var/run/tarantool/<имя_приложения>.default.control).
InstanceConsoleSock Сокет консоли экземпляра приложения (/var/run/tarantool/<имя_приложения>.<имя_экземпляра>.control).
StateboardConsoleSock Сокет консоли stateboard-экземпляра (/var/run/tarantool/<имя_приложения>-stateboard.control).
ConfPath Путь к конфигурации экземпляров приложения (/etc/tarantool/conf.d).
AppEntrypointPath Путь к точке входа приложения (/usr/share/tarantool/<имя_приложения>/init.lua).
StateboardEntrypointPath Путь к точке входа stateboard-экземпляра (/usr/share/tarantool/<имя_приложения>/stateboard.init.lua).

Вы можете передать некоторые параметры в юнит-файл приложения, используя специальный файл настроек — по умолчанию это systemd-unit-params.yml в директории проекта. Чтобы использовать другой файл, укажите его имя с помощью параметра --unit-params-file команды cartridge pack rpm|deb.

Например, fd-limit позволяет ограничить количество файловых дескрипторов, определяемое параметром LimitNOFILE юнит-файла. Еще один пример параметра, который можно указать в файле systemd-unit-params.yml — это stateboard-fd-limit. С его помощью можно установить лимит файловых дескрипторов в юнит-файле для stateboard-экземпляра приложения.

Передавать параметры в юнит-файле для systemd можно также с помощью переменных окружения. Для этого укажите в файле systemd-unit-params.yml данные нужных экземпляров приложения (включая stateboard, если необходимо). Каждый переданный параметр будет преобразован в юнит-файле в строку Environment=TARANTOOL_<параметр>: <значение>. Обратите внимание, что у этих переменных приоритет выше, чем у переменных, заданных в файле конфигурации экземпляра (--cfg).

fd-limit LimitNOFILE для экземпляра приложения
stateboard-fd-limit LimitNOFILE для экземпляра stateboard
instance-env Переменные окружения cartridge.argparse (например, net-msg-max) для экземпляра приложения
stateboard-env Переменные окружения cartridge.argparse (например, net-msg-max) для stateboard-экземпляра приложения

systemd-unit-params.yml:

fd-limit: 1024
stateboard-fd-limit: 2048
instance-env:
    app-name: 'my-app'
    net_msg_max: 1024
    pid_file: '/some/special/dir/my-app.%i.pid'
    my-param: 'something'
    # или
    # TARANTOOL_MY_PARAM: 'something'
stateboard-env:
    app-name: 'my-app-stateboard'
    pid_file: '/some/special/dir/my-app-stateboard.pid'

Если вы используете для разработки версию Tarantool с открытым исходным кодом, Tarantool будет среди зависимостей пакета. В этом случае перед установкой собранного RPM-/DEB-пакета необходимо подключить репозиторий Tarantool и разрешить менеджеру пакетов установить эту зависимость:

curl -L https://tarantool.io/installer.sh | VER=${TARANTOOL_VERSION} bash

После этого можно устанавливать пакет приложения.

После установки пакета настройте экземпляры, которые хотите запустить.

Вот как может выглядеть файл конфигурации myapp.yml, расположенный в директории /etc/tarantool/conf.d и позволяющий запустить два экземпляра приложения myapp:

myapp:
  cluster_cookie: secret-cookie

myapp.instance-1:
  http_port: 8081
  advertise_uri: localhost:3301

myapp.instance-2:
  http_port: 8082
  advertise_uri: localhost:3302

Узнайте больше о настройке экземпляров приложений на Cartridge.

Теперь запустите настроенные экземпляры:

systemctl start myapp@instance-1
systemctl start myapp@instance-2

Если восстановление после cбоев у вас работает в режиме stateful, запустите также stateboard-экземпляр приложения. Убедитесь, что в корневой директории приложения есть файл stateboard.init.lua.

Добавьте в конфигурацию /etc/tarantool/conf.d/myapp.yml раздел myapp-stateboard:

myapp-stateboard:
  listen: localhost:3310
  password: passwd

Затем запустите сервис stateboard:

systemctl start myapp-stateboard