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
_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'
curl -sL https://github.com/01mf02/jaq/releases/latest/download/jaq-v1.2.0-x86_64-unknown-linux-musl -o /usr/bin/jaq && chmod +x /usr/bin/jaq
}
2023-05-25 23:01:41 +00:00
function _install_postfix( ) {
2022-09-21 07:31:28 +00:00
_log 'debug' 'Installing Postfix'
_log 'warn' 'Applying workaround for Postfix bug (see https://github.com//issues/2023#issuecomment-855326403)'
# 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'
ANTI_VIRUS_SPAM_PACKAGES = (
amavisd-new clamav clamav-daemon
2022-09-29 07:02:56 +00:00
pyzor razor spamassassin
2022-09-21 07:31:28 +00:00
)
CODECS_PACKAGES = (
altermime arj bzip2
cabextract cpio file
gzip lhasa liblz4-tool
lrzip lzop nomarch
p7zip-full pax rpm2cpio
unrar-free unzip xz-utils
)
MISCELLANEOUS_PACKAGES = (
2023-10-16 07:51:48 +00:00
apt-transport-https binutils bsd-mailx
2022-09-21 07:31:28 +00:00
ca-certificates curl dbconfig-no-thanks
2023-10-16 07:51:48 +00:00
dumb-init gnupg iproute2 libdate-manip-perl
libldap-common libmail-spf-perl
libnet-dns-perl locales logwatch
netcat-openbsd nftables rsyslog
supervisor uuid whois
2022-09-21 07:31:28 +00:00
)
POSTFIX_PACKAGES = (
pflogsumm postgrey postfix-ldap
postfix-pcre postfix-policyd-spf-python postsrsd
)
MAIL_PROGRAMS_PACKAGES = (
fetchmail opendkim opendkim-tools
opendmarc libsasl2-modules sasl2-bin
)
2023-10-16 07:51:48 +00:00
# `bind9-dnsutils` provides the `dig` command
# `iputils-ping` provides the `ping` command
DEBUG_PACKAGES = (
bind9-dnsutils iputils-ping less nano
)
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 [@] } " \
" ${ DEBUG_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-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/*
}
_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