Тематические термины: Roundcube , NGINX , CentOS , PHP , PHP-FPM , MariaDB .
Разберем ситуацию, когда необходимо «с нуля» установить Roundcube на выделенный сервер. Сначала мы настроим его на работу с одним удаленным почтовым сервером, затем — несколькими. В данной инструкции будет применяться операционная система Linux CentOS и веб-сервер NGINX + php-fpm.
Конфигурируем веб-сервер
Правила брандмауэра
NGINX
PHP + PHP-FPM
NGINX и PHP-FPM
Установка MariaDB
Развертывание Roundcube
Подключение по SSL и TLS
Аутентификация на MTA
Добавление почтового сервера
Смена логотипа и названия
Установка плагина для добавления писем в СПАМ
Ограничение на размер вложения
Смена пароля пользователя из веб-интерфейса
Настройки, которые могут показаться полезными
Устранение возможных ошибок
Настройка веб-сервера
Roundcube является веб-приложением и для работы требует веб-сервер. В данной инструкции мы будем использовать связку NGINX + PHP + PHP-FPM.
Настройка брандмауэра
Добавим правило для разрешения http-трафика:
firewall-cmd —add-service={http,https} —permanent
Сохраняем правила:
firewall-cmd —reload
Установка и запуск nginx
Установку выполняем следующими командами.
yum install epel-release
yum install nginx
После установки разрешаем автозапуск nginx и стартуем его:
systemctl enable nginx
systemctl start nginx
Открываем веб-браузер на любом компьютере локальной сети и заходим по адресу http://<IP-адрес сервера> — мы должны увидеть приветствие NGINX:
Установка PHP и PHP-FPM
Roundcube работает как приложение php, поэтому необходимо установить его интерпретатор. Также нам нужен PHP-FPM, так как NGINX не занимается обработкой скриптов php.
Выполняем установку компонентов:
yum install php php-fpm
… после запускаем PHP-FPM:
systemctl enable php-fpm
systemctl start php-fpm
Настройка NGINX + PHP-FPM
Открываем конфигурационный файл PHP-FPM:
vi /etc/php-fpm.d/www.conf
Задаем настройку для параметра listen:
listen = /var/run/php-fpm/php-fpm.sock
Перезапускаем php-fpm:
systemctl restart php-fpm
Теперь открываем конфиг nginx:
vi /etc/nginx/nginx.conf
Внутри секции server добавим:
location ~ .php$ {
set $root_path /usr/share/nginx/html;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name;
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT $root_path;
}
Редактируем секцию location :
location / {
…
index index.php;
}
Перезапускаем nginx:
nginx -t && nginx -s reload
Создаем файл index.php в root-каталоге nginx:
vi /usr/share/nginx/html/index.php
<?php phpinfo(); ?>
Открываем браузер и переходим по адресу http://<IP-адрес сервера> — должна открыться страница с отображением параметров php:
Сервер баз данных
Также для Roundcube нужна СУБД — мы установим MariaDB:
yum install mariadb-server
Запускаем сервис базы данных + разрешаем его автозапуск:
systemctl start mariadb
systemctl enable mariadb
Задаем пароль для суперпользователя mariadb:
mysqladmin -u root password
Устанавливаем компоненты для работы php с mysql:
yum install php-mysql php-mysqli
Перезапускаем php-fpm:
systemctl restart php-fpm
Снова открываем страницу http://<IP-адрес сервера> — должен появится раздел mysql:
Устанавливаем и настраиваем Roundcube Webmail
Устанавливаем wget:
yum install wget
Открываем страницу загрузки Roundcube. Копируем ссылку на LTS-версию продукта (длительной поддержки):
Используем ссылку, чтобы загрузить архив программы:
wget https://github.com/roundcube/roundcubemail/releases/download/1.5.3/roundcubemail-1.5.3-complete.tar.gz
* на момент обновления инструкции LTS версия была 1.5.3 .
Создаем каталог для размещения файлов Roundcube:
mkdir /usr/share/nginx/html/webmail
И распаковываем архив в созданную папку:
tar -C /usr/share/nginx/html/webmail -xvf roundcubemail-*.tar.gz —strip-components 1
Копируем шаблон конфигурационного файла и создаем рабочий конфиг:
cp /usr/share/nginx/html/webmail/config/config.inc.php.sample /usr/share/nginx/html/webmail/config/config.inc.php
Открываем его на редактирование:
vi /usr/share/nginx/html/webmail/config/config.inc.php
Редактируем строку для подключения к СУБД:
$config[‘db_dsnw’] = ‘mysql://roundcube:roundcube123@localhost/roundcubemail’;
* где roundcube:roundcube123 — логин и пароль для доступа к базе данных; localhost — сервер базы данных; roundcubemail — имя базы данных.
Создаем следующие строки:
$config[‘enable_installer’] = true;
$config[‘drafts_mbox’] = ‘Drafts’;
$config[‘junk_mbox’] = ‘Junk’;
$config[‘sent_mbox’] = ‘Sent’;
$config[‘trash_mbox’] = ‘Trash’;
$config[‘create_default_folders’] = true;
* первая строка разрешает установку портала. Остальные — указывают на необходимость создания папок по умолчанию, если их нет. Без данной настройки, если не создавались папки другим клиентом, веб-клиент может выдавать ошибки при перемещении писем, например, при их удалении.
Задаем владельца apache на папку портала:
chown -R apache:apache /usr/share/nginx/html/webmail
* несмотря на то, что наш сервер обрабатываем скрипты с помощью php-fpm, работает последний по умолчанию от apache.
Создаем в MariaDB базу и пользователя для roundcubemail:
mysql -uroot -p
… система запросит пароль — вводим тот, что задавали при установке MariaDB.
> CREATE DATABASE roundcubemail DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
> GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost IDENTIFIED BY ’roundcube123′;
> quit
* данными командами мы создаем базу данных roundcubemail и пользователя roundcube с паролем roundcube123 . Обратите внимание, что если в вашем случае будут использоваться другие пользователь, пароль и база данных, то следует внести соответствующие изменения в настройку самого roundcube, которую мы выполняли ранее.
Загружаем в созданную базу данные:
mysql -uroot -p roundcubemail < /usr/share/nginx/html/webmail/SQL/mysql.initial.sql
… снова запрос пароля — вводим пароль от суперпользователя MariaDB.
Устанавливаем компоненты, необходимые для работы Roundcube:
yum install php-pear php-mcrypt php-intl php-ldap php-pear-Net-SMTP php-mbstring php-json php-gd php-zip php-imagick
Для Rocky или CentOS версии 8 установка php-imagick выполняется по следующему алгоритму.
Установим ImageMagick:
dnf install ImageMagick ImageMagick-devel
После устанавливаем пакеты, необходимые для сборки imagick:
dnf install php-devel php-pear make
Собираем imagick:
pecl install imagick
Создаем файл с расширением php:
vi /etc/php.d/20-imagick.ini
extension=imagick.so
Настроим php:
vi /etc/php.ini
date.timezone = «Europe/Moscow»
* в данном примере мы задаем московское время.
Перезагружаем php-fpm:
systemctl restart php-fpm
Открываем браузер и переходим по адресу http://<IP-адрес сервера>/webmail/installer/ .
В самом низу нажимаем по кнопке Next . Если кнопка будет неактивна, проверяем, что нет ошибок ( NOT OK ):
На следующей странице мы создаем конфигурационный файл.
а) вводим данные для подключения к СУБД:
б) настраиваем подключение к удаленному почтовому серверу:
* в данном примере мы указываем сервер 192.168.0.15 с доступом по IMAP.
в) для отправки сообщений нужно использовать следующий удаленный сервер:
* также указан почтовый сервер 192.168.0.15.
г) после окончания правки конфигурации, кликаем по CREATE CONFIG :
Конфигурационный файл создан — нажимаем CONTINUE, чтобы продолжить установку:
Проверяем, что все пункты находятся в состоянии OK . Установка выполнена.
Открываем конфигурационный файл roundcube:
vi /usr/share/nginx/html/webmail/config/config.inc.php
Запрещаем установку портала:
$config[‘enable_installer’] = false;
После удаляем папку с установочными скриптами:
rm -rf /usr/share/nginx/html/webmail/installer
И заходим в браузере по адресу http://<IP-адрес сервера>/webmail/ . — должна открыться страница аутентификации пользователя. Пока не вводим никаких данных.
SSL и TLS при подключении к почтовому серверу
Если почтовый сервер поддерживает/требует SSL или TLS соединения, то открываем конфигурационный файл roundcube:
vi /usr/share/nginx/html/webmail/config/config.inc.php
… и редактируем:
…
$config[‘default_host’] = ‘tls://192.168.0.15’;
…
$config[‘smtp_server’] = ‘ssl://192.168.0.16’;
…
* в данном примере мы указали, что подключение к серверу по IMAP выполняется с использованием TLS , а по SMTP — по SSL .
Открываем браузер и переходим по адресу http://<IP-адрес сервера>/webmail/ . — входим в систему под пользователем и паролем одной из почтовых учетных записей. Вход должен выполнить успешно и мы должны увидеть письма, находящиеся в почтовом ящике.
Настройка аутентификации на сервере исходящей почты
Для возможности отправлять письма, многие почтовые MTA требуют авторизации пользователя. Как правило, используются логин и пароль такие же, как на подключение к почтовому ящику.
И так, Roundcube должен отправлять данные для smtp-аутентификации. Открываем конфигурационный файл:
vi /usr/share/nginx/html/webmail/config/config.inc.php
Добавим такие строки:
$config[‘smtp_user’] = ‘%u’;
$config[‘smtp_pass’] = ‘%p’;
* мы указали использовать данные, под которыми зашел текущий пользователь, для авторизации на SMTP .
Переходим к нашей странице http://<IP-адрес сервера>/webmail/ . — пробуем отправить письмо. Должно все получиться.
Добавление почтового сервера
Добавим еще один сервер почты в Roundcube. Открываем конфигурационный файл:
vi /usr/share/nginx/html/webmail/config/config.inc.php
Находим нашу настройку:
$config[‘default_host’] = ‘tls://192.168.0.15’;
… и меняем ее на:
$config[‘default_host’] = array(‘tls://192.168.0.15’, ‘tls://192.168.0.16’);
* мы изменили тип записи, указав, что это массив ( array ) и через запятую перечислили два сервера — 192.168.0.15 и 192.168.0.16 .
Переходим на страницу авторизации Roundcube http://<IP-адрес сервера>/webmail/ . — мы должны увидеть выпадающий список наших серверов:
Несколько доменов без выпадающего списка
Как правило, пользователям неудобно выбирать нужный сервер. Это может их сбить с толку.
Чтобы Roundcube автоматически выбирал почтовый сервер, внесем изменения в наш конфигурационный файл:
vi /usr/share/nginx/html/webmail/config/config.inc.php
…
$config[‘default_host’] = ‘tls://imap.%s’;
…
$config[‘smtp_server’] = ‘tls://smtp.%s’
…
* мы опять вернули старый формат для нашей записи default_host и преобразовали адрес с помощью переменной %s — она позволяет подставлять в имя сервера вторую часть (после @) вводимого email адреса. Например, если мы авторизуемся под пользователем master@remontka.com , то Roundcube станет подключаться к серверу imap.remontka.com .
Чтобы данная настройка корректно работала, необходимо, чтобы сервер мог разрешать имена серверов для подключения в IP-адреса. Для этого все хосты imap и smtp для обслуживаемых почтовых доменов должны быть в DNS-сервере, к которому обращается сервер Roundcube. Или нужные записи можно прописать в файле /etc/hosts .
Брендирование (свой логотип и название)
Roundcube можно настроить для отображения вашего логотипа и названия. Для этого открываем конфигурационный файл:
vi /usr/share/nginx/html/webmail/config/config.inc.php
Добавляем строки (или редактируем):
$config[‘skin_logo’] = ‘images/logo.png’;
$config[‘product_name’] = ‘Dmosk Roundcube Webmail’;
* skin_logo указывает путь относительно каталога roundcube (но если указать первым символом /, то путь будет относительно каталога с темой — это может быть полезным, если для каждой темы должен быть свой логотип); product_name — задает название в нижней части формы авторизации.
Создаем каталог для хранения изображений:
mkdir /usr/share/nginx/html/webmail/images
… и копируем туда наш логотип logo.png. Для копирования файла на сервер Linux можно воспользоваться программой WinSCP .
Открываем веб-интерфейс и проверяем, что логотип и название поменялись.
Кнопка добавления письма в СПАМ
По умолчанию, в roundcube нет возможности быстро отметить письмо как нежелательное. Для этого нужно установить плагин. Рассмотрим установку дополнения Roundcube-Plugin-Mark-as-Junk-2.
Для этого переходим на страницу проекта в GitHub и копируем ссылку на последнюю версию архива:
Используем скопированную ссылку, чтобы загрузить плагин на сервер:
wget https://github.com/johndoh/roundcube-markasjunk2/archive/master.zip
Распаковываем скачанный архив:
unzip master.zip
Переносим распакованный каталог в папку с плагинами roundcube:
mv roundcube-markasjunk2-master /usr/share/nginx/html/webmail/plugins/markasjunk2
* обратите внимание, что мы переименовываем roundcube-markasjunk2-master в markasjunk2 .
Открываем конфигурационный файл:
vi /usr/share/nginx/html/webmail/config/config.inc.php
Находим строку с плагинами:
$config[‘plugins’]
… и дописываем в нее наш плагин:
… array(
…
‘markasjunk2’,
);
Готово. Переходим в roundcube и обновляем страницу. Мы должны увидеть кнопку СПАМ в панели действий:
Изменение размера вложения
По умолчанию, приложение может разрешать небольшой размер вложения. Предположим, нам нужно отправлять файлы объемом 30 Мб. Чтобы это сделать, выполняем следующие действия.
1. Настройка лимитов при отправке файлов в PHP.
Roundcube написан на PHP и нам необходимо убедиться, что интерпретатор не ограничивает нас в объеме загружаемых файлов. Для этого открываем файл:
vi /etc/php.ini
* в разных системах это могут быть разные пути, но мы рассматриваем установку под CentOS.
Редактируем следующие директивы:
post_max_size = 30M
…
upload_max_filesize = 30M
Перезапускаем интерпретатор PHP (в нашем случае это php-fpm):
systemctl restart php-fpm
2. Настраиваем Roundcube.
Открываем конфигурацию:
vi /usr/share/nginx/html/webmail/config/config.inc.php
* данный путь может отличаться для вашей системы.
Редактируем или добавляем опцию:
$config[‘max_message_size’] = ’40M’;
* обратите внимание, что необходимо установить значение max_message_size на 30-40% больше, чем желаемый максимальный размер сообщения. Это связано с тем, что в процессе отправки сообщения могут добавляться дополнительные данные (например, кодирование в base64), которые увеличивают размер сообщения.
3. Ограничения в nginx.
Если в качестве веб-сервера у нас используется nginx, то также нужно убедиться, что задана опция client_max_body_size со значением 30M или более в разделе http .
vi /etc/nginx/nginx.conf
http {
…
client_max_body_size 30m;
…
}
После внесения изменений, перезагружаем веб-сервер:
nginx -t && nginx -s reload
4. Увеличение лимита отправки для MTA.
Стоит не забывать, что сам почтовый сервер также устанавливаем ограничения на размер отправляемого сообщения. В зависимости от того, какой MTA мы используем, будут различные варианты настройки.
Например, для Postfix задать лимит можно изменив значение для директивы message_size_limit. Подробнее в инструкции Лимиты в Postfix .
Смена пароля в roundcube
Веб интерфейс roundcube позволяет пользователям менять свои пароли с помощью плагина password. Данный плагин идет в стандартной поставке, но может быть не включен в конфигурации. Проверим это — открываем файл:
vi /usr/share/nginx/html/webmail/config/config.inc.php
* в вашем случае путь до конфигурационнога файла может быть другим.
Проверяем, что в перечне плагинов есть password. В противном случае, добавляем:
$config[‘plugins’] = [
…
‘password’,
];
Переходим в каталог с плагином. Он находится в папке roundcube + plugins/password. В моем случае это:
cd /usr/share/nginx/html/webmail/plugins/password
Используем шаблон конфигурационного файла:
mv config.inc.php.dist config.inc.php
Открываем его и вносим правки:
vi config.inc.php
Значения для опций очень сильно зависят от вашей почтовой инфраструктуры. Я лишь, приведу пример моей конфигурации, но вам придется изучить вопрос, чтобы правильно настроить плагин.
$config[‘password_driver’] = ‘sql’;
…
$config[‘password_dovecotpw’] = ‘/usr/local/sbin/doveadm pw’; // for dovecot-2.x
//$config[‘password_dovecotpw’] = ‘/usr/local/sbin/dovecotpw’; // for dovecot-1.x
…
$config[‘password_db_dsn’] = ‘mysql://postfix:postfix123@localhost/postfix’;
…
$config[‘password_query’] = ‘UPDATE mailbox SET password=%c WHERE username=%u’;
* где:
- password_driver — указываем, где хранится база с пользователями. В моем примере, SQL.
- password_dovecotpw — нам нужно раскомментировать один из вариантов. Сейчас чаще используется dovecot версии 2, поэтому в моем примере снят комментарий с него.
- password_db_dsn — строка подключения к базе, где находятся пользователи.
- password_query — запрос, с помощью которого можно сменить пароль.
* в моем примере настройка выполнена для конфигурации Dovecot + MySQL.
Заходим в Roundcube. Переходим в раздел Настройки — Пароль . Пробуем его сменить.
Полезные настройки
В данном разделе рассмотрим настройки, которые могут пригодиться в ходе эксплуатации roundcube. Изменения вводим в конфигурационном файле:
vi /usr/share/nginx/html/webmail/config/config.inc.php
1. Создание писем в формате HTML
По умолчанию, все письма создаются в текстовом формате. Данное поведение можно изменить в настройках пользователя. Однако, если мы хотим, чтобы у всех пользователей по умолчанию письма создавались в HTML, добавляем строку:
$config[‘htmleditor’] = 1;
* возможны варианты:
- 0 — никогда.
- 1 — всегда.
- 2 — при ответе на HTML-сообщение.
- 3 — при пересылке или ответе на HTML-сообщение.
- 4 — всегда, кроме ответа на текстовое сообщение.
2. Время сессии
По умолчанию, время работы веб-интерфейса без необходимости вводить логин и пароль может оказаться недостаточным. Для изменения параметра редактируем директиву:
$config[‘session_lifetime’] = 1440;
* время указывается в минутах. В данном примере, 24 часа.
3. Отображение писем
Можно указать, чтобы письма по умолчанию отображались общим списком в порядке поступления или в режиме чата. За это отвечает опция:
$config[‘default_list_mode’] = ‘list’;
* возможные варианты:
- list — список писем.
- threads — режим чата.
4. Отключение возможности создания профилей
Пользователи могут в настройках веб-интерфейса создать новый профиль для отправки почты. При этом, он может прописать любое имя пользователя, например, «Директор».
Если мы хотим отключить данную возможность, добавляем в конфигурационный файл строку:
$config[‘identities_level’] = 4;
* где identities_level может принимать значения:
- 0 — много профилей и возможность редактировать все параметры.
- 1 — много профилей и возможность редактировать все параметры, но не адреса электронной почты.
- 2 — один профиль и возможность редактировать все параметры.
- 3 — один профиль и возможность редактировать все параметры, но не адреса электронной почты.
- 4 — один профиль с возможностью редактирования только подписи.
Возможные ошибки
Для диагностики проблем используем логи веб-сервера и php-fpm:
tail -f /var/log/nginx/error.log
tail -f /var/log/php-fpm/www-error.log
Также в самом каталоге roundcube есть папка logs:
ls /usr/share/nginx/html/webmail/logs
Дополнительно рассмотрим некоторые проблемы, с которыми столкнулся я.
1. Неудачное соединение с IMAP сервером.
Появляется при попытке авторизоваться в Roundcube.
Причина: как правило, недоступен IMAP-сервер или Roundcube неправильно настроен на подключение к серверу.
Решение: проверяем, что сервер доступен по сети. Проверяем настройки SSL и TLS по методу, описанному выше .
2. SMTP ошибка (554): Невозможно добавить получателя XXX (5.7.1 <XXX>: Relay access denied)
Ошибка появляется при попытке отправить письмо.
Причина: SMTP-сервер не разрешает удаленному хосту отправку сообщений. Для этого требуется пройти аутентификацию.
Решение: есть два способа устранить ошибку:
1. Настроить аутентификацю в Roundcube по методу, описанному выше .
2. Также можно решить проблему, добавив наш хост Roundcube в качестве relay на почтовом сервере. Данный способ не является правильным с точки зрения безопасности и его рекомендуется применить для временного использования.
В качестве SMTP-сервера могут использоваться разные MTA. Приведем пример для разрешения отправки писем в Postfix. Открываем его конфигурационный файл:
vi /etc/postfix/main.cf
Редактируем строку mynetworks :
mynetworks = … 192.168.0.14
* где mynetworks — список доверенных узлов, которым можно будет отправлять сообщения без дополнительных проверок. В данном примере мы добавили хост 192.168.0.14 .
Перечитываем конфигурацию postfix:
systemctl reload postfix
3. Requested DIGEST-MD5 scheme, but we have only CRAM-MD5
Авторизация выполняется с ошибкой, а в логе почты мы видим ошибку:
…: Requested DIGEST-MD5 scheme, but we have only CRAM-MD5 …
Причина: в сообщении мы видим, что сервер ожидает увидеть алгоритм для шифрования пароля CRAM-MD5.
Решение: открываем конфигурационный файл:
vi /usr/share/nginx/html/webmail/config/config.inc.php
Добавляем строку:
$config[‘imap_auth_type’] = ‘CRAM-MD5’;