Упаковка приложения в 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