1

Topic: iRedMail Enterprise Edition (EE) v1.3.1 has been released.

A Heartfelt Thank You to Our iRedAdmin-Pro and iRedMail Easy Customers

EE is our flagship product and it replaces iRedMail, iRedAdmin-Pro, and iRedMail Easy with a single binary. Easy to install, also offers one-click upgrades support. We strongly recommend deploying new servers with EE or migrating existing setups from iRedMail or iRedMail Easy to EE.
---

iRedMail Enterprise Edition (EE) v1.3.1 has been released, with new Roundcube release which addresses a security vulnerability. All customers should upgrade as soon as possible.

- Full list of changes: https://docs.iredmail.org/ee.changelog.html
- Upgrade: https://docs.iredmail.org/upgrade.ee.html
- Deploy a new server: https://docs.iredmail.org/install.ee.html
- Features and pricing: https://www.iredmail.org/ee.html

## Migration Guides

- Migrate from a server deployed with the downloadable iRedMail installer:
  https://docs.iredmail.org/iredmail.to.ee.html

- Migrate from a server deployed with iRedMail Easy:
  https://docs.iredmail.org/easy.to.ee.html

Best regards,
The iRedMail Team

----

Spider Email Archiver: On-Premises, lightweight email archiving software developed by iRedMail team. Supports Amazon S3 compatible storage and custom branding.

2

Re: iRedMail Enterprise Edition (EE) v1.3.1 has been released.

Hi Zhang,

I followed the upgrade EE instructions by my EE upgrade is failing.

FYI my vmail1 directory is on a mounted drive.

-------------------
==========================================
{
    "activesync_server": "sogo",
    "adminer_base_uri": "adminer",
    "dovecot_enable_fts": true,
    "fail2ban_extra_ignore_ip": [
        "xx.xx.xx.xx",
        "xx.xx.xx.xx",
        "xx.xx.xx.xx"
    ],
    "firewall_rules": [
        {
            "allow_all": true,
            "allowed_clients": null,
            "port": 25,
            "protocol": "TCP",
            "reject_all": false,
            "rejected_clients": null
        },
        {
            "allow_all": true,
            "allowed_clients": null,
            "port": 80,
            "protocol": "TCP",
            "reject_all": false,
            "rejected_clients": null
        },
        {
            "allow_all": true,
            "allowed_clients": null,
            "port": 110,
            "protocol": "TCP",
            "reject_all": false,
            "rejected_clients": null
        },
        {
            "allow_all": true,
            "allowed_clients": null,
            "port": 143,
            "protocol": "TCP",
            "reject_all": false,
            "rejected_clients": null
        },
        {
            "allow_all": true,
            "allowed_clients": null,
            "port": 443,
            "protocol": "TCP",
            "reject_all": false,
            "rejected_clients": null
        },
        {
            "allow_all": true,
            "allowed_clients": null,
            "port": 465,
            "protocol": "TCP",
            "reject_all": false,
            "rejected_clients": null
        },
        {
            "allow_all": true,
            "allowed_clients": null,
            "port": 587,
            "protocol": "TCP",
            "reject_all": false,
            "rejected_clients": null
        },
        {
            "allow_all": true,
            "allowed_clients": null,
            "port": 993,
            "protocol": "TCP",
            "reject_all": false,
            "rejected_clients": null
        },
        {
            "allow_all": true,
            "allowed_clients": null,
            "port": 995,
            "protocol": "TCP",
            "reject_all": false,
            "rejected_clients": null
        },
        {
            "allow_all": true,
            "allowed_clients": null,
            "port": 2202,
            "protocol": "TCP",
            "reject_all": false,
            "rejected_clients": null
        }
    ],
    "first_mail_domain": "domain.net",
    "inventory_hostname": "host.domain.net",
    "inventory_hostname_short": "host",
    "iredmail_backend": "mariadb",
    "iredmail_init_deploy": false,
    "iredmail_remove_components": false,
    "iredmail_update_adminer": true,
    "iredmail_update_antispam": true,
    "iredmail_update_backup": true,
    "iredmail_update_bind": true,
    "iredmail_update_fail2ban": true,
    "iredmail_update_firewall": true,
    "iredmail_update_iredapd": true,
    "iredmail_update_mariadb": true,
    "iredmail_update_netdata": true,
    "iredmail_update_phpfpm": true,
    "iredmail_update_preparations": true,
    "iredmail_update_roundcube": true,
    "iredmail_update_sogo": true,
    "iredmail_update_vmaildb": true,
    "iredmail_update_zpush": true,
    "iredmail_version": 2025060301,
    "iredweb_base_uri": "admin",
    "netdata_base_uri": "netdata",
    "newsletter_base_uri": "newsletter",
    "postfix_enable_smtps": true,
    "roundcube_base_uri": "mail",
    "roundcube_min_password_length": 12,
    "sa_bayes_isolation_level": "server",
    "self_service_base_uri": "self-service",
    "sogo_min_password_length": 12,
    "sogo_password_has_letter": true,
    "sogo_password_has_number": true,
    "sogo_password_has_special_char": true,
    "sogo_password_has_uppercase": true,
    "storage_base_dir": "/var/vmail",
    "trusted_clients": [
        "xx.xx.xx.xx",
        "xxxx:xxxx:xxxx:xxxx::1",
        "xx.xx.xx.xx",
        "xxxx:xxxx:xxxx:xxxx::1"
    ],
    "use_adminer": true,
    "use_antispam": true,
    "use_backup": true,
    "use_bind": true,
    "use_fail2ban": true,
    "use_firewall": true,
    "use_iredapd": true,
    "use_netdata": true,
    "use_phpfpm": true,
    "use_roundcube": true,
    "use_sogo": true,
    "use_zpush": true
}
==========================================

Upgrade iRedMail - full-featured mail server solution.

TASK [common] Get basic info of target system for further troubleshooting.
- Distribution: Rocky-9.5
- CPU: 4 core(s), amd64
- Memory: 7494 MB
- SWAP: 4095 MB
- iRedMail backend: mariadb
- Docker: False
changed [2.152797ms]

TASK [common] Get version of deployed iRedMail Enterprise Edition.
changed [214.86µs]
Deployed version: 2025060301
Running version: 2025060301

TASK [preparations] RedHat/CentOS: Change server hostname to inventory hostname.
ok: /etc/hostname [116.384µs]

TASK [preparations] Make sure 'dbus' service is running.
changed: dbus [22.95128ms]

TASK [preparations] Set hostname without rebooting server.
changed [109.40746ms]

TASK [preparations] Update /etc/hosts to include inventory hostname in `127.0.0.1` line.
changed: /etc/hosts [107.991µs]

TASK [preparations] Enable required yum repositories: baseos, appstream, crb
changed [402.260326ms]

TASK [preparations] Enable required yum repository: extras
changed [329.194078ms]

TASK [preparations] RHEL/CentOS: Make sure package `epel-release` is present.
ok: epel-release [16.036832ms]

TASK [preparations] RHEL/CentOS: Make sure repo `epel-next` is disabled.
failed
stderr: Error: No matching repo to modify: epel-next.
[ERROR] task error: exit status 1, Error: No matching repo to modify: epel-next.
...ignore error

TASK [preparations] [RHEL/CentOS] Append `module_hotfixes=1` to iRedMail yum repo file.
changed: /etc/yum.repos.d/iRedMail.repo [138.039µs]

TASK [preparations] RHEL/CentOS: Remove expired yum repo cache.
changed [374.750706ms]

TASK [preparations] Install required base packages.
ok: acl bzip2 cronie curl dbus dnf-plugins-core firewalld gzip python3-dnf-plugins-core python3-PyMySQL python3-psycopg2 python3-libselinux openssl rsyslog rsyslog-logrotate unzip tar wget [373.232597ms]

TASK [preparations] RHEL/CentOS: Detect /etc/selinux/config.
changed [82.171µs]

TASK [preparations] RHEL/CentOS: Disable SELinux immediately with `setenforce`.
failed
stderr: setenforce: SELinux is disabled
[ERROR] task error: exit status 1, setenforce: SELinux is disabled
...ignore error

TASK [preparations] RHEL/CentOS: Update /etc/selinux/config.
changed: /etc/selinux/config [297.238µs]

TASK [preparations] Create directory used to store SSL cert/key/ca files: /opt/iredmail/ssl.
ok: /opt/iredmail/ssl [183.716µs]

TASK [preparations] Generate self-signed SSL cert and key.
ok [61.06µs]

TASK [preparations] Generate full chain.
ok [32.525µs]

TASK [preparations] Generate Diffie Hellman Group (512 bits) with openssl.
ok [29.361µs]

TASK [preparations] Generate Diffie Hellman Group (2048 bits) with openssl. It may take some time, please be patient.
ok [23.09µs]

TASK [preparations] sysctl: Linux tuning.
changed: fs.file-max=20000000 [2.90218ms]
changed: fs.nr_open=20000000 [1.751858ms]

TASK [preparations] Create directories used to store additional files.
ok: /opt/iredmail [120.517µs]
ok: /opt/iredmail/bin [90.641µs]

TASK [preparations] Check whether /var/vmail is a symlink.
changed [71.985µs]

TASK [preparations] Create storage base directory.
ok: /var/vmail [86.917µs]

TASK [preparations] rsyslog: Make sure directory used to store modular config files exists.
ok: /etc/rsyslog.d [84.323µs]

TASK [preparations] [RHEL/CentOS] rsyslog: Enable rsyslog module 'lmregexp' to filter log content.
changed: /etc/rsyslog.conf [137.488µs]

TASK [preparations] Create unix group: vmail.
changed: vmail [3.448983ms]

TASK [preparations] Create unix user: vmail.
changed: vmail [11.107679ms]

TASK [firewall] RHEL/CentOS: Install firewalld package.
ok: firewalld firewalld-filesystem [43.170527ms]

TASK [firewall] RHEL/CentOS: Generate firewall rule.
ok: /etc/firewalld/zones/iredmail.xml [6.661646ms]

TASK [firewall] RHEL/CentOS: Set default firewall zone to 'iredmail'
changed: /etc/firewalld/firewalld.conf [431.316µs]

TASK [firewall] RHEL/CentOS: Enable and restart firewalld service.
changed: firewalld [1.462527634s]

TASK [bind] Install Bind (DNS server) packages.
ok: bind bind-utils [36.914951ms]

TASK [bind] Enable Bind service.
changed: named [326.028857ms]

TASK [bind] Configure Bind (cache-only).
ok: /etc/named.conf [3.937592ms]

TASK [bind] Use 127.0.0.1 as first DNS server in /etc/resolv.conf.
changed: /etc/resolv.conf [264.409µs]

TASK [bind] Detect /var/spool/postfix/etc/resolv.conf
changed [61.695µs]

TASK [bind] Use 127.0.0.1 as first DNS server in /var/spool/postfix/etc/resolv.conf.
changed: /var/spool/postfix/etc/resolv.conf [88.885µs]

TASK [bind] LOG: Generate modular rsyslog config file: /etc/rsyslog.d/1-iredmail-bind.conf
ok: /etc/rsyslog.d/1-iredmail-bind.conf [2.022054ms]

TASK [bind] LOG: Generate modular logrotate config file: /etc/logrotate.d/bind.
ok: /etc/logrotate.d/bind [1.551936ms]

TASK [bind] LOG: Create log directory: /var/log/named.
changed: /var/log/named [234.45µs]

TASK [bind] LOG: Set owner / group / permission for log directory.
ok: /var/log/named [67.33µs]

TASK [bind] LOG: Set owner / group / permission: /var/log/named/named.log.
ok: /var/log/named/named.log [39.879µs]

TASK [bind] Start Bind service.
changed: named [305.310153ms]

TASK [mariadb] Install MariaDB server.
ok: mariadb-server [23.002151ms]

TASK [mariadb] Enable MariaDB service.
changed: mariadb [362.048145ms]

TASK [mariadb] Create directory used to store custom modular config files: /opt/iredmail/custom/mysql.
changed: /opt/iredmail/custom/mysql [2.494518ms]

TASK [mariadb] Generate /opt/iredmail/custom/mysql/README.
ok: /opt/iredmail/custom/mysql/README [1.02797ms]

TASK [mariadb] Generate main config file my.cnf.
ok: /etc/my.cnf [4.340678ms]

TASK [mariadb] Check whether MariaDB server had been initialized.
changed [196.706µs]

TASK [mariadb] Increase max open file descriptors.
ok: /etc/security/limits.d/mysql.conf [903.029µs]

TASK [mariadb] Systemd: Create directory used to store modular systemd config file.
ok: /etc/systemd/system/mariadb.service.d [69.964µs]

TASK [mariadb] Systemd: Generate /etc/systemd/system/mariadb.service.d/override.conf.
ok: /etc/systemd/system/mariadb.service.d/override.conf [505.285µs]

TASK [mariadb] systemctl daemon-reload
changed [309.325434ms]

TASK [mariadb] Restart MariaDB service.
changed: mariadb [860.110846ms]

TASK [mariadb] Pause 5 seconds to wait for MariaDB service online.
changed [5.005352461s]

TASK [mariadb] Make sure MariaDB service is running.
changed: mariadb [21.990061ms]

TASK [mariadb] Create user root@127.0.0.1 and set password.
failed
stderr: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
[ERROR] task error: exit status 1, ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
...ignore error
failed
stderr: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
[ERROR] task error: exit status 1, ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
...ignore error

TASK [mariadb] Debian/Ubuntu: Reset root password(s).
failed
stderr: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
[ERROR] task error: exit status 1, ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
...ignore error

TASK [mariadb] Reset MySQL root password.
failed
stderr: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
[ERROR] task error: exit status 1, ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
...ignore error

TASK [mariadb] Remove database: test.
changed [18.144564ms]

TASK [mariadb] Delete anonymous SQL user.
changed [13.863921ms]

TASK [mariadb] Generate ~/.my.cnf-root.
ok: /root/.my.cnf [199.674µs]

TASK [mariadb] Generate logrotate config file: /etc/logrotate.d/mysql.
ok: /etc/logrotate.d/mysql [874.816µs]

TASK [vmaildb] [SQL] Generate file on disk from embedded file: extend_mailbox.mysql.
changed: /tmp/upload.sql [2.84649ms]

TASK [vmaildb] [SQL] Import file (MariaDB).
changed [19.563505ms]

TASK [vmaildb] [SQL] Remove uploaded file.
changed: /tmp/upload.sql [187.929µs]

TASK [postfix] Stop and disable conflict MTA services.
failed: exim
[ERROR] task error: failed in starting service exim: exit status 5, Failed to stop exim.service: Unit exim.service not loaded.
...ignore error
failed: exim4
[ERROR] task error: failed in starting service exim4: exit status 5, Failed to stop exim4.service: Unit exim4.service not loaded.
...ignore error
failed: sendmail
[ERROR] task error: failed in starting service sendmail: exit status 5, Failed to stop sendmail.service: Unit sendmail.service not loaded.
...ignore error
failed: smtpd
[ERROR] task error: failed in starting service smtpd: exit status 5, Failed to stop smtpd.service: Unit smtpd.service not loaded.
...ignore error

TASK [postfix] Install Postfix packages.
ok: postfix postfix-pcre cyrus-sasl cyrus-sasl-lib cyrus-sasl-plain [119.03405ms]
ok: postfix-mysql [16.81056ms]

TASK [postfix] Enable Postfix service.
changed: postfix [385.359492ms]

TASK [postfix] Run shell script for advanced customizations: /opt/iredmail/custom/postfix/custom.sh.
changed [5.546404ms]

TASK [iredapd] Create unix group: iredapd.
changed: iredapd [6.273677ms]

TASK [iredapd] Create unix user: iredapd.
changed: iredapd [12.473733ms]

TASK [iredapd] Install dependent packages.
ok: python3-sqlalchemy python3-dns python3-PyMySQL python3-ldap python3-psycopg2 [109.815701ms]

INCLUDE [iredapd] Install iRedAPD (version 5.9.1).

TASK [iredapd] Copy systemd service script.
ok: /lib/systemd/system/iredapd.service [224.039µs]

TASK [iredapd] systemctl daemon-reload
changed [362.190491ms]

TASK [iredapd] Enable iRedAPD service.
changed: iredapd [382.390971ms]

TASK [iredapd] SQL: Create database: iredapd.
changed [10.074319ms]

TASK [iredapd] SQL: Create and grant permissions to user 'iredapd'.
changed [51.453902ms]

TASK [iredapd] Generate ~/.my.cnf-iredapd.
ok: /root/.my.cnf-iredapd [388.795µs]

TASK [iredapd] Create SQL tables.
changed [18.056859ms]

TASK [iredapd] Add cron job: iRedAPD: Clean up expired tracking records hourly.
changed [93.816µs]

TASK [iredapd] Add cron job: iRedAPD: Convert SPF DNS record of specified domain names to IP
changed [600.853µs]

TASK [iredapd] Generate config file: /opt/iredapd/settings.py.
changed: /opt/iredapd/settings.py [16.363112ms]

TASK [iredapd] Create directory used to store custom config file: /opt/iredmail/custom/iredapd.
ok: /opt/iredmail/custom/iredapd [108.12µs]

TASK [iredapd] Make sure custom config file exists: /opt/iredmail/custom/iredapd/settings.py.
ok: /opt/iredmail/custom/iredapd/settings.py [121.988µs]

TASK [iredapd] Create symbol link: /opt/iredmail/custom/iredapd/settings.py -> /opt/iredapd/custom_settings.py.
changed: /opt/iredapd/custom_settings.py [2.104475ms]

TASK [iredapd] Make sure SQL structure is up to date.
changed [3.398233842s]

TASK [iredapd] LOG: Generate modular rsyslog config file: /etc/rsyslog.d/1-iredmail-iredapd.conf
changed: /etc/rsyslog.d/1-iredmail-iredapd.conf [8.54701ms]

TASK [iredapd] LOG: Generate modular logrotate config file: /etc/logrotate.d/iredapd.
changed: /etc/logrotate.d/iredapd [9.052332ms]

TASK [iredapd] LOG: Create log directory: /var/log/iredapd.
changed: /var/log/iredapd [242.856µs]

TASK [iredapd] LOG: Set owner / group / permission for log directory.
ok: /var/log/iredapd [76.571µs]

TASK [iredapd] LOG: Set owner / group / permission: /var/log/iredapd/iredapd.log.
changed: /var/log/iredapd/iredapd.log [6.176625ms]
failed: systemd-timesyncd
[ERROR] task error: failed in starting service systemd-timesyncd: exit status 5, Failed to stop systemd-timesyncd.service: Unit systemd-timesyncd.service not loaded.
...ignore error

TASK [ntp] Install ntp/chrony server to sync local time.
ok: chrony [18.692543ms]

TASK [ntp] Enable and restart ntp/chrony service.
changed: chronyd [494.402174ms]

TASK [dovecot] Install Dovecot packages.
ok: dovecot dovecot-pigeonhole dovecot-mysql [76.69553ms]

TASK [dovecot] Enable Dovecot service.
changed: dovecot [299.601391ms]

TASK [dovecot] Systemd: Create directory used to store modular systemd config file.
ok: /etc/systemd/system/dovecot.service.d [63.663µs]

TASK [dovecot] Systemd: Generate /etc/systemd/system/dovecot.service.d/override.conf.
ok: /etc/systemd/system/dovecot.service.d/override.conf [746.384µs]

TASK [dovecot] systemctl daemon-reload
changed [294.943863ms]

TASK [dovecot] Create required directories.
failed: /var/vmail/vmail1
[ERROR] task error: /var/vmail/vmail1 already exists as a symbol link
[ERROR] task:
file:
    dest: '{{ item }}'
    group: '{{ sys_group_vmail }}'
    mode: "0700"
    owner: '{{ sys_user_vmail }}'
    recurse: "no"
    state: directory
loop:
    - '{{ storage_mailboxes_dir }}'
    - '{{ public_mailbox_dir }}'
    - '{{ sieve_dir }}'
    - '{{ dovecot_extprogram_dir }}'
    - '{{ dovecot_sieve_pipe_bin_dir }}'
    - '{{ dovecot_imapsieve_copy_dir }}'
name: Create required directories.

task error: /var/vmail/vmail1 already exists as a symbol link
-------------------