From 5bd2e0da064a12479532c8fdc2fc28195530a0a3 Mon Sep 17 00:00:00 2001
From: Matthew Baggett <matthew@baggett.me>
Date: Fri, 21 Jun 2024 13:09:24 +0200
Subject: [PATCH 01/19] Potentially this should build.

---
 .actrc                             |  2 ++
 .github/workflows/docker.build.yml | 13 ++++++-------
 .gitignore                         |  2 ++
 Dockerfile                         |  4 ++--
 4 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/.actrc b/.actrc
index fc2d5a8..2a23273 100644
--- a/.actrc
+++ b/.actrc
@@ -9,3 +9,5 @@
 --platform ubuntu-22.04=ghcr.io/catthehacker/ubuntu:act-22.04
 --platform ubuntu-20.04=ghcr.io/catthehacker/ubuntu:act-20.04
 --platform ubuntu-18.04=ghcr.io/catthehacker/ubuntu:act-18.04
+--secret-file=.act.secrets
+--var-file=.act.vars
diff --git a/.github/workflows/docker.build.yml b/.github/workflows/docker.build.yml
index a83faca..285804e 100644
--- a/.github/workflows/docker.build.yml
+++ b/.github/workflows/docker.build.yml
@@ -9,8 +9,7 @@ on:
   workflow_dispatch:
 
 env:
-  PLATFORMS: linux/amd64,linux/arm64
-  CANDIDATE_IMAGE: ghcr.io/benzine-framework/bouncer:build-${{ github.sha }}
+  PLATFORMS: ${{ var.PLATFORMS }}
 
 jobs:
   docker-build:
@@ -21,10 +20,8 @@ jobs:
       - uses: benzine-framework/action-get-datetime@main
       - uses: benzine-framework/action-setup-docker@main
         with:
-          ghcr_user: matthewbaggett
-          ghcr_token: ${{ secrets.GITHUB_TOKEN }}
-          docker_hub_user: matthewbaggett
-          docker_hub_token: ${{ secrets.DOCKER_HUB_TOKEN }}
+          ghcr_user: ${{ vars.SERVICE_ACCOUNT_USERNAME }}
+          ghcr_token: ${{ secrets.SERVICE_ACCOUNT_TOKEN }}
       - name: "Build & Push Candidate Image as ${{ env.CANDIDATE_IMAGE }}"
         uses: docker/build-push-action@v5
         with:
@@ -38,6 +35,8 @@ jobs:
           platforms: ${{ github.actor != 'nektos/act' && env.PLATFORMS || 'linux/amd64' }}
           pull: true
           push: ${{ github.ref == 'refs/heads/main' }}
-          tags: ${{ env.CANDIDATE_IMAGE }}
+          tags: |
+            ${{ vars.LOADBALANCER_DOCKER_IMAGE }}:latest
+            ${{ vars.LOADBALANCER_DOCKER_IMAGE }}:sha-${{ github.sha }}
           cache-from: ${{ env.DOCKER_CACHE_FROM }}
           cache-to: ${{ env.DOCKER_CACHE_TO }}
diff --git a/.gitignore b/.gitignore
index edcef9f..72dede8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,5 @@
 /.php-cs-fixer.cache
 /.github/cache
 /.secrets
+/.act.secrets
+/.act.vars
diff --git a/Dockerfile b/Dockerfile
index d6ea36b..7d74f5a 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -104,5 +104,5 @@ HEALTHCHECK --start-period=3s --interval=3s \
 
 # checkov:skip=CKV_DOCKER_7 This is a test container.
 # checkov:skip=CKV_DOCKER_3 This is a test container.
-FROM alpine as test-box
-RUN apk add --no-cache curl bash
\ No newline at end of file
+FROM alpine AS test-box
+RUN apk add --no-cache curl bash

From 07cc305cc7f5dfd1ee834da4dc46c5bb02e06d4d Mon Sep 17 00:00:00 2001
From: Matthew Baggett <matthew@baggett.me>
Date: Fri, 21 Jun 2024 13:12:29 +0200
Subject: [PATCH 02/19] Potentially this should build.

---
 .github/workflows/docker.build.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.github/workflows/docker.build.yml b/.github/workflows/docker.build.yml
index 285804e..479eeb4 100644
--- a/.github/workflows/docker.build.yml
+++ b/.github/workflows/docker.build.yml
@@ -37,6 +37,7 @@ jobs:
           push: ${{ github.ref == 'refs/heads/main' }}
           tags: |
             ${{ vars.LOADBALANCER_DOCKER_IMAGE }}:latest
+            ${{ vars.LOADBALANCER_DOCKER_IMAGE }}:built-at-${{ env.ATOM }}
             ${{ vars.LOADBALANCER_DOCKER_IMAGE }}:sha-${{ github.sha }}
           cache-from: ${{ env.DOCKER_CACHE_FROM }}
           cache-to: ${{ env.DOCKER_CACHE_TO }}

From 5ddc39b9e9d2d113ec41f4c23e7de058d4c2ee4d Mon Sep 17 00:00:00 2001
From: Matthew Baggett <matthew@baggett.me>
Date: Fri, 21 Jun 2024 13:13:21 +0200
Subject: [PATCH 03/19] Potentially this should build.

---
 .github/workflows/docker.build.yml | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/.github/workflows/docker.build.yml b/.github/workflows/docker.build.yml
index 479eeb4..ec48927 100644
--- a/.github/workflows/docker.build.yml
+++ b/.github/workflows/docker.build.yml
@@ -8,9 +8,6 @@ on:
   workflow_call:
   workflow_dispatch:
 
-env:
-  PLATFORMS: ${{ var.PLATFORMS }}
-
 jobs:
   docker-build:
     name: Build Swarm Load Balancer
@@ -32,7 +29,7 @@ jobs:
             GIT_BUILD_ID=${{ github.ref_name }}
             GIT_COMMIT_MESSAGE=${{ github.event.head_commit.message }}
             BUILD_DATE=${{ env.ATOM }}
-          platforms: ${{ github.actor != 'nektos/act' && env.PLATFORMS || 'linux/amd64' }}
+          platforms: ${{ github.actor != 'nektos/act' && vars.PLATFORMS || 'linux/amd64' }}
           pull: true
           push: ${{ github.ref == 'refs/heads/main' }}
           tags: |

From f228f4adc2a66fa4e5981b9620e135ff50b81e3d Mon Sep 17 00:00:00 2001
From: Matthew Baggett <matthew@baggett.me>
Date: Fri, 21 Jun 2024 13:18:00 +0200
Subject: [PATCH 04/19] Potentially this should build.

---
 .github/workflows/docker.build.yml | 12 ++++++++----
 .github/workflows/docker.clean.yml |  4 ++--
 Dockerfile                         |  2 +-
 3 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/.github/workflows/docker.build.yml b/.github/workflows/docker.build.yml
index ec48927..56dbb7e 100644
--- a/.github/workflows/docker.build.yml
+++ b/.github/workflows/docker.build.yml
@@ -8,6 +8,10 @@ on:
   workflow_call:
   workflow_dispatch:
 
+env:
+  PLATFORMS: ${{ vars.PLATFORMS }}
+  DOCKER_IMAGE: ghcr.io/${{ github.repository_owner }}/${{ github.repository_name }}
+
 jobs:
   docker-build:
     name: Build Swarm Load Balancer
@@ -23,7 +27,7 @@ jobs:
         uses: docker/build-push-action@v5
         with:
           context: .
-          target: bouncer
+          target: loadbalancer
           build-args: |
             GIT_SHA=${{ github.sha }}
             GIT_BUILD_ID=${{ github.ref_name }}
@@ -33,8 +37,8 @@ jobs:
           pull: true
           push: ${{ github.ref == 'refs/heads/main' }}
           tags: |
-            ${{ vars.LOADBALANCER_DOCKER_IMAGE }}:latest
-            ${{ vars.LOADBALANCER_DOCKER_IMAGE }}:built-at-${{ env.ATOM }}
-            ${{ vars.LOADBALANCER_DOCKER_IMAGE }}:sha-${{ github.sha }}
+            ${{ env.DOCKER_IMAGE }}:latest
+            ${{ env.DOCKER_IMAGE }}:date-${{ env.DATE }}
+            ${{ env.DOCKER_IMAGE }}:sha-${{ github.sha }}
           cache-from: ${{ env.DOCKER_CACHE_FROM }}
           cache-to: ${{ env.DOCKER_CACHE_TO }}
diff --git a/.github/workflows/docker.clean.yml b/.github/workflows/docker.clean.yml
index d31c9f1..b46911d 100644
--- a/.github/workflows/docker.clean.yml
+++ b/.github/workflows/docker.clean.yml
@@ -36,9 +36,9 @@ jobs:
         with:
           token: ${{ secrets.GITHUB_TOKEN }}
           organization: ${{ github.repository_owner }}
-          container: bouncer
+          container: ${{ github.repository_name }}
           dry-run: true
-          keep-younger-than: 30 # days
+          keep-younger-than: 90 # days
           keep-last: 2
           prune-untagged: true
           keep-tags-regexes: |
diff --git a/Dockerfile b/Dockerfile
index 7d74f5a..6c12593 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,5 @@
 # checkov:skip=CKV_DOCKER_3 I don't have time for rootless
-FROM ghcr.io/benzine-framework/php:cli-8.2 AS bouncer
+FROM ghcr.io/benzine-framework/php:cli-8.2 AS loadbalancer
 
 LABEL maintainer="Matthew Baggett <matthew@baggett.me>" \
       org.label-schema.vcs-url="https://github.com/benzine-framework/docker-swarm-loadbalancer" \

From ba23c7393a9aa75257088d3c5a330fc52a0bd832 Mon Sep 17 00:00:00 2001
From: Matthew Baggett <matthew@baggett.me>
Date: Fri, 21 Jun 2024 13:18:33 +0200
Subject: [PATCH 05/19] Allow cleanup task to fail.

---
 .github/workflows/docker.clean.yml | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/.github/workflows/docker.clean.yml b/.github/workflows/docker.clean.yml
index b46911d..ecf091f 100644
--- a/.github/workflows/docker.clean.yml
+++ b/.github/workflows/docker.clean.yml
@@ -19,6 +19,7 @@ jobs:
     steps:
       - run: docker login ghcr.io -u ${{ github.repository_owner }} -p ${{ secrets.GITHUB_TOKEN }}
       - uses: vlaurin/action-ghcr-prune@v0.6.0
+        continue-on-error: true
         with:
           token: ${{ secrets.GITHUB_TOKEN }}
           organization: ${{ github.repository_owner }}
@@ -33,6 +34,7 @@ jobs:
     steps:
       - run: docker login ghcr.io -u ${{ github.repository_owner }} -p ${{ secrets.GITHUB_TOKEN }}
       - uses: vlaurin/action-ghcr-prune@v0.6.0
+        continue-on-error: true
         with:
           token: ${{ secrets.GITHUB_TOKEN }}
           organization: ${{ github.repository_owner }}

From 4695cba98cc1b0cde78aff22e08e92d649afc996 Mon Sep 17 00:00:00 2001
From: Matthew Baggett <matthew@baggett.me>
Date: Fri, 21 Jun 2024 13:24:30 +0200
Subject: [PATCH 06/19] Potentially this should build.

---
 .github/workflows/docker.build.yml    |  3 +--
 .github/workflows/docker.clean.yml    |  6 +++---
 .github/workflows/docker.release.yml  | 22 ++++++----------------
 .github/workflows/docker.validate.yml |  8 ++++----
 .github/workflows/php.check.yml       |  4 ++--
 .github/workflows/tag.release.yml     |  2 +-
 .github/workflows/tests.yml           |  2 +-
 .github/workflows/trunk.cache.yml     |  2 +-
 .github/workflows/trunk.check.yml     |  2 +-
 .github/workflows/trunk.upgrade.yml   |  2 +-
 10 files changed, 21 insertions(+), 32 deletions(-)

diff --git a/.github/workflows/docker.build.yml b/.github/workflows/docker.build.yml
index 56dbb7e..8e348df 100644
--- a/.github/workflows/docker.build.yml
+++ b/.github/workflows/docker.build.yml
@@ -15,7 +15,7 @@ env:
 jobs:
   docker-build:
     name: Build Swarm Load Balancer
-    runs-on: ubuntu-latest
+    runs-on: ${{ vars.RUNS_ON }}
     steps:
       - uses: benzine-framework/action-setup-php@main
       - uses: benzine-framework/action-get-datetime@main
@@ -37,7 +37,6 @@ jobs:
           pull: true
           push: ${{ github.ref == 'refs/heads/main' }}
           tags: |
-            ${{ env.DOCKER_IMAGE }}:latest
             ${{ env.DOCKER_IMAGE }}:date-${{ env.DATE }}
             ${{ env.DOCKER_IMAGE }}:sha-${{ github.sha }}
           cache-from: ${{ env.DOCKER_CACHE_FROM }}
diff --git a/.github/workflows/docker.clean.yml b/.github/workflows/docker.clean.yml
index ecf091f..c4e3bfd 100644
--- a/.github/workflows/docker.clean.yml
+++ b/.github/workflows/docker.clean.yml
@@ -15,7 +15,7 @@ on:
 jobs:
   cleanup-delete-candidate-image:
     name: Delete candidate image
-    runs-on: ubuntu-latest
+    runs-on: ${{ vars.RUNS_ON }}
     steps:
       - run: docker login ghcr.io -u ${{ github.repository_owner }} -p ${{ secrets.GITHUB_TOKEN }}
       - uses: vlaurin/action-ghcr-prune@v0.6.0
@@ -23,14 +23,14 @@ jobs:
         with:
           token: ${{ secrets.GITHUB_TOKEN }}
           organization: ${{ github.repository_owner }}
-          container: bouncer
+          container: ${{ github.repository_name }}
           dry-run: true
           prune-tags-regexes: |
             ^build-${{ github.sha }}$
 
   cleanup-untagged-images:
     name: Delete untagged images
-    runs-on: ubuntu-latest
+    runs-on: ${{ vars.RUNS_ON }}
     steps:
       - run: docker login ghcr.io -u ${{ github.repository_owner }} -p ${{ secrets.GITHUB_TOKEN }}
       - uses: vlaurin/action-ghcr-prune@v0.6.0
diff --git a/.github/workflows/docker.release.yml b/.github/workflows/docker.release.yml
index 5722175..8fcd192 100644
--- a/.github/workflows/docker.release.yml
+++ b/.github/workflows/docker.release.yml
@@ -9,26 +9,16 @@ on:
   workflow_dispatch:
 
 env:
-  CANDIDATE_IMAGE: ghcr.io/benzine-framework/bouncer:build-${{ github.sha }}
-  RELEASE_IMAGE_GHCR: ghcr.io/benzine-framework/bouncer:latest
-  RELEASE_IMAGE_DOCKER: benzine/bouncer:latest
+  CANDIDATE_IMAGE: ghcr.io/${{ github.repository_owner }}/${{ github.repository_name }}:sha-${{ github.sha }}
+  RELEASE_IMAGE: ghcr.io/${{ github.repository_owner }}/${{ github.repository_name }}:latest
 
 jobs:
   release-ghcr:
     name: GHCR
-    runs-on: ubuntu-latest
+    runs-on: ${{ vars.RUNS_ON }}
     steps:
-      - run: docker login ghcr.io -u ${{ github.repository_owner }} -p ${{ secrets.GITHUB_TOKEN }}
+      - run: docker login ghcr.io -u ${{ vars.SERVICE_ACCOUNT_USERNAME }} -p ${{ secrets.SERVICE_ACCOUNT_TOKEN }}
       - run: docker pull ${{ env.CANDIDATE_IMAGE }}
-      - run: docker tag ${{ env.CANDIDATE_IMAGE }} ${{ env.RELEASE_IMAGE_GHCR }}
-      - run: docker push ${{ env.RELEASE_IMAGE_GHCR }}
+      - run: docker tag ${{ env.CANDIDATE_IMAGE }} ${{ env.RELEASE_IMAGE }}
+      - run: docker push ${{ env.RELEASE_IMAGE }}
 
-  release-docker-hub:
-    name: Docker Hub
-    runs-on: ubuntu-latest
-    steps:
-      - run: docker login ghcr.io -u ${{ github.repository_owner }} -p ${{ secrets.GITHUB_TOKEN }}
-      - run: docker login docker.io -u matthewbaggett -p ${{ secrets.DOCKER_HUB_TOKEN }}
-      - run: docker pull ${{ env.CANDIDATE_IMAGE }}
-      - run: docker tag ${{ env.CANDIDATE_IMAGE }} ${{ env.RELEASE_IMAGE_DOCKER }}
-      - run: docker push ${{ env.RELEASE_IMAGE_DOCKER }}
diff --git a/.github/workflows/docker.validate.yml b/.github/workflows/docker.validate.yml
index b95d432..d1d49d5 100644
--- a/.github/workflows/docker.validate.yml
+++ b/.github/workflows/docker.validate.yml
@@ -13,12 +13,12 @@ on:
       - completed
 
 env:
-  CANDIDATE_IMAGE: ghcr.io/benzine-framework/bouncer:build-${{ github.sha }}
+  CANDIDATE_IMAGE: ghcr.io/${{ github.repository_owner }}/${{ github.repository_name }}:hash-${{ github.sha }}
 
 jobs:
   validate-install-report:
     name: Run Install Report
-    runs-on: ubuntu-latest
+    runs-on: ${{ vars.RUNS_ON }}
     steps:
       - run: docker login ghcr.io -u ${{ github.repository_owner }} -p ${{ secrets.GITHUB_TOKEN }}
       - name: "Pull Candidate Image"
@@ -27,7 +27,7 @@ jobs:
         run: docker run --rm ${{ env.CANDIDATE_IMAGE }} /usr/bin/install-report
   validate-dive-report:
     name: Run Dive
-    runs-on: ubuntu-latest
+    runs-on: ${{ vars.RUNS_ON }}
     steps:
       - run: docker login ghcr.io -u ${{ github.repository_owner }} -p ${{ secrets.GITHUB_TOKEN }}
       - name: "Pull Candidate Image"
@@ -48,7 +48,7 @@ jobs:
           config-file: ${{ github.workspace }}/.dive-ci.yml
   validate-vulnerability-report:
     name: Run Trivy
-    runs-on: ubuntu-latest
+    runs-on: ${{ vars.RUNS_ON }}
     steps:
       - run: docker login ghcr.io -u ${{ github.repository_owner }} -p ${{ secrets.GITHUB_TOKEN }}
       - name: "Pull Candidate Image"
diff --git a/.github/workflows/php.check.yml b/.github/workflows/php.check.yml
index 38442eb..da71cf1 100644
--- a/.github/workflows/php.check.yml
+++ b/.github/workflows/php.check.yml
@@ -10,7 +10,7 @@ on:
 jobs:
   php-stan:
     name: PHPStan
-    runs-on: ubuntu-latest
+    runs-on: ${{ vars.RUNS_ON }}
     permissions:
       checks: write # To post annotations
       contents: read # For repo checkout
@@ -20,7 +20,7 @@ jobs:
 
   php-cs-fixer:
     name: PHP-CS-Fixer
-    runs-on: ubuntu-latest
+    runs-on: ${{ vars.RUNS_ON }}
     permissions:
       checks: write # For trunk to post annotations
       contents: read # For repo checkout
diff --git a/.github/workflows/tag.release.yml b/.github/workflows/tag.release.yml
index 2dc83cf..1a26043 100644
--- a/.github/workflows/tag.release.yml
+++ b/.github/workflows/tag.release.yml
@@ -17,7 +17,7 @@ env:
 jobs:
   build-tagged-release:
     name: Build Swarm Load Balancer
-    runs-on: ubuntu-latest
+    runs-on: ${{ vars.RUNS_ON }}
     if: startsWith(github.ref, 'refs/tags/v')
     steps:
       - run: echo "Building Tagged Release ${{ env.TAG_IMAGE_GHCR }} & ${{ env.TAG_IMAGE_DOCKER }}"
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 64204d7..67960e3 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -10,7 +10,7 @@ on:
 jobs:
   test-integration:
     name: Integration Tests
-    runs-on: ubuntu-latest
+    runs-on: ${{ vars.RUNS_ON }}
     steps:
       - uses: actions/checkout@v4
       - name: Start Bouncer
diff --git a/.github/workflows/trunk.cache.yml b/.github/workflows/trunk.cache.yml
index 51ce2f6..8d25d9a 100644
--- a/.github/workflows/trunk.cache.yml
+++ b/.github/workflows/trunk.cache.yml
@@ -22,7 +22,7 @@ concurrency:
 jobs:
   trunk-cache:
     name: Trunk Cache
-    runs-on: ubuntu-latest
+    runs-on: ${{ vars.RUNS_ON }}
     permissions:
       actions: write
     steps:
diff --git a/.github/workflows/trunk.check.yml b/.github/workflows/trunk.check.yml
index 564aeef..5e72b8c 100644
--- a/.github/workflows/trunk.check.yml
+++ b/.github/workflows/trunk.check.yml
@@ -10,7 +10,7 @@ on:
 jobs:
   trunk-check:
     name: Trunk Check Runner
-    runs-on: ubuntu-latest
+    runs-on: ${{ vars.RUNS_ON }}
     permissions:
       checks: write # For trunk to post annotations
       contents: read # For repo checkout
diff --git a/.github/workflows/trunk.upgrade.yml b/.github/workflows/trunk.upgrade.yml
index c8093aa..a0f4dd4 100644
--- a/.github/workflows/trunk.upgrade.yml
+++ b/.github/workflows/trunk.upgrade.yml
@@ -20,7 +20,7 @@ concurrency:
 jobs:
   trunk-upgrade:
     name: Upgrade Trunk
-    runs-on: ubuntu-latest
+    runs-on: ${{ vars.RUNS_ON }}
     permissions:
       contents: write # For trunk to create PRs
       pull-requests: write # For trunk to create PRs

From 32b18992eed5ee5d4d1e6110ac0fbff6a13d5652 Mon Sep 17 00:00:00 2001
From: Matthew Baggett <matthew@baggett.me>
Date: Fri, 21 Jun 2024 13:36:56 +0200
Subject: [PATCH 07/19] Potentially this should build.

---
 .github/workflows/docker.release.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/docker.release.yml b/.github/workflows/docker.release.yml
index 8fcd192..92d7bea 100644
--- a/.github/workflows/docker.release.yml
+++ b/.github/workflows/docker.release.yml
@@ -14,7 +14,7 @@ env:
 
 jobs:
   release-ghcr:
-    name: GHCR
+    name: GitHub Container Registry
     runs-on: ${{ vars.RUNS_ON }}
     steps:
       - run: docker login ghcr.io -u ${{ vars.SERVICE_ACCOUNT_USERNAME }} -p ${{ secrets.SERVICE_ACCOUNT_TOKEN }}

From c0dc2dad38543479ca29538eaa2f618dd39828db Mon Sep 17 00:00:00 2001
From: Matthew Baggett <matthew@baggett.me>
Date: Fri, 21 Jun 2024 13:40:16 +0200
Subject: [PATCH 08/19] Potentially this should build.

---
 .github/workflows/docker.release.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/docker.release.yml b/.github/workflows/docker.release.yml
index 92d7bea..f9c9c75 100644
--- a/.github/workflows/docker.release.yml
+++ b/.github/workflows/docker.release.yml
@@ -10,7 +10,7 @@ on:
 
 env:
   CANDIDATE_IMAGE: ghcr.io/${{ github.repository_owner }}/${{ github.repository_name }}:sha-${{ github.sha }}
-  RELEASE_IMAGE: ghcr.io/${{ github.repository_owner }}/${{ github.repository_name }}:latest
+  RELEASE_IMAGE:   ghcr.io/${{ github.repository_owner }}/${{ github.repository_name }}:latest
 
 jobs:
   release-ghcr:

From 15fc1956994acaed0ec6a6820c8012395f06f56b Mon Sep 17 00:00:00 2001
From: Matthew Baggett <matthew@baggett.me>
Date: Fri, 21 Jun 2024 13:53:36 +0200
Subject: [PATCH 09/19] Potentially this should build.

---
 .github/workflows/tests.yml | 4 ++--
 docker-compose.yml          | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 67960e3..ab1e11d 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -13,10 +13,10 @@ jobs:
     runs-on: ${{ vars.RUNS_ON }}
     steps:
       - uses: actions/checkout@v4
-      - name: Start Bouncer
+      - name: Start Loadbalancer
         run: |
           rm -f docker-compose.override.yml
-          docker compose up --build -d bouncer test-box
+          docker compose up --build -d loadbalancer test-box
       - name: Give it a moment...
         run: sleep 5
       - name: No-SSL Connect to Web A
diff --git a/docker-compose.yml b/docker-compose.yml
index ff22836..010e8d7 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -2,10 +2,10 @@ networks:
   default:
 
 services:
-  bouncer:
+  loadbalancer:
     build:
       context: .
-      target: bouncer
+      target: loadbalancer
       additional_contexts:
         - php:cli=docker-image://ghcr.io/benzine-framework/php:cli-8.2
     volumes:

From 65326002633ee5a9dbc926da2ce53804d416dd95 Mon Sep 17 00:00:00 2001
From: Matthew Baggett <matthew@baggett.me>
Date: Fri, 21 Jun 2024 14:00:02 +0200
Subject: [PATCH 10/19] Potentially this should build.

---
 .github/workflows/docker.build.yml   | 2 +-
 .github/workflows/docker.clean.yml   | 2 +-
 .github/workflows/docker.release.yml | 4 ++--
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/.github/workflows/docker.build.yml b/.github/workflows/docker.build.yml
index 8e348df..ad38c8d 100644
--- a/.github/workflows/docker.build.yml
+++ b/.github/workflows/docker.build.yml
@@ -10,7 +10,7 @@ on:
 
 env:
   PLATFORMS: ${{ vars.PLATFORMS }}
-  DOCKER_IMAGE: ghcr.io/${{ github.repository_owner }}/${{ github.repository_name }}
+  DOCKER_IMAGE: ghcr.io/${{ github.repository }}
 
 jobs:
   docker-build:
diff --git a/.github/workflows/docker.clean.yml b/.github/workflows/docker.clean.yml
index c4e3bfd..b432a4e 100644
--- a/.github/workflows/docker.clean.yml
+++ b/.github/workflows/docker.clean.yml
@@ -38,7 +38,7 @@ jobs:
         with:
           token: ${{ secrets.GITHUB_TOKEN }}
           organization: ${{ github.repository_owner }}
-          container: ${{ github.repository_name }}
+          container: docker-swarm-loadbalancer
           dry-run: true
           keep-younger-than: 90 # days
           keep-last: 2
diff --git a/.github/workflows/docker.release.yml b/.github/workflows/docker.release.yml
index f9c9c75..ec06fc6 100644
--- a/.github/workflows/docker.release.yml
+++ b/.github/workflows/docker.release.yml
@@ -9,8 +9,8 @@ on:
   workflow_dispatch:
 
 env:
-  CANDIDATE_IMAGE: ghcr.io/${{ github.repository_owner }}/${{ github.repository_name }}:sha-${{ github.sha }}
-  RELEASE_IMAGE:   ghcr.io/${{ github.repository_owner }}/${{ github.repository_name }}:latest
+  CANDIDATE_IMAGE: ghcr.io/${{ github.repository }}:sha-${{ github.sha }}
+  RELEASE_IMAGE:   ghcr.io/${{ github.repository }}:latest
 
 jobs:
   release-ghcr:

From 4e684ef0fa24ec392981067cd26e7f2be645c375 Mon Sep 17 00:00:00 2001
From: Matthew Baggett <matthew@baggett.me>
Date: Fri, 21 Jun 2024 16:20:55 +0200
Subject: [PATCH 11/19] Generate self-signed certs instead of pre-baked example
 ones.

---
 Dockerfile                           | 15 +++++++++++++--
 self-signed-certificates/example.crt | 22 ----------------------
 self-signed-certificates/example.key | 28 ----------------------------
 3 files changed, 13 insertions(+), 52 deletions(-)
 delete mode 100644 self-signed-certificates/example.crt
 delete mode 100644 self-signed-certificates/example.key

diff --git a/Dockerfile b/Dockerfile
index 6c12593..6d405aa 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -4,6 +4,8 @@ FROM ghcr.io/benzine-framework/php:cli-8.2 AS loadbalancer
 LABEL maintainer="Matthew Baggett <matthew@baggett.me>" \
       org.label-schema.vcs-url="https://github.com/benzine-framework/docker-swarm-loadbalancer" \
       org.opencontainers.image.source="https://github.com/benzine-framework/docker-swarm-loadbalancer"
+# Allow overriding the default SSL cert subject
+ARG DEFAULT_SSL_CERT_SUBJECT="/C=XX/ST=StateName/L=CityName/O=CompanyName/OU=CompanySectionName/CN=CommonNameOrHostname"
 
 SHELL ["/bin/bash", "-o", "pipefail", "-c"]
 
@@ -37,8 +39,17 @@ RUN apt-get -qq update && \
     apt-get clean && \
     rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /var/lib/dpkg/status.old /var/cache/debconf/templates.dat /var/log/dpkg.log /var/log/lastlog /var/log/apt/*.log
 
-# copy some default self-signed certs
-COPY self-signed-certificates /certs
+# Generate some default self-signed certs
+RUN mkdir /certs && \
+    openssl req \
+      -x509 \
+    -newkey rsa:4096 \
+    -keyout /certs/example.key \
+    -out /certs/example.crt \
+    -sha256 \
+    -days 3650 \
+    -nodes \
+    -subj "${DEFAULT_SSL_CERT_SUBJECT}"
 
 # Install runits for services
 COPY nginx.runit /etc/service/nginx/run
diff --git a/self-signed-certificates/example.crt b/self-signed-certificates/example.crt
deleted file mode 100644
index 58e206b..0000000
--- a/self-signed-certificates/example.crt
+++ /dev/null
@@ -1,22 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDnTCCAoWgAwIBAgIUJYUUmBQ2/ERZ7xinAJzVhiFWViYwDQYJKoZIhvcNAQEL
-BQAwXTELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB0Zsb3JpZGExDjAMBgNVBAcMBU1p
-YW1pMRYwFAYDVQQKDA1FeGFtcGxlIEdyb3VwMRQwEgYDVQQDDAtleGFtcGxlLm9y
-ZzAgFw0yMTA1MzAxNzU4MzlaGA8yMTIxMDUwNjE3NTgzOVowXTELMAkGA1UEBhMC
-VVMxEDAOBgNVBAgMB0Zsb3JpZGExDjAMBgNVBAcMBU1pYW1pMRYwFAYDVQQKDA1F
-eGFtcGxlIEdyb3VwMRQwEgYDVQQDDAtleGFtcGxlLm9yZzCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBANJa9OcoCW+mej8qDMCCTGnqMAuUqBIj1wZLgOdT
-4DHriq1vKi1JLsDZkYekrCq/sfWo97kDXsdK6YN4+mua5EN4cTG3mSpal+RgLTc2
-HMKHFfgzPzIN/n5AEqzdVZb5j0P3LoUNH687AlplW0BB+K64Gw//2KPx0Q8Fkhq2
-I97V8SRpqds78PJHzhfuZNs/AUFpFXnYHJyO2Q63Btq2aoTMQyoLDRBBxin70II2
-6Cjh3k6EhMY+HuYS1AjfI8cDQw289asJBLa6zPoD0VGaGNfCSrOzxrUqfhIoOkuY
-W7rOIsK6rSSu1neSKQIiOLVjQxifxrQIIKTQhRiSplgD9LUCAwEAAaNTMFEwHQYD
-VR0OBBYEFADK74w4AGeETK72k/htsnol9ye0MB8GA1UdIwQYMBaAFADK74w4AGeE
-TK72k/htsnol9ye0MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB
-AKElv0xx95lD2leXEOfD6DKakrzuE8lONmcrkfjehTOd7jbqblnj8u1DCWytwB8P
-gEr5FXve0iy7avGoNkU33MufbbQokAMoTs/IA+rwMfv0unupT1aYN8TTEXJJ100j
-MXBsq/PvNkBNwkBcXjYHHsVjdM3bptbaw9A4V9opfMjQXAY5wuk3rBBm8On2rJKy
-Qksh/uLoe8wbZ5dvLv9oc9sRpIilaSy8TcbrHkDIaWA5WCdVFfcayDGYdjhCYLGW
-tj/48g0THvJv6JvVYwFJqTM690YUSlxaOHQE2ZneLytocVyAdEL2MMldRezvtI1z
-1OXOia2G7koNYtS7cD8G1IM=
------END CERTIFICATE-----
diff --git a/self-signed-certificates/example.key b/self-signed-certificates/example.key
deleted file mode 100644
index 3c63e83..0000000
--- a/self-signed-certificates/example.key
+++ /dev/null
@@ -1,28 +0,0 @@
------BEGIN PRIVATE KEY-----
-MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDSWvTnKAlvpno/
-KgzAgkxp6jALlKgSI9cGS4DnU+Ax64qtbyotSS7A2ZGHpKwqv7H1qPe5A17HSumD
-ePprmuRDeHExt5kqWpfkYC03NhzChxX4Mz8yDf5+QBKs3VWW+Y9D9y6FDR+vOwJa
-ZVtAQfiuuBsP/9ij8dEPBZIatiPe1fEkaanbO/DyR84X7mTbPwFBaRV52BycjtkO
-twbatmqEzEMqCw0QQcYp+9CCNugo4d5OhITGPh7mEtQI3yPHA0MNvPWrCQS2usz6
-A9FRmhjXwkqzs8a1Kn4SKDpLmFu6ziLCuq0krtZ3kikCIji1Y0MYn8a0CCCk0IUY
-kqZYA/S1AgMBAAECggEARqfQjPgwuzTi6OZ55AugGQ9VVf53uagaKH4h7RGKQ5pH
-OVwWgaGMN7CcpkAUqEM9RjOcCaPtKOmrp8Jx8sTTGSqScs2lf8lwLYB0j4/4dwqi
-wXyNJIX4znU9EJ1Di3OFwKF9Gam/077xWmWjEeFW43DpfiVEokSuIOqRGbHGOKlt
-2ygHJu+rmPapEPyYqSWQnAkYX0DW/KCAGiyIAqph/SgrCDTdsxbNOa2OwDygPC54
-7xW0yCduvgFLh9bxedF8iifzRkPw710cxyqVsYwHiwugDgxL4NiK1DlWbpBimab5
-ocye9+ElymMZ8DTjpA85cXny/TtoqJfqTs1YGYgrvQKBgQDwHnAcY0BjQ4o+ZneG
-oqBJeQ8KCMRU4pEIa5QOOeUr46gtiPIfcFh/BJUHQ61qk7gcJj5BV2GXNS7+m+sU
-RC3Usblm9twwxZn7mfoOk4z9NEfBI2MXmbB8ARjAQBCost+3KQAoSIL1AyDKiAlY
-2JfMt+73+kwUsg7b9g0pYIfn/wKBgQDgRJPlSIxJs2mbjzUwVBAeslct2W0dehrh
-V0sXPxEhJHWX6P343vLqRHRsKgqhbU/vy+3JrIS9ftwGKcmb+Y9EJgYrR+D3ZYzs
-idSOsunSspJgbCG5mHE1VQhr8IpHeCkuSt22aFErLfsjzXWZIewK2tqZN1QUjdc5
-EJHOD4UDSwKBgFYRYvgZ72NlOzFAw0kkE7YiSWy8Vbtjdr8A6JHs2KNRt9+Sfc8d
-Eut8dfqjnI5eIpkccCY1rwpnCtBCjRG3moHprl4k0Co/OgGAYKxG4TuFOM8W4xb7
-hNH+BqQqko4Vh7D8Zk0KKL6v/1n5RvhssoSzzVlfg1PLux3G5VLWggB7AoGAAP/N
-OORN27Y07kCBGCoHuFtLECU72znEDOT6rKvXQ7KJ45diKk2z/182tZSqX3XBOWxL
-Lu7Z2I5MJKri/xLplIAm3uJ/GhsVuagTjl81s36gMFXLAKyxNG+gjfqQYykh5dbn
-jfyBABRAXjR4JaqFBrda6fvZIA5RuytbuvNOwGkCgYAUs82tDGLiqyMPd2jgYS3k
-aL62f0TLKHjmTCmRca7IqXbqcMbAj+LgAHI2HfCfjc4KWd68ZGRLcpDlehMcis1f
-PQi3HW+2b9dAZX6+HAIGiVem//ckYXgUza4MMosh0hXquGs1yJ/VNWC+HPIHrj6X
-9tvvvHnGKav329q/Z/8K/A==
------END PRIVATE KEY-----

From 57c9ddd73e44acd8dffd0b3f09bc44c3da5dfefe Mon Sep 17 00:00:00 2001
From: Matthew Baggett <matthew@baggett.me>
Date: Fri, 21 Jun 2024 16:21:10 +0200
Subject: [PATCH 12/19] Fixup

---
 .github/workflows/docker.build.yml    |  2 ++
 .github/workflows/docker.clean.yml    |  2 +-
 .github/workflows/docker.release.yml  |  3 +--
 .github/workflows/docker.validate.yml |  2 +-
 Dockerfile                            | 27 ++++++++++++++-------------
 docker-compose.override.yml           |  2 +-
 docker-compose.yml                    |  4 ++++
 7 files changed, 24 insertions(+), 18 deletions(-)

diff --git a/.github/workflows/docker.build.yml b/.github/workflows/docker.build.yml
index ad38c8d..07bd80e 100644
--- a/.github/workflows/docker.build.yml
+++ b/.github/workflows/docker.build.yml
@@ -29,6 +29,8 @@ jobs:
           context: .
           target: loadbalancer
           build-args: |
+            MAINTAINER=${{ vars.PUBLIC_MAINTAINER || 'Matthew Baggett <matthew@baggett.me>' }}
+            SOURCE_URL="https://github.com/${{ github.repository }}"
             GIT_SHA=${{ github.sha }}
             GIT_BUILD_ID=${{ github.ref_name }}
             GIT_COMMIT_MESSAGE=${{ github.event.head_commit.message }}
diff --git a/.github/workflows/docker.clean.yml b/.github/workflows/docker.clean.yml
index b432a4e..18cf19d 100644
--- a/.github/workflows/docker.clean.yml
+++ b/.github/workflows/docker.clean.yml
@@ -23,7 +23,7 @@ jobs:
         with:
           token: ${{ secrets.GITHUB_TOKEN }}
           organization: ${{ github.repository_owner }}
-          container: ${{ github.repository_name }}
+          container: docker-swarm-loadbalancer
           dry-run: true
           prune-tags-regexes: |
             ^build-${{ github.sha }}$
diff --git a/.github/workflows/docker.release.yml b/.github/workflows/docker.release.yml
index ec06fc6..dbec1e0 100644
--- a/.github/workflows/docker.release.yml
+++ b/.github/workflows/docker.release.yml
@@ -10,7 +10,7 @@ on:
 
 env:
   CANDIDATE_IMAGE: ghcr.io/${{ github.repository }}:sha-${{ github.sha }}
-  RELEASE_IMAGE:   ghcr.io/${{ github.repository }}:latest
+  RELEASE_IMAGE: ghcr.io/${{ github.repository }}:latest
 
 jobs:
   release-ghcr:
@@ -21,4 +21,3 @@ jobs:
       - run: docker pull ${{ env.CANDIDATE_IMAGE }}
       - run: docker tag ${{ env.CANDIDATE_IMAGE }} ${{ env.RELEASE_IMAGE }}
       - run: docker push ${{ env.RELEASE_IMAGE }}
-
diff --git a/.github/workflows/docker.validate.yml b/.github/workflows/docker.validate.yml
index d1d49d5..9855777 100644
--- a/.github/workflows/docker.validate.yml
+++ b/.github/workflows/docker.validate.yml
@@ -13,7 +13,7 @@ on:
       - completed
 
 env:
-  CANDIDATE_IMAGE: ghcr.io/${{ github.repository_owner }}/${{ github.repository_name }}:hash-${{ github.sha }}
+  CANDIDATE_IMAGE: ghcr.io/${{ github.repository }}:hash-${{ github.sha }}
 
 jobs:
   validate-install-report:
diff --git a/Dockerfile b/Dockerfile
index 6d405aa..a2d7e2e 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,11 +1,22 @@
 # checkov:skip=CKV_DOCKER_3 I don't have time for rootless
 FROM ghcr.io/benzine-framework/php:cli-8.2 AS loadbalancer
 
-LABEL maintainer="Matthew Baggett <matthew@baggett.me>" \
-      org.label-schema.vcs-url="https://github.com/benzine-framework/docker-swarm-loadbalancer" \
-      org.opencontainers.image.source="https://github.com/benzine-framework/docker-swarm-loadbalancer"
 # Allow overriding the default SSL cert subject
 ARG DEFAULT_SSL_CERT_SUBJECT="/C=XX/ST=StateName/L=CityName/O=CompanyName/OU=CompanySectionName/CN=CommonNameOrHostname"
+ARG PUBLIC_MAINTAINER="Matthew Baggett <matthew@baggett.me>"
+ARG SOURCE_URL="https://github.com/benzine-framework/docker-swarm-loadbalancer"
+ARG BUILD_DATE
+ARG GIT_SHA
+ARG GIT_BUILD_ID
+ARG GIT_COMMIT_MESSAGE
+ENV BUILD_DATE=${BUILD_DATE} \
+    GIT_SHA=${GIT_SHA} \
+    GIT_BUILD_ID=${GIT_BUILD_ID} \
+    GIT_COMMIT_MESSAGE=${GIT_COMMIT_MESSAGE}
+
+LABEL maintainer="${PUBLIC_MAINTAINER}" \
+      org.label-schema.vcs-url="${SOURCE_URL}" \
+      org.opencontainers.image.source="${SOURCE_URL}"
 
 SHELL ["/bin/bash", "-o", "pipefail", "-c"]
 
@@ -83,16 +94,6 @@ COPY src /app/src
 COPY templates /app/templates
 RUN chmod +x /app/bin/bouncer
 
-# stuff some envs from build
-ARG BUILD_DATE
-ARG GIT_SHA
-ARG GIT_BUILD_ID
-ARG GIT_COMMIT_MESSAGE
-ENV BUILD_DATE=${BUILD_DATE} \
-    GIT_SHA=${GIT_SHA} \
-    GIT_BUILD_ID=${GIT_BUILD_ID} \
-    GIT_COMMIT_MESSAGE=${GIT_COMMIT_MESSAGE}
-
 # Create some volumes for logs and certs
 VOLUME /etc/letsencrypt
 VOLUME /var/log/bouncer
diff --git a/docker-compose.override.yml b/docker-compose.override.yml
index 30c611f..4a53ea2 100644
--- a/docker-compose.override.yml
+++ b/docker-compose.override.yml
@@ -1,5 +1,5 @@
 services:
-  bouncer:
+  loadbalancer:
     volumes:
       - /var/run/docker.sock:/var/run/docker.sock
       - ./src:/app/src
diff --git a/docker-compose.yml b/docker-compose.yml
index 010e8d7..5062687 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -8,8 +8,12 @@ services:
       target: loadbalancer
       additional_contexts:
         - php:cli=docker-image://ghcr.io/benzine-framework/php:cli-8.2
+      args:
+        PUBLIC_MAINTAINER: "Matthew Baggett <test@baggett.me>"
+        SOURCE_URL: "https://git.grey.ooo/Benzine/docker-swarm-loadbalancer"
     volumes:
       - /var/run/docker.sock:/var/run/docker.sock
+    image: loadbalancer-test
     networks:
       default:
         aliases:

From a29cd36b14382e074d22752268b5ac969b6df914 Mon Sep 17 00:00:00 2001
From: Matthew Baggett <matthew@baggett.me>
Date: Fri, 21 Jun 2024 16:21:45 +0200
Subject: [PATCH 13/19] Fixup

---
 docker-compose.yml | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/docker-compose.yml b/docker-compose.yml
index 5062687..be2f945 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -8,9 +8,6 @@ services:
       target: loadbalancer
       additional_contexts:
         - php:cli=docker-image://ghcr.io/benzine-framework/php:cli-8.2
-      args:
-        PUBLIC_MAINTAINER: "Matthew Baggett <test@baggett.me>"
-        SOURCE_URL: "https://git.grey.ooo/Benzine/docker-swarm-loadbalancer"
     volumes:
       - /var/run/docker.sock:/var/run/docker.sock
     image: loadbalancer-test

From 30539244ae0f44d886534937fb7dca29ebdc262c Mon Sep 17 00:00:00 2001
From: Matthew Baggett <matthew@baggett.me>
Date: Fri, 21 Jun 2024 16:28:15 +0200
Subject: [PATCH 14/19] Fixup

---
 .github/workflows/docker.validate.yml |  2 +-
 .github/workflows/tests.yml           | 14 ++++++++++++++
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/.github/workflows/docker.validate.yml b/.github/workflows/docker.validate.yml
index 9855777..fd2789e 100644
--- a/.github/workflows/docker.validate.yml
+++ b/.github/workflows/docker.validate.yml
@@ -13,7 +13,7 @@ on:
       - completed
 
 env:
-  CANDIDATE_IMAGE: ghcr.io/${{ github.repository }}:hash-${{ github.sha }}
+  CANDIDATE_IMAGE: ghcr.io/${{ github.repository }}:sha-${{ github.sha }}
 
 jobs:
   validate-install-report:
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index ab1e11d..790466c 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -20,39 +20,53 @@ jobs:
       - name: Give it a moment...
         run: sleep 5
       - name: No-SSL Connect to Web A
+        shell: bash
         run: |
+          set -xeu
           docker compose exec test-box curl -s -D - http://a.example.org > a.nossl.http
           grep "HTTP/1.1 200 OK" a.nossl.http;
           grep "<h1>Website A</h1>" a.nossl.http;
       - name: SSL Connect to Web A
+        shell: bash
         run: |
+          set -xeu
           docker compose exec test-box curl -s -k -D - https://a.example.org 2>&1 > a.ssl.http;
           grep "HTTP/1.1 200 OK" a.ssl.http;
           grep "<h1>Website A</h1>" a.ssl.http;
       - name: No-SSL Connect to Web B
+        shell: bash
         run: |
+          set -xeu
           docker compose exec test-box curl -s -D - http://b.example.org 2>&1 > b.nossl.http 
           grep "HTTP/1.1 200 OK" b.nossl.http
           grep "<h1>Website B</h1>" b.nossl.http
       - name: SSL Connect to Web B
+        shell: bash
         run: |
+          set -xeu
           docker compose exec test-box curl -s -k -D - https://b.example.org 2>&1 > b.ssl.http
           grep "HTTP/1.1 200 OK" b.ssl.http
           grep "<h1>Website B</h1>" b.ssl.http
       - name: No-SSL Connect to SSL-redirect
+        shell: bash
         run: |
+          set -xeu
           docker compose exec test-box curl -s -D - http://redirect-to-ssl.example.org 2>&1 > redirect.nossl.http
           # Validate its redirected
           grep "HTTP/1.1 301 Moved Permanently" redirect.nossl.http
           # And going to the right place
           grep "Location: https://redirect-to-ssl.example.org" redirect.nossl.http
       - name: SSL Connect to SSL-redirect
+        shell: bash
         run: |
+          set -xeu
           docker compose exec test-box curl -s -k -D - https://redirect-to-ssl.example.org 2>&1 > redirect.ssl.http
           grep "HTTP/1.1 200 OK" redirect.ssl.http
           grep "<h1>Website redirect-to-ssl</h1>" redirect.ssl.http
       - name: Connect to Plural multiple times and verify it loadbalances
+        shell: bash
         run: |
+          set -xeu
           rm -f plural_requests
           for i in {1..20}; do
               docker compose exec test-box curl -s -k https://plural.example.org 2>&1 >> plural_requests

From fe3c695c9bb8bb4463165dbe06305f305de1317d Mon Sep 17 00:00:00 2001
From: matthewbaggett <943948+matthewbaggett@users.noreply.github.com>
Date: Mon, 24 Jun 2024 11:04:04 +0000
Subject: [PATCH 15/19] Upgrade trunk

---
 .trunk/trunk.yaml | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml
index f84a8e9..1ba1f50 100644
--- a/.trunk/trunk.yaml
+++ b/.trunk/trunk.yaml
@@ -28,7 +28,7 @@ lint:
     - markdownlint@0.41.0
     - taplo@0.8.1
     - actionlint@1.7.1
-    - checkov@3.2.138
+    - checkov@3.2.144
     - prettier@3.3.2
     - yamllint@1.35.1
   definitions:
@@ -47,16 +47,16 @@ tools:
   enabled:
     - tfupdate@0.8.2
     - phpstan@1.10.58
-    - gh@2.49.2
+    - gh@2.51.0
     - jq@jq-1.7.1
-    - yq@4.44.1
-    - awscli@1.33.9
+    - yq@4.44.2
+    - awscli@1.33.13
     - action-validator@0.6.0
     - act@0.2.63
     - shellcheck@0.10.0
     - hadolint@2.12.0
     - svgo@3.3.2
-    - tofu@1.7.1
+    - tofu@1.7.2
     - trunk-toolbox@0.3.1
     - tflint@0.51.1
     - terraform@1.1.4

From a909cba332094f0e6e3dc84c15952d753b916222 Mon Sep 17 00:00:00 2001
From: Matthew Baggett <matthew@baggett.me>
Date: Tue, 25 Jun 2024 15:19:09 +0200
Subject: [PATCH 16/19] Debuggin' whats wrong with service detection.

---
 docker-compose.yml |  7 +++++++
 src/Bouncer.php    | 24 +++++++++++++++++++-----
 2 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/docker-compose.yml b/docker-compose.yml
index be2f945..532a517 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -6,6 +6,13 @@ services:
     build:
       context: .
       target: loadbalancer
+      args:
+        MAINTAINER: "Test <test@oneupsales.co.uk>"
+        SOURCE_URL: "https://github.com/doesntmatter"
+        GIT_SHA: "1234"
+        GIT_BUILD_ID: "test"
+        GIT_COMMIT_MESSAGE: "testy mctestface"
+        BUILD_DATE: "1970-01-01"
       additional_contexts:
         - php:cli=docker-image://ghcr.io/benzine-framework/php:cli-8.2
     volumes:
diff --git a/src/Bouncer.php b/src/Bouncer.php
index ccbaf13..fdf068c 100644
--- a/src/Bouncer.php
+++ b/src/Bouncer.php
@@ -8,16 +8,19 @@ use AdamBrett\ShellWrapper\Command\Builder as CommandBuilder;
 use AdamBrett\ShellWrapper\Runners\Exec;
 use Aws\S3\S3Client;
 use Bouncer\Logger\AbstractLogger;
+use Bouncer\Logger\Formatter;
+use Bouncer\Logger\Logger;
+use Bouncer\Settings\Settings;
 use GuzzleHttp\Client as Guzzle;
 use GuzzleHttp\Exception\ConnectException;
+use GuzzleHttp\Exception\GuzzleException;
 use GuzzleHttp\Exception\ServerException;
 use League\Flysystem\AwsS3V3\AwsS3V3Adapter;
 use League\Flysystem\FileAttributes;
 use League\Flysystem\Filesystem;
 use League\Flysystem\FilesystemException;
 use League\Flysystem\Local\LocalFilesystemAdapter;
-use Bouncer\Logger\Logger;
-use Bouncer\Logger\Formatter;
+use Monolog\Processor;
 use Spatie\Emoji\Emoji;
 use Symfony\Component\Yaml\Yaml;
 use Twig\Environment as Twig;
@@ -25,9 +28,6 @@ use Twig\Error\LoaderError;
 use Twig\Error\RuntimeError;
 use Twig\Error\SyntaxError;
 use Twig\Loader\FilesystemLoader as TwigLoader;
-use GuzzleHttp\Exception\GuzzleException;
-use Monolog\Processor;
-use Bouncer\Settings\Settings;
 
 class Bouncer
 {
@@ -186,6 +186,7 @@ class Bouncer
     public function findContainersContainerMode(): array
     {
         $bouncerTargets = [];
+        $this->logger->warning('Interrogating CONTAINERS for BOUNCER_* environment variables.', ['emoji' => Emoji::magnifyingGlassTiltedLeft()]);
 
         $containers = json_decode($this->docker->request('GET', 'containers/json')->getBody()->getContents(), true);
         foreach ($containers as $container) {
@@ -262,11 +263,14 @@ class Bouncer
             }
         }
 
+        $this->logger->warning('Interrogating CONTAINERS for BOUNCER_* environment variables found {count} containers.', ['emoji' => Emoji::magnifyingGlassTiltedLeft(), 'count' => count($validBouncerTargets)]);
+
         return $validBouncerTargets;
     }
 
     public function findContainersSwarmMode(): array
     {
+        $this->logger->warning('Interrogating SERVICES for BOUNCER_* environment variables.', ['emoji' => Emoji::magnifyingGlassTiltedLeft()]);
         $bouncerTargets = [];
         $services       = json_decode($this->docker->request('GET', 'services')->getBody()->getContents(), true);
 
@@ -365,6 +369,8 @@ class Bouncer
             }
         }
 
+        $this->logger->warning('Interrogating SERVICES for BOUNCER_* environment variables found {count} containers.', ['emoji' => Emoji::magnifyingGlassTiltedLeft(), 'count' => count($validBouncerTargets)]);
+
         return $validBouncerTargets;
     }
 
@@ -670,6 +676,7 @@ class Bouncer
 
         $this->logger->debug(' > Swarm mode is {enabled}.', ['emoji' => Emoji::honeybee(), 'enabled' => $this->isSwarmMode() ? 'enabled' : 'disabled']);
 
+        /** @var Target[] $targets */
         $targets = array_values(
             array_merge(
                 $this->findContainersContainerMode(),
@@ -677,6 +684,13 @@ class Bouncer
             )
         );
 
+        foreach($targets as $target){
+            $this->logger->info('Found target {target}', ['emoji' => Emoji::magnifyingGlassTiltedLeft(), 'target' => $target->getName()]);
+            \Kint::dump(
+                $target->getDomains(),
+            );
+        }
+
         // Use some bs to sort the targets by domain from right to left.
         $sortedTargets = [];
         foreach ($targets as $target) {

From 42b3b4912b41f46c9e849037428c2cb8d00c3391 Mon Sep 17 00:00:00 2001
From: Matthew Baggett <matthew@baggett.me>
Date: Tue, 25 Jun 2024 15:27:42 +0200
Subject: [PATCH 17/19] Debuggin'

---
 src/Bouncer.php | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/Bouncer.php b/src/Bouncer.php
index fdf068c..0a21e94 100644
--- a/src/Bouncer.php
+++ b/src/Bouncer.php
@@ -211,6 +211,7 @@ class Bouncer
             }
             // If BOUNCER_IGNORE is set, skip this service.
             if (isset($envs['BOUNCER_IGNORE'])) {
+                $this->logger->warning('Container {container_name} has BOUNCER_IGNORE set, skipping.', ['emoji' => Emoji::warning() . ' Bouncer.php', 'container_name' => $container['Name']]);
                 continue;
             }
 
@@ -294,13 +295,16 @@ class Bouncer
                         $envs[$envKey] = $envVal;
                     }
                 }
+                \Kint::dump($service['Spec']['TaskTemplate']['ContainerSpec']['Env']);
                 ksort($envs);
                 // If there are no BOUNCER_* environment variables, skip this service.
                 if (count($envs) == 0) {
+                    $this->logger->debug('Service {service_name} has no BOUNCER_* environment variables, skipping.', ['emoji' => Emoji::warning() . ' Bouncer.php', 'service_name' => $service['Spec']['Name']]);
                     continue;
                 }
                 // if BOUNCER_IGNORE is set, skip this service.
                 if (isset($envs['BOUNCER_IGNORE'])) {
+                    $this->logger->warning('Service {service_name} has BOUNCER_IGNORE set, skipping.', ['emoji' => Emoji::warning() . ' Bouncer.php', 'service_name' => $service['Spec']['Name']]);
                     continue;
                 }
 

From f7f269d685c23727977035e9f216d75b7fe9a031 Mon Sep 17 00:00:00 2001
From: Matthew Baggett <matthew@baggett.me>
Date: Wed, 26 Jun 2024 12:54:49 +0200
Subject: [PATCH 18/19] Fix bugs with loadbalancer

---
 src/Bouncer.php | 54 ++++++++++++++++++++++++++-----------------------
 1 file changed, 29 insertions(+), 25 deletions(-)

diff --git a/src/Bouncer.php b/src/Bouncer.php
index 0a21e94..d573234 100644
--- a/src/Bouncer.php
+++ b/src/Bouncer.php
@@ -211,7 +211,7 @@ class Bouncer
             }
             // If BOUNCER_IGNORE is set, skip this service.
             if (isset($envs['BOUNCER_IGNORE'])) {
-                $this->logger->warning('Container {container_name} has BOUNCER_IGNORE set, skipping.', ['emoji' => Emoji::warning() . ' Bouncer.php', 'container_name' => $container['Name']]);
+                $this->logger->warning('Container {container_name} has BOUNCER_IGNORE set, skipping.', ['emoji' => Emoji::warning() . ' ', 'container_name' => $container['Name']]);
                 continue;
             }
 
@@ -276,7 +276,7 @@ class Bouncer
         $services       = json_decode($this->docker->request('GET', 'services')->getBody()->getContents(), true);
 
         if (isset($services['message'])) {
-            $this->logger->debug('Something happened while interrogating services.. This node is not a swarm node, cannot have services: {message}', ['emoji' => Emoji::warning() . ' Bouncer.php', 'message' => $services['message']]);
+            $this->logger->debug('Something happened while interrogating services.. This node is not a swarm node, cannot have services: {message}', ['emoji' => Emoji::warning() . ' ', 'message' => $services['message']]);
         } else {
             foreach ($services as $service) {
                 $envs = [];
@@ -288,6 +288,7 @@ class Bouncer
                 ) {
                     continue;
                 }
+
                 // Parse all the environment variables and store them in an array.
                 foreach ($service['Spec']['TaskTemplate']['ContainerSpec']['Env'] as $env) {
                     [$envKey, $envVal] = explode('=', $env, 2);
@@ -295,16 +296,17 @@ class Bouncer
                         $envs[$envKey] = $envVal;
                     }
                 }
-                \Kint::dump($service['Spec']['TaskTemplate']['ContainerSpec']['Env']);
                 ksort($envs);
+
                 // If there are no BOUNCER_* environment variables, skip this service.
                 if (count($envs) == 0) {
-                    $this->logger->debug('Service {service_name} has no BOUNCER_* environment variables, skipping.', ['emoji' => Emoji::warning() . ' Bouncer.php', 'service_name' => $service['Spec']['Name']]);
+                    $this->logger->debug('Service {service_name} has no BOUNCER_* envs set, skipping.', ['emoji' => Emoji::ghost() . ' ', 'service_name' => $service['Spec']['Name']]);
                     continue;
                 }
+
                 // if BOUNCER_IGNORE is set, skip this service.
                 if (isset($envs['BOUNCER_IGNORE'])) {
-                    $this->logger->warning('Service {service_name} has BOUNCER_IGNORE set, skipping.', ['emoji' => Emoji::warning() . ' Bouncer.php', 'service_name' => $service['Spec']['Name']]);
+                    $this->logger->debug('Service {service_name} has BOUNCER_IGNORE set, skipping.', ['emoji' => Emoji::warning() . ' ', 'service_name' => $service['Spec']['Name']]);
                     continue;
                 }
 
@@ -333,7 +335,7 @@ class Bouncer
                         $bouncerTarget->setEndpoints(['172.17.0.1']);
                         $bouncerTarget->setPort(intval($service['Endpoint']['Ports'][0]['PublishedPort']));
                     } else {
-                        $this->logger->warning('{label}: ports block missing for {target_name}. Try setting BOUNCER_TARGET_PORT.', ['emoji' => Emoji::warning() . ' Bouncer.php', 'label' => $bouncerTarget->getLabel(), 'target_name' => $bouncerTarget->getName()]);
+                        $this->logger->warning('{label}: ports block missing for {target_name}. Try setting BOUNCER_TARGET_PORT.', ['emoji' => Emoji::warning() . ' ', 'label' => $bouncerTarget->getLabel(), 'target_name' => $bouncerTarget->getName()]);
                         \Kint::dump(
                             $bouncerTarget->getId(),
                             $bouncerTarget->getLabel(),
@@ -352,6 +354,10 @@ class Bouncer
                             unset($bouncerTarget);
                         }
                     }
+
+                    if(isset($bouncerTarget)) {
+                        $bouncerTargets[] = $bouncerTarget;
+                    }
                 }
             }
         }
@@ -372,15 +378,16 @@ class Bouncer
                 );
             }
         }
+        $this->logger->debug("There are {count} bouncer targets, of which {validCount} are valid", ['count' => count($bouncerTargets), 'validCount' => count($validBouncerTargets)]);
 
-        $this->logger->warning('Interrogating SERVICES for BOUNCER_* environment variables found {count} containers.', ['emoji' => Emoji::magnifyingGlassTiltedLeft(), 'count' => count($validBouncerTargets)]);
+        $this->logger->warning('Interrogating SERVICES for BOUNCER_* environment variables found {count} services.', ['emoji' => Emoji::magnifyingGlassTiltedLeft(), 'count' => count($validBouncerTargets)]);
 
         return $validBouncerTargets;
     }
 
     public function run(): void
     {
-        $this->logger->info('Starting Bouncer. Built {build_id} on {build_date}, {build_ago}', ['emoji' => Emoji::redHeart() . ' Bouncer.php', 'build_id' => $this->settings->get('build/id'), 'build_date' => $this->settings->get('build/date')->toDateTimeString(), 'build_ago' => $this->settings->get('build/date')->ago()]);
+        $this->logger->info('Starting Bouncer. Built {build_id} on {build_date}, {build_ago}', ['emoji' => Emoji::redHeart() . ' ', 'build_id' => $this->settings->get('build/id'), 'build_date' => $this->settings->get('build/date')->toDateTimeString(), 'build_ago' => $this->settings->get('build/date')->ago()]);
         $this->logger->info('Build #{git_sha}: "{build_message}"', ['emoji' => Emoji::memo(), 'git_sha' => $this->settings->get('build/sha_short'), 'build_message' => $this->settings->get('build/message')]);
         $this->logger->debug(' > HTTPS Listener is on {https_port}', ['emoji' => Emoji::ship(), 'https_port' => $this->settings->get('bouncer/https_port')]);
         $this->logger->debug(' > HTTP Listener is on {http_port}', ['emoji' => Emoji::ship(), 'http_port' => $this->settings->get('bouncer/http_port')]);
@@ -596,7 +603,7 @@ class Bouncer
         $containerStateDiff = $this->diff($this->previousContainerState, $newContainerState);
         if (!$isTainted && !empty($containerStateDiff)) {
             if ($this->settings->if('logger/show_state_deltas')) {
-                $this->logger->warning('Container state has changed', ['emoji' => Emoji::warning() . ' Bouncer.php']);
+                $this->logger->warning('Container state has changed', ['emoji' => Emoji::warning() . ' ']);
                 echo $containerStateDiff;
             }
             $isTainted = true;
@@ -608,7 +615,7 @@ class Bouncer
         if ($this->isSwarmMode()) {
             $services = json_decode($this->docker->request('GET', 'services')->getBody()->getContents(), true);
             if (isset($services['message'])) {
-                $this->logger->warning('Something happened while interrogating services.. This node is not a swarm node, cannot have services: {message}', ['emoji' => Emoji::warning() . ' Bouncer.php', 'message' => $services['message']]);
+                $this->logger->warning('Something happened while interrogating services.. This node is not a swarm node, cannot have services: {message}', ['emoji' => Emoji::warning() . ' ', 'message' => $services['message']]);
             } else {
                 foreach ($services as $service) {
                     $name                 = $service['Spec']['Name'];
@@ -636,7 +643,7 @@ class Bouncer
         $swarmStateDiff = $this->diff($this->previousSwarmState, $newSwarmState);
         if ($this->isSwarmMode() && !$isTainted && !empty($swarmStateDiff)) {
             if ($this->settings->if('logger/show_state_deltas')) {
-                $this->logger->warning('Swarm state has changed', ['emoji' => Emoji::warning() . ' Bouncer.php']);
+                $this->logger->warning('Swarm state has changed', ['emoji' => Emoji::warning() . ' ']);
                 echo $swarmStateDiff;
             }
             $isTainted = true;
@@ -672,7 +679,7 @@ class Bouncer
         } catch (ServerException $exception) {
             $this->setSwarmMode(false);
         } catch (ConnectException $exception) {
-            $this->logger->critical('Unable to connect to docker socket!', ['emoji' => Emoji::warning() . ' Bouncer.php']);
+            $this->logger->critical('Unable to connect to docker socket!', ['emoji' => Emoji::warning() . ' ']);
             $this->logger->critical($exception->getMessage());
 
             exit(1);
@@ -690,9 +697,6 @@ class Bouncer
 
         foreach($targets as $target){
             $this->logger->info('Found target {target}', ['emoji' => Emoji::magnifyingGlassTiltedLeft(), 'target' => $target->getName()]);
-            \Kint::dump(
-                $target->getDomains(),
-            );
         }
 
         // Use some bs to sort the targets by domain from right to left.
@@ -720,7 +724,7 @@ class Bouncer
         }
 
         if ($this->isTestMode()) {
-            $this->logger->info('Test mode enabled, not restarting nginx. Infact, I\'ll die now..', ['emoji' => Emoji::warning() . ' Bouncer.php']);
+            $this->logger->info('Test mode enabled, not restarting nginx. Infact, I\'ll die now..', ['emoji' => Emoji::warning() . ' ']);
             $this->dumpConfigs();
 
             exit(0);
@@ -836,15 +840,15 @@ class Bouncer
                     'file'       => $target->getNginxConfigFileName(),
                     'config_dir' => Bouncer::FILESYSTEM_CONFIG_DIR,
                 ];
-                $this->logger->info('Created {label}', $context + ['emoji' => Emoji::pencil() . ' Bouncer.php']);
-                $this->logger->debug('  -> {config_dir}/{file}', $context + ['emoji' => Emoji::pencil() . ' Bouncer.php']);
-                $this->logger->debug('  -> {domain}', $context + ['emoji' => Emoji::pencil() . ' Bouncer.php']);
+                $this->logger->info('Created {label}', $context + ['emoji' => Emoji::pencil() . ' ']);
+                $this->logger->debug('  -> {config_dir}/{file}', $context + ['emoji' => Emoji::pencil() . ' ']);
+                $this->logger->debug('  -> {domain}', $context + ['emoji' => Emoji::pencil() . ' ']);
                 $this->logger->critical('{label} cert type is {cert_type}', $context + ['emoji' => Emoji::catFace(), 'cert_type' => $target->getTypeCertInUse()->name]);
             }
         } else {
-            $this->logger->info('More than {num_max} Nginx configs generated.. Too many to show them all!', ['emoji' => Emoji::pencil() . ' Bouncer.php', 'num_max' => $this->getMaximumNginxConfigCreationNotices()]);
+            $this->logger->info('More than {num_max} Nginx configs generated.. Too many to show them all!', ['emoji' => Emoji::pencil() . ' ', 'num_max' => $this->getMaximumNginxConfigCreationNotices()]);
         }
-        $this->logger->info('Updated {num_created} Nginx configs, {num_changed} changed..', ['emoji' => Emoji::pencil() . ' Bouncer.php', 'num_created' => count($targets), 'num_changed' => count($changedTargets)]);
+        $this->logger->info('Updated {num_created} Nginx configs, {num_changed} changed..', ['emoji' => Emoji::pencil() . ' ', 'num_created' => count($targets), 'num_changed' => count($changedTargets)]);
 
         $this->pruneNonExistentConfigs($targets);
     }
@@ -967,13 +971,13 @@ class Bouncer
             $command->addFlag('n');
             $command->addFlag('m', $this->environment['BOUNCER_LETSENCRYPT_EMAIL']);
             $command->addArgument('agree-tos');
-            $this->logger->info('Generating letsencrypt for {target_name} - {command}', ['emoji' => Emoji::pencil() . ' Bouncer.php', 'target_name' => $target->getName(), 'command' => $command->__toString()]);
+            $this->logger->info('Generating letsencrypt for {target_name} - {command}', ['emoji' => Emoji::pencil() . ' ', 'target_name' => $target->getName(), 'command' => $command->__toString()]);
             $shell->run($command);
 
             if ($shell->getReturnValue() == 0) {
                 $this->logger->info('Generating successful', ['emoji' => Emoji::partyPopper()]);
             } else {
-                $this->logger->critical('Generating failed!', ['emoji' => Emoji::warning() . ' Bouncer.php']);
+                $this->logger->critical('Generating failed!', ['emoji' => Emoji::warning() . ' ']);
             }
 
             // Re-enable nginx tweaks
@@ -995,7 +999,7 @@ class Bouncer
         $shell   = new Exec();
         $command = new CommandBuilder('/usr/sbin/nginx');
         $command->addFlag('s', 'reload');
-        $this->logger->info('Restarting nginx', ['emoji' => Emoji::timerClock() . ' Bouncer.php']);
+        $this->logger->info('Restarting nginx', ['emoji' => Emoji::timerClock() . '  ']);
         $nginxRestartOutput = $shell->run($command);
         $this->logger->debug('Nginx restarted {restart_output}', ['restart_output' => $nginxRestartOutput, 'emoji' => Emoji::partyPopper()]);
     }
@@ -1008,7 +1012,7 @@ class Bouncer
                 if ($file['path'] == 'default.conf') {
                     continue;
                 }
-                $this->logger->info('Dumping {file}', ['emoji' => Emoji::pencil() . ' Bouncer.php', 'file' => $file['path']]);
+                $this->logger->info('Dumping {file}', ['emoji' => Emoji::pencil() . ' ', 'file' => $file['path']]);
                 echo $this->configFilesystem->read($file['path']);
             }
         }

From 6d4e3b26f2590677870d8d05cbeed30c54fe0978 Mon Sep 17 00:00:00 2001
From: Matthew Baggett <matthew@baggett.me>
Date: Wed, 26 Jun 2024 13:02:36 +0200
Subject: [PATCH 19/19] php-cs-fixer

---
 src/Bouncer.php | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/Bouncer.php b/src/Bouncer.php
index d573234..273f8d9 100644
--- a/src/Bouncer.php
+++ b/src/Bouncer.php
@@ -212,6 +212,7 @@ class Bouncer
             // If BOUNCER_IGNORE is set, skip this service.
             if (isset($envs['BOUNCER_IGNORE'])) {
                 $this->logger->warning('Container {container_name} has BOUNCER_IGNORE set, skipping.', ['emoji' => Emoji::warning() . ' ', 'container_name' => $container['Name']]);
+
                 continue;
             }
 
@@ -301,12 +302,14 @@ class Bouncer
                 // If there are no BOUNCER_* environment variables, skip this service.
                 if (count($envs) == 0) {
                     $this->logger->debug('Service {service_name} has no BOUNCER_* envs set, skipping.', ['emoji' => Emoji::ghost() . ' ', 'service_name' => $service['Spec']['Name']]);
+
                     continue;
                 }
 
                 // if BOUNCER_IGNORE is set, skip this service.
                 if (isset($envs['BOUNCER_IGNORE'])) {
                     $this->logger->debug('Service {service_name} has BOUNCER_IGNORE set, skipping.', ['emoji' => Emoji::warning() . ' ', 'service_name' => $service['Spec']['Name']]);
+
                     continue;
                 }
 
@@ -355,7 +358,7 @@ class Bouncer
                         }
                     }
 
-                    if(isset($bouncerTarget)) {
+                    if (isset($bouncerTarget)) {
                         $bouncerTargets[] = $bouncerTarget;
                     }
                 }
@@ -378,7 +381,7 @@ class Bouncer
                 );
             }
         }
-        $this->logger->debug("There are {count} bouncer targets, of which {validCount} are valid", ['count' => count($bouncerTargets), 'validCount' => count($validBouncerTargets)]);
+        $this->logger->debug('There are {count} bouncer targets, of which {validCount} are valid', ['count' => count($bouncerTargets), 'validCount' => count($validBouncerTargets)]);
 
         $this->logger->warning('Interrogating SERVICES for BOUNCER_* environment variables found {count} services.', ['emoji' => Emoji::magnifyingGlassTiltedLeft(), 'count' => count($validBouncerTargets)]);
 
@@ -695,7 +698,7 @@ class Bouncer
             )
         );
 
-        foreach($targets as $target){
+        foreach ($targets as $target) {
             $this->logger->info('Found target {target}', ['emoji' => Emoji::magnifyingGlassTiltedLeft(), 'target' => $target->getName()]);
         }