Информация на этой странице находится в доработке. Информация может добавляться и изменяться.
Инструкция, которая позволит мигрировать компоненты #iRedMail, устанавливаемые из стандартных репозиториев #Debian на более новые версии из официальных репозиториев разработчиков. Все действия необходимо выполнять предельно аккуратно, понимая за что отвечает та или иная команда.
- Скачать и распаковать последнюю версию #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
|
Если требуется конкретная версия iRedMail, то можно воспользоваться командой:
1
| v='1.7.2'; curl -fSLo "iRedMail-${v}.tar.gz" "https://github.com/iredmail/iRedMail/archive/refs/tags/${v}.tar.gz" && tar -xzf "iRedMail-${v}.tar.gz" && cd "iRedMail-${v}" || exit
|
- Создать файл
config
в корневой директории #iRedMail со следующим шаблоном:
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
своими параметрами.
Для генерации паролей можно воспользоваться командой:
1
| u=('MYSQL_ROOT_PASSWD' 'DOMAIN_ADMIN_PASSWD_PLAIN' 'SOGO_SIEVE_MASTER_PASSWD' 'AMAVISD_DB_PASSWD' 'FAIL2BAN_DB_PASSWD' 'IREDADMIN_DB_PASSWD' 'IREDAPD_DB_PASSWD' 'NETDATA_DB_PASSWD' 'RCM_DB_PASSWD' 'SOGO_DB_PASSWD' 'VMAIL_DB_ADMIN_PASSWD' 'VMAIL_DB_BIND_PASSWD'); for i in "${u[@]}"; do printf "%-25s = %s\n" "${i}" "$( < '/dev/urandom' tr -dc 'a-zA-Z0-9' | head -c "${1:-32}"; echo; )"; done
|
Миграция со стандартных компонентов #iRedMail на новые от официальных разработчиков.
1
| systemctl disable --now nginx.service
|
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:
1
| apt purge --yes 'php8*' && apt autoremove && rm -rf '/etc/php'
|
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 в файл
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:
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
|
Если при импорте файла появляется ошибка ERROR 1231 (42000) at line *: Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER'
, то её можно исправить путём удаления директивы NO_AUTO_CREATE_USER
из файла:
1
| f='iRedMail.backup.sql'; xz -d "${f}.xz" && sed -i 's/NO_AUTO_CREATE_USER//' "${f}" && xz -9 "${f}"
|
- Импортировать шаблон для создания технических пользователей #iRedMail:
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'
|
1
| curl -fsSL "${GH_URL}/1.4.0/iredmail.mysql" | mariadb --user='root' --password --database='vmail'
|
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
| curl -fsSL "${GH_URL}/1.4.2/iredmail.mysql" | mariadb --user='root' --password --database='vmail'
|
1
| curl -fsSL "${GH_URL}/1.6.3/iredmail.mysql" | mariadb --user='root' --password --database='vmail'
|
1
| curl -fsSL "${GH_URL}/1.7.0/fail2ban.mysql" | mariadb --user='root' --password --database='fail2ban'
|
1
| curl -fsSL "${GH_URL}/1.7.1/amavisd.mysql" | mariadb --user='root' --password --database='amavisd'
|
1
| curl -fsSL "${GH_URL}/1.7.2/vmail.mysql" | mariadb --user='root' --password --database='vmail'
|
- Экспортировать заранее подготовленные параметры в переменные окружения, которые содержат информацию о старой версии
RC_OLD
и новой версии RC_NEW
#RoundCube:
1
| export RC_OLD='1.6.9'; export RC_NEW='1.6.10'
|
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'
|
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"
|
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"
|
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 можно при помощи следующей команды:
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
|