diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 21cbce3ab3aa6ba72cc5dbc33b728f7a70fce158..fc0274d8ef1b7e5aaea3141e067c925c45cd5bd3 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -17,9 +17,9 @@ before_script:
   - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
 
 .test: &test
-  image: igwn/base:bullseye
+  image: igwn/base:bookworm
   services:
-    - postgres:13.11
+    - postgres:15.6
     - memcached
   variables:
     AWS_SES_ACCESS_KEY_ID: "fake_aws_id"
@@ -61,11 +61,13 @@ before_script:
     - PYTHON_MAJOR="${PYTHON_VERSION:0:1}"
     - PYTHON="python3"
     # install build requirements
+    - apt-get -y install gnupg
     - sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
     - wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
     - apt-get -yqq update
     - apt-get -o dir::cache::archives="${APT_CACHE_DIR}" install -yqq
           git
+          gnupg
           libldap2-dev
           libsasl2-dev
           libssl-dev
@@ -79,13 +81,13 @@ before_script:
           libfreetype6-dev 
           libxslt-dev
           ${PYTHON}-pip
-          postgresql-13
-          postgresql-client-13
+          postgresql-15
+          postgresql-client-15
           libpq-dev
     # upgrade pip (requirement for lalsuite)
-    - ${PYTHON} -m pip install --upgrade pip
+    - ${PYTHON} -m pip install --upgrade pip --break-system-packages
     # install everything else from pip
-    - ${PYTHON} -m pip install -r requirements.txt
+    - ${PYTHON} -m pip install -r requirements.txt --break-system-packages
     # create logs path required for tests
     - mkdir -pv ../logs/
     # list packages
@@ -111,7 +113,7 @@ before_script:
   tags:
       - executor-docker
 
-test:3.9:
+test:3.11:
   <<: *test
 
 branch_image:
diff --git a/Dockerfile b/Dockerfile
index 6607168a879164a423515e74d9c17aa84c510bef..f989fc2f3a8b694eff23de691ae597fcfb21de8a 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,15 +1,17 @@
-FROM igwn/base:bullseye
+FROM igwn/base:bookworm
 LABEL name="LIGO GraceDB Django application" \
       maintainer="alexander.pace@ligo.org" \
-      date="20230802"
+      date="20240306"
 ARG SETTINGS_MODULE="config.settings.container.dev"
 
 COPY docker/SWITCHaai-swdistrib.gpg /etc/apt/trusted.gpg.d
 COPY docker/backports.pref /etc/apt/preferences.d
-RUN echo 'deb http://deb.debian.org/debian bullseye-backports main' > /etc/apt/sources.list.d/backports.list
-RUN echo 'deb http://apt.postgresql.org/pub/repos/apt bullseye-pgdg main' > /etc/apt/sources.list.d/pgdg.list
+RUN apt-get -y install gnupg
+RUN echo 'deb http://deb.debian.org/debian bookworm-backports main' > /etc/apt/sources.list.d/backports.list
+RUN echo 'deb http://apt.postgresql.org/pub/repos/apt bookworm-pgdg main' > /etc/apt/sources.list.d/pgdg.list
 RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
 RUN apt-get update && \
+    apt-get upgrade && \
     apt-get install --install-recommends --assume-yes \
         apache2 \
         gcc \
@@ -19,6 +21,7 @@ RUN apt-get update && \
         libapache2-mod-shib \
         libapache2-mod-xsendfile \
         libldap2-dev \
+        libldap-2.5-0 \
         libsasl2-dev \
         libsasl2-modules-gssapi-mit \
         libxml2-dev \
@@ -33,11 +36,11 @@ RUN apt-get update && \
         npm \
         osg-ca-certs \
         php \
-        php7.4-pgsql \
-        php7.4-mbstring \
-        postgresql-client-13 \
-        python3.9 \
-        python3.9-dev \
+        php8.2-pgsql \
+        php8.2-mbstring \
+        postgresql-client-15 \
+        python3 \
+        python3-dev \
         python3-libxml2 \
         python3-pip \
         procps \
@@ -46,8 +49,7 @@ RUN apt-get update && \
         libssl-dev \
         swig \
         htop \
-        telnet \
-        vim && \
+        telnet && \
     apt-get clean && \
     curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
     apt-get update && apt-get install --assume-yes yarn && \
@@ -76,7 +78,7 @@ COPY docker/mpm_prefork.conf /etc/apache2/mods-enabled/mpm_prefork.conf
 # Enable mpm_event module:
 
 RUN rm /etc/apache2/mods-enabled/mpm_prefork.*
-RUN rm /etc/apache2/mods-enabled/php7.4.*
+RUN rm /etc/apache2/mods-enabled/php8.2.*
 RUN cp  /etc/apache2/mods-available/mpm_event.* /etc/apache2/mods-enabled/
 
 # Shibboleth configs and certs:
@@ -96,14 +98,14 @@ ADD . /app/gracedb_project
 # install gracedb application itself
 WORKDIR /app/gracedb_project
 RUN bower install --allow-root
-RUN pip3 install --upgrade pip
-RUN pip3 install -r requirements.txt
+RUN pip3 install --upgrade pip --break-system-packages
+RUN pip3 install -r requirements.txt --break-system-packages
 
 # install supervisor from pip
-RUN pip3 install supervisor
+RUN pip3 install supervisor --break-system-packages
 
 # Give pip-installed packages priority over distribution packages
-ENV PYTHONPATH /usr/local/lib/python3.9/dist-packages:$PYTHONPATH
+ENV PYTHONPATH /usr/local/lib/python3.11/dist-packages:$PYTHONPATH
 ENV ENABLE_SHIBD false
 ENV ENABLE_OVERSEER true
 ENV VIRTUAL_ENV /dummy/
@@ -167,5 +169,9 @@ RUN mkdir /app/scitokens_cache && \
     chmod 0750 /app/scitokens_cache
 ENV XDG_CACHE_HOME /app/scitokens_cache
 
+# patch voeventparse for python3.10+:
+RUN sed -i 's/collections.Iterable/collections.abc.Iterable/g' /usr/local/lib/python3.11/dist-packages/voeventparse/voevent.py
+
+
 ENTRYPOINT [ "/usr/local/bin/entrypoint" ]
 CMD ["/usr/local/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"]
diff --git a/config/settings/base.py b/config/settings/base.py
index f8b7b2405a0ba7b8d7aaf89a13e1a3ae3ab541e8..a895c33abac10724dc23af1d04963375d5d09fd6 100644
--- a/config/settings/base.py
+++ b/config/settings/base.py
@@ -1,4 +1,4 @@
-from cloghandler import ConcurrentRotatingFileHandler
+from concurrent_log_handler import ConcurrentRotatingFileHandler
 from datetime import datetime, timedelta
 import os, time, logging
 from os.path import abspath, dirname, join
diff --git a/requirements.txt b/requirements.txt
index 404d9d23a62eea714e3ef297c64a4841c2f06f0f..99a59d82b4fef9bc859e2eca3b077ecedf7232bd 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,7 +1,7 @@
 adc-streaming==2.3.2
 adrf==0.1.2
 aws-xray-sdk==2.12.1
-ConcurrentLogHandler==0.9.1
+concurrent-log-handler==0.9.20
 confluent-kafka==2.3.0
 cryptography==42.0.3
 Django==4.2.10
@@ -9,9 +9,9 @@ django-computedfields==0.2.5
 django-debug-toolbar==4.3.0
 django-extensions==3.2.3
 django-guardian==2.4.0
-django-model-utils==4.2.0
+django-model-utils==4.3.1
 django-postgres-vacuum==2020.12.24
-django-ses==2.3.0
+django-ses==3.2.2
 django-silk==4.2.0
 django-twilio==0.14.3.2
 django-user-sessions==2.0.0
@@ -31,11 +31,11 @@ ipdb==0.13.13
 ipython==8.14.0
 #jwt==1.3.1
 Jinja2==3.1.2
-lalsuite==6.82
+lalsuite==7.21
 python-ligo-lw==1.8.3
 lxml==4.9.3
-matplotlib==3.3.4
-mock==2.0.0
+matplotlib==3.6.2
+mock==4.0.3
 numpy==1.25.2
 packaging==23.1
 phonenumbers==8.13.18
@@ -62,4 +62,4 @@ pytz==2023.3
 pyasn1==0.4.8
 pyasn1-modules==0.2.8
 # pinning setuptools because of 2to3 errors from ConcurrentLogHandler:
-setuptools==54.2.0
+#setuptools==54.2.0