From 608e1c783404ae0db1c409ccee147c1e1102cfc8 Mon Sep 17 00:00:00 2001 From: Leigh Brooks Date: Mon, 23 Mar 2026 15:08:40 +0000 Subject: [PATCH 1/3] Added RabbitMQ 4 commodity (#165) * Added RabbitMQ 4 commodity * Updated readme * Removed unnecessary compose fragments and amended Dockerfile for prometheus * Switch to alpine image * Amended default queue type to quorum * Amended the readme to reflect differences between rabbitmq 3 and 4 --------- Co-authored-by: Leigh Brooks Co-authored-by: Simon Chapman <7984422+sichapman@users.noreply.github.com> Co-authored-by: Leigh Brooks --- README.md | 47 ++++++++++++------ scripts/docker/rabbitmq-4/Dockerfile | 20 ++++++++ .../rabbitmq-4/certs/ca_certificate.crt | Bin 0 -> 895 bytes .../rabbitmq-4/certs/ca_certificate.pem | 21 ++++++++ scripts/docker/rabbitmq-4/certs/ca_key.pem | 28 +++++++++++ .../rabbitmq-4/certs/client_certificate.pem | 21 ++++++++ .../docker/rabbitmq-4/certs/client_key.p12 | Bin 0 -> 2509 bytes .../docker/rabbitmq-4/certs/client_key.pem | 28 +++++++++++ .../rabbitmq-4/certs/server_certificate.pem | 23 +++++++++ .../docker/rabbitmq-4/certs/server_key.p12 | Bin 0 -> 2573 bytes .../docker/rabbitmq-4/certs/server_key.pem | 28 +++++++++++ .../docker/rabbitmq-4/compose-fragment.yml | 8 +++ scripts/docker/rabbitmq-4/rabbitmq.conf | 10 ++++ snippets/app_configuration.yml | 2 +- 14 files changed, 220 insertions(+), 16 deletions(-) create mode 100644 scripts/docker/rabbitmq-4/Dockerfile create mode 100644 scripts/docker/rabbitmq-4/certs/ca_certificate.crt create mode 100644 scripts/docker/rabbitmq-4/certs/ca_certificate.pem create mode 100644 scripts/docker/rabbitmq-4/certs/ca_key.pem create mode 100644 scripts/docker/rabbitmq-4/certs/client_certificate.pem create mode 100644 scripts/docker/rabbitmq-4/certs/client_key.p12 create mode 100644 scripts/docker/rabbitmq-4/certs/client_key.pem create mode 100644 scripts/docker/rabbitmq-4/certs/server_certificate.pem create mode 100644 scripts/docker/rabbitmq-4/certs/server_key.p12 create mode 100644 scripts/docker/rabbitmq-4/certs/server_key.pem create mode 100644 scripts/docker/rabbitmq-4/compose-fragment.yml create mode 100644 scripts/docker/rabbitmq-4/rabbitmq.conf diff --git a/README.md b/README.md index 12045fb..3701de5 100644 --- a/README.md +++ b/README.md @@ -120,19 +120,20 @@ The list of allowable commodity values is: 5. elasticsearch7 6. nginx 7. rabbitmq -8. redis -9. swagger -10. wiremock -11. squid -12. auth -13. cadence -14. cadence-web -15. activemq -16. ibmmq -17. localstack -18. valkey -19. prometheus -20. grafana +8. rabbitmq-4 +9. redis +10. swagger +11. wiremock +12. squid +13. auth +14. cadence +15. cadence-web +16. activemq +17. ibmmq +18. localstack +19. valkey +20. prometheus +21. grafana The file may optionally also indicate that one or more services are resource intensive ("expensive") when starting up. The dev env will start those containers seperately - 3 at a time - and wait until each are declared healthy (or crash and get restarted 10 times) before starting any more. @@ -220,11 +221,11 @@ This is a file that contains stub mappings that Wiremock will pick up and use, a This is a directory that can contain multiple stub mappings files that Wiremock will pick up and use. The files should all be in the same format as the example above. If such a wiremock directory exists, it will take precedence over any `wiremock-fragment.json` file. -##### RabbitMQ +##### RabbitMQ 3 There are no fragments needed when using this. The Management Console will be available on (guest/guest). -Rabbit is available over port 5672 and TLS on port 5671. +RabbitMQ 3 is available over port 5672 and TLS on port 5671. TLS presents a self signed cert. If verification is needed then use the provided [ca certificate](scripts/docker/rabbitmq/certs/ca_certificate.crt). The host has been set to `rabbitmq` for host verification in most common libraries, although will only work within the docker network. @@ -232,6 +233,22 @@ MTLS is not enabled, although a [client certificate pem](scripts/docker/rabbitmq Currently, only the `rabbitmq_management`, `rabbitmq_consistent_hash_exchange`, `rabbitmq_shovel`, `rabbitmq_shovel_management`, `rabbitmq_stream` and `rabbitmq_prometheus` plugins are enabled. +The default queue type for queues in RabbitMQ 3 is `classic`. + +##### RabbitMQ 4 + +There are no fragments needed when using this. The Management Console will be available on (guest/guest). + +RabbitMQ 4 is available over port 5682 and TLS on port 5681. + +TLS presents a self signed cert. If verification is needed then use the provided [ca certificate](scripts/docker/rabbitmq/certs/ca_certificate.crt). The host has been set to `rabbitmq` for host verification in most common libraries, although will only work within the docker network. + +MTLS is not enabled, although a [client certificate pem](scripts/docker/rabbitmq/certs/client_certificate.pem) and [client key pem](scripts/docker/rabbitmq/certs/client_key.pem) have been generated as part of the certificate set for potential future use. + +Currently, only the `rabbitmq_management`, `rabbitmq_consistent_hash_exchange`, `rabbitmq_shovel`, `rabbitmq_shovel_management`, `rabbitmq_stream` and `rabbitmq_prometheus` plugins are enabled. + +The default queue type for queues in RabbitMQ 4 is `quorum`. + ##### ActiveMQ There are no fragments needed when using this. The Management Console will be available on (admin/admin). diff --git a/scripts/docker/rabbitmq-4/Dockerfile b/scripts/docker/rabbitmq-4/Dockerfile new file mode 100644 index 0000000..6743cb6 --- /dev/null +++ b/scripts/docker/rabbitmq-4/Dockerfile @@ -0,0 +1,20 @@ +# This is so a reset (dc down) won't remove the base rabbit image, only the one created from this dockerfile +FROM docker.io/rabbitmq:4.2-management-alpine +# Copy the configuration file to rabbitmq +# https://www.rabbitmq.com/configure.html#configuration-files +COPY rabbitmq.conf /etc/rabbitmq/ +# Copy certs for TLS +# Nice tool here from rabbit for generating https://github.com/rabbitmq/tls-gen +COPY certs/ca_certificate.pem certs/server_certificate.pem certs/server_key.pem certs/ +# This plugin adds a consistent-hash exchange type to RabbitMQ. This exchange type uses consistent hashing to +# distribute messages between the bound queues +RUN rabbitmq-plugins --offline enable rabbitmq_consistent_hash_exchange +# This is a RabbitMQ plugin adds message transfer and management functionality. +# Handy for tasks such as bulk moving msgs for a DLQ. +# https://www.rabbitmq.com/shovel.html +RUN rabbitmq-plugins --offline enable rabbitmq_shovel rabbitmq_shovel_management +# This is a RabbitMQ plugin that exposes streams. +# Streams are a new persistent and replicated data structure, handy to persist historic messages for a period of time +# https://www.rabbitmq.com/stream.html +RUN rabbitmq-plugins --offline enable rabbitmq_stream && \ + rabbitmq-plugins --offline enable rabbitmq_prometheus diff --git a/scripts/docker/rabbitmq-4/certs/ca_certificate.crt b/scripts/docker/rabbitmq-4/certs/ca_certificate.crt new file mode 100644 index 0000000000000000000000000000000000000000..019a77eab938f6f95e030459f19e01ed53737359 GIT binary patch literal 895 zcmXqLVy-r5VoF}X%*4pV#L2MP>dl$*Rp+t{c-c6$+C196^D;7WvoaX?7+M=xvN4CU zF!LCN_yoJB<^`wbqy=ZD=cT5U1m)+KI6EpB85kMq8kp-E8HE^{TbY_$85!%DnVTD$ z7#Q*zaDz0n^RTD@fq|SjuaS{~xsj2fnW?#vag;c(F_3F$3FT7RwkAd;WbZJtGB7tW z@-rATF>*0AF)}jT&wmnbW&4D~_wU=2M_#XUm6-M2UF3D4yUXQ+c~A2-in+p_t<3tp zHfe1t`Rdo;aq?iBXbQvbUn^3V^jx~b81Vj=kGE~?%H}<*{ofQTc_wZsd1WgT?gjO`M`pf>W~o{hyq1Oy`l%$Cnm5jPuM(m->Ad+`p0~ ziT}ysWgI`N&*i){yj*l|UzVtun~&6WHdVj7zWEIi8z*dhuC&e)aR#D+cl)X=N4(1F;6|3Q&_2Fb)_Q z%zP#0XNLa1@gc#(ZS}^dVx4*QmzJkVehZGjCdqLn>|K+=hJZVJA5EM-|Et@axe9MD zn5QmTr9J=j;<@Jw3m$p(m%N&=szae{b`}G_D68mmjRlGwY_U@}noL}j{UhVS!X082YiqsgckQpoHM;NXZRRge<=B3E?gC!Dd9yC& zh}JT8M91G+8k``M9meu{<(qx;%{RL6NC`VRmMO;f}G literal 0 HcmV?d00001 diff --git a/scripts/docker/rabbitmq-4/certs/ca_certificate.pem b/scripts/docker/rabbitmq-4/certs/ca_certificate.pem new file mode 100644 index 0000000..1273549 --- /dev/null +++ b/scripts/docker/rabbitmq-4/certs/ca_certificate.pem @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIJALM67Mx3qs5qMA0GCSqGSIb3DQEBCwUAMEwxOzA5BgNV +BAMMMlRMU0dlblNlbGZTaWduZWR0Um9vdENBIDIwMjItMDctMjJUMTc6NTc6MjMu +Njc3MTQwMQ0wCwYDVQQHDAQkJCQkMB4XDTIyMDcyMjE2NTcyM1oXDTMyMDcxOTE2 +NTcyM1owTDE7MDkGA1UEAwwyVExTR2VuU2VsZlNpZ25lZHRSb290Q0EgMjAyMi0w +Ny0yMlQxNzo1NzoyMy42NzcxNDAxDTALBgNVBAcMBCQkJCQwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDfb+RXOj3kCE397cnE665FGJr3RxTrcUdE08Fu +5W8ocwpXQzo2j0qyKrJ09U6ASMnBhhVkALv6qGWkjNLcAVDv+kxLPV2pg7yrT+xz +IklhtsUkkko9GHV++2mWvbW1cFWZR38trUjrEVPO3zoclJTwAO6B4u48ZhFocxie +Gpg28fHVnKf/Z6ziMAu54kLRbCNM2F3/XUl0l/A4l4uyCRVaEZRq/v+TaMYs4hLx +6TgsAZ43daVO9xG/qQRiD+Sjpgj5e85s6THTct6+ahU2Rkwa1wYlGbSCIq8QaGop +1R7+J9PLwWmiQWriHUHccegNGhwmcv456gFgB8EldgYBpUOXAgMBAAGjYDBeMA8G +A1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQAMB5YaNLrhwjn +NPLo8xefe+eF1DAfBgNVHSMEGDAWgBQAMB5YaNLrhwjnNPLo8xefe+eF1DANBgkq +hkiG9w0BAQsFAAOCAQEANk0Yn2lV+9jwYEhGq7HlFoluf9KnZhn2U1/WGQjUVu6C +MLBQ3L3ikZef9UacnSDt0DdlpKorn8ujnc9xcOJKj3TqkKqIIHabagAPFQUV5yig +IYgGXZWxNJGia/ho4KG43F7HOh6MaZyHAT9fWsUKhzXeUDFHXGHjV4WFfyX3K/XH +KIvfLrMPd2UIt9udoA0unprRbBRLCRHmV8RUYvIqCT+VWH29GWz4CpvpZqlDP7uC +3zaLzb88jQg9zjCh7sDFt+em/1dRRJ54PpgddFtf2qVTYBJrVgTrqey+nzewnAAd +fTb+ZUIjQNlpoek8gz/5oQtNSDAuZVa52/VAFXh1/g== +-----END CERTIFICATE----- diff --git a/scripts/docker/rabbitmq-4/certs/ca_key.pem b/scripts/docker/rabbitmq-4/certs/ca_key.pem new file mode 100644 index 0000000..36ac740 --- /dev/null +++ b/scripts/docker/rabbitmq-4/certs/ca_key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDfb+RXOj3kCE39 +7cnE665FGJr3RxTrcUdE08Fu5W8ocwpXQzo2j0qyKrJ09U6ASMnBhhVkALv6qGWk +jNLcAVDv+kxLPV2pg7yrT+xzIklhtsUkkko9GHV++2mWvbW1cFWZR38trUjrEVPO +3zoclJTwAO6B4u48ZhFocxieGpg28fHVnKf/Z6ziMAu54kLRbCNM2F3/XUl0l/A4 +l4uyCRVaEZRq/v+TaMYs4hLx6TgsAZ43daVO9xG/qQRiD+Sjpgj5e85s6THTct6+ +ahU2Rkwa1wYlGbSCIq8QaGop1R7+J9PLwWmiQWriHUHccegNGhwmcv456gFgB8El +dgYBpUOXAgMBAAECggEAAxCi3jtzS+R9RWV0phnhixsaTRgRhmVIZ/5LofzNuI1T +b/0BGGyAxs7lIcuXpxTYh6oSMwv7iCW1NzujTNdLx+70Cvgth7zB4su236FxxkBe +lfDXydzDB9nlCedSTcnbsr2TVgoRfQAA2U6gmnHDVUN+AhQd1oBD7t3dUZXlzqMe +bznn/CzHXonhHbHT79KbZHgb1lJGZQapjUGdwmAdjLt+flJcD7SCYabG/4tfwo/c +L7EKeJb3Pye3mdVvs6sLMyPmrTxaT5PILllFwbzmcuoTmWi3AZ4e6qwygpGvtXLo +oOlZfuShdXz2MCoG7KUEX/kgwHZy5jUivxyn7aqOAQKBgQD7kqEr87WJAhJ6TgFL +T4ndmTYYuExEfIAu4D9UFuEiFH04GSMcT5RUpyZc20rIaL4sz8FVHYffqXbK24pl +ScD2wtsb6sm9+tadtNxnihd2z5nT0z4SYYu13ImOWGeEri2UDXu0vnwCA9ULCq5w +Sj9gyYxlZykTElW4C2gjhSlClwKBgQDjXoHU3jONJYa+QAqlmIKIB37fftkAnKsY +yjN6hvlFU4U0OI6bxYSvjfIzSp/GEEHOXWNlFfkRBR7uMRUmMPYxxPq73c61pVO1 +d6BxTOK/tHNwi0pJeNRUYonyqlwnOwOfwkPh0BYudV7NbArq5eWMGGo8G5hkStZ/ +feQDbUEnAQKBgQDHXgeuTkAiaOr91A3AgjMu03mEk6GVcNkgzQRC/rLCEFy/9WPW +ztYtVB3Z3svgEOoNl0OO0Y1ZWfJThzKhXJa4t+lusV3Z2gz1BFzbDRvVQ2aT8Uey +x20x3amBjlvTUTm7qAfOUFr0Odc/HeLqCF07td42ik+J1rDp3thTtfbh1wKBgFnT +6K9U6kEFZmqbmpk527gqXfGmh806GE6+8/+ge7LsAGBVR+I68uT4y4uAHAeAPL9v +Hem9+JzEzSeFtLlV9q5LCFRYmWYiXyP+kyCwI5VhkYoRPdQxLJH6LE33CFlnc1MW +yQLZ1ymbrUyzNsz+7uWeb7o3nMli18Oe1QqVi3wBAoGBAOIMYwFP5aYXktN9rYS+ +XQdKWy1PbetdAsEklf84J351A2Ggh+X7rE/eBvOySLEqncsaWXytZN0HBE6m5ztN +XFe/N/jU3m4buefmFukznnTkhuu70lS/RBqWy+2IgRwO5l6sUrbst4VypJCi1xTD +ExD4m0ADahDs3x+k60BL7x82 +-----END PRIVATE KEY----- diff --git a/scripts/docker/rabbitmq-4/certs/client_certificate.pem b/scripts/docker/rabbitmq-4/certs/client_certificate.pem new file mode 100644 index 0000000..dfe51cc --- /dev/null +++ b/scripts/docker/rabbitmq-4/certs/client_certificate.pem @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDhzCCAm+gAwIBAgIBAjANBgkqhkiG9w0BAQsFADBMMTswOQYDVQQDDDJUTFNH +ZW5TZWxmU2lnbmVkdFJvb3RDQSAyMDIyLTA3LTIyVDE3OjU3OjIzLjY3NzE0MDEN +MAsGA1UEBwwEJCQkJDAeFw0yMjA3MjIxNjU3MjRaFw0zMjA3MTkxNjU3MjRaMCQx +ETAPBgNVBAMMCHJhYmJpdG1xMQ8wDQYDVQQKDAZjbGllbnQwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDItDPr/y3UgpGrHOce2DtSVXHfWaoQ0NLrff1y +RUAGKl1wR2C6WNeyXxA3e8Nee22aRE7S78A99uj6PscnbuboMvSopaTXBF6tFjCL +eql+01YrzSYGMRhomse8Nm7INzMMO9g6JH8Uer0ddiIa+DAS3o6+6N507oXJUAvV +jwTn91OkIidWLbR7Ma7tcrLQ8lpHSliNqXNut26QJ04hHgXlZRWapajqbhxwxvBr ++FuVw0GOyKUeYCnnY++lZGwZ9UP9qjcd9lb15jEOkHHqyJVOqByKrJbbKd2c3ZQD +Sn1vkj8idXn4yvQrRxEaF7mqce2FxprHfPWPT5321COr4hpnAgMBAAGjgZswgZgw +CQYDVR0TBAIwADALBgNVHQ8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwNwYD +VR0RBDAwLoIIcmFiYml0bXGCF0FuZHlzLU1hY0Jvb2stUHJvLmxvY2Fsgglsb2Nh +bGhvc3QwMAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL2xvY2FsaG9zdDo4MDAwL2Jh +c2ljLmNybDANBgkqhkiG9w0BAQsFAAOCAQEAXH4BlV00gvdPrAdp2UuF0G6VAKgr +KesZ0lsVBx5jCNskeXkI1SU3BvfltrfY2PKaWVA0Sow+4jiZkLnFkC581AmlvEPg +SgW0S/STdWojWrt3apBloIfapE++jQzcs3ATnaDeOQvb/fW/MUPZEuZfFn7wiX59 +c0obO1rqix5Qyf1JXyy38oh/4SdqeEXsI3l26qSmE7x41YbXv0d5wp+p6dXrut5n +go/cC4TszSHb+/b6Nh+fFiPojqMDEpt5biTyZhGkJMIFrO9MvHnK6w9d9RUYRv3x +aZ94ouB/16wit5ZUMGkFNPlHwwxKC7Aqare6PNzVi6RsIf4tZtgIzSvokg== +-----END CERTIFICATE----- diff --git a/scripts/docker/rabbitmq-4/certs/client_key.p12 b/scripts/docker/rabbitmq-4/certs/client_key.p12 new file mode 100644 index 0000000000000000000000000000000000000000..c521ee76d1c5ed2bd9c6dcb7b23aab0ca4efb85d GIT binary patch literal 2509 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 literal 0 HcmV?d00001 diff --git a/scripts/docker/rabbitmq-4/certs/server_key.pem b/scripts/docker/rabbitmq-4/certs/server_key.pem new file mode 100644 index 0000000..80aa4c3 --- /dev/null +++ b/scripts/docker/rabbitmq-4/certs/server_key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCn4YdhQYOXFt+X +zwFU2X53FDMLlQBO42vHod086nyvcRiEoTVNCgNvCTcsl3aKamfCzFIcshTtGaWc +Qyok1CEal3jig4Gx66tr5x1zZV+eAz2HqaJkW4BRgxm6jYKo6PlihF607c2O9TPl +Zwndl16+0476yPmEKFOITxYa0lykLsqkpWTeDgUoaqi15SRhj4i2Pz2v52aPL2zc +G685QCM40wA0+zK5fyncZ54/PdoyWI+ofapASnY2MZCQ/ty3lsG8G0MAA57zBqid +YWJ51MH2PO/Di6mmCwIC+aaonUrW0GrtdVDz8qyrDOVIxPHAUuk0OGiIdtFU02pX +j/BXlrhPAgMBAAECggEBAImRFkWM0M7TUH9ugpHL84SSic2Y2HrMgvpAWjFbmLaO +/19XVnz9kpi/PXYN23ZLASGwGi0nhFxR4tJsezFYnpPSwZ0j0/g+vOabqRdxX2v1 +DcuIJukDzd99hWzIHuRYnFqtS4oJP6NArLjzuTLaoinO5F/+pfA0t1aAMAXkkUN7 +PJClX1/7/OD9bqC9+TvAWhGWJflSLm5A+OG44hwvuSsH7UTkyotgqbO9Xmm5N/e5 +k4ZwwmA+wRxlVXcA1EcfH0gL8FOW3sRKaAjXl+6ssM9M7ueo1ESOxJCLaUpH4o/E +djITFezXf6BRTx8OEI7q+77KnpBx+xWccymH7TYr0WECgYEA0L/34HQFIu5Qnn0O +NVoP6SQshypPXdtFfzXU3z07va1ZZXw2+6GR/ObRN7jaCPoa70cyzyZVtZouUbTt +47+pgIpdZ51rN+1xVW09247ikcDQWWnBXfuOus1QS0vlb/eYsoDUI5ZGIle93IHD +NtiVVBY+ESUdhcMOEZIjlec36n8CgYEAzeFocGt8pSrGQy+1PufgYkg3sne7F2Wy +Er4gd8MSZnm90XFJHuZ8wsTEy+wpVnJqAqy2wIj8yauy2L/wmUlKxpUhtWxfFTNy +BPEmY2XatqfyYqU+L3oiT44ZKXQeTDQKcuLahhMZAC9Bq5/ef9VKMyl0eotJ3x5H +eyaMs/2WKjECgYBtkLSrzHl9shQCe6Tff9vmBKSSdTSfEJ3TfQ+z9FHM5pWLXL0H +KfCUCxo44v8dwxgsCvSyIW7PGJPDMvHBnjF7VCReZBOIkUnxCptzB/YHhmpU49so +Vwa9KVJBkx5jvFMbLd8qpo89K0xt1nX97YPDVMFTAmYSdSSHOGsRHQEORQKBgE25 +uZonmkko2uzmiACVveqc5RolhaaRqCbXTJ6qMLorX/RAVqCp15QYgUuTfw+55jfY +SK5riTQB9GVMIWNdfjN2feFmZoc0gulGuX1xKJ8ozKNdSxrVezqZpPo3cnDGfONe +ra1MbHXbYWmP04pjVb32+piBGYR4g/gEV75kEFshAoGAIyB7U8UC/yup071aVNVG +M+Ss9bZ4HvS//VMuPvMs8Jg2+BcLIbtbW1MKrw3nTsYUoDLgx2U7IK4Ys2JKpeko +yXm5nLHu45hrjTxgcBUncwAURkm5Ookfp0WJEonjniN+8BPx0i8it6gsB5fJwzy0 +VH6ZcPshp2KRGIZNaXrgtRw= +-----END PRIVATE KEY----- diff --git a/scripts/docker/rabbitmq-4/compose-fragment.yml b/scripts/docker/rabbitmq-4/compose-fragment.yml new file mode 100644 index 0000000..f60f014 --- /dev/null +++ b/scripts/docker/rabbitmq-4/compose-fragment.yml @@ -0,0 +1,8 @@ +services: + rabbitmq-4: + container_name: rabbitmq-4 + build: ../scripts/docker/rabbitmq-4/ + ports: + - 15682:15672 + - 5682:5672 + - 5681:5671 \ No newline at end of file diff --git a/scripts/docker/rabbitmq-4/rabbitmq.conf b/scripts/docker/rabbitmq-4/rabbitmq.conf new file mode 100644 index 0000000..2ffdf2a --- /dev/null +++ b/scripts/docker/rabbitmq-4/rabbitmq.conf @@ -0,0 +1,10 @@ +listeners.ssl.default = 5671 + +ssl_options.cacertfile = /certs/ca_certificate.pem +ssl_options.certfile = /certs/server_certificate.pem +ssl_options.keyfile = /certs/server_key.pem +ssl_options.verify = verify_none +ssl_options.fail_if_no_peer_cert = false + +# To ensure common behaviour with RabbitMQ on Amazon MQ, the broker-wide default is set to quorum +default_queue_type = quorum \ No newline at end of file diff --git a/snippets/app_configuration.yml b/snippets/app_configuration.yml index f8bb940..29f66c2 100644 --- a/snippets/app_configuration.yml +++ b/snippets/app_configuration.yml @@ -1,5 +1,5 @@ --- -commodities: ["postgres-17", "elasticsearch5", "rabbitmq", "db2_community"] +commodities: ["postgres-17", "elasticsearch5", "rabbitmq-4", "db2_community"] # Optional expensive_startup: - compose_service: name-of-service-from-compose-fragment From c3bca3ff0640c5330e12bd7fe27add05c005d3b3 Mon Sep 17 00:00:00 2001 From: Matt Shaw Date: Mon, 23 Mar 2026 15:15:28 +0000 Subject: [PATCH 2/3] GOV.UK One Login Commodity (#181) * add compose fragment for commodity * formatting * docs * named container * remove host networking mode * use dockerfile instead * formatting --- README.md | 11 +++++++++++ scripts/docker/govuk-one-login/Dockerfile | 1 + .../docker/govuk-one-login/compose-fragment.yml | 6 ++++++ scripts/docker/logging/server.py | 15 +++++++-------- 4 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 scripts/docker/govuk-one-login/Dockerfile create mode 100644 scripts/docker/govuk-one-login/compose-fragment.yml diff --git a/README.md b/README.md index 3701de5..c617428 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,7 @@ The list of allowable commodity values is: 19. valkey 20. prometheus 21. grafana +22. govuk-one-login The file may optionally also indicate that one or more services are resource intensive ("expensive") when starting up. The dev env will start those containers seperately - 3 at a time - and wait until each are declared healthy (or crash and get restarted 10 times) before starting any more. @@ -379,6 +380,16 @@ bashin redis redis-cli monitor ``` +###### GOV.UK One Login + +The GOV.UK One Login simulator is a development tool that lets you run end-to-end tests, so you can: + +- test and verify specific user information such as names and email addresses +- request specific error codes and learn more about what they mean in a test environment +- test integrations with GOV.UK One Login without going through account creation + +See [documentation](https://github.com/govuk-one-login/simulator). + #### Other files **`/fragments/custom-provision.sh`** diff --git a/scripts/docker/govuk-one-login/Dockerfile b/scripts/docker/govuk-one-login/Dockerfile new file mode 100644 index 0000000..a020377 --- /dev/null +++ b/scripts/docker/govuk-one-login/Dockerfile @@ -0,0 +1 @@ +FROM ghcr.io/govuk-one-login/simulator:latest \ No newline at end of file diff --git a/scripts/docker/govuk-one-login/compose-fragment.yml b/scripts/docker/govuk-one-login/compose-fragment.yml new file mode 100644 index 0000000..b271889 --- /dev/null +++ b/scripts/docker/govuk-one-login/compose-fragment.yml @@ -0,0 +1,6 @@ +services: + govuk-one-login: + container_name: govuk-one-login + build: ../scripts/docker/govuk-one-login/ + ports: + - "3000:3000" diff --git a/scripts/docker/logging/server.py b/scripts/docker/logging/server.py index ce460d0..bb48b80 100644 --- a/scripts/docker/logging/server.py +++ b/scripts/docker/logging/server.py @@ -3,7 +3,6 @@ import socketserver import threading - HOST, PORT = "0.0.0.0", 25826 syslog_pattern = re.compile(r"\S* (\S*) \S* (\S*) \d+ \S* (?:- )?(.*)") @@ -23,7 +22,7 @@ class ThreadedTCPRequestHandler(socketserver.StreamRequestHandler): """ def handle(self): - while(True): + while True: data = bytes.decode(self.rfile.readline().strip()) if data == "": print("Connection closed", flush=True) @@ -34,8 +33,8 @@ def handle(self): if m is None: # Not syslog format for some reason, just send raw message to console and file print(data, flush=True) - #with open("/log-dir/log.txt", 'a') as file_: - #file_.write(data + '\n') + # with open("/log-dir/log.txt", 'a') as file_: + # file_.write(data + '\n') else: # Now, is the message valid JSON? try: @@ -48,14 +47,14 @@ def handle(self): # Send nicely structured message to console and file data = "{0} {1} {2} {3} {4} {5}".format(m.group(1), m.group(2), level, message, exception, traceid) print(data, flush=True) - #with open("/log-dir/log.txt", 'a') as file_: - #file_.write(data + '\n') + # with open("/log-dir/log.txt", 'a') as file_: + # file_.write(data + '\n') except ValueError: # Nope. Send half-structured message to console and file data = "{0} {1} {2}".format(m.group(1), m.group(2), m.group(3)) print(data, flush=True) - #with open("/log-dir/log.txt", 'a') as file_: - #file_.write(data + '\n') + # with open("/log-dir/log.txt", 'a') as file_: + # file_.write(data + '\n') if __name__ == "__main__": From 121ea0783ea793348c210bcbadac8420851e28f9 Mon Sep 17 00:00:00 2001 From: Simon Chapman <7984422+sichapman@users.noreply.github.com> Date: Mon, 23 Mar 2026 15:34:51 +0000 Subject: [PATCH 3/3] Update version from 3.2.0 to 3.3.0 --- logic.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logic.rb b/logic.rb index eebda62..680089b 100644 --- a/logic.rb +++ b/logic.rb @@ -75,7 +75,7 @@ # Does a version check and self-update if required if options['self_update'] - this_version = '3.2.0' + this_version = '3.3.0' puts colorize_lightblue("This is a universal dev env (version #{this_version})") # Skip version check if not on master (prevents infinite loops if you're in a branch that isn't up to date with the # latest release code yet)