Перейти к содержанию

Установка 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 в файлах:

  '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.php
  • data/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), вы можете просмотреть текущие инструкции по установке и соответствующим образом адаптировать свою конфигурацию.

Обратите особое внимание на следующие разделы:

Удаление таблиц 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');"