#!/bin/bash # This script is run on the base ubuntu. Put things here which are managed by ubuntu # This script is also run after ubuntu upgrade 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) # 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 vendor=$(cat /sys/devices/virtual/dmi/id/sys_vendor || true) if [[ "${vendor}" == "netcup" && ! -L /etc/resolv.conf ]]; then echo "==> Fix netcup DNS setup" nameservers=$(sed -ne 's/nameserver \(.*\)/"\1"/p' /etc/resolv.conf | paste -sd "," -) # json array if lsattr -l /etc/resolv.conf 2>/dev/null | grep -q Immutable; then chattr -i /etc/resolv.conf # this code is also in cloudron-setup. that code can be removed much after 8.0 fi ln -frs /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf netplan set --origin-hint 50-cloud-init "ethernets.eth0.nameservers.addresses=[${nameservers}]" netplan apply # generates /run/systemd/resolve/resolv.conf systemctl restart systemd-resolved fi 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) 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" ;; 24.04) gpg_package="gpg" mysql_package="mysql-server-8.0" ntpd_package="systemd-timesyncd" python_package="python3.12" 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_package \ $ntpd_package \ openssh-server \ python3-magic \ pwgen \ sshfs \ swaks \ tzdata \ unattended-upgrades \ unbound \ unbound-anchor \ unzip \ whois \ 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 # logs of upgrades are at /var/log/apt/history.log and /var/log/unattended-upgrades/unattended-upgrades-dpkg.log # apt-daily-upgrade.service (timer) runs the unattended-upgrades script depending on APT::Periodic::Unattended-Upgrade echo "==> Enabling automatic upgrades" cp /usr/share/unattended-upgrades/20auto-upgrades /etc/apt/apt.conf.d/20auto-upgrades echo "==> Ensuring python $python_package" 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 # 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: Read https://docs.cloudron.io/security/#securing-ssh-access before changing this' -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 vultr, ufw is enabled by default. we have our own firewall ufw disable || true # nfs-common depends on rpcbind which is only needed for NFS v2/v3 . systemctl list-sockets | grep 111 systemctl disable rpcbind.socket rpcbind.service || true systemctl stop rpcbind.socket rpcbind.service || true # Ubuntu 22 has private home directories by default (https://discourse.ubuntu.com/t/private-home-directories-for-ubuntu-21-04-onwards/) sed -e 's/^HOME_MODE\([[:space:]]\+\).*$/HOME_MODE\10755/' -i /etc/login.defs # 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. hardcoding uid helps in restoring if ! id yellowtent 2>/dev/null; then useradd --system --uid 808 --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