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

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

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

Установка iRedMail

  • Скачать и распаковать последнюю версию #iRedMail:
1
export GH_NAME='iRedMail'; export GH_API="gh.api.${GH_NAME}.json"; 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}" && curl -fsSLo 'config' 'https://lib.onl/ru/2025/02/7deb49ab-bb4f-50e6-b196-82b4a9778a2d/irm.config' || return
  • Создать файл config в корневой директории #iRedMail со следующим шаблоном:
irm.config
 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
# -------------------------------------------------------------------------------------------------------------------- #
# GENERAL SETTINGS
# -------------------------------------------------------------------------------------------------------------------- #

# Default mail storage path.
export STORAGE_BASE_DIR='/var/vmail'

# Preferred web server.
export WEB_SERVER='NGINX'

# Preferred backend used to store mail accounts.
export BACKEND_ORIG='MARIADB'
export BACKEND='MYSQL'

# Password for MySQL administrator.
export MYSQL_ROOT_PASSWD='PASSWORD'

# First mail domain name.
export FIRST_DOMAIN='example.com'

# Password for the mail domain administrator.
export DOMAIN_ADMIN_PASSWD_PLAIN='PASSWORD'

# SoGo master password.
export SOGO_SIEVE_MASTER_PASSWD='PASSWORD'

# -------------------------------------------------------------------------------------------------------------------- #
# MLMMJADMIN SETTINGS
# mlmmjadmin is RESTful API server used to manage mlmmj (mailing list manager).
# Generate a long string as API auth token, it will be used by your API client:
# < '/dev/urandom' tr -dc 'a-zA-Z0-9' | head -c ${1:-96} | md5sum
# -------------------------------------------------------------------------------------------------------------------- #

export MLMMJADMIN_API_AUTH_TOKEN=''

# -------------------------------------------------------------------------------------------------------------------- #
# INSTALL APPS
# -------------------------------------------------------------------------------------------------------------------- #

export USE_IREDADMIN='YES'
export USE_ROUNDCUBE='YES'
export USE_FAIL2BAN='YES'

# -------------------------------------------------------------------------------------------------------------------- #
# DATABASE USERS
# -------------------------------------------------------------------------------------------------------------------- #

# Password for user 'amavisd'.
export AMAVISD_DB_PASSWD='PASSWORD'

# Password for user 'fail2ban'.
export FAIL2BAN_DB_PASSWD='PASSWORD'

# Password for user 'iredadmin'.
export IREDADMIN_DB_PASSWD='PASSWORD'

# Password for user 'iredapd'.
export IREDAPD_DB_PASSWD='PASSWORD'

# Password for user 'netdata'.
export NETDATA_DB_PASSWD='PASSWORD'

# Password for user 'roundcube'.
export RCM_DB_PASSWD='PASSWORD'

# Password for user 'sogo'.
export SOGO_DB_PASSWD='PASSWORD'

# Password for user 'vmailadmin'.
export VMAIL_DB_ADMIN_PASSWD='PASSWORD'

# Password for user 'vmail'.
export VMAIL_DB_BIND_PASSWD='PASSWORD'

#EOF
  • Заполнить шаблон config своими параметрами.

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

Миграция со стандартных компонентов #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
server {
  listen 443 ssl;
  server_name _;

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

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

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

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

  location ~ ^/iredadmin/static/(.*) { alias /opt/www/iredadmin/static/$1; }

  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;
  }

  location = /iredadmin { rewrite ^ /iredadmin/; }
  location ~ ^/newsletter/ { rewrite /newsletter/(.*) /iredadmin/newsletter/$1 last; }

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

  location ~ ^/mail/(bin|config|installer|logs|SQL|temp|vendor)($|/.*) { deny all; }
  location ~ ^/mail/(CHANGELOG|composer.json|INSTALL|jsdeps.json|LICENSE|README|UPGRADING)($|.*) { deny all; }
  location ~ ^/mail/plugins/.*/config.inc.php.* { deny all; }
  location ~ ^/mail/plugins/enigma/home($|/.*) { deny all; }
  location = /mail { return 301 /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;
  }

  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*' && 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
19
20
[iredmail]
user = www-data
group = www-data

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

pm = dynamic
pm.max_children = 100
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 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'
  • Установить новую версию СУБД #MariaDB по материалу MariaDB: Установка и настройка.
  • Установить пакеты совместимости #MariaDB с MySQL (mariadb-*-compat) и пакеты для работы Dovecot (dovecot-mysql), #Postfix (postfix-mysql) и Amavis (libdbd-mysql-perl) с базой данных:
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. It will be removed in a future release, use '/usr/bin/mariadb' instead, то необходимо выполнить команды для исправления файлов.

  • Исправление файла /usr/local/bin/fail2ban_banned_db:
1
sed -i -e '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'

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

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

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

  • Переместить ключи DKIM со старого сервера на новый сервер:
1
d='/var/lib/dkim/'; rsync -a -e 'ssh -p 22' "${d}" "root@192.168.1.2:${d}"
  • Переместить базу данных Fail2Ban со старого сервера на новый сервер:
1
d='/var/lib/fail2ban/'; rsync -a -e 'ssh -p 22' "${d}" "root@192.168.1.2:${d}"
  • Переместить профили пользователей и письма со старого сервера на новый сервер:
1
d='/var/vmail/vmail1/'; rsync -a -e 'ssh -p 22' "${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/'
  • Удалить текущие пустые базы данных на новом сервере:
1
curl -fsSL 'https://lib.onl/ru/2025/02/7deb49ab-bb4f-50e6-b196-82b4a9778a2d/irm.mariadb.drop.database.sql' | mariadb --user='root' --password
  • Импортировать файл iRedMail.backup.sql.xz с базами данных старого сервера на новом сервере:
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;

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

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

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

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

  • Экспортировать заранее подготовленные параметры в переменные окружения:
1
export GH_URL='https://raw.githubusercontent.com/iredmail/iRedMail/refs/heads/master/update'

Версии iRedMail

  • 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'

RoundCube

  • Экспортировать заранее подготовленные параметры в переменные окружения, которые содержат информацию о старой версии RC_OLD и новой версии RC_NEW #RoundCube:
1
export RC_OLD='1.6.9'; export RC_NEW='1.6.10'
  • Запустить команду обновления #RoundCube:
1
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" && "/opt/www/roundcubemail-${RC_NEW}/bin/update.sh" -v "${RC_OLD}" && 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'

iRedAdmin

  • Запустить команду обновления #iRedAdmin:
1
export GH_NAME='iRedAdmin'; export GH_API="gh.api.${GH_NAME}.json"; 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"; 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"; 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"

ClamAV

Выполнить настройку российского зеркала обновлений #ClamAV можно при помощи следующей команды:

1
sed -i -e 's|ScriptedUpdates yes|ScriptedUpdates no|g' '/etc/clamav/freshclam.conf' && echo -e 'PrivateMirror https://clamav-mirror.ru/\nPrivateMirror https://mirror.truenetwork.ru/clamav/\nPrivateMirror http://mirror.truenetwork.ru/clamav/\n' | tee -a '/etc/clamav/freshclam.conf' > '/dev/null' && rm -rf '/var/lib/clamav/freshclam.dat' && systemctl stop clamav-freshclam.service && freshclam -vvv && systemctl restart clamav-freshclam.service && systemctl restart clamav-daemon.service

2025-02-21

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