Menu
Уходим из office365. Почтовый сервер на Postfix+Dovecot + LDAP

Уходим из office365. Почтовый сервер на Postfix+Dovecot + LDAP

Создание почтового сервера, максимально соответствующего функционалу office365 для организации с интеграцией в Active Directory, и с последующей миграцией из облака Microsoft, для тех, кто там побывал.

Конечно, протокол MAPI невозможно заменить "один к одному", поэтому строятся максимальные аналоги работы

Реализация

Debian почтовый сервер  postfix с хранением в IMAP через DOVECOT, с авторизацией в AD по параметру mail, возможностью сортировки писем на сервере, веб-клиентом почты, календарей, контактов и конференций  в nextcloud.

Состав:

  • postfux - MTA (LDAP) 
  • dovecot - IMAP (LDAP)
  • amavis + clamav + spamassasin
  • nextcloud с модулями

*SnappyMail  - webmail

*AppOrder - показ приложений

*Calendar - caldav

*Contacts - carddaw

*LDAP user and group backend

*Talk - конференции

и тд (рекомендованные)

 Сеть:

- открытые входящие порты

*80 443 - www

*22 - ssh

*3478 - stun

*25 465 993 - mail

*4190 - sieve

*10050 10051 - zabbix

- смонтировано NFS шара хранилища, async mode, 12 theads (синхронный режим NFS нагружает систему и замедляет работу с imap)

/etc/fstab:

 192.168.0.20:/c/vmail /home/vmail nfs defaults 0 0

, где 192.168.0.20 - адрес NFS хранилища

mail.domain.ru - почтовый сервер для настройки 

ad.domain.local - контроллер домена AD 

 Установка:

apt-get install postfix dovecot-imapd dovecot-pop3d mailutils postfix-ldap dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-ldap dovecot-sieve dovecot-managesieved

Директория хранения - /home/vmail

sudo groupadd -g 5000 vmail
sudo useradd -g vmail -u 5000 vmail -d /home/vmail -m
chown vmail:vmail /home/vmail

Конфигурация Postfix

/etc/postfix/main.cf - основной файл конфигурации

readme_directory = /usr/share/doc/postfix/README_FILES
html_directory = /usr/share/doc/postfix/html
setgid_group = postdrop
command_directory = /usr/sbin
manpage_directory = /usr/share/man
#daemon_directory = /usr/lib/postfix
data_directory = /var/lib/postfix
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
queue_directory = /var/spool/postfix
mail_owner = postfix

#inet_protocols = all
inet_protocols = ipv4
mynetworks_style = host
smtpd_banner = mail2
unknown_local_recipient_reject_code = 550

myhostname = mail.domain.ru
alias_maps = hash:/etc/aliases
virtual_alias_maps = hash:/etc/postfix/virtual
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination =
relayhost =
mynetworks = /etc/postfix/mynetworks
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
#message size to 25Mb
message_size_limit = 26000000
# CC in one message -7
smtpd_recipient_limit = 30

smtpd_delay_reject = no
strict_rfc821_envelopes = yes
address_verify_sender = adm@domain.ru
header_checks = regexp:/etc/postfix/header_checks


virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
transport_maps = hash:/etc/postfix/transport
virtual_mailbox_domains = domain.ru, domain2.ru, domain.com
virtual_mailbox_base = /home/vmail/%n
#virtual_mailbox_maps = hash:/etc/postfix/vmaps
virtual_mailbox_maps = ldap:/etc/postfix/ldap_mailbox_maps.cf

#dovecot/users
virtual_minimum_uid = 5000
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

maps_rbl_reject_code = 554
disable_vrfy_command = yes

# фильтры
content_filter = scan:[127.0.0.1]:10024

#SASL options
smtpd_sasl_auth_enable = yes
#smtpd_sasl_exceptions_networks = $mynetworks
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

# enable TLS
smtp_use_tls = yes
smtpd_use_tls = yes
#smtpd_tls_auth_only = yes
smtpd_helo_required = yes
smtpd_tls_cert_file = /etc/ssl/private/full.crt
smtpd_tls_key_file = /etc/ssl/private/domain.ru.key

#smtpd_sasl_path = /var/run/dovecot/auth-client
# пассивная защита от спама

# проверка клиентского соединения smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated,
#фильтр по IP check_client_access cidr:/etc/postfix/rbl_override, reject_rbl_client virbl.dnsbl.bit.nl, reject_rbl_client dynablock.wirehub.net, reject_rbl_client blackholes.wirehub.net, reject_rbl_client dialups.mail-abuse.org, reject_rbl_client blackholes.mail-abuse.org, reject_rbl_client dialups.mail-abuse.org, reject_rbl_client dul.dnsbl.sorbs.net, reject_rhsbl_client sbl.spamhaus.org, reject_rhsbl_client dnsbl.sorbs.net, # Отвергает запрос, когда клиент отправляет команды SMTP раньше времени, еще не зная, поддерживает ли Postfix конвейерную обработку команд ESMTP reject_unauth_pipelining, # Блокируем клиентов с адресами from, домены которых не имеют A/MX записей reject_unknown_address, # проверка PTR многие забили на PTR # reject_unknown_client_hostname, permit # проверка контекста команды HELO smtpd_helo_restrictions = reject_invalid_hostname, permit_mynetworks, permit_sasl_authenticated, check_helo_access hash:/etc/postfix/helo_access,
# # проварка по регулярным (IP и др) check_helo_access regexp:/etc/postfix/helo_regexp, # Правила для блокировки различных динамических ip. check_client_access regexp:/etc/postfix/_block_dsl, reject_non_fqdn_hostname, reject_invalid_helo_hostname, reject_unknown_helo_hostname, permit # прроверка MAIL FROM smtpd_sender_restrictions = permit_mynetworks, permit_sasl_authenticated, check_sender_access hash:/etc/postfix/sender_access, # возможны пробоемы (следующие 2) reject_unknown_sender_domain, reject_non_fqdn_sender, reject_sender_login_mismatch, check_client_access cidr:/etc/postfix/rbl_override, reject_rhsbl_sender dsn.rfc-ignorant.org # Запрет отправки писем, когда адрес MAIL FROM не совпадает с логином пользователя #reject_authenticated_sender_login_mismatch, # Отклоняем письма от несуществующих доменов reject_unknown_sender_domain, # Отклоняем письма от доменов в не FQDN формате reject_non_fqdn_sender, # Отклонение писем с несуществующим адресом отправителя reject_unlisted_sender, reject_unauth_destination, # Отклонять сообщения от отправителей, ящики которых не существуют, использовать аккуратно #reject_unverified_sender, # Список приватных сетей, которые не могут быть использованы в качестве IP для MX записей check_sender_mx_access cidr:/etc/postfix/_mx_access, # Правила для блокировки различных динамических ip. check_client_access regexp:/etc/postfix/_block_dsl, permit # проверка RCPT TO smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination, permit # проверка RCPT TO после пересылки smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unauth_destination, # spf check - требуется установка # check_policy_service unix:private/policy-spf, reject_unauth_pipelining, reject_unknown_sender_domain, # Отклонение писем с несуществующим адресом получателя reject_unlisted_recipient, # Отклоняет сообщения на несуществующие домены reject_unknown_recipient_domain, # Отклоняет сообщения если получатель не в формате FQDN reject_non_fqdn_recipient, # Отклоняем прием от отправителя с пустым адресом письма, предназначенным нескольким получателям. reject_multi_recipient_bounce, permit # проверка при передаче DATA smtpd_data_restrictions = permit # проверка при передаче END-OF-DATA smtpd_end_of_data_restrictions = permit

/etc/postfix/ldap_mailbox_maps.cf - конфиг работы с AD

server_host = ad.domain.local
server_port     = 389
version         = 3
search_base = dc=domain,dc=local
query_filter = (&(objectClass=user)(mail=%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
result_attribute = mail
scope = sub
#bind = yes
bind_dn = userad@domain.local
bind_pw = password123
debuglevel      = 0r

master.cf - существенные изменения

# для связки с dovecot
submission   inet  n  -  n  -  -  smtpd
-o smtpd_tls_security_level=may
-o smtpd_sasl_auth_enable=yes
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=/var/spool/postfix/private/auth
-o smtpd_sasl_security_options=noanonymous
-o smtpd_sasl_local_domain=$myhostname

smtps   inet  n  -  n  -  -  smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject

dovecot   unix  -  n  n  -  -  pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}

# для связки с amavis
scan   unix  -  -  n  -  16  smtp
-o smtp_send_xforward_command=yes
-o smtp_enforce_tls=no

127.0.0.1:10025   inet  n  -  n  -  16  smtpd
-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o smtpd_authorized_xforward_hosts=127.0.0.0/8:


Карты

/etc/postfix/_block_dsl - блокировка всяческих DSL 

/^mail\.mydomain\.ru$/ Reject That's my hostname, use your own
/^mail2\.mydomain\.ru$/ Reject That's my hostname, use your own
#/^[0-9.]+$/                          Reject Your client not RFC 2821 compilant
#/([0-9]){1,3}\.([0-9]){1,3}\.([0-9]){1,3}\.([0-9]){1,3}/ 553 SPAM-raw-ip-in-helo
#/(^|[0-9.-])([axv]dsl|isadsl|as|bgp|dynamicIP|broadband|cable|[ck]lient|dhcp|dial|dialin|dialup|dialer|dip|dsl|dslam|dup|dyn|dynamic|host|ip|isdn|modem|nas|node|pool|ppp|pppo[ae]|sirius.*ukrtel.*|user|users|vpn)[0-9.-]/i 553 SPAM_DYNAMIC-in-helo
/\.lan$/i                                       533 SPAM-lan-in-helo
/^dsl.*\..*\..*/i                               553 AUTO_DSL spam
/dsl.*\..*\..*/i                                553 AUTO_DSL1 spam
/[ax]dsl.*\..*\..*/i                            553 AUTO_XDSL spam
/client.*\..*\..*/i                             553 AUTO_CLIENT spam
/cable.*\..*\..*/i                              553 AUTO_CABLE spam
/pool.*\..*\..*/i                               553 AUTO_POOL spam
/dial.*\..*\..*/i                               553 AUTO_DIAL spam
#/ppp.*\..*\..*/i                                553 AUTO_PPP spam
/dslam.*\..*\..*/i                              553 AUTO_DSLAM spam
/node.*\..*\..*/i                               553 AUTO_NODE spam
#/([0-9]*-){3}[0-9]*(\..*){2,}/i                 553 SPAM_ip-add-rr-ess_networks
#/([0-9]*\.){4}(.*\.){3,}.*/i                    553 SPAM_ip-add-rr-ess_networks
/.*\.pppool\..*/i                               553 SPAM_POOL
/[0-9]*-[0-9]*-[0-9]*-[0-9]*-tami\.tami\.pl/i   553 SPAM_POOL
/pool-[0-9]*-[0-9]*-[0-9]*-[0-9]*\..*/i         553 SPAM_POOL
/.*-[0-9]*-[0-9]*-[0-9]*-[0-9]*\.gtel.net.mx/i  553 SPAM_POOL
/dhcp.*\..*\..*/i                               553 SPAM_DHCP

/etc/postfix/_mx_access  - блокировка по IP

127.0.0.1      DUNNO
127.0.0.2      550 Domains not registered properly
0.0.0.0/8      REJECT Domain MX in broadcast network
10.0.0.0/8     REJECT Domain MX in RFC 1918 private network
127.0.0.0/8    REJECT Domain MX in loopback network
169.254.0.0/16 REJECT Domain MX in link local network
172.16.0.0/12  REJECT Domain MX in RFC 1918 private network
192.0.2.0/24   REJECT Domain MX in TEST-NET network
192.168.0.0/16 REJECT Domain MX in RFC 1918 private network
224.0.0.0/4    REJECT Domain MX in class D multicast network
240.0.0.0/5    REJECT Domain MX in class E reserved network
248.0.0.0/5    REJECT Domain MX in reserved network

/etc/postfix/mynetworks - доверенные сети 

127.0.0.0/8
172.16.0.0/16
192.168.0.0/24
104.47.0.0/16

, последняя - microsoft, для настройки транспорта с облака "Exchange admin center/mailflow/connectors"

в случае, если office365 прописан в mx - записи домена

/etc/postfix/transport - карта транспорта 

#user1@domain.ru  smtp:[domain-ru.mail.protection.outlook.com]:25
user2@domain.ru  smtp:[domain-ru.mail.protection.outlook.com]:25
user3@domain.ru  smtp:[domain-ru.mail.protection.outlook.com]:25

, где user1 уже перемещен, а почта остальных всё еще уходит в облако

/etc/postfix/header_checks - для логирования тем

/^Subject:/     WARN

#/etc/postfix/helo_access  доверенные по HELO

mydomain.ru       OK
x-domain.com OK

#/etc/postfix/helo_regexp  регулярки HELO

/([0-9]{1,3}(\.|-)){3}[0-9]{1,3}/i      REJECT IP-able helo SPAM
/^mail\.mydomain\.ru$/ REJECT That's my hostname, use your own
/(^\w+$)/i                             REJECT SPAM_bad_helo

#/etc/postfix/rbl_override  доверенные rbl

1.1.1.1 OK
otherMyIp OK
198.2.129.162 REJECT You IP are blacklisted!

#/etc/postfix/sender_access  доверенные отправители

mydomain.ru  REJECT Relay from gardaricafm.ru are denied
a@some-domain.ru REJECT You e-mail are blacklisted!r

#/etc/postfix/virtual виртуальные ящики (aliases не работают в мультидоменной конфигурации корректно)

adm@domain.ru user1@domain.ru user2@domain.ru user3@domain.ru
all@domain.ru user1@domain.ru user2@domain.ru user3@domain.ru
и тд..

№/etc/postfix/apply-changes.sh применение изменений всех карт

postmap transport virtual sender_access rbl_override helo_access _block_dsl _mx_access header_checks
/etc/init.d/postfix reloadr

Dovecot 

#/etc/dovecot/dovecot-ldap.conf.ext  конфигурация в ldap

hosts = ad.domain.local:389
ldap_version     = 3
auth_bind        = yes
dn = userad@domain.local
dnpass = password123
base = dc=domain,dc=local
scope            = subtree
deref            = never

user_attrs = homeDirectory=/home/vmail/%d/%n,uid=5000,gid=5000
user_filter = (&(objectClass=user)(mail=%u)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
pass_filter = (&(objectClass=user)(mail=%u)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))


#/etc/dovecot/conf.d/10-mail.conf:  отредактировать

auth_username_format = %Lu
auth_mechanisms = plain login digest-md5 cram-md5
disable_plaintext_auth = no
mail_location = maildir:/home/vmail/%d/%n
!include auth-ldap.conf.ext

#/etc/dovecot/10-mail.conf:  отредактировать

mail_location = maildir:/home/vmail/%d/%n
mail_home = /var/vmail/%d/%n/sieve
mail_uid = vmail
mail_gid = vmail

#/etc/dovecot/10-master.conf:  отредактировать

service auth {
unix_listener auth-userdb {
  mode = 0600
  user = vmail
  group = vmail
}
unix_listener /var/spool/postfix/private/auth {
  mode = 0660
  user = postfix
  group = postfix
}
}

service stats {
  unix_listener stats-reader {
      user = vmail
      group = vmail
      mode = 0660
  }
  unix_listener stats-writer {
      user = vmail
      group = vmail
      mode = 0660
  }


#/etc/dovecot/10-ssl.conf

ssl = yes
ssl_cert = </etc/ssl/private/full.crt
ssl_key = </etc/ssl/private/domian.ru.key

#/etc/dovecot/conf.d/15-lda.conf

protocol lda {
mail_plugins = $mail_plugins sieve
}

#/etc/dovecot/15-mailboxes.conf

namespace inbox {
mailbox Drafts {
  special_use = \Drafts
}
mailbox Junk {
  special_use = \Junk
}
mailbox Trash {
  special_use = \Trash
}
mailbox Черновики {
  auto = subscribe
  special_use = \Drafts
}
mailbox Спам {
  auto = subscribe
  special_use = \Junk
}
mailbox Spam {
  auto = no
  special_use = \Junk
}
mailbox "Junk E-mail" {
  auto = no
  special_use = \Junk
}
mailbox "Deleted Messages" {
  auto = no
  special_use = \Trash
}
mailbox Отправленные {
  auto = subscribe
  special_use = \Sent
}
mailbox Удаленные {
  auto = subscribe
  special_use = \Trash
}
mailbox Sent {
  special_use = \Sent
}
mailbox "Sent Messages" {
  special_use = \Sent
}
mailbox Sent {
  auto = no
  special_use = \Sent
}
mailbox "Sent Messages" {
  auto = no
  special_use = \Sent
}
mailbox "Sent Items" {
  auto = no
  special_use = \Sent
}
}

#/etc/dovecot/20-managesieve.conf:    отредактировать

protocols = $protocols sieve
...
service managesieve-login {
inet_listener sieve {
  port = 4190
}
...

#/etc/dovecot/90-sieve.conf:   отредактировать

...
plugin {
...
sieve = /home/vmail/%d/%n/sieve/dovecot.sieve
sieve_global_path = /etc/dovecot/sieve/default.sieve
sieve_dir = /home/vmail/%d/%n/sieve
sieve_global_dir = /etc/dovecot/sieve/global/
...

Донастройка Sieve:

#mkdir -p /etc/dovecot/sieve/global
#chown dovecot:dovecot -R /etc/dovecot/sieve

AMAVIS + clamav + spamassassin

Установка

apt-get install amavisd-new clamav clamav-daemon spamassassin
usermod -a -G amavis clamav

/etc/amavis/conf.d/05-domain_id - внести свои домены

@local_domains_acl = ( "mydomain.ru", "mydomain2.ru" );

/etc/amavis/conf.d/20-debian_defaults

...

$sa_spam_modifies_subj = 1;

$sa_spam_subject_tag = '***SPAM*** ';

..

/etc/amavis/conf.d/15-content_filter_mode   отредактировать

...
@bypass_virus_checks_maps = (
 \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
...
@bypass_spam_checks_maps = (
 \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
...

/etc/amavis/conf.d/20-debian_defaults отредактировать 

qr'.\.(exe|xz|vbs|pif|scr|bat|cmd|com|cpl)$'i, # banned extension - basic

/etc/amavis/conf.d/50-user   добавить

$allowed_header_tests{'multiple'} = 0;
$allowed_header_tests{'missing'} = 0;
$spam_quarantine_to = "spam\@domain.ru";
$virus_quarantine_to = "virus\@domain.ru";

systemctl enable clamav-daemon amavis

Обновить clamav можно вручную, разместив скачанные каким либо с адресов

https://database.clamav.net/main.cvd
https://database.clamav.net/daily.cvd
https://database.clamav.net/bytecode.cvd
https://packages.microsoft.com/clamav/

файлы в /var/lib/clamav

Обновить спам базы

sa-update --nogpg --verbose

Обучение:

# обучение спаму
#sa-learn --spam /home/vmail/_spam
# обучение ошибочных определений спама
#sa-learn --ham /home/vmail/_am
# статистика
#sa-learn --dump magic

Postfix/SPF 

Sender Policy Framework (SPF) -  это технология защиты электронной почты от подделки, которая позволяет владельцам доменов перечислять в службе доменных имен (DNS) авторизованные источники почты из своих доменов. Это позволяет получателям почты отклонять почту, которая поступает из неавторизованных источников

sudo apt-get install postfix-policyd-spf-python
или для перл
sudo apt-get install postfix-policyd-spf-perl

/etc/postfix/main.cf добавить

policy-spf_time_limit = 3600s

/etc/postfix/master.cf

policy-spf  unix  -       n       n       -       0       spawn
   user=nobody argv=/usr/bin/policyd-spf /etc/postfix-policyd-spf-python/policyd-spf.conf
или для перл
policy-spf  unix  -       n       n       -       -       spawn
   user=nobody argv=/usr/sbin/postfix-policyd-spf-perl

/etc/postfix/main.cf    

smtpd_recipient_restrictions =
   ...
   permit_sasl_authenticated
   permit_mynetworks
   reject_unauth_destination
   check_policy_service unix:private/policy-spf
   ...

/etc/postfix-policyd-spf-python/policyd-spf.conf

#  For a fully commented sample config file see policyd-spf.conf.commented
debugLevel = 2
TestOnly = 0
# 1- test

HELO_reject = SPF_Not_Pass
#SPF_Not_Pass
#Fail
Mail_From_reject = Fail

PermError_reject = False
TempError_Defer = False
skip_addresses = 127.0.0.0/8,::ffff:127.0.0.0/104,::1
Domain_Whitelist =x-domain.ru,mail.rur

Логирование 

mkdir /var/log/mail

Помечаются логи от dovecot /etc/dovecot/conf.d/10-logging.conf

syslog_facility = local5

/etc/rsyslog.conf отредактировать

mail.info                       -/var/log/mail/mail.info
mail.warn                       -/var/log/mail/mail.warn
mail.err                        /var/log/mail/mail.err
local5.*        -/var/log/mail/dovecot.log
local5.warning;local5.error;local5.crit -/var/log/mail/dovecot-errors.log

/etc/logrotate.d/mail

su root adm
/var/log/mail/mail.info /var/log/mail/mail.warn /var/log/mail/mail.err /var/log/mail/*.log {
      rotate 30
      daily
      missingok
      notifempty
      compress
      delaycompress
      sharedscripts
    postrotate
        systemctl restart rsyslog
        systemctl restart dovecot
        systemctl restart postfix
    endscript
}

Перезапуск:

# systemctl restart logrotate && systemctl restart rsyslog
# systemctl restart amavis && systemctl restart dovecot && systemctl restart postfix

Тестирование:

Проверка открытых портов
#netstat -tpln
Проверка postmap (в зависимости от таблицы)
#postmap -vq user@domain.ru ldap:/etc/postfix/ldap_mailbox_maps.cf
или
#postmap -q 122.187.227.167 cidr:/etc/postfix/rbl_override
Отправка SMTP
#echo "Test mail" | mail -s "Test mail" user@domain.ru
Проверка ldap
#ldapsearch -x -h ad.domain.ocal -D 'userad' -W -b 'cn=Users,dc=domain,dc=local'
Проверка IMAP
#openssl s_client -crlf -connect 127.0.0.1:993
#tag login user@domain.ru password123

NextCloud 

Установка

Для функционирования требуется стандартный LAMP (Linux, Apache, MySQL/MariaDB, PHP). с рекомендуемыми модулями, описанными в 

https://docs.nextcloud.com/

Настроить базу данных для nextcloud MySQL или SQLite

mysql -uroot -p
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT ALL PRIVILEGES on nextcloud.* to 'username'@'localhost';
FLUSH privileges;
quit;

Скачать со страницы загрузки nextcloud последнюю стабильную версию

https://download.nextcloud.com/server/releases/

Распаковать в root директорию веб-сервера

Применить права

#chown -R www-data:www-data /var/www/nextcloud/

Использовать веб или консольную установку

Обновление Nextcloud

Сделать бэкап  data/ и config/

Режим обслуживания и остановить apache

sudo -u www-data php occ maintenance:mode --on
/etc/init.d/apache2 stop
mv /var/www/nextcloud/ /var/www/_nextcloud/

Скачать и распаковать дистрибутив

wget https://download.nextcloud.com/server/releases/nextcloud-28.0.2.zip

или актуальную

unzip nextcloud-28.0.2.zip -d /var/www/

Перезаписать config/

chown -R www-data:www-data nextcloud
find nextcloud/ -type d -exec chmod 750 {} \;
find nextcloud/ -type f -exec chmod 640 {} \;

Запустить apache и обновление

/etc/init.d/apache2 start
sudo -u www-data php occ upgrade

При ключевых обновлениях может потребуется поправить индексы

$ sudo -u www-data php occ db:add-missing-columns
$ sudo -u www-data php occ db:add-missing-indices
$ sudo -u www-data php occ db:add-missing-primary-keys

Выход из режима обслуживания

sudo -u www-data php occ maintenance:mode --off

Настройка

Полезное в сonfig.php:

Вынести директорию /data в другое расположение

'datadirectory' => '/home/vcloud',

Указать доверенные домены функционирования

 'trusted_domains' =>
array (
  0 => 'mail.domain.ru',
  1 => 'mail.domain.com',
),

Приложения

Приложение user_external

Позволяет авторизоваться пользователям по определенному протоколу

https://github.com/nextcloud/user_external#readme

Например IMAP 

Прописать в config.php:

'user_backends' => array(
  array(
      'class' => '\OCA\UserExternal\IMAP',
      'arguments' => array( 
          '192.168.0.1', 993, 'ssl', 'domain.ru', false, false
      ),
  ),
),

Если используется LDAP - данное приложение не нужно

Приложение LDAP user and group backend

Позволяет добавлять пользователей домена

Настройка по ссылке https://$nextcloudserver/index.php/settings/admin/ldap 

Параметры:

Сервер:
Сервер ad.domain.local 389
user  password
dc=domain,dc=local
Пользователи:
(&(objectClass=user)(mail=*)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
Учетные данные:
(&(objectClass=user)(mail=%uid)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
Эксперт:
Атрибут для внутреннего имени: mail
Дополнительно:
Поле отображаемого имени пользователя  - name
База дерева пользователей - dc=domain,dc=local
Атрибуты поиска пользователей - mail
displayName - name
Поле адреса email - mail

apporder

Настраивает порядок приложений и первое открывающееся прописать в config.php:

'defaultapp' => 'apporder',

Контакты

общие контакты у всех пользователей

1. Создать пользовательскую группу, например company

2. Выгрузить всех пользователей и добавить их в группу

#!/bin/bash
sudo -u www-data php occ user:list | sed -r 's@ *- ([^:]*):.*@\1@' > /home/userlist
while read p; do
sudo -u www-data php occ group:adduser company $p
done </home/userlist

3. Установить приложение Auto Groups

4. "Параметры сервера" - > Дополнительные параметры -> Автогруппы - добавить company

5. В одном из пользователей или в администраторе создать адресную книгу, например company, и заполнить её данными

6. Расшарить эту адресную книгу на группу company

SnappyMail Webmail

Работает шустрее и гибче чем штатный mail

Управление

https://$nextcloudserve/index.php/apps/snappymail/?admin#

- в разделе домены добавить свой домен с настройками сервера приема/отправки/сортировки(sieve)

(желательно с localhost для быстроты)

Talk

Приложение конференций. 

Работает из коробки, но желательно настроить свои STUN / TURN сервера.

apt install coturn

/etc/turnserver.conf:

server-name=mail.domain.ru
use-auth-secret
static-auth-secret=<yourChosen/GeneratedSecret>
total-quota=0
bps-capacity=0
stale-nonce
realm=domain.ru
listening-port=3478
listening-ip=1.1.1.1
fingerprint
total-quota=100
bps-capacity=0
stale-nonce
no-multicast-peers
#no-stdout-log
log-file=/var/log/tun.log syslog simple-log

Операции с OCC

Удаление пользователя

# sudo -u www-data php occ user:delete user@domain.ru

Сброс пароля пользователя

# sudo -u www-data php user:resetpassword user

Клиенты

MS Office Outlook 

Авто-настройка

Согласно документации, при автоматической настройке, outlook опрашивает:

https://<SMTP-address-domain>/autodiscover/autodiscover.xml
https://autodiscover.<smtp-address-domain>/autodiscover/autodiscover.xml

Причем он делает это не методом GET, а методом POST.

Нужно создать скрипт autodicover.php:

<?php
//get raw POST data so we can extract the email address
$request = file_get_contents("php://input");
// optional debug log
# file_put_contents( 'request.log', $request, FILE_APPEND );
// retrieve email address from client request
preg_match( "/\<EMailAddress\>(.*?)\<\/EMailAddress\>/", $request, $email );
// check for invalid mail, to prevent XSS
if (filter_var($email[1], FILTER_VALIDATE_EMAIL) === false) {
  throw new Exception('Invalid E-Mail provided');
}

// get domain from email address
$domain = substr( strrchr( $email[1], "@" ), 1 );

// POP settings
$popServer = 'mail.' . $domain; // pop.example.com
$popPort   = 995;
$popSSL    = true;

// IMAP settings
$imapServer = 'mail.' . $domain; // imap.example.com
$imapPort   = 993;
$imapSSL    = true;

// SMTP settings
$smtpServer = 'mail.' . $domain; // smtp.example.com
$smtpPort   = 465;
$smtpSSL    = true;
//set Content-Type
header( 'Content-Type: application/xml' );
?>

<?php echo '<?xml version="1.0" encoding="utf-8" ?>'; ?>
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
  <Response xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
      <Account>
          <AccountType>email</AccountType>
          <Action>settings</Action>
          <Protocol>
              <Type>IMAP</Type>
              <Server><?php echo $imapServer; ?></Server>
              <Port><?php echo $imapPort; ?></Port>
              <DomainRequired>off</DomainRequired>
              <LoginName><?php echo $email[1]; ?></LoginName>
              <SPA>off</SPA>
              <SSL><?php echo $imapSSL ? 'on' : 'off'; ?></SSL>
              <AuthRequired>on</AuthRequired>
          </Protocol>
          <Protocol>
              <Type>POP3</Type>
              <Server><?php echo $popServer; ?></Server>
              <Port><?php echo $popPort; ?></Port>
              <LoginName><?php echo $email[1]; ?></LoginName>
              <DomainRequired>off</DomainRequired>
              <SPA>off</SPA>
              <SSL><?php echo $popSSL ? 'on' : 'off'; ?></SSL>
              <DomainRequired>off</DomainRequired>
          </Protocol>
          <Protocol>
              <Type>SMTP</Type>
              <Server><?php echo $smtpServer; ?></Server>
              <Port><?php echo $smtpPort; ?></Port>
              <DomainRequired>off</DomainRequired>
              <LoginName><?php echo $email[1]; ?></LoginName>
              <SPA>off</SPA>
              <SSL><?php echo $smtpSSL ? 'on' : 'off'; ?></SSL>
              <AuthRequired>on</AuthRequired>
              <UsePOPAuth>off</UsePOPAuth>
              <SMTPLast>off</SMTPLast>
          </Protocol>
      </Account>
  </Response>
</Autodiscover>

Разместить его в веб директории и создать 301 редирект

 правилами nginx

        location = /autodiscover/autodiscover.xml {

         return 301 $scheme://autodiscover.vzlot.ru/autodiscover/autodiscover.php;

        }

 или .htaccess для apache

Ссылка для онлайн для проверки

https://testconnectivity.microsoft.com/tests/Ola/input

Ручная настройка

выглядит так:

IMAP Сервер
mail.domain.ru
Логин - email
SSL Порт 993
SMTP Сервер
mail.domain.ru
Логин - email
SSL Порт465

OutlookCalDavSynchronizer

Надстройка для Outlook для синхронизации календарей и контактов для M$ OutLook

Создать профиль календаря:

CalDav адрес можно скопировать с персональной страницы календаря nextcloud

https://$nextcloudserver/remote.php/dav/calendars/$email/personal/

 username - email

 + Use pop3/IMAP accaumt passwordу

Создать профиль контактом

CardDav адрес можно скопировать с персональной страницы контактов nextcloud

https://nextcloudserver/remote.php/dav/addressbooks/users/$email/contacts/

 username - email

 + Use pop3/IMAP accaumt password

Можно подключить системную адресную книгу Nextcloud со всеми пользователями облака по адресу

https://$nextcloudserver/remote.php/dav/addressbooks/system/system/system/

 

Android OpenSync 

Клиент для Android для формирования и синхронизации CalDav/CardDav 

Настройка:

Адрес (системная адресная книга):

https://$nextcloudserver/remote.php/dav/addressbooks/system/system/system/

 username - email

 Остальные источники синхронизации подхватятся сами.

Решения проблем

Сообщение в dovecot-errors.log типа

Обычно в серверах с большим количеством пользователей
exceeded, disabling. Increase /proc/sys/fs/inotify/max_user_instances

В  /etc/sysctl.conf прописать 256 (может и более)

fs.inotify.max_user_instances=256
fs.inotify.max_user_watches=256

Применить

sysctl -p

Или просто
echo 2048 > /proc/sys/fs/inotify/max_user_watches

Imap-login: Warning: Auth process not responting... при большой нагрузке в dovecot

Постепенно тюнить в /etc/dovecot/10-master.conf параметры:

default_process_limit = 1500
default_client_limit = 4000
default_vsz_limit = 1024M

Перманентно пропадают пометки "отвечено"/"переслано" в Microsoft Outlook 2013/2016

Якобы происходит из-за надстроек.

Рекомендуется запустить в безопасном режиме (CTRL+R -> outlook.exe /safe), потом в обычно

Работа с очередью сообщений POSTFIX

#Показать
postqueue -p
#Отправить
postqueue -f
#Очистить
postsuper -d ALL

Добавление Subject (тем письма) в логи (для аналитики)

main.cf:

header_checks = regexp:/etc/postfix/header_checks

header_checks:

 /^Subject:/     WARN

Can't locate Mail/SpamAssassin/CompiledRegexps/body_neg2000.pm in @INC (you may need to install the Mail::SpamAssassin::CompiledRegexps::body_neg2000 module) 

Сообщение Spamassasin 

# Checking if the packages are installed

sudo apt install re2c sa-compile

# Update and compile the SpamAssassin Rules

sa-update

sa-compile

# Restart SpamAssassin service

systemctl restart spamassassin.service

# Check if the error is still present

tail -f /var/log/maillog

tail -f /var/log/mail.err

Мобильное приложение BLUEMAIL не видит персональный календарь, хотя удачно подключилось

(BlueMail can't synhromize with nextcloud CalDAV)

Прописан адрес DAV: https://[nextcloud-instance]/remote.php/dav/

Оно пытается к remote.php/dav/ добавить еще раз remote.php/dav/ -> remote.php/dav/remote.php/dav/

Для сервера на apache2 требуется добавить в конфигурацию virtualhost:

<IfModule mod_rewrite.c>
RewriteEngine on
...
RewriteRule "(.*)remote.php/dav/remote.php.dav(.*)" "$1remote.php/dav$2" [R=301,L]
</IfModule>

Включение PUSH уведомлений в Dovecot

Требуется для различных приложений, которые засыпают

15-lda.conf

protocol lda {
# Space separated list of plugins to load (default is global mail_plugins).
#mail_plugins = $mail_plugins
 mail_plugins = $mail_plugins sieve  notify push_notification
}

90-plugin.conf:

plugin {
#setting_name = value
# push_notification_driver = dlog
push_notification_driver  = ox:url=http://mynotifyserver/push.php
}

99-metadata.conf:

# Store METADATA information within user's Maildir directory 
mail_attribute_dict = file:/home/vmail/%d/%n/dovecot-attributes
protocol imap {
    imap_metadata = yes 
    }

Включить metadata для пользователя

doveadm mailbox metadata set -u UserName@example.com -s "" /private/vendor/vendor.dovecot/http-notify user=UserName@example.com

Lisolog / 2022