Установка Tomcat
Будем рассматривать установку tomcat на freeBSD 14.1 для развертывания xwiki в качестве примера.
Установка пакетов
Поскольку последняя xwiki поддерживает версию tomcat не выше 9, да и то с определенными оговорками
- Using Tomcat 10 is not possible right now since it moved to the incompatible Jakarta EE 9 API. See Apache Tomcat migration tool for Jakarta EE for mode details.
- Tomcat 9.0.70 has some bugs that make it fail with XWiki. See:
https://jira.xwiki.org/browse/XWIKI-20470(A Tomcat regression now fixed in Tomcat 9.0.71+)
будем ставить версию 8.5, для этого посмотрим какие пакеты есть в репозитории:
tomcat-devel-11.0.0.m22 Open-source Java web server by Apache, 11.0.x branch
tomcat-native-1.3.0_1 Tomcat native library
tomcat-native2-2.0.7 Tomcat native library
tomcat101-10.1.26 Open-source Java web server by Apache, 10.1.x branch
tomcat85-8.5.100 Open-source Java web server by Apache, 8.5.x branch
tomcat9-9.0.91 Open-source Java web server by Apache, 9.0.x branch
root@jail:~ # pkg install tomcat85
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 28 package(s) will be affected (of 0 checked):
New packages to be INSTALLED:
alsa-lib: 1.2.12
apache-commons-daemon: 1.4.0
brotli: 1.1.0,1
dejavu: 2.37_3
fontconfig: 2.15.0_3,1
freetype2: 2.13.2
giflib: 5.2.2
java-zoneinfo: 2021.e
javavmwrapper: 2.7.10
libICE: 1.1.1,1
libSM: 1.2.3_1,1
libX11: 1.8.9,1
libXau: 1.0.9_1
libXdmcp: 1.1.5
libXext: 1.3.6,1
libXfixes: 6.0.0_1
libXi: 1.8_1,1
libXrender: 0.9.10_2
libXt: 1.3.0,1
libXtst: 1.2.3_3
libfontenc: 1.1.8
libinotify: 20211018_1
libxcb: 1.17.0
mkfontscale: 1.2.3
openjdk8: 8.412.08.1
png: 1.6.43
tomcat85: 8.5.100
xorgproto: 2024.1
Number of packages to be installed: 28
The process will require 248 MiB more space.
103 MiB to be downloaded.
Proceed with this action? [y/N]:
Открываем файлы
/usr/local/apache-tomcat-8.5/webapps/host-manager/META-INF/context.xml
/usr/local/apache-tomcat-8.5/webapps/manager/META-INF/context.xml
и правим ip адрес с которого планируем подключаться к панели менеджера в блоке allow=:
<CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
sameSiteCookies="strict" />
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="10\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
Добавляем пользователя и назначаем ему роли, редактируя файл /usr/local/apache-tomcat-8.5/conf/tomcat-users.xml
<role rolename="admin-gui"/>
<user username="tomcat" password="P@ssw0rd" roles="manager-gui,admin-gui"/>
</tomcat-users>
Добавляем службу tomcat в rc.conf и запускаем:
tomcat85_enable: -> YES
root@jail:~ # service tomcat85 start
Теперь можем зайти по адресу http://x.x.x.x:8080, что бы проверить все ли у нас работает.

Установка xwiki
Для установки xwiki нам необходимо скачать Serverlet Container с расширением .war (Можно отсюда: https://www.xwiki.org/xwiki/bin/view/Download/DownloadVersion/?projectVersion=16.6.0 ).
После того как скачали наш файлик советую его переименовать например просто в xwiki.war.
Закидываем его в каталог /usr/local/apache-tomcat-8.5/webapp
Заходим в Manager-App через веб-интерфейс ииии..... видим, что наше приложение не запускается.
А все из-за того что версия tomcat 8.5 тянет с собой зависимости openjdk8: 8.412.08.1, а нам нужна минимум 17 версия.
Ну что ж ставим 17 версию:
Теперь, что бы tomcat понял, что ему надо использовать именно 17 версию java, нам необходимо дописать строчку tomcat85_java_home="/usr/local/openjdk17" в /etc/rc.conf
Перезапускаем tomcat и проверяем, что он использует именно 17, а не 8 версию java:
root 74176 0.0 0.0 12940 2064 - IsJ 11:12 0:00.00 /usr/local/bin/jsvc -java-home /usr/local/openjdk17 -server -user www -umask 0077
Проверяем, что приложение xwiki у нас запустилось через host-manager и переходим к установке СУБД и настройке соединения с ней.
Установка Postgresql
В качестве СУБД для XWIKI я использовал postgresql, почему ? Да просто мне так больше нравится.
Ставим пакеты:
Добавляем сервис:
postgresql_enable: YES -> YES
root@jail:/ #
Инициализируем СУБД:
Далее необходимо отредактировать конфигурационные файлы:
В файле /var/db/postgres/data16/postgresql.conf отредактировать параметр listen_addresses = 'X.X.X.X', где указываем адрес нашего pgsql сервера.
В файле /var/db/postgres/data16/pg_hba.conf правим блоки с ADDRESS и METHOD.
local all all trust
# IPv4 local connections:
host all all 10.0.0.0/8 scram-sha-256
В блоке ADDRESS указываем адреса откуда мы сможем присоединяться к СУБД, а в блоке METHOD указываем метод аутентификации, в нашем случае scram-sha-256 аутентификация по шифрованному паролю.
Перезапускаем службу и цепляемся к серверу СУБД и меняем пользователю postgres пароль:
psql (16.3)
Type "help" for help.
postgres=# passwd postgres
Cоздаем базу данных xwiki:
Создаем пользователя и даем права на базу
GRANT ALL PRIVILEGES on database xwiki to xwiki;
P.S. В некоторых случаях потребуется создать схему xwiki в базе данных и сделать владельцем пользователя xwiki.
Что бы наше приложение могло соединяться с СУБД Postgresql, нам надо скачать драйвер odbc и положить в каталог /usr/local/apache-tomcat-8.5/webapps/xwiki/WEB-INF/lib/
Редактируем конфиг /usr/local/apache-tomcat-8.5/webapps/xwiki/WEB-INF/hibernate.cfg.xml и добавляем туда следующий текст (а лучше заменяем):
~ Hibernate, Relational Persistence for Idiomatic Java
~
~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
-->
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:postgresql://x.x.x.x/xwiki</property> <!-- BD Mane -->
<property name="connection.driver_class">org.postgresql.Driver</property> <!-- DB Driver -->
<property name="connection.username">xwiki</property> <!-- DB User -->
<property name="connection.password">P@ssw0rd</property> <!-- DB Password -->
<property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="jdbc.use_streams_for_binary">false</property>
<property name="xwiki.virtual_mode">schema</property>
<mapping resource="xwiki.postgresql.hbm.xml"/>
<mapping resource="feeds.hbm.xml"/>
<mapping resource="notification-filter-preferences.hbm.xml"/>
<mapping resource="activitystream.hbm.xml"/>
<mapping resource="instance.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Перезапускаем tomcat и заходим в менеджер приложений http://x.x.x.x:8080/manager/html

Видим, что наше приложение запущено, жмем на него и ждем когда закончится инициализация и создание схемы базы данных.
Установка Nginx
Теперь необходимо установить nginx, который мы будем использовать в качестве обратного прокси, а так же для настройки ssl.
Открываем /usr/local/etc/nginx.conf.
Конфиг у нас будет выглядеть следующим образом:
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
server {
server_name xwiki.krasikra.com;
client_max_body_size 1000m; #Размер вложений для загрузки\скачивания
listen 443 ssl;
ssl_certificate /etc/ssl/xwiki.pem;
ssl_certificate_key /etc/ssl/example.key;
location / {
rewrite ^ $scheme://$server_name/xwiki$request_uri? permanent;
}
location ^~ /xwiki {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1; # Директива используется для указания версии протокола HTTP, которую Nginx должен использовать при общении с Tomcat
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #Переменная $proxy_add_x_forwarded_for содержит полученный заголовок X-Forwarder-For плюс добавляет свой сервер в этот список.
proxy_set_header X-Real-IP $remote_addr; #Эти заголовки содержать содержат ip адрес и порт с которого подключается клиент
proxy_set_header X-Forwarded-Proto https; # Этот заголовок передает бэкенду протокол, который используется клиентом.
proxy_pass http://127.0.0.1:8080; # куда будем проксировать, то есть на 127.0.0.1:8080 в каталог /wiki.
proxy_redirect off;
# return 301 https://$host$request_uri;
}
}
upstream xwiki {
server 127.0.0.1:8080;
}
server {
if ($host = xwiki.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name xwiki.example.com;
return 404;
}
}
root@xwiki:/home/xwiki #
Далее открываем /usr/local/apache-tomcat-8.5/conf/server.xml и добавляем следующий блок:
connectionTimeout="20000"
redirectPort="8443"
maxParameterCount="1000"
scheme="https"
proxyName="vawiki.duckdns.org"
proxyPort="443"/>
Перезапускаем nginx и tomcat и пробуем зайти по имени хоста или адресу, который слушает nginx.
Установка Certbot
Что бы включить https нам нужно скачать скрипт certbot:
Если в репозиториях по каким то причинам отсутствует пакет certbot, то можно скачать скрипт с официального сайта:
Запускаем скрипт certbot где параметр -d указывает на имя нашего доменного имени для которого необходимо выдать сертификат.
Запустится мастер, в котором мы должны будем ответить на предложенные вопросы и указать свой email если мы еще не зарегистрированы.
Скрипт сам установит все необходимые сертификаты и внесет изменения в конфигурацию nginx.
Поскольку сертификат Let's Encrypt выдается всего на 90 дней то необходимо создать в cron задание на обновление сертификатов.
Добавляем строку:
0 0,12 * * * /usr/local/bin/certbot renew
Все!