2022-10-17 08:40:09 +00:00
#!/bin/bash
2022-09-21 07:31:28 +00:00
2023-12-03 23:34:13 +00:00
# -eE :: exit on error (do this in functions as well)
# -u :: show (and exit) when using unset variables
2022-09-21 07:31:28 +00:00
# -o pipefail :: exit on error in pipes
set -eE -u -o pipefail
2023-12-03 23:34:13 +00:00
# shellcheck source=/dev/null
source /etc/os-release
2022-09-21 07:31:28 +00:00
# shellcheck source=../helpers/log.sh
source /usr/local/bin/helpers/log.sh
_log_level_is 'trace' && QUIET = '-y' || QUIET = '-qq'
2023-05-25 23:01:41 +00:00
function _pre_installation_steps( ) {
2022-09-21 07:31:28 +00:00
_log 'info' 'Starting package installation'
_log 'debug' 'Running pre-installation steps'
_log 'trace' 'Updating package signatures'
apt-get " ${ QUIET } " update
_log 'trace' 'Installing packages that are needed early'
2023-12-03 23:37:16 +00:00
# add packages usually required by apt to
# - not log unnecessary warnings
# - be able to add PPAs early (e.g., Rspamd)
local EARLY_PACKAGES = (
apt-utils # avoid useless warnings
apt-transport-https ca-certificates curl gnupg # required for adding PPAs
systemd-standalone-sysusers # avoid problems with SA / Amavis (https://github.com/docker-mailserver/docker-mailserver/pull/3403#pullrequestreview-1596689953)
)
apt-get " ${ QUIET } " install --no-install-recommends " ${ EARLY_PACKAGES [@] } " 2>/dev/null
2022-09-21 07:31:28 +00:00
2023-12-03 23:38:39 +00:00
_log 'trace' 'Adding Rspamd PPA'
curl -sSfL https://rspamd.com/apt-stable/gpg.key | gpg --dearmor >/etc/apt/trusted.gpg.d/rspamd.gpg
echo " deb [signed-by=/etc/apt/trusted.gpg.d/rspamd.gpg] http://rspamd.com/apt-stable/ ${ VERSION_CODENAME } main " >/etc/apt/sources.list.d/rspamd.list
_log 'trace' 'Updating package index after adding PPAs'
apt-get " ${ QUIET } " update
2022-09-21 07:31:28 +00:00
_log 'trace' 'Upgrading packages'
apt-get " ${ QUIET } " upgrade
}
2023-12-03 23:36:46 +00:00
function _install_utils( ) {
_log 'debug' 'Installing utils sourced from Github'
2024-01-15 09:49:49 +00:00
_log 'trace' 'Installing jaq'
curl -sL " https://github.com/01mf02/jaq/releases/latest/download/jaq-v1.2.0- $( uname -m) -unknown-linux-gnu " -o /usr/bin/jaq && chmod +x /usr/bin/jaq
_log 'trace' 'Installing swaks'
local SWAKS_VERSION = '20240103.0'
local SWAKS_RELEASE = " swaks- ${ SWAKS_VERSION } "
curl -sSfL " https://github.com/jetmore/swaks/releases/download/v ${ SWAKS_VERSION } / ${ SWAKS_RELEASE } .tar.gz " | tar -xz
mv " ${ SWAKS_RELEASE } /swaks " /usr/local/bin
rm -r " ${ SWAKS_RELEASE } "
2023-12-03 23:36:46 +00:00
}
2023-05-25 23:01:41 +00:00
function _install_postfix( ) {
2022-09-21 07:31:28 +00:00
_log 'debug' 'Installing Postfix'
2023-12-03 23:40:21 +00:00
_log 'warn' 'Applying workaround for Postfix bug (see https://github.com/docker-mailserver/docker-mailserver/issues/2023#issuecomment-855326403)'
2022-09-21 07:31:28 +00:00
# Debians postfix package has a post-install script that expects a valid FQDN hostname to work:
mv /bin/hostname /bin/hostname.bak
echo "echo 'docker-mailserver.invalid'" >/bin/hostname
chmod +x /bin/hostname
apt-get " ${ QUIET } " install --no-install-recommends postfix
mv /bin/hostname.bak /bin/hostname
2023-03-03 22:08:51 +00:00
# Irrelevant - Debian's default `chroot` jail config for Postfix needed a separate syslog socket:
rm /etc/rsyslog.d/postfix.conf
2022-09-21 07:31:28 +00:00
}
2023-05-25 23:01:41 +00:00
function _install_packages( ) {
2022-09-21 07:31:28 +00:00
_log 'debug' 'Installing all packages now'
2023-12-03 23:40:21 +00:00
local ANTI_VIRUS_SPAM_PACKAGES = (
clamav clamav-daemon
# spamassassin is used only with amavisd-new and pyzor/razor
# are used by spamassasin
amavisd-new spamassassin pyzor razor
# the following packages are all for Fail2Ban
fail2ban python3-pyinotify python3-dnspython
# redis-server belongs to rspamd
rspamd redis-server
2022-09-21 07:31:28 +00:00
)
2023-12-03 23:40:21 +00:00
# predominatly for Amavis support
local CODECS_PACKAGES = (
2022-09-21 07:31:28 +00:00
altermime arj bzip2
cabextract cpio file
gzip lhasa liblz4-tool
lrzip lzop nomarch
p7zip-full pax rpm2cpio
unrar-free unzip xz-utils
)
2023-12-03 23:40:21 +00:00
local MISCELLANEOUS_PACKAGES = (
binutils bsd-mailx
dbconfig-no-thanks dumb-init iproute2
libdate-manip-perl libldap-common libmail-spf-perl libnet-dns-perl
locales logwatch netcat-openbsd
nftables # primarily for Fail2Ban
rsyslog supervisor
uuid # used for file-locking
whois
2022-09-21 07:31:28 +00:00
)
2023-12-03 23:40:21 +00:00
local POSTFIX_PACKAGES = (
2024-01-13 08:37:20 +00:00
pflogsumm postgrey postfix-ldap postfix-mta-sts-resolver
2022-09-21 07:31:28 +00:00
postfix-pcre postfix-policyd-spf-python postsrsd
)
2023-12-03 23:40:21 +00:00
local MAIL_PROGRAMS_PACKAGES = (
opendkim opendkim-tools
2022-09-21 07:31:28 +00:00
opendmarc libsasl2-modules sasl2-bin
)
2023-12-03 23:40:21 +00:00
# these packages are contributed by the community and not part
# of DMS' core set of package
local COMMUNITY_PACKAGES = (
fetchmail getmail6
)
2023-10-16 07:51:48 +00:00
# `bind9-dnsutils` provides the `dig` command
# `iputils-ping` provides the `ping` command
DEBUG_PACKAGES = (
2024-01-11 09:34:08 +00:00
bind9-dnsutils iputils-ping less nano
2023-10-16 07:51:48 +00:00
)
2022-09-21 07:31:28 +00:00
apt-get " ${ QUIET } " --no-install-recommends install \
" ${ ANTI_VIRUS_SPAM_PACKAGES [@] } " \
" ${ CODECS_PACKAGES [@] } " \
" ${ MISCELLANEOUS_PACKAGES [@] } " \
" ${ POSTFIX_PACKAGES [@] } " \
2023-10-16 07:51:48 +00:00
" ${ MAIL_PROGRAMS_PACKAGES [@] } " \
2023-12-03 23:40:21 +00:00
" ${ DEBUG_PACKAGES [@] } " \
" ${ COMMUNITY_PACKAGES [@] } "
2022-09-21 07:31:28 +00:00
}
2023-05-25 23:01:41 +00:00
function _install_dovecot( ) {
2023-12-03 23:34:13 +00:00
local DOVECOT_PACKAGES = (
2023-06-01 08:50:31 +00:00
dovecot-core dovecot-imapd
2022-09-29 21:26:45 +00:00
dovecot-ldap dovecot-lmtpd dovecot-managesieved
dovecot-pop3d dovecot-sieve dovecot-solr
)
2023-11-08 21:18:17 +00:00
# Dovecot packages for community supported features.
DOVECOT_PACKAGES += ( dovecot-auth-lua)
# Dovecot's deb community repository only provides x86_64 packages, so do not include it
# when building for another architecture.
if [ [ ${ DOVECOT_COMMUNITY_REPO } -eq 1 ] ] && [ [ " $( uname --machine) " = = "x86_64" ] ] ; then
2022-09-29 21:26:45 +00:00
_log 'trace' 'Using Dovecot community repository'
curl https://repo.dovecot.org/DOVECOT-REPO-GPG | gpg --import
gpg --export ED409DA1 > /etc/apt/trusted.gpg.d/dovecot.gpg
2023-12-23 06:34:10 +00:00
# VERSION_CODENAME sourced from /etc/os-release
2023-12-03 23:34:13 +00:00
echo " deb https://repo.dovecot.org/ce-2.3-latest/debian/ ${ VERSION_CODENAME } ${ VERSION_CODENAME } main " > /etc/apt/sources.list.d/dovecot.list
2022-09-29 21:26:45 +00:00
_log 'trace' 'Updating Dovecot package signatures'
apt-get " ${ QUIET } " update
2023-11-08 21:18:17 +00:00
# Additional community package needed for Lua support if the Dovecot community repository is used.
DOVECOT_PACKAGES += ( dovecot-lua)
2022-09-29 21:26:45 +00:00
fi
_log 'debug' 'Installing Dovecot'
apt-get " ${ QUIET } " --no-install-recommends install " ${ DOVECOT_PACKAGES [@] } "
2023-06-01 08:50:31 +00:00
# dependency for fts_xapian
apt-get " ${ QUIET } " --no-install-recommends install libxapian30
2022-09-29 21:26:45 +00:00
}
2023-05-25 23:01:41 +00:00
function _post_installation_steps( ) {
2022-09-21 07:31:28 +00:00
_log 'debug' 'Running post-installation steps (cleanup)'
2023-12-03 23:36:46 +00:00
_log 'debug' 'Deleting default logwatch cronjob'
rm /etc/cron.daily/00logwatch
_log 'trace' 'Removing leftovers from APT'
2022-09-21 07:31:28 +00:00
apt-get " ${ QUIET } " clean
rm -rf /var/lib/apt/lists/*
2023-12-03 23:40:21 +00:00
_log 'debug' 'Patching Fail2ban to enable network bans'
# Enable network bans
# https://github.com/docker-mailserver/docker-mailserver/issues/2669
sedfile -i -r 's/^_nft_add_set = .+/_nft_add_set = <nftables> add set <table_family> <table> <addr_set> \\{ type <addr_type>\\; flags interval\\; \\}/' /etc/fail2ban/action.d/nftables.conf
2022-09-21 07:31:28 +00:00
}
_pre_installation_steps
2023-12-03 23:36:46 +00:00
_install_utils
2022-09-21 07:31:28 +00:00
_install_postfix
_install_packages
2022-09-29 21:26:45 +00:00
_install_dovecot
2022-09-21 07:31:28 +00:00
_post_installation_steps