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

Обновлено Обновлено: Опубликовано Опубликовано:

Тематические термины: Roundcube, NGINX, Ubuntu, PHP, PHP-FPMMariaDB.

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

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

Roundcube является веб-приложением и для работы требует веб-сервер. В данной инструкции мы будем использовать связку NGINX + PHP + PHP-FPM.

Установка и запуск nginx

Установку выполняем следующими командами.

apt update

apt install nginx

После установки открываем веб-браузер на любом компьютере локальной сети и заходим по адресу http://<IP-адрес сервера> — мы должны увидеть приветствие NGINX:

Приветствие NGINX

Установка PHP и PHP-FPM

Roundcube работает как приложение php, поэтому необходимо установить его интерпретатор. Также нам нужен PHP-FPM, так как NGINX не занимается обработкой скриптов php.

Выполняем установку компонентов:

apt install php php-fpm

Смотрим установленную версию PHP:

php -v

В моем случае было:

PHP 8.1.2-...

То есть, установлен PHP версии 8.1. Для удобства работы, создадим переменную PHP_VER:

export PHP_VER=8.1

Настройка NGINX + PHP-FPM

Открываем конфигурационный файл PHP-FPM:

vi /etc/php/${PHP_VER}/fpm/pool.d/www.conf

Проверяем настройку для параметра listen:

listen = /run/php/php8.1-fpm.sock

* версия 8.1 будет зависеть от версии PHP.

Если конфигурационный файл пришлось отредактировать, перезапускаем php-fpm:

systemctl restart php${PHP_VER}-fpm

Теперь открываем конфиг nginx:

vi /etc/nginx/sites-enabled/default

Внутри секции server добавим location:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    ...
    location ~ \.php$ {
        set $root_path /var/www/html;
        fastcgi_pass unix:/run/php/php8.1-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 ~* ^.+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|docx|xls|xlsx|exe|pdf|ppt|tar|wav|bmp|rtf|js)$ {
        expires modified +1w;
    }

    ...
}

Редактируем секцию location:

    location / {
        ...
        index index.php index.html ...;
    }

* добавляем index.php.

Перезапускаем nginx и php-fpm:

nginx -t && nginx -s reload

Создаем файл index.php в root-каталоге nginx:

vi /var/www/html/index.php

<?php phpinfo(); ?>

Открываем браузер и переходим по адресу http://<IP-адрес сервера> — должна открыться страница с отображением параметров php:

Страница phpinfo

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

Также для Roundcube нужна СУБД — мы установим MariaDB:

apt install mariadb-server

Устанавливаем компоненты для работы php с mysql:

apt install php-mysqli

Перезапускаем php-fpm:

systemctl restart php${PHP_VER}-fpm

Снова открываем страницу http://<IP-адрес сервера> — должен появится раздел mysql:

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

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

Открываем страницу загрузки 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 /var/www/html/webmail

И распаковываем архив в созданную папку:

tar -C /var/www/html/webmail -xvf roundcubemail-*.tar.gz --strip-components 1

Копируем шаблон конфигурационного файла и создаем рабочий конфиг:

cp /var/www/html/webmail/config/config.inc.php.sample /var/www/html/webmail/config/config.inc.php

Открываем его на редактирование:

vi /var/www/html/webmail/config/config.inc.php

Редактируем строку для подключения к СУБД: 

$config['db_dsnw'] = 'mysql://roundcube:roundcube123@localhost/roundcubemail';

* где roundcube:roundcube123 — логин и пароль для доступа к базе данных; localhost — сервер базы данных; roundcubemail — имя базы данных.

Создаем следующую строку:

$config['enable_installer'] = true;

* первая строка разрешает установку портала. Остальные — указывают на необходимость создания папок по умолчанию, если их нет. Без данной настройки, если не создавались папки другим клиентом, веб-клиент может выдавать ошибки при перемещении писем, например, при их удалении.

Задаем владельца apache на папку портала:

chown -R www-data:www-data /var/www/html/webmail

* несмотря на то, что наш сервер обрабатываем скрипты с помощью php-fpm, работает последний по умолчанию от apache.

Подключаемся к MySQL:

mysql

Создаем в MariaDB базу и пользователя для roundcubemail:

> 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 roundcubemail < /var/www/html/webmail/SQL/mysql.initial.sql

Устанавливаем компоненты, необходимые для работы Roundcube:

apt install php-pear php-intl php-ldap php-net-smtp php-mail-mime php-curl php-gd php-imagick php-zip

Настроим php:

vi /etc/php/${PHP_VER}/fpm/php.ini

date.timezone = "Europe/Moscow"

* в данном примере мы задаем московское время.

Перезагружаем php-fpm:

systemctl restart php${PHP_VER}-fpm

Открываем браузер и переходим по адресу http://<IP-адрес сервера>/webmail/installer/.

В самом низу нажимаем по кнопке Next. Если кнопка будет неактивна, проверяем, что нет ошибок (NOT OK):

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

Проверяем, что все пункты находятся в состоянии OK. Установка выполнена.

Открываем конфигурационный файл roundcube:

vi /var/www/html/webmail/config/config.inc.php

Запрещаем установку портала:

$config['enable_installer'] = false;

После удаляем папку с установочными скриптами:

rm -rf /var/www/html/webmail/installer

И заходим в браузере по адресу http://<IP-адрес сервера>/webmail/. — должна открыться страница аутентификации пользователя. Пока не вводим никаких данных.

Подключение к удаленным почтовым серверам

По умолчанию, roundcube подключается к локальному хосту. Если наш почтовый сервер расположен удаленно, открываем файл:

vi /var/www/html/webmail/config/config.inc.php

Редактируем опции default_host и smtp_server, например:

...
$config['default_host'] = 'tls://192.168.0.15';
...
$config['smtp_server'] = 'tls://192.168.0.15';
...

* в данном примере мы указали, что подключение к серверу по IMAP и SMTP выполняются с использованием TLS.

Важно отметить, что существуют различные вариации подключения к почтовой системе. Например, по открытым портам:

$config['default_host'] = '192.168.0.15';
$config['smtp_server'] = '192.168.0.15';
$config['smtp_port'] = 25;

Или с помощью TLS:

$config['default_host'] = 'tls://192.168.0.15';
$config['smtp_server'] = 'tls://192.168.0.15';
$config['smtp_port'] = 587;

Или с помощью SSL:

$config['default_host'] = 'ssl://localmail.dmosk.ru:993';
$config['smtp_server'] = 'ssl://localmail.dmosk.ru';
$config['smtp_port'] = 465;

Обратите внимание, что адреса подключения по SSL указаны не IP, а именами. Это сделано сознательно, так как SSL проходит более строгую проверку сертификата, что потребует обращение по имени. При этом на стороне почтовой системы сертификат должен быть настроен также корректно. Но если мы хотим игнорировать проверку сертификата, то можем добавить в конфигурацию следующее:

$config['imap_conn_options'] = array(
  'ssl' => array(
    'verify_peer' => false,
    'verify_peer_name' => false
  ),
);

$config['smtp_conn_options'] = array(
  'ssl' => array(
    'verify_peer' => false,
    'verify_peer_name' => false
  ),
);

Открываем браузер и переходим по адресу http://<IP-адрес сервера>/webmail/. — входим в систему под пользователем и паролем одной из почтовых учетных записей. Вход должен выполниться успешно, и мы должны увидеть письма, находящиеся в почтовом ящике.

Брендирование (свой логотип и название)

Roundcube можно настроить для отображения вашего логотипа и названия. Для этого открываем конфигурационный файл:

vi /var/www/html/webmail/config/config.inc.php

Добавляем строки (или редактируем):

$config['skin_logo'] = 'images/logo.png';
$config['product_name'] = 'Dmosk Roundcube Webmail';

skin_logo указывает путь относительно каталога roundcube (но если указать первым символом /, то путь будет относительно каталога с темой — это может быть полезным, если для каждой темы должен быть свой логотип); product_name — задает название в нижней части формы авторизации.

Создаем каталог для хранения изображений:

mkdir /var/www/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

Распаковываем скачанный архив:

apt install unzip

unzip master.zip

Переносим распакованный каталог в папку с плагинами roundcube:

mv roundcube-markasjunk2-master /var/www/html/webmail/plugins/markasjunk2

* обратите внимание, что мы переименовываем roundcube-markasjunk2-master в markasjunk2.

Открываем конфигурационный файл:

vi /var/www/html/webmail/config/config.inc.php

Находим строку с плагинами:

$config['plugins'] 

... и дописываем в нее наш плагин:

... array(
    ...
    'markasjunk2',
);

Готово. Переходим в roundcube и обновляем страницу. Мы должны увидеть кнопку СПАМ в панели действий:

Кнопка СПАМ в Roundcube

Изменение размера вложения

По умолчанию, приложение может разрешать небольшой размер вложения. Предположим, нам нужно отправлять файлы объемом 30 Мб. Чтобы это сделать, выполняем следующие действия.

1. Настройка лимитов при отправке файлов в PHP.

Roundcube написан на PHP и нам необходимо убедиться, что интерпретатор не ограничивает нас в объеме загружаемых файлов. Для этого открываем файл:

vi /etc/php/${PHP_VER}/fpm/php.ini

* в разных системах это могут быть разные пути, но мы рассматриваем установку под CentOS.

Редактируем следующие директивы:

post_max_size = 30M
...
upload_max_filesize = 30M

Перезапускаем интерпретатор PHP (в нашем случае это php-fpm):

systemctl restart php${PHP_VER}-fpm

2. Настраиваем Roundcube.

Открываем конфигурацию:

vi /var/www/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 /var/www/html/webmail/config/config.inc.php

* в вашем случае путь до конфигурационного файла может быть другим.

Проверяем, что в перечне плагинов есть password. В противном случае, добавляем:

$config['plugins'] = [
    ...
    'password',
];

Переходим в каталог с плагином. Он находится в папке roundcube + plugins/password. В моем случае это:

cd /var/www/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 /var/www/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 — режим чата.

Возможные ошибки

Рассмотрим некоторые ошибки, с которыми столкнулся я.

1. Неудачное соединение с IMAP сервером

Появляется при попытке авторизоваться в Roundcube.

Причина: как правило, недоступен IMAP-сервер или Roundcube неправильно настроен на подключение к серверу.

Решение: проверяем, что сервер доступен по сети. Проверяем настройки SSL и TLS по методу, описанному выше.

Если это не помогло, на стороне почтового сервера можно включить лог. Например, при использовании сервера IMAP dovecot открываем файл:

vi /etc/dovecot/conf.d/10-logging.conf

Добавляем в самый низ:

mail_debug = yes
auth_verbose = yes
auth_debug = yes
auth_debug_passwords = yes

Перезапустим сервис:

systemctl restart dovecot

Теперь можно отлавливать ошибки командой:

tail -f /var/log/dovecot/imap.log

После решения проблемы, рекомендую отключить лог в dovecot.

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. PHP Deprecated:  Return type of zipdownload_mbox_filter

В логах maillog мы можем наблюдать большое количество ошибок Roundcube, примерно, такого вида:

May 18 11:26:19 relay roundcube: PHP Deprecated:  Return type of zipdownload_mbox_filter::filter($in, $out, &$consumed, $closing) should either be compatible with php_user_filter::filter($in, $out, &$consumed, bool $closing): int, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /opt/www/roundcubemail-1.5.3/plugins/zipdownload/zipdownload.php on line 405

Причина: у нас установлена слишком свежая версия PHP, в которой некоторые методы кода объявлены как устаревшие. Система нас об этом просто предупреждает.

Решение: данное сообщение не является критической ошибкой и не повлияет на работу системы. Однако, данные сообщения сильно мешают при изучении почтового лога.

Для решения проблемы мы должны понизить версию PHP (на ту, что указана в документации Roundcube). Однако, это неоправданно рискованно, поэтому мы просто отключим предупреждения DEPRECATED.

Для этого откроем файл:

vi /var/www/html/webmail/program/lib/Roundcube/bootstrap.php

Находим:

$config = [
    'error_reporting' => E_ALL & ~E_NOTICE & ~E_STRICT,

... и меняем на:

$config = [
    'error_reporting' => E_ALL & ~E_DEPRECATED & ~E_NOTICE & ~E_STRICT,

* то есть, мы исключаем лог типа E_DEPRECATED.

# NGINX # Ubuntu # Почта # Серверы
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет