
W dzisiejszym świecie wysyła się całą masę wiadomości e-mail. Jeśli posiadamy hosting o dużej pojemności, to archiwum możemy przechowywać tam lub powiększać rozmiar skrzynek pocztowych, jak zaczyna brakować miejsca i w takim przypadku w ogóle nie archiwizować maili (ja tak robiłem 😆). Wyzwanie pojawi się, kiedy zajdzie potrzeba migracji do innego usługodawcy, który oferuje sztywne pojemności kont dla użytkowników. Osobiście stanąłem przed takim wyzwaniem i trzeba było wypracować rozwiązanie problemu zrzucenia nadmiaru maili.
W chwili pisania tego wpisu całość rozwiązania zwirtualizowałem na systemie Proxmox VE 7.3.
Przed przystąpieniem do konfiguracji w pierwszej kolejności aktualizuję system i pakiety do najnowszych dostępnych wersji.
sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y && sudo apt-get autoremove -y
Następnie instaluję sterowniki integracyjne do Proxmox`a. Jeśli korzystasz z innego wirtualizatora to musisz zainstalować odpowiednie dla niego sterowniki.
sudo apt-get install qemu-guest-agent -y
Kolejną rzeczą przygotowującą grunt jest rozszerzenie logicznego wolumenu LVM, aby wykorzystywał całą dostępną wolną przestrzeń - przed zmianą system wykorzystywał 98 GB, a po wykonaniu poniższych poleceń 490 GB.
sudo df -h
sudo lvm
lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
exit
sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
sudo df -h
Na koniec ustawiam SSH według swoich preferencji i otwieram odpowiednie porty na zaporze sieciowej systemu. Na routerze brzegowym na świat wystawiam tylko porty HTTP/80 oraz HTTPS/443, a dostęp do systemu po SSH będzie tylko i wyłącznie lokalnie lub po VPN`ie.
sudo nano /etc/ssh/sshd_config
sudo systemctl restart ssh
sudo ufw enable && sudo ufw allow ssh && sudo ufw status verbose
sudo touch /etc/apt/trusted.gpg.d/dovecot.gpg
sudo curl https://repo.dovecot.org/DOVECOT-REPO-GPG | gpg --import
sudo gpg --export ED409DA1 > /etc/apt/trusted.gpg.d/dovecot.gpg
sudo nano /etc/apt/sources.list.d/dovecot.list
deb https://repo.dovecot.org/ce-2.3-latest/ubuntu/focal focal main
sudo apt-get update && sudo apt-get install dovecot-core dovecot-imapd -y
sudo mkdir -p /var/mail/vhosts/grzegorzwita.it
sudo mkdir -p /var/mail/vhosts/grzegorzwita.pl
sudo addgroup -gid 5000 vmail
sudo adduser vmail -uid 5000 -ingroup vmail -home /var/mail/vhosts -disabled-password -disabled-login
sudo chown -R vmail:vmail /var/mail/vhosts
sudo nano /etc/dovecot/dovecot.conf
[...]
protocols = imap
listen = *
auth_verbose = yes
auth_verbose_passwords = sha1
auth_debug = yes
auth_debug_passwords = no
mail_debug = yes
verbose_ssl = yes
log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot-info.log
debug_log_path = /var/log/dovecot-debug.log
sudo nano /etc/dovecot/conf.d/10-mail.conf
[...]
#mail_location = mbox:~/mail:INBOX=/var/mail/%u
mail_location = maildir:/var/mail/vhosts/%d/%n:LAYOUT=fs:INBOX=/var/mail/vhosts/%d/%n/INBOX
[...]
sudo nano /etc/dovecot/conf.d/10-master.conf
[...]
inet_listener imaps {
#port = 993
#ssl = yes
}
[...]
zamieniam na:
[...]
inet_listener imaps {
port = 993
ssl = yes
}
[...]
sudo nano /etc/dovecot/conf.d/10-auth.conf
[...]
#disable_plaintext_auth = yes
[...]
zamieniam na:
[...]
disable_plaintext_auth = yes
[...]
[...]
auth_mechanisms = plain
[...]
zamieniam na:
[...]
auth_mechanisms = plain login
[...]
[...]
!include auth-system.conf.ext
[...]
zamieniam na:
[...]
#!include auth-system.conf.ext
[...]
[...]
#!include auth-passwdfile.conf.ext
[...]
zamieniam na:
[...]
!include auth-passwdfile.conf.ext
[...]
sudo nano /etc/dovecot/conf.d/auth-passwdfile.conf.ext
# Authentication for passwd-file users. Included from 10-auth.conf.
#
# passwd-like file with specified location.
# <doc/wiki/AuthDatabase.PasswdFile.txt>
passdb {
driver = passwd-file
args = scheme=CRYPT username_format=%u /etc/dovecot/users
}
userdb {
driver = passwd-file
args = username_format=%u /etc/dovecot/users
# Default fields that can be overridden by passwd-file
#default_fields = quota_rule=*:storage=1G
# Override fields from passwd-file
#override_fields = home=/home/virtual/%u
}
zamieniam na:
# Authentication for passwd-file users. Included from 10-auth.conf.
#
# passwd-like file with specified location.
# <doc/wiki/AuthDatabase.PasswdFile.txt>
#
#passdb {
# driver = passwd-file
# args = scheme=CRYPT username_format=%u /etc/dovecot/users
#}
#
#userdb {
# driver = passwd-file
# args = username_format=%u /etc/dovecot/users
#
# Default fields that can be overridden by passwd-file
#default_fields = quota_rule=*:storage=1G
#
# Override fields from passwd-file
#override_fields = home=/home/virtual/%u
#}
passdb {
driver = passwd-file
args = scheme=SHA512-CRYPT username_format=%u /var/mail/passwd
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}
sudo nano /etc/dovecot/conf.d/10-ssl.conf
[...]
ssl = no
[...]
zamieniam na:
[...]
ssl = required
[...]
[...]
#ssl_cert = </etc/dovecot/dovecot.pem
#ssl_key = </etc/dovecot/private/dovecot.pem
[...]
zamieniam na:
[...]
ssl_cert = </etc/letsencrypt/live/archiwum.grzegorzwita.it/fullchain.pem
ssl_key = </etc/letsencrypt/live/archiwum.grzegorzwita.it/privkey.pem
[...]
sudo touch /var/mail/passwd
sudo chown vmail:vmail /var/mail/passwd
sudo doveadm pw -s SHA512-CRYPT -u grzegorz_wita@grzegorzwita.it -p "Sup3r_T@jnE-Ha$L0" >> /var/mail/passwd
sudo nano /var/mail/passwd
W pliku będzie zapisane zasolone hasło.
{SHA512-CRYPT}$6$uy/OJOtIKOBVejYn$Dii.ZDWL642sk0POP1186lZ/VKe/OvQ/LsnuSvj0KrBgLi.L3bzNe6HWGkIkv0GsSIRjabO1Jc8S7ICeKLJ9c/
Dopisuję na początku adres email, którego dotyczy ten hash, z dwukropkiem.
grzegorz_wita@grzegorzwita.it:{SHA512-CRYPT}$6$uy/OJOtIKOBVejYn$Dii.ZDWL642sk0POP1186lZ/VKe/OvQ/LsnuSvj0KrBgLi.L3bzNe6HWGkIkv0GsSIRjabO1Jc8S7ICeKLJ9c/
Generuję tyle hash`y ile kont potrzebuję dodać.
sudo ufw allow 993
sudo systemctl enable dovecot.service
sudo systemctl start dovecot.service
sudo systemctl status dovecot.service
sudo apt-get install php7.4 php-imagick php7.4-{gd,common,json,imap,xml,opcache,mbstring,curl,zip,bz2,intl,mysql,ldap} -y
sudo nano /etc/php/7.4/apache2/php.ini
[...]
;date.timezone =
[...]
zamieniam na:
[...]
date.timezone = Europe/Warsaw
[...]
sudo ufw allow in "Apache Full"
sudo nano /etc/apache2/sites-available/roundcube.conf
<VirtualHost *:80>
ServerName archiwum.grzegorzwita.it
ServerAdmin admin@grzegorzwita.it
</VirtualHost>
<VirtualHost *:443>
Protocols h2 http/1.1
ServerName archiwum.grzegorzwita.it
ServerAdmin admin@grzegorzwita.it
DocumentRoot /var/www/roundcube
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /var/www/roundcube/>
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
sudo a2ensite roundcube && sudo a2dissite 000-default
sudo a2enmod rewrite headers
sudo systemctl restart apache2
sudo apt-get install certbot python3-certbot-apache -y
sudo certbot --apache
sudo systemctl status certbot.timer
sudo certbot renew --dry-run
sudo nano /etc/apache2/sites-available/roundcube.conf
<VirtualHost *:80>
RewriteEngine on
RewriteCond %{SERVER_NAME} =archiwum.grzegorzwita.it
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<VirtualHost *:443>
Protocols h2 http/1.1
ServerName archiwum.grzegorzwita.it
ServerAdmin admin@grzegorzwita.it
DocumentRoot /var/www/roundcube
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /var/www/roundcube/>
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLCertificateFile /etc/letsencrypt/live/archiwum.grzegorzwita.it/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/archiwum.grzegorzwita.it/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
sudo nano /etc/apache2/apache2.conf
[...]
ServerName localhost
sudo systemctl restart apache2
sudo apt-get install mysql-server -y
sudo mysql_secure_installation
W chwili pisania tego posta podczas przeklikiwania w/w skryptu w momencie ustawiania nowego hasła dla konta root natrafiłem na poniższy błąd, który uniemożliwił mi ustawienie hasła ani nawet wyjście ze skryptu klawiszami Ctrl
+C
. Poniżej zostawiam rozwiązanie na wypadek jakbyś też na niego natrafił(a).
... Failed! Error: SET PASSWORD has no significance for user ‘root’@’localhost’ as the authentication method used doesn’t store authentication data in the MySQL server. Please consider using ALTER USER instead if you want to change authentication parameters.
Zrestartowałem maszynę wirtualną, a następnie wykonałem poniższe polecenia (rzecz jasna z poziomu konta root):
sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'DoC3l0we_H@$L0';
exit
sudo mysql_secure_installation
sudo mysql -u root -p
auth_socket
.
ALTER USER 'root'@'localhost' IDENTIFIED WITH auth_socket;
sudo mysql -u root -p
CREATE DATABASE roundcube DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER 'roundcube'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'Sk0mp1ikow4N3_Ha$LO';
GRANT ALL ON roundcube.* TO 'roundcube'@'localhost';
FLUSH PRIVILEGES;
exit
sudo mysql -u roundcube -p
SHOW DATABASES;
exit
sudo wget https://github.com/roundcube/roundcubemail/releases/download/1.5.3/roundcubemail-1.5.3-complete.tar.gz
sudo tar xvf roundcubemail-1.5.3-complete.tar.gz
sudo mkdir /var/www/roundcube
sudo mv roundcubemail-1.5.3/* /var/www/roundcube
sudo chown www-data:www-data -R /var/www/roundcube
mysql -u roundcube -p roundcube < /var/www/roundcube/SQL/mysql.initial.sql
archiwum.grzegorzwita.it/installer
(oczywiście u ciebie adres będzie inny) w celu dokończenia konfigurowania programu. W pierwszym kroku system sprawdza czy mam zainstalowane i skonfigurowane wymagane komponenty.
NEXT
i przechodzę do drugiego kroku, gdzie usuwam nazwę produktu z pola product_name
(jeśli chcesz, to możesz wpisać swoją nazwę), wprowadzam dane dostępowe do bazy danych, w sekcji IMAP Settings
zmieniam wartość pola default_host
z localhost
na SSL://archiwum.grzegorzwita.it
oraz default_port
z 143
na 993
. Resztę opcji zostawiam w ich wartoścach domyślnych i na koniec klikam przycisk CREATE CONFIG
.
CONTINUE
, aby przejść do ostatniego etapu.
sudo nano /etc/apache2/sites-available/roundcube.conf
<VirtualHost *:80>
RewriteEngine on
RewriteCond %{SERVER_NAME} =archiwum.viavac.pl
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<VirtualHost *:443>
Protocols h2 http/1.1
ServerName archiwum.viavac.pl
ServerAdmin it@viavac.pl
DocumentRoot /var/www/roundcube
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /var/www/roundcube/>
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
<LocationMatch "^/(INSTALL|installer|UPGRADING)$">
deny from all
</LocationMatch>
<LocationMatch "^/(config|temp|logs)/">
deny from all
</LocationMatch>
<LocationMatch "/\.">
deny from all
</LocationMatch>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLCertificateFile /etc/letsencrypt/live/archiwum.viavac.pl/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/archiwum.viavac.pl/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
sudo apache2ctl configtest
sudo systemctl restart apache2
sudo apt-get install isync -y
sudo nano /var/mail/archiwizacja
IMAPAccount home
Host nazwa.serwera.pl
User "grzegorz_wita@grzegorzwita.it"
Pass "Sk0mp1ikow4N3_Ha$LO"
AuthMechs LOGIN
SSLType IMAPS
IMAPStore home-remote
Account home
MaildirStore home-local
Path /var/mail/vhosts/grzegorzwita.it/grzegorz_wita/
Inbox /var/mail/vhosts/grzegorzwita.it/grzegorz_wita/INBOX/
SubFolders Verbatim
CopyArrivalDate yes
Create Slave
Expunge none
Remove none
Sync PullNew
SyncState *
Channel home-inbox
Master :home-remote:
Slave :home-local:
Patterns *
Group home
Channel home-inbox
sudo su – vmail –c "mbsync -a –c /var/mail/archiwizacja -V"
W efekcie każda linia Opening master box
wyświetla mi dokładną nazwę katalogu po stronie usługodawcy.
vmail
archiwizację skrzynki pocztowej.
sudo nano /var/mail/archiwizacja
IMAPAccount home
Host nazwa.serwera.pl
User "grzegorz_wita@grzegorzwita.it"
Pass "Sk0mp1ikow4N3_Ha$LO"
AuthMechs LOGIN
SSLType IMAPS
IMAPStore home-remote
Account home
MaildirStore home-local
Path /var/mail/vhosts/grzegorzwita.it/grzegorz_wita/
Inbox /var/mail/vhosts/grzegorzwita.it/grzegorz_wita/INBOX/
SubFolders Verbatim
CopyArrivalDate yes
Create Slave
Expunge none
Remove none
Sync Pull
SyncState *
Channel home-inbox
Master :home-remote:INBOX
Slave :home-local:INBOX
Patterns *
Channel home-sent
Master :home-remote:SENT
Slave :home-local:Sent
Patterns *
Channel home-drafts
Master :home-remote:DRAFTS
Slave :home-local:Drafts
Patterns *
Channel home-spam
Master :home-remote:SPAM
Slave :home-local:Junk
Patterns *
Channel home-trash
Master :home-remote:TRASH
Slave :home-local:Trash
Patterns *
Group home
Channel home-inbox
Channel home-sent
Channel home-drafts
Channel home-spam
Channel home-trash
sudo su - vmail -c "mbsync -a -c /var/mail/archiwizacja -V"
Jeśli w/w plik uruchomię na pustej skrzynce pocztowej o otrzymam w efekcie taki sam wynik jak w przypadku konfiguracji z pkt. 2. Natomiast jeśli będzie na odwrót, to mbsync utworzy odpowiednie foldery i pobierze do nich wiadomości.
archiwizacja
. Mógłbym przygotować dla każdej skrzynki osobny plik i ustawić crona, aby automatycznie raz na 6 - 12 miesięcy wykonywana była archiwizacja, jednak w moim przypadku nie było to potrzebne.
Odebrane
więc w lewym górym rogu ekranu klikam w ⋮
i z menu, które pojawi się na ekranie wybieram Zarządzaj folderami
.
Następnie "włączam" poszczególne foldery.
Z menu po lewej stronie klikam w Poczta
, aby wrócić do głównego widoku i na liście folderów widzę wszystkie aktywowane foldery.
Opcje
, na ekranie pojawi się okno Opcje listy
, w którym przechodzę do Porządek sortowania
i z listy wybieram Data odbioru
.
Po zatwierdzeniu zmian, wiadomości zostaną posortowane od najnowszych do najstarszych.
sudo find /var/mail/vhosts -type d -name "cur" -printf "%P\n" -exec chmod 2500 {} \;