From e50db4204f3d4f4d204a902ad41ac64e7f465f06 Mon Sep 17 00:00:00 2001 From: Joe Heffer <60133133+Joe-Heffer-Shef@users.noreply.github.com> Date: Thu, 12 Feb 2026 12:56:14 +0000 Subject: [PATCH 1/5] perf: Idempotent virtual environment creation Optimise the installation of packages so it's quicker and more efficient. --- scripts/deploy.sh | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/scripts/deploy.sh b/scripts/deploy.sh index d769b69a..e5e94e4c 100644 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -16,9 +16,9 @@ set -e # Options sort_dir="/opt/sort" venv_dir="$sort_dir/venv" -pip="$venv_dir/bin/pip" python_version="python$(cat .python-version | xargs)" python="$venv_dir/bin/python" +pip="$python -m pip" env_file="$sort_dir/.env" node_version=20 django_media_root="/srv/www/sort/uploads/" @@ -29,15 +29,24 @@ sudo locale-gen en_GB sudo locale-gen en_GB.UTF-8 sudo update-locale -# Create Python virtual environment +# Install OS packages (don't ask for user input) +export DEBIAN_FRONTEND=noninteractive +apt-get update -qq +apt-get upgrade -y -qq -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" +apt-get install -y -qq -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" "$python_version" "$python_version-venv" curl + +# Create program files directory mkdir --parents "$sort_dir" -apt update -qq -apt upgrade --yes -qq -apt install --upgrade --yes -qq "$python_version" "$python_version-venv" curl -python3 -m venv "$venv_dir" + +# Create Python virtual environment +# If the virtual environment doesn't already exist, make a new one +if [ ! -f "$venv_dir/pyvenv.cfg" ]; then + python3 -m venv "$venv_dir" +fi # Install the SORT Django app package -$pip install --quiet -r requirements.txt +$pip install --upgrade pip +$pip install --quiet --upgrade -r requirements.txt cp --recursive ./* "$sort_dir/" # Create gunicorn group if it doesn't exist From 675c1c5f1ab4f249653328cf011744e504ec3a90 Mon Sep 17 00:00:00 2001 From: Joe Heffer <60133133+Joe-Heffer-Shef@users.noreply.github.com> Date: Thu, 12 Feb 2026 13:02:22 +0000 Subject: [PATCH 2/5] Update deploy.sh --- scripts/deploy.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/scripts/deploy.sh b/scripts/deploy.sh index e5e94e4c..b8651208 100644 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -30,6 +30,7 @@ sudo locale-gen en_GB.UTF-8 sudo update-locale # Install OS packages (don't ask for user input) +echo "Installing Ubuntu packages..." export DEBIAN_FRONTEND=noninteractive apt-get update -qq apt-get upgrade -y -qq -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" @@ -39,6 +40,7 @@ apt-get install -y -qq -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::=" mkdir --parents "$sort_dir" # Create Python virtual environment +echo "Installing Python packages..." # If the virtual environment doesn't already exist, make a new one if [ ! -f "$venv_dir/pyvenv.cfg" ]; then python3 -m venv "$venv_dir" @@ -50,6 +52,7 @@ $pip install --quiet --upgrade -r requirements.txt cp --recursive ./* "$sort_dir/" # Create gunicorn group if it doesn't exist +echo "Creating system user..." if ! getent group gunicorn > /dev/null 2>&1; then groupadd --system gunicorn fi @@ -71,6 +74,7 @@ curl -fsSL "https://deb.nodesource.com/setup_$node_version.x" -o nodesource_setu sudo -E bash nodesource_setup.sh apt-get install -y --allow-downgrades nodejs="$node_version.*" node --version +npm config set fund false # Upgrade npm to latest stable version # https://github.com/RSE-Sheffield/SORT/issues/494 @@ -79,6 +83,7 @@ npm install -g npm@latest npm --version # Install JavaScript package +echo "Installing front-end packages..." # (Use a sub-shell to avoid changing directory.) (cd "$sort_dir" && npm ci && npm run build) From 09b1e2ccc29085b111d93c0f4521f77513456352 Mon Sep 17 00:00:00 2001 From: Joe Heffer <60133133+Joe-Heffer-Shef@users.noreply.github.com> Date: Thu, 12 Feb 2026 13:05:33 +0000 Subject: [PATCH 3/5] Use uv to install packages faster --- scripts/deploy.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/deploy.sh b/scripts/deploy.sh index b8651208..eefc15f1 100644 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -18,7 +18,7 @@ sort_dir="/opt/sort" venv_dir="$sort_dir/venv" python_version="python$(cat .python-version | xargs)" python="$venv_dir/bin/python" -pip="$python -m pip" +pip="$venv_dir/bin/uv pip" env_file="$sort_dir/.env" node_version=20 django_media_root="/srv/www/sort/uploads/" @@ -47,7 +47,7 @@ if [ ! -f "$venv_dir/pyvenv.cfg" ]; then fi # Install the SORT Django app package -$pip install --upgrade pip +$python -m pip install --upgrade uv pip $pip install --quiet --upgrade -r requirements.txt cp --recursive ./* "$sort_dir/" From 91ddcad73c434a23ad967b9fea364fda764ff468 Mon Sep 17 00:00:00 2001 From: Joe Heffer <60133133+Joe-Heffer-Shef@users.noreply.github.com> Date: Thu, 12 Feb 2026 13:06:45 +0000 Subject: [PATCH 4/5] Update deploy.sh --- scripts/deploy.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/deploy.sh b/scripts/deploy.sh index eefc15f1..389150de 100644 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -18,7 +18,7 @@ sort_dir="/opt/sort" venv_dir="$sort_dir/venv" python_version="python$(cat .python-version | xargs)" python="$venv_dir/bin/python" -pip="$venv_dir/bin/uv pip" +pip="$venv_dir/bin/python -m pip" env_file="$sort_dir/.env" node_version=20 django_media_root="/srv/www/sort/uploads/" @@ -47,7 +47,7 @@ if [ ! -f "$venv_dir/pyvenv.cfg" ]; then fi # Install the SORT Django app package -$python -m pip install --upgrade uv pip +$python -m pip install --upgrade pip $pip install --quiet --upgrade -r requirements.txt cp --recursive ./* "$sort_dir/" From 813de9ecf3ff8b6015cc20c2736215c08e148086 Mon Sep 17 00:00:00 2001 From: Joe Heffer <60133133+Joe-Heffer-Shef@users.noreply.github.com> Date: Thu, 12 Feb 2026 13:27:39 +0000 Subject: [PATCH 5/5] chore: restart gunicorn to load changes --- scripts/deploy.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 389150de..5a659338 100644 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -249,3 +249,7 @@ echo "Checking Django system..." echo "Applying Django migrations..." # shellcheck source=/opt/sort/.env (cd "$sort_dir" && set -a && source "$env_file" && set +a && $python manage.py migrate) + +# Ensure updated code is loaded +echo "Restarting web application service..." +systemctl restart gunicorn.service