ubuntu 18.04 has nginx 1.14 ubuntu 20.04, 22.04 has nginx 1.18 We used a custom nginx for TLSv1.3 support (ssl_protocols TLSv1.3). OpenSSL itself has TLS 1.3 only from Ubuntu 18.10. This is why we installed custom packages on Ubuntu 18.04
198 lines
7.3 KiB
Bash
Executable File
198 lines
7.3 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# This script is run on the base ubuntu. Put things here which are managed by ubuntu
|
|
|
|
set -euv -o pipefail
|
|
|
|
readonly SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
|
readonly arg_infraversionpath="${SOURCE_DIR}/../src"
|
|
|
|
function die {
|
|
echo $1
|
|
exit 1
|
|
}
|
|
|
|
export DEBIAN_FRONTEND=noninteractive
|
|
|
|
readonly ubuntu_codename=$(lsb_release -cs)
|
|
readonly ubuntu_version=$(lsb_release -rs)
|
|
|
|
# enable ubuntu proposed for collectd (https://launchpad.net/ubuntu/+source/collectd)
|
|
if [[ "${ubuntu_version}" == "22.04" ]]; then
|
|
cat <<EOF >/etc/apt/sources.list.d/ubuntu-$(lsb_release -cs)-proposed.list
|
|
# Enable Ubuntu proposed archive
|
|
deb http://archive.ubuntu.com/ubuntu/ $(lsb_release -cs)-proposed restricted main multiverse universe
|
|
EOF
|
|
fi
|
|
|
|
# hold grub since updating it breaks on some VPS providers. also, dist-upgrade will trigger it
|
|
apt-mark hold grub* >/dev/null
|
|
apt-get -o Dpkg::Options::="--force-confdef" update -y
|
|
apt-get -o Dpkg::Options::="--force-confdef" upgrade -y
|
|
apt-mark unhold grub* >/dev/null
|
|
|
|
echo "==> Installing required packages"
|
|
|
|
debconf-set-selections <<< 'mysql-server mysql-server/root_password password password'
|
|
debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password password'
|
|
|
|
# this enables automatic security upgrades (https://help.ubuntu.com/community/AutomaticSecurityUpdates)
|
|
# resolvconf is needed for unbound to work property after disabling systemd-resolved in 18.04
|
|
case "${ubuntu_version}" in
|
|
16.04)
|
|
gpg_package="gnupg"
|
|
mysql_package="mysql-server-5.7"
|
|
ntpd_package=""
|
|
python_package="python2.7"
|
|
nginx_package="" # we use custom package for TLS v1.3 support
|
|
;;
|
|
18.04)
|
|
gpg_package="gpg"
|
|
mysql_package="mysql-server-5.7"
|
|
ntpd_package=""
|
|
python_package="python2.7"
|
|
nginx_package="" # we use custom package for TLS v1.3 support
|
|
;;
|
|
20.04)
|
|
gpg_package="gpg"
|
|
mysql_package="mysql-server-8.0"
|
|
ntpd_package="systemd-timesyncd"
|
|
python_package="python3.8"
|
|
nginx_package="nginx-full"
|
|
;;
|
|
22.04)
|
|
gpg_package="gpg"
|
|
mysql_package="mysql-server-8.0"
|
|
ntpd_package="systemd-timesyncd"
|
|
python_package="python3.10"
|
|
nginx_package="nginx-full"
|
|
;;
|
|
esac
|
|
|
|
apt-get -y install --no-install-recommends \
|
|
acl \
|
|
apparmor \
|
|
build-essential \
|
|
cifs-utils \
|
|
cron \
|
|
curl \
|
|
debconf-utils \
|
|
dmsetup \
|
|
$gpg_package \
|
|
ipset \
|
|
iptables \
|
|
lib${python_package} \
|
|
linux-generic \
|
|
logrotate \
|
|
$mysql_package \
|
|
nfs-common \
|
|
$nginx \
|
|
$ntpd_package \
|
|
openssh-server \
|
|
pwgen \
|
|
resolvconf \
|
|
sshfs \
|
|
swaks \
|
|
tzdata \
|
|
unattended-upgrades \
|
|
unbound \
|
|
unzip \
|
|
xfsprogs
|
|
|
|
# on some providers like scaleway the sudo file is changed and we want to keep the old one
|
|
apt-get -o Dpkg::Options::="--force-confold" install -y --no-install-recommends sudo
|
|
|
|
# this ensures that unattended upgades are enabled, if it was disabled during ubuntu install time (see #346)
|
|
# debconf-set-selection of unattended-upgrades/enable_auto_updates + dpkg-reconfigure does not work
|
|
cp /usr/share/unattended-upgrades/20auto-upgrades /etc/apt/apt.conf.d/20auto-upgrades
|
|
|
|
apt-get install -y --no-install-recommends $python_package # Install python which is required for npm rebuild
|
|
|
|
# do not upgrade grub because it might prompt user and break this script
|
|
echo "==> Enable memory accounting"
|
|
apt-get -y --no-upgrade --no-install-recommends install grub2-common
|
|
sed -e 's/^GRUB_CMDLINE_LINUX="\(.*\)"$/GRUB_CMDLINE_LINUX="\1 cgroup_enable=memory swapaccount=1 panic_on_oops=1 panic=5"/' -i /etc/default/grub
|
|
update-grub
|
|
|
|
echo "==> Install collectd"
|
|
# without this, libnotify4 will install gnome-shell
|
|
apt-get install -y libnotify4 --no-install-recommends
|
|
if ! apt-get install -y --no-install-recommends libcurl3-gnutls collectd collectd-utils; then
|
|
# FQDNLookup is true in default debian config. The box code has a custom collectd.conf that fixes this
|
|
echo "Failed to install collectd. Presumably because of http://mailman.verplant.org/pipermail/collectd/2015-March/006491.html"
|
|
sed -e 's/^FQDNLookup true/FQDNLookup false/' -i /etc/collectd/collectd.conf
|
|
fi
|
|
# https://bugs.launchpad.net/ubuntu/+source/collectd/+bug/1872281
|
|
if [[ "${ubuntu_version}" == "20.04" ]]; then
|
|
echo -e "\nLD_PRELOAD=/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so" >> /etc/default/collectd
|
|
elif [[ "${ubuntu_version}" == "22.04" ]]; then
|
|
echo -e "\nLD_PRELOAD=/usr/lib/python3.10/config-3.10-x86_64-linux-gnu/libpython3.10.so" >> /etc/default/collectd
|
|
fi
|
|
|
|
# some hosts like atlantic install ntp which conflicts with timedatectl. https://serverfault.com/questions/1024770/ubuntu-20-04-time-sync-problems-and-possibly-incorrect-status-information
|
|
echo "==> Configuring host"
|
|
sed -e 's/^#NTP=/NTP=0.ubuntu.pool.ntp.org 1.ubuntu.pool.ntp.org 2.ubuntu.pool.ntp.org 3.ubuntu.pool.ntp.org/' -i /etc/systemd/timesyncd.conf
|
|
if systemctl is-active ntp; then
|
|
systemctl stop ntp
|
|
apt purge -y ntp
|
|
fi
|
|
timedatectl set-ntp 1
|
|
# mysql follows the system timezone
|
|
timedatectl set-timezone UTC
|
|
|
|
echo "==> Adding sshd configuration warning"
|
|
sed -e '/Port 22/ i # NOTE: Cloudron only supports moving SSH to port 202. See https://docs.cloudron.io/security/#securing-ssh-access' -i /etc/ssh/sshd_config
|
|
|
|
# https://bugs.launchpad.net/ubuntu/+source/base-files/+bug/1701068
|
|
echo "==> Disabling motd news"
|
|
if [ -f "/etc/default/motd-news" ]; then
|
|
sed -i 's/^ENABLED=.*/ENABLED=0/' /etc/default/motd-news
|
|
fi
|
|
|
|
# If privacy extensions are not disabled on server, this breaks IPv6 detection
|
|
# https://bugs.launchpad.net/ubuntu/+source/procps/+bug/1068756
|
|
if [[ ! -f /etc/sysctl.d/99-cloudimg-ipv6.conf ]]; then
|
|
echo "==> Disable temporary address (IPv6)"
|
|
echo -e "# See https://bugs.launchpad.net/ubuntu/+source/procps/+bug/1068756\nnet.ipv6.conf.all.use_tempaddr = 0\nnet.ipv6.conf.default.use_tempaddr = 0\n\n" > /etc/sysctl.d/99-cloudimg-ipv6.conf
|
|
fi
|
|
|
|
# Disable exim4 (1blu.de)
|
|
systemctl stop exim4 || true
|
|
systemctl disable exim4 || true
|
|
|
|
# Disable bind for good measure (on online.net, kimsufi servers these are pre-installed)
|
|
systemctl stop bind9 || true
|
|
systemctl disable bind9 || true
|
|
|
|
# on ovh images dnsmasq seems to run by default
|
|
systemctl stop dnsmasq || true
|
|
systemctl disable dnsmasq || true
|
|
|
|
# on ssdnodes postfix seems to run by default
|
|
systemctl stop postfix || true
|
|
systemctl disable postfix || true
|
|
|
|
# on ubuntu 18.04 and 20.04, this is the default. this requires resolvconf for DNS to work further after the disable
|
|
systemctl stop systemd-resolved || true
|
|
systemctl disable systemd-resolved || true
|
|
|
|
# on vultr, ufw is enabled by default. we have our own firewall
|
|
ufw disable || true
|
|
|
|
# we need unbound to work as this is required for installer.sh to do any DNS requests
|
|
echo -e "server:\n\tinterface: 127.0.0.1\n\tdo-ip6: no" > /etc/unbound/unbound.conf.d/cloudron-network.conf
|
|
systemctl restart unbound
|
|
|
|
# create the yellowtent user. system user has different numeric range, no age and won't show in login/gdm UI
|
|
# the nologin will also disable su/login
|
|
if ! id yellowtent 2>/dev/null; then
|
|
useradd --system --comment "Cloudron Box" --create-home --shell /usr/sbin/nologin yellowtent
|
|
fi
|
|
|
|
# add support user (no password, sudo)
|
|
if ! id cloudron-support 2>/dev/null; then
|
|
useradd --system --comment "Cloudron Support (support@cloudron.io)" --create-home --no-user-group --shell /bin/bash cloudron-support
|
|
fi
|
|
|