5.3.5. Развертывание WAR в Tomcat Linux Service

Инструкция ниже разработана и проверена для Ubuntu 18.04, для пакетов tomcat9 и tomcat8.

  1. Откройте диалог в Studio: дерево проектов CUBA > Project > Deployment > WAR Settings, или просто вручную добавьте задачу buildWar в конец скрипта сборки build.gradle. Вы можете указать отдельный файл проекта war-context.xml для указания настроек подключения к базе данных, или предоставить этот файл позже на сервере:

    task buildWar(type: CubaWarBuilding) {
        appHome = '${app.home}'
        singleWar = true
        includeContextXml = true
        includeJdbcDriver = true
        appProperties = ['cuba.automaticDatabaseUpdate': true]
        webXmlPath = 'modules/web/web/WEB-INF/single-war-web.xml'
        coreContextXmlPath = 'modules/core/web/META-INF/war-context.xml'
    }

    Если параметры конечного сервера отличаются от тех, что установлены на локальном Tomcat, используемом для быстрого развертывания, укажите соответствующие свойства приложения. Например, если конечный сервер запущен на порту 9999 и вы используете сборку раздельных WAR файлов, то определение задачи должно выглядеть следующим образом:

    task buildWar(type: CubaWarBuilding) {
        appHome = '${app.home}'
        singleWar = false
        includeContextXml = true
        includeJdbcDriver = true
        appProperties = [
            'cuba.automaticDatabaseUpdate': true,
            'cuba.webPort': 9999,
            'cuba.connectionUrlList': 'http://localhost:9999/app-core'
        ]
    }
  2. Запустите Gradle задачу buildWar. В результате, файл app.war (или несколько файлов, если вы настроили сборку раздельных WAR) будет собран в каталоге build/distributions вашего проекта.

    gradlew buildWar
  3. Установите пакет Tomcat 9:

    sudo apt install tomcat9
  4. Скопируйте сборку app.war в каталог /var/lib/tomcat9/webapps сервера. Вы также можете удалить каталог /var/lib/tomcat9/webapps/ROOT с примером веб-приложения, если он существует.

    Служба Tomcat 9 по умолчанию работает от пользователя tomcat. Владелец каталога webapps - также tomcat.

  5. Создайте домашний каталог приложения, например /opt/app_home и сделайте пользователя, под которым работает Tomcat (tomcat), владельцем этого каталога:

    sudo mkdir /opt/app_home
    sudo chown tomcat:tomcat /opt/app_home
  6. Сервис Tomcat 9 (в отличие от предыдущих версий Debian-пакета Tomcat) работает в "песочнице" systemd и имеет ограниченный доступ к файловой системе. Дополнительную информацию об этом см. в файле /usr/share/doc/tomcat9/README.Debian. Необходимо поменять настройки systemd, чтобы разрешить сервису Tomcat доступ на запись к домашнему каталогу приложения:

    1. Создайте файл override.conf в каталоге /etc/systemd/system/tomcat9.service.d/

      sudo mkdir /etc/systemd/system/tomcat9.service.d/
      sudo nano /etc/systemd/system/tomcat9.service.d/override.conf
    2. Содержимое файла override.conf:

      [Service]
      ReadWritePaths=/opt/app_home/
    3. Обновите конфигурацию systemd, выполнив:

      sudo systemctl daemon-reload
  7. Создайте конфигурационный файл /usr/share/tomcat9/bin/setenv.sh со следующим содержимым:

    CATALINA_OPTS="$CATALINA_OPTS -Xmx1024m"
    CATALINA_OPTS="$CATALINA_OPTS -Dapp.home=/opt/app_home"

    Если вы наблюдаете медленный запуск Tomcat, установленного на виртуальной машине (VPS), добавьте дополнительную строчку в скрипт setenv.sh:

    CATALINA_OPTS="$CATALINA_OPTS -Djava.security.egd=file:/dev/./urandom"
  8. Если вы хотите предоставить параметры подключения к БД через локальный файл на сервере, создайте файл в каталоге /var/lib/tomcat9/conf/Catalina/localhost/. Название файла зависит от названия WAR-сборки, например app.xml для single WAR, или app-core.xml, если собираются раздельные WAR-файлы. Скопируйте содержимое context.xml в этот файл.

  9. При использовании настроек по умолчанию, все журнальные сообщения приложения попадают в системный журнал /var/log/syslog. У вас есть два варианта, как кастомизировать настройки журналов:

    • Создать файл конфигурации logback в вашем проекте. Укажите путь к этому файлу в параметре logbackConfigurationFile задачи buildWar (вручную или с помощью диалога Studio WAR Settings).

    • Создать файл с настройками журналирования на конечном сервере.

      Скопируйте файл logback.xml из локального Tomcat (под-папка deploy/tomcat/conf проекта) в домашний каталог приложения и поменяйте свойство logDir в этом файле:

      <property name="logDir" value="${app.home}/logs"/>

      Добавьте следующую строчку в скрипт setenv.sh, чтобы указать путь к настройкам журналирования:

      CATALINA_OPTS="$CATALINA_OPTS -Dlogback.configurationFile=/opt/app_home/logback.xml"
  10. Перезапустите службу Tomcat:

    sudo systemctl restart tomcat9
  11. Откройте http://localhost:8080/app в вашем веб-браузере.

Изменения в случае использования пакета tomcat8

CUBA поддерживает развертывание и в Tomcat 9, и в Tomcat 8.5. Примите во внимание следующие различия процедуры развертывания приложения в Tomcat 8.5:

  • Tomcat 8.5 предоставляется пакетом tomcat8

  • Имя пользователя - tomcat8

  • Base каталог Tomcat - /var/lib/tomcat8

  • Home каталог Tomcat - /usr/share/tomcat8

  • Сервис Tomcat не использует "песочницу" systemd, поэтому нет необходимости менять настройки systemd.

  • Стандартные потоки вывода и ошибок пишутся в файл /var/lib/tomcat8/logs/catalina.out.

Решение проблем интеграции аддона Reporting с LibreOffice при использовании пакета tomcat9

При развертывании приложения через пакет tomcat9 и использовании интеграции аддона Reporting с LibreOffice вы можете столкнуться с проблемами запуска процессов LibreOffice. Ошибку можно диагностировать по этому сообщению в журнале:

2019-12-04 09:52:37.015 DEBUG [OOServer: ERR] com.haulmont.yarg.formatters.impl.doc.connector.OOServer - ERR: (process:10403): dconf-CRITICAL **: 09:52:37.014: unable to create directory '/.cache/dconf': Read-only file system.  dconf will not work properly.

Эта ошибка вызывана тем, что домашний каталог пользователя tomcat указывает на каталог, недоступный для записи. Это можно исправить, поменяв домашнюю папку пользователя tomcat на значение /var/lib/tomcat9/work:

# проблемное значение
echo ~tomcat
/

# исправить
sudo systemctl stop tomcat9
sudo usermod -d /var/lib/tomcat9/work tomcat
sudo systemctl start tomcat9