merge prelim 22.04 changes from upstream
This commit is contained in:
parent
c621299174
commit
2e23e44582
22
CHANGELOG.md
22
CHANGELOG.md
|
@ -1,6 +1,28 @@
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
Version 60 (date TBD)
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
This is the first release for Ubuntu 22.04.
|
||||||
|
|
||||||
|
**Before upgrading**, you must **first upgrade your existing Ubuntu 18.04 box to Mail-in-a-Box v0.51** (or any later version of Mail-in-a-Box supporting Ubuntu 18.04), if you haven't already done so. That may not be possible after Ubuntu 18.04 reaches its end of life in April 2023, so please compete the upgrade well before then. (If you are not using Nextcloud's contacts or calendar, you can migrate to the latest version of Mail-in-a-Box from any previous version.)
|
||||||
|
|
||||||
|
For complete upgrade instructions, see:
|
||||||
|
|
||||||
|
LINK TBD
|
||||||
|
|
||||||
|
No features of Mail-in-a-Box have changed in this release, but with the newer version of Ubuntu the following software packages we use are updated:
|
||||||
|
|
||||||
|
* dovecot is upgraded to 2.3.16, postfix to 3.6.3, opendmark to 1.4 (which adds ARC-Authentication-Results headers), and spampd to 2.53 (alleviating a mail delivery rate limiting bug).
|
||||||
|
* Nextcloud is upgraded to 23.0.0 with PHP updated from 7.2 to 8.0.
|
||||||
|
* certbot is upgraded to 1.21 (via the Ubuntu repository instead of a PPA).
|
||||||
|
* fail2ban is upgraded to 0.11.2.
|
||||||
|
* nginx is upgraded to 1.18.
|
||||||
|
|
||||||
|
In Development
|
||||||
|
--------------
|
||||||
|
|
||||||
Version 56 (January 19, 2022)
|
Version 56 (January 19, 2022)
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
|
|
|
@ -82,7 +82,7 @@ Additionally, this project has a [Code of Conduct](CODE_OF_CONDUCT.md), which su
|
||||||
In The Box
|
In The Box
|
||||||
----------
|
----------
|
||||||
|
|
||||||
Mail-in-a-Box turns a fresh Ubuntu 20.04 or 18.04 LTS 64-bit machine into a working mail server by installing and configuring various components.
|
Mail-in-a-Box turns a fresh Ubuntu 22.04 or 20.04 LTS 64-bit machine into a working mail server by installing and configuring various components.
|
||||||
|
|
||||||
It is a one-click email appliance. There are no user-configurable setup options. It "just works."
|
It is a one-click email appliance. There are no user-configurable setup options. It "just works."
|
||||||
|
|
||||||
|
@ -113,13 +113,13 @@ Installation
|
||||||
|
|
||||||
See the [setup guide](https://mailinabox.email/guide.html) for detailed, user-friendly instructions.
|
See the [setup guide](https://mailinabox.email/guide.html) for detailed, user-friendly instructions.
|
||||||
|
|
||||||
For experts, start with a completely fresh (really, I mean it) Ubuntu 18.04 LTS 64-bit machine. On the machine...
|
For experts, start with a completely fresh (really, I mean it) Ubuntu 22.04 LTS 64-bit machine. On the machine...
|
||||||
|
|
||||||
Clone this repository and checkout the tag corresponding to the most recent release:
|
Clone this repository and checkout the tag corresponding to the most recent release:
|
||||||
|
|
||||||
$ git clone https://github.com/mail-in-a-box/mailinabox
|
$ git clone https://github.com/mail-in-a-box/mailinabox
|
||||||
$ cd mailinabox
|
$ cd mailinabox
|
||||||
$ git checkout v56
|
$ git checkout v60
|
||||||
|
|
||||||
Begin the installation.
|
Begin the installation.
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
# vi: set ft=ruby :
|
# vi: set ft=ruby :
|
||||||
|
|
||||||
Vagrant.configure("2") do |config|
|
Vagrant.configure("2") do |config|
|
||||||
config.vm.box = "ubuntu/focal64"
|
config.vm.box = "ubuntu/jammy64"
|
||||||
|
|
||||||
# Network config: Since it's a mail server, the machine must be connected
|
# Network config: Since it's a mail server, the machine must be connected
|
||||||
# to the public web. However, we currently don't want to expose SSH since
|
# to the public web. However, we currently don't want to expose SSH since
|
||||||
|
|
|
@ -1109,7 +1109,7 @@ def set_secondary_dns(hostnames, env):
|
||||||
response = resolver.resolve(item, "A")
|
response = resolver.resolve(item, "A")
|
||||||
except (dns.resolver.NoNameservers, dns.resolver.NXDOMAIN, dns.resolver.NoAnswer):
|
except (dns.resolver.NoNameservers, dns.resolver.NXDOMAIN, dns.resolver.NoAnswer):
|
||||||
try:
|
try:
|
||||||
response = resolver.query(item, "AAAA")
|
response = resolver.resolve(item, "AAAA")
|
||||||
except (dns.resolver.NoNameservers, dns.resolver.NXDOMAIN, dns.resolver.NoAnswer):
|
except (dns.resolver.NoNameservers, dns.resolver.NXDOMAIN, dns.resolver.NoAnswer):
|
||||||
raise ValueError("Could not resolve the IP address of %s." % item)
|
raise ValueError("Could not resolve the IP address of %s." % item)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -6,39 +6,47 @@
|
||||||
#
|
#
|
||||||
#########################################################
|
#########################################################
|
||||||
|
|
||||||
|
GITSRC=kj
|
||||||
|
|
||||||
if [ -z "$TAG" ]; then
|
if [ -z "$TAG" ]; then
|
||||||
# If a version to install isn't explicitly given as an environment
|
# If a version to install isn't explicitly given as an environment
|
||||||
# variable, then install the latest version. But the latest version
|
# variable, then install the latest version. But the latest version
|
||||||
# depends on the operating system. Existing Ubuntu 14.04 users need
|
# depends on the machine's version of Ubuntu. Existing users need to
|
||||||
# to be able to upgrade to the latest version supporting Ubuntu 14.04,
|
# be able to upgrade to the latest version available for that version
|
||||||
# in part because an upgrade is required before jumping to Ubuntu 18.04.
|
# of Ubuntu to satisfy the migration requirements.
|
||||||
# New users on Ubuntu 18.04 need to get the latest version number too.
|
|
||||||
#
|
#
|
||||||
# Also, the system status checks read this script for TAG = (without the
|
# Also, the system status checks read this script for TAG = (without the
|
||||||
# space, but if we put it in a comment it would confuse the status checks!)
|
# space, but if we put it in a comment it would confuse the status checks!)
|
||||||
# to get the latest version, so the first such line must be the one that we
|
# to get the latest version, so the first such line must be the one that we
|
||||||
# want to display in status checks.
|
# want to display in status checks.
|
||||||
if [ "`lsb_release -d | sed 's/.*:\s*//' | sed 's/20\.04\.[0-9]/20.04/' `" == "Ubuntu 20.04 LTS" ]; then
|
#
|
||||||
# This machine is running Ubuntu 20.04.
|
# Allow point-release versions of the major releases, e.g. 22.04.1 is OK.
|
||||||
TAG=v55
|
UBUNTU_VERSION=$( lsb_release -d | sed 's/.*:\s*//' | sed 's/\([0-9]*\.[0-9]*\)\.[0-9]/\1/' )"
|
||||||
|
if [ "$UBUNTU_VERSION" == "Ubuntu 22.04 LTS" ]; then
|
||||||
elif [ "$(lsb_release -d | sed 's/.*:\s*//' | sed 's/18\.04\.[0-9]/18.04/' )" == "Ubuntu 18.04 LTS" ]; then
|
# This machine is running Ubuntu 22.04, which is supported by
|
||||||
# This machine is running Ubuntu 18.04.
|
# Mail-in-a-Box versions 60 and later.
|
||||||
|
TAG=v60
|
||||||
|
elif [ "$UBUNTU_VERSION" == "Ubuntu 20.04 LTS" ]; then
|
||||||
|
# This machine is running Ubuntu 20.04, which is supported by
|
||||||
|
# Mail-in-a-Box versions 56 and later.
|
||||||
TAG=v56
|
TAG=v56
|
||||||
|
elif [ "$UBUNTU_VERSION" == "Ubuntu 18.04 LTS" ]; then
|
||||||
elif [ "$(lsb_release -d | sed 's/.*:\s*//' | sed 's/14\.04\.[0-9]/14.04/' )" == "Ubuntu 14.04 LTS" ]; then
|
# This machine is running Ubuntu 18.04, which is supported by
|
||||||
# This machine is running Ubuntu 14.04.
|
# Mail-in-a-Box versions 0.40 through 5x.
|
||||||
echo "You are installing the last version of Mail-in-a-Box that will"
|
echo "Support is ending for Ubuntu 18.04."
|
||||||
echo "support Ubuntu 14.04. If this is a new installation of Mail-in-a-Box,"
|
echo "Please immediately begin to migrate your information to"
|
||||||
echo "stop now and switch to a machine running Ubuntu 18.04. If you are"
|
echo "a new machine running Ubuntu 22.04. See:"
|
||||||
echo "upgrading an existing Mail-in-a-Box --- great. After upgrading this"
|
echo "https://mailinabox.email/maintenance.html#upgrade"
|
||||||
echo "box, please visit https://mailinabox.email for notes on how to upgrade"
|
TAG=v56
|
||||||
echo "to Ubuntu 18.04."
|
GITSRC=miab
|
||||||
echo ""
|
elif [ "$UBUNTU_VERSION" == "Ubuntu 14.04 LTS" ]; then
|
||||||
|
# This machine is running Ubuntu 14.04, which is supported by
|
||||||
|
# Mail-in-a-Box versions 1 through v0.30.
|
||||||
|
echo "Ubuntu 14.04 is no longer supported."
|
||||||
|
echo "The last version of Mail-in-a-Box supporting Ubuntu 14.04 will be installed."
|
||||||
TAG=v0.30
|
TAG=v0.30
|
||||||
|
|
||||||
else
|
else
|
||||||
echo "This script must be run on a system running Ubuntu 20.04, 18.04 or 14.04."
|
echo "This script may be used only on a machine running Ubuntu 14.04, 18.04, 20.04 or 22.04."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
@ -59,11 +67,19 @@ if [ ! -d $HOME/mailinabox ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo Downloading Mail-in-a-Box $TAG. . .
|
echo Downloading Mail-in-a-Box $TAG. . .
|
||||||
|
if [ "$GITSRC" == "miab" ]; then
|
||||||
git clone \
|
git clone \
|
||||||
-b $TAG --depth 1 \
|
-b $TAG --depth 1 \
|
||||||
https://github.com/mail-in-a-box/mailinabox \
|
https://github.com/mail-in-a-box/mailinabox \
|
||||||
$HOME/mailinabox \
|
$HOME/mailinabox \
|
||||||
< /dev/null 2> /dev/null
|
< /dev/null 2> /dev/null
|
||||||
|
else
|
||||||
|
git clone \
|
||||||
|
-b $TAG --depth 1 \
|
||||||
|
https://github.com/kiekerjan/mailinabox \
|
||||||
|
$HOME/mailinabox \
|
||||||
|
< /dev/null 2> /dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
echo
|
echo
|
||||||
fi
|
fi
|
||||||
|
|
42
setup/dns.sh
42
setup/dns.sh
|
@ -10,21 +10,15 @@
|
||||||
source setup/functions.sh # load our functions
|
source setup/functions.sh # load our functions
|
||||||
source /etc/mailinabox.conf # load global vars
|
source /etc/mailinabox.conf # load global vars
|
||||||
|
|
||||||
# Install the packages.
|
|
||||||
#
|
|
||||||
# * nsd: The non-recursive nameserver that publishes our DNS records.
|
|
||||||
# * ldnsutils: Helper utilities for signing DNSSEC zones.
|
|
||||||
# * openssh-client: Provides ssh-keyscan which we use to create SSHFP records.
|
|
||||||
echo "Installing nsd (DNS server)..."
|
echo "Installing nsd (DNS server)..."
|
||||||
apt_install ldnsutils openssh-client
|
|
||||||
|
|
||||||
# Prepare nsd's configuration.
|
# Prepare nsd's configuration.
|
||||||
|
# We configure nsd before installation as we only want it to bind to some addresses
|
||||||
|
# and it otherwise will have port / bind conflicts with bind9 used as the local resolver
|
||||||
mkdir -p /var/run/nsd
|
mkdir -p /var/run/nsd
|
||||||
mkdir -p /etc/nsd
|
mkdir -p /etc/nsd
|
||||||
mkdir -p /etc/nsd/zones
|
mkdir -p /etc/nsd/zones
|
||||||
touch /etc/nsd/zones.conf
|
touch /etc/nsd/zones.conf
|
||||||
touch /etc/nsd/nsd.conf
|
|
||||||
|
|
||||||
cat > /etc/nsd/nsd.conf << EOF;
|
cat > /etc/nsd/nsd.conf << EOF;
|
||||||
# Do not edit. Overwritten by Mail-in-a-Box setup.
|
# Do not edit. Overwritten by Mail-in-a-Box setup.
|
||||||
|
@ -46,18 +40,6 @@ server:
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# Add log rotation
|
|
||||||
cat > /etc/logrotate.d/nsd <<EOF;
|
|
||||||
/var/log/nsd.log {
|
|
||||||
weekly
|
|
||||||
missingok
|
|
||||||
rotate 12
|
|
||||||
compress
|
|
||||||
delaycompress
|
|
||||||
notifempty
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Since we have bind9 listening on localhost for locally-generated
|
# Since we have bind9 listening on localhost for locally-generated
|
||||||
# DNS queries that require a recursive nameserver, and the system
|
# DNS queries that require a recursive nameserver, and the system
|
||||||
# might have other network interfaces for e.g. tunnelling, we have
|
# might have other network interfaces for e.g. tunnelling, we have
|
||||||
|
@ -74,6 +56,18 @@ echo "include: /etc/nsd/nsd.conf.d/*.conf" >> /etc/nsd/nsd.conf;
|
||||||
# now be stored in /etc/nsd/nsd.conf.d.
|
# now be stored in /etc/nsd/nsd.conf.d.
|
||||||
rm -f /etc/nsd/zones.conf
|
rm -f /etc/nsd/zones.conf
|
||||||
|
|
||||||
|
# Add log rotation
|
||||||
|
cat > /etc/logrotate.d/nsd <<EOF;
|
||||||
|
/var/log/nsd.log {
|
||||||
|
weekly
|
||||||
|
missingok
|
||||||
|
rotate 12
|
||||||
|
compress
|
||||||
|
delaycompress
|
||||||
|
notifempty
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
# Add systemd override file to fix some permissions
|
# Add systemd override file to fix some permissions
|
||||||
mkdir -p /etc/systemd/system/nsd.service.d/
|
mkdir -p /etc/systemd/system/nsd.service.d/
|
||||||
cat > /etc/systemd/system/nsd.service.d/nsd-permissions.conf << EOF
|
cat > /etc/systemd/system/nsd.service.d/nsd-permissions.conf << EOF
|
||||||
|
@ -82,8 +76,12 @@ ReadWritePaths=/var/lib/nsd /etc/nsd /run /var/log /run/nsd
|
||||||
CapabilityBoundingSet=CAP_CHOWN CAP_IPC_LOCK CAP_NET_BIND_SERVICE CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_NET_ADMIN
|
CapabilityBoundingSet=CAP_CHOWN CAP_IPC_LOCK CAP_NET_BIND_SERVICE CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_NET_ADMIN
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# Attempting a late install of nsd (after configuration)
|
# Install the packages.
|
||||||
apt_install nsd
|
#
|
||||||
|
# * nsd: The non-recursive nameserver that publishes our DNS records.
|
||||||
|
# * ldnsutils: Helper utilities for signing DNSSEC zones.
|
||||||
|
# * openssh-client: Provides ssh-keyscan which we use to create SSHFP records.
|
||||||
|
apt_install nsd ldnsutils openssh-client
|
||||||
|
|
||||||
# Create DNSSEC signing keys.
|
# Create DNSSEC signing keys.
|
||||||
|
|
||||||
|
|
|
@ -78,13 +78,14 @@ tools/editconf.py /etc/dovecot/conf.d/10-auth.conf \
|
||||||
"auth_mechanisms=plain login"
|
"auth_mechanisms=plain login"
|
||||||
|
|
||||||
# Enable SSL, specify the location of the SSL certificate and private key files.
|
# Enable SSL, specify the location of the SSL certificate and private key files.
|
||||||
# Use Mozilla's "Intermediate" recommendations at https://ssl-config.mozilla.org/#server=dovecot&server-version=2.2.33&config=intermediate&openssl-version=1.1.1,
|
# Use Mozilla's "Intermediate" recommendations at https://ssl-config.mozilla.org/#server=dovecot&server-version=2.3.7.2&config=intermediate&openssl-version=1.1.1,
|
||||||
# specify a minimum of TLSv1.2.
|
# except that the current version of Dovecot does not have a TLSv1.3 setting, so we only use TLSv1.2.
|
||||||
tools/editconf.py /etc/dovecot/conf.d/10-ssl.conf \
|
tools/editconf.py /etc/dovecot/conf.d/10-ssl.conf \
|
||||||
ssl=required \
|
ssl=required \
|
||||||
"ssl_cert=<$STORAGE_ROOT/ssl/ssl_certificate.pem" \
|
"ssl_cert=<$STORAGE_ROOT/ssl/ssl_certificate.pem" \
|
||||||
"ssl_key=<$STORAGE_ROOT/ssl/ssl_private_key.pem" \
|
"ssl_key=<$STORAGE_ROOT/ssl/ssl_private_key.pem" \
|
||||||
"ssl_min_protocol=TLSv1.2" \
|
"ssl_min_protocol=TLSv1.2" \
|
||||||
|
"ssl_cipher_list=ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384" \
|
||||||
"ssl_prefer_server_ciphers=yes" \
|
"ssl_prefer_server_ciphers=yes" \
|
||||||
"ssl_dh=<$STORAGE_ROOT/ssl/dh4096.pem"
|
"ssl_dh=<$STORAGE_ROOT/ssl/dh4096.pem"
|
||||||
|
|
||||||
|
|
|
@ -13,8 +13,8 @@
|
||||||
# destinations according to aliases, and passses email on to
|
# destinations according to aliases, and passses email on to
|
||||||
# another service for local mail delivery.
|
# another service for local mail delivery.
|
||||||
#
|
#
|
||||||
# The first hop in local mail delivery is to Spamassassin via
|
# The first hop in local mail delivery is to spampd via
|
||||||
# LMTP. Spamassassin then passes mail over to Dovecot for
|
# LMTP. spampd then passes mail over to Dovecot for
|
||||||
# storage in the user's mailbox.
|
# storage in the user's mailbox.
|
||||||
#
|
#
|
||||||
# Postfix also listens on ports 465/587 (SMTPS, SMTP+STARTLS) for
|
# Postfix also listens on ports 465/587 (SMTPS, SMTP+STARTLS) for
|
||||||
|
@ -124,7 +124,7 @@ sed -i "s/PUBLIC_IP/$PUBLIC_IP/" /etc/postfix/outgoing_mail_header_filters
|
||||||
# the world are very far behind and if we disable too much, they may not be able to use TLS and
|
# the world are very far behind and if we disable too much, they may not be able to use TLS and
|
||||||
# won't fall back to cleartext. So we don't disable too much. smtpd_tls_exclude_ciphers applies to
|
# won't fall back to cleartext. So we don't disable too much. smtpd_tls_exclude_ciphers applies to
|
||||||
# both port 25 and port 587, but because we override the cipher list for both, it probably isn't used.
|
# both port 25 and port 587, but because we override the cipher list for both, it probably isn't used.
|
||||||
# Use Mozilla's "Old" recommendations at https://ssl-config.mozilla.org/#server=postfix&server-version=3.3.0&config=old&openssl-version=1.1.1
|
# Use Mozilla's "Old" recommendations at https://ssl-config.mozilla.org/#server=postfix&server-version=3.4.13&config=old&openssl-version=1.1.1
|
||||||
tools/editconf.py /etc/postfix/main.cf \
|
tools/editconf.py /etc/postfix/main.cf \
|
||||||
smtpd_tls_security_level=may\
|
smtpd_tls_security_level=may\
|
||||||
smtpd_tls_auth_only=yes \
|
smtpd_tls_auth_only=yes \
|
||||||
|
@ -133,7 +133,7 @@ tools/editconf.py /etc/postfix/main.cf \
|
||||||
smtpd_tls_dh1024_param_file=$STORAGE_ROOT/ssl/dh4096.pem \
|
smtpd_tls_dh1024_param_file=$STORAGE_ROOT/ssl/dh4096.pem \
|
||||||
smtpd_tls_protocols="!SSLv2,!SSLv3,!TLSv1,!TLSv1.1" \
|
smtpd_tls_protocols="!SSLv2,!SSLv3,!TLSv1,!TLSv1.1" \
|
||||||
smtpd_tls_ciphers=medium \
|
smtpd_tls_ciphers=medium \
|
||||||
tls_medium_cipherlist=ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256 \
|
tls_medium_cipherlist=ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 \
|
||||||
smtpd_tls_exclude_ciphers="MD5, DES, ADH, RC4, PSD, SRP, 3DES, eNULL, aNULL" \
|
smtpd_tls_exclude_ciphers="MD5, DES, ADH, RC4, PSD, SRP, 3DES, eNULL, aNULL" \
|
||||||
tls_preempt_cipherlist=yes \
|
tls_preempt_cipherlist=yes \
|
||||||
smtpd_tls_received_header=yes
|
smtpd_tls_received_header=yes
|
||||||
|
@ -205,16 +205,17 @@ tools/editconf.py /etc/postfix/main.cf \
|
||||||
|
|
||||||
# ### Incoming Mail
|
# ### Incoming Mail
|
||||||
|
|
||||||
# Pass any incoming mail over to a local delivery agent. Spamassassin
|
# Pass mail to spampd, which acts as the local delivery agent (LDA),
|
||||||
# will act as the LDA agent at first. It is listening on port 10025
|
# which then passes the mail over to the Dovecot LMTP server after.
|
||||||
# with LMTP. Spamassassin will pass the mail over to Dovecot after.
|
# spampd runs on port 10025 by default.
|
||||||
#
|
#
|
||||||
# In a basic setup we would pass mail directly to Dovecot by setting
|
# In a basic setup we would pass mail directly to Dovecot by setting
|
||||||
# virtual_transport to `lmtp:unix:private/dovecot-lmtp`.
|
# virtual_transport to `lmtp:unix:private/dovecot-lmtp`.
|
||||||
tools/editconf.py /etc/postfix/main.cf "virtual_transport=lmtp:[127.0.0.1]:10025"
|
tools/editconf.py /etc/postfix/main.cf "virtual_transport=lmtp:[127.0.0.1]:10025"
|
||||||
# Because of a spampd bug, limit the number of recipients in each connection.
|
# Clear the lmtp_destination_recipient_limit setting which in previous
|
||||||
|
# versions of Mail-in-a-Box was set to 1 because of a spampd bug.
|
||||||
# See https://github.com/mail-in-a-box/mailinabox/issues/1523.
|
# See https://github.com/mail-in-a-box/mailinabox/issues/1523.
|
||||||
tools/editconf.py /etc/postfix/main.cf lmtp_destination_recipient_limit=1
|
tools/editconf.py /etc/postfix/main.cf -e lmtp_destination_recipient_limit=
|
||||||
|
|
||||||
|
|
||||||
# Who can send mail to us? Some basic filters.
|
# Who can send mail to us? Some basic filters.
|
||||||
|
|
|
@ -28,7 +28,7 @@ nextcloud_hash=58d2d897ba22a057aa03d29c762c5306211fefd2
|
||||||
# --------------
|
# --------------
|
||||||
# * Find the most recent tag that is compatible with the Nextcloud version above by
|
# * Find the most recent tag that is compatible with the Nextcloud version above by
|
||||||
# consulting the <dependencies>...<nextcloud> node at:
|
# consulting the <dependencies>...<nextcloud> node at:
|
||||||
# https://github.com/nextcloud-releases/contacts/blob/maaster/appinfo/info.xml
|
# https://github.com/nextcloud-releases/contacts/blob/master/appinfo/info.xml
|
||||||
# https://github.com/nextcloud-releases/calendar/blob/master/appinfo/info.xml
|
# https://github.com/nextcloud-releases/calendar/blob/master/appinfo/info.xml
|
||||||
# https://github.com/nextcloud/user_external/blob/master/appinfo/info.xml
|
# https://github.com/nextcloud/user_external/blob/master/appinfo/info.xml
|
||||||
# * The hash is the SHA1 hash of the ZIP package, which you can find by just running this script and
|
# * The hash is the SHA1 hash of the ZIP package, which you can find by just running this script and
|
||||||
|
@ -49,10 +49,10 @@ apt_install php php-fpm \
|
||||||
php-dev php-gd php-xml php-mbstring php-zip php-apcu php-json \
|
php-dev php-gd php-xml php-mbstring php-zip php-apcu php-json \
|
||||||
php-intl php-imagick php-gmp php-bcmath
|
php-intl php-imagick php-gmp php-bcmath
|
||||||
|
|
||||||
# Enable apc is required before installing nextcloud 21
|
# Enable apc is required before installing nextcloud
|
||||||
tools/editconf.py /etc/php/$(php_version)/mods-available/apcu.ini -c ';' \
|
tools/editconf.py /etc/php/$(php_version)/mods-available/apcu.ini -c ';' \
|
||||||
apc.enabled=1 \
|
apc.enabled=1 \
|
||||||
apc.enable_cli=1
|
apc.enable_cli=0
|
||||||
|
|
||||||
restart_service php$(php_version)-fpm
|
restart_service php$(php_version)-fpm
|
||||||
|
|
||||||
|
@ -156,7 +156,7 @@ fi
|
||||||
# from the version currently installed, do the install/upgrade
|
# from the version currently installed, do the install/upgrade
|
||||||
if [ ! -d /usr/local/lib/owncloud/ ] || [[ ! ${CURRENT_NEXTCLOUD_VER} =~ ^$nextcloud_ver ]]; then
|
if [ ! -d /usr/local/lib/owncloud/ ] || [[ ! ${CURRENT_NEXTCLOUD_VER} =~ ^$nextcloud_ver ]]; then
|
||||||
|
|
||||||
# Stop php-fpm if running. If theyre not running (which happens on a previously failed install), dont bail.
|
# Stop php-fpm if running. If they are not running (which happens on a previously failed install), dont bail.
|
||||||
service php$(php_version)-fpm stop &> /dev/null || /bin/true
|
service php$(php_version)-fpm stop &> /dev/null || /bin/true
|
||||||
|
|
||||||
# Backup the existing ownCloud/Nextcloud.
|
# Backup the existing ownCloud/Nextcloud.
|
||||||
|
@ -318,6 +318,8 @@ php <<EOF > $CONFIG_TEMP && mv $CONFIG_TEMP $STORAGE_ROOT/owncloud/config.php;
|
||||||
<?php
|
<?php
|
||||||
include("$STORAGE_ROOT/owncloud/config.php");
|
include("$STORAGE_ROOT/owncloud/config.php");
|
||||||
|
|
||||||
|
\$CONFIG['config_is_read_only'] = true; # should prevent warnings from occ tool but doesn't
|
||||||
|
|
||||||
\$CONFIG['trusted_domains'] = array('$PRIMARY_HOSTNAME');
|
\$CONFIG['trusted_domains'] = array('$PRIMARY_HOSTNAME');
|
||||||
|
|
||||||
\$CONFIG['memcache.local'] = '\OC\Memcache\APCu';
|
\$CONFIG['memcache.local'] = '\OC\Memcache\APCu';
|
||||||
|
|
|
@ -7,12 +7,11 @@ if [[ $EUID -ne 0 ]]; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Check that we are running on Debian GNU/Linux, or Ubuntu 20.04
|
# Check that we are running on Ubuntu 20.04 LTS or Ubuntu 22.04 LTS
|
||||||
OS=`lsb_release -d | sed 's/.*:\s*//'`
|
if [ "$( lsb_release --id --short )" != "Ubuntu" ] || [ "$( lsb_release --release --short )" != "22.04" -a "$( lsb_release --release --short )" != "20.04" ]; then
|
||||||
if [ "$OS" != "Debian GNU/Linux 10 (buster)" -a "$(echo $OS | grep -o 'Ubuntu 20.04')" != "Ubuntu 20.04" ]; then
|
echo "Mail-in-a-Box only supports being installed on Ubuntu 20.04 or 22.04, sorry. You are running:"
|
||||||
echo "Mail-in-a-Box only supports being installed on Debian 10 or Ubuntu 20.04 LTS, sorry. You are running:"
|
|
||||||
echo
|
echo
|
||||||
lsb_release -d | sed 's/.*:\s*//'
|
lsb_release --description --short
|
||||||
echo
|
echo
|
||||||
echo "We can't write scripts that run on every possible setup, sorry."
|
echo "We can't write scripts that run on every possible setup, sorry."
|
||||||
exit 1
|
exit 1
|
||||||
|
|
|
@ -83,6 +83,18 @@ fi
|
||||||
tools/editconf.py /etc/systemd/journald.conf MaxRetentionSec=10day
|
tools/editconf.py /etc/systemd/journald.conf MaxRetentionSec=10day
|
||||||
|
|
||||||
hide_output systemctl restart systemd-journald.service
|
hide_output systemctl restart systemd-journald.service
|
||||||
|
# We install some non-standard Ubuntu packages maintained by other
|
||||||
|
# third-party providers. First ensure add-apt-repository is installed.
|
||||||
|
|
||||||
|
if [ ! -f /usr/bin/add-apt-repository ]; then
|
||||||
|
echo "Installing add-apt-repository..."
|
||||||
|
hide_output apt-get update
|
||||||
|
apt_install software-properties-common
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Ensure the universe repository is enabled since some of our packages
|
||||||
|
# come from there and minimal Ubuntu installs may have it turned off.
|
||||||
|
hide_output add-apt-repository -y universe
|
||||||
|
|
||||||
# ### Update Packages
|
# ### Update Packages
|
||||||
|
|
||||||
|
@ -304,18 +316,13 @@ fi #NODOC
|
||||||
#
|
#
|
||||||
# About the settings:
|
# About the settings:
|
||||||
#
|
#
|
||||||
# * Adding -4 to OPTIONS will have `bind9` not listen on IPv6 addresses
|
|
||||||
# so that we're sure there's no conflict with nsd, our public domain
|
|
||||||
# name server, on IPV6.
|
|
||||||
# * The listen-on directive in named.conf.options restricts `bind9` to
|
# * The listen-on directive in named.conf.options restricts `bind9` to
|
||||||
# binding to the loopback interface instead of all interfaces.
|
# binding to the loopback interface instead of all interfaces.
|
||||||
# * The max-recursion-queries directive increases the maximum number of iterative queries.
|
# * The max-recursion-queries directive increases the maximum number of iterative queries.
|
||||||
# If more queries than specified are sent, bind9 returns SERVFAIL. After flushing the cache during system checks,
|
# If more queries than specified are sent, bind9 returns SERVFAIL. After flushing the cache during system checks,
|
||||||
# we ran into the limit thus we are increasing it from 75 (default value) to 100.
|
# we ran into the limit thus we are increasing it from 75 (default value) to 100.
|
||||||
apt_install bind9
|
apt_install bind9
|
||||||
touch /etc/default/bind9
|
|
||||||
tools/editconf.py /etc/default/bind9 \
|
|
||||||
"OPTIONS=\"-u bind -4\""
|
|
||||||
if ! grep -q "listen-on " /etc/bind/named.conf.options; then
|
if ! grep -q "listen-on " /etc/bind/named.conf.options; then
|
||||||
# Add a listen-on directive if it doesn't exist inside the options block.
|
# Add a listen-on directive if it doesn't exist inside the options block.
|
||||||
sed -i "s/^}/\n\tlisten-on { 127.0.0.1; };\n}/" /etc/bind/named.conf.options
|
sed -i "s/^}/\n\tlisten-on { 127.0.0.1; };\n}/" /etc/bind/named.conf.options
|
||||||
|
|
|
@ -48,7 +48,7 @@ def test2(tests, server, description):
|
||||||
for qname, rtype, expected_answer in tests:
|
for qname, rtype, expected_answer in tests:
|
||||||
# do the query and format the result as a string
|
# do the query and format the result as a string
|
||||||
try:
|
try:
|
||||||
response = dns.resolver.query(qname, rtype)
|
response = dns.resolver.resolve(qname, rtype)
|
||||||
except dns.resolver.NoNameservers:
|
except dns.resolver.NoNameservers:
|
||||||
# host did not have an answer for this query
|
# host did not have an answer for this query
|
||||||
print("Could not connect to %s for DNS query." % server)
|
print("Could not connect to %s for DNS query." % server)
|
||||||
|
|
|
@ -48,7 +48,7 @@ server = smtplib.SMTP_SSL(host)
|
||||||
ipaddr = socket.gethostbyname(host) # IPv4 only!
|
ipaddr = socket.gethostbyname(host) # IPv4 only!
|
||||||
reverse_ip = dns.reversename.from_address(ipaddr) # e.g. "1.0.0.127.in-addr.arpa."
|
reverse_ip = dns.reversename.from_address(ipaddr) # e.g. "1.0.0.127.in-addr.arpa."
|
||||||
try:
|
try:
|
||||||
reverse_dns = dns.resolver.query(reverse_ip, 'PTR')[0].target.to_text(omit_final_dot=True) # => hostname
|
reverse_dns = dns.resolver.resolve(reverse_ip, 'PTR')[0].target.to_text(omit_final_dot=True) # => hostname
|
||||||
except dns.resolver.NXDOMAIN:
|
except dns.resolver.NXDOMAIN:
|
||||||
print("Reverse DNS lookup failed for %s. SMTP EHLO name check skipped." % ipaddr)
|
print("Reverse DNS lookup failed for %s. SMTP EHLO name check skipped." % ipaddr)
|
||||||
reverse_dns = None
|
reverse_dns = None
|
||||||
|
|
|
@ -14,6 +14,10 @@
|
||||||
#
|
#
|
||||||
# NAME VALUE
|
# NAME VALUE
|
||||||
#
|
#
|
||||||
|
# If the -e option is given and VALUE is empty, the setting is removed
|
||||||
|
# from the configuration file if it is set (i.e. existing occurrences
|
||||||
|
# are commented out and no new setting is added).
|
||||||
|
#
|
||||||
# If the -c option is given, then the supplied character becomes the comment character
|
# If the -c option is given, then the supplied character becomes the comment character
|
||||||
#
|
#
|
||||||
# If the -w option is given, then setting lines continue onto following
|
# If the -w option is given, then setting lines continue onto following
|
||||||
|
@ -35,6 +39,7 @@ settings = sys.argv[2:]
|
||||||
|
|
||||||
delimiter = "="
|
delimiter = "="
|
||||||
delimiter_re = r"\s*=\s*"
|
delimiter_re = r"\s*=\s*"
|
||||||
|
erase_setting = False
|
||||||
comment_char = "#"
|
comment_char = "#"
|
||||||
folded_lines = False
|
folded_lines = False
|
||||||
testing = False
|
testing = False
|
||||||
|
@ -44,6 +49,9 @@ while settings[0][0] == "-" and settings[0] != "--":
|
||||||
# Space is the delimiter
|
# Space is the delimiter
|
||||||
delimiter = " "
|
delimiter = " "
|
||||||
delimiter_re = r"\s+"
|
delimiter_re = r"\s+"
|
||||||
|
elif opt == "-e":
|
||||||
|
# Erase settings that have empty values.
|
||||||
|
erase_setting = True
|
||||||
elif opt == "-w":
|
elif opt == "-w":
|
||||||
# Line folding is possible in this file.
|
# Line folding is possible in this file.
|
||||||
folded_lines = True
|
folded_lines = True
|
||||||
|
@ -81,7 +89,7 @@ while len(input_lines) > 0:
|
||||||
|
|
||||||
# See if this line is for any settings passed on the command line.
|
# See if this line is for any settings passed on the command line.
|
||||||
for i in range(len(settings)):
|
for i in range(len(settings)):
|
||||||
# Check that this line contain this setting from the command-line arguments.
|
# Check if this line contain this setting from the command-line arguments.
|
||||||
name, val = settings[i].split("=", 1)
|
name, val = settings[i].split("=", 1)
|
||||||
m = re.match(
|
m = re.match(
|
||||||
"(\s*)"
|
"(\s*)"
|
||||||
|
@ -91,8 +99,10 @@ while len(input_lines) > 0:
|
||||||
if not m: continue
|
if not m: continue
|
||||||
indent, is_comment, existing_val = m.groups()
|
indent, is_comment, existing_val = m.groups()
|
||||||
|
|
||||||
# If this is already the setting, do nothing.
|
# If this is already the setting, keep it in the file, except:
|
||||||
if is_comment is None and existing_val == val:
|
# * If we've already seen it before, then remove this duplicate line.
|
||||||
|
# * If val is empty and erase_setting is on, then comment it out.
|
||||||
|
if is_comment is None and existing_val == val and not (not val and erase_setting):
|
||||||
# It may be that we've already inserted this setting higher
|
# It may be that we've already inserted this setting higher
|
||||||
# in the file so check for that first.
|
# in the file so check for that first.
|
||||||
if i in found: break
|
if i in found: break
|
||||||
|
@ -107,8 +117,9 @@ while len(input_lines) > 0:
|
||||||
# the line is already commented, pass it through
|
# the line is already commented, pass it through
|
||||||
buf += line
|
buf += line
|
||||||
|
|
||||||
# if this option oddly appears more than once, don't add the setting again
|
# if this option already is set don't add the setting again,
|
||||||
if i in found:
|
# or if we're clearing the setting with -e, don't add it
|
||||||
|
if (i in found) or (not val and erase_setting):
|
||||||
break
|
break
|
||||||
|
|
||||||
# add the new setting
|
# add the new setting
|
||||||
|
@ -122,9 +133,10 @@ while len(input_lines) > 0:
|
||||||
# If did not match any setting names, pass this line through.
|
# If did not match any setting names, pass this line through.
|
||||||
buf += line
|
buf += line
|
||||||
|
|
||||||
# Put any settings we didn't see at the end of the file.
|
# Put any settings we didn't see at the end of the file,
|
||||||
|
# except settings being cleared.
|
||||||
for i in range(len(settings)):
|
for i in range(len(settings)):
|
||||||
if i not in found:
|
if (i not in found) and not (not val and erase_setting):
|
||||||
name, val = settings[i].split("=", 1)
|
name, val = settings[i].split("=", 1)
|
||||||
buf += name + delimiter + val + "\n"
|
buf += name + delimiter + val + "\n"
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
# This script will restore the backup made during an installation
|
# This script will restore the backup made during an installation
|
||||||
|
source setup/functions.sh # load our functions
|
||||||
source /etc/mailinabox.conf # load global vars
|
source /etc/mailinabox.conf # load global vars
|
||||||
|
|
||||||
if [ -z "$1" ]; then
|
if [ -z "$1" ]; then
|
||||||
|
@ -26,7 +27,7 @@ if [ ! -f $1/config.php ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Restoring backup from $1"
|
echo "Restoring backup from $1"
|
||||||
service php7.3-fpm stop
|
service php$(php_version)-fpm stop
|
||||||
|
|
||||||
# remove the current ownCloud/Nextcloud installation
|
# remove the current ownCloud/Nextcloud installation
|
||||||
rm -rf /usr/local/lib/owncloud/
|
rm -rf /usr/local/lib/owncloud/
|
||||||
|
@ -45,5 +46,5 @@ chown www-data.www-data $STORAGE_ROOT/owncloud/config.php
|
||||||
|
|
||||||
sudo -u www-data php /usr/local/lib/owncloud/occ maintenance:mode --off
|
sudo -u www-data php /usr/local/lib/owncloud/occ maintenance:mode --off
|
||||||
|
|
||||||
service php7.3-fpm start
|
service php$(php_version)-fpm start
|
||||||
echo "Done"
|
echo "Done"
|
||||||
|
|
Loading…
Reference in New Issue