From 639b404e995cfd70581a7469224fb128ec35ec92 Mon Sep 17 00:00:00 2001 From: Josh Sokol Date: Sat, 19 Sep 2026 22:20:09 -0500 Subject: [PATCH] Speed up Ubuntu install ~3x: explicit packages instead of lamp-server^ lamp-server^ is a tasksel "task" metapackage: it depends on the same apache2/mysql-server packages Debian already installs explicitly in this same function, but also pulls in a broad set of packages beyond the actual LAMP stack (CGI/Perl libraries, etc.) that SimpleRisk has no use for. It also meant installing whatever PHP version Ubuntu's own archive defaults to, then immediately overriding it with the pinned Sury version and swapping Apache's active PHP module - extra work for a result the explicit-install path gets directly. Now that Ubuntu already gets the same Sury PHP8 repo Debian uses (added in a recent commit), Ubuntu can just take the same explicit apache2/mysql-server/phpX.Y install path Debian already proves works, with no lamp-server^ special-casing and no module-swapping dance needed. Test Dockerfiles updated to pre-install the same explicit packages instead of lamp-server^ for the same reason. Verified end-to-end (install -> verify -> uninstall -> verify) on all three supported Ubuntu versions in Docker: 22.04, 24.04, and 26.04, all 28/28 install checks and 13/13 uninstall checks, correct PHP 8.5.10 active on all three. Total time per OS dropped roughly 3x (from ~20-24 minutes to ~7-8 minutes: Docker image build time dropped from minutes to ~30 seconds since there's far less to pre-install, and the script's own install step dropped from ~14 minutes to ~6.5-7 minutes since apt-get dist-upgrade now has a much smaller package set to churn through). Co-Authored-By: Claude Sonnet 5 --- simplerisk-setup.sh | 55 +++++++++-------------- tests/dockerfiles/Dockerfile.ubuntu-22.04 | 28 +++++++----- tests/dockerfiles/Dockerfile.ubuntu-24.04 | 14 +++--- tests/dockerfiles/Dockerfile.ubuntu-26.04 | 14 +++--- 4 files changed, 56 insertions(+), 55 deletions(-) diff --git a/simplerisk-setup.sh b/simplerisk-setup.sh index 6efaa20..a436748 100755 --- a/simplerisk-setup.sh +++ b/simplerisk-setup.sh @@ -515,43 +515,30 @@ setup_ubuntu_debian(){ print_status 'Updating current packages (this may take a bit)...' run_cmd apt-get dist-upgrade -qq --assume-yes - if [ "${OS}" = "${UBUNTU_OSVAR}" ]; then - print_status 'Installing lamp-server...' - run_cmd apt-get install -y 'lamp-server^' - print_status 'Installing cron...' - run_cmd apt-get install -y cron - - # lamp-server^ installs whatever PHP version Ubuntu's own archive - # defaults to for this release (e.g. 8.1 on 22.04), which can be - # older than SimpleRisk's Composer platform requirement. Install the - # pinned Sury version from the repo added above and switch Apache's - # active PHP module to it, without touching the MySQL/Apache - # packages lamp-server^ already installed. - print_status "Installing PHP ${apt_php_version} from Ondrej's repository..." - run_cmd apt-get install -y "php${apt_php_version}" "php${apt_php_version}-mysql" "libapache2-mod-php${apt_php_version}" - for old_mod_file in /etc/apache2/mods-enabled/php*.load; do - [ -e "${old_mod_file}" ] || continue - old_mod=$(basename "${old_mod_file}" .load) - [ "${old_mod}" = "php${apt_php_version}" ] && continue - run_cmd a2dismod "${old_mod}" - done - run_cmd a2enmod "php${apt_php_version}" - else - print_status 'Installing Apache...' - run_cmd apt-get install -y apache2 + # Both OSes install the same explicit package set - Ubuntu previously + # used the lamp-server^ "task" metapackage instead, but that pulls in a + # large set of packages beyond the actual LAMP stack (CGI/Perl libraries, + # etc.) that SimpleRisk has no use for, and still needed the Sury PHP + # package installed and its Apache module swapped in afterward to + # override whatever older PHP lamp-server^ had already defaulted to. + # Installing the same explicit packages Debian already uses (now that + # Ubuntu gets the same Sury repo added above) gets the pinned PHP + # version directly, with nothing to swap out. + print_status 'Installing Apache...' + run_cmd apt-get install -y apache2 - print_status 'Installing MySQL...' - run_cmd apt-get install -y mysql-server + print_status 'Installing MySQL...' + run_cmd apt-get install -y mysql-server - print_status 'Installing PHP...' - run_cmd apt-get install -y "php${apt_php_version:-}" "php${apt_php_version:-}-mysql" "libapache2-mod-php${apt_php_version:-}" + print_status 'Installing PHP...' + run_cmd apt-get install -y "php${apt_php_version:-}" "php${apt_php_version:-}-mysql" "libapache2-mod-php${apt_php_version:-}" - if [ "${OS}" = "${DEBIAN_OSVAR}" ]; then - if [ "${VER}" = '12' ] || [ "${VER}" = '13' ]; then - print_status 'Installing crontab' - run_cmd apt-get install -y cron - fi - fi + if [ "${OS}" = "${UBUNTU_OSVAR}" ]; then + print_status 'Installing cron...' + run_cmd apt-get install -y cron + elif [ "${VER}" = '12' ] || [ "${VER}" = '13' ]; then + print_status 'Installing crontab' + run_cmd apt-get install -y cron fi print_status 'Installing PHP development libraries...' diff --git a/tests/dockerfiles/Dockerfile.ubuntu-22.04 b/tests/dockerfiles/Dockerfile.ubuntu-22.04 index fa42ac9..7635bb7 100644 --- a/tests/dockerfiles/Dockerfile.ubuntu-22.04 +++ b/tests/dockerfiles/Dockerfile.ubuntu-22.04 @@ -14,24 +14,30 @@ RUN apt-get update && \ # MySQL uses native AIO by default, which fails on Docker's overlayfs storage # driver during the post-install data directory initialisation. Pre-creating -# this config disables AIO so that `lamp-server^` installs cleanly. +# this config disables AIO so that mysql-server installs cleanly. RUN mkdir -p /etc/mysql/conf.d && \ printf '[mysqld]\ninnodb_use_native_aio=0\n' > /etc/mysql/conf.d/docker.cnf -# DENY all service operations during the lamp-server^ pre-install below. -# This is the standard Docker pattern: MySQL's post-install script tries to -# start mysqld for initialization and then shut it down — the shutdown step -# times out inside Docker's overlayfs because the process can't be signalled -# cleanly. By denying service actions here, dpkg skips start/stop but still -# initialises the data directory via mysqld --initialize, which is sufficient. +# DENY all service operations during the apache2/mysql-server pre-install +# below. This is the standard Docker pattern: MySQL's post-install script +# tries to start mysqld for initialization and then shut it down — the +# shutdown step times out inside Docker's overlayfs because the process +# can't be signalled cleanly. By denying service actions here, dpkg skips +# start/stop but still initialises the data directory via mysqld +# --initialize, which is sufficient. RUN printf '#!/bin/sh\nexit 101\n' > /usr/sbin/policy-rc.d && \ chmod +x /usr/sbin/policy-rc.d -# Pre-install lamp-server^ so that when the setup script calls -# `apt-get install -y lamp-server^` during the test run, all packages are -# already present and dpkg has nothing to reconfigure. +# Pre-install the same explicit packages simplerisk-setup.sh installs +# (apache2, mysql-server - PHP comes from the Sury repo the script adds +# itself, not from Ubuntu's own archive) so the test run has nothing left +# to fetch. Deliberately not the lamp-server^ metapackage: it pulls in a +# large set of packages beyond the actual LAMP stack (CGI/Perl libraries, +# etc.) the script has no use for, and installs whatever PHP version +# Ubuntu's own archive defaults to, which the script immediately overrides +# via Sury anyway. RUN apt-get update && \ - DEBIAN_FRONTEND=noninteractive apt-get install -y lamp-server^ && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y apache2 mysql-server && \ rm -rf /var/lib/apt/lists/* # Switch back to ALLOW so the setup script can start/stop services normally diff --git a/tests/dockerfiles/Dockerfile.ubuntu-24.04 b/tests/dockerfiles/Dockerfile.ubuntu-24.04 index ea8c31d..37ac24d 100644 --- a/tests/dockerfiles/Dockerfile.ubuntu-24.04 +++ b/tests/dockerfiles/Dockerfile.ubuntu-24.04 @@ -17,15 +17,19 @@ RUN apt-get update && \ RUN mkdir -p /etc/mysql/conf.d && \ printf '[mysqld]\ninnodb_use_native_aio=0\n' > /etc/mysql/conf.d/docker.cnf -# DENY all service operations during the lamp-server^ pre-install below. -# MySQL's post-install shutdown times out inside Docker; denying start/stop -# lets dpkg initialise the data directory without triggering the timeout. +# DENY all service operations during the apache2/mysql-server pre-install +# below. MySQL's post-install shutdown times out inside Docker; denying +# start/stop lets dpkg initialise the data directory without triggering +# the timeout. RUN printf '#!/bin/sh\nexit 101\n' > /usr/sbin/policy-rc.d && \ chmod +x /usr/sbin/policy-rc.d -# Pre-install lamp-server^ so packages are already present for the test run. +# Pre-install the same explicit packages simplerisk-setup.sh installs +# (apache2, mysql-server - PHP comes from the Sury repo the script adds +# itself). Deliberately not the lamp-server^ metapackage: see +# Dockerfile.ubuntu-22.04 for why. RUN apt-get update && \ - DEBIAN_FRONTEND=noninteractive apt-get install -y lamp-server^ && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y apache2 mysql-server && \ rm -rf /var/lib/apt/lists/* # Switch back to ALLOW so the setup script can start/stop services normally. diff --git a/tests/dockerfiles/Dockerfile.ubuntu-26.04 b/tests/dockerfiles/Dockerfile.ubuntu-26.04 index ac2b6d1..a870c8a 100644 --- a/tests/dockerfiles/Dockerfile.ubuntu-26.04 +++ b/tests/dockerfiles/Dockerfile.ubuntu-26.04 @@ -17,15 +17,19 @@ RUN apt-get update && \ RUN mkdir -p /etc/mysql/conf.d && \ printf '[mysqld]\ninnodb_use_native_aio=0\n' > /etc/mysql/conf.d/docker.cnf -# DENY all service operations during the lamp-server^ pre-install below. -# MySQL's post-install shutdown times out inside Docker; denying start/stop -# lets dpkg initialise the data directory without triggering the timeout. +# DENY all service operations during the apache2/mysql-server pre-install +# below. MySQL's post-install shutdown times out inside Docker; denying +# start/stop lets dpkg initialise the data directory without triggering +# the timeout. RUN printf '#!/bin/sh\nexit 101\n' > /usr/sbin/policy-rc.d && \ chmod +x /usr/sbin/policy-rc.d -# Pre-install lamp-server^ so packages are already present for the test run. +# Pre-install the same explicit packages simplerisk-setup.sh installs +# (apache2, mysql-server - PHP comes from the Sury repo the script adds +# itself). Deliberately not the lamp-server^ metapackage: see +# Dockerfile.ubuntu-22.04 for why. RUN apt-get update && \ - DEBIAN_FRONTEND=noninteractive apt-get install -y lamp-server^ && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y apache2 mysql-server && \ rm -rf /var/lib/apt/lists/* # Switch back to ALLOW so the setup script can start/stop services normally.