diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 20d46c70fd1185365389895665f3f3a71f16eff8..4e4d7ef1e7513ec8cb42392de3b2ff093f3ed8e9 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -9,6 +9,7 @@ stages:
   - validation
   - pre-build
   - build
+  - test
   - example-build
   - example-test
   - example-cleanup
@@ -187,6 +188,45 @@ build_emsdk_image:
           - scripts/bash/emscripten/**/*
         compare_to: 'refs/heads/develop'
 
+build_psql_image:
+  extends: .build_docker_image
+  stage: build
+  variables:
+    BUILD_TARGET: "psql"
+  needs:
+    - build_docker_dind_image
+  rules:
+    - if: $CI_COMMIT_BRANCH == "main" # for branch main run if there were changes on the branch
+      exists:
+        - Dockerfile.psql
+      changes:
+        paths:
+          - Dockerfile.psql
+    - if: $CI_COMMIT_BRANCH !~ /^main$/ # for other branches compare to develop and run if there are diffrences
+      exists:
+        - Dockerfile.psql
+      changes:
+        paths:
+          - Dockerfile.psql
+        compare_to: 'refs/heads/develop'
+
+psql_image_test:
+  stage: test
+  image: registry.gitlab.syncad.com/hive/common-ci-configuration/psql:14-1
+  services:
+    - postgres:14
+  variables:
+    POSTGRES_DB: haf
+    POSTGRES_USER: haf_admin
+    POSTGRES_PASSWORD: password
+    POSTGRES_HOST_AUTH_METHOD: trust
+  script:
+    - |
+      set -e
+      psql --list
+      psql --command="\set"
+  tags:
+    - public-runner-docker    
 
 example_docker_image_builder_job:
   extends: .docker_image_builder_job_template
diff --git a/Dockerfile.psql b/Dockerfile.psql
new file mode 100644
index 0000000000000000000000000000000000000000..184d9355abf5d6016fc41ac524f9a89d530c7f57
--- /dev/null
+++ b/Dockerfile.psql
@@ -0,0 +1,15 @@
+# syntax=docker/dockerfile:1.5
+ARG PAAS_PSQL_VERSION=11251948d5dd4867552f9b9836a9e02110304df5
+FROM ghcr.io/alphagov/paas/psql:${PAAS_PSQL_VERSION} AS psql
+
+RUN <<EOF
+    set -e
+    apk add --no-cache sudo git bash
+    adduser -s /bin/bash -G users -D "haf_admin"
+    echo "haf_admin ALL=(ALL:ALL) NOPASSWD:ALL" >> /etc/sudoers
+EOF
+
+USER haf_admin
+WORKDIR /home/haf_admin
+
+ENTRYPOINT [ "psql" ]
\ No newline at end of file
diff --git a/docker-bake.hcl b/docker-bake.hcl
index e99b3e6c3cd23a417b1df9bed091419ee64ac223..4304ca840bd55066d678f8f49d567c0a294e65e7 100644
--- a/docker-bake.hcl
+++ b/docker-bake.hcl
@@ -3,6 +3,12 @@ variable "CI_COMMIT_SHA" {}
 variable "EMSCRIPTEN_VERSION" {
   default = "3.1.56"
 }
+variable "PSQL_IMAGE_VERSION" {
+  default = "14-1" # After updating tag here, remeber to also update it in job 'psql_image_test'
+}
+variable "PAAS_PSQL_VERSION" {
+  default = "11251948d5dd4867552f9b9836a9e02110304df5"
+}
 variable "BOOST_VERSION_TAG" {
   default = null
 }
@@ -85,4 +91,11 @@ target "emsdk" {
     BOOST_VERSION_TAG = "${BOOST_VERSION_TAG}",
     OPENSSL_VERSION_TAG = "${OPENSSL_VERSION_TAG}"
   }
+}
+
+target "psql" {
+  dockerfile = "Dockerfile.psql"
+  tags = generate-tags("psql", "${PSQL_IMAGE_VERSION}")
+  cache-from = generate-cache-from("psql", "${PSQL_IMAGE_VERSION}")
+  cache-to = generate-cache-to("psql", "${PSQL_IMAGE_VERSION}")
 }
\ No newline at end of file