Установка и использование Roundcube на CentOS

Тематические термины: Roundcube , NGINX , CentOS , PHP , PHP-FPM , MariaDB .

Разберем ситуацию, когда необходимо «с нуля» установить Roundcube на выделенный сервер. Сначала мы настроим его на работу с одним удаленным почтовым сервером, затем — несколькими. В данной инструкции будет применяться операционная система Linux CentOS и веб-сервер NGINX + php-fpm.

Настройка веб-сервера

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:

Приветствие 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:

Страница phpinfo

Сервер баз данных

Также для 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:

Поддержка mysql в phpinfo

Устанавливаем и настраиваем Roundcube Webmail

Устанавливаем wget:

yum install wget

Открываем страницу загрузки Roundcube. Копируем ссылку на LTS-версию продукта (длительной поддержки):

Копируем ссылку на LTS-версию roundcube

Используем ссылку, чтобы загрузить архив программы:

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 ):

Веб-установка roundcube - проверка настроек

На следующей странице мы создаем конфигурационный файл.

а) вводим данные для подключения к СУБД:

Веб-установка roundcube - данные для подключения к MySQL

б) настраиваем подключение к удаленному почтовому серверу:

Веб-установка roundcube - данные для подключения к IMAP

* в данном примере мы указываем сервер 192.168.0.15 с доступом по IMAP.

в) для отправки сообщений нужно использовать следующий удаленный сервер:

Веб-установка roundcube - данные для подключения к SMTP

* также указан почтовый сервер 192.168.0.15.

г) после окончания правки конфигурации, кликаем по CREATE CONFIG :

Веб-установка roundcube - create config

Конфигурационный файл создан — нажимаем CONTINUE, чтобы продолжить установку:

Веб-установка roundcube - переходим к шагу 3

Проверяем, что все пункты находятся в состоянии 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 и копируем ссылку на последнюю версию архива:

Ссылка на загрузку плагина Roundcube-Plugin-Mark-as-Junk-2

Используем скопированную ссылку, чтобы загрузить плагин на сервер:

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 и обновляем страницу. Мы должны увидеть кнопку СПАМ в панели действий:

Кнопка СПАМ в 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’;

EnglishRussianUkrainian