Установка Roundcube¶
Примечание
Если не указано иное, предполагается, что все приведенные команды выполняются в директории установки animails (т. е. в директории, содержащей animails.conf и т. д.). Пожалуйста, не выполняйте команды вслепую — разберитесь в том, что они делают. Ни одна из команд не должна приводить к ошибке, поэтому, если вы столкнулись с ошибкой, устраните её, прежде чем переходить к следующим шагам.
Интегрированная установка¶
Примечание по использованию composer¶
Это руководство использует composer для обновления зависимостей Roundcube или установки/обновления плагинов.
Плагин composer roundcube-plugin-installer имеет проблему проектирования, которая может приводить к ошибкам composer при обновлении или удалении пакетов во время выполнения composer.
Сообщение об ошибке обычно сообщает, что require в autoload_real.php не удался, так как файл не может быть открыт. Пример:
In autoload_real.php line 43:
require(/web/rc/vendor/composer/../guzzlehttp/promises/src/functions_include.php): Failed to open stream: No such file or directory
К сожалению, это случается довольно часто, но проблему можно обойти, обновив автозагрузчик и повторно выполнив неудавшуюся команду:
docker exec -it -w /web/rc $(docker ps -f name=php-fpm-animails -q) composer dump-autoload -o
# Теперь снова выполните команду, которая завершилась ошибкой
Подготовка¶
Сначала загружаем animails.conf, чтобы получить доступ к настройкам конфигурации animails для последующих команд.
source animails.conf
Загрузите Roundcube 1.6.x (проверьте наличие последней версии и адаптируйте URL) в веб-директорию и извлеките его (здесь в rc/):
mkdir -m 755 data/web/rc
wget -O - https://github.com/roundcube/roundcubemail/releases/download/1.6.13/roundcubemail-1.6.13-complete.tar.gz | tar -xvz --no-same-owner -C data/web/rc --strip-components=1 -f -
docker exec -it $(docker ps -f name=php-fpm-animails -q) chown www-data:www-data /web/rc/logs /web/rc/temp
docker exec -it $(docker ps -f name=php-fpm-animails -q) chown root:www-data /web/rc/config
docker exec -it $(docker ps -f name=php-fpm-animails -q) chmod 750 /web/rc/logs /web/rc/temp /web/rc/config
Опционально: Проверка орфографии¶
Если вам нужна функция проверки орфографии, создайте файл data/hooks/phpfpm/aspell.sh со следующим содержимым, затем выполните chmod +x data/hooks/phpfpm/aspell.sh. Это установит локальный движок проверки. Обратите внимание, что большинство современных браузеров имеют встроенную проверку орфографии, поэтому вам это может не понадобиться.
#!/bin/bash
apk update
apk add aspell-en # или любой другой язык
Установка соответствий типов MIME¶
Загрузите файл mime.types, так как он не включен в контейнер php-fpm.
wget -O data/web/rc/config/mime.types http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
Создание базы данных Roundcube¶
Создайте базу данных для Roundcube в MySQL-контейнере animails. Это создаст нового пользователя БД roundcube со случайным паролем, который будет выведен в консоль и сохранен в переменной окружения для последующих команд. Учтите, что если вы прервете процесс и продолжите в новой сессии терминала, вам придется вручную установить переменную DBROUNDCUBE, используя выведенный ранее пароль.
DBROUNDCUBE=$(LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 2> /dev/null | head -c 28)
echo Database password for user roundcube is $DBROUNDCUBE
docker exec -it $(docker ps -f name=mysql-animails -q) mysql -uroot -p${DBROOT} -e "CREATE DATABASE roundcubemail CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
docker exec -it $(docker ps -f name=mysql-animails -q) mysql -uroot -p${DBROOT} -e "CREATE USER 'roundcube'@'%' IDENTIFIED BY '${DBROUNDCUBE}';"
docker exec -it $(docker ps -f name=mysql-animails -q) mysql -uroot -p${DBROOT} -e "GRANT ALL PRIVILEGES ON roundcubemail.* TO 'roundcube'@'%';"
Конфигурация Roundcube¶
Создайте файл data/web/rc/config/config.inc.php со следующим содержимым.
- Опция
des_keyустановлена в случайное значение. Она используется для временного хранения вашего пароля IMAP. - Список плагинов может быть изменен в соответствии с вашими предпочтениями. Я добавил набор стандартных плагинов, которые считаю общеполезными и которые хорошо работают вместе с animails:
- Плагин archive добавляет кнопку архивации, которая перемещает выбранные сообщения в настраиваемую пользователем папку архива.
- Плагин managesieve предоставляет удобный интерфейс для управления серверной фильтрацией почты и уведомлениями об отпуске / отсутствии в офисе.
- Плагин acl позволяет управлять списками контроля доступа к папкам IMAP, включая возможность открывать доступ к папкам другим пользователям.
- Плагин markasjunk добавляет кнопки для пометки выбранных сообщений как спам (или сообщений в папке «Спам» как не спам) и перемещает их в папку со спамом или обратно во входящие. Фильтры sieve, включенные в animails, позаботятся о том, чтобы это действие запускало обучение rspamd как спам/хам, поэтому дополнительная настройка плагина не требуется.
- Плагин zipdownload позволяет скачивать несколько вложений или сообщений в виде одного zip-файла.
- Если вы не устанавливали проверку орфографии на предыдущем этапе, удалите параметр
spellcheck_engine.
cat <<EOCONFIG >data/web/rc/config/config.inc.php
<?php
\$config['db_dsnw'] = 'mysql://roundcube:${DBROUNDCUBE}@mysql/roundcubemail';
\$config['imap_host'] = 'dovecot:143';
\$config['smtp_host'] = 'postfix:588';
\$config['smtp_user'] = '%u';
\$config['smtp_pass'] = '%p';
\$config['support_url'] = '';
\$config['product_name'] = 'Roundcube Webmail';
\$config['cipher_method'] = 'chacha20-poly1305';
\$config['des_key'] = '$(LC_ALL=C </dev/urandom tr -dc "A-Za-z0-9 !#$%&()*+,-./:;<=>?@[\\]^_{|}~" 2> /dev/null | head -c 32)';
\$config['plugins'] = [
'archive',
'managesieve',
'acl',
'markasjunk',
'zipdownload',
];
\$config['spellcheck_engine'] = 'aspell';
\$config['mime_types'] = '/web/rc/config/mime.types';
\$config['enable_installer'] = true;
\$config['managesieve_host'] = 'dovecot:4190';
// Включает отдельный интерфейс для управления автоответчиком (отпуск)
// 0 - нет отдельного раздела (по умолчанию); 1 - добавить раздел "Отпуск"; 2 - добавить "Отпуск", но скрыть "Фильтры"
\$config['managesieve_vacation'] = 1;
EOCONFIG
docker exec -it $(docker ps -f name=php-fpm-animails -q) chown root:www-data /web/rc/config/config.inc.php
docker exec -it $(docker ps -f name=php-fpm-animails -q) chmod 640 /web/rc/config/config.inc.php
Инициализация базы данных¶
Перейдите в браузере по адресу https://myserver/rc/installer. Убедитесь, что на всех этапах отсутствуют результаты "NOT OK". Некоторые значения "NOT AVAILABLE" ожидаемы (например, расширения для других БД, кроме MySQL).
Инициализируйте базу данных и закройте установщик. Обновлять файл конфигурации скачанным из установщика не обязательно, если только вы не меняли там настройки, которые хотите сохранить.
Конфигурация веб-сервера¶
Директория Roundcube содержит папки, доступ к которым извне нежелателен. Мы добавим расширение конфигурации nginx, чтобы открыть только публичную директорию Roundcube.
cat <<EOCONFIG >data/conf/nginx/site.roundcube.custom
location /rc/ {
alias /web/rc/public_html/;
}
EOCONFIG
Отключение и удаление установщика¶
Удалите директорию data/web/rc/installer после успешной установки и установите параметр enable_installer в значение false в файле data/web/rc/config/config.inc.php:
rm -r data/web/rc/installer
sed -i -e "s/\(\$config\['enable_installer'\].* = \)true/\1false/" data/web/rc/config/config.inc.php
Обновление зависимостей Roundcube¶
Этот шаг не является строго обязательным, но на момент написания данного руководства зависимости, поставляемые вместе с Roundcube, включали версии с уязвимостями безопасности, поэтому обновление зависимостей до последних версий может быть хорошей идеей. По той же причине рекомендуется периодически запускать composer update.
cp -n data/web/rc/composer.json-dist data/web/rc/composer.json
docker exec -it -w /web/rc $(docker ps -f name=php-fpm-animails -q) composer update --no-dev -o
Вы также можете использовать composer audit для проверки установленных пакетов на наличие известных проблем безопасности:
docker exec -it -w /web/rc $(docker ps -f name=php-fpm-animails -q) composer audit
Разрешение аутентификации в открытом виде для php-fpm без TLS¶
Нам нужно разрешить аутентификацию в открытом виде (plaintext) в dovecot через незашифрованное соединение (внутри сети контейнеров). По умолчанию в animails это разрешено только для контейнера SOGo. После изменений перезапустите контейнер dovecot.
cat <<EOCONFIG >>data/conf/dovecot/extra.conf
remote ${IPV4_NETWORK}.0/24 {
disable_plaintext_auth = no
}
remote ${IPV6_NETWORK} {
disable_plaintext_auth = no
}
EOCONFIG
docker compose restart dovecot-animails
Задача Ofelia для обслуживания Roundcube¶
Roundcube необходимо периодически очищать устаревшую информацию в базе данных. Для этого мы создадим задачу Ofelia, которая запускает скрипт cleandb.sh.
Добавьте следующее в docker-compose.override.yml (если у вас уже есть правки для php-fpm, добавьте метки в существующий раздел):
services:
php-fpm-animails:
labels:
ofelia.enabled: "true"
ofelia.job-exec.roundcube_cleandb.schedule: "@every 168h"
ofelia.job-exec.roundcube_cleandb.user: "www-data"
ofelia.job-exec.roundcube_cleandb.command: '/bin/bash -c "[ -f /web/rc/bin/cleandb.sh ] && /web/rc/bin/cleandb.sh"'
Автономная установка (Standalone)¶
Чтобы установить Roundcube в отдельном Docker-контейнере, добавьте следующее в ваш файл docker-compose-override.yaml:
services:
roundcube-db:
image: mariadb:10.11
volumes:
- roundcube-db:/var/lib/mysql/
environment:
TZ: ${TZ}
MYSQL_ROOT_PASSWORD: ${DBROUNDCUBEROOT}
MYSQL_DATABASE: roundcubemail
MYSQL_USER: roundcube
MYSQL_PASSWORD: ${DBROUNDCUBE}
restart: unless-stopped
networks:
animails-network:
aliases:
- roundcube-db
roundcube:
image: roundcube/roundcubemail:1.6.13-apache # Проверьте актуальную версию на Docker Hub https://hub.docker.com/r/roundcube/roundcubemail/tags?name=apache
environment:
IPV4_NETWORK: ${IPV4_NETWORK:-172.22.1}
IPV6_NETWORK: ${IPV6_NETWORK:-fd4d:6169:6c63:6f77::/64}
ROUNDCUBEMAIL_DB_TYPE: mysql
ROUNDCUBEMAIL_DB_HOST: roundcube-db
ROUNDCUBEMAIL_DB_USER: roundcube
ROUNDCUBEMAIL_DB_PASSWORD: ${DBROUNDCUBE}
ROUNDCUBEMAIL_DB_NAME: roundcubemail
ROUNDCUBEMAIL_DEFAULT_HOST: dovecot
ROUNDCUBEMAIL_SMTP_SERVER: postfix
ROUNDCUBEMAIL_SMTP_PORT: 588
volumes:
# == Совместимость с документацией ==
# Эти монтирования настроены в соответствии с интегрированной установкой.
# Однако рекомендуется не монтировать их внутри web/rc, так как указанная папка также монтируется в контейнер php-fpm.
# - ./data/web/rc:/var/www/html
# - ./data/web/rc/persistent-config:/var/roundcube/config
# Продвинутый уровень (меньшая совместимость с документацией, но выше безопасность)
- ./data/rc/main:/var/www/html
# Создавайте кастомные конфиги здесь
- ./data/rc/config:/var/roundcube/config
depends_on:
- roundcube-db
- dovecot-animails
restart: unless-stopped
networks:
animails-network:
aliases:
- roundcube
volumes:
roundcube-db:
Конфигурация веб-сервера¶
Директория Roundcube содержит некоторые пути, которые мы не хотим предоставлять веб-пользователям. Мы добавляем расширение конфигурации в nginx, чтобы сделать доступной только публичную директорию Roundcube.
cat <<EOCONFIG >data/conf/nginx/site.roundcube.custom
location /rc/ {
proxy_pass http://roundcube:80/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
}
EOCONFIG
Создание паролей для Roundcube¶
Загрузите переменные окружения:
source animails.conf
Создайте пароль для отдельного MySQL-контейнера Roundcube. Это создаст нового пользователя базы данных roundcube со случайным паролем, который будет выведен в консоль.
Сгенерируйте пароль для базы данных Roundcube с помощью команды ниже, сделайте это для DBROUNDCUBEROOT и DBROUNDCUBE. Не забудьте также добавить их в ваш файл animails.conf.
LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 2> /dev/null | head -c 28
Разрешение аутентификации открытым текстом для контейнера php-fpm без использования TLS¶
Нам необходимо разрешить аутентификацию открытым текстом в dovecot через незашифрованное соединение (внутри сети контейнеров). По умолчанию в установке animails это разрешено только для контейнера SOGo с той же целью. После внесения изменений перезапустите контейнер dovecot, чтобы они вступили в силу.
cat <<EOCONFIG >>data/conf/dovecot/extra.conf
remote ${IPV4_NETWORK}.0/24 {
disable_plaintext_auth = no
}
remote ${IPV6_NETWORK} {
disable_plaintext_auth = no
}
EOCONFIG
docker compose restart dovecot-animails
Запуск Roundcube¶
После выполнения всех вышеуказанных шагов вы можете запустить контейнер Roundcube с помощью:
docker compose down
docker compose up -d
docker-compose down
docker-compose up -d
Пользовательские файлы конфигурации¶
Roundcube предоставляет несколько переменных окружения для настройки, но не для всех параметров. Для дальнейшей конфигурации вы можете создать файлы *.inc.php внутри вашего каталога конфигурации.
Вместо использования переменных окружения вы можете создавать конфигурационные файлы. Например, можно использовать файл config.inc.php из интегрированной установки в автономной установке.
Пример
Следующая конфигурация содержит настройки, которые используются в интегрированной установке, но не могут быть указаны в переменных окружения:
cat <<EOCONFIG >rc/config/config.inc.php
<?php
\$config['support_url'] = '';
\$config['product_name'] = 'Roundcube Webmail';
\$config['cipher_method'] = 'chacha20-poly1305';
\$config['plugins'] = [
'archive',
'managesieve',
'acl',
'markasjunk',
'zipdownload',
];
\$config['managesieve_host'] = 'dovecot:4190';
// Enables separate management interface for vacation responses (out-of-office)
// 0 - no separate section (default); 1 - add Vacation section; 2 - add Vacation section, but hide Filters section
\$config['managesieve_vacation'] = 1;
EOCONFIG
Примечания по автономной установке¶
Информация
В остальной части этой документации вас будут просить изменить файлы внутри data/web/rc/config — вместо этого используйте data/web/rc/persistent-config или data/rc/config (расширенный вариант).
Это связано с тем, что Roundcube автоматически генерирует конфигурации внутри rc/main/config/ или web/rc/config/ на основе конфигураций в persistent-config/ / data/rc/config/.
Если вы выбрали расширенный способ монтирования, обратите внимание, что папки, такие как plugins/, находятся внутри data/rc/main.
Дополнительный функционал¶
Включение функции смены пароля в Roundcube¶
Смена пароля animails через интерфейс Roundcube поддерживается с помощью плагина password. Мы настроим его на использование API animails для обновления пароля, что требует предварительной активации API и получения API-ключа (требуется доступ к API на чтение/запись). API можно включить в панели администратора animails, там же можно найти API-ключ.
Откройте rc/config/config.inc.php и включите плагин смены пароля, добавив его в массив $config['plugins'], например:
$config['plugins'] = array(
'archive',
'managesieve',
'acl',
'markasjunk',
'zipdownload',
'password',
);
Настройте плагин password (обязательно замените API_KEY на ваш API-ключ animails с правами на чтение и запись):
cat <<EOCONFIG >data/web/rc/plugins/password/config.inc.php
<?php
\$config['password_driver'] = 'animails';
\$config['password_confirm_current'] = true;
\$config['password_animails_api_host'] = 'http://nginx';
\$config['password_animails_api_token'] = '**API_KEY**';
EOCONFIG
Примечание: Если вы изменили конфигурацию nginx в animails для перенаправления HTTP-запросов на HTTPS (например, как описано здесь), прямое обращение к контейнеру nginx по HTTP не будет работать, так как nginx не является именем хоста, указанным в сертификате. В таких случаях установите password_animails_api_host в приведенной выше конфигурации на публичный URI:
cat <<EOCONFIG >data/web/rc/plugins/password/config.inc.php
<?php
\$config['password_driver'] = 'animails';
\$config['password_confirm_current'] = true;
\$config['password_animails_api_host'] = 'https://${MAILCOW_HOSTNAME}';
\$config['password_animails_api_token'] = '**API_KEY**';
EOCONFIG
Интеграция адресных книг CardDAV в Roundcube¶
Установите последнюю версию v5 (конфигурация ниже совместима с релизами v5) с помощью composer.
Ответьте Y на вопрос об активации плагина.
docker exec -it -w /web/rc $(docker ps -f name=php-fpm-animails -q) composer require --update-no-dev -o "roundcube/carddav:~5"
docker exec -it $(docker ps -f name=roundcube -q) composer require --update-no-dev -o "roundcube/carddav:~5"
Отредактируйте файл data/web/rc/plugins/carddav/config.inc.php и вставьте следующее содержимое:
cat <<EOCONFIG >data/web/rc/plugins/carddav/config.inc.php
<?php
\$prefs['_GLOBAL']['pwstore_scheme'] = 'des_key';
\$prefs['SOGo'] = [
'accountname' => 'SOGo',
'username' => '%u',
'password' => '%p',
'discovery_url' => 'http://sogo:20000/SOGo/dav/',
'name' => '%N',
'use_categories' => true,
'fixed' => ['username', 'password'],
];
EOCONFIG
RCMCardDAV добавит все адресные книги пользователя при входе в систему, включая подписанные адресные книги, к которым другие пользователи предоставили доступ.
Если вы хотите удалить адресные книги по умолчанию (хранящиеся в базе данных Roundcube), чтобы были доступны только адресные книги CardDAV, добавьте $config['address_book_type'] = ''; в файл конфигурации data/web/rc/config/config.inc.php.
Примечание: RCMCardDAV использует дополнительные таблицы базы данных. После установки (или обновления) RCMCardDAV необходимо войти в Roundcube (сначала выйдите, если вы уже авторизованы), так как создание или изменение таблиц базы данных выполняется только во время входа в Roundcube.
Передача сетевого адреса клиента в dovecot¶
Обычно IMAP-сервер dovecot видит сетевой адрес контейнера php-fpm, когда Roundcube взаимодействует с сервером. Используя расширение IMAP и плагин Roundcube dovecot_client_ip, Roundcube может передавать dovecot IP-адрес клиента, чтобы он отображался в логах как удаленный IP (remote IP). В этом случае попытки входа будут отображаться в логах dovecot так же, как прямые подключения клиентов к dovecot. Неудачные попытки входа в Roundcube будут обрабатываться аналогично неудачным прямым входам по IMAP, что приведет к блокировке клиента контейнером netfilter или другими механизмами защиты от перебора паролей (bruteforce).
Для этого необходимо установить плагин Roundcube.
docker exec -it -w /web/rc $(docker ps -f name=php-fpm-animails -q) composer require --update-no-dev -o "foorschtbar/dovecot_client_ip:~2"
docker exec -it $(docker ps -f name=roundcube -q) composer require --update-no-dev -o "foorschtbar/dovecot_client_ip:~2"
Отредактируйте файл rc/config/config.inc.php и вставьте следующее содержимое:
cat <<EOCONFIG >>rc/config/config.inc.php
\$config['dovecot_client_ip_trusted_proxies'] = ['${IPV4_NETWORK}.0/24', '${IPV6_NETWORK}'];
EOCONFIG
Кроме того, необходимо настроить dovecot так, чтобы он считал контейнер php-fpm частью доверенной сети, разрешая ему подменять IP-адрес клиента в IMAP-сессии. Обратите внимание, что это также включает аутентификацию открытым текстом для указанных диапазонов сетей, поэтому явные переопределения disable_plaintext_auth, сделанные ранее, при использовании этого метода не требуются.
cat <<EOCONFIG >>data/conf/dovecot/extra.conf
login_trusted_networks = ${IPV4_NETWORK}.0/24 ${IPV6_NETWORK}
EOCONFIG
docker compose restart dovecot-animails
Добавление ссылки на Roundcube в список приложений animails¶
Вы можете добавить ссылку на Roundcube в список приложений (Apps) animails.
Для этого откройте или создайте файл data/web/inc/vars.local.inc.php и убедитесь, что он содержит следующий блок конфигурации:
<?php
$MAILCOW_APPS = [
[
'name' => 'SOGo',
'link' => '/SOGo/'
],
[
'name' => 'Roundcube',
'link' => '/rc/'
]
];
Вход администраторов в Roundcube без пароля¶
Сначала установите плагин dovecot_impersonate и добавьте Roundcube как приложение (см. выше).
docker exec -it -w /web/rc/plugins $(docker ps -f name=php-fpm-animails -q) git clone https://github.com/corbosman/dovecot_impersonate.git
docker exec -it -w /var/www/html/plugins $(docker ps -f name=roundcube -q) git clone https://github.com/corbosman/dovecot_impersonate.git
Откройте rc/config/config.inc.php и включите плагин dovecot_impersonate, добавив его в массив $config['plugins'].
Например:
$config['plugins'] = array(
'archive',
'managesieve',
'acl',
'markasjunk',
'zipdownload',
'password',
'dovecot_impersonate'
);
Отредактируйте animails.conf и добавьте следующее:
# Разрешить администраторам входить в Roundcube под видом пользователя (без пароля)
# Сначала должен быть установлен Roundcube с плагином dovecot_impersonate
ALLOW_ADMIN_EMAIL_LOGIN_ROUNDCUBE=y
Отредактируйте docker-compose.override.yml, создав или дополнив раздел для php-fpm-animails:
services:
php-fpm-animails:
environment:
- ALLOW_ADMIN_EMAIL_LOGIN_ROUNDCUBE=${ALLOW_ADMIN_EMAIL_LOGIN_ROUNDCUBE:-n}
Отредактируйте data/web/js/site/mailbox.js и добавьте следующий код после строки if (ALLOW_ADMIN_EMAIL_LOGIN) { ... }
if (ALLOW_ADMIN_EMAIL_LOGIN_ROUNDCUBE) {
item.action +=
'<a href="/rc-auth.php?login=' +
encodeURIComponent(item.username) +
'" class="login_as btn btn-sm btn-xs-half btn-primary" target="_blank"><i class="bi bi-envelope-fill"></i> Roundcube</a>'
}
Добавьте следующую строку в массив $template_data в файлах:
data/web/admin/mailbox.php$template_datadata/web/domainadmin/mailbox.php$template_data
'allow_admin_email_login_roundcube' => (preg_match("/^([yY][eE][sS]|[yY])+$/", $_ENV["ALLOW_ADMIN_EMAIL_LOGIN_ROUNDCUBE"])) ? 'true' : 'false',
Отредактируйте data/web/templates/mailbox.twig и добавьте этот код в конец раздела javascript:
var ALLOW_ADMIN_EMAIL_LOGIN_ROUNDCUBE = {{ allow_admin_email_login_roundcube }};
data/web/inc/lib/RoundcubeAutoLogin.phpdata/web/rc-auth.php
Завершение установки¶
Наконец, перезапустите animails
docker compose down
docker compose up -d
docker-compose down
docker-compose up -d
Обновление Roundcube¶
Обновление Roundcube довольно простое: перейдите на страницу релизов GitHub для Roundcube и получите ссылку на файл «complete.tar.gz» для нужной версии. Затем выполните приведенные ниже команды, при необходимости изменив URL-адрес и имя папки Roundcube.
# Войдите в bash-сессию PHP-контейнера animails
docker exec -it animailsdockerized-php-fpm-animails-1 bash
# Установите необходимую зависимость для обновления, затем обновите Roundcube до нужной версии
apk add rsync
cd /tmp
wget -O - https://github.com/roundcube/roundcubemail/releases/download/1.6.13/roundcubemail-1.6.13-complete.tar.gz | tar xfvz -
cd roundcubemail-1.6.13
bin/installto.sh /web/rc
# Введите 'Y' и нажмите Enter, чтобы обновить установленный Roundcube
# Введите 'N' на вопрос "Do you want me to fix your local configuration", если он появится
# Если вы видите "NOTICE: Update dependencies by running php composer.phar update --no-dev", запустите composer:
cd /web/rc
composer update --no-dev -o
# Если появится вопрос "Do you trust "roundcube/plugin-installer" to execute code and wish to enable it now?", нажмите 'y' и продолжайте.
# Удалите временные файлы
rm -rf /tmp/roundcube*
# Если вы переходите с версии 1.5 на 1.6, внесите изменения в конфигурационный файл ниже
sed -i "s/\$config\['default_host'\].*$/\$config\['imap_host'\]\ =\ 'dovecot:143'\;/" /web/rc/config/config.inc.php
sed -i "/\$config\['default_port'\].*$/d" /web/rc/config/config.inc.php
sed -i "s/\$config\['smtp_server'\].*$/\$config\['smtp_host'\]\ =\ 'postfix:588'\;/" /web/rc/config/config.inc.php
sed -i "/\$config\['smtp_port'\].*$/d" /web/rc/config/config.inc.php
sed -i "s/\$config\['managesieve_host'\].*$/\$config\['managesieve_host'\]\ =\ 'dovecot:4190'\;/" /web/rc/config/config.inc.php
sed -i "/\$config\['managesieve_port'\].*$/d" /web/rc/config/config.inc.php
Обновление Roundcube в автономном режиме выполняется очень просто — достаточно обновить версию Docker-образа:
image: roundcube/roundcubemail:1.6.13-apache # 1.6.13 -> 1.6.X (в будущем: 1.7.X)
После перезапуска Roundcube автоматически применит миграции и обновит контейнер.
Обновление плагинов composer¶
Чтобы обновить плагины Roundcube, установленные с помощью composer, и их зависимости (например, плагин RCMCardDAV), вы можете просто запустить composer в контейнере:
docker exec -it -w /web/rc $(docker ps -f name=php-fpm-animails -q) composer update --no-dev -o
docker exec -it $(docker ps -f name=roundcube -q) composer update --no-dev -o
Обновление сопоставлений MIME-типов¶
Чтобы обновить сопоставления MIME-типов, загрузите их повторно, используя команду из инструкции по установке.
Удаление Roundcube¶
Для удаления также предполагается, что команды выполняются в директории установки animails и файл animails.conf был импортирован в оболочку, см. раздел Подготовка выше.
Удаление веб-директории¶
Это действие удалит установку Roundcube, все плагины и зависимости, которые вы могли установить, включая те, что были установлены через composer.
Примечание: Это также удалит любые пользовательские настройки, которые вы внесли в Roundcube. Если вы хотите сохранить их, переместите их в другое место вместо удаления.
rm -r data/web/rc
Остановите контейнер Roundcube:
docker compose down
docker-compose down
Затем вы можете безопасно удалить data/web/rc / data/rc/.
Удаление базы данных¶
Примечание: Это удалит все данные, хранящиеся для Roundcube. Если вы хотите сохранить их, используйте mysqldump перед удалением или просто оставьте базу данных.
docker exec -it $(docker ps -f name=mysql-animails -q) mysql -uroot -p${DBROOT} -e "DROP USER 'roundcube'@'%';"
docker exec -it $(docker ps -f name=mysql-animails -q) mysql -uroot -p${DBROOT} -e "DROP DATABASE roundcubemail;"
Удаление пользовательских конфигурационных файлов, добавленных в animails¶
Чтобы определить их, просмотрите шаги установки и отмените изменения, которые вы там вносили.
Миграция со старой настройки Roundcube в animails¶
В старых версиях этой инструкции база данных animails также использовалась для Roundcube с префиксом имен animails_rc1 для всех таблиц Roundcube.
Для миграции также предполагается, что команды выполняются в директории установки animails и animails.conf импортирован в оболочку. Команды различных шагов строятся друг на друге и должны выполняться в одной и той же оболочке. В частности, некоторые шаги устанавливают переменные оболочки (прежде всего DBROUNDCUBE с паролем пользователя БД Roundcube), используемые в последующих шагах.
Создание нового пользователя и базы данных Roundcube¶
Следуйте шагам выше, чтобы создать пользователя базы данных Roundcube и отдельную базу данных.
Миграция данных Roundcube из базы данных animails¶
Перед началом миграции базы данных мы отключаем Roundcube, чтобы избежать изменений в таблицах во время процесса.
cat <<EOCONFIG >data/conf/nginx/site.roundcube.custom
location ^~ /rc/ {
return 503;
}
EOCONFIG
docker compose exec nginx-animails nginx -s reload
Теперь мы копируем данные Roundcube в новую базу данных. В процессе мы удаляем префикс таблиц; вам может потребоваться изменить animails_rc1, если вы использовали другой префикс. Также можно оставить префикс (в этом случае сохраните соответствующую настройку db_prefix в Roundcube). Затем исправьте внешние ключи.
RCTABLES=$(docker exec -it $(docker ps -f name=mysql-animails -q) mysql -uroot -p${DBROOT} -sN animails -e "show tables like 'animails_rc1%';" | tr '\n\r' ' ')
docker exec $(docker ps -f name=mysql-animails -q) /bin/bash -c "mysqldump -uroot -p${DBROOT} animails $RCTABLES | sed 's/animails_rc1//' | mysql -uroot -p${DBROOT} roundcubemail"
FOREIGNKEYS=$(docker exec -it $(docker ps -f name=mysql-animails -q) mysql -uroot -p${DBROOT} -sN animails -e "SELECT CONCAT('ALTER TABLE \`', TABLE_NAME, '\` ', 'DROP FOREIGN KEY \`', CONSTRAINT_NAME, '\`;', 'ALTER TABLE \`', TABLE_NAME, '\` ', 'ADD FOREIGN KEY \`', CONSTRAINT_NAME, '\` (', COLUMN_NAME, ') ', 'REFERENCES \`', REPLACE(REFERENCED_TABLE_NAME, 'animails_rc1', ''), '\` (', REFERENCED_COLUMN_NAME, ');') FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = 'roundcubemail' AND REFERENCED_TABLE_NAME IS NOT NULL;")
docker exec $(docker ps -f name=mysql-animails -q) mysql -uroot -p${DBROOT} roundcubemail -e "$FOREIGNKEYS"
Обновление конфигурации Roundcube¶
Выполните следующее, чтобы удалить параметр db_prefix, который больше не требуется. Мы также включаем логирование Roundcube, удаляя настройки log_dir и temp_dir, которые были частью старых инструкций.
sed -i "/\$config\['db_prefix'\].*$/d" data/web/rc/config/config.inc.php
sed -i "/\$config\['log_dir'\].*$/d" data/web/rc/config/config.inc.php
sed -i "/\$config\['temp_dir'\].*$/d" data/web/rc/config/config.inc.php
Нам нужно адаптировать конфигурацию nginx для Roundcube, чтобы не открывать публичный доступ к непубличным папкам, особенно к тем, что содержат временные файлы и логи:
cat <<EOCONFIG >data/conf/nginx/site.roundcube.custom
location /rc/ {
alias /web/rc/public_html/;
}
EOCONFIG
Мы также можем обновить cipher_method на более безопасный, но учтите, что данные, ранее зашифрованные Roundcube, после этого нельзя будет расшифровать. Это особенно касается сохраненных паролей CardDAV, если вы используете RCMCardDAV и ваши пользователи добавляли собственные адресные книги (предустановки будут исправлены автоматически при следующем входе пользователя). Если вы хотите изменить cipher_method, выполните:
cat <<EOCONFIG >>data/web/rc/config/config.inc.php
\$config['cipher_method'] = 'chacha20-poly1305';
EOCONFIG
Переход на установку плагина RCMCardDAV через composer¶
Это необязательно, но приведет вашу установку в соответствие с текущими инструкциями и позволит обновлять RCMCardDAV с помощью composer.
Это делается простым удалением плагина carddav из установки и его повторной установкой через composer согласно инструкциям выше, которые включают создание новой конфигурации RCMCardDAV v5.
Если вы изменяли файл конфигурации RCMCardDAV, возможно, вы захотите сделать его резервную копию перед удалением плагина, чтобы затем перенести изменения в новую конфигурацию.
Чтобы удалить плагин carddav, выполните следующую команду, а затем переустановите его согласно инструкциям:
rm -r data/web/rc/plugins/carddav
Переключение Roundcube на новую базу данных¶
Сначала настройте конфигурацию Roundcube для использования новой базы данных.
sed -i "/\$config\['db_dsnw'\].*$/d" data/web/rc/config/config.inc.php
cat <<EOCONFIG >>data/web/rc/config/config.inc.php
\$config['db_dsnw'] = 'mysql://roundcube:${DBROUNDCUBE}@mysql/roundcubemail';
EOCONFIG
Повторное включение веб-доступа к Roundcube¶
Выполните команды chown и chmod для конфиденциальных директорий Roundcube, указанных в разделе Подготовка, чтобы веб-сервер nginx не имел доступа к файлам, которые он не должен обслуживать.
Затем снова включите веб-доступ к Roundcube, заменив нашу временную кастомную конфигурацию на ту, что описана выше, и перезагрузите конфигурацию nginx:
docker compose exec nginx-animails nginx -s reload
Прочие изменения¶
Вы также должны адаптировать конфигурацию плагина паролей Roundcube в соответствии с этой инструкцией, особенно если вы используете функцию смены пароля, так как старая инструкция меняла пароль напрямую в базе данных, тогда как эта версия использует API animails.
Что касается других изменений и дополнений (например, плагин dovecot_client_ip), вы можете просмотреть текущие инструкции по установке и соответствующим образом адаптировать свою конфигурацию.
Обратите особое внимание на следующие разделы:
- Задание Ofelia для обслуживания Roundcube
- Разрешение аутентификации открытым текстом в dovecot, если вы настраиваете Roundcube на подключение к dovecot через незашифрованное IMAP-соединение.
- Передача сетевого адреса клиента в dovecot
Удаление таблиц Roundcube из базы данных animails¶
После того как вы убедились, что миграция прошла успешно и Roundcube работает с отдельной базой данных, вы можете удалить таблицы Roundcube из базы данных animails с помощью следующей команды:
docker exec -it $(docker ps -f name=mysql-animails -q) mysql -uroot -p${DBROOT} -sN animails -e "SET SESSION foreign_key_checks = 0; DROP TABLE IF EXISTS $(echo $RCTABLES | sed -e 's/ \+/,/g');"