Postfix, Dovecot, Roundcube e PostfixAdmin no Debian 11 com Nginx e MariaDB
Instalar Nginx, MariaDB e PHP
Após atualizar e fazer as configurações iniciais é possível começar o processo de instalação.
sudo apt install nginx mariadb-server php php-fpm php-cli php-mysql php-zip php-curl php-xml -y
Após a instalação é recomendado proteger a instalação, isso pode ser feito com o comando:
mysql_secure_installation
Enter current password for root (enter for none): Change the root password? [Y/n] Y New password: Re-enter new password: Remove anonymous users? [Y/n] Y Disallow root login remotely? [Y/n] Y Remove test database and access to it? [Y/n] Y Reload privilege tables now? [Y/n] Y
Criar o user vmail
Esse user ficará responsável pelo armazenamento das mensagens, entre outras coisas, para o criar é só executar os seguintes comandos:
useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c "Virtual Mail User" vmail mkdir -p /var/vmail chmod -R 770 /var/vmail chown -R vmail:mail /var/vmail
Com isso esse user já está criado.
Criar a base de dados do PostfixAdmin
Essa base de dados irá conter todas as contas de email, entre no shell da MariaDB:
mysql -u root -p
Após inserir a senha da conta root, insira os seguintes comandos:
CREATE DATABASE postfixadmin; GRANT ALL PRIVILEGES ON postfixadmin.* TO 'postfixadmin'@'localhost' IDENTIFIED BY 'Passw0rd'; FLUSH PRIVILEGES; EXIT;
Instalar o PostfixAdmin
Faça o download do PostfixAdmin.
wget https://webwerks.dl.sourceforge.net/project/postfixadmin/postfixadmin-3.3.8/PostfixAdmin%203.3.8.tar.gz
Extraia o seu conteúdo.
tar -xzf PostfixAdmin\ 3.3.8.tar.gz
Mova o que foi extraído para a pasta /var/www/html/postfixadmin.
mv postfixadmin-postfixadmin-7d04685 /var/www/html/postfixadmin
Crie a pasta templates_c.
mkdir /var/www/html/postfixadmin/templates_c chown -R www-data: /var/www/html/postfixadmin/
Crie o arquivo de configuração config.local.php.
emacs /var/www/html/postfixadmin/config.local.php
E dentro dele coloque o seguinte conteúdo.
<?php $CONF['configured'] = true; $CONF['database_type'] = 'mysqli'; $CONF['database_host'] = 'localhost'; $CONF['database_user'] = 'postfixadmin'; $CONF['database_password'] = 'Passw0rd'; $CONF['database_name'] = 'postfixadmin'; $CONF['default_aliases'] = array ( 'abuse' => 'abuse@domain.com', 'hostmaster' => 'hostmaster@domain.com', 'postmaster' => 'postmaster@domain.com', 'webmaster' => 'webmaster@domain.com' ); $CONF['fetchmail'] = 'NO'; $CONF['show_footer_text'] = 'NO'; $CONF['quota'] = 'YES'; $CONF['domain_quota'] = 'YES'; $CONF['quota_multiplier'] = '1024000'; $CONF['used_quotas'] = 'YES'; $CONF['new_quota_table'] = 'YES'; $CONF['aliases'] = '0'; $CONF['mailboxes'] = '0'; $CONF['maxquota'] = '0'; $CONF['domain_quota_default'] = '0'; ?>
Tenha atenção de que a senha é a mesma que foi usada quando foi criado o user que irá fazer a gestão dessa base de dados.
Crie a estrutura da base de dados.
sudo -u www-data php /var/www/html/postfixadmin/public/upgrade.php
Criar a conta de administrador do PostfixAdmin.
bash /var/www/html/postfixadmin/scripts/postfixadmin-cli admin add
Welcome to Postfixadmin-CLI v0.3 --------------------------------------------------------------- Admin: > admin@pedror.grsi Password: > abc123 Password (again): > abc123 Super admin: (Super admins have access to all domains, can manage domains and admin accounts.) (y/n) > y Domain: > pedror.grsi Active: (y/n) > y The admin admin@domain.com has been added! ---------------------------------------------------------------
Com isso o PostfixAdmin já está instalado.
Instalar o Postfix
Instale o Postfix com o seguinte comando.
apt install postfix postfix-mysql -y

Será pedido para configurar o tipo de configuração, selecione No configuration.
Depois de terminar a instalação é preciso criar uma cópia do arquivo main.cf.
cp /etc/postfix/main.cf.proto /etc/postfix/main.cf
Navegue até a pasta onde o Postfix foi instalado.
cd /etc/postfix
Crie uma pasta para armazenar os arquivos de configuração para o acesso à base de dados do PostfixAdmin.
mkdir sql cd sql
Agora será preciso criar vários arquivos de configuração.
emacs mysql_virtual_alias_maps.cf
E o su respectivo conteúdo.
user = postfixadmin password = Passw0rd hosts = localhost dbname = postfixadmin query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
Repita para o resto dos arquivos.
emacs mysql_virtual_domains_maps.cf
user = postfixadmin password = Passw0rd hosts = localhost dbname = postfixadmin query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'
emacs mysql_virtual_mailbox_maps.cf
user = postfixadmin password = Passw0rd hosts = localhost dbname = postfixadmin query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
emacs mysql_virtual_alias_domain_maps.cf
user = postfixadmin
password = Passw0rd
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'
emacs mysql_virtual_alias_domain_mailbox_maps.cf
user = postfixadmin
password = Passw0rd
hosts = localhost
dbname = postfixadmin
query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '%d' and mailbox.username = CONCAT('%u', '@', alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active='1'
emacs mysql_virtual_mailbox_limit_maps.cf
user = postfixadmin password = Passw0rd hosts = localhost dbname = postfixadmin query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'
emacs mysql_virtual_alias_domain_catchall_maps.cf
user = postfixadmin
password = Passw0rd
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'
Ou então use o seguinte script para criar tudo automaticamente.
#!/bin/bash
echo "user = postfixadmin" >> mysql_virtual_alias_maps.cf
echo "password = Passw0rd" >> mysql_virtual_alias_maps.cf
echo "hosts = localhost" >> mysql_virtual_alias_maps.cf
echo "dbname = postfixadmin" >> mysql_virtual_alias_maps.cf
echo "query = SELECT goto FROM alias WHERE address='%s' AND active = '1'" >> mysql_virtual_alias_maps.cf
echo "user = postfixadmin" >> mysql_virtual_domains_maps.cf
echo "password = Passw0rd" >> mysql_virtual_domains_maps.cf
echo "hosts = localhost" >> mysql_virtual_domains_maps.cf
echo "dbname = postfixadmin" >> mysql_virtual_domains_maps.cf
echo "query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'" >> mysql_virtual_domains_maps.cf
echo "user = postfixadmin" >> mysql_virtual_mailbox_maps.cf
echo "password = Passw0rd" >> mysql_virtual_mailbox_maps.cf
echo "hosts = localhost" >> mysql_virtual_mailbox_maps.cf
echo "dbname = postfixadmin" >> mysql_virtual_mailbox_maps.cf
echo "query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'" >> mysql_virtual_mailbox_maps.cf
echo "user = postfixadmin" >> mysql_virtual_alias_domain_maps.cf
echo "password = Passw0rd" >> mysql_virtual_alias_domain_maps.cf
echo "hosts = localhost" >> mysql_virtual_alias_domain_maps.cf
echo "dbname = postfixadmin" >> mysql_virtual_alias_domain_maps.cf
echo "query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'" >> mysql_virtual_alias_domain_maps.cf
echo "user = postfixadmin" >> mysql_virtual_alias_domain_mailbox_maps.cf
echo "password = Passw0rd" >> mysql_virtual_alias_domain_mailbox_maps.cf
echo "hosts = localhost" >> mysql_virtual_alias_domain_mailbox_maps.cf
echo "dbname = postfixadmin" >> mysql_virtual_alias_domain_mailbox_maps.cf
echo "query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '%d' and mailbox.username = CONCAT('%u', '@', alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active='1'" >> mysql_virtual_alias_domain_mailbox_maps.cf
echo "user = postfixadmin" >> mysql_virtual_mailbox_limit_maps.cf
echo "password = Passw0rd" >> mysql_virtual_mailbox_limit_maps.cf
echo "hosts = localhost" >> mysql_virtual_mailbox_limit_maps.cf
echo "dbname = postfixadmin" >> mysql_virtual_mailbox_limit_maps.cf
echo "query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'" >> mysql_virtual_mailbox_limit_maps.cf
echo "user = postfixadmin" >> mysql_virtual_alias_domain_catchall_maps.cf
echo "password = Passw0rd" >> mysql_virtual_alias_domain_catchall_maps.cf
echo "hosts = localhost" >> mysql_virtual_alias_domain_catchall_maps.cf
echo "dbname = postfixadmin" >> mysql_virtual_alias_domain_catchall_maps.cf
echo "query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'" >> mysql_virtual_alias_domain_catchall_maps.cf
Agora é preciso configurar o Postfix para usar os arquivos de configuração.
postconf -e "myhostname = $(hostname -f)" postconf -e "mydestination = localhost" postconf -e "mynetworks = 127.0.0.0/8" postconf -e "inet_protocols = ipv4" postconf -e "inet_interfaces = all" postconf -e "smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem" postconf -e "smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key" postconf -e "smtpd_use_tls = yes" postconf -e "smtpd_tls_auth_only = yes" postconf -e "smtpd_sasl_type = dovecot" postconf -e "smtpd_sasl_path = private/auth" postconf -e "smtpd_sasl_auth_enable = yes" postconf -e "smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination" postconf -e "virtual_transport = lmtp:unix:private/dovecot-lmtp" postconf -e "virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf" postconf -e "virtual_alias_maps = proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf, proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf, proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf" postconf -e "virtual_mailbox_maps = proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf, proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf" mkfifo /var/spool/postfix/public/pickup
Tenha atenção aos certificados, caso esteja usando certificados para o servidor, coloque os caminhos adequados nas linhas:
postconf -e "smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem" postconf -e "smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key"
Edite o arquivo /etc/postfix/main.cf.
emacs /etc/postfix/main.cf
Comente as seguintes linhas:
sendmail_path = newaliases_path = mailq_path = setgid_group = html_directory = manpage_directory = sample_directory = readme_directory =
Para que fiquem assim:
#sendmail_path = #newaliases_path = #mailq_path = #setgid_group = #html_directory = #manpage_directory = #sample_directory = #readme_directory =
Editar o arquivo /etc/postfix/master.cf.
emacs /etc/postfix/master.cf
E modifique ou adicione as linhas de acordo.
smtp inet n - y - - smtpd #smtp inet n - y - 1 postscreen #smtpd pass - - y - - smtpd #dnsblog unix - - y - 0 dnsblog #tlsproxy unix - - y - 0 tlsproxy submission inet n - y - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes # -o smtpd_reject_unlisted_recipient=no # -o smtpd_client_restrictions=$mua_client_restrictions # -o smtpd_helo_restrictions=$mua_helo_restrictions # -o smtpd_sender_restrictions=$mua_sender_restrictions # -o smtpd_recipient_restrictions= # -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o smtpd_client_restrictions=permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATING smtps inet n - y - - smtpd -o syslog_name=postfix/smtps # -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes # -o smtpd_reject_unlisted_recipient=no -o smtpd_client_restrictions=permit_sasl_authenticated,reject # -o smtpd_client_restrictions=$mua_client_restrictions # -o smtpd_helo_restrictions=$mua_helo_restrictions # -o smtpd_sender_restrictions=$mua_sender_restrictions # -o smtpd_recipient_restrictions= # -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATING
Instalar o Dovecot
Instale o Dovecot com o seguinte comando.
apt install dovecot-mysql dovecot-imapd dovecot-pop3d dovecot-lmtpd -y
Será preciso editar algumas configurações do Dovecot, naveque até a pasta /etc/dovecot/conf.d.
cd /etc/dovecot/conf.d
Vamos editar o arquivo 10-auth.conf.
emacs 10-auth.conf
# Na linha 100 faça essa alteração: auth_mechanisms = plain # para auth_mechanisms = plain login # Comente a linha 122 #!include auth-system.conf.ext # E descomente a linha 123 !include auth-sql.conf.ext
Edite o arquivo 10-mail.conf.
emacs 10-mail.conf
# Altere as seguintes linhas mail_location = maildir:/var/vmail/%d/%n mail_uid = vmail mail_gid = mail mail_privileged_group = mail first_valid_uid = 150 last_valid_uid = 150
Certifique-se de que no arquivo 10-ssl.conf tem o ssl ativo.
ssl = yes
Edite o arquivo 10-master.conf.
emacs 10-master.conf
# Na linha 54 altere para que fique dessa maneira
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}
# Por volta d alinha 88, altere a sessão service auth
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
unix_listener auth-userdb {
mode = 0600
user = vmail
}
user = dovecot
}
# Altere service auth-worker
service auth-worker {
user = vmail
}
Navegue para um nível acima.
cd ..
Edite o arquivo dovecot-sql.conf.ext.
emacs dovecot-sql.conf.ext
Adicione as sequintes linhas no final do arquivo.
driver = mysql
connect = host=localhost dbname=postfixadmin user=postfixadmin password=Passw0rd
default_pass_scheme = MD5-CRYPT
password_query = SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, 'maildir:/var/vmail/%d/%n' as userdb_mail, 150 as userdb_uid, 8 as userdb_gid FROM mailbox WHERE username = '%u' AND active = '1'
user_query = SELECT '/var/vmail/%d/%u' as home, 'maildir:/var/vmail/%d/%u' as mail, 150 AS uid, 8 AS gid, concat('dirsize:storage=', quota) AS quota FROM mailbox WHERE username = '%u' AND active = '1'
Altere as permissões da pasta /etc/dovecot.
chown -R vmail:dovecot /etc/dovecot chmod -R o-rwx /etc/dovecot
Reinicie o Postfix e Dovecot.
systemctl restart postfix dovecot
Configurar o config file do Nginx para acessar o PostfixAdmin
Navegue até a pasta /etc/nginx/sites-available.
cd /etc/nginx/sites-available
Crie o config file do PostfixAdmin.
emacs admin.pedror.grsi
E coloque o seguinte conteúdo.
server {
listen 80;
root /var/www/html/postfixadmin/public;
index index.html index.htm index.php;
server_name admin.pedror.grsi;
allow 10.59.170.128/26;
deny all;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors off;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
}
location / {
try_files $uri $uri/ =404;
}
}
Preste atenção às seguintes linhas.
allow 10.59.170.128/26; deny all;
Elas irão permitir que apenas computadores na rede 10.59.170.108/26 possams acessar essa página.
Caso queira permitir o acesso à máquinas de qualquer rede, omita essas duas linhas.
Crie um atalho na pasta sites-enabled.
ln -s /etc/nginx/sites-available/admin.pedror.grsi ../sites-enabled/
Execute o seguinte comando para inicializar a base de dados de aliases do Postfix.
newaliases
Reinicie o Nginx.
service nginx restart
Acesse através do endereço http://admin.pedror.grsi/setup.php

Com isso já temos acesso ao PostfixAdmin.

Em Setup password coloque uma senha e clique em Generate setup_password hash.
Copie a linha que foi gerada abaixo e a cole no arquivo /var/www/html/postfixadmin/config.local.php, logo abaixo de $CONF[‘domain_quota_default’] = ‘0’;.
$CONF['setup_password'] = '$2y$10$JeBgsBKghR4CRW9OqSjrMuK.ddTxhe0d6FC8VNCyulYUhDO9QfCGG';
Instalar o Roundcube
Faça o download do Roundcube.
wget https://github.com/roundcube/roundcubemail/releases/download/1.4.6/roundcubemail-1.4.6-complete.tar.gz
Extraia o seu conteúdo.
tar -xzf roundcubemail-1.4.6-complete.tar.gz
Mova para a pasta /var/www/roundcube.
mv roundcubemail-1.4.6 /var/www/roundcube
Mude o dono da pasta.
chown -R www-data: /var/www/roundcube
Instalar o composer, um gestor de dependências PHP.
apt install composer -y
Navegue até /var/www/roundcube.
cd /var/www/roundcube
Executar o composer para instalar as dependências em falta.
composer install --no-dev
Crie a base de dados para o Roundcube.
mysql -u root -p
CREATE DATABASE roundcube DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE USER roundcubeuser@localhost IDENTIFIED BY 'Passw0rd'; GRANT ALL PRIVILEGES ON roundcube.* TO roundcubeuser@localhost; FLUSH PRIVILEGES; EXIT;
Crie a estrutura da base de dados.
sudo mysql roundcube < /var/www/roundcube/SQL/mysql.initial.sql
Agora é preciso criar o config file do Nginx para o Roundcube, o processo é o mesmo que foi feito anteriormente.
Coloque o seguinte conteúdo no arquivo.
server {
listen 80;
root /var/www/roundcube/;
index index.html index.htm index.php;
server_name webmail.pedror.grsi;
error_log /var/log/nginx/roundcube.error;
access_log /var/log/nginx/roundcube.access;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /.well-known/acme-challenge {
allow all;
}
location ~ ^/(README|INSTALL|LICENSE|CHANGELOG|UPGRADING)$ {
deny all;
}
location ~ ^/(bin|SQL)/ {
deny all;
}
# A long browser cache lifetime can speed up repeat visits to your page
location ~* \.(jpg|jpeg|gif|png|webp|svg|woff|woff2|ttf|css|js|ico|xml)$ {
access_log off;
log_not_found off;
expires 360d;
}
}
Crie um link para a pasta sites-enabled e reinicie ou recarregue o serviço do Nginx.
Acesse a página de configuração através da seguinte URL.
http://webmail.pedror.grsi/installer

Aqui pode verificar vários parâmetros da instalação, depois de verificar tudo, clique em NEXT no final da página.

Aqui iremos fazer algumas alterações.
Em Database setup coloque o seguinte.
localhost roundcube roundcubeuser Passw0rd
Depois clique em CREATE CONFIG no final da página.
Já pode fechar essa página.
Agora será preciso editar o arquivo /var/www/roundcube/config/config.inc.php.
emacs /var/www/roundcube/config/config.inc.php
Faça as seguintes alterações.
$config['default_host'] = 'mail.pedror.grsi';
$config['smtp_server'] = 'tls://mail.pedror.grsi';
$config['smtp_port'] = 587;
# E colocar no final do arquivo
$config['smtp_conn_options'] = [
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
],
];
Depois disso remova a pasta installer que está em /var/www/roundcube.
Agora é preciso criar alguns domínios e caixas de correio através do PostfixAdmin.
Acesse o PostfixAdmin através do seguinte endereço.
http://admin.pedror.grsi/
E faça login com a conta de administrador que foi configurada anteriormente.

Para adicionar um novo domínio, clique em Domain List -> New Domain.

Configure o domínio como desejar e clique em Add Domain.
Adicione os domínios que deseje dessa maneira.
Para ver os domínios disponíveis clique em Domain List -> Domain List.

Acima podemos ver os domínios disponíveis.
Para adicionar caixas de correio clique em Virtual List -> Add Mailbox.

Escolha o username, e abaixo, no drop-down menu, o domínio disponível, configure como desejar e clique em Add Mailbox.
Repita os passos para o resto das caixas de correio.
E para ver as caixas de correio disponíveis em cada domínio, clique em Virtual List -> Virtual List.

Para ver as caixas de correio dos diferentes domínios, é só selecionas o que deseja ver através do drop-down menu na paste de cima da janela.
E com isso já é possível acessar os emails através do Roundcunbe no endereço http://webmail.pedror.grsi/.

Já podemos fazer testes de envio e recebimento.




E com isso temos um servidor de email funcional.