iRedMail: Миграция на новые компоненты

Инструкция, которая позволит мигрировать компоненты #iRedMail, устанавливаемые из стандартных репозиториев #Debian на более новые версии из официальных репозиториев разработчиков.

Все действия необходимо выполнять предельно аккуратно, понимая за что отвечает та или иная команда.

Миграция компонентов

Миграция со стандартных компонентов #iRedMail на новые от официальных разработчиков.

Angie

1
systemctl disable --now nginx.service
irm.angie.conf
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
server {
  listen 443 ssl;
  server_name _;

  root '/var/www/html';
  index index.php index.html;

  ssl_certificate '/etc/ssl/certs/iRedMail.crt';
  ssl_certificate_key '/etc/ssl/private/iRedMail.key';

  location ~ /\. { deny all; }
  location = /favicon.ico { access_log off; log_not_found off; }
  location = /robots.txt { access_log off; log_not_found off; }

  # ------------------------------------------------------------------------------------------------------------------ #
  # IREDADMIN
  # ------------------------------------------------------------------------------------------------------------------ #

  # Static files under '/iredadmin/static'.
  location ~ ^/iredadmin/static/(.*) { alias /opt/www/iredadmin/static/$1; }

  # Python scripts.
  location ~ ^/iredadmin(.*) {
    rewrite ^/iredadmin(/.*)$ $1 break;

    include uwsgi_params;
    uwsgi_pass 127.0.0.1:7791;
    uwsgi_param UWSGI_CHDIR /opt/www/iredadmin;
    uwsgi_param UWSGI_SCRIPT iredadmin;
    uwsgi_param SCRIPT_NAME /iredadmin;

    # Access control.
    # allow 127.0.0.1;
    # allow 192.168.1.10;
    # allow 192.168.1.0/24;
    # deny all;
  }

  # iRedAdmin: redirect '/iredadmin' to '/iredadmin/'.
  location = /iredadmin { rewrite ^ /iredadmin/; }

  # Handle newsletter-style subscription/unsubscription supported in iRedAdmin-Pro.
  location ~ ^/newsletter/ { rewrite /newsletter/(.*) /iredadmin/newsletter/$1 last; }

  # ------------------------------------------------------------------------------------------------------------------ #
  # ROUNDCUBEMAIL
  # ------------------------------------------------------------------------------------------------------------------ #

  # Block access to default directories and files under these directories.
  location ~ ^/mail/(bin|config|installer|logs|SQL|temp|vendor)($|/.*) { deny all; }

  # Block access to default files under top-directory and files start with same name.
  location ~ ^/mail/(CHANGELOG|composer.json|INSTALL|jsdeps.json|LICENSE|README|UPGRADING)($|.*) { deny all; }

  # Block plugin config files and sample config files.
  location ~ ^/mail/plugins/.*/config.inc.php.* { deny all; }

  # Block access to plugin data.
  location ~ ^/mail/plugins/enigma/home($|/.*) { deny all; }
  location = /mail { return 301 /mail/; }

  # Redirect URI '/mail' to '/mail/'.
  location ~ ^/mail/(.*\.php)$ {
    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_pass unix:/run/php/iredmail.sock;
    fastcgi_param HTTP_PROXY '';
    fastcgi_param SCRIPT_FILENAME /opt/www/roundcubemail/$1;
  }

  location ~ ^/mail/(.*) {
    alias /opt/www/roundcubemail/$1;
    index index.php;
  }

  # ------------------------------------------------------------------------------------------------------------------ #
  # PHP
  # ------------------------------------------------------------------------------------------------------------------ #

  # Normal PHP scripts.
  location ~ \.php$ {
    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_pass unix:/run/php/iredmail.sock;
    fastcgi_param HTTP_PROXY '';
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }

  # ------------------------------------------------------------------------------------------------------------------ #
  # STUB STATUS
  # ------------------------------------------------------------------------------------------------------------------ #

  location = /stub_status {
    stub_status on;
    access_log off;
    allow 127.0.0.1;
    deny all;
  }

  location = /status {
    include fastcgi_params;
    fastcgi_pass unix:/run/php/iredmail.sock;
    fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
    access_log off;
    allow 127.0.0.1;
    deny all;
  }
}

PHP

  • Удалить пакеты старой версии #PHP:
1
apt purge --yes 'php8.2*' && apt autoremove && rm -rf '/etc/php'
irm.php.pool.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
[iredmail]

user = www-data
group = www-data

listen = /run/php/$pool.sock
listen.owner = www-data
listen.group = www-data

pm = static
pm.max_children = 10
pm.max_requests = 100

request_terminate_timeout = 60s
request_slowlog_timeout = 10s

access.log = /var/log/php-fpm/$pool.access.log
slowlog = /var/log/php-fpm/$pool.slow.log

MariaDB

  • Сделать экспорт баз данных СУБД #MariaDB в файл iRedMail.backup.sql.xz:
1
f='iRedMail.backup.sql.xz'; mysqldump --user='root' --password --single-transaction --databases 'amavisd' 'fail2ban' 'iredadmin' 'iredapd' 'roundcubemail' 'vmail' | xz -9 > "${f}"
  • Удалить пакеты старой версии СУБД #MariaDB:
1
apt purge --yes 'mariadb-*' && apt autoremove && rm -rf '/etc/mysql'
1
apt install --yes mariadb-server-compat mariadb-client-compat dovecot-mysql postfix-mysql libdbd-mysql-perl && systemctl restart dovecot.service postfix.service postfix@-.service amavis.service
  • Импортировать ранее созданный файл iRedMail.backup.sql.xz в новую версию СУБД #MariaDB:
1
f='iRedMail.backup.sql.xz'; xzcat "${f}" | mariadb --user='root' --password
  • Импортировать шаблон для создания технических пользователей #iRedMail:
irm.mariadb.create.user.sql
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-- USER: 'amavisd'.
create user if not exists 'amavisd'@'127.0.0.1' identified by 'PASSWORD';
grant select, insert, update, delete on amavisd.* to 'amavisd'@'127.0.0.1';
-- USER: 'fail2ban'.
create user if not exists 'fail2ban'@'127.0.0.1' identified by 'PASSWORD';
grant all privileges on fail2ban.* to 'fail2ban'@'127.0.0.1';
-- USER: 'iredadmin'.
create user if not exists 'iredadmin'@'127.0.0.1' identified by 'PASSWORD';
grant all privileges on iredadmin.* to 'iredadmin'@'127.0.0.1';
-- USER: 'iredapd'.
create user if not exists 'iredapd'@'127.0.0.1' identified by 'PASSWORD';
grant all privileges on iredapd.* to 'iredapd'@'127.0.0.1';
-- USER: 'roundcube'.
create user if not exists 'roundcube'@'127.0.0.1' identified by 'PASSWORD';
grant all privileges on roundcubemail.* to 'roundcube'@'127.0.0.1';
grant select, update on vmail.mailbox to 'roundcube'@'127.0.0.1';
-- USER: 'vmail'.
create user if not exists 'vmail'@'127.0.0.1' identified by 'PASSWORD';
grant select on vmail.* to 'vmail'@'127.0.0.1';
-- USER: 'vmailadmin'.
create user if not exists 'vmailadmin'@'127.0.0.1' identified by 'PASSWORD';
grant select, insert, update, delete on vmail.* to 'vmailadmin'@'127.0.0.1';
-- INFO: Reload the grant tables.
flush privileges;

Особенности

В этом разделе представлены корректировки и дополнительные модификации для работы с базами данных.

MySQL: Deprecated program name

Если на почтовый адрес присылаются уведомления mysql: Deprecated program name. It will be removed in a future release, use '/usr/bin/mariadb' instead, то необходимо выполнить команды для исправления файлов.

  • Исправление файла /usr/local/bin/fail2ban_banned_db:
1
sed -i 's|CMD_SQL="mysql |CMD_SQL="mariadb |g' '/usr/local/bin/fail2ban_banned_db'
  • Исправление файла /var/vmail/backup/backup_mysql.sh:
1
sed -i -e 's|CMD_MYSQL="mysql |CMD_MYSQL="mariadb |g' -e 's|CMD_MYSQLDUMP="mysqldump |CMD_MYSQLDUMP="mariadb-dump |g' '/var/vmail/backup/backup_mysql.sh'
UTF8MB3/UTF8MB4

Некоторые таблицы в базах данных могут оказаться в кодировке UTF8MB3. Переведём их на новую кодировку UTF8MB4.

  • Экспортировать базы данных:
1
f='iRedMail.backup.utf8mb4.sql'; mariadb-dump --user='root' --password --single-transaction --databases 'amavisd' 'fail2ban' 'iredadmin' 'iredapd' 'roundcubemail' 'vmail' --result-file="${f}"
  • Заменить utf8mb3 на utf8mb4:
1
f='iRedMail.backup.utf8mb4.sql'; sed -i -e 's|utf8mb3|utf8mb4|g' -e 's|_general_ci|_unicode_ci|g' "${f}"
  • Импортировать базы данных:
1
f='iRedMail.backup.utf8mb4.sql'; mariadb --user='root' --password < "${f}"

Миграция данных

Миграция данных со старого сервера на новый сервер.

Миграция файлов

  • Переместить ключи DKIM со старого сервера на новый сервер:
1
d='/var/lib/dkim/'; rsync -a -e 'ssh -p 22' -P "${d}" "root@192.168.1.2:${d}"
  • Переместить базу данных Fail2Ban со старого сервера на новый сервер:
1
d='/var/lib/fail2ban/'; rsync -a -e 'ssh -p 22' -P "${d}" "root@192.168.1.2:${d}"
  • Переместить профили пользователей и письма со старого сервера на новый сервер:
1
d='/var/vmail/vmail1/'; rsync -a -e 'ssh -p 22' -P "${d}" "root@192.168.1.2:${d}"

Миграция баз данных

  • Экспортировать базы данных старого сервера в файл iRedMail.backup.sql.xz и переместить на новый сервер:
1
f='iRedMail.backup.sql.xz'; mysqldump --user='root' --password --single-transaction --databases 'amavisd' 'fail2ban' 'iredadmin' 'iredapd' 'roundcubemail' 'vmail' | xz -9 > "${f}" && rsync -a -e 'ssh -p 22' "${f}" 'root@192.168.1.2:/root/'
  • Импортировать файл iRedMail.backup.sql.xz с базами данных старого сервера на новом сервере:
1
f='iRedMail.backup.sql.xz'; xzcat "${f}" | mariadb --user='root' --password

Обновление компонентов

Автоматическое обновления стандартных компонентов #iRedMail и обновление схемы БД по версиям.

Схемы баз данных

Изменения схем баз данных по версиям #iRedMail. Изменения необходимо вносить поэтапно от версии к версии.

  • Экспортировать заранее подготовленные параметры в переменные окружения:
1
export GH_URL='https://raw.githubusercontent.com/iredmail/iRedMail/refs/heads/master/update'
  • 1.4.0:
1
curl -fsSL "${GH_URL}/1.4.0/iredmail.mysql" | mariadb --user='root' --password --database='vmail'
  • 1.4.1:
1
curl -fsSL "${GH_URL}/1.4.1/iredmail.mysql" | mariadb --user='root' --password --database='vmail' && curl -fsSL "${GH_URL}/1.4.1/sogo.mysql" | mariadb --user='root' --password --database='sogo'
  • 1.4.2:
1
curl -fsSL "${GH_URL}/1.4.2/iredmail.mysql" | mariadb --user='root' --password --database='vmail'
  • 1.6.3:
1
curl -fsSL "${GH_URL}/1.6.3/iredmail.mysql" | mariadb --user='root' --password --database='vmail'
  • 1.7.0:
1
curl -fsSL "${GH_URL}/1.7.0/fail2ban.mysql" | mariadb --user='root' --password --database='fail2ban'
  • 1.7.1:
1
curl -fsSL "${GH_URL}/1.7.1/amavisd.mysql" | mariadb --user='root' --password --database='amavisd'
  • 1.7.2:
1
curl -fsSL "${GH_URL}/1.7.2/vmail.mysql" | mariadb --user='root' --password --database='vmail'
  • 1.7.3:
1
curl -fsSL "${GH_URL}/1.7.3/vmail.mysql" | mariadb --user='root' --password --database='vmail'

RoundCube

  • Экспортировать заранее подготовленные параметры в переменные окружения, которые содержат информацию о старой версии RC_OLD и новой версии RC_NEW #RoundCube:
1
export RC_OLD='1.6.9'; export RC_NEW='1.6.10'
  • Запустить команду обновления #RoundCube:
1
export IRM_DIR="${HOME}/iRM.RoundCube.$( date '+%s' )"; mkdir "${IRM_DIR}" && cd "${IRM_DIR}" && curl -fSLOJ "https://github.com/roundcube/roundcubemail/releases/download/${RC_NEW}/roundcubemail-${RC_NEW}-complete.tar.gz" && tar -xzf "roundcubemail-${RC_NEW}-complete.tar.gz" && mv "roundcubemail-${RC_NEW}" '/opt/www/' && cp "/opt/www/roundcubemail-${RC_OLD}/config/config.inc.php" "/opt/www/roundcubemail-${RC_NEW}/config/config.inc.php" && chown -R root:root "/opt/www/roundcubemail-${RC_NEW}" && chown www-data:www-data "/opt/www/roundcubemail-${RC_NEW}"/{logs,temp,config/config.inc.php} && unlink '/opt/www/roundcubemail' && ln -s "/opt/www/roundcubemail-${RC_NEW}" '/opt/www/roundcubemail' && '/opt/www/roundcubemail/bin/update.sh' -v "${RC_OLD}"

iRedAdmin

  • Запустить команду обновления #iRedAdmin:
1
export GH_NAME='iRedAdmin'; export GH_API="gh.api.${GH_NAME}.json"; export IRM_DIR="${HOME}/iRM.iRedAdmin.$( date '+%s' )"; mkdir "${IRM_DIR}" && cd "${IRM_DIR}" && curl -fsSL "https://api.github.com/repos/iredmail/${GH_NAME}/tags" | tee "${GH_API}" > '/dev/null'; url="$( grep '"tarball_url":' < "${GH_API}" | head -n 1 | awk -F '"' '{ print $(NF-1) }' )"; ver="$( echo "${url}" | awk -F '/' '{ print $(NF) }' )"; cid="$( grep '"sha":' < "${GH_API}" | head -n 1 | awk -F '"' '{ print $(NF-1) }' | head -c 7 )"; curl -fSLOJ "${url}" && tar -xzf ./*"${cid}.tar.gz" && mv ./*"${cid}" "${GH_NAME}-${ver}" && cd "${GH_NAME}-${ver}/tools/" && bash "upgrade_$( echo "${GH_NAME}" | tr '[:upper:]' '[:lower:]' ).sh"

iRedAPD

  • Запустить команду обновления #iRedAPD:
1
export GH_NAME='iRedAPD'; export GH_API="gh.api.${GH_NAME}.json"; export IRM_DIR="${HOME}/iRM.iRedAPD.$( date '+%s' )"; mkdir "${IRM_DIR}" && cd "${IRM_DIR}" && curl -fsSL "https://api.github.com/repos/iredmail/${GH_NAME}/tags" | tee "${GH_API}" > '/dev/null'; url="$( grep '"tarball_url":' < "${GH_API}" | head -n 1 | awk -F '"' '{ print $(NF-1) }' )"; ver="$( echo "${url}" | awk -F '/' '{ print $(NF) }' )"; cid="$( grep '"sha":' < "${GH_API}" | head -n 1 | awk -F '"' '{ print $(NF-1) }' | head -c 7 )"; curl -fSLOJ "${url}" && tar -xzf ./*"${cid}.tar.gz" && mv ./*"${cid}" "${GH_NAME}-${ver}" && cd "${GH_NAME}-${ver}/tools/" && bash "upgrade_$( echo "${GH_NAME}" | tr '[:upper:]' '[:lower:]' ).sh"

mlmmjadmin

  • Запустить команду обновления #mlmmjadmin:
1
export GH_NAME='mlmmjadmin'; export GH_API="gh.api.${GH_NAME}.json"; export IRM_DIR="${HOME}/iRM.mlmmjadmin.$( date '+%s' )"; mkdir "${IRM_DIR}" && cd "${IRM_DIR}" && curl -fsSL "https://api.github.com/repos/iredmail/${GH_NAME}/tags" | tee "${GH_API}" > '/dev/null'; url="$( grep '"tarball_url":' < "${GH_API}" | head -n 1 | awk -F '"' '{ print $(NF-1) }' )"; ver="$( echo "${url}" | awk -F '/' '{ print $(NF) }' )"; cid="$( grep '"sha":' < "${GH_API}" | head -n 1 | awk -F '"' '{ print $(NF-1) }' | head -c 7 )"; curl -fSLOJ "${url}" && tar -xzf ./*"${cid}.tar.gz" && mv ./*"${cid}" "${GH_NAME}-${ver}" && cd "${GH_NAME}-${ver}/tools/" && bash "upgrade_$( echo "${GH_NAME}" | tr '[:upper:]' '[:lower:]' ).sh"

2025-02-21

  • Добавление раздела с миграцией схемы БД.