Grommunio Mail Server
This material is work-in-progress ... This is a work in progress |
HOWTO: Install AlpineLinux Mail Server with Grommunio
This tutorial outlines the steps for setting up a mail server on Alpine Linux using **Grommunio**, a modern, open-source groupware solution that supports email and calendar services. The installation includes MariaDB, Nginx, PHP, Postfix, and other components necessary for a fully functioning mail server.
Prerequisites
Before proceeding with the installation, ensure you have a fresh Alpine Linux system setup. You'll need root privileges to execute these commands.
Steps:
1. Install and configure MariaDB 2. MariaDB performance tuning (optional) 3. Install and configure Nginx 4. Install and configure PHP 5. Install and configure Postfix 6. Install and configure Grommunio 7. Configure Valkey (Redis replacement) 8. Install and configure Rspamd 9. Finalize and verify installation
---
1. Install and Configure MariaDB
Step 1: Install MariaDB
To start, install MariaDB and necessary client utilities:
```sh apk add mariadb mariadb-client mariadb-server-utils ```
Step 2: Set up MariaDB Database Variables
Define the variables used in the setup and create a symlink to the MariaDB data directory.
```sh DB_DATA_PATH="/srv/mysql" DB_ROOT_PASS="Passw0rd1" DB_USER="admin" DB_PASS="Passw0rd2" ```
Setup system tables and configure the symlink for MariaDB:
```sh sudo mysql_install_db --user=mysql --datadir=${DB_DATA_PATH} ln -s /srv/mysql /var/lib/mysql rc-service mariadb restart ```
=== Step 3: Secure MariaDB Run the built-in security script to set a root password and configure MariaDB security settings.
```sh sudo mysql_secure_installation ```
Step 4: Create MariaDB User for Grommunio
Create a new user for Grommunio and assign privileges:
```sh echo "GRANT ALL ON *.* TO ${DB_USER}@'127.0.0.1' IDENTIFIED BY '${DB_PASS}' WITH GRANT OPTION;" > /tmp/sql echo "GRANT ALL ON *.* TO ${DB_USER}@'localhost' IDENTIFIED BY '${DB_PASS}' WITH GRANT OPTION;" >> /tmp/sql echo "GRANT ALL ON *.* TO ${DB_USER}@'::1' IDENTIFIED BY '${DB_PASS}' WITH GRANT OPTION;" >> /tmp/sql echo "DELETE FROM mysql.user WHERE User=;" >> /tmp/sql echo "FLUSH PRIVILEGES;" >> /tmp/sql cat /tmp/sql | mysql -u root --password="${DB_ROOT_PASS}" ```
Step 5: Configure MariaDB for Grommunio
Edit the MariaDB configuration for better performance:
```sh vi /etc/my.cnf.d/mariadb-server.cnf ```
Add the following configuration:
```ini [mysqld] innodb_log_buffer_size=16M innodb_log_file_size=32M innodb_read_io_threads=4 innodb_write_io_threads=4 join_buffer_size=512K query_cache_size=0 query_cache_type=0 query_cache_limit=2M performance_schema=ON bind-address = 127.0.0.1 skip-name-resolve=ON ```
Create a default charset configuration for MariaDB:
```sh cat > /etc/my.cnf.d/mariadb-server-default-charset.cnf << EOF [client] default-character-set = utf8mb4
[mysqld] collation_server = utf8mb4_general_ci character_set_server = utf8mb4
[mysql] default-character-set = utf8mb4 EOF ```
Restart MariaDB and enable it to start on boot:
```sh rc-update add mariadb default service mariadb restart ```
=== Step 6: Verify MariaDB Setup Check if the MariaDB listener is running and bound to the correct address:
```sh ss -tulpn ```
Step 7: Create Grommunio Database
Define the database parameters and create the Grommunio database:
```sh MYSQL_HOST="localhost" MYSQL_USER="grommunio" MYSQL_PASS="Passw0rd3" MYSQL_DB="grommunio"
echo "create database $MYSQL_DB character set 'utf8mb4';" > /tmp/sql echo "grant select, insert, update, delete, create, drop, index, alter, create temporary tables, lock tables on $MYSQL_DB.* TO $MYSQL_USER@$MYSQL_HOST identified by '$MYSQL_PASS';" >> /tmp/sql echo "flush privileges;" >> /tmp/sql cat /tmp/sql | mysql -u admin --password="${DB_PASS}" ```
Test the database connection:
```sh mysql -hlocalhost -u grommunio -p${MYSQL_PASS} grommunio ```
---
2. MariaDB Performance Tuning (Optional)
Install and configure MySQLTuner to help with database performance:
```sh wget -v --no-check-certificate https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl -O /tmp/mysqltuner.pl mv /tmp/mysqltuner.pl /usr/local/bin/mysqltuner.pl chmod 755 /usr/local/bin/mysqltuner.pl apk add perl perl-doc /usr/local/bin/mysqltuner.pl --user admin --pass ${DB_PASS} ```
---
3. Install and Configure Nginx
Step 1: Install Nginx
Install the necessary Nginx modules:
```sh apk add nginx nginx-mod-http-headers-more nginx-mod-http-vts nginx-mod-http-brotli ```
Step 2: Configure Nginx
Backup the original Nginx configuration and edit it for security headers and TLS settings:
```sh cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.orig vi /etc/nginx/nginx.conf ```
Add the following configuration:
```nginx error_log syslog:server=unix:/dev/log,facility=local2,nohostname warn; more_set_headers "Strict-Transport-Security : max-age=2592000; includeSubDomains;"; more_set_headers "X-Frame-Options : SAMEORIGIN"; more_set_headers "Content-Security-Policy : default-src https: data: 'unsafe-inline' 'unsafe-eval' always"; more_set_headers "X-Xss-Protection : 1; mode=block"; more_set_headers "X-Content-Type-Options : nosniff"; more_set_headers "Referrer-Policy : strict-origin-when-cross-origin"; more_set_headers "Server : Follow the white rabbit.";
ssl_protocols TLSv1.2 TLSv1.3; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m;
log_format main_ssl '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" ' 'client_ciphers="$ssl_ciphers" client_curves="$ssl_curves"';
access_log off; ```
Restart Nginx and enable it to start on boot:
```sh rc-update add nginx service nginx restart ```
---
4. Install and Configure PHP
Step 1: Install PHP
Install the required PHP packages for Grommunio:
```sh apk add php83 php83-fpm ```
Step 2: Harden PHP Configuration
Disable insecure PHP settings and adjust PHP limits:
```sh sed 's/^;\?\(allow_url_fopen\).*/\1 = Off/' -i /etc/php83/php.ini sed 's/^;\?\(expose_php\).*/\1 = Off/' -i /etc/php83/php.ini sed 's/^;\?\(display_errors\).*/\1 = Off/' -i /etc/php83/php.ini sed 's/^;\?\(log_errors\).*/\1 = On/' -i /etc/php83/php.ini ```
Step 3: Configure Session Security
Configure PHP session security:
```sh sed 's/^;\?\(session.use_strict_mode\).*/\1 = 1/' -i /etc/php83/php.ini sed 's/^;\?\(session.cookie_secure\).*/\1 = 1/' -i /etc/php83/php.ini sed 's/^;\?\(session.cookie_httponly\).*/\1 = 1/' -i /etc/php83/php.ini ```
---
5. Install and Configure Postfix
Step 1: Install Postfix
Install Postfix and related modules:
```sh apk add postfix postfix-mysql postfix-pcre ```
Step 2: Configure Postfix
Backup and configure the Postfix settings. Adapt the values as necessary, such as `myhostname`, `mynetworks`, and `smtp_tls_chain_files`:
```sh mv /etc/postfix/main.cf /etc/postfix/main.cf.orig mv /etc/postfix/master.cf /etc/postfix/master.cf.orig ```
Run Postfix setup:
```sh newaliases postmap /etc/postfix/transport ```
Enable Postfix service:
```sh rc-update add postfix service postfix restart ```
Step 3: Verify Postfix Logs
Check the Postfix logs for any errors:
```sh tail -f /var/log/maillog ```
---
6. Install and Configure Grommunio
Install and configure Grommunio to provide email and calendar functionality. Follow the detailed installation steps outlined in the official Grommunio documentation.
---
7. Configure Valkey (Redis Replacement)
Configure Valkey for optimal caching and session handling, replacing Redis if required.
---
8. Install and Configure Rspamd
Rspamd provides spam filtering for your mail server. Follow the official documentation to install and configure Rspamd to work with Postfix and Nginx.
---
9. Finalize and Verify Installation
Step 1: Test Server Components
Ensure that all services (Postfix, MariaDB, Nginx, PHP, Grommunio) are running correctly:
```sh ss -tulpn ```
Step 2: Verify Mail Functionality
Test sending and receiving emails using a mail client and verifying server logs for any errors.
5. Install and Configure Grommunio
1. Enable IPv6
Since Grommunio requires IPv6 for its daemons:
1. **Edit `/etc/hosts` to include IPv6 localhost:**
```bash vi /etc/hosts ----- ::1 localhost ipv6-localhost ipv6-loopback ----- ```
2. **Ensure IPv6 is enabled in `/etc/sysctl.conf`:**
```bash sed -i 's/^net\.ipv6\.conf\..*\.disable_ipv6\s=\s1/#&/' /etc/sysctl.conf sysctl -p ping ::1 # Test if IPv6 is working ```
2. Configure Database Parameters
Set up your MySQL database connection details: ```bash MYSQL_HOST="localhost" MYSQL_USER="grommunio" MYSQL_PASS="Passw0rd3" MYSQL_DB="grommunio" ```
3. Specify Internal FQDN, Mail Domain, and Relayhost
Adjust the following for your specific setup: ```bash FQDN="mail.example.local" MAILDOMAIN="example.com" RELAYHOST="123.123.123.1" ADMIN_PASS="Passw0rd4" ```
4. Install Dependencies and Grommunio Packages
Install necessary dependencies: ```bash apk add valkey valkey-cli cyrus-sasl cyrus-sasl-login util-linux-login apk add grommunio-gromox grommunio-web grommunio-admin-api grommunio-admin-web grommunio-index grommunio-error-pages ```
Optionally, install deprecated ActiveSync if needed: ```bash
- apk add grommunio-dav grommunio-sync
```
5. Move Mail Storage to Another Disk
Move the largest directory `/var/lib/gromox` to another disk and create a symlink: ```bash mv /var/lib/gromox /srv/gromox ln -s /srv/gromox /var/lib/gromox ```
6. Enable Required Services
Enable all necessary Grommunio services: ```bash rc-update add grommunio-admin-api rc-update add gromox-delivery rc-update add gromox-delivery-queue
- Add all the other grommunio services
```
7. Configure Grommunio Files
Modify the configuration files to match your environment: ```bash sed -i "s/mail.example.local/${FQDN}/g" /etc/gromox/*.cfg sed -i "s/example.com/${MAILDOMAIN}/g" /etc/gromox/*.cfg
- Continue modifying other configuration files (mysql_adaptor.cfg, autodiscover.ini, etc.)
```
8. Configure Postfix
Prepare Postfix for integration with Grommunio: ```bash cp -p /etc/postfix/grommunio-virtual-mailbox-maps.cf /etc/postfix/grommunio-virtual-mailbox-sender-maps.cf sed -i '/^query =/d' /etc/postfix/grommunio-virtual-mailbox-sender-maps.cf echo "query = SELECT username FROM users WHERE username='%s' UNION SELECT aliasname FROM aliases WHERE mainname='%s'" >> /etc/postfix/grommunio-virtual-mailbox-sender-maps.cf ```
9. Configure TLS Certificates
Link and configure your SSL certificates: ```bash ln -s /etc/grommunio-common/nginx/ssl_certificate.conf /etc/grommunio-admin-common/nginx-ssl.conf cat /etc/ssl/private/${FQDN}.key.pem /etc/ssl/certs/${FQDN}.cert.pem > /etc/ssl/private/${FQDN}.key_cert.pem chmod 640 /etc/ssl/private/*.key_cert.pem addgroup gromox ssl-cert ```
10. Configure PAM and SASL
Set up authentication services: ```bash
- Configure PAM for SMTP
cat > /etc/pam.d/smtp <<EOF
- %PAM-1.0
auth required pam_gromox.so service=smtp account required pam_permit.so EOF
- Configure SASL authentication
cat > /etc/conf.d/saslauthd <<EOF SASLAUTHD_OPTS="-a pam -r" EOF ```
11. Initialize the Database and Set Admin Password
Initialize the database: ```bash gromox-dbop -C ``` Set the Grommunio admin password: ```bash grommunio-admin passwd --password "${ADMIN_PASS}" ```
12. Configure Firewall Ports
Open the necessary firewall ports: ```bash
- Required ports: 25, 80, 443, etc.
```
---
6. Configure Valkey (Redis Replacement)
1. Enable Syslog:
```bash vi /etc/valkey/grommunio.conf ----- syslog-enabled yes syslog-ident valkey syslog-facility local0 ----- ```
2. Enable Memory Overcommit:
```bash vi /etc/sysctl.conf ----- vm.overcommit_memory = 1 ----- sysctl -p ```
3. Start Valkey and Test:
```bash rcctl restart valkey@grommunio valkey-cli ping # Expected result: 'PONG' ```
---
7. Install and Configure Rspamd
1. Install Rspamd:
```bash apk add rspamd rspamd-client ```
2. Configure Rspamd:
Modify Rspamd configuration files: ```bash cat > /etc/rspamd/local.d/options.inc <<EOF dns {
enable_dnssec = true; timeout = 4s; retransmits = 5;
} EOF
cat > /etc/rspamd/local.d/redis.conf <<EOF read_servers = "127.0.0.1"; write_servers = "127.0.0.1"; EOF
cat > /etc/rspamd/local.d/worker-proxy.inc <<EOF milter = yes; bind_socket = "/var/run/rspamd/worker-proxy.sock mode=0660 owner=rspamd"; timeout = 120s; upstream "local" {
default = yes; self_scan = yes;
} count = 4; EOF ```
3. Add Postfix to Rspamd Group:
```bash addgroup postfix rspamd ```
4. Configure DKIM Signing:
```bash cat > /etc/rspamd/local.d/dkim_signing.conf <<EOF enabled = true; path = "/var/lib/rspamd/dkim/\$domain-\$selector.key"; selector = "dkim"; sign_authenticated = true; sign_local = false; domain {
example.com { selector = "202406"; }
} EOF ```
5. Generate DKIM Key Pair:
```bash mkdir -p /var/lib/rspamd/dkim rspamadm dkim_keygen -s 202406 -t ED25519 -d example.com -k /var/lib/rspamd/dkim/example.com-202406.key > /var/lib/rspamd/dkim/example.com-202406.pub ```
6. Start Rspamd:
```bash rc-update add rspamd rcctl start rspamd ```
---
8. Finalize and Verify Installation
1. Restart Services:
Restart all services: ```bash rcctl restart postfix saslauthd rspamd valkey@grommunio nginx php-fpm83 gromox-delivery gromox-event \
gromox-http gromox-imap gromox-midb gromox-pop3 gromox-delivery-queue gromox-timer gromox-zcore \ grommunio-admin-api
```
2. Verify Service Status:
Check the status of all services: ```bash rcctl status ```
3. Check Logs:
Inspect logs for any errors or issues: ```bash find /var/log -type f | xargs tail -n50 | grep -iE '==>|fail|crit|error|alert|corrupt|warning' ```
4. Web UI Access:
Admin UI: [1](https://mail.example.local:8443)
---
End User Configuration:
1. Admin UI:
Log into the Admin UI with the username `admin` and the previously created `ADMIN_PASS`.
2. License Configuration:
If you have a license, you can configure it under **Grommunio settings** in the Admin UI.