Radiant Engineering

Устанавливаем OTRS CE 6
на AlmaLinux 9

Подготовка операционной системы. Установка OTRS. Первоначальная настройка.
Выбор AlmaLinux для установки OTRS 6 очевиден: система стабильна и и является отличным выбором для тех, кто привык ОС Linux семейства RedHat.

Наш опыт запуска ((OTRS)) Community Edition на AlmaLinux после фокусов Centos считаем успешным.

Итак, поехали.
Считаем, что у нас есть чистая установка AlmaLinux 9 Minimal, и SSH-доступ на неё. Процесс установки разделим на три этапа:

1
Подготовка операционной системы
2
Установка OTRS
3
Начальные настройки
Подготовка операционной системы
1.1 Добавляем репозиторий EPEL
yum install epel-release -y
1.2 Лайфхак 1
Дальше я ставлю tmux и работаю в нём, но если кому-то удобней screen — ставьте его. Если вы не пользуетесь ни тем, ни другим, уверены в канале связи, то можете устанавливать OTRS без них.
yum install tmux -y
Перехожу в консоль tmux. Шпаргалка по консоли на русском здесь.
tmux
1.3 Если нужно сменить имя хоста
hostnamectl set-hostname host_name
systemctl restart systemd-hostnamed
hostnamectl status
1.4 Устанавливаем нужный часовой пояс
timedatectl set-timezone Europe/Moscow
1.5 И обновляем перед следующими установками
yum update -y
1.6 Дальше я ставлю несколько инструментов — что-то удобно мне, что-то требуется для установки
yum install net-tools vim wget man vim-enhanced screen mc telnet wget crontabs openssh-clients mailx sudo make gcc htop nmon sysstat sysbench hdparm lsof -y
1.7 Проверяем файрвол. У некоторых хостеров он отключен или вообще не установлен. Сразу смотрим, что открыто. Если фаервол установлен, то мы увидим список открытых протоколов. Если нет…
firewall-cmd --list-all
…то устанавливаем его:
yum install firewalld -y
systemctl enable firewalld
systemctl start firewalld
1.8 Дальше убираем dhcpv6 и добавляем http(https):
firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client
firewall-cmd --permanent --zone=public --remove-service=cockpit
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
1.9 Теперь обезопасим наш SSH:
Уберём его с 22-го порта на тот, который вам больше нравится.

Меняем порт в конфигурации SSHD:
vim /etc/ssh/sshd_config
## Port 22 -> Port 22222
Меняем порт в сервисе файрвола:
vim /usr/lib/firewalld/services/ssh.xml
<port protocol="tcp" port="22222"/>
И применяем:
systemctl restart sshd && systemctl restart firewalld
Да, я специально не написал sed'ы. Зато вы сами пройдёте весь путь установки, а не будете просто копировать, не читая инструкцию.
Закроемся немного от брутфорса:
yum install fail2ban -y
systemctl enable fail2ban
systemctl start fail2ban
systemctl status fail2ban
 
echo '
[DEFAULT]
# Ban hosts for one hour:
bantime = 3600
# Override /etc/fail2ban/jail.d/00-firewalld.conf:
banaction = iptables-multiport
[sshd]
enabled = true' > /etc/fail2ban/jail.local
 
systemctl restart fail2ban
1.10 Мы немного обезопасились — теперь отрубим SELINUX. Желающие могут его настроить, всё будет работать и с ним. Но мы поступим, как в старом анекдоте: в классе было два окна, одно с решеткой от грабителей, второе — без, для пожарной безопасности.
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/sysconfig/selinux
setenforce 0
1.11 И последний штрих по настройке ОС.
Это уже про тюнинг системы. Я всегда меняю минимум 1 параметр —vm.swappiness — объём оставшейся оперативной памяти, при котором система начнёт писать в SWAP. По общим рекомендациям я выставляю на нём 10% — получается, система начнёт писать в SWAP при 90% занятой оперативной памяти. Вы можете выставить этот параметр на своё усмотрение.
sysctl vm.swappiness=10
echo 'vm.swappiness = 10' >> /etc/sysctl.conf

//Да можно использовать sysctl -p, но мне нравится так
На этом минимальные настройки ОС завершены. Обычно на этом этапе я делаю reboot и проверяю, ничего ли я не забыл.
Установка OTRS
…которая начнётся сразу после установки и обновления всего, что потребуется для OTRS.
2.1 Установка веб-сервера. Начнём с самого простого.
yum install httpd -y
systemctl enable httpd
systemctl start httpd
2.2 Установка СУБД.
Выбираем либо MariaDB, либо PostgreSQL. Сейчас детали продуктовых установок СУБД я расписывать не буду — есть масса хороших статей и курсов. Загуглите. А к полному раскрытию темы установки СУБД мы ещё как-нибудь вернёмся.
a) MariaDB
На данный момент актуальная версия — 12.1
echo '
# MariaDB 12.1 RedHatEnterpriseLinux repository list - created 2026-02-02 08:22 UTC
# https://mariadb.org/download/
[mariadb]
name = MariaDB
# rpm.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details.
# baseurl = https://rpm.mariadb.org/12.1/rhel/$releasever/$basearch
baseurl = https://mirror.docker.ru/mariadb/yum/12.1/rhel/$releasever/$basearch
# gpgkey = https://rpm.mariadb.org/RPM-GPG-KEY-MariaDB
gpgkey = https://mirror.docker.ru/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck = 1 ‘> /etc/yum.repos.d/MariaDB.repo
Установка + devel, иначе не соберётся актуальный пакет DBD::mysql (хотя он и так может упасть на zerofill)
yum install MariaDB-server MariaDB-client MariaDB-devel -y
Все настройки СУБД вы должны делать, исходя из технических параметров сервера. Подскажу с одной, чтобы не было проблем с заливкой файлов и установкой пакетов:
[mysqld]
max_allowed_packet = 100M
………………..
[mysqldump]
max_allowed_packet = 100M
После всех настроек стартуем и добавляем в автозагрузку:
systemctl start mariadb
systemctl enable mariadb
systemctl status mariadb
Традиционно устанавливаем пароль рута и убиваем тестовую БД:
mysql_secure_installation
б) PostgreSQL

Реально используется и практически является основной версия 17.
# Install the repository RPM:
dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
dnf -qy module disable postgresql
dnf install -y postgresql17-server postgresql17-contrib
/usr/pgsql-17/bin/postgresql-17-setup initdb
systemctl enable postgresql-17
systemctl start postgresql-17
Разрешаем доступ на локальном хосте по паролю:
vim /var/lib/pgsql/17/data/pg_hba.conf
Меняем #host all all 127.0.0.1/32 ident
На host all all 127.0.0.1/32 md5
Ставим пароль для пользователя postgresql
sudo -u postgres pqsl
alter role postgres with password ‘свой_пароль’;
\q
systemctl restart postgresql-17
Если вы будете копировать с сайта, то обратите внимание, что я добавил еще 2 пакета: contrib и devel. Первый понадобится для статистики и других расширений, второй — для сборки DBD::Pg.

Примечание: на продуктовую систему, конечно, можно ставить и так, но это неправильно. Дефолтные настройки подходят не только для тестовых или вспомогательных целей, но и для подавляющего большинства небольших компаний. Если же у вас есть компетенции DBA, ставьте и настраивайте ресурсы правильно!
2.3 Установка Perl модулей и приведение их в актуальное состояние
Установка основных модулей:
yum install install tar libdb-devel perl-URI perl-LWP-Protocol-https perl-Crypt-SSLeay mod_perl perl-libwww-perl perl-Net-DNS perl-IO-Socket-SSL perl-XML-Parser perl-DBI procmail perl-core perl-Crypt-SSLeay perl-Mail-IMAPClient perl-Text-CSV_XS perl-Digest-SHA perl-LDAP perl-GDGraph perl-Encode-HanExtra perl-Text-CSV fcgi perl-Archive-Zip perl-XML-LibXSLT bash-completion perl-DBD-Pg perl perl-Mojolicious perl-DBD-MySQL -y
Обновление Perl пакетов
ВНИМАНИЕ! Так можно делать только на тестовых системах или при первоначальной установке, иначе можно положить прод. Если очень нужно обновить на проде, не забывайте о снепшотах и резервном копировании.
#Cтавим cpanm
yum install perl-App-cpanminus -y
#Обновляем cpanm
cpanm App::cpanminus
#Удаляем cpanm установленный из репо
yum erase perl-App-cpanminus
#Создаем линк для новой версии
ln -s /usr/local/bin/cpanm /bin/cpanm
#Ставим cpanoutdated
cpanm App::cpanoutdated
#Обновляем все пакеты, которые считаются устаревшими
/usr/local/bin/cpan-outdated -p | cpanm
#Поскольку outdated обновляет не все пакеты, то дальше руками
cpanm Apache::DBI Apache2::Reload Archive::Tar Archive::Zip Crypt::Eksblowfish::Bcrypt Crypt::SSLeay Date::Format DateTime DBI JSON DBD::Pg Digest::SHA Encode::HanExtra JSON::XS List::Util::XS LWP::UserAgent Mail::IMAPClient IO::Socket::SSL Authen::SASL Authen::NTLM ModPerl::Util Net::DNS Net::LDAP Net::SMTP Template Template::Stash::XS Text::CSV_XS Time::HiRes XML::LibXML XML::LibXSLT XML::Parser YAML::XS XML::LibXML DBD::File Moo Date::Calc  Crypt::Random::Source Cwd Compress::Raw::Zlib Data::Dumper File::Path Storable Data::UUID File::MimeInfo File::BaseDir AnyEvent::HTTP
Кто будет ставить на MariaDB или MySQL, вместо DBD::Pg – DBD::mysql. Если ошибка будет только по тесту на zerofil — а она, скорее всего, будет — cpanm DBD::mysql – force
Если ошибок больше, надо разбираться в причинах. Возможно, потребуется установить пакет MariaDB-shared, в некоторых случаях это помогает.
2.4 Установка OTRS (ну наконец-то).
Ставим последнюю версию. На сегодняшний день это 6.0.30:
cd ~ && wget https://downloads.radiantsd.org/releases/RPMS/rhel/7/otrs-6.0.30-02.noarch.rpm
rpm -ivh otrs-6.0.30-02.noarch.rpm --nodeps
Если вы всё сделали верно, то после установки будет инструкция по запуску демонов и добавлению кронджобы. Но это мы будем делать после окончания установки OTRS.

Перезапускаем апач и идём на веб по ссылке в конце установки пакета. Вы можете написать его сами по аналогии с примером, если хостнейм и fqdn не совпадают.
systemctl restart httpd
Нажимаем вперёд
Принимаем условия лицензии и продолжаем
Выбираем свою СУБД, в моем случае PostgreSQL, Вперёд
Пишем учётные данные, в нашем случае «свой пароль» и «Проверить настройки БД»
Вперёд
Вперёд
Вписываем название компании, если надо, почту администратора и убираем проверку МХ. Вперёд
Пропустить этот шаг, всё равно в инсталлере это работает криво, и придётся настраивать потом в системе.
Все. Основная часть установки завершена, но кому нужна система, в которой ничего еще не работает…

Запуск демона, кронджобов.
/opt/otrs/bin/Cron.sh start otrs
Проверка что появились кронджобы, точнее один джоб это запуска Демона, а он уже управляет остальными джобами.
crontab -u otrs -l
Начальные настройки
Заходим в агентский интерфейс с выданными нам учётными данными. Переходим в раздел «Администрирование».
Почта настраивается в трёх местах. Сначала настраиваем адрес, от имени которого система будет отправлять письма из очереди. Переходим с адреса email.
Выбираем otrs@localhost. Будем менять его на реальный адрес.
  1. Вписываем реальный адрес, от которого OTRS будет отправлять письма.
  2. Выбираем, из какой очереди будут уходить уведомления и ответы под этим именем, в данном случае — Postmaster. Если запись одна, то из всех очередей отправка будет от этой записи. Если создать несколько, то от каждой указанной очереди письма будут отправляться от имени того, кого вы укажете. Но есть нюансы по отправке: по умолчанию только одна учетная запись на отправку, поэтому на почтовом сервере потребуется настроить ей права «отправка от имени». Если требуется, можно настроить сторонний модуль MultiSMTP для отправки через несколько smtp-серверов.
  3. Сохраняем и выходим.
Настраиваем входящую почту:
Переходим в «Администрирование» – «Учетные записи почты для Postmaster»
Нажимаем «Добавить почтовую учетную запись»
  1. Choose the protocol. It can be IMAP, POP3 or its variation.
  2. Fill in the login.
  3. Fill in the password.
  4. Put the host. If a port is different from default one, you may put mail.yourmailserver.com:port.
  5. Dispatching. Choose "Dispatching by selected Queue.
  6. Choose the queue for getting letters and creating tickets from this email account.
  7. Save.
Дальше настраиваем исходящую почту:
«Администрирование» -> «Настройка Системы»
Разворачиваем «Навигация» -> «Core» -> «Email»
  1. Прописываем протокол SMTP, SMTPS, SMTPTLS. Или MultiSMTP, если он установлен. Тогда настройки исходящей почты делаются в соответствующем пункте «Администрирование» – «SMTPнастройки»)
  2. Подтверждаем изменение.
  3. Вписываем пароль.
  4. Подтверждаем изменение.
  5. Вписываем логин.
  6. Подтверждаем изменение.
  7. Вписываем имя почтового сервера для исходящей почты.
  8. Подтверждаем изменение.
  9. Вписываем порт, если он отличен от дефолтного.
  10. Подтверждаем изменение.
Настроим хранение артиклов, чтобы не перегружалась база, и логи, чтобы было удобно их смотреть.
Переходим в Core (1) – CommunicationChannel(2) – MIMEBase(3)
И меняем ArticleStorageDB на ArticleStorageFS (4) и подтверждаем (5)
Примечание: Если не устраивает штатное место хранения, можете тут также указать путь хранения, но не забудьте там дать соответствующие права. Если у вас часть артиклов уже хранится в БД и выносить вы их не хотите, то поставьте галочку CheckAllStorageBackends, чтобы система их просматривала и в БД, и на ФС.
Настроим логи, чтобы было удобно их смотреть.
  1. Переходим Core(1) – Log(2)
  2. Указываем метод. Kernel::System::Log::File
  3. Подтверждаем изменение.
  4. Указываем, куда сохранять логи (в данном случае указано сохранение в штатную папку otrs, но если вы захотите сохранять в другое место или /var/log, то не забудьте дать права)
  5. Подтверждаем изменение.
  6. Ставим галочку, и тогда каждый месяц будет создаваться новый лог-файл.
  7. Подтверждаем изменение.
  8. И наконец ПРИМЕНЯЕМ ВСЕ НАШИ ИЗМЕНЕНИЯ В КОНФИГУРАЦИИ СИСТЕМЫ! Всё, что мы вносили и подтверждали до этого момента, ещё не применено!
После нажатия на кнопку «Применение», нам выведется список со всеми нашими изменениями, которые были сделаны.
Если всё верно, то нажимаем «Применить выбранные изменения».
Всё! OTRS установлена, почта, логи, артиклы и, в том числе, вложения настроены.
Нет предела совершенству, и мы обязательно найдём, о чём писать дальше.
Что можно еще сделать? Конечно, надо настроить https. Можно установить nginx перед apache. Ещё можно оптимизировать кэш, СУБД, и это далеко не всё.