Упаковка приложения в 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 в директории приложения. |
The resulting artifact name is <app-name>-<version>[.<suffix>]-1_<arch>.deb or
<app-name>-<version>[.<suffix>]-1.<arch>.rpm.
Имя пакета аналогично имени приложения и не зависит от имени артефакта.
Если вы используете для разработки версию 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 уже находится в корневой директории.
Вы можете добавить Bash-скрипты, которые будут запущены до установки вашего RPM/DEB-пакета и после нее соответственно. Это может пригодиться, например, если вы хотите настроить символические ссылки (symlinks). Поместите эти файлы в корневую директорию приложения.
Скрипт, выполняемый перед установкой, по умолчанию носит имя preinst.sh, а скрипт, выполняемый после установки — postinst.sh.
Чтобы указать скрипты с другими именами, используйте соответствующие параметры --preinst и --postinst в cartridge pack.
Укажите абсолютные пути к исполняемым файлам скриптов или используйте /bin/sh -c ''.
Используйте параметры --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