From 1c4460f4b3f51ad26af1eac19787a94baf88d06f Mon Sep 17 00:00:00 2001 From: Behdad Kardgar Date: Thu, 25 Jun 2026 00:06:47 +0200 Subject: [PATCH 1/2] add Kubernetes manifests for eshop-microservices including services, deployments, and configurations --- .gitignore | 5 + Diagram.png | Bin 0 -> 349617 bytes README.md | 181 +++- docs/k8s-guide.md | 829 ++++++++++++++++++ k8s/base/00-core/certs/.gitkeep | 0 .../00-core/configmaps/api-gateway-cm.yaml | 22 + .../00-core/configmaps/basket-api-cm.yaml | 20 + .../00-core/configmaps/catalog-api-cm.yaml | 17 + .../00-core/configmaps/discount-grpc-cm.yaml | 16 + .../00-core/configmaps/identity-api-cm.yaml | 19 + k8s/base/00-core/configmaps/jaeger-ui-cm.yaml | 22 + .../00-core/configmaps/loki-config-cm.yaml | 45 + .../configmaps/order-command-api-cm.yaml | 18 + .../configmaps/order-query-api-cm.yaml | 17 + .../order-query-eventprocessor-cm.yaml | 25 + .../configmaps/otel-collector-config-cm.yaml | 68 ++ .../configmaps/prometheus-config-cm.yaml | 32 + k8s/base/00-core/kustomization.yaml | 24 + k8s/base/00-core/namespace.yaml | 7 + k8s/base/00-core/rbac.yaml | 208 +++++ .../00-core/secrets/cert-password-secret.yaml | 8 + k8s/base/00-core/secrets/db-secrets.yaml | 49 ++ k8s/base/00-core/secrets/identity-secret.yaml | 8 + k8s/base/00-core/secrets/rabbitmq-secret.yaml | 9 + k8s/base/01-databases/basket-db/service.yaml | 24 + .../01-databases/basket-db/statefulset.yaml | 66 ++ k8s/base/01-databases/catalog-db/service.yaml | 24 + .../01-databases/catalog-db/statefulset.yaml | 66 ++ .../01-databases/identity-db/service.yaml | 24 + .../01-databases/identity-db/statefulset.yaml | 66 ++ k8s/base/01-databases/kustomization.yaml | 20 + .../order-command-db/service.yaml | 24 + .../order-command-db/statefulset.yaml | 66 ++ .../01-databases/order-query-db/service.yaml | 24 + .../order-query-db/statefulset.yaml | 66 ++ k8s/base/01-databases/rabbitmq/service.yaml | 30 + .../01-databases/rabbitmq/statefulset.yaml | 68 ++ k8s/base/01-databases/redis/service.yaml | 24 + k8s/base/01-databases/redis/statefulset.yaml | 53 ++ .../elasticsearch/service.yaml | 27 + .../elasticsearch/statefulset.yaml | 74 ++ .../02-observability/grafana/deployment.yaml | 54 ++ .../grafana/provisioning-cm.yaml | 28 + .../02-observability/grafana/service.yaml | 11 + .../02-observability/jaeger/deployment.yaml | 69 ++ k8s/base/02-observability/jaeger/service.yaml | 25 + .../02-observability/kibana/deployment.yaml | 45 + k8s/base/02-observability/kibana/service.yaml | 11 + k8s/base/02-observability/kustomization.yaml | 23 + .../02-observability/loki/deployment.yaml | 56 ++ k8s/base/02-observability/loki/pvc.yaml | 11 + k8s/base/02-observability/loki/service.yaml | 11 + .../otel-collector/deployment.yaml | 42 + .../otel-collector/service.yaml | 18 + .../prometheus/deployment.yaml | 56 ++ k8s/base/02-observability/prometheus/pvc.yaml | 11 + .../02-observability/prometheus/service.yaml | 11 + k8s/base/03-mail/kustomization.yaml | 9 + k8s/base/03-mail/mailpit/deployment.yaml | 58 ++ k8s/base/03-mail/mailpit/pvc.yaml | 11 + k8s/base/03-mail/mailpit/service.yaml | 15 + .../04-services/api-gateway/deployment.yaml | 72 ++ k8s/base/04-services/api-gateway/hpa.yaml | 19 + k8s/base/04-services/api-gateway/service.yaml | 15 + .../04-services/basket-api/deployment.yaml | 91 ++ k8s/base/04-services/basket-api/hpa.yaml | 19 + k8s/base/04-services/basket-api/service.yaml | 15 + .../04-services/catalog-api/deployment.yaml | 88 ++ k8s/base/04-services/catalog-api/hpa.yaml | 19 + k8s/base/04-services/catalog-api/service.yaml | 15 + .../04-services/discount-grpc/deployment.yaml | 74 ++ .../04-services/discount-grpc/service.yaml | 16 + .../04-services/identity-api/deployment.yaml | 93 ++ k8s/base/04-services/identity-api/hpa.yaml | 19 + .../04-services/identity-api/service.yaml | 15 + k8s/base/04-services/kustomization.yaml | 30 + k8s/base/04-services/network-policies.yaml | 617 +++++++++++++ .../order-command-api/deployment.yaml | 101 +++ .../04-services/order-command-api/hpa.yaml | 19 + .../order-command-api/service.yaml | 15 + .../order-query-api/deployment.yaml | 88 ++ k8s/base/04-services/order-query-api/hpa.yaml | 19 + .../04-services/order-query-api/service.yaml | 15 + .../deployment.yaml | 101 +++ .../order-query-eventprocessor/service.yaml | 15 + .../04-services/pod-disruption-budgets.yaml | 175 ++++ k8s/base/05-ingress/ingress.yaml | 197 +++++ k8s/base/05-ingress/kustomization.yaml | 7 + k8s/base/kustomization.yaml | 10 + k8s/overlays/local/kustomization.yaml | 49 ++ .../local/patches/resource-limits-patch.yaml | 29 + .../local/patches/single-replica-patch.yaml | 9 + .../local/patches/storage-class-patch.yaml | 12 + k8s/overlays/production/kustomization.yaml | 12 + k8s/scripts/apply.sh | 37 + k8s/scripts/create-cert-secrets.sh | 74 ++ k8s/scripts/hosts-setup.sh | 42 + k8s/scripts/teardown.sh | 29 + src/Directory.Packages.props | 1 + .../DataProtectionKeyPersistenceTests.cs | 22 + .../UnitTests/ApplicationDbContextTests.cs | 14 + .../Identity.API/Data/ApplicationDbContext.cs | 11 +- .../ApplicationDbContextModelSnapshot.cs | 19 + .../Identity.API/HostingExtensions.cs | 5 + .../Identity/Identity.API/Identity.API.csproj | 1 + ...24110240_AddDataProtectionKeys.Designer.cs | 393 +++++++++ .../20260624110240_AddDataProtectionKeys.cs | 36 + .../Properties/launchSettings.json | 5 +- .../IApplicationDbContext\342\200\216.cs" | 2 +- .../PostgresConfig/PostgresDbExtension.cs | 3 +- src/certificates/api-gateway.crt | 44 +- src/certificates/api-gateway.key | 52 +- src/certificates/api-gateway.pfx | Bin 4443 -> 4443 bytes src/certificates/basket.crt | 44 +- src/certificates/basket.key | 52 +- src/certificates/basket.pfx | Bin 4443 -> 4443 bytes src/certificates/ca.crt | 56 +- src/certificates/ca.key | 100 +-- src/certificates/ca.srl | 2 +- src/certificates/catalog.crt | 44 +- src/certificates/catalog.key | 52 +- src/certificates/catalog.pfx | Bin 4443 -> 4443 bytes src/certificates/discount.crt | 44 +- src/certificates/discount.key | 52 +- src/certificates/discount.pfx | Bin 4459 -> 4459 bytes src/certificates/eshop-local.crt | 26 + src/certificates/eshop-local.key | 28 + src/certificates/eshop-local.pfx | Bin 0 -> 4363 bytes src/certificates/generate-certs.sh | 7 +- src/certificates/identity.crt | 44 +- src/certificates/identity.key | 52 +- src/certificates/identity.pfx | Bin 4459 -> 4459 bytes src/certificates/order-command-api.crt | 44 +- src/certificates/order-command-api.key | 52 +- src/certificates/order-command-api.pfx | Bin 4475 -> 4491 bytes src/certificates/order-query-event-api.crt | 44 +- src/certificates/order-query-event-api.key | 52 +- src/certificates/order-query-event-api.pfx | Bin 4475 -> 4475 bytes .../order-query-event-processor.crt | 46 +- .../order-query-event-processor.key | 52 +- .../order-query-event-processor.pfx | Bin 4523 -> 4523 bytes src/eshop-microservices.sln | 2 +- 142 files changed, 6234 insertions(+), 511 deletions(-) create mode 100644 Diagram.png create mode 100644 docs/k8s-guide.md create mode 100644 k8s/base/00-core/certs/.gitkeep create mode 100644 k8s/base/00-core/configmaps/api-gateway-cm.yaml create mode 100644 k8s/base/00-core/configmaps/basket-api-cm.yaml create mode 100644 k8s/base/00-core/configmaps/catalog-api-cm.yaml create mode 100644 k8s/base/00-core/configmaps/discount-grpc-cm.yaml create mode 100644 k8s/base/00-core/configmaps/identity-api-cm.yaml create mode 100644 k8s/base/00-core/configmaps/jaeger-ui-cm.yaml create mode 100644 k8s/base/00-core/configmaps/loki-config-cm.yaml create mode 100644 k8s/base/00-core/configmaps/order-command-api-cm.yaml create mode 100644 k8s/base/00-core/configmaps/order-query-api-cm.yaml create mode 100644 k8s/base/00-core/configmaps/order-query-eventprocessor-cm.yaml create mode 100644 k8s/base/00-core/configmaps/otel-collector-config-cm.yaml create mode 100644 k8s/base/00-core/configmaps/prometheus-config-cm.yaml create mode 100644 k8s/base/00-core/kustomization.yaml create mode 100644 k8s/base/00-core/namespace.yaml create mode 100644 k8s/base/00-core/rbac.yaml create mode 100644 k8s/base/00-core/secrets/cert-password-secret.yaml create mode 100644 k8s/base/00-core/secrets/db-secrets.yaml create mode 100644 k8s/base/00-core/secrets/identity-secret.yaml create mode 100644 k8s/base/00-core/secrets/rabbitmq-secret.yaml create mode 100644 k8s/base/01-databases/basket-db/service.yaml create mode 100644 k8s/base/01-databases/basket-db/statefulset.yaml create mode 100644 k8s/base/01-databases/catalog-db/service.yaml create mode 100644 k8s/base/01-databases/catalog-db/statefulset.yaml create mode 100644 k8s/base/01-databases/identity-db/service.yaml create mode 100644 k8s/base/01-databases/identity-db/statefulset.yaml create mode 100644 k8s/base/01-databases/kustomization.yaml create mode 100644 k8s/base/01-databases/order-command-db/service.yaml create mode 100644 k8s/base/01-databases/order-command-db/statefulset.yaml create mode 100644 k8s/base/01-databases/order-query-db/service.yaml create mode 100644 k8s/base/01-databases/order-query-db/statefulset.yaml create mode 100644 k8s/base/01-databases/rabbitmq/service.yaml create mode 100644 k8s/base/01-databases/rabbitmq/statefulset.yaml create mode 100644 k8s/base/01-databases/redis/service.yaml create mode 100644 k8s/base/01-databases/redis/statefulset.yaml create mode 100644 k8s/base/02-observability/elasticsearch/service.yaml create mode 100644 k8s/base/02-observability/elasticsearch/statefulset.yaml create mode 100644 k8s/base/02-observability/grafana/deployment.yaml create mode 100644 k8s/base/02-observability/grafana/provisioning-cm.yaml create mode 100644 k8s/base/02-observability/grafana/service.yaml create mode 100644 k8s/base/02-observability/jaeger/deployment.yaml create mode 100644 k8s/base/02-observability/jaeger/service.yaml create mode 100644 k8s/base/02-observability/kibana/deployment.yaml create mode 100644 k8s/base/02-observability/kibana/service.yaml create mode 100644 k8s/base/02-observability/kustomization.yaml create mode 100644 k8s/base/02-observability/loki/deployment.yaml create mode 100644 k8s/base/02-observability/loki/pvc.yaml create mode 100644 k8s/base/02-observability/loki/service.yaml create mode 100644 k8s/base/02-observability/otel-collector/deployment.yaml create mode 100644 k8s/base/02-observability/otel-collector/service.yaml create mode 100644 k8s/base/02-observability/prometheus/deployment.yaml create mode 100644 k8s/base/02-observability/prometheus/pvc.yaml create mode 100644 k8s/base/02-observability/prometheus/service.yaml create mode 100644 k8s/base/03-mail/kustomization.yaml create mode 100644 k8s/base/03-mail/mailpit/deployment.yaml create mode 100644 k8s/base/03-mail/mailpit/pvc.yaml create mode 100644 k8s/base/03-mail/mailpit/service.yaml create mode 100644 k8s/base/04-services/api-gateway/deployment.yaml create mode 100644 k8s/base/04-services/api-gateway/hpa.yaml create mode 100644 k8s/base/04-services/api-gateway/service.yaml create mode 100644 k8s/base/04-services/basket-api/deployment.yaml create mode 100644 k8s/base/04-services/basket-api/hpa.yaml create mode 100644 k8s/base/04-services/basket-api/service.yaml create mode 100644 k8s/base/04-services/catalog-api/deployment.yaml create mode 100644 k8s/base/04-services/catalog-api/hpa.yaml create mode 100644 k8s/base/04-services/catalog-api/service.yaml create mode 100644 k8s/base/04-services/discount-grpc/deployment.yaml create mode 100644 k8s/base/04-services/discount-grpc/service.yaml create mode 100644 k8s/base/04-services/identity-api/deployment.yaml create mode 100644 k8s/base/04-services/identity-api/hpa.yaml create mode 100644 k8s/base/04-services/identity-api/service.yaml create mode 100644 k8s/base/04-services/kustomization.yaml create mode 100644 k8s/base/04-services/network-policies.yaml create mode 100644 k8s/base/04-services/order-command-api/deployment.yaml create mode 100644 k8s/base/04-services/order-command-api/hpa.yaml create mode 100644 k8s/base/04-services/order-command-api/service.yaml create mode 100644 k8s/base/04-services/order-query-api/deployment.yaml create mode 100644 k8s/base/04-services/order-query-api/hpa.yaml create mode 100644 k8s/base/04-services/order-query-api/service.yaml create mode 100644 k8s/base/04-services/order-query-eventprocessor/deployment.yaml create mode 100644 k8s/base/04-services/order-query-eventprocessor/service.yaml create mode 100644 k8s/base/04-services/pod-disruption-budgets.yaml create mode 100644 k8s/base/05-ingress/ingress.yaml create mode 100644 k8s/base/05-ingress/kustomization.yaml create mode 100644 k8s/base/kustomization.yaml create mode 100644 k8s/overlays/local/kustomization.yaml create mode 100644 k8s/overlays/local/patches/resource-limits-patch.yaml create mode 100644 k8s/overlays/local/patches/single-replica-patch.yaml create mode 100644 k8s/overlays/local/patches/storage-class-patch.yaml create mode 100644 k8s/overlays/production/kustomization.yaml create mode 100755 k8s/scripts/apply.sh create mode 100755 k8s/scripts/create-cert-secrets.sh create mode 100755 k8s/scripts/hosts-setup.sh create mode 100755 k8s/scripts/teardown.sh create mode 100644 src/Services/Identity/Identity.API.Tests/IntegrationTests/DataProtectionKeyPersistenceTests.cs create mode 100644 src/Services/Identity/Identity.API.Tests/UnitTests/ApplicationDbContextTests.cs create mode 100644 src/Services/Identity/Identity.API/Migrations/20260624110240_AddDataProtectionKeys.Designer.cs create mode 100644 src/Services/Identity/Identity.API/Migrations/20260624110240_AddDataProtectionKeys.cs create mode 100644 src/certificates/eshop-local.crt create mode 100644 src/certificates/eshop-local.key create mode 100644 src/certificates/eshop-local.pfx diff --git a/.gitignore b/.gitignore index 6dea8e1..fae8082 100644 --- a/.gitignore +++ b/.gitignore @@ -401,3 +401,8 @@ FodyWeavers.xsd .env # IdentityServer signing keys - never commit key material src/Services/Identity/Identity.API/keys/ + +# K8s cert binaries — generated by src/certificates/generate-certs.sh +k8s/base/00-core/certs/*.pfx +k8s/base/00-core/certs/*.crt +k8s/base/00-core/certs/*.key diff --git a/Diagram.png b/Diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..7cf110e5eaa1763e51656c628446df1dd6846c5a GIT binary patch literal 349617 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�brD$`1Vr_Xl+_f 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

-bjl+{b(dTWsxm9 zSVRUe(kqDG5#%Bs-u)<(i8U9EobML1=ay}i`eek@KTYuv2ly{HbU5IGBy)3_Z&kCp zg^Tkp{ptp|T!6I(zTxBdn^VgpUk9Hb5_j`}cpwdh0&CJ!B*w97ukE>ZkNY1XDF5FY z5A8%FXdK_XdGi$FLBQlSW>W^bCu8X9CW79+odV+P7jg%KPz;o(Pqeh!z<$JU`wItz z03erCR00?5IXJy0G0@vXKn$2vWbP~iT@L38u2E=ZU_65xA40G@0ozBI^S)dy_`=-k zTD-9HyXNKxLzW~(x57(@WeFuPIdERNicq_3&q>Zq5dxVLfJQ?EuBLqvX?fF3@vwHh zOG%I}@af45_4Evd9df&F3(7!D&2Er_h^Q5$&3Co5s30O-jNg5q2h#1PAxn;|d*v4d zH9wdg3LhH_L0vskse=$ zD>@+O+17#BDy?+5cv4?)Z%hYu3>-BmuLn~%{(Yaq3>XEmjF5bsqymnys^kB*mFK&N z@v;A{@78T_bwI=l%t6fnE;%18l`ylgqKZwk5b zYY-0z6}j1>WZ2gv1_qV_XoVnc8#2g1+6oUIbT04-zLqaYC zPFyg!1h;Z^c)=jVSDcqI+bya@m6JzyPutRX z!Js)+N#B>rTP8zspj8*mWTg!)Af)C@`}}#x2#JM3pmroC4_Gu$$fRdxVj9!$vL>$F zkVJHenKzdWdrGBzd?oQI@sUJ^BVHMTVXjpdb-Y)s{x6%BP$}7GwffeaDt#m+bmZEG zNqST82`PuHmMR79xA3kBUB>RSr>g7B%*mZ_s^Nxj8MPGqLta54Fog-&4{o^1K}Nef z(BW|(judpnBwM0?G?Q;`|K3g_`t!uZ#{f$qhyjA=`S<_|B@2h`TJ7}$EG+K}=+k(w z&%910&TEn}kPv{~rSMMVg9H-{Ge~hCf!7yga$`y)zXJXIXxZ3sl;k0C6EbX$ zII_^#Kpo>#M1FxA6@y<*@wW3ES-JhntK}{2%ik=|tHj=Z);vVVz~Q&so@qXKjH%c8IV#Vy*{jTu$t-=#oh?cw{E+^Fl2Yp9V-naVN$B9XYbV1 zz#YRaL(s7oUMmx}kvf9yl_IC2A+h##QkCc8_;@It<0FZk`A_vJ>gPpEE=3LoW>VxN z%rqvIr7*$laG|G9AR`k!Wo~l8=#l?Gxi!&(GMj`vA@r7zI>Z1tA;9X^5H5pwcUc`% z|6$Dky&ligp8f4i<5~&EPfbs+>6~oofbf?xOX)iBA9LcbZvqf+Efwz<(A3Qh@%^OI} z1Az5`xWINW^qjwVvEoU|n?KGl&u?&7R!rUa7>w^oQuX{i`L%1Qvx8!Rk_pG6TIC<~ zWsLrX)WtpL&nS=nh(3YrQM z=Bp)SuYA%h>l+=Xkw{ZP!5E`N_hQ2HGK)#aW!~u*dIo)uG!NlnE4%hcLPV zE&!p1uDK^w9o~L^CcI}`bChwR-4gfy{wd+YtTt!)GDvDNZTW#CLnLG2kHqw!Z*$C3 z6~WVn!vj|iT#oouRBa%#Zih`txApa>lvLET|9i04wite6Z`jkjze1jDw162ggm!E$ z4kzlSHf?~k0E;0I+ZF`eo^pbr0TJi8?{AL37CWSc zYH<}_a-da{(DOth9$;3qr^@Q}M>CO}t*B<9qkG?+VGLsj+`Lh!+R!tu%q+t9HSgkU z=V6^{OVKM)w<^cAo2<2{cU-=ocWgr0G1v;Cz<~-!PB_@cMTu}%Ale#`ra?c{0?1%3 z=qC8>=Lw>v*xvnxmFEH;+m@*VvN znG!i2m~mvJyEh4%l{+g1i;8-2F*ZB7K=iWaG*qg^5!dcwr`0rV^F&D=K~&K!Eni29 z;@cLKCu{^R;Nn8MZP5FvTzJ~=VqzZ3$z66Fvc>|>L1oI$pE{0De~Ib;ZUJ*2qD*WM zwTbH@H|PiF20gDrI=^JvFxP4EOFTFpw0TXqUwX)PZaCd) zl4=8Ri5OLj!h5yguY?QhL6bjz#1D|5FIS*U9>2oG&PIcee?QVP6H<9>P`f;* znl7&YlVVt7T6l|{LceIND7Htil5}SJTV3t-Qr%6bAew>JpG9U!Oe-|X(8qY~Q$nZ^ zI3p`vwojmEzx;#FW_K`ulq@?%7)kSXH z@cl%4{lWZC+-@#;H$@*YXh4!bXA`!W(u4J{oAI%nntbC|f>%>CBKJ(zOxhz7lEL;T zD0vI}GBI%@7*Sy;VC3bExIn>z72ThC=B=rf$6-} zs{$P+@Iomjkt-_3FhN562nb5x{eqW3IjgeaS;^0(dPX}2IyU@o3Q0^(!rBnc@bvai z+)WA|QfUH0%(fJK@-%>eID&(8V>0|-YI*C5zm{{|b{J_F`T|>tUbh)eA{I_O=Yp8`1?cwazOTBj%9#Y0hf za7q7g%EW`kn{USEheC)WDPYptHt)m^e_=}3-Bu#11ycW`>TFle%{%Tc(D5QF4_H&7 zzd73l0d*jmbr{Gk_@fSMO8<7{^=4*eO-5)~j)M>r2)nh(NKf&d1os%02Rdvh6A%zY z@9jFy4tieBiuC-Jpfw0x%rE3x2aWZ&m|Fo5NKHUUcn?57G+KLovZJ*X5UN7xb?t_e zR=n&cCJ2DMW~U60vXf?noV}RiK?q*^JjV1&@=|xIijKL1Yxlac4E+-Y4BWc2m~w=e z-JN8DHf$v$_Q1F{jUoiL1n4>u1EK-3~VeZ!pHyPv6i zVU|@?GG^0#D&1!#OwbdcJx7@oJCDMuprN%uFsVGh47)_4kIGy#vYBRJ^9#}*rG5CY z1{+Lo7N;*!?;IXl%zIZeePiCgPf?xqkL`c5XrY%t~ zE}&yF#g>}laGBak%>@lp6Uym8TqkJ$&ZYYYA%ZGoZx%Eq`uh5p@$tVWTS2BEOn1KU zav^w!HaH}pf*`@twvqa%VTVh=WnC8U<2;{LQa_iSI;Ki(SrX8dDj60NFCJqZYJ}Z8?sj$bI#+Nc~KeAwaPjT3=@<`o=Qz#$jo263Aky%BlYt7OmNTZ};wl zH4kEP6cyihgFh+QZNb&ap3`g83k;SZ(|IRjrm{YVb@3~J+lQae03OUn%<6A?N2&LV z_#gr-APDgmRdc@l5BY(WOK6|^F!WV&OvyVa8hxNzWR zhwOy;9%jVbo#%OE2Ig1)rb${sLErIbj5oNS3C82UJ3U{HQWMZn|JEgr1y%P>HxEQX z0!O$05fA~8J~4*McVS@W%5o%@IVBB zV+v&sgU&CuwPC){cb|%ns!+CXa{uypntxWBBDrUMU=i24U`*rnE~G zUm^K+AhF{0&Gg5}`~dMX0FW@inKbDpo9fwv>r^Uxc>T{$hSKs1x8g#)5%e)K?Z^-aML-v&3p+}t=K zV+-A?7$eBw?D!`CDJ%SvRrQXU|9h_gK6Xv_-#|NbXjqtc?gFIbbyccV6Gs*qlj~Tj zw=Pt>gf>yTN5OjSmm{!m5wie;g_T9M!h!wuB~L%oi|HpJ^8Mc8a^&9Q7-w@ZxO6vt zGT)L4MZ->~0+S_dyu~)u<~L?d4icCozQI};WHC0NZ6WX8A;x3BfBWG)N@5CRnZzplb|2#Ph># zgYVtv)($ts=xAw^2iE1gx`u35DnU&M-Nv5l53#wQu9vyFFEB+EA3e-o&_3lGnD8a! z$}<7?^|OiWdsvu~c=Ar4y<*TT00O||fXLWk0VpIn!zim)kVJ9rwgRRF5W0p%dcE1I z7QCQ&ob62)a~#^a?Cp!!WLSu${Pp0_);Q|keMti9D}D`nHPbc_n%@i%Yer_~I3liL zd`y@>G1*|}|0t=$>l4a!Fz5N;7t^A5y!!l=2e?zWmo0g-)muWv4>FiI>n3d`w_Gx_ z@|xysl37?77=ZPHtv8hTcR@6{=BGt^li9nA;0El*5O9?JNqz3MuSaAeyYAM<;5Q3| zZ6HqV)-!Pa@1yi7)t36(L<9ArUa5u)S)vT-F0hou{EkC)D;nL>1%JCO|AR-5U~^nr z!_z`o`w1dx8V^rAB-;bM%;qn0x{Vm-HL0gHvl}ImaX-C{Ja_TIU<-p#Ad;43yH9BF z!3a1lSbIaxqMw-c&=Q_v0A_$;%~^9^p=90hdIx_H*1YJNw44BN5^hx!?4*)#m~3aG z48>1r$s40@ivl~u!ouPNDx?0`%7Cq`2*8zYn`^p#sad@bn@Qi2-VCL{ z#M)|HyC~NdR<7mo~z=RBz z3jnZvPja$s$7}=(m`v*mUP)diB6tKljr4>XuE0&KZ^siOQMa&FEOdE<2}Y!`vCCkc zktc-50@o~rrN3Trn-PMcY!wnsgJc$z-+|f&X@bGku;KA}#Mgs?!T!TW{OH&(p=J0! zV_Qz0xM#%s3VtrC=HQ0c5`7pa2W#c3!y+k$UEP$E2estR(gfD%2{m|?msWZIurE%i z|E}%Ctm6W8d3v{BN=DMB&*o4ly0Vq=DEYnG49&W$;DAI4TMMroyVEArQ~OBNKP}`_ zWH>S9AL5e1sjCMjtn!@paD56(KMy9zi}YUVmO=*(JT^Z5&-h$sT%s%r?*S$jY=&~n zxWU)fy05>T_+$&+#fY=t;*Z}#8WuD(#ys(fQBhI8Po3;|@;VYbnpRE#S!jgaxdADv zr?W{dd6#7534wo|Ugy~yg^(mxUe``cGpEV~JetA1zD6Dy>|kocHpYPH2yQ>PgLU37 z{V_?_7d`xqiUi?XvI#jr4p1oU@~|Wd_i>pWS9)JBR~|swZ-e6gjmmN8#gS&d&}C3} zGA25`Ejd|N38HCDH9D~a#LDZ$Cm6S`e(pymdSh%o?xGDVc2v^S6m`P8-fU+z*g+8N zU;FBXO)B?cj!uMa2AUZ3dvfv~z;JZ&1dff38O}^sfdDl>UeMyXFjjR@%Ri8fu+ncJ>ch0&=tldqfx|lTyJoKlOEad)n2=nKd^{<#iko4X@~u0 zhlTi#i-4OIr&)x@m(Dv!QLqFihQYJ)kFv4rQi#Z(IJM?v|5u*M`!`78w!h11e8Jbs||0GCj=C{}uUXr&p2P*uMyI0=B&kr|&6 zOpko{8Y}OP!eE)SokI0cg6|kVi*dxSn$^~?h9w1{26U^k#z~l}`mg zofn)SGB;8w5-<#bp{ z>CAZ|H>o$wxKd~|cpo(1(&_wc#JEcG#u;oQ1(V(OoX%J~h30Fn(h2+#1Ay$`yH`&n z(D!Fyxb=IF`Z9&de6%VaGUZQafqCk?;@#TX*yF`4>2A6kEa&RDz8il1cj2^r&Z?A4f&F^YZb22)WD*jU zcWbP~`T9R^-~3oT1Tvc;yKWhTj0MZOVXHbDak=A)ETHAqLh;#}+uZ4oi9&}e868}? zl(UHHI$=!_boFvtYVCfLm~MyTVtd`O)z21420K$B8m%Mjt+iBuF9n$(#_ zxa~exw)lBZOA-IfvYU@}$2Wu3qsLvDJ68!`a(~86XJ#w7I1Ecuiw{n<1O)85E!q5F z*Qxb;Da;da|DGa`Lo8LVo=LfH6-yXjahawpuwsS-uhj^rm!@AO9>0eK)e5a~n?K&A zQf+3#Nypp&D>N!mx}>oGGkksh27_#L&4#Vc9r_UcqOTCR;5_qqBQq=W7ufWFAy6uS zZndUG#hI574Kzu$8)i3oZD}mcRbjzpO)r6bpOVw{J_F~AHRNFTD>k1@SYTGoKF>>-21cAf!gw=GPH~EjSUr%B^GUI{1b4W{LZndf7E4<<;w*W#W!Tt zil@y#g-MiE!!x{(D}PXtja^ZoT9y33ws;DMHPQpo3^MuG#ygIDg;IS7NRg~Thz&@G zhF2-8FW+X87>^|K%J*ld&a8MwTo{d&Ow?GW|D=E&!+uuc!l%0>FC_}QGgUlYWU8V& zGx#Zu9^0-viN^ME%$z)58A)BtUT_WeOfc$Lj2;M+wj{8*j!|>@g5G)K6h&hk_Vemj zu80(gWEE%SFIqbj&t$NvH4*2CEXi*Y)}Wu3Ip1S{ljL=c=_&@n^~-NHr}1gW@ohTj zq7OXUX~ZvUgllj`@4MvOGBey>oQWRYa6KM85E(7A-TVHj$T2OaQp6x9;v?Hl9^tqp z5si%=g51m)yA!`FnS7@7Bj<`cr@X^TpWU2|xVF^}S(XG-Ooh zPq&0SZ<*n>ktH6x36jTmkohu7nN=nzT^dQ`OxSv?=6nzgYq$?Jts98umX|&5=sLZF zm^*=!^)lP_K-S!r5!+ugs|}v-mYKU1go8UP)Rf3ZjobR~KQaZ3+EP`?z}Sgtw0x6w z?^hqkHx%wdw}`Witk}`!4AGOFt*vQ*EZU=u5~6#RB=JP&+@rVWF-@cwWtHgLYP9kj zuQ9i<2>lRE&>1?+8L~a%E8IQ~C+n}erLYqdah;eZ%=;Hr#EavqA^Vy2_iZoOoQ8Fs zH)4a^hRSSpRx8i^{TuJPKl|r5j_=xnOy8)bLD%m;MnYAp=9At_>-RjJfKq=Pf**c&OTbT_)c>>e5261uH24?TmUMlEo=fX0+P|Q zeFNFESGGto+FVk7QpY3IXq2bY-sYoLsGyX?jJ`IYl$GcIiMRa5-j_O?FEoiEnOIc} zm1Z;@zD2>)35g@2v7W2LLu->7HnX2qX1d|=ff(QhtXd%O`RA7wzLa7Gzy3BqFz!0Y z_HD%9?>sf0IFr;z86y>zE^I_trQj-g{mjvk^H^0yVNNLd5aD z_GBt-bRO;eij9nmY>VYJ{8oBl&e#t1;loz+t);i09MSJS^_iJuitOmGk(kb`kdw}K zw277Ss%Uvg{SaMKo!@eS5c1e=Ss`{e^afbYVqZ-kv1_U5z> z9yBf&si^-HR4~h7WWLW~9I1If^y3G10v&F~Ji%q3#iG&AgyNNCAo(h0kG0v+5^JR@ z8BG9IAWb>zLrxAm1olTR)BOEmfAQq~=NG4E|*0OZm7h=B{9P>VlTs#?*nWO9u zPjhK+E@x}a*4WWkW~;tM1)uP*sAo6q=X)TV_jAV9w|F5w04t=QKi7#EwRxt@cA)!1 ztc-zx;qfEM)SCtZ_z)>m?w>aDB(3N}gbj)0xYT!Zyct&&_nVQPTQ7x+_d`Dw7aLX| zZMSBoC&WPB=!Y(2;k=D(cT)@aaT#p}e~j_>BRDi-#Kt;x>S-_!5OSZ#ai2Fsyam#jUSoY;aSMxTz1%K{ELMG~q@m{e z^_&&8vTG$LyFcuB$({QuM#3Rp`*T`GX+?!l6Q!**?8b_7UEWty9;sq$wfxNDedf$u zg5dR{kCf44@z*5OP;Bptf85y8B7LQz6#nAH@nV0Kh)%`o#j^DU5~B@N;N0wNGX@rA z2yC0Fa|Q`)3`okvR%~;1szpmiKGI!Me)j!%p6|mCQSSJSpl_?YQqE)koCa<0R`kEs zOCfcjMcrSIGZmv=?@Ke~3ssRc!!D0d(((J> zKJCQ+a}rLyz5EJZhWw@&QFj+XK|vdEj!yeACNz8RjD}aDq+6$$yFJK!Rg}<1R0@P& z$G+Uo{k++#w$<6uJvwY%f4-chjl|0dTPE{`!}97ZrVBU-WW0ulD@*} zKZ8@}cq}Xx(`NXN<;eZ0Y#Oy-J5F*U(C4 zn8b}86qKzNVtZ1{bD1BOlCCQ(zpadwvRHg?*M3m<>04YFr(aAbKCc~;5D#-ljc38Gf%Vh<^q@6at3#|t_$&8b1H^XFNt5?qi)( z$m+deHhQ#<6%h2bR!sH1l&g%?yPlRCIa@9*>g-Za(xm-alnSHA$H#H-@bsNZqZ4v8 zY>sY4&K!&$Iq>G_M8awNVLCTI-vYZfZNX7A1KT#f!70<(+y~iEET{Wgz+RtgaoWMJJ7 zQ>VP-kzmuZv6mNtp?D{}-h6$a;F%;E{m@lIL;dH^kCo|+Qr|~L5@0di6hY$dy&%E) z3_Cl!&x>Y*@b3XEACu=c%~}Tg8`o!3gHh?}jPRC;tO-T;41=2A$gt&8b5x$Aq)V~+SM+O-1W9TSE($*3aIoLKH-N=~5lDrGjDYso(ZgSHcHgB0 zcE`MtM(N#;N=PG*JNdvl9Y-S)weOdnZogi2!i_zeNl&JEaJ%?$jABl0Kj+i7aJak9 zPUAO$eXVGl)rBW3l!+H$Dd7tiUVqRoda#JRk+2*|)z{be`{-yQ zWE1MIPkn{W$S&>tARlsDt;y_LsNUGJ7%so1vs+7I1NpEsp_0^JA&T!NKYtV*88x-6 zT0}?vgoM2CO;T4QVePEmC$293PC3etTwPtEVNayAuD`MeUbPK?nLQ(AL`UIj;SfGK zJlyDQeIm5xZ9REbxEEuqu(_?jZ$_+toERVHu3gR4R@46f z+B@>ECa)~hp29c+o=$Nn2-1;O2oS*p(GZrl779v0wu9_;AjGh*2@pf13nfh2mqcF zKR*TR@4-sj>sWAh77g?S5GKW+5hW<~sm}+F0v?`uKs*Mc0B#u!#^~#^BLSz~N9~|AwxI1IMVF1X(U~cDuAt*>F@%Q&9PySR>gTK7~xsOO%nXuToAdQk0H?*=$`T2hN zDv|6{bt#gSrMSuGNncO8?ikK{TQCC#7{vnwxUv{XfuO;kpVr)ssn z@}H6{56yR;;FP9Ewp)lz{EEL@6+3KOJ{zk|d*VJCI@Bh8Zl0b@n`2O7N4)iTX@L?e z;kO{a^}03W^m55PU8Gx;Lw&$yS|eH23#)$2z%FlY8(K@B7=HYC4LNQ6c15}_2kD6? zdvQCbz>{Y?yun@Z1X0p}Dz!ocY3n|awD}IhX2&4N-fF{s!G$UD`9Ke-a2JAQNq>nS z@GZVqf1){3IBXTYe|%xO#by>Wc!^(l*0Eo8D}w93Go7zjBEBtoQ_OJ*^chZh^P*+Q z)`FLeQErVuQ7cWjU^PAbW*^cIv#ZY!ZL;Mha30P0Z|Q((PX_x~t2c%Yda1Pi@oBlJ z)3N#>nO(ZfPi~gYmCes&%DmbH`+^aM;9lRA{RIr`CX7X{^sWvX>}rwSiKER*%YrxP zn&@uyJZ7s|@8yrJGS3ipr0WWETd+Q2eCAS=kK(Jwqa0~Quu0lEEY>k>zECv+c>fGi zwU3PER)(JTgpXZ|@_GG%lYGU>%PlzxQ*u}bK1$YXHhZs^w3}`vIz}SL7!VEpGiBy> zQ~BjL-Z#}V&n>4Lmo(ZK={6=`WI&m)6YY|aCL|lNs5zbO!M)=xbQBMqX~OM{9}2)rI6xibeQ6Sph0=9M zk~PHaEUC;3rIpJIlrqCF$XZmblU#CAvkg2=SDvCT>-%TUOth^rs_^1K42N9 zAU?6O%L&~rNH?zwM6`#h*O=HVXSUMmfYb)zqqGz-lsY06%7l{i8{kA}rYHI>eSIo! zulhu`3zP(vs=ceIE%?|3X z3GDibsxfwjn%WM$IiV#bB}_uy0gT@<2}{7^=PPra``^>_`{6uC2-Ui}H4<()Ph8mR z7gRq$qo_}=P#3>*QEM!ESevE-|NA$#`&V)H&ynx0Wv|vzFJ&8{y{l~)#&)Ycn*tmv zl-GIRhYs>hL74=~e}OtdZ)phz0gCp34;|$WacNe|w-GHqHy^U!DYogfS}r#tj3B;lmAl{f zdOdu1!5fDj_ZN{yns+{f7;sMUQl%cAa7ad_cU5>D<~pCDQNK0%gzv7tT`lVrYDv0X zMl61@1}f`-f$d%&Yn$GP@)r5x4{*NuYo**2@GNN&C}Y5RWCKLyKm_i-(1a&QCO1vk zmam7Tl<+pm2v&W?VJ!Ug9*;z_fk9Y%T$PMdz`$fqsilShL2YWhbljeh<~3a!ArOC_ zw$cs}PT&z6K#R#W_N5el^M0rAH^(qet2; zbKXCm{;^$H#tW~SG=T6_+h)dn&L$j7K4*&FvB9cu*BJJjrz?->Xgj&)Lt3r#+Vcc1 z^o2FBzW@P=B^6Bq1I_9RSNQ!&63X$e<2mK>6+%r+j!mR$Kawy;-mXlFARw+w45>i|zZwkw)(MENY;VBkFC@ZTiR& zYUf(1ebQm*PGf&tBMC;YrMWv(a#K+!+{409Q>_ppms1id?inaTz~z~GZv z>kqDDQT6O>#@X*Z?g;YQs|qlSlgZLWQyB~d>5p-?TKnQNIoSZEVX$KBcAYEXY``rsLiJA$#nK z*xww9dnMTedKyyt2V7%@65%$%at7VO+=SVN2PoaAuUZ zXk|a9Iq32>2$WKsB3h8kfItCgXBMa(v}0y;`(S{1Aj?lIaG0N`);09!-l^}41{zTF zIRZ+jz&44$mb6L`P=E*E7L!0e>_J75f(s>jtEsBK#Mp|x2f-O!IV}J_BK=1Uih*$p z@oT(%Re*BS|5FY1gG>3ZSw I thought its a good idea to write a little bit about the k8s setup for this project. I try to explain the rationale behind the structure and configuration choices, so it can be a reference for anyone looking to deploy a similar stack on Kubernetes. + +--- + +## Table of Contents + +1. [Why Kubernetes?](#1-why-kubernetes) +2. [What We Are Deploying](#2-what-we-are-deploying) +3. [Directory Structure](#3-directory-structure) +4. [Core Infrastructure (00-core)](#4-core-infrastructure-00-core) + - Namespace + - RBAC — ServiceAccounts, Roles, RoleBindings + - Secrets vs ConfigMaps + - Certificate Management +5. [Databases (01-databases)](#5-databases-01-databases) + - StatefulSet vs Deployment + - Why Two Services Per Database? + - PersistentVolumeClaims +6. [Observability Stack (02-observability)](#6-observability-stack-02-observability) +7. [Mail — Mailpit (03-mail)](#7-mail--mailpit-03-mail) +8. [Microservices (04-services)](#8-microservices-04-services) + - Deployment anatomy + - Init containers + - Health probes + - Resource requests and limits + - Discount gRPC — two protocols, two ports + - HorizontalPodAutoscaler + - NetworkPolicy + - PodDisruptionBudget +9. [Ingress (05-ingress)](#9-ingress-05-ingress) +10. [Kustomize — Base & Overlays](#10-kustomize--base--overlays) +11. [Helper Scripts](#11-helper-scripts) +12. [Day-to-Day Workflow](#12-day-to-day-workflow) + +--- + +## 1. Why Kubernetes? + +Docker Compose is great for running the stack locally on a single machine. Kubernetes takes over when you need resilience, scalability, and a path to production. + +| Problem | Docker Compose | Kubernetes | +|---|----------------------------------------|---| +| A container crashes | Stays down until you restart it | Automatically restarted by kubelet | +| High traffic on catalog-api | Manual, restart with more containers | HPA scales replicas based on CPU automatically | +| Deploy a new version with zero downtime | Brief downtime during replace | Rolling update: new pod up before old one stops | +| Drain a node for maintenance | N/A | PodDisruptionBudget guarantees at least 1 pod stays alive | +| Isolate credentials from config | Single .env file mixed with all config | Secrets and ConfigMaps are distinct, RBAC-controlled resources | +| Restrict network traffic | All containers on same bridge network | NetworkPolicy enforces allow-list between pods | + +> **Key Takeaway:** Kubernetes is not just a "fancier Docker Compose". It is a control plane that continuously reconciles your declared desired state with the actual running state of your system. + +--- + +## 2. What We Are Deploying + +The full EshopMicroservices stack running in Kubernetes consists of **148 resources** across these categories: + +| Category | Components | Count | +|---|---|---| +| Microservices | catalog-api, basket-api, discount-grpc, identity-api, order-command-api, order-query-api, order-query-eventprocessor, api-gateway | 8 Deployments | +| Databases | catalog-db, basket-db, identity-db, order-command-db, order-query-db (PostgreSQL 16), Redis, RabbitMQ | 7 StatefulSets | +| Observability | Elasticsearch, Kibana, OTEL Collector, Jaeger, Prometheus, Loki, Grafana | 1 StatefulSet + 6 Deployments | +| Mail | Mailpit (SMTP testing) | 1 Deployment | +| Networking | nginx Ingress rules exposing 7 external hosts | 7 Ingress resources | +| Security | ServiceAccounts, Roles, RoleBindings, NetworkPolicies | 10 + 2 + 9 + 20 | + +``` + ┌──────────────────────────────┐ + │ Browser / API Client │ + └──────────────┬───────────────┘ + │ HTTP *.eshop.local + ┌───────────────────▼───────────────────────┐ + │ nginx Ingress Controller │ + │ api · identity · grafana · kibana · ... │ + └──────────────┬────────────────────────────┘ + │ HTTPS (port 8081) + ┌──────────────▼────────────────────────────┐ + │ API Gateway (YARP) │ + └──┬────────┬──────────┬────────┬───────────┘ + │ │ │ │ + catalog-api basket-api order-* identity-api + │ │ ──gRPC──▶discount-grpc + catalog-db basket-db + redis rabbitmq → order-query-eventprocessor + │ + order-query-db +``` + +--- + +## 3. Directory Structure + +The entire k8s configuration lives in the `k8s/` folder at the repo root. It follows a layered structure: base resources first, then environment-specific overlays on top. + +``` +k8s/ +├── base/ # Canonical resource definitions +│ ├── 00-core/ # Namespace, RBAC, Secrets, ConfigMaps +│ │ ├── namespace.yaml +│ │ ├── rbac.yaml +│ │ ├── configmaps/ # One ConfigMap per service +│ │ ├── secrets/ # DB passwords, certs, RabbitMQ creds +│ │ ├── certs/ # PFX files auto-copied by generate-certs.sh +│ │ └── kustomization.yaml +│ ├── 01-databases/ # PostgreSQL ×5, Redis, RabbitMQ +│ │ ├── catalog-db/ # statefulset.yaml + service.yaml +│ │ ├── basket-db/ +│ │ ├── identity-db/ +│ │ ├── order-command-db/ +│ │ ├── order-query-db/ +│ │ ├── redis/ +│ │ ├── rabbitmq/ +│ │ └── kustomization.yaml +│ ├── 02-observability/ # Full observability stack +│ │ ├── elasticsearch/ +│ │ ├── kibana/ +│ │ ├── otel-collector/ +│ │ ├── jaeger/ +│ │ ├── prometheus/ +│ │ ├── loki/ +│ │ ├── grafana/ +│ │ └── kustomization.yaml +│ ├── 03-mail/ # Mailpit +│ ├── 04-services/ # Microservice Deployments, HPAs, Policies +│ │ ├── catalog-api/ # deployment.yaml · service.yaml · hpa.yaml +│ │ ├── basket-api/ +│ │ ├── discount-grpc/ +│ │ ├── identity-api/ +│ │ ├── order-command-api/ +│ │ ├── order-query-api/ +│ │ ├── order-query-eventprocessor/ +│ │ ├── api-gateway/ +│ │ ├── network-policies.yaml +│ │ ├── pod-disruption-budgets.yaml +│ │ └── kustomization.yaml +│ ├── 05-ingress/ # nginx Ingress rules for *.eshop.local +│ └── kustomization.yaml # Root — references 00-05 in order +├── overlays/ +│ ├── local/ # minikube / Docker Desktop / OrbStack +│ │ ├── kustomization.yaml +│ │ └── patches/ +│ │ ├── resource-limits-patch.yaml # Lighter Elasticsearch for dev +│ │ ├── storage-class-patch.yaml +│ │ └── single-replica-patch.yaml +│ └── production/ # Placeholder for cloud deployments +└── scripts/ + ├── apply.sh # Deploy the full stack + ├── teardown.sh # Remove the stack (optionally wipe data) + ├── create-cert-secrets.sh # Load PFX certs into K8s Secrets + └── hosts-setup.sh # Print /etc/hosts entries for ingress +``` + +> **Why numbered directories?** The numbers (00, 01, 02…) express deployment order. Core resources (namespace, RBAC, secrets) must exist before databases, which must exist before the services that depend on them. Kustomize applies them in the order listed in `kustomization.yaml`. + +> **production?** this is a placeholder for future cloud-specific configuration (e.g. GKE with Cloud SQL, EKS with RDS, AKS with Azure Database). The base configuration is designed to be cloud-agnostic, so the production overlay may be minimal. I didn't want to test it with actual cloud providers during development, so I focused on a local setup that works on any machine with Docker Desktop. +--- + +## 4. Core Infrastructure (00-core) + +### 4.1 Namespace + +A Kubernetes **namespace** is a logical isolation boundary. Everything in this project lives in one namespace: `eshop-microservices`. + +```yaml +apiVersion: v1 +kind: Namespace +metadata: + name: eshop-microservices +``` + +**Why a [namespace](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/)?** +- Isolates all resources from other workloads on the cluster +- [RBAC](https://kubernetes.io/docs/reference/access-authn-authz/rbac/) rules can be scoped to this namespace only; no accidental access to other namespaces +- Easy to nuke everything: `kubectl delete namespace eshop-microservices` +- Resource quotas can be applied per-namespace in production. for example, you can limit how much cluster resources a particular namespace is allowed to consume. + +A small [ResourceQuota](https://kubernetes.io/docs/concepts/policy/resource-quotas/) example for the `eshop-microservices` namespace: +``` +apiVersion: v1 +kind: ResourceQuota +metadata: + name: frontend-quota + namespace: eshop-microservices +spec: + hard: + pods: "10" + requests.cpu: "4" + requests.memory: 8Gi + limits.cpu: "8" + limits.memory: 16Gi +``` + +--- + +### 4.2 RBAC — ServiceAccounts, Roles, RoleBindings + +**RBAC** (Role-Based Access Control) controls what each pod is allowed to *do* inside the cluster; specifically what Kubernetes API calls it can make. By default, pods run as the `default` service account which has broad permissions. We give each service its own minimal-permission identity. + +``` +ServiceAccount (sa-catalog-api) + │ + └── RoleBinding (rb-catalog-api) + │ + └── Role (role-app-readonly) + rules: + - get on configmaps + - get on secrets +``` + +#### The three RBAC objects + +| Object | What it is | Analogy | +|---|---|---| +| `ServiceAccount` | An identity assigned to pods | A user account | +| `RoleBinding` | Assigns a Role to a ServiceAccount | Giving someone that job title | +| `Role` | A named set of permissions within a namespace | A job title with defined permissions | + +#### What we created + +- **10 ServiceAccounts** — one per service group (`sa-databases`, `sa-observability`) and one per microservice +- **2 Roles**: + - `role-app-readonly` — microservices can `get` their ConfigMap and Secret + - `role-observability` — Prometheus can `get/list/watch` Pods and Endpoints for service discovery +- **9 RoleBindings** — each microservice SA bound to `role-app-readonly` + +> **Principle of Least Privilege:** No ServiceAccount has `create`, `update`, or `delete` permissions. No ClusterRole is granted; permissions are namespace-scoped only. If a pod is compromised, the blast radius is limited. + +--- + +### 4.3 [Secrets](https://kubernetes.io/docs/concepts/configuration/secret/) vs [ConfigMaps](https://kubernetes.io/docs/concepts/configuration/configmap/) + +Both are key-value stores that inject configuration into pods. The difference is sensitivity: + +| | ConfigMap | Secret | +|---|---|---| +| Stores | Non-sensitive config (URLs, ports, feature flags) | Passwords, tokens, certificates | +| Stored as | Plain text | Base64-encoded | +| Example | `OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317` | `POSTGRES_PASSWORD=cG9zdGdyZXM=` | + +#### How a microservice gets its config + +```yaml +# 1. Non-sensitive config injected from ConfigMap +envFrom: + - configMapRef: + name: catalog-api-cm + +# 2. Sensitive values injected from Secrets +env: + - name: DB_PASSWORD + valueFrom: + secretKeyRef: + name: catalog-db-secret + key: POSTGRES_PASSWORD + +# 3. Connection string assembled using K8s env-var interpolation + - name: ConnectionStrings__Database + value: "Server=catalog-db;Port=5432;Database=CatalogDb;User Id=$(DB_USER);Password=$(DB_PASSWORD)" +``` + +> **Why not put the full connection string in a Secret?** The host, port, and database name are not sensitive; they are the same in every environment. Only the password changes. Keeping them in a ConfigMap makes it easy to see the topology without managing secrets unnecessarily. + +--- + +### 4.4 Certificate Management + +Each ASP.NET Core service uses Kestrel's built-in HTTPS with a PFX certificate. In Kubernetes, certificates live as **Secrets**. + +#### The certificate flow + +``` +1. src/certificates/generate-certs.sh + ↓ generates CA + 8 PFX files + ↓ auto-copies to k8s/base/00-core/certs/ + +2. k8s/scripts/create-cert-secrets.sh + ↓ reads each .pfx + ↓ creates Kubernetes Secret: cert-catalog-api, cert-basket-api, ... + ↓ creates ConfigMap: cert-ca (the public CA certificate) + +3. Each Deployment mounts a projected volume: + /app/certificates/catalog.pfx ← from Secret + /app/certificates/ca.crt ← from ConfigMap +``` + +```yaml +# Projected volume in every microservice Deployment +volumes: + - name: certs + projected: + sources: + - secret: + name: cert-catalog-api # private PFX + - configMap: + name: cert-ca # public CA cert for trust chain +``` + +> **Projected volumes** merge multiple sources (secrets, configmaps) into a single directory mount. This is why both the PFX and the CA cert appear in the same `/app/certificates/` folder inside the container. + +--- + +## 5. Databases (01-databases) + +### 5.1 [StatefulSet](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/) vs [Deployment](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) + +Databases have state; they write data to disk. Kubernetes provides two workload types: + +| | Deployment | StatefulSet | +|---|---|---| +| Pod naming | Random suffix: `catalog-api-6f9b-xkp2z` | Ordered, stable: `catalog-db-0`, `catalog-db-1` | +| Storage | Shared or ephemeral | Each pod gets its own dedicated PVC | +| Startup/shutdown | All pods start/stop simultaneously | Ordered: 0 before 1, 1 before 2 | +| Use for | Stateless services (APIs, proxies) | Stateful services (databases, queues) | + +All 7 data stores (5× PostgreSQL, Redis, RabbitMQ) are StatefulSets. Elasticsearch is also a StatefulSet. + +--- + +### 5.2 Why Two Services Per Database? + +Every database StatefulSet has **two Kubernetes Services**. This is a standard Kubernetes pattern: + +``` +catalog-db-0 (pod) + │ + ├── catalog-db-headless (clusterIP: None) + │ DNS: catalog-db-0.catalog-db-headless.eshop-microservices.svc.cluster.local + │ Used by: StatefulSet controller (required) + │ Behaviour: Returns the pod IP directly. No load balancing. + │ + └── catalog-db (ClusterIP) + DNS: catalog-db (short form within namespace) + Used by: catalog-api connection string + Behaviour: Load-balanced → routes to ready pod +``` +K8s uses headless DNS internally for pod identity, ordered startup, and PVC binding. This happens whether or not any app ever uses these DNS names. It's not optional. + +| Service | clusterIP | Who uses it | Why | +|---|---|---|---| +| `catalog-db-headless` | `None` | K8s StatefulSet controller | Gives each pod a stable unique DNS name. Required by `spec.serviceName`. | +| `catalog-db` | Assigned by K8s | `catalog-api` connection string | Stable address for apps. Handles pod failover transparently. | + +> **When does the headless service become critical?** With a single replica the headless service isn’t technically necessary. But if you scaled to 2 replicas with PostgreSQL streaming replication, the primary would be at `catalog-db-0.catalog-db-headless` and the replica at `catalog-db-1.catalog-db-headless`; and the application (if necessary) could choose which to connect to. + +--- + +### 5.3 [PersistentVolumeClaims](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) + +StatefulSets use `volumeClaimTemplates`; a template that automatically creates one PVC per pod: + +```yaml +volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: [ReadWriteOnce] # Only one pod can mount this at a time + storageClassName: local-path # Patched per environment by overlay + resources: + requests: + storage: 1Gi +``` + +| Term | Meaning | +|---|---| +| `PersistentVolume (PV)` | Actual storage provisioned on the cluster (a disk) | +| `PersistentVolumeClaim (PVC)` | A request for storage by a pod. K8s binds PVC → PV automatically. | +| `StorageClass` | Defines how storage is provisioned. `local-path` (OrbStack/minikube), `pd-ssd` (GKE), `gp3` (EKS). | +| `ReadWriteOnce` | Only one node can mount this volume at a time. Fine for single-replica databases. | + +> **PVCs survive StatefulSet deletion.** When you run `kubectl delete -k k8s/overlays/local`, all StatefulSets are deleted but their PVCs remain. Your data is preserved across redeployments. Add `kubectl delete pvc --all -n eshop-microservices` only when you want a clean slate. + +Note: Use volumeClaimTemplates in StatefulSets when each replica needs its own isolated storage (databases). Use a standalone PVC + Deployment when you have a single-replica workload that just needs persistent storage (Prometheus, Loki, Mailpit). if you deployment has more than one replica you need to use ReadWriteMany mode. ReadWriteOnce mode allow only one replica to mount. + +--- + +## 6. Observability Stack (02-observability) + +The observability stack provides three pillars: **metrics**, **logs**, and **traces**. + +``` +Microservice + │ + └── OpenTelemetry SDK (in every .NET service) + │ + ▼ OTLP (gRPC port 4317) + otel-collector + │ + ├── Traces ──────────────▶ Jaeger (jaeger.eshop.local) + ├── Metrics (Prometheus) ▶ Prometheus (prometheus.eshop.local) + │ └──▶ Grafana (grafana.eshop.local) + └── Logs ────────────────▶ Loki + └──▶ Grafana + +Microservices also send structured logs to Elasticsearch: + └──▶ Elasticsearch ──▶ Kibana (kibana.eshop.local) +``` + +| Component | Role | Storage | +|---|---|---| +| OTEL Collector | Central telemetry aggregator — receives from all services, fans out to backends | Stateless | +| Jaeger | Distributed tracing UI — shows end-to-end request flows across services | In-memory (stateless) | +| Prometheus | Time-series metrics database — scrapes all service /metrics endpoints | PVC 1Gi | +| Loki | Log aggregation — stores structured logs from OTEL Collector | PVC 1Gi | +| Grafana | Dashboard UI — pre-provisioned with Prometheus, Loki, and Jaeger datasources | Stateless | +| Elasticsearch | Full-text log search engine — receives logs from Serilog in each service | StatefulSet, PVC 2Gi | +| Kibana | Elasticsearch UI — log search and dashboards | Stateless | + +#### Why Grafana is stateless + +Grafana's datasources and dashboards are *provisioned via a ConfigMap* at startup. Nothing is stored inside the container itself, so it needs no PVC. Delete and recreate it freely without losing any configuration. + +```yaml +# grafana/provisioning-cm.yaml — auto-loads datasources on startup +data: + datasources.yaml: | + datasources: + - name: Prometheus + type: prometheus + url: http://prometheus:9090 + isDefault: true + - name: Loki + type: loki + url: http://loki:3100 + - name: Jaeger + type: jaeger + url: http://jaeger:16686 +``` + +--- + +## 7. Mail — Mailpit (03-mail) + +Mailpit is a local SMTP server and web UI for catching emails during development. The Identity service sends verification emails — Mailpit traps them so they never reach real inboxes. + +| Port | Purpose | Access | +|---|---|---| +| 1025 | SMTP — receives emails from identity-api | Internal only | +| 8025 | Web UI — browse captured emails | `http://mailpit.eshop.local` | + +--- + +## 8. Microservices (04-services) + +### 8.1 Anatomy of a Microservice Deployment + +Every microservice follows the same pattern. Annotated Deployment for catalog-api: + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: catalog-api + namespace: eshop-microservices +spec: + replicas: 1 # HPA will scale this automatically + selector: + matchLabels: + app: catalog-api + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 1 # Spin up 1 new pod before removing old one + maxUnavailable: 0 # This is for zero downtime: never kill pod until new is ready + template: + spec: + serviceAccountName: sa-catalog-api # Least-privilege identity + initContainers: # Wait for DB before starting + - name: wait-for-db + image: busybox:1.36 + command: [ 'sh', '-c', 'until nc -z catalog-db 5432; do sleep 2; done' ] + containers: + - name: catalog-api + envFrom: # All non-sensitive config from ConfigMap + - configMapRef: + name: catalog-api-cm + env: # Sensitive values from Secrets + - name: DB_PASSWORD + valueFrom: + secretKeyRef: + name: catalog-db-secret + key: POSTGRES_PASSWORD + livenessProbe: # K8s restarts pod if this fails + httpGet: { path: /hc, port: 8080 } + readinessProbe: # K8s stops routing traffic if this fails + httpGet: { path: /hc, port: 8080 } + resources: + requests: { cpu: 100m, memory: 128Mi } + limits: { cpu: 500m, memory: 512Mi } + volumeMounts: + - name: certs + mountPath: /app/certificates + readOnly: true +``` + +--- + +### 8.2 Init Containers + +An **init container** runs to completion before the main container starts. We use them to make each microservice wait until its database is accepting connections: + +```yaml +initContainers: + - name: wait-for-db + image: busybox:1.36 + command: + - sh + - -c + - 'until nc -z catalog-db 5432; do echo waiting for catalog-db; sleep 2; done' +``` + +Without this, the service would start, fail to connect to the database, crash, and restart repeatedly (CrashLoopBackOff). Init containers solve the startup ordering problem elegantly. + +> **Why not use `depends_on` like Docker Compose?** Kubernetes has no native equivalent of `depends_on`. Init containers are the idiomatic solution. + +--- + +### 8.3 Health Probes + +Every service exposes a `/hc` endpoint via ASP.NET Core Health Checks. Kubernetes uses two probe types: + +| Probe | What it does | On failure | +|---|---|---| +| **livenessProbe** | Is the process alive? Checks if it is stuck or deadlocked. | Pod is killed and restarted | +| **readinessProbe** | Is the pod ready to receive traffic? Checks if dependencies are healthy. | Pod removed from Service endpoints (no traffic sent) | + +Both probes use `GET /hc port 8080`. The key difference: **liveness restarts the pod; readiness just stops traffic to it.** + +--- + +### 8.4 Resource Requests and Limits + +```yaml +resources: + requests: { cpu: 100m, memory: 128Mi } # Guaranteed minimum + limits: { cpu: 500m, memory: 512Mi } # Hard maximum +``` + +| Term | Meaning | +|---|---| +| `100m` CPU | 100 millicores = 0.1 of one CPU core | +| `requests` | K8s scheduler uses this to decide which node can fit the pod. The pod is guaranteed at least this much. | +| `limits` | Pod is killed (OOMKilled) if it exceeds memory limit. CPU is throttled at the limit. | + +--- + +### 8.5 Discount gRPC — Two Protocols, Two Ports + +The Discount service speaks **gRPC** (not HTTP), and needs two ports because two different callers use it differently: + +``` +basket-api ──gRPC plaintext (h2c)──▶ discount-grpc:8080 +api-gateway ──HTTPS (YARP proxy)──▶ discount-grpc:8081 +``` + +```yaml +# Service exposes both protocols +ports: + - port: 8080 + name: grpc + appProtocol: kubernetes.io/h2c # HTTP/2 cleartext — required for gRPC + - port: 8081 + name: https +``` + +Liveness/readiness probes use the native Kubernetes gRPC probe type (K8s 1.24+): + +```yaml +livenessProbe: + grpc: + port: 8080 # gRPC health protocol on the plaintext port +``` + +--- + +### 8.6 [HorizontalPodAutoscaler](https://kubernetes.io/docs/concepts/workloads/autoscaling/horizontal-pod-autoscale/) + +An HPA automatically adjusts the number of pod replicas based on CPU usage: + +```yaml +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +spec: + scaleTargetRef: + kind: Deployment + name: catalog-api + minReplicas: 1 + maxReplicas: 5 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 70 # Scale up when avg CPU > 70% +``` + +HPAs are applied to: `catalog-api` (max 5), `basket-api` (max 5), `order-command-api` (max 3), `order-query-api` (max 3), `api-gateway` (max 3). + +**Not applied to:** `discount-grpc` (low-traffic internal), `order-query-eventprocessor` (must have exactly one consumer per queue). + +--- + +### 8.7 [NetworkPolicy](https://kubernetes.io/docs/concepts/services-networking/network-policies/) + +By default, all pods in a namespace can talk to each other freely. NetworkPolicy changes this to an allow-list model. + +We start with a **deny-all** default and add explicit allow rules: + +```yaml +# Step 1: Deny everything +kind: NetworkPolicy +metadata: + name: default-deny-ingress +spec: + podSelector: {} # Applies to ALL pods in namespace + policyTypes: [Ingress] + +# Step 2: Allow only what is documented +kind: NetworkPolicy +metadata: + name: netpol-catalog-api +spec: + podSelector: + matchLabels: { app: catalog-api } + egress: + - to: [{ podSelector: { matchLabels: { app: catalog-db }}}] + ports: [{ port: 5432 }] + - to: [{ podSelector: { matchLabels: { app: otel-collector }}}] + ports: [{ port: 4317 }] +``` + +> **NetworkPolicy requires a CNI plugin that supports it.** Docker Desktop and OrbStack's default CNI does not enforce NetworkPolicy. In production (GKE, EKS, AKS), network policies are enforced by default. + +--- + +### 8.8 [PodDisruptionBudget](https://kubernetes.io/docs/reference/kubernetes-api/policy/pod-disruption-budget-v1/) + +A PDB prevents Kubernetes from evicting too many pods at once during planned maintenance (e.g. node drain for an OS upgrade): + +```yaml +apiVersion: policy/v1 +kind: PodDisruptionBudget +spec: + minAvailable: 1 # At least 1 pod must stay running during disruption + selector: + matchLabels: { app: catalog-api } +``` + +With `minAvailable: 1` and a single replica, a node drain will *wait* until the pod is rescheduled elsewhere before proceeding. Especially important for database nodes in production. + +--- + +## 9. [Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/) (05-ingress) + +The **Ingress** resource is a layer-7 HTTP router sitting in front of all services and routing requests based on hostname. + +``` +Browser: GET http://kibana.eshop.local + │ + ▼ +/etc/hosts: kibana.eshop.local → 198.19.249.2 + │ + ▼ +nginx Ingress Controller (LoadBalancer on port 80) + │ + ├── Host: api.eshop.local ──▶ api-gateway:8081 (HTTPS backend) + ├── Host: identity.eshop.local ──▶ identity-api:8081 (HTTPS backend) + ├── Host: kibana.eshop.local ──▶ kibana:5601 (HTTP backend) + ├── Host: grafana.eshop.local ──▶ grafana:3000 (HTTP backend) + ├── Host: jaeger.eshop.local ──▶ jaeger:16686 (HTTP backend) + ├── Host: prometheus.eshop.local ──▶ prometheus:9090 (HTTP backend) + └── Host: mailpit.eshop.local ──▶ mailpit:8025 (HTTP backend) +``` + +#### HTTPS backends + +The API Gateway and Identity API terminate TLS themselves using Kestrel. nginx needs to be told to connect to them over HTTPS: + +```yaml +metadata: + annotations: + nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" + nginx.ingress.kubernetes.io/proxy-ssl-verify: "false" # Self-signed CA +``` + +The other services (Kibana, Grafana, etc.) are plain HTTP; no annotation needed. + +--- + +## 10. Kustomize — Base & Overlays + +Kustomize solves a real problem: you want the same application running in different environments with slightly different configuration, but you don't want to duplicate 88 YAML files. + +### 10.1 Why Kustomize instead of Helm? + +| | Kustomize | Helm | +|---|---|---| +| Templating | No templating — patch existing YAML | Go template language in all YAML files | +| Built into kubectl | Yes — `kubectl apply -k` | No — requires separate installation | +| Learning curve | Low — you just write plain YAML | Higher — template syntax, values.yaml, chart structure | +| Base resources | Always valid YAML, readable at a glance | Filled with `{{ .Values.something }}` | +| Best for | Small/medium projects, plain YAML fans | Complex packages shared across many teams | + +### 10.2 The base kustomization + +```yaml +# k8s/base/kustomization.yaml +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - 00-core # Applied first — namespace must exist before everything else + - 01-databases # Applied second — databases before services that depend on them + - 02-observability + - 03-mail + - 04-services + - 05-ingress +``` + +### 10.3 The local overlay + +```yaml +# k8s/overlays/local/kustomization.yaml +resources: + - ../../base + +patches: + # Patch 1: Change storageClass to local-path for all StatefulSets + - patch: |- + - op: replace + path: /spec/volumeClaimTemplates/0/spec/storageClassName + value: local-path + target: { kind: StatefulSet } + + # Patch 2: Change storageClass to local-path for standalone PVCs + - patch: |- + - op: replace + path: /spec/storageClassName + value: local-path + target: { kind: PersistentVolumeClaim } + + # Patch 3: Reduce Elasticsearch memory for local dev machines + - path: patches/resource-limits-patch.yaml + target: { kind: StatefulSet, name: elasticsearch } + +images: # Override image tags per environment + - name: catalog.api + newName: catalog.api + newTag: latest +``` + +> **The power of Kustomize patches:** The two inline JSON patches (`op: replace`) change the storage class for *all* StatefulSets and PVCs in a single declaration. Without Kustomize, you would have to edit 10+ files. + +--- + +## 11. Helper Scripts + +| Script | What it does | When to run | +|---|---|---| +| `generate-certs.sh` | Creates CA + 8 PFX certificates with K8s DNS SANs, auto-copies to `k8s/base/00-core/certs/` | Once (re-run when certs expire after 365 days) | +| `create-cert-secrets.sh` | Reads PFX files and creates Kubernetes Secrets + `cert-ca` ConfigMap | After generate-certs.sh, or after a full cluster reset | +| `apply.sh` | Checks cluster, runs cert script if secrets are missing, then `kubectl apply -k overlays/local` | Every deploy | +| `teardown.sh` | Runs `kubectl delete -k overlays/local`. With `--wipe-data` also deletes all PVCs. | When removing the stack | +| `hosts-setup.sh` | Detects the ingress LoadBalancer IP, prints 7 `/etc/hosts` entries | Once per machine (after first deploy) | + +--- + +## 12. Day-to-Day Workflow + +### First-time setup + +```bash +# 1. Enable Kubernetes in Docker Desktop, then install nginx ingress controller +kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.9.5/deploy/static/provider/cloud/deploy.yaml + +# 2. Build images +cd src && docker compose build && cd .. + +# 3. Generate certs (writes to k8s/base/00-core/certs/ automatically) +mkdir -p k8s/base/00-core/certs +cd src/certificates && bash generate-certs.sh && cd ../.. + +# 4. Deploy +bash k8s/scripts/apply.sh local + +# 5. Set up /etc/hosts (once per machine) +# The IP is stable across eshop redeployments — only redo this after a full cluster reset. +bash k8s/scripts/hosts-setup.sh | sudo tee -a /etc/hosts +``` + +### Daily workflow + +```bash +# After changing code, rebuild and redeploy: +cd src && docker compose build && cd .. +bash k8s/scripts/apply.sh local + +# Tear down (data preserved in PVCs): +bash k8s/scripts/teardown.sh local + +# Tear down + wipe all data: +bash k8s/scripts/teardown.sh local --wipe-data + +# Watch pod status: +kubectl get pods -n eshop-microservices -w + +# See logs for a service: +kubectl logs -n eshop-microservices -l app=catalog-api --follow + +# Describe a crashing pod: +kubectl describe pod -n eshop-microservices +``` + +### URLs after deployment + +| URL | What you see | +|---|---| +| `http://api.eshop.local` | API Gateway — entry point for all API calls | +| `http://identity.eshop.local` | Identity Server — OIDC login / token endpoints | +| `http://grafana.eshop.local` | Grafana — metrics + logs dashboards (anonymous admin) | +| `http://kibana.eshop.local` | Kibana — Elasticsearch log search UI | +| `http://jaeger.eshop.local` | Jaeger — distributed trace explorer | +| `http://prometheus.eshop.local` | Prometheus — raw metrics query UI | +| `http://mailpit.eshop.local` | Mailpit — captured emails from Identity service | + +--- + +*EshopMicroservices Kubernetes Guide — Behdad Kardgar* diff --git a/k8s/base/00-core/certs/.gitkeep b/k8s/base/00-core/certs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/k8s/base/00-core/configmaps/api-gateway-cm.yaml b/k8s/base/00-core/configmaps/api-gateway-cm.yaml new file mode 100644 index 0000000..13d29f1 --- /dev/null +++ b/k8s/base/00-core/configmaps/api-gateway-cm.yaml @@ -0,0 +1,22 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: api-gateway-cm + namespace: eshop-microservices +data: + ASPNETCORE_ENVIRONMENT: "Development" + ASPNETCORE_HTTP_PORTS: "8080" + ASPNETCORE_HTTPS_PORTS: "8081" + ASPNETCORE_Kestrel__Certificates__Default__Path: "/app/certificates/api-gateway.pfx" + Certificates__CaPath: "/app/certificates/ca.crt" + ReverseProxy__Clusters__catalog__Destinations__destination0__Address: "https://catalog-api:8081" + ReverseProxy__Clusters__basket__Destinations__destination0__Address: "https://basket-api:8081" + ReverseProxy__Clusters__discount__Destinations__destination0__Address: "https://discount-grpc:8081" + ReverseProxy__Clusters__order-command__Destinations__destination0__Address: "https://order-command-api:8081" + ReverseProxy__Clusters__order-query__Destinations__destination0__Address: "https://order-query-api:8081" + ReverseProxy__Clusters__identity__Destinations__destination0__Address: "https://identity-api:8081" + Logger__elasticsearch: "http://elasticsearch:9200" + OTEL_EXPORTER_JAEGER_AGENT_HOST: "jaeger" + OTEL_EXPORTER_JAEGER_AGENT_PORT: "6831" + OTEL_EXPORTER_JAEGER_ENDPOINT: "http://jaeger:14268/api/traces" + OTEL_EXPORTER_OTLP_ENDPOINT: "http://otel-collector:4317" diff --git a/k8s/base/00-core/configmaps/basket-api-cm.yaml b/k8s/base/00-core/configmaps/basket-api-cm.yaml new file mode 100644 index 0000000..40c0e66 --- /dev/null +++ b/k8s/base/00-core/configmaps/basket-api-cm.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: basket-api-cm + namespace: eshop-microservices +data: + ASPNETCORE_ENVIRONMENT: "Development" + ASPNETCORE_HTTP_PORTS: "8080" + ASPNETCORE_HTTPS_PORTS: "8081" + ASPNETCORE_Kestrel__Certificates__Default__Path: "/app/certificates/basket.pfx" + ConnectionStrings__Redis: "redis:6379" + Grpc__Discount: "http://discount-grpc:8080" + OrderCommandClient__BaseUrl: "http://order-command-api:8080" + Logger__elasticsearch: "http://elasticsearch:9200" + Identity__Url: "https://identity.eshop.local" + Identity__Audience: "basket" + OTEL_EXPORTER_JAEGER_AGENT_HOST: "jaeger" + OTEL_EXPORTER_JAEGER_AGENT_PORT: "6831" + OTEL_EXPORTER_JAEGER_ENDPOINT: "http://jaeger:14268/api/traces" + OTEL_EXPORTER_OTLP_ENDPOINT: "http://otel-collector:4317" diff --git a/k8s/base/00-core/configmaps/catalog-api-cm.yaml b/k8s/base/00-core/configmaps/catalog-api-cm.yaml new file mode 100644 index 0000000..c4ec749 --- /dev/null +++ b/k8s/base/00-core/configmaps/catalog-api-cm.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: catalog-api-cm + namespace: eshop-microservices +data: + ASPNETCORE_ENVIRONMENT: "Development" + ASPNETCORE_HTTP_PORTS: "8080" + ASPNETCORE_HTTPS_PORTS: "8081" + ASPNETCORE_Kestrel__Certificates__Default__Path: "/app/certificates/catalog.pfx" + Logger__elasticsearch: "http://elasticsearch:9200" + Identity__Url: "https://identity.eshop.local" + Identity__Audience: "catalog" + OTEL_EXPORTER_JAEGER_AGENT_HOST: "jaeger" + OTEL_EXPORTER_JAEGER_AGENT_PORT: "6831" + OTEL_EXPORTER_JAEGER_ENDPOINT: "http://jaeger:14268/api/traces" + OTEL_EXPORTER_OTLP_ENDPOINT: "http://otel-collector:4317" diff --git a/k8s/base/00-core/configmaps/discount-grpc-cm.yaml b/k8s/base/00-core/configmaps/discount-grpc-cm.yaml new file mode 100644 index 0000000..152882e --- /dev/null +++ b/k8s/base/00-core/configmaps/discount-grpc-cm.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: discount-grpc-cm + namespace: eshop-microservices +data: + ASPNETCORE_ENVIRONMENT: "Development" + ASPNETCORE_HTTP_PORTS: "8080" + ASPNETCORE_HTTPS_PORTS: "8081" + ASPNETCORE_Kestrel__Certificates__Default__Path: "/app/certificates/discount.pfx" + ConnectionStrings__Database: "Data Source=/app/data/discountDb" + Logger__elasticsearch: "http://elasticsearch:9200" + OTEL_EXPORTER_JAEGER_AGENT_HOST: "jaeger" + OTEL_EXPORTER_JAEGER_AGENT_PORT: "6831" + OTEL_EXPORTER_JAEGER_ENDPOINT: "http://jaeger:14268/api/traces" + OTEL_EXPORTER_OTLP_ENDPOINT: "http://otel-collector:4317" diff --git a/k8s/base/00-core/configmaps/identity-api-cm.yaml b/k8s/base/00-core/configmaps/identity-api-cm.yaml new file mode 100644 index 0000000..4db2a48 --- /dev/null +++ b/k8s/base/00-core/configmaps/identity-api-cm.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: identity-api-cm + namespace: eshop-microservices +data: + ASPNETCORE_ENVIRONMENT: "Development" + ASPNETCORE_HTTP_PORTS: "8080" + ASPNETCORE_HTTPS_PORTS: "8081" + ASPNETCORE_Kestrel__Certificates__Default__Path: "/app/certificates/identity.pfx" + EmailService__base_url: "mailpit" + EmailService__sender: "no-reply@eshop.dev" + service_url: "https://identity-api:8081" + IdentityServer__IssuerUri: "https://identity.eshop.local" + Logger__elasticsearch: "http://elasticsearch:9200" + OTEL_EXPORTER_JAEGER_AGENT_HOST: "jaeger" + OTEL_EXPORTER_JAEGER_AGENT_PORT: "6831" + OTEL_EXPORTER_JAEGER_ENDPOINT: "http://jaeger:14268/api/traces" + OTEL_EXPORTER_OTLP_ENDPOINT: "http://otel-collector:4317" diff --git a/k8s/base/00-core/configmaps/jaeger-ui-cm.yaml b/k8s/base/00-core/configmaps/jaeger-ui-cm.yaml new file mode 100644 index 0000000..83563c9 --- /dev/null +++ b/k8s/base/00-core/configmaps/jaeger-ui-cm.yaml @@ -0,0 +1,22 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: jaeger-ui-config + namespace: eshop-microservices +data: + jaeger-ui.json: | + { + "monitor": { + "menuEnabled": true + }, + "dependencies": { + "menuEnabled": true + } + } + sampling_strategies.json: | + { + "default_strategy": { + "type": "probabilistic", + "param": 1 + } + } diff --git a/k8s/base/00-core/configmaps/loki-config-cm.yaml b/k8s/base/00-core/configmaps/loki-config-cm.yaml new file mode 100644 index 0000000..c379934 --- /dev/null +++ b/k8s/base/00-core/configmaps/loki-config-cm.yaml @@ -0,0 +1,45 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: loki-config + namespace: eshop-microservices +data: + loki-config.yml: | + auth_enabled: false + + server: + http_listen_port: 3100 + + ingester: + lifecycler: + address: 127.0.0.1 + ring: + kvstore: + store: inmemory + replication_factor: 1 + final_sleep: 0s + chunk_idle_period: 5m + chunk_retain_period: 30s + wal: + enabled: false + + schema_config: + configs: + - from: 2022-01-01 + store: boltdb + object_store: filesystem + schema: v11 + index: + prefix: index_ + period: 168h + + storage_config: + boltdb: + directory: /tmp/loki/index + filesystem: + directory: /tmp/loki/chunks + + limits_config: + enforce_metric_name: false + reject_old_samples: true + reject_old_samples_max_age: 168h diff --git a/k8s/base/00-core/configmaps/order-command-api-cm.yaml b/k8s/base/00-core/configmaps/order-command-api-cm.yaml new file mode 100644 index 0000000..94f4cea --- /dev/null +++ b/k8s/base/00-core/configmaps/order-command-api-cm.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: order-command-api-cm + namespace: eshop-microservices +data: + ASPNETCORE_ENVIRONMENT: "Development" + ASPNETCORE_HTTP_PORTS: "8080" + ASPNETCORE_HTTPS_PORTS: "8081" + ASPNETCORE_Kestrel__Certificates__Default__Path: "/app/certificates/order-command-api.pfx" + RabbitMQ__URI: "rabbitmq" + Identity__Url: "https://identity.eshop.local" + Identity__Audience: "orders_command" + Logger__elasticsearch: "http://elasticsearch:9200" + OTEL_EXPORTER_JAEGER_AGENT_HOST: "jaeger" + OTEL_EXPORTER_JAEGER_AGENT_PORT: "6831" + OTEL_EXPORTER_JAEGER_ENDPOINT: "http://jaeger:14268/api/traces" + OTEL_EXPORTER_OTLP_ENDPOINT: "http://otel-collector:4317" diff --git a/k8s/base/00-core/configmaps/order-query-api-cm.yaml b/k8s/base/00-core/configmaps/order-query-api-cm.yaml new file mode 100644 index 0000000..a5fc65c --- /dev/null +++ b/k8s/base/00-core/configmaps/order-query-api-cm.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: order-query-api-cm + namespace: eshop-microservices +data: + ASPNETCORE_ENVIRONMENT: "Development" + ASPNETCORE_HTTP_PORTS: "8080" + ASPNETCORE_HTTPS_PORTS: "8081" + ASPNETCORE_Kestrel__Certificates__Default__Path: "/app/certificates/order-query-event-api.pfx" + Logger__elasticsearch: "http://elasticsearch:9200" + Identity__Url: "https://identity.eshop.local" + Identity__Audience: "orders_query" + OTEL_EXPORTER_JAEGER_AGENT_HOST: "jaeger" + OTEL_EXPORTER_JAEGER_AGENT_PORT: "6831" + OTEL_EXPORTER_JAEGER_ENDPOINT: "http://jaeger:14268/api/traces" + OTEL_EXPORTER_OTLP_ENDPOINT: "http://otel-collector:4317" diff --git a/k8s/base/00-core/configmaps/order-query-eventprocessor-cm.yaml b/k8s/base/00-core/configmaps/order-query-eventprocessor-cm.yaml new file mode 100644 index 0000000..040ddfe --- /dev/null +++ b/k8s/base/00-core/configmaps/order-query-eventprocessor-cm.yaml @@ -0,0 +1,25 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: order-query-eventprocessor-cm + namespace: eshop-microservices +data: + ASPNETCORE_ENVIRONMENT: "Development" + ASPNETCORE_HTTP_PORTS: "8080" + ASPNETCORE_HTTPS_PORTS: "8081" + ASPNETCORE_Kestrel__Certificates__Default__Path: "/app/certificates/order-query-event-processor.pfx" + RabbitMQ__URI: "rabbitmq" + QueueSettings__OrderViewQueues__OrderCreatedEvent__Name: "order_created_event_queue" + QueueSettings__OrderViewQueues__OrderCreatedEvent__Dlq: "order_created_event_queue_dlq" + QueueSettings__OrderViewQueues__OrderCreatedEvent__Exchange: "order_created_event_exchange" + QueueSettings__OrderViewQueues__OrderUpdatedEvent__Name: "order_updated_event_queue" + QueueSettings__OrderViewQueues__OrderUpdatedEvent__Dlq: "order_updated_event_queue_dlq" + QueueSettings__OrderViewQueues__OrderUpdatedEvent__Exchange: "order_updated_event_exchange" + QueueSettings__OrderViewQueues__OrderDeletedEvent__Name: "order_deleted_event_queue" + QueueSettings__OrderViewQueues__OrderDeletedEvent__Dlq: "order_deleted_event_queue_dlq" + QueueSettings__OrderViewQueues__OrderDeletedEvent__Exchange: "order_deleted_event_exchange" + Logger__elasticsearch: "http://elasticsearch:9200" + OTEL_EXPORTER_JAEGER_AGENT_HOST: "jaeger" + OTEL_EXPORTER_JAEGER_AGENT_PORT: "6831" + OTEL_EXPORTER_JAEGER_ENDPOINT: "http://jaeger:14268/api/traces" + OTEL_EXPORTER_OTLP_ENDPOINT: "http://otel-collector:4317" diff --git a/k8s/base/00-core/configmaps/otel-collector-config-cm.yaml b/k8s/base/00-core/configmaps/otel-collector-config-cm.yaml new file mode 100644 index 0000000..8c7df36 --- /dev/null +++ b/k8s/base/00-core/configmaps/otel-collector-config-cm.yaml @@ -0,0 +1,68 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: otel-collector-config + namespace: eshop-microservices +data: + otel-collector-config.yml: | + receivers: + otlp: + protocols: + grpc: + http: + + exporters: + prometheus: + endpoint: "0.0.0.0:8889" + + otlp: + endpoint: "jaeger:4317" + tls: + insecure: true + + loki: + endpoint: http://loki:3100/loki/api/v1/push + + connectors: + spanmetrics: + histogram: + explicit: + buckets: [5ms, 10ms, 25ms, 50ms, 100ms, 250ms, 500ms, 1000ms] + + processors: + filter/exclude-health-api-traces: + error_mode: ignore + traces: + span: + - 'attributes["http.route"] == "/health"' + - 'attributes["http.route"] == "/hc"' + filter/exclude-health-api-logs: + error_mode: ignore + logs: + exclude: + match_type: strict + record_attributes: + - key: RequestPath + value: /hc + resource: + attributes: + - action: insert + key: service_name + from_attribute: service.name + - action: insert + key: loki.resource.labels + value: service_name + + service: + pipelines: + traces: + receivers: [otlp] + processors: [filter/exclude-health-api-traces] + exporters: [otlp, spanmetrics] + metrics: + receivers: [spanmetrics] + exporters: [prometheus] + logs: + receivers: [otlp] + processors: [resource, filter/exclude-health-api-logs] + exporters: [loki] diff --git a/k8s/base/00-core/configmaps/prometheus-config-cm.yaml b/k8s/base/00-core/configmaps/prometheus-config-cm.yaml new file mode 100644 index 0000000..cba66af --- /dev/null +++ b/k8s/base/00-core/configmaps/prometheus-config-cm.yaml @@ -0,0 +1,32 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: prometheus-config + namespace: eshop-microservices +data: + prometheus.yml: | + global: + scrape_interval: 10s + evaluation_interval: 10s + + scrape_configs: + - job_name: aggregated-trace-metrics + static_configs: + - targets: + - otel-collector:8889 + + - job_name: jaeger + static_configs: + - targets: + - jaeger:14269 + + - job_name: services + static_configs: + - targets: + - catalog-api:8080 + - basket-api:8080 + - discount-grpc:8080 + - order-command-api:8080 + - identity-api:8080 + - order-query-eventprocessor:8080 + - order-query-api:8080 diff --git a/k8s/base/00-core/kustomization.yaml b/k8s/base/00-core/kustomization.yaml new file mode 100644 index 0000000..2715f8e --- /dev/null +++ b/k8s/base/00-core/kustomization.yaml @@ -0,0 +1,24 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +namespace: eshop-microservices + +resources: + - namespace.yaml + - rbac.yaml + - secrets/db-secrets.yaml + - secrets/rabbitmq-secret.yaml + - secrets/identity-secret.yaml + - secrets/cert-password-secret.yaml + - configmaps/otel-collector-config-cm.yaml + - configmaps/prometheus-config-cm.yaml + - configmaps/loki-config-cm.yaml + - configmaps/jaeger-ui-cm.yaml + - configmaps/catalog-api-cm.yaml + - configmaps/basket-api-cm.yaml + - configmaps/discount-grpc-cm.yaml + - configmaps/identity-api-cm.yaml + - configmaps/order-command-api-cm.yaml + - configmaps/order-query-api-cm.yaml + - configmaps/order-query-eventprocessor-cm.yaml + - configmaps/api-gateway-cm.yaml diff --git a/k8s/base/00-core/namespace.yaml b/k8s/base/00-core/namespace.yaml new file mode 100644 index 0000000..520896b --- /dev/null +++ b/k8s/base/00-core/namespace.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: eshop-microservices + labels: + app.kubernetes.io/managed-by: kustomize + environment: local diff --git a/k8s/base/00-core/rbac.yaml b/k8s/base/00-core/rbac.yaml new file mode 100644 index 0000000..bd19038 --- /dev/null +++ b/k8s/base/00-core/rbac.yaml @@ -0,0 +1,208 @@ +# ── ServiceAccounts ──────────────────────────────────────────────────────────── +apiVersion: v1 +kind: ServiceAccount +metadata: + name: sa-databases + namespace: eshop-microservices +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: sa-observability + namespace: eshop-microservices +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: sa-catalog-api + namespace: eshop-microservices +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: sa-basket-api + namespace: eshop-microservices +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: sa-discount-grpc + namespace: eshop-microservices +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: sa-identity-api + namespace: eshop-microservices +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: sa-order-command-api + namespace: eshop-microservices +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: sa-order-query-api + namespace: eshop-microservices +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: sa-order-query-eventprocessor + namespace: eshop-microservices +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: sa-api-gateway + namespace: eshop-microservices +--- +# ── Roles ───────────────────────────────────────────────────────────────────── +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: role-observability + namespace: eshop-microservices +rules: + - apiGroups: [""] + resources: ["pods", "endpoints", "services"] + verbs: ["get", "list", "watch"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: role-app-readonly + namespace: eshop-microservices +rules: + - apiGroups: [""] + resources: ["configmaps", "secrets"] + verbs: ["get"] +--- +# ── RoleBindings ────────────────────────────────────────────────────────────── +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: rb-observability + namespace: eshop-microservices +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: role-observability +subjects: + - kind: ServiceAccount + name: sa-observability + namespace: eshop-microservices +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: rb-catalog-api + namespace: eshop-microservices +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: role-app-readonly +subjects: + - kind: ServiceAccount + name: sa-catalog-api + namespace: eshop-microservices +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: rb-basket-api + namespace: eshop-microservices +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: role-app-readonly +subjects: + - kind: ServiceAccount + name: sa-basket-api + namespace: eshop-microservices +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: rb-discount-grpc + namespace: eshop-microservices +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: role-app-readonly +subjects: + - kind: ServiceAccount + name: sa-discount-grpc + namespace: eshop-microservices +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: rb-identity-api + namespace: eshop-microservices +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: role-app-readonly +subjects: + - kind: ServiceAccount + name: sa-identity-api + namespace: eshop-microservices +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: rb-order-command-api + namespace: eshop-microservices +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: role-app-readonly +subjects: + - kind: ServiceAccount + name: sa-order-command-api + namespace: eshop-microservices +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: rb-order-query-api + namespace: eshop-microservices +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: role-app-readonly +subjects: + - kind: ServiceAccount + name: sa-order-query-api + namespace: eshop-microservices +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: rb-order-query-eventprocessor + namespace: eshop-microservices +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: role-app-readonly +subjects: + - kind: ServiceAccount + name: sa-order-query-eventprocessor + namespace: eshop-microservices +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: rb-api-gateway + namespace: eshop-microservices +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: role-app-readonly +subjects: + - kind: ServiceAccount + name: sa-api-gateway + namespace: eshop-microservices diff --git a/k8s/base/00-core/secrets/cert-password-secret.yaml b/k8s/base/00-core/secrets/cert-password-secret.yaml new file mode 100644 index 0000000..fa35898 --- /dev/null +++ b/k8s/base/00-core/secrets/cert-password-secret.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Secret +metadata: + name: cert-password + namespace: eshop-microservices +type: Opaque +data: + CERT_PASSWORD: ZGV2 diff --git a/k8s/base/00-core/secrets/db-secrets.yaml b/k8s/base/00-core/secrets/db-secrets.yaml new file mode 100644 index 0000000..71b6525 --- /dev/null +++ b/k8s/base/00-core/secrets/db-secrets.yaml @@ -0,0 +1,49 @@ +apiVersion: v1 +kind: Secret +metadata: + name: catalog-db-secret + namespace: eshop-microservices +type: Opaque +data: + POSTGRES_USER: cG9zdGdyZXM= + POSTGRES_PASSWORD: cG9zdGdyZXM= +--- +apiVersion: v1 +kind: Secret +metadata: + name: basket-db-secret + namespace: eshop-microservices +type: Opaque +data: + POSTGRES_USER: cG9zdGdyZXM= + POSTGRES_PASSWORD: cG9zdGdyZXM= +--- +apiVersion: v1 +kind: Secret +metadata: + name: identity-db-secret + namespace: eshop-microservices +type: Opaque +data: + POSTGRES_USER: cG9zdGdyZXM= + POSTGRES_PASSWORD: cG9zdGdyZXM= +--- +apiVersion: v1 +kind: Secret +metadata: + name: order-command-db-secret + namespace: eshop-microservices +type: Opaque +data: + POSTGRES_USER: cG9zdGdyZXM= + POSTGRES_PASSWORD: cG9zdGdyZXM= +--- +apiVersion: v1 +kind: Secret +metadata: + name: order-query-db-secret + namespace: eshop-microservices +type: Opaque +data: + POSTGRES_USER: cG9zdGdyZXM= + POSTGRES_PASSWORD: cG9zdGdyZXM= diff --git a/k8s/base/00-core/secrets/identity-secret.yaml b/k8s/base/00-core/secrets/identity-secret.yaml new file mode 100644 index 0000000..07d3944 --- /dev/null +++ b/k8s/base/00-core/secrets/identity-secret.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Secret +metadata: + name: identity-secret + namespace: eshop-microservices +type: Opaque +data: + EmailService__authentication_key: Y2hhbmdlbWU= diff --git a/k8s/base/00-core/secrets/rabbitmq-secret.yaml b/k8s/base/00-core/secrets/rabbitmq-secret.yaml new file mode 100644 index 0000000..efeb9b5 --- /dev/null +++ b/k8s/base/00-core/secrets/rabbitmq-secret.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Secret +metadata: + name: rabbitmq-secret + namespace: eshop-microservices +type: Opaque +data: + RABBITMQ_USERNAME: Z3Vlc3Q= + RABBITMQ_PASSWORD: Z3Vlc3Q= diff --git a/k8s/base/01-databases/basket-db/service.yaml b/k8s/base/01-databases/basket-db/service.yaml new file mode 100644 index 0000000..492bacf --- /dev/null +++ b/k8s/base/01-databases/basket-db/service.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + name: basket-db-headless + namespace: eshop-microservices +spec: + clusterIP: None + selector: + app: basket-db + ports: + - port: 5432 + targetPort: 5432 +--- +apiVersion: v1 +kind: Service +metadata: + name: basket-db + namespace: eshop-microservices +spec: + selector: + app: basket-db + ports: + - port: 5432 + targetPort: 5432 diff --git a/k8s/base/01-databases/basket-db/statefulset.yaml b/k8s/base/01-databases/basket-db/statefulset.yaml new file mode 100644 index 0000000..d3816f2 --- /dev/null +++ b/k8s/base/01-databases/basket-db/statefulset.yaml @@ -0,0 +1,66 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: basket-db + namespace: eshop-microservices +spec: + serviceName: basket-db-headless + replicas: 1 + selector: + matchLabels: + app: basket-db + template: + metadata: + labels: + app: basket-db + spec: + serviceAccountName: sa-databases + containers: + - name: postgres + image: postgres:16-alpine + env: + - name: POSTGRES_DB + value: BasketDb + - name: POSTGRES_USER + valueFrom: + secretKeyRef: + name: basket-db-secret + key: POSTGRES_USER + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: basket-db-secret + key: POSTGRES_PASSWORD + ports: + - containerPort: 5432 + livenessProbe: + exec: + command: ["pg_isready", "-U", "postgres"] + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 5 + readinessProbe: + exec: + command: ["pg_isready", "-U", "postgres"] + initialDelaySeconds: 5 + periodSeconds: 5 + failureThreshold: 3 + resources: + requests: + cpu: 100m + memory: 256Mi + limits: + cpu: 500m + memory: 512Mi + volumeMounts: + - name: data + mountPath: /var/lib/postgresql/data + volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: [ReadWriteOnce] + storageClassName: standard + resources: + requests: + storage: 1Gi diff --git a/k8s/base/01-databases/catalog-db/service.yaml b/k8s/base/01-databases/catalog-db/service.yaml new file mode 100644 index 0000000..85bdfe0 --- /dev/null +++ b/k8s/base/01-databases/catalog-db/service.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + name: catalog-db-headless + namespace: eshop-microservices +spec: + clusterIP: None + selector: + app: catalog-db + ports: + - port: 5432 + targetPort: 5432 +--- +apiVersion: v1 +kind: Service +metadata: + name: catalog-db + namespace: eshop-microservices +spec: + selector: + app: catalog-db + ports: + - port: 5432 + targetPort: 5432 diff --git a/k8s/base/01-databases/catalog-db/statefulset.yaml b/k8s/base/01-databases/catalog-db/statefulset.yaml new file mode 100644 index 0000000..6aa0c02 --- /dev/null +++ b/k8s/base/01-databases/catalog-db/statefulset.yaml @@ -0,0 +1,66 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: catalog-db + namespace: eshop-microservices +spec: + serviceName: catalog-db-headless + replicas: 1 + selector: + matchLabels: + app: catalog-db + template: + metadata: + labels: + app: catalog-db + spec: + serviceAccountName: sa-databases + containers: + - name: postgres + image: postgres:16-alpine + env: + - name: POSTGRES_DB + value: CatalogDb + - name: POSTGRES_USER + valueFrom: + secretKeyRef: + name: catalog-db-secret + key: POSTGRES_USER + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: catalog-db-secret + key: POSTGRES_PASSWORD + ports: + - containerPort: 5432 + livenessProbe: + exec: + command: ["pg_isready", "-U", "postgres"] + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 5 + readinessProbe: + exec: + command: ["pg_isready", "-U", "postgres"] + initialDelaySeconds: 5 + periodSeconds: 5 + failureThreshold: 3 + resources: + requests: + cpu: 100m + memory: 256Mi + limits: + cpu: 500m + memory: 512Mi + volumeMounts: + - name: data + mountPath: /var/lib/postgresql/data + volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: [ReadWriteOnce] + storageClassName: standard + resources: + requests: + storage: 1Gi diff --git a/k8s/base/01-databases/identity-db/service.yaml b/k8s/base/01-databases/identity-db/service.yaml new file mode 100644 index 0000000..1102a58 --- /dev/null +++ b/k8s/base/01-databases/identity-db/service.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + name: identity-db-headless + namespace: eshop-microservices +spec: + clusterIP: None + selector: + app: identity-db + ports: + - port: 5432 + targetPort: 5432 +--- +apiVersion: v1 +kind: Service +metadata: + name: identity-db + namespace: eshop-microservices +spec: + selector: + app: identity-db + ports: + - port: 5432 + targetPort: 5432 diff --git a/k8s/base/01-databases/identity-db/statefulset.yaml b/k8s/base/01-databases/identity-db/statefulset.yaml new file mode 100644 index 0000000..5aa19d2 --- /dev/null +++ b/k8s/base/01-databases/identity-db/statefulset.yaml @@ -0,0 +1,66 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: identity-db + namespace: eshop-microservices +spec: + serviceName: identity-db-headless + replicas: 1 + selector: + matchLabels: + app: identity-db + template: + metadata: + labels: + app: identity-db + spec: + serviceAccountName: sa-databases + containers: + - name: postgres + image: postgres:16-alpine + env: + - name: POSTGRES_DB + value: IdentityDb + - name: POSTGRES_USER + valueFrom: + secretKeyRef: + name: identity-db-secret + key: POSTGRES_USER + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: identity-db-secret + key: POSTGRES_PASSWORD + ports: + - containerPort: 5432 + livenessProbe: + exec: + command: ["pg_isready", "-U", "postgres"] + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 5 + readinessProbe: + exec: + command: ["pg_isready", "-U", "postgres"] + initialDelaySeconds: 5 + periodSeconds: 5 + failureThreshold: 3 + resources: + requests: + cpu: 100m + memory: 256Mi + limits: + cpu: 500m + memory: 512Mi + volumeMounts: + - name: data + mountPath: /var/lib/postgresql/data + volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: [ReadWriteOnce] + storageClassName: standard + resources: + requests: + storage: 1Gi diff --git a/k8s/base/01-databases/kustomization.yaml b/k8s/base/01-databases/kustomization.yaml new file mode 100644 index 0000000..94eb233 --- /dev/null +++ b/k8s/base/01-databases/kustomization.yaml @@ -0,0 +1,20 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +namespace: eshop-microservices + +resources: + - catalog-db/statefulset.yaml + - catalog-db/service.yaml + - basket-db/statefulset.yaml + - basket-db/service.yaml + - identity-db/statefulset.yaml + - identity-db/service.yaml + - order-command-db/statefulset.yaml + - order-command-db/service.yaml + - order-query-db/statefulset.yaml + - order-query-db/service.yaml + - redis/statefulset.yaml + - redis/service.yaml + - rabbitmq/statefulset.yaml + - rabbitmq/service.yaml diff --git a/k8s/base/01-databases/order-command-db/service.yaml b/k8s/base/01-databases/order-command-db/service.yaml new file mode 100644 index 0000000..6d3d6c0 --- /dev/null +++ b/k8s/base/01-databases/order-command-db/service.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + name: order-command-db-headless + namespace: eshop-microservices +spec: + clusterIP: None + selector: + app: order-command-db + ports: + - port: 5432 + targetPort: 5432 +--- +apiVersion: v1 +kind: Service +metadata: + name: order-command-db + namespace: eshop-microservices +spec: + selector: + app: order-command-db + ports: + - port: 5432 + targetPort: 5432 diff --git a/k8s/base/01-databases/order-command-db/statefulset.yaml b/k8s/base/01-databases/order-command-db/statefulset.yaml new file mode 100644 index 0000000..26c813c --- /dev/null +++ b/k8s/base/01-databases/order-command-db/statefulset.yaml @@ -0,0 +1,66 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: order-command-db + namespace: eshop-microservices +spec: + serviceName: order-command-db-headless + replicas: 1 + selector: + matchLabels: + app: order-command-db + template: + metadata: + labels: + app: order-command-db + spec: + serviceAccountName: sa-databases + containers: + - name: postgres + image: postgres:16-alpine + env: + - name: POSTGRES_DB + value: OrderCommandDb + - name: POSTGRES_USER + valueFrom: + secretKeyRef: + name: order-command-db-secret + key: POSTGRES_USER + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: order-command-db-secret + key: POSTGRES_PASSWORD + ports: + - containerPort: 5432 + livenessProbe: + exec: + command: ["pg_isready", "-U", "postgres"] + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 5 + readinessProbe: + exec: + command: ["pg_isready", "-U", "postgres"] + initialDelaySeconds: 5 + periodSeconds: 5 + failureThreshold: 3 + resources: + requests: + cpu: 100m + memory: 256Mi + limits: + cpu: 500m + memory: 512Mi + volumeMounts: + - name: data + mountPath: /var/lib/postgresql/data + volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: [ReadWriteOnce] + storageClassName: standard + resources: + requests: + storage: 1Gi diff --git a/k8s/base/01-databases/order-query-db/service.yaml b/k8s/base/01-databases/order-query-db/service.yaml new file mode 100644 index 0000000..ec819eb --- /dev/null +++ b/k8s/base/01-databases/order-query-db/service.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + name: order-query-db-headless + namespace: eshop-microservices +spec: + clusterIP: None + selector: + app: order-query-db + ports: + - port: 5432 + targetPort: 5432 +--- +apiVersion: v1 +kind: Service +metadata: + name: order-query-db + namespace: eshop-microservices +spec: + selector: + app: order-query-db + ports: + - port: 5432 + targetPort: 5432 diff --git a/k8s/base/01-databases/order-query-db/statefulset.yaml b/k8s/base/01-databases/order-query-db/statefulset.yaml new file mode 100644 index 0000000..8b0e626 --- /dev/null +++ b/k8s/base/01-databases/order-query-db/statefulset.yaml @@ -0,0 +1,66 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: order-query-db + namespace: eshop-microservices +spec: + serviceName: order-query-db-headless + replicas: 1 + selector: + matchLabels: + app: order-query-db + template: + metadata: + labels: + app: order-query-db + spec: + serviceAccountName: sa-databases + containers: + - name: postgres + image: postgres:16-alpine + env: + - name: POSTGRES_DB + value: OrderQueryDb + - name: POSTGRES_USER + valueFrom: + secretKeyRef: + name: order-query-db-secret + key: POSTGRES_USER + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: order-query-db-secret + key: POSTGRES_PASSWORD + ports: + - containerPort: 5432 + livenessProbe: + exec: + command: ["pg_isready", "-U", "postgres"] + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 5 + readinessProbe: + exec: + command: ["pg_isready", "-U", "postgres"] + initialDelaySeconds: 5 + periodSeconds: 5 + failureThreshold: 3 + resources: + requests: + cpu: 100m + memory: 256Mi + limits: + cpu: 500m + memory: 512Mi + volumeMounts: + - name: data + mountPath: /var/lib/postgresql/data + volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: [ReadWriteOnce] + storageClassName: standard + resources: + requests: + storage: 1Gi diff --git a/k8s/base/01-databases/rabbitmq/service.yaml b/k8s/base/01-databases/rabbitmq/service.yaml new file mode 100644 index 0000000..29be564 --- /dev/null +++ b/k8s/base/01-databases/rabbitmq/service.yaml @@ -0,0 +1,30 @@ +apiVersion: v1 +kind: Service +metadata: + name: rabbitmq-headless + namespace: eshop-microservices +spec: + clusterIP: None + selector: + app: rabbitmq + ports: + - port: 5672 + name: amqp + - port: 15672 + name: management +--- +apiVersion: v1 +kind: Service +metadata: + name: rabbitmq + namespace: eshop-microservices +spec: + selector: + app: rabbitmq + ports: + - port: 5672 + targetPort: 5672 + name: amqp + - port: 15672 + targetPort: 15672 + name: management diff --git a/k8s/base/01-databases/rabbitmq/statefulset.yaml b/k8s/base/01-databases/rabbitmq/statefulset.yaml new file mode 100644 index 0000000..8dd1f24 --- /dev/null +++ b/k8s/base/01-databases/rabbitmq/statefulset.yaml @@ -0,0 +1,68 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: rabbitmq + namespace: eshop-microservices +spec: + serviceName: rabbitmq-headless + replicas: 1 + selector: + matchLabels: + app: rabbitmq + template: + metadata: + labels: + app: rabbitmq + spec: + serviceAccountName: sa-databases + hostname: rabbitmq + containers: + - name: rabbitmq + image: rabbitmq:3-management-alpine + env: + - name: RABBITMQ_DEFAULT_USER + valueFrom: + secretKeyRef: + name: rabbitmq-secret + key: RABBITMQ_USERNAME + - name: RABBITMQ_DEFAULT_PASS + valueFrom: + secretKeyRef: + name: rabbitmq-secret + key: RABBITMQ_PASSWORD + ports: + - containerPort: 5672 + name: amqp + - containerPort: 15672 + name: management + livenessProbe: + exec: + command: ["rabbitmq-diagnostics", "ping"] + initialDelaySeconds: 60 + periodSeconds: 15 + failureThreshold: 5 + readinessProbe: + exec: + command: ["rabbitmq-diagnostics", "ping"] + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 3 + resources: + requests: + cpu: 200m + memory: 256Mi + limits: + cpu: 500m + memory: 512Mi + volumeMounts: + - name: data + mountPath: /var/lib/rabbitmq + volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: [ReadWriteOnce] + storageClassName: standard + resources: + requests: + storage: 1Gi diff --git a/k8s/base/01-databases/redis/service.yaml b/k8s/base/01-databases/redis/service.yaml new file mode 100644 index 0000000..fbf6826 --- /dev/null +++ b/k8s/base/01-databases/redis/service.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + name: redis-headless + namespace: eshop-microservices +spec: + clusterIP: None + selector: + app: redis + ports: + - port: 6379 + targetPort: 6379 +--- +apiVersion: v1 +kind: Service +metadata: + name: redis + namespace: eshop-microservices +spec: + selector: + app: redis + ports: + - port: 6379 + targetPort: 6379 diff --git a/k8s/base/01-databases/redis/statefulset.yaml b/k8s/base/01-databases/redis/statefulset.yaml new file mode 100644 index 0000000..830c594 --- /dev/null +++ b/k8s/base/01-databases/redis/statefulset.yaml @@ -0,0 +1,53 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: redis + namespace: eshop-microservices +spec: + serviceName: redis-headless + replicas: 1 + selector: + matchLabels: + app: redis + template: + metadata: + labels: + app: redis + spec: + serviceAccountName: sa-databases + containers: + - name: redis + image: redis:alpine + ports: + - containerPort: 6379 + livenessProbe: + exec: + command: ["redis-cli", "ping"] + initialDelaySeconds: 15 + periodSeconds: 10 + failureThreshold: 5 + readinessProbe: + exec: + command: ["redis-cli", "ping"] + initialDelaySeconds: 5 + periodSeconds: 5 + failureThreshold: 3 + resources: + requests: + cpu: 50m + memory: 64Mi + limits: + cpu: 200m + memory: 256Mi + volumeMounts: + - name: data + mountPath: /data + volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: [ReadWriteOnce] + storageClassName: standard + resources: + requests: + storage: 512Mi diff --git a/k8s/base/02-observability/elasticsearch/service.yaml b/k8s/base/02-observability/elasticsearch/service.yaml new file mode 100644 index 0000000..e7bbcb0 --- /dev/null +++ b/k8s/base/02-observability/elasticsearch/service.yaml @@ -0,0 +1,27 @@ +apiVersion: v1 +kind: Service +metadata: + name: elasticsearch-headless + namespace: eshop-microservices +spec: + clusterIP: None + selector: + app: elasticsearch + ports: + - port: 9200 + name: http + - port: 9300 + name: transport +--- +apiVersion: v1 +kind: Service +metadata: + name: elasticsearch + namespace: eshop-microservices +spec: + selector: + app: elasticsearch + ports: + - port: 9200 + targetPort: 9200 + name: http diff --git a/k8s/base/02-observability/elasticsearch/statefulset.yaml b/k8s/base/02-observability/elasticsearch/statefulset.yaml new file mode 100644 index 0000000..0a2d516 --- /dev/null +++ b/k8s/base/02-observability/elasticsearch/statefulset.yaml @@ -0,0 +1,74 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: elasticsearch + namespace: eshop-microservices +spec: + serviceName: elasticsearch-headless + replicas: 1 + selector: + matchLabels: + app: elasticsearch + template: + metadata: + labels: + app: elasticsearch + spec: + serviceAccountName: sa-observability + initContainers: + - name: fix-permissions + image: busybox:1.36 + command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"] + volumeMounts: + - name: data + mountPath: /usr/share/elasticsearch/data + containers: + - name: elasticsearch + image: docker.elastic.co/elasticsearch/elasticsearch:7.17.27 + env: + - name: discovery.type + value: single-node + - name: xpack.monitoring.enabled + value: "true" + - name: xpack.watcher.enabled + value: "false" + - name: ES_JAVA_OPTS + value: "-Xms512m -Xmx512m" + ports: + - containerPort: 9200 + name: http + - containerPort: 9300 + name: transport + livenessProbe: + httpGet: + path: /_cluster/health + port: 9200 + initialDelaySeconds: 60 + periodSeconds: 15 + failureThreshold: 5 + readinessProbe: + httpGet: + path: /_cluster/health?wait_for_status=yellow + port: 9200 + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 5 + resources: + requests: + cpu: 500m + memory: 1Gi + limits: + cpu: 1000m + memory: 2Gi + volumeMounts: + - name: data + mountPath: /usr/share/elasticsearch/data + volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: [ReadWriteOnce] + storageClassName: standard + resources: + requests: + storage: 10Gi diff --git a/k8s/base/02-observability/grafana/deployment.yaml b/k8s/base/02-observability/grafana/deployment.yaml new file mode 100644 index 0000000..626c60d --- /dev/null +++ b/k8s/base/02-observability/grafana/deployment.yaml @@ -0,0 +1,54 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: grafana + namespace: eshop-microservices +spec: + replicas: 1 + selector: + matchLabels: + app: grafana + template: + metadata: + labels: + app: grafana + spec: + serviceAccountName: sa-observability + containers: + - name: grafana + image: grafana/grafana:10.2.3 + env: + - name: GF_AUTH_ANONYMOUS_ENABLED + value: "true" + - name: GF_AUTH_ANONYMOUS_ORG_ROLE + value: "Admin" + - name: GF_AUTH_DISABLE_LOGIN_FORM + value: "true" + ports: + - containerPort: 3000 + livenessProbe: + httpGet: + path: /api/health + port: 3000 + initialDelaySeconds: 30 + periodSeconds: 10 + readinessProbe: + httpGet: + path: /api/health + port: 3000 + initialDelaySeconds: 15 + periodSeconds: 5 + resources: + requests: + cpu: 100m + memory: 128Mi + limits: + cpu: 300m + memory: 256Mi + volumeMounts: + - name: provisioning + mountPath: /etc/grafana/provisioning/datasources + volumes: + - name: provisioning + configMap: + name: grafana-provisioning diff --git a/k8s/base/02-observability/grafana/provisioning-cm.yaml b/k8s/base/02-observability/grafana/provisioning-cm.yaml new file mode 100644 index 0000000..4b1f8f3 --- /dev/null +++ b/k8s/base/02-observability/grafana/provisioning-cm.yaml @@ -0,0 +1,28 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-provisioning + namespace: eshop-microservices +data: + datasources.yaml: | + apiVersion: 1 + datasources: + - name: Prometheus + type: prometheus + uid: prometheus + url: http://prometheus:9090 + isDefault: true + access: proxy + editable: false + - name: Loki + type: loki + uid: loki + url: http://loki:3100 + access: proxy + editable: false + - name: Jaeger + type: jaeger + uid: jaeger + url: http://jaeger:16686 + access: proxy + editable: false diff --git a/k8s/base/02-observability/grafana/service.yaml b/k8s/base/02-observability/grafana/service.yaml new file mode 100644 index 0000000..93dca86 --- /dev/null +++ b/k8s/base/02-observability/grafana/service.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Service +metadata: + name: grafana + namespace: eshop-microservices +spec: + selector: + app: grafana + ports: + - port: 3000 + targetPort: 3000 diff --git a/k8s/base/02-observability/jaeger/deployment.yaml b/k8s/base/02-observability/jaeger/deployment.yaml new file mode 100644 index 0000000..9922333 --- /dev/null +++ b/k8s/base/02-observability/jaeger/deployment.yaml @@ -0,0 +1,69 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: jaeger + namespace: eshop-microservices +spec: + replicas: 1 + selector: + matchLabels: + app: jaeger + template: + metadata: + labels: + app: jaeger + spec: + serviceAccountName: sa-observability + containers: + - name: jaeger + image: jaegertracing/all-in-one:1.52 + args: + - "--query.ui-config=/etc/jaeger/jaeger-ui.json" + - "--collector.otlp.enabled=true" + - "--prometheus.server-url=http://prometheus:9090" + - "--prometheus.query.support-spanmetrics-connector=true" + env: + - name: METRICS_STORAGE_TYPE + value: prometheus + - name: PROMETHEUS_QUERY_NORMALIZE_CALLS + value: "true" + - name: PROMETHEUS_QUERY_NORMALIZE_DURATION + value: "true" + ports: + - containerPort: 16686 + name: ui + - containerPort: 14268 + name: collector-http + - containerPort: 14269 + name: admin + - containerPort: 4317 + name: otlp-grpc + - containerPort: 6831 + name: agent-udp + protocol: UDP + livenessProbe: + httpGet: + path: / + port: 14269 + initialDelaySeconds: 20 + periodSeconds: 10 + readinessProbe: + httpGet: + path: / + port: 14269 + initialDelaySeconds: 10 + periodSeconds: 5 + resources: + requests: + cpu: 100m + memory: 128Mi + limits: + cpu: 500m + memory: 512Mi + volumeMounts: + - name: jaeger-ui-config + mountPath: /etc/jaeger + volumes: + - name: jaeger-ui-config + configMap: + name: jaeger-ui-config diff --git a/k8s/base/02-observability/jaeger/service.yaml b/k8s/base/02-observability/jaeger/service.yaml new file mode 100644 index 0000000..5511a6e --- /dev/null +++ b/k8s/base/02-observability/jaeger/service.yaml @@ -0,0 +1,25 @@ +apiVersion: v1 +kind: Service +metadata: + name: jaeger + namespace: eshop-microservices +spec: + selector: + app: jaeger + ports: + - port: 16686 + targetPort: 16686 + name: ui + - port: 14268 + targetPort: 14268 + name: collector-http + - port: 14269 + targetPort: 14269 + name: admin + - port: 4317 + targetPort: 4317 + name: otlp-grpc + - port: 6831 + targetPort: 6831 + protocol: UDP + name: agent-udp diff --git a/k8s/base/02-observability/kibana/deployment.yaml b/k8s/base/02-observability/kibana/deployment.yaml new file mode 100644 index 0000000..a4f3cb6 --- /dev/null +++ b/k8s/base/02-observability/kibana/deployment.yaml @@ -0,0 +1,45 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: kibana + namespace: eshop-microservices +spec: + replicas: 1 + selector: + matchLabels: + app: kibana + template: + metadata: + labels: + app: kibana + spec: + serviceAccountName: sa-observability + containers: + - name: kibana + image: docker.elastic.co/kibana/kibana:7.17.27 + env: + - name: ELASTICSEARCH_HOSTS + value: "http://elasticsearch:9200" + ports: + - containerPort: 5601 + livenessProbe: + httpGet: + path: /api/status + port: 5601 + initialDelaySeconds: 60 + periodSeconds: 15 + failureThreshold: 5 + readinessProbe: + httpGet: + path: /api/status + port: 5601 + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 5 + resources: + requests: + cpu: 200m + memory: 512Mi + limits: + cpu: 500m + memory: 1Gi diff --git a/k8s/base/02-observability/kibana/service.yaml b/k8s/base/02-observability/kibana/service.yaml new file mode 100644 index 0000000..3a45f96 --- /dev/null +++ b/k8s/base/02-observability/kibana/service.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Service +metadata: + name: kibana + namespace: eshop-microservices +spec: + selector: + app: kibana + ports: + - port: 5601 + targetPort: 5601 diff --git a/k8s/base/02-observability/kustomization.yaml b/k8s/base/02-observability/kustomization.yaml new file mode 100644 index 0000000..1c27f78 --- /dev/null +++ b/k8s/base/02-observability/kustomization.yaml @@ -0,0 +1,23 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +namespace: eshop-microservices + +resources: + - elasticsearch/statefulset.yaml + - elasticsearch/service.yaml + - kibana/deployment.yaml + - kibana/service.yaml + - otel-collector/deployment.yaml + - otel-collector/service.yaml + - jaeger/deployment.yaml + - jaeger/service.yaml + - prometheus/pvc.yaml + - prometheus/deployment.yaml + - prometheus/service.yaml + - loki/pvc.yaml + - loki/deployment.yaml + - loki/service.yaml + - grafana/provisioning-cm.yaml + - grafana/deployment.yaml + - grafana/service.yaml diff --git a/k8s/base/02-observability/loki/deployment.yaml b/k8s/base/02-observability/loki/deployment.yaml new file mode 100644 index 0000000..f8eb71e --- /dev/null +++ b/k8s/base/02-observability/loki/deployment.yaml @@ -0,0 +1,56 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: loki + namespace: eshop-microservices +spec: + replicas: 1 + selector: + matchLabels: + app: loki + template: + metadata: + labels: + app: loki + spec: + serviceAccountName: sa-observability + containers: + - name: loki + image: grafana/loki:2.9.3 + args: + - "-config.file=/mnt/config/loki-config.yml" + ports: + - containerPort: 3100 + livenessProbe: + httpGet: + path: /ready + port: 3100 + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 5 + readinessProbe: + httpGet: + path: /ready + port: 3100 + initialDelaySeconds: 15 + periodSeconds: 5 + failureThreshold: 3 + resources: + requests: + cpu: 100m + memory: 128Mi + limits: + cpu: 300m + memory: 512Mi + volumeMounts: + - name: config + mountPath: /mnt/config + - name: data + mountPath: /tmp/loki + volumes: + - name: config + configMap: + name: loki-config + - name: data + persistentVolumeClaim: + claimName: loki-pvc diff --git a/k8s/base/02-observability/loki/pvc.yaml b/k8s/base/02-observability/loki/pvc.yaml new file mode 100644 index 0000000..40e940b --- /dev/null +++ b/k8s/base/02-observability/loki/pvc.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: loki-pvc + namespace: eshop-microservices +spec: + accessModes: [ReadWriteOnce] + storageClassName: standard + resources: + requests: + storage: 5Gi diff --git a/k8s/base/02-observability/loki/service.yaml b/k8s/base/02-observability/loki/service.yaml new file mode 100644 index 0000000..fc72ed0 --- /dev/null +++ b/k8s/base/02-observability/loki/service.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Service +metadata: + name: loki + namespace: eshop-microservices +spec: + selector: + app: loki + ports: + - port: 3100 + targetPort: 3100 diff --git a/k8s/base/02-observability/otel-collector/deployment.yaml b/k8s/base/02-observability/otel-collector/deployment.yaml new file mode 100644 index 0000000..58ae8ad --- /dev/null +++ b/k8s/base/02-observability/otel-collector/deployment.yaml @@ -0,0 +1,42 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: otel-collector + namespace: eshop-microservices +spec: + replicas: 1 + selector: + matchLabels: + app: otel-collector + template: + metadata: + labels: + app: otel-collector + spec: + serviceAccountName: sa-observability + containers: + - name: otel-collector + image: otel/opentelemetry-collector-contrib:0.91.0 + args: + - "--config=/etc/otelcol/otel-collector-config.yml" + ports: + - containerPort: 4317 + name: otlp-grpc + - containerPort: 4318 + name: otlp-http + - containerPort: 8889 + name: prometheus + resources: + requests: + cpu: 100m + memory: 128Mi + limits: + cpu: 500m + memory: 512Mi + volumeMounts: + - name: config + mountPath: /etc/otelcol + volumes: + - name: config + configMap: + name: otel-collector-config diff --git a/k8s/base/02-observability/otel-collector/service.yaml b/k8s/base/02-observability/otel-collector/service.yaml new file mode 100644 index 0000000..45f6798 --- /dev/null +++ b/k8s/base/02-observability/otel-collector/service.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: Service +metadata: + name: otel-collector + namespace: eshop-microservices +spec: + selector: + app: otel-collector + ports: + - port: 4317 + targetPort: 4317 + name: otlp-grpc + - port: 4318 + targetPort: 4318 + name: otlp-http + - port: 8889 + targetPort: 8889 + name: prometheus diff --git a/k8s/base/02-observability/prometheus/deployment.yaml b/k8s/base/02-observability/prometheus/deployment.yaml new file mode 100644 index 0000000..398898e --- /dev/null +++ b/k8s/base/02-observability/prometheus/deployment.yaml @@ -0,0 +1,56 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: prometheus + namespace: eshop-microservices +spec: + replicas: 1 + selector: + matchLabels: + app: prometheus + template: + metadata: + labels: + app: prometheus + spec: + serviceAccountName: sa-observability + securityContext: + fsGroup: 65534 + runAsUser: 65534 + runAsNonRoot: true + containers: + - name: prometheus + image: prom/prometheus:v2.48.1 + ports: + - containerPort: 9090 + livenessProbe: + httpGet: + path: /-/healthy + port: 9090 + initialDelaySeconds: 20 + periodSeconds: 10 + readinessProbe: + httpGet: + path: /-/ready + port: 9090 + initialDelaySeconds: 10 + periodSeconds: 5 + resources: + requests: + cpu: 100m + memory: 256Mi + limits: + cpu: 500m + memory: 1Gi + volumeMounts: + - name: config + mountPath: /etc/prometheus + - name: data + mountPath: /prometheus + volumes: + - name: config + configMap: + name: prometheus-config + - name: data + persistentVolumeClaim: + claimName: prometheus-pvc diff --git a/k8s/base/02-observability/prometheus/pvc.yaml b/k8s/base/02-observability/prometheus/pvc.yaml new file mode 100644 index 0000000..07912c8 --- /dev/null +++ b/k8s/base/02-observability/prometheus/pvc.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: prometheus-pvc + namespace: eshop-microservices +spec: + accessModes: [ReadWriteOnce] + storageClassName: standard + resources: + requests: + storage: 5Gi diff --git a/k8s/base/02-observability/prometheus/service.yaml b/k8s/base/02-observability/prometheus/service.yaml new file mode 100644 index 0000000..8b85661 --- /dev/null +++ b/k8s/base/02-observability/prometheus/service.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Service +metadata: + name: prometheus + namespace: eshop-microservices +spec: + selector: + app: prometheus + ports: + - port: 9090 + targetPort: 9090 diff --git a/k8s/base/03-mail/kustomization.yaml b/k8s/base/03-mail/kustomization.yaml new file mode 100644 index 0000000..19801f6 --- /dev/null +++ b/k8s/base/03-mail/kustomization.yaml @@ -0,0 +1,9 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +namespace: eshop-microservices + +resources: + - mailpit/pvc.yaml + - mailpit/deployment.yaml + - mailpit/service.yaml diff --git a/k8s/base/03-mail/mailpit/deployment.yaml b/k8s/base/03-mail/mailpit/deployment.yaml new file mode 100644 index 0000000..9774509 --- /dev/null +++ b/k8s/base/03-mail/mailpit/deployment.yaml @@ -0,0 +1,58 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mailpit + namespace: eshop-microservices +spec: + replicas: 1 + selector: + matchLabels: + app: mailpit + template: + metadata: + labels: + app: mailpit + spec: + containers: + - name: mailpit + image: axllent/mailpit:latest + env: + - name: MP_MAX_MESSAGES + value: "5000" + - name: MP_DATABASE + value: "/data/mailpit.db" + - name: MP_SMTP_AUTH_ACCEPT_ANY + value: "1" + - name: MP_SMTP_AUTH_ALLOW_INSECURE + value: "1" + ports: + - containerPort: 8025 + name: ui + - containerPort: 1025 + name: smtp + livenessProbe: + httpGet: + path: /livez + port: 8025 + initialDelaySeconds: 10 + periodSeconds: 10 + readinessProbe: + httpGet: + path: /readyz + port: 8025 + initialDelaySeconds: 5 + periodSeconds: 5 + resources: + requests: + cpu: 50m + memory: 64Mi + limits: + cpu: 200m + memory: 256Mi + volumeMounts: + - name: data + mountPath: /data + volumes: + - name: data + persistentVolumeClaim: + claimName: mailpit-pvc diff --git a/k8s/base/03-mail/mailpit/pvc.yaml b/k8s/base/03-mail/mailpit/pvc.yaml new file mode 100644 index 0000000..494dedd --- /dev/null +++ b/k8s/base/03-mail/mailpit/pvc.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: mailpit-pvc + namespace: eshop-microservices +spec: + accessModes: [ReadWriteOnce] + storageClassName: standard + resources: + requests: + storage: 512Mi diff --git a/k8s/base/03-mail/mailpit/service.yaml b/k8s/base/03-mail/mailpit/service.yaml new file mode 100644 index 0000000..8ee518b --- /dev/null +++ b/k8s/base/03-mail/mailpit/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: mailpit + namespace: eshop-microservices +spec: + selector: + app: mailpit + ports: + - port: 8025 + targetPort: 8025 + name: ui + - port: 1025 + targetPort: 1025 + name: smtp diff --git a/k8s/base/04-services/api-gateway/deployment.yaml b/k8s/base/04-services/api-gateway/deployment.yaml new file mode 100644 index 0000000..2f167c6 --- /dev/null +++ b/k8s/base/04-services/api-gateway/deployment.yaml @@ -0,0 +1,72 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: api-gateway + namespace: eshop-microservices +spec: + replicas: 1 + selector: + matchLabels: + app: api-gateway + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + template: + metadata: + labels: + app: api-gateway + spec: + serviceAccountName: sa-api-gateway + containers: + - name: api-gateway + image: api.gateway:latest + imagePullPolicy: IfNotPresent + envFrom: + - configMapRef: + name: api-gateway-cm + env: + - name: ASPNETCORE_Kestrel__Certificates__Default__Password + valueFrom: + secretKeyRef: + name: cert-password + key: CERT_PASSWORD + ports: + - containerPort: 8080 + name: http + - containerPort: 8081 + name: https + livenessProbe: + httpGet: + path: /hc + port: 8080 + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 5 + readinessProbe: + httpGet: + path: /hc + port: 8080 + initialDelaySeconds: 15 + periodSeconds: 5 + failureThreshold: 3 + resources: + requests: + cpu: 100m + memory: 128Mi + limits: + cpu: 500m + memory: 512Mi + volumeMounts: + - name: certs + mountPath: /app/certificates + readOnly: true + volumes: + - name: certs + projected: + sources: + - secret: + name: cert-api-gateway + - configMap: + name: cert-ca diff --git a/k8s/base/04-services/api-gateway/hpa.yaml b/k8s/base/04-services/api-gateway/hpa.yaml new file mode 100644 index 0000000..534ae50 --- /dev/null +++ b/k8s/base/04-services/api-gateway/hpa.yaml @@ -0,0 +1,19 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: api-gateway-hpa + namespace: eshop-microservices +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: api-gateway + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 70 diff --git a/k8s/base/04-services/api-gateway/service.yaml b/k8s/base/04-services/api-gateway/service.yaml new file mode 100644 index 0000000..06cd69a --- /dev/null +++ b/k8s/base/04-services/api-gateway/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: api-gateway + namespace: eshop-microservices +spec: + selector: + app: api-gateway + ports: + - port: 8080 + targetPort: 8080 + name: http + - port: 8081 + targetPort: 8081 + name: https diff --git a/k8s/base/04-services/basket-api/deployment.yaml b/k8s/base/04-services/basket-api/deployment.yaml new file mode 100644 index 0000000..b560ba2 --- /dev/null +++ b/k8s/base/04-services/basket-api/deployment.yaml @@ -0,0 +1,91 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: basket-api + namespace: eshop-microservices +spec: + replicas: 1 + selector: + matchLabels: + app: basket-api + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + template: + metadata: + labels: + app: basket-api + spec: + serviceAccountName: sa-basket-api + initContainers: + - name: wait-for-db + image: busybox:1.36 + command: ['sh', '-c', 'until nc -z basket-db 5432; do echo waiting for basket-db; sleep 2; done'] + - name: wait-for-redis + image: busybox:1.36 + command: ['sh', '-c', 'until nc -z redis 6379; do echo waiting for redis; sleep 2; done'] + containers: + - name: basket-api + image: basket.api:latest + imagePullPolicy: IfNotPresent + envFrom: + - configMapRef: + name: basket-api-cm + env: + - name: DB_USER + valueFrom: + secretKeyRef: + name: basket-db-secret + key: POSTGRES_USER + - name: DB_PASSWORD + valueFrom: + secretKeyRef: + name: basket-db-secret + key: POSTGRES_PASSWORD + - name: ConnectionStrings__Database + value: "Server=basket-db;Port=5432;Database=BasketDb;User Id=$(DB_USER);Password=$(DB_PASSWORD)" + - name: ASPNETCORE_Kestrel__Certificates__Default__Password + valueFrom: + secretKeyRef: + name: cert-password + key: CERT_PASSWORD + ports: + - containerPort: 8080 + name: http + - containerPort: 8081 + name: https + livenessProbe: + httpGet: + path: /hc + port: 8080 + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 5 + readinessProbe: + httpGet: + path: /hc + port: 8080 + initialDelaySeconds: 15 + periodSeconds: 5 + failureThreshold: 3 + resources: + requests: + cpu: 100m + memory: 128Mi + limits: + cpu: 500m + memory: 512Mi + volumeMounts: + - name: certs + mountPath: /app/certificates + readOnly: true + volumes: + - name: certs + projected: + sources: + - secret: + name: cert-basket-api + - configMap: + name: cert-ca diff --git a/k8s/base/04-services/basket-api/hpa.yaml b/k8s/base/04-services/basket-api/hpa.yaml new file mode 100644 index 0000000..de68af5 --- /dev/null +++ b/k8s/base/04-services/basket-api/hpa.yaml @@ -0,0 +1,19 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: basket-api-hpa + namespace: eshop-microservices +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: basket-api + minReplicas: 1 + maxReplicas: 5 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 70 diff --git a/k8s/base/04-services/basket-api/service.yaml b/k8s/base/04-services/basket-api/service.yaml new file mode 100644 index 0000000..bc4f0e3 --- /dev/null +++ b/k8s/base/04-services/basket-api/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: basket-api + namespace: eshop-microservices +spec: + selector: + app: basket-api + ports: + - port: 8080 + targetPort: 8080 + name: http + - port: 8081 + targetPort: 8081 + name: https diff --git a/k8s/base/04-services/catalog-api/deployment.yaml b/k8s/base/04-services/catalog-api/deployment.yaml new file mode 100644 index 0000000..1c666e9 --- /dev/null +++ b/k8s/base/04-services/catalog-api/deployment.yaml @@ -0,0 +1,88 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: catalog-api + namespace: eshop-microservices +spec: + replicas: 1 + selector: + matchLabels: + app: catalog-api + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + template: + metadata: + labels: + app: catalog-api + spec: + serviceAccountName: sa-catalog-api + initContainers: + - name: wait-for-db + image: busybox:1.36 + command: ['sh', '-c', 'until nc -z catalog-db 5432; do echo waiting for catalog-db; sleep 2; done'] + containers: + - name: catalog-api + image: catalog.api:latest + imagePullPolicy: IfNotPresent + envFrom: + - configMapRef: + name: catalog-api-cm + env: + - name: DB_USER + valueFrom: + secretKeyRef: + name: catalog-db-secret + key: POSTGRES_USER + - name: DB_PASSWORD + valueFrom: + secretKeyRef: + name: catalog-db-secret + key: POSTGRES_PASSWORD + - name: ConnectionStrings__Database + value: "Server=catalog-db;Port=5432;Database=CatalogDb;User Id=$(DB_USER);Password=$(DB_PASSWORD)" + - name: ASPNETCORE_Kestrel__Certificates__Default__Password + valueFrom: + secretKeyRef: + name: cert-password + key: CERT_PASSWORD + ports: + - containerPort: 8080 + name: http + - containerPort: 8081 + name: https + livenessProbe: + httpGet: + path: /hc + port: 8080 + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 5 + readinessProbe: + httpGet: + path: /hc + port: 8080 + initialDelaySeconds: 15 + periodSeconds: 5 + failureThreshold: 3 + resources: + requests: + cpu: 100m + memory: 128Mi + limits: + cpu: 500m + memory: 512Mi + volumeMounts: + - name: certs + mountPath: /app/certificates + readOnly: true + volumes: + - name: certs + projected: + sources: + - secret: + name: cert-catalog-api + - configMap: + name: cert-ca diff --git a/k8s/base/04-services/catalog-api/hpa.yaml b/k8s/base/04-services/catalog-api/hpa.yaml new file mode 100644 index 0000000..302dbd5 --- /dev/null +++ b/k8s/base/04-services/catalog-api/hpa.yaml @@ -0,0 +1,19 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: catalog-api-hpa + namespace: eshop-microservices +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: catalog-api + minReplicas: 1 + maxReplicas: 5 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 70 diff --git a/k8s/base/04-services/catalog-api/service.yaml b/k8s/base/04-services/catalog-api/service.yaml new file mode 100644 index 0000000..647f314 --- /dev/null +++ b/k8s/base/04-services/catalog-api/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: catalog-api + namespace: eshop-microservices +spec: + selector: + app: catalog-api + ports: + - port: 8080 + targetPort: 8080 + name: http + - port: 8081 + targetPort: 8081 + name: https diff --git a/k8s/base/04-services/discount-grpc/deployment.yaml b/k8s/base/04-services/discount-grpc/deployment.yaml new file mode 100644 index 0000000..0d39ad3 --- /dev/null +++ b/k8s/base/04-services/discount-grpc/deployment.yaml @@ -0,0 +1,74 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: discount-grpc + namespace: eshop-microservices +spec: + replicas: 1 + selector: + matchLabels: + app: discount-grpc + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + template: + metadata: + labels: + app: discount-grpc + spec: + serviceAccountName: sa-discount-grpc + containers: + - name: discount-grpc + image: discount.grpc:latest + imagePullPolicy: IfNotPresent + envFrom: + - configMapRef: + name: discount-grpc-cm + env: + - name: ASPNETCORE_Kestrel__Certificates__Default__Password + valueFrom: + secretKeyRef: + name: cert-password + key: CERT_PASSWORD + ports: + - containerPort: 8080 + name: grpc + - containerPort: 8081 + name: https + livenessProbe: + grpc: + port: 8080 + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 5 + readinessProbe: + grpc: + port: 8080 + initialDelaySeconds: 15 + periodSeconds: 5 + failureThreshold: 3 + resources: + requests: + cpu: 100m + memory: 128Mi + limits: + cpu: 300m + memory: 256Mi + volumeMounts: + - name: certs + mountPath: /app/certificates + readOnly: true + - name: sqlite-data + mountPath: /app/data + volumes: + - name: certs + projected: + sources: + - secret: + name: cert-discount-grpc + - configMap: + name: cert-ca + - name: sqlite-data + emptyDir: {} diff --git a/k8s/base/04-services/discount-grpc/service.yaml b/k8s/base/04-services/discount-grpc/service.yaml new file mode 100644 index 0000000..9a116f8 --- /dev/null +++ b/k8s/base/04-services/discount-grpc/service.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + name: discount-grpc + namespace: eshop-microservices +spec: + selector: + app: discount-grpc + ports: + - port: 8080 + targetPort: 8080 + name: grpc + appProtocol: kubernetes.io/h2c + - port: 8081 + targetPort: 8081 + name: https diff --git a/k8s/base/04-services/identity-api/deployment.yaml b/k8s/base/04-services/identity-api/deployment.yaml new file mode 100644 index 0000000..eeeb2f5 --- /dev/null +++ b/k8s/base/04-services/identity-api/deployment.yaml @@ -0,0 +1,93 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: identity-api + namespace: eshop-microservices +spec: + replicas: 1 + selector: + matchLabels: + app: identity-api + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + template: + metadata: + labels: + app: identity-api + spec: + serviceAccountName: sa-identity-api + initContainers: + - name: wait-for-db + image: busybox:1.36 + command: ['sh', '-c', 'until nc -z identity-db 5432; do echo waiting for identity-db; sleep 2; done'] + containers: + - name: identity-api + image: identity.api:latest + imagePullPolicy: IfNotPresent + envFrom: + - configMapRef: + name: identity-api-cm + env: + - name: DB_USER + valueFrom: + secretKeyRef: + name: identity-db-secret + key: POSTGRES_USER + - name: DB_PASSWORD + valueFrom: + secretKeyRef: + name: identity-db-secret + key: POSTGRES_PASSWORD + - name: ConnectionStrings__IdentityDB + value: "Host=identity-db;Port=5432;Database=IdentityDb;User Id=$(DB_USER);Password=$(DB_PASSWORD)" + - name: EmailService__authentication_key + valueFrom: + secretKeyRef: + name: identity-secret + key: EmailService__authentication_key + - name: ASPNETCORE_Kestrel__Certificates__Default__Password + valueFrom: + secretKeyRef: + name: cert-password + key: CERT_PASSWORD + ports: + - containerPort: 8080 + name: http + - containerPort: 8081 + name: https + livenessProbe: + httpGet: + path: /hc + port: 8080 + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 5 + readinessProbe: + httpGet: + path: /hc + port: 8080 + initialDelaySeconds: 15 + periodSeconds: 5 + failureThreshold: 3 + resources: + requests: + cpu: 100m + memory: 256Mi + limits: + cpu: 500m + memory: 512Mi + volumeMounts: + - name: certs + mountPath: /app/certificates + readOnly: true + volumes: + - name: certs + projected: + sources: + - secret: + name: cert-identity-api + - configMap: + name: cert-ca diff --git a/k8s/base/04-services/identity-api/hpa.yaml b/k8s/base/04-services/identity-api/hpa.yaml new file mode 100644 index 0000000..7f277e3 --- /dev/null +++ b/k8s/base/04-services/identity-api/hpa.yaml @@ -0,0 +1,19 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: identity-api-hpa + namespace: eshop-microservices +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: identity-api + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 70 diff --git a/k8s/base/04-services/identity-api/service.yaml b/k8s/base/04-services/identity-api/service.yaml new file mode 100644 index 0000000..f84b6c3 --- /dev/null +++ b/k8s/base/04-services/identity-api/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: identity-api + namespace: eshop-microservices +spec: + selector: + app: identity-api + ports: + - port: 8080 + targetPort: 8080 + name: http + - port: 8081 + targetPort: 8081 + name: https diff --git a/k8s/base/04-services/kustomization.yaml b/k8s/base/04-services/kustomization.yaml new file mode 100644 index 0000000..483c4e8 --- /dev/null +++ b/k8s/base/04-services/kustomization.yaml @@ -0,0 +1,30 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +namespace: eshop-microservices + +resources: + - catalog-api/deployment.yaml + - catalog-api/service.yaml + - catalog-api/hpa.yaml + - basket-api/deployment.yaml + - basket-api/service.yaml + - basket-api/hpa.yaml + - discount-grpc/deployment.yaml + - discount-grpc/service.yaml + - identity-api/deployment.yaml + - identity-api/service.yaml + - identity-api/hpa.yaml + - order-command-api/deployment.yaml + - order-command-api/service.yaml + - order-command-api/hpa.yaml + - order-query-api/deployment.yaml + - order-query-api/service.yaml + - order-query-api/hpa.yaml + - order-query-eventprocessor/deployment.yaml + - order-query-eventprocessor/service.yaml + - api-gateway/deployment.yaml + - api-gateway/service.yaml + - api-gateway/hpa.yaml + - network-policies.yaml + - pod-disruption-budgets.yaml diff --git a/k8s/base/04-services/network-policies.yaml b/k8s/base/04-services/network-policies.yaml new file mode 100644 index 0000000..81a2d68 --- /dev/null +++ b/k8s/base/04-services/network-policies.yaml @@ -0,0 +1,617 @@ +# Default deny-all ingress in namespace +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: default-deny-ingress + namespace: eshop-microservices +spec: + podSelector: {} + policyTypes: + - Ingress +--- +# Default deny-all egress in namespace +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: default-deny-egress + namespace: eshop-microservices +spec: + podSelector: {} + policyTypes: + - Egress +--- +# Allow DNS resolution for all pods (required for service discovery) +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: allow-dns-egress + namespace: eshop-microservices +spec: + podSelector: {} + policyTypes: + - Egress + egress: + - ports: + - port: 53 + protocol: UDP + - port: 53 + protocol: TCP +--- +# catalog-api +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: netpol-catalog-api + namespace: eshop-microservices +spec: + podSelector: + matchLabels: + app: catalog-api + policyTypes: + - Ingress + - Egress + ingress: + - from: + - podSelector: + matchLabels: + app: api-gateway + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: ingress-nginx + egress: + - to: + - podSelector: + matchLabels: + app: catalog-db + ports: + - port: 5432 + - to: + - podSelector: + matchLabels: + app: elasticsearch + ports: + - port: 9200 + - to: + - podSelector: + matchLabels: + app: otel-collector + ports: + - port: 4317 + - port: 4318 + - to: + - podSelector: + matchLabels: + app: identity-api + ports: + - port: 8081 +--- +# basket-api +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: netpol-basket-api + namespace: eshop-microservices +spec: + podSelector: + matchLabels: + app: basket-api + policyTypes: + - Ingress + - Egress + ingress: + - from: + - podSelector: + matchLabels: + app: api-gateway + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: ingress-nginx + egress: + - to: + - podSelector: + matchLabels: + app: basket-db + ports: + - port: 5432 + - to: + - podSelector: + matchLabels: + app: redis + ports: + - port: 6379 + - to: + - podSelector: + matchLabels: + app: discount-grpc + ports: + - port: 8080 + - to: + - podSelector: + matchLabels: + app: order-command-api + ports: + - port: 8080 + - to: + - podSelector: + matchLabels: + app: otel-collector + ports: + - port: 4317 + - port: 4318 + - to: + - podSelector: + matchLabels: + app: identity-api + ports: + - port: 8081 +--- +# discount-grpc +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: netpol-discount-grpc + namespace: eshop-microservices +spec: + podSelector: + matchLabels: + app: discount-grpc + policyTypes: + - Ingress + - Egress + ingress: + - from: + - podSelector: + matchLabels: + app: basket-api + ports: + - port: 8080 + - from: + - podSelector: + matchLabels: + app: api-gateway + ports: + - port: 8081 + egress: + - to: + - podSelector: + matchLabels: + app: otel-collector + ports: + - port: 4317 + - port: 4318 +--- +# identity-api — allow all pods to reach it (for JWT validation) +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: netpol-identity-api + namespace: eshop-microservices +spec: + podSelector: + matchLabels: + app: identity-api + policyTypes: + - Ingress + - Egress + ingress: + - from: + - podSelector: {} + ports: + - port: 8081 + - from: + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: ingress-nginx + egress: + - to: + - podSelector: + matchLabels: + app: identity-db + ports: + - port: 5432 + - to: + - podSelector: + matchLabels: + app: mailpit + ports: + - port: 1025 + - to: + - podSelector: + matchLabels: + app: otel-collector + ports: + - port: 4317 + - port: 4318 +--- +# order-command-api +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: netpol-order-command-api + namespace: eshop-microservices +spec: + podSelector: + matchLabels: + app: order-command-api + policyTypes: + - Ingress + - Egress + ingress: + - from: + - podSelector: + matchLabels: + app: api-gateway + - podSelector: + matchLabels: + app: basket-api + egress: + - to: + - podSelector: + matchLabels: + app: order-command-db + ports: + - port: 5432 + - to: + - podSelector: + matchLabels: + app: rabbitmq + ports: + - port: 5672 + - to: + - podSelector: + matchLabels: + app: otel-collector + ports: + - port: 4317 + - port: 4318 + - to: + - podSelector: + matchLabels: + app: identity-api + ports: + - port: 8081 +--- +# order-query-api +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: netpol-order-query-api + namespace: eshop-microservices +spec: + podSelector: + matchLabels: + app: order-query-api + policyTypes: + - Ingress + - Egress + ingress: + - from: + - podSelector: + matchLabels: + app: api-gateway + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: ingress-nginx + egress: + - to: + - podSelector: + matchLabels: + app: order-query-db + ports: + - port: 5432 + - to: + - podSelector: + matchLabels: + app: otel-collector + ports: + - port: 4317 + - port: 4318 + - to: + - podSelector: + matchLabels: + app: identity-api + ports: + - port: 8081 +--- +# order-query-eventprocessor (background worker, no ingress) +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: netpol-order-query-eventprocessor + namespace: eshop-microservices +spec: + podSelector: + matchLabels: + app: order-query-eventprocessor + policyTypes: + - Ingress + - Egress + ingress: [] + egress: + - to: + - podSelector: + matchLabels: + app: order-query-db + ports: + - port: 5432 + - to: + - podSelector: + matchLabels: + app: rabbitmq + ports: + - port: 5672 + - to: + - podSelector: + matchLabels: + app: otel-collector + ports: + - port: 4317 + - port: 4318 +--- +# api-gateway +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: netpol-api-gateway + namespace: eshop-microservices +spec: + podSelector: + matchLabels: + app: api-gateway + policyTypes: + - Ingress + - Egress + ingress: + - from: + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: ingress-nginx + egress: + - to: + - podSelector: + matchLabels: + app: catalog-api + ports: + - port: 8081 + - to: + - podSelector: + matchLabels: + app: basket-api + ports: + - port: 8081 + - to: + - podSelector: + matchLabels: + app: discount-grpc + ports: + - port: 8081 + - to: + - podSelector: + matchLabels: + app: order-command-api + ports: + - port: 8081 + - to: + - podSelector: + matchLabels: + app: order-query-api + ports: + - port: 8081 + - to: + - podSelector: + matchLabels: + app: identity-api + ports: + - port: 8081 + - to: + - podSelector: + matchLabels: + app: otel-collector + ports: + - port: 4317 + - port: 4318 +--- +# Database policies +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: netpol-catalog-db + namespace: eshop-microservices +spec: + podSelector: + matchLabels: + app: catalog-db + policyTypes: + - Ingress + ingress: + - from: + - podSelector: + matchLabels: + app: catalog-api + ports: + - port: 5432 +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: netpol-basket-db + namespace: eshop-microservices +spec: + podSelector: + matchLabels: + app: basket-db + policyTypes: + - Ingress + ingress: + - from: + - podSelector: + matchLabels: + app: basket-api + ports: + - port: 5432 +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: netpol-identity-db + namespace: eshop-microservices +spec: + podSelector: + matchLabels: + app: identity-db + policyTypes: + - Ingress + ingress: + - from: + - podSelector: + matchLabels: + app: identity-api + ports: + - port: 5432 +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: netpol-order-command-db + namespace: eshop-microservices +spec: + podSelector: + matchLabels: + app: order-command-db + policyTypes: + - Ingress + ingress: + - from: + - podSelector: + matchLabels: + app: order-command-api + ports: + - port: 5432 +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: netpol-order-query-db + namespace: eshop-microservices +spec: + podSelector: + matchLabels: + app: order-query-db + policyTypes: + - Ingress + ingress: + - from: + - podSelector: + matchLabels: + app: order-query-api + - podSelector: + matchLabels: + app: order-query-eventprocessor + ports: + - port: 5432 +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: netpol-redis + namespace: eshop-microservices +spec: + podSelector: + matchLabels: + app: redis + policyTypes: + - Ingress + ingress: + - from: + - podSelector: + matchLabels: + app: basket-api + ports: + - port: 6379 +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: netpol-rabbitmq + namespace: eshop-microservices +spec: + podSelector: + matchLabels: + app: rabbitmq + policyTypes: + - Ingress + ingress: + - from: + - podSelector: + matchLabels: + app: order-command-api + - podSelector: + matchLabels: + app: order-query-eventprocessor + ports: + - port: 5672 +--- +# OTEL Collector +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: netpol-otel-collector + namespace: eshop-microservices +spec: + podSelector: + matchLabels: + app: otel-collector + policyTypes: + - Ingress + - Egress + ingress: + - from: + - podSelector: {} + ports: + - port: 4317 + - port: 4318 + - from: + - podSelector: + matchLabels: + app: prometheus + ports: + - port: 8889 + egress: + - to: + - podSelector: + matchLabels: + app: jaeger + ports: + - port: 4317 + - to: + - podSelector: + matchLabels: + app: loki + ports: + - port: 3100 + - to: + - podSelector: + matchLabels: + app: prometheus + ports: + - port: 9090 +--- +# Observability UIs — allow ingress from ingress-nginx +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: netpol-observability-uis + namespace: eshop-microservices +spec: + podSelector: + matchExpressions: + - key: app + operator: In + values: [kibana, jaeger, grafana, prometheus, mailpit] + policyTypes: + - Ingress + ingress: + - from: + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: ingress-nginx diff --git a/k8s/base/04-services/order-command-api/deployment.yaml b/k8s/base/04-services/order-command-api/deployment.yaml new file mode 100644 index 0000000..c2f77eb --- /dev/null +++ b/k8s/base/04-services/order-command-api/deployment.yaml @@ -0,0 +1,101 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: order-command-api + namespace: eshop-microservices +spec: + replicas: 1 + selector: + matchLabels: + app: order-command-api + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + template: + metadata: + labels: + app: order-command-api + spec: + serviceAccountName: sa-order-command-api + initContainers: + - name: wait-for-db + image: busybox:1.36 + command: ['sh', '-c', 'until nc -z order-command-db 5432; do echo waiting for order-command-db; sleep 2; done'] + - name: wait-for-rabbitmq + image: busybox:1.36 + command: ['sh', '-c', 'until nc -z rabbitmq 5672; do echo waiting for rabbitmq; sleep 2; done'] + containers: + - name: order-command-api + image: order.command.api:latest + imagePullPolicy: IfNotPresent + envFrom: + - configMapRef: + name: order-command-api-cm + env: + - name: DB_USER + valueFrom: + secretKeyRef: + name: order-command-db-secret + key: POSTGRES_USER + - name: DB_PASSWORD + valueFrom: + secretKeyRef: + name: order-command-db-secret + key: POSTGRES_PASSWORD + - name: ConnectionStrings__Database + value: "Server=order-command-db;Database=OrderCommandDb;User Id=$(DB_USER);Password=$(DB_PASSWORD)" + - name: RabbitMQ__Username + valueFrom: + secretKeyRef: + name: rabbitmq-secret + key: RABBITMQ_USERNAME + - name: RabbitMQ__Password + valueFrom: + secretKeyRef: + name: rabbitmq-secret + key: RABBITMQ_PASSWORD + - name: ASPNETCORE_Kestrel__Certificates__Default__Password + valueFrom: + secretKeyRef: + name: cert-password + key: CERT_PASSWORD + ports: + - containerPort: 8080 + name: http + - containerPort: 8081 + name: https + livenessProbe: + httpGet: + path: /hc + port: 8080 + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 5 + readinessProbe: + httpGet: + path: /hc + port: 8080 + initialDelaySeconds: 15 + periodSeconds: 5 + failureThreshold: 3 + resources: + requests: + cpu: 100m + memory: 128Mi + limits: + cpu: 500m + memory: 512Mi + volumeMounts: + - name: certs + mountPath: /app/certificates + readOnly: true + volumes: + - name: certs + projected: + sources: + - secret: + name: cert-order-command-api + - configMap: + name: cert-ca diff --git a/k8s/base/04-services/order-command-api/hpa.yaml b/k8s/base/04-services/order-command-api/hpa.yaml new file mode 100644 index 0000000..e0e0390 --- /dev/null +++ b/k8s/base/04-services/order-command-api/hpa.yaml @@ -0,0 +1,19 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: order-command-api-hpa + namespace: eshop-microservices +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: order-command-api + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 70 diff --git a/k8s/base/04-services/order-command-api/service.yaml b/k8s/base/04-services/order-command-api/service.yaml new file mode 100644 index 0000000..543baf8 --- /dev/null +++ b/k8s/base/04-services/order-command-api/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: order-command-api + namespace: eshop-microservices +spec: + selector: + app: order-command-api + ports: + - port: 8080 + targetPort: 8080 + name: http + - port: 8081 + targetPort: 8081 + name: https diff --git a/k8s/base/04-services/order-query-api/deployment.yaml b/k8s/base/04-services/order-query-api/deployment.yaml new file mode 100644 index 0000000..a9dbc9d --- /dev/null +++ b/k8s/base/04-services/order-query-api/deployment.yaml @@ -0,0 +1,88 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: order-query-api + namespace: eshop-microservices +spec: + replicas: 1 + selector: + matchLabels: + app: order-query-api + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + template: + metadata: + labels: + app: order-query-api + spec: + serviceAccountName: sa-order-query-api + initContainers: + - name: wait-for-db + image: busybox:1.36 + command: ['sh', '-c', 'until nc -z order-query-db 5432; do echo waiting for order-query-db; sleep 2; done'] + containers: + - name: order-query-api + image: order.query.api:latest + imagePullPolicy: IfNotPresent + envFrom: + - configMapRef: + name: order-query-api-cm + env: + - name: DB_USER + valueFrom: + secretKeyRef: + name: order-query-db-secret + key: POSTGRES_USER + - name: DB_PASSWORD + valueFrom: + secretKeyRef: + name: order-query-db-secret + key: POSTGRES_PASSWORD + - name: ConnectionStrings__Database + value: "Host=order-query-db;Port=5432;Database=OrderQueryDb;User Id=$(DB_USER);Password=$(DB_PASSWORD)" + - name: ASPNETCORE_Kestrel__Certificates__Default__Password + valueFrom: + secretKeyRef: + name: cert-password + key: CERT_PASSWORD + ports: + - containerPort: 8080 + name: http + - containerPort: 8081 + name: https + livenessProbe: + httpGet: + path: /hc + port: 8080 + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 5 + readinessProbe: + httpGet: + path: /hc + port: 8080 + initialDelaySeconds: 15 + periodSeconds: 5 + failureThreshold: 3 + resources: + requests: + cpu: 100m + memory: 128Mi + limits: + cpu: 500m + memory: 512Mi + volumeMounts: + - name: certs + mountPath: /app/certificates + readOnly: true + volumes: + - name: certs + projected: + sources: + - secret: + name: cert-order-query-api + - configMap: + name: cert-ca diff --git a/k8s/base/04-services/order-query-api/hpa.yaml b/k8s/base/04-services/order-query-api/hpa.yaml new file mode 100644 index 0000000..6422a42 --- /dev/null +++ b/k8s/base/04-services/order-query-api/hpa.yaml @@ -0,0 +1,19 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: order-query-api-hpa + namespace: eshop-microservices +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: order-query-api + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 70 diff --git a/k8s/base/04-services/order-query-api/service.yaml b/k8s/base/04-services/order-query-api/service.yaml new file mode 100644 index 0000000..13bd7b3 --- /dev/null +++ b/k8s/base/04-services/order-query-api/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: order-query-api + namespace: eshop-microservices +spec: + selector: + app: order-query-api + ports: + - port: 8080 + targetPort: 8080 + name: http + - port: 8081 + targetPort: 8081 + name: https diff --git a/k8s/base/04-services/order-query-eventprocessor/deployment.yaml b/k8s/base/04-services/order-query-eventprocessor/deployment.yaml new file mode 100644 index 0000000..aa278ce --- /dev/null +++ b/k8s/base/04-services/order-query-eventprocessor/deployment.yaml @@ -0,0 +1,101 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: order-query-eventprocessor + namespace: eshop-microservices +spec: + replicas: 1 + selector: + matchLabels: + app: order-query-eventprocessor + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + template: + metadata: + labels: + app: order-query-eventprocessor + spec: + serviceAccountName: sa-order-query-eventprocessor + initContainers: + - name: wait-for-db + image: busybox:1.36 + command: ['sh', '-c', 'until nc -z order-query-db 5432; do echo waiting for order-query-db; sleep 2; done'] + - name: wait-for-rabbitmq + image: busybox:1.36 + command: ['sh', '-c', 'until nc -z rabbitmq 5672; do echo waiting for rabbitmq; sleep 2; done'] + containers: + - name: order-query-eventprocessor + image: order.query.eventprocessor:latest + imagePullPolicy: IfNotPresent + envFrom: + - configMapRef: + name: order-query-eventprocessor-cm + env: + - name: DB_USER + valueFrom: + secretKeyRef: + name: order-query-db-secret + key: POSTGRES_USER + - name: DB_PASSWORD + valueFrom: + secretKeyRef: + name: order-query-db-secret + key: POSTGRES_PASSWORD + - name: ConnectionStrings__Database + value: "Host=order-query-db;Port=5432;Database=OrderQueryDb;User Id=$(DB_USER);Password=$(DB_PASSWORD)" + - name: RabbitMQ__Username + valueFrom: + secretKeyRef: + name: rabbitmq-secret + key: RABBITMQ_USERNAME + - name: RabbitMQ__Password + valueFrom: + secretKeyRef: + name: rabbitmq-secret + key: RABBITMQ_PASSWORD + - name: ASPNETCORE_Kestrel__Certificates__Default__Password + valueFrom: + secretKeyRef: + name: cert-password + key: CERT_PASSWORD + ports: + - containerPort: 8080 + name: http + - containerPort: 8081 + name: https + livenessProbe: + httpGet: + path: /hc + port: 8080 + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 5 + readinessProbe: + httpGet: + path: /hc + port: 8080 + initialDelaySeconds: 15 + periodSeconds: 5 + failureThreshold: 3 + resources: + requests: + cpu: 100m + memory: 256Mi + limits: + cpu: 300m + memory: 512Mi + volumeMounts: + - name: certs + mountPath: /app/certificates + readOnly: true + volumes: + - name: certs + projected: + sources: + - secret: + name: cert-order-query-eventprocessor + - configMap: + name: cert-ca diff --git a/k8s/base/04-services/order-query-eventprocessor/service.yaml b/k8s/base/04-services/order-query-eventprocessor/service.yaml new file mode 100644 index 0000000..67f6d12 --- /dev/null +++ b/k8s/base/04-services/order-query-eventprocessor/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: order-query-eventprocessor + namespace: eshop-microservices +spec: + selector: + app: order-query-eventprocessor + ports: + - port: 8080 + targetPort: 8080 + name: http + - port: 8081 + targetPort: 8081 + name: https diff --git a/k8s/base/04-services/pod-disruption-budgets.yaml b/k8s/base/04-services/pod-disruption-budgets.yaml new file mode 100644 index 0000000..5f9b2d9 --- /dev/null +++ b/k8s/base/04-services/pod-disruption-budgets.yaml @@ -0,0 +1,175 @@ +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: pdb-catalog-api + namespace: eshop-microservices +spec: + minAvailable: 1 + selector: + matchLabels: + app: catalog-api +--- +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: pdb-basket-api + namespace: eshop-microservices +spec: + minAvailable: 1 + selector: + matchLabels: + app: basket-api +--- +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: pdb-discount-grpc + namespace: eshop-microservices +spec: + minAvailable: 1 + selector: + matchLabels: + app: discount-grpc +--- +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: pdb-identity-api + namespace: eshop-microservices +spec: + minAvailable: 1 + selector: + matchLabels: + app: identity-api +--- +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: pdb-order-command-api + namespace: eshop-microservices +spec: + minAvailable: 1 + selector: + matchLabels: + app: order-command-api +--- +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: pdb-order-query-api + namespace: eshop-microservices +spec: + minAvailable: 1 + selector: + matchLabels: + app: order-query-api +--- +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: pdb-order-query-eventprocessor + namespace: eshop-microservices +spec: + minAvailable: 1 + selector: + matchLabels: + app: order-query-eventprocessor +--- +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: pdb-api-gateway + namespace: eshop-microservices +spec: + minAvailable: 1 + selector: + matchLabels: + app: api-gateway +--- +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: pdb-catalog-db + namespace: eshop-microservices +spec: + minAvailable: 1 + selector: + matchLabels: + app: catalog-db +--- +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: pdb-basket-db + namespace: eshop-microservices +spec: + minAvailable: 1 + selector: + matchLabels: + app: basket-db +--- +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: pdb-identity-db + namespace: eshop-microservices +spec: + minAvailable: 1 + selector: + matchLabels: + app: identity-db +--- +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: pdb-order-command-db + namespace: eshop-microservices +spec: + minAvailable: 1 + selector: + matchLabels: + app: order-command-db +--- +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: pdb-order-query-db + namespace: eshop-microservices +spec: + minAvailable: 1 + selector: + matchLabels: + app: order-query-db +--- +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: pdb-redis + namespace: eshop-microservices +spec: + minAvailable: 1 + selector: + matchLabels: + app: redis +--- +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: pdb-rabbitmq + namespace: eshop-microservices +spec: + minAvailable: 1 + selector: + matchLabels: + app: rabbitmq +--- +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: pdb-elasticsearch + namespace: eshop-microservices +spec: + minAvailable: 1 + selector: + matchLabels: + app: elasticsearch diff --git a/k8s/base/05-ingress/ingress.yaml b/k8s/base/05-ingress/ingress.yaml new file mode 100644 index 0000000..e777e02 --- /dev/null +++ b/k8s/base/05-ingress/ingress.yaml @@ -0,0 +1,197 @@ +# api-gateway — HTTPS backend +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: ingress-api-gateway + namespace: eshop-microservices + annotations: + nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" + nginx.ingress.kubernetes.io/proxy-ssl-verify: "false" +spec: + ingressClassName: nginx + tls: + - hosts: + - api.eshop.local + secretName: ingress-tls + rules: + - host: api.eshop.local + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: api-gateway + port: + number: 8081 +--- +# identity-api — HTTPS backend +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: ingress-identity-api + namespace: eshop-microservices + annotations: + nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" + nginx.ingress.kubernetes.io/proxy-ssl-verify: "false" +spec: + ingressClassName: nginx + tls: + - hosts: + - identity.eshop.local + secretName: ingress-tls + rules: + - host: identity.eshop.local + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: identity-api + port: + number: 8081 +--- +# mailpit UI +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: ingress-mailpit + namespace: eshop-microservices +spec: + ingressClassName: nginx + tls: + - hosts: + - mailpit.eshop.local + secretName: ingress-tls + rules: + - host: mailpit.eshop.local + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: mailpit + port: + number: 8025 +--- +# kibana +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: ingress-kibana + namespace: eshop-microservices +spec: + ingressClassName: nginx + tls: + - hosts: + - kibana.eshop.local + secretName: ingress-tls + rules: + - host: kibana.eshop.local + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: kibana + port: + number: 5601 +--- +# jaeger UI +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: ingress-jaeger + namespace: eshop-microservices +spec: + ingressClassName: nginx + tls: + - hosts: + - jaeger.eshop.local + secretName: ingress-tls + rules: + - host: jaeger.eshop.local + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: jaeger + port: + number: 16686 +--- +# grafana +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: ingress-grafana + namespace: eshop-microservices +spec: + ingressClassName: nginx + tls: + - hosts: + - grafana.eshop.local + secretName: ingress-tls + rules: + - host: grafana.eshop.local + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: grafana + port: + number: 3000 +--- +# prometheus +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: ingress-prometheus + namespace: eshop-microservices +spec: + ingressClassName: nginx + tls: + - hosts: + - prometheus.eshop.local + secretName: ingress-tls + rules: + - host: prometheus.eshop.local + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: prometheus + port: + number: 9090 +--- +# rabbitmq management UI +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: ingress-rabbitmq + namespace: eshop-microservices +spec: + ingressClassName: nginx + tls: + - hosts: + - rabbitmq.eshop.local + secretName: ingress-tls + rules: + - host: rabbitmq.eshop.local + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: rabbitmq + port: + number: 15672 diff --git a/k8s/base/05-ingress/kustomization.yaml b/k8s/base/05-ingress/kustomization.yaml new file mode 100644 index 0000000..7879232 --- /dev/null +++ b/k8s/base/05-ingress/kustomization.yaml @@ -0,0 +1,7 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +namespace: eshop-microservices + +resources: + - ingress.yaml diff --git a/k8s/base/kustomization.yaml b/k8s/base/kustomization.yaml new file mode 100644 index 0000000..f13d7aa --- /dev/null +++ b/k8s/base/kustomization.yaml @@ -0,0 +1,10 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +resources: + - 00-core + - 01-databases + - 02-observability + - 03-mail + - 04-services + - 05-ingress diff --git a/k8s/overlays/local/kustomization.yaml b/k8s/overlays/local/kustomization.yaml new file mode 100644 index 0000000..fc0fbf9 --- /dev/null +++ b/k8s/overlays/local/kustomization.yaml @@ -0,0 +1,49 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +resources: + - ../../base + +patches: + - path: patches/resource-limits-patch.yaml + target: + kind: StatefulSet + name: elasticsearch + - patch: |- + - op: replace + path: /spec/volumeClaimTemplates/0/spec/storageClassName + value: local-path + target: + kind: StatefulSet + - patch: |- + - op: replace + path: /spec/storageClassName + value: local-path + target: + kind: PersistentVolumeClaim + +images: + - name: catalog.api + newName: catalog.api + newTag: latest + - name: basket.api + newName: basket.api + newTag: latest + - name: discount.grpc + newName: discount.grpc + newTag: latest + - name: identity.api + newName: identity.api + newTag: latest + - name: order.command.api + newName: order.command.api + newTag: latest + - name: order.query.api + newName: order.query.api + newTag: latest + - name: order.query.eventprocessor + newName: order.query.eventprocessor + newTag: latest + - name: api.gateway + newName: api.gateway + newTag: latest diff --git a/k8s/overlays/local/patches/resource-limits-patch.yaml b/k8s/overlays/local/patches/resource-limits-patch.yaml new file mode 100644 index 0000000..79c7c02 --- /dev/null +++ b/k8s/overlays/local/patches/resource-limits-patch.yaml @@ -0,0 +1,29 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: elasticsearch + namespace: eshop-microservices +spec: + template: + spec: + containers: + - name: elasticsearch + env: + - name: ES_JAVA_OPTS + value: "-Xms256m -Xmx256m" + resources: + requests: + cpu: 200m + memory: 512Mi + limits: + cpu: 500m + memory: 1Gi + volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: [ReadWriteOnce] + storageClassName: local-path + resources: + requests: + storage: 2Gi diff --git a/k8s/overlays/local/patches/single-replica-patch.yaml b/k8s/overlays/local/patches/single-replica-patch.yaml new file mode 100644 index 0000000..b485eca --- /dev/null +++ b/k8s/overlays/local/patches/single-replica-patch.yaml @@ -0,0 +1,9 @@ +# All StatefulSets are already set to replicas: 1 in base manifests, suitable for local dev. +# This file is a placeholder. For production overlay, patch replicas here to 2+ with proper HA. +# For now, local single-replica is the correct configuration. +# apiVersion: apps/v1 +# kind: StatefulSet +# metadata: +# name: -db +# spec: +# replicas: 2 # production example diff --git a/k8s/overlays/local/patches/storage-class-patch.yaml b/k8s/overlays/local/patches/storage-class-patch.yaml new file mode 100644 index 0000000..241109e --- /dev/null +++ b/k8s/overlays/local/patches/storage-class-patch.yaml @@ -0,0 +1,12 @@ +# Storage class is already set to 'standard' in base manifests, which works for minikube/kind/Docker Desktop. +# This file is a placeholder. For production overlay, patch storageClassName here: +# apiVersion: apps/v1 +# kind: StatefulSet +# metadata: +# name: -db +# spec: +# volumeClaimTemplates: +# - metadata: +# name: data +# spec: +# storageClassName: pd-ssd # GKE example diff --git a/k8s/overlays/production/kustomization.yaml b/k8s/overlays/production/kustomization.yaml new file mode 100644 index 0000000..1556610 --- /dev/null +++ b/k8s/overlays/production/kustomization.yaml @@ -0,0 +1,12 @@ +# Production overlay — placeholder only. Implement when targeting a cloud cluster. +# This overlay should patch: +# - storageClassName: pd-ssd (GKE) / gp3 (EKS) / managed-premium (AKS) +# - replicas: 2+ for microservices +# - resource limits: larger CPU/memory allocations +# - image tags: pinned SHAs instead of :latest +# - TLS: cert-manager ClusterIssuer (Let's Encrypt or internal CA) +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +resources: + - ../../base diff --git a/k8s/scripts/apply.sh b/k8s/scripts/apply.sh new file mode 100755 index 0000000..7efe074 --- /dev/null +++ b/k8s/scripts/apply.sh @@ -0,0 +1,37 @@ +#!/bin/bash +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +K8S_DIR="${SCRIPT_DIR}/.." +NAMESPACE="eshop-microservices" +OVERLAY="${1:-local}" + +echo "=== EshopMicroservices K8s Deployment ===" +echo "Overlay: $OVERLAY" +echo "" + +if ! kubectl cluster-info &>/dev/null; then + echo "ERROR: kubectl is not connected to a cluster." + echo "For minikube: minikube start" + echo "For Docker Desktop: enable Kubernetes in Docker Desktop settings" + exit 1 +fi + +echo "=== Ensuring namespace exists ===" +kubectl apply -f "${K8S_DIR}/base/00-core/namespace.yaml" +echo "" + +if ! kubectl get secret cert-catalog-api -n "$NAMESPACE" &>/dev/null; then + echo "Cert secrets not found. Running create-cert-secrets.sh..." + echo "" + bash "${SCRIPT_DIR}/create-cert-secrets.sh" + echo "" +fi + +echo "=== Applying overlay: $OVERLAY ===" +kubectl apply -k "${K8S_DIR}/overlays/${OVERLAY}" + +echo "" +echo "=== Deployment complete ===" +echo "Watch rollout: kubectl get pods -n $NAMESPACE -w" +echo "Check status: kubectl get all -n $NAMESPACE" diff --git a/k8s/scripts/create-cert-secrets.sh b/k8s/scripts/create-cert-secrets.sh new file mode 100755 index 0000000..4626883 --- /dev/null +++ b/k8s/scripts/create-cert-secrets.sh @@ -0,0 +1,74 @@ +#!/bin/bash +set -e + +NAMESPACE="eshop-microservices" +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +CERTS_DIR="${SCRIPT_DIR}/../base/00-core/certs" + +if [ ! -d "$CERTS_DIR" ]; then + echo "ERROR: $CERTS_DIR not found." + echo "Run: mkdir -p k8s/base/00-core/certs && cd src/certificates && ./generate-certs.sh" + exit 1 +fi + +check_cert() { + local file="$CERTS_DIR/$1" + if [ ! -f "$file" ]; then + echo "ERROR: Missing cert file: $file" + echo "Run: cd src/certificates && ./generate-certs.sh" + exit 1 + fi +} + +check_cert "catalog.pfx" +check_cert "basket.pfx" +check_cert "discount.pfx" +check_cert "identity.pfx" +check_cert "order-command-api.pfx" +check_cert "order-query-event-api.pfx" +check_cert "order-query-event-processor.pfx" +check_cert "api-gateway.pfx" +check_cert "ca.crt" +check_cert "eshop-local.crt" +check_cert "eshop-local.key" + +echo "=== Creating cert Secrets in namespace: $NAMESPACE ===" + +create_cert_secret() { + local SECRET_NAME="$1" + local PFX_KEY="$2" + local PFX_FILE="$CERTS_DIR/$3" + + kubectl create secret generic "$SECRET_NAME" \ + --from-file="${PFX_KEY}=${PFX_FILE}" \ + --namespace="$NAMESPACE" \ + --dry-run=client -o yaml | kubectl apply -f - + echo " ✓ $SECRET_NAME" +} + +create_cert_secret "cert-catalog-api" "catalog.pfx" "catalog.pfx" +create_cert_secret "cert-basket-api" "basket.pfx" "basket.pfx" +create_cert_secret "cert-discount-grpc" "discount.pfx" "discount.pfx" +create_cert_secret "cert-identity-api" "identity.pfx" "identity.pfx" +create_cert_secret "cert-order-command-api" "order-command-api.pfx" "order-command-api.pfx" +create_cert_secret "cert-order-query-api" "order-query-event-api.pfx" "order-query-event-api.pfx" +create_cert_secret "cert-order-query-eventprocessor" "order-query-event-processor.pfx" "order-query-event-processor.pfx" +create_cert_secret "cert-api-gateway" "api-gateway.pfx" "api-gateway.pfx" + +echo "=== Creating ingress TLS secret ===" +kubectl create secret tls ingress-tls \ + --cert="${CERTS_DIR}/eshop-local.crt" \ + --key="${CERTS_DIR}/eshop-local.key" \ + --namespace="$NAMESPACE" \ + --dry-run=client -o yaml | kubectl apply -f - +echo " ✓ ingress-tls" + +echo "=== Creating CA ConfigMap ===" +kubectl create configmap cert-ca \ + --from-file="ca.crt=${CERTS_DIR}/ca.crt" \ + --namespace="$NAMESPACE" \ + --dry-run=client -o yaml | kubectl apply -f - +echo " ✓ cert-ca (ConfigMap)" + +echo "" +echo "=== All cert secrets created successfully ===" diff --git a/k8s/scripts/hosts-setup.sh b/k8s/scripts/hosts-setup.sh new file mode 100755 index 0000000..70d9bbe --- /dev/null +++ b/k8s/scripts/hosts-setup.sh @@ -0,0 +1,42 @@ +#!/bin/bash +# Prints /etc/hosts entries needed for *.eshop.local ingress rules. + +detect_ip() { + if command -v minikube &>/dev/null && minikube status &>/dev/null 2>&1; then + minikube ip + return + fi + + # Docker Desktop maps the ingress LoadBalancer to localhost — its internal VM IP + # (198.19.249.x) is not routable from Electron-based apps like Postman. + local KUBE_CONTEXT + KUBE_CONTEXT=$(kubectl config current-context 2>/dev/null) + if [ "$KUBE_CONTEXT" = "docker-desktop" ]; then + echo "127.0.0.1" + return + fi + + local LB_IP + LB_IP=$(kubectl get svc ingress-nginx-controller -n ingress-nginx \ + -o jsonpath='{.status.loadBalancer.ingress[0].ip}' 2>/dev/null) + if [ -n "$LB_IP" ] && [ "$LB_IP" != "null" ]; then + echo "$LB_IP" + return + fi + + echo "127.0.0.1" +} + +INGRESS_IP=$(detect_ip) + +echo "# EshopMicroservices — add these to /etc/hosts" +echo "# Detected ingress IP: $INGRESS_IP" +echo "" +echo "$INGRESS_IP api.eshop.local" +echo "$INGRESS_IP identity.eshop.local" +echo "$INGRESS_IP mailpit.eshop.local" +echo "$INGRESS_IP kibana.eshop.local" +echo "$INGRESS_IP jaeger.eshop.local" +echo "$INGRESS_IP grafana.eshop.local" +echo "$INGRESS_IP prometheus.eshop.local" +echo "$INGRESS_IP rabbitmq.eshop.local" diff --git a/k8s/scripts/teardown.sh b/k8s/scripts/teardown.sh new file mode 100755 index 0000000..57e7a8e --- /dev/null +++ b/k8s/scripts/teardown.sh @@ -0,0 +1,29 @@ +#!/bin/bash +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +K8S_DIR="${SCRIPT_DIR}/.." +NAMESPACE="eshop-microservices" +OVERLAY="${1:-local}" + +echo "=== EshopMicroservices K8s Teardown ===" +echo "Overlay: $OVERLAY" +echo "" + +if ! kubectl cluster-info &>/dev/null; then + echo "ERROR: kubectl is not connected to a cluster." + exit 1 +fi + +kubectl delete -k "${K8S_DIR}/overlays/${OVERLAY}" --ignore-not-found + +if [[ "${2}" == "--wipe-data" ]]; then + echo "" + echo "=== Deleting PVCs (--wipe-data flag set) ===" + kubectl delete pvc --all -n "$NAMESPACE" --ignore-not-found + echo "All PVCs deleted." +fi + +echo "" +echo "=== Teardown complete ===" +echo "To redeploy: bash k8s/scripts/apply.sh $OVERLAY" diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index db8bee3..83408f7 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -79,6 +79,7 @@ + diff --git a/src/Services/Identity/Identity.API.Tests/IntegrationTests/DataProtectionKeyPersistenceTests.cs b/src/Services/Identity/Identity.API.Tests/IntegrationTests/DataProtectionKeyPersistenceTests.cs new file mode 100644 index 0000000..15244d4 --- /dev/null +++ b/src/Services/Identity/Identity.API.Tests/IntegrationTests/DataProtectionKeyPersistenceTests.cs @@ -0,0 +1,22 @@ +using Microsoft.EntityFrameworkCore; + +namespace Identity.API.Tests.IntegrationTests; + +[Collection(IntegrationTestCollection.Name)] +public class DataProtectionKeyPersistenceTests(IdentityApiSpecification specification) +{ + ///

+ /// A GET to the login page triggers antiforgery token creation, which forces Data Protection to generate and persist a key + /// + [Fact] + public async Task DataProtection_keys_are_persisted_to_database_after_first_request() + { + var client = specification._factory!.CreateClient(); + await client.GetAsync("/Account/Login"); + + await using var scope = specification._factory!.Services.CreateAsyncScope(); + var db = scope.ServiceProvider.GetRequiredService(); + var keyCount = await db.DataProtectionKeys.CountAsync(); + keyCount.ShouldBeGreaterThan(0); + } +} diff --git a/src/Services/Identity/Identity.API.Tests/UnitTests/ApplicationDbContextTests.cs b/src/Services/Identity/Identity.API.Tests/UnitTests/ApplicationDbContextTests.cs new file mode 100644 index 0000000..ce791a4 --- /dev/null +++ b/src/Services/Identity/Identity.API.Tests/UnitTests/ApplicationDbContextTests.cs @@ -0,0 +1,14 @@ +using Microsoft.AspNetCore.DataProtection.EntityFrameworkCore; + +namespace Identity.API.Tests.UnitTests; + +public class ApplicationDbContextTests +{ + [Fact] + public void ApplicationDbContext_implements_IDataProtectionKeyContext() + { + typeof(IDataProtectionKeyContext) + .IsAssignableFrom(typeof(ApplicationDbContext)) + .ShouldBeTrue(); + } +} diff --git a/src/Services/Identity/Identity.API/Data/ApplicationDbContext.cs b/src/Services/Identity/Identity.API/Data/ApplicationDbContext.cs index 6919056..2c86dd9 100644 --- a/src/Services/Identity/Identity.API/Data/ApplicationDbContext.cs +++ b/src/Services/Identity/Identity.API/Data/ApplicationDbContext.cs @@ -1,16 +1,18 @@ using Identity.API.Models; +using Microsoft.AspNetCore.DataProtection.EntityFrameworkCore; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; namespace Identity.API.Data; -public class ApplicationDbContext : IdentityDbContext +public class ApplicationDbContext : IdentityDbContext, IDataProtectionKeyContext { public ApplicationDbContext(DbContextOptions options) : base(options) { } + public DbSet DataProtectionKeys { get; set; } public DbSet VerificationCodes { get; set; } protected override void OnModelCreating(ModelBuilder builder) @@ -20,8 +22,7 @@ protected override void OnModelCreating(ModelBuilder builder) .WithMany(x => x.EmailVerifications) .HasForeignKey(cc => cc.UserId) .OnDelete(DeleteBehavior.Cascade); - - base.OnModelCreating( - builder); + + base.OnModelCreating(builder); } -} \ No newline at end of file +} diff --git a/src/Services/Identity/Identity.API/Data/Migrations/ApplicationDbContextModelSnapshot.cs b/src/Services/Identity/Identity.API/Data/Migrations/ApplicationDbContextModelSnapshot.cs index bc565e1..88a7046 100644 --- a/src/Services/Identity/Identity.API/Data/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/src/Services/Identity/Identity.API/Data/Migrations/ApplicationDbContextModelSnapshot.cs @@ -167,6 +167,25 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("AspNetUsers", (string)null); }); + modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FriendlyName") + .HasColumnType("text"); + + b.Property("Xml") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("DataProtectionKeys"); + }); + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => { b.Property("Id") diff --git a/src/Services/Identity/Identity.API/HostingExtensions.cs b/src/Services/Identity/Identity.API/HostingExtensions.cs index 46a281d..19b8669 100644 --- a/src/Services/Identity/Identity.API/HostingExtensions.cs +++ b/src/Services/Identity/Identity.API/HostingExtensions.cs @@ -1,5 +1,6 @@ using System.Threading.RateLimiting; using Duende.IdentityServer; +using Microsoft.AspNetCore.DataProtection; using Duende.IdentityServer.Services; using Identity.API.ApiClients.Mailtrap; using Identity.API.Data; @@ -53,6 +54,10 @@ public static WebApplication ConfigureServices(this WebApplicationBuilder builde builder.Services.AddDbContext(options => options.UseNpgsql(builder.Configuration.GetConnectionString("IdentityDB"))); + builder.Services.AddDataProtection() + .SetApplicationName("identity-api") + .PersistKeysToDbContext(); + builder.Services.AddMigration(); builder.Services.AddIdentity() diff --git a/src/Services/Identity/Identity.API/Identity.API.csproj b/src/Services/Identity/Identity.API/Identity.API.csproj index 312c4cf..a4c80ef 100644 --- a/src/Services/Identity/Identity.API/Identity.API.csproj +++ b/src/Services/Identity/Identity.API/Identity.API.csproj @@ -17,6 +17,7 @@ + diff --git a/src/Services/Identity/Identity.API/Migrations/20260624110240_AddDataProtectionKeys.Designer.cs b/src/Services/Identity/Identity.API/Migrations/20260624110240_AddDataProtectionKeys.Designer.cs new file mode 100644 index 0000000..500ffbf --- /dev/null +++ b/src/Services/Identity/Identity.API/Migrations/20260624110240_AddDataProtectionKeys.Designer.cs @@ -0,0 +1,393 @@ +// +using System; +using Identity.API.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Identity.API.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20260624110240_AddDataProtectionKeys")] + partial class AddDataProtectionKeys + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Identity.API.Data.VerificationCode", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("text"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("IsActivated") + .HasColumnType("boolean"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("UserId") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("VerificationCodes"); + }); + + modelBuilder.Entity("Identity.API.Models.ApplicationUser", b => + { + b.Property("Id") + .HasColumnType("text"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("CardHolderName") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("CardNumber") + .HasMaxLength(19) + .HasColumnType("character varying(19)"); + + b.Property("CardType") + .HasColumnType("integer"); + + b.Property("City") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Country") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("Expiration") + .HasMaxLength(7) + .HasColumnType("character varying(7)"); + + b.Property("LastName") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("SecurityNumber") + .HasMaxLength(4) + .HasColumnType("character varying(4)"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("State") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("Street") + .HasMaxLength(150) + .HasColumnType("character varying(150)"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ZipCode") + .HasMaxLength(20) + .HasColumnType("character varying(20)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FriendlyName") + .HasColumnType("text"); + + b.Property("Xml") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("DataProtectionKeys"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("text"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("text"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("Identity.API.Data.VerificationCode", b => + { + b.HasOne("Identity.API.Models.ApplicationUser", "User") + .WithMany("EmailVerifications") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Identity.API.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Identity.API.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Identity.API.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Identity.API.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Identity.API.Models.ApplicationUser", b => + { + b.Navigation("EmailVerifications"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Services/Identity/Identity.API/Migrations/20260624110240_AddDataProtectionKeys.cs b/src/Services/Identity/Identity.API/Migrations/20260624110240_AddDataProtectionKeys.cs new file mode 100644 index 0000000..9354fcf --- /dev/null +++ b/src/Services/Identity/Identity.API/Migrations/20260624110240_AddDataProtectionKeys.cs @@ -0,0 +1,36 @@ +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Identity.API.Migrations +{ + /// + public partial class AddDataProtectionKeys : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "DataProtectionKeys", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + FriendlyName = table.Column(type: "text", nullable: true), + Xml = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_DataProtectionKeys", x => x.Id); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "DataProtectionKeys"); + } + } +} diff --git a/src/Services/Identity/Identity.API/Properties/launchSettings.json b/src/Services/Identity/Identity.API/Properties/launchSettings.json index b286b57..30b4ee1 100644 --- a/src/Services/Identity/Identity.API/Properties/launchSettings.json +++ b/src/Services/Identity/Identity.API/Properties/launchSettings.json @@ -1,6 +1,7 @@ { + "$schema": "http://json.schemastore.org/launchsettings.json", "profiles": { - "SelfHost": { + "https": { "commandName": "Project", "launchBrowser": true, "environmentVariables": { @@ -9,4 +10,4 @@ "applicationUrl": "https://localhost:5007" } } -} \ No newline at end of file +} diff --git "a/src/Services/Order.Command/Order.Command.Application/Data/IApplicationDbContext\342\200\216.cs" "b/src/Services/Order.Command/Order.Command.Application/Data/IApplicationDbContext\342\200\216.cs" index ab4fca5..b6b398a 100644 --- "a/src/Services/Order.Command/Order.Command.Application/Data/IApplicationDbContext\342\200\216.cs" +++ "b/src/Services/Order.Command/Order.Command.Application/Data/IApplicationDbContext\342\200\216.cs" @@ -11,4 +11,4 @@ public interface IApplicationDbContext DatabaseFacade Database { get; } Task SaveChangesAsync(CancellationToken cancellationToken); -} \ No newline at end of file +} diff --git a/src/Services/Order.Query/Order.Query/PostgresConfig/PostgresDbExtension.cs b/src/Services/Order.Query/Order.Query/PostgresConfig/PostgresDbExtension.cs index b22596c..69c2bee 100644 --- a/src/Services/Order.Query/Order.Query/PostgresConfig/PostgresDbExtension.cs +++ b/src/Services/Order.Query/Order.Query/PostgresConfig/PostgresDbExtension.cs @@ -26,7 +26,8 @@ public static IServiceCollection AddPostgresDb(this IServiceCollection services, .Index(x => x.EventType) .Index(x => x.CreatedAt) .UniqueIndex(x => x.Id); - }).UseLightweightSessions(); + }).UseLightweightSessions() + .ApplyAllDatabaseChangesOnStartup(); return services; } } \ No newline at end of file diff --git a/src/certificates/api-gateway.crt b/src/certificates/api-gateway.crt index 36c5a2e..728849a 100644 --- a/src/certificates/api-gateway.crt +++ b/src/certificates/api-gateway.crt @@ -1,28 +1,28 @@ -----BEGIN CERTIFICATE----- -MIIE1TCCAr2gAwIBAgIUAfT1chDFp31Leol2oRLutw0pcfEwDQYJKoZIhvcNAQEL +MIIE1TCCAr2gAwIBAgIUAfT1chDFp31Leol2oRLutw0pchIwDQYJKoZIhvcNAQEL BQAwRjEnMCUGA1UEAwweRXNob3BNaWNyb3NlcnZpY2VzIEludGVybmFsIENBMRsw -GQYDVQQKDBJFc2hvcE1pY3Jvc2VydmljZXMwHhcNMjYwMzE2MTA0MjM3WhcNMjcw -MzE2MTA0MjM3WjAWMRQwEgYDVQQDDAthcGktZ2F0ZXdheTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAJjamTV8adtFKRxL3jx7Wd3Yacpwk+YpIkW4xkO7 -SEZBwyd1hWLiKoBf73elFQPjvx/Df0iD+TyKQIq5kohVO7HaV0zPQEZ0YsxXYfOh -uRSISMz0DvLR5tKFr3OmDCZbMhmdfYNQk/mSIXyqzbKxKSgprnKfq4KchEAzxYya -oL5l4I5SfSeHTd6fW0ILt6CiJjysvoEe4wxA4+3R1pR4RBjQLjJbfr2N6VVZ21UB -loyuTHhi0ltoeyqGxqwxkFbTczCBo0fGx6LX1At29Vm9r4roDbbJVmVR02XlxCbe -wg4otN1QEjz/bN6PCprrwEKslvihApbdhL4nVaEv42njbUsCAwEAAaOB6jCB5zCB +GQYDVQQKDBJFc2hvcE1pY3Jvc2VydmljZXMwHhcNMjYwNjIzMTEzOTQzWhcNMjcw +NjIzMTEzOTQzWjAWMRQwEgYDVQQDDAthcGktZ2F0ZXdheTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBANcuO413iikFBCyvyRfjis/2oQ+3LwjEwBfsiF/u +n+tSimUEhEW7cSn5OQ9jV5+wSXHAWBEqBejUdgTaCVdq6G2tlu7y3ZTH3PqO6yms +3T7dqw+bXffO2MbYOVn5TWLQzZqKg4nm/sKR9gY9gktfVZSGOhG31Fee756NXpgb +JpV8RsTO6TNJGncX42PUQcoUXcgk9XRUTPhJyFzZ8Jtdz0P5hwMOIHOU1Ns7hat8 +B85YmCWeLACx+s1lpLLciClMKos4qTpBGdBpHhLzypjEvIfY9MRjfDm4r4jg9J++ +RML3JJnTD1G1NDw/kbaoXQqtHVGv5wDqYFAaU+aDP32fwKkCAwEAAaOB6jCB5zCB ggYDVR0RBHsweYILYXBpLmdhdGV3YXmCC2FwaS1nYXRld2F5gh9hcGktZ2F0ZXdh eS5lc2hvcC1taWNyb3NlcnZpY2VzgjFhcGktZ2F0ZXdheS5lc2hvcC1taWNyb3Nl cnZpY2VzLnN2Yy5jbHVzdGVyLmxvY2Fsgglsb2NhbGhvc3QwCwYDVR0PBAQDAgWg -MBMGA1UdJQQMMAoGCCsGAQUFBwMBMB0GA1UdDgQWBBQd4nOqsvPC4oDu0xWpXDBL -0GGxYzAfBgNVHSMEGDAWgBTx56zBqYwcdVZrGp5PFuPgViXGATANBgkqhkiG9w0B -AQsFAAOCAgEAJpSlOx9/FYBO6TjbOXMN6dgHgnxqCX0mDWPEDOf8Rz8CyJ23ZJql -iA+pkM6jAkY5Q0SAY7XwNjydI52EIhbvN6v7nMhPwH3vPLdpCll9eHrJTmRfWyGr -AAyzMLZq4+cPLsfftraAC6N8A8Yv1xwbh5p9AxXeYCjvxESCBh13ql9bgoBuGEOP -eKoAjZOU2LYxNocggUCehSBjQ0A4KxLC8W/HQAufj5S5HH0yT2d1mDUGnb7ui6K+ -KDzx6ZmzbxMXLtXGTlJZr3FFB9uG16i1NMHyrRnPoNPP3lxqt+HskVyGDXKyQ+3F -8ryPcHulEDqZBeaTIQO01C2MclxR2Kk3maMX0ZeJzGAt+lbMwjk2aF79xDsvfTA6 -RFvw7PLV27Rs+KlawWn4qBhV99enT2IBWwYslLOowN2BaV2o+V8QDROilkpLFWPV -M+kkwSZs9YI6ZM7Vr98T36MiQNxFko+phF1XGvOp2HZoFPpLVxmUt5MJdc+3kHAR -bsYbZU+hpjGQyUO7N9O4uhh82ChcV/YLONj4ZUFBsa8L9SJYT3VCnXXGI8Mo8nWk -ZSh0cL+cpU3ZukIWmcKYBoma651h3dXzgzUPJX4oiuqvrkrjYYCn0JzXvock6ENH -qPr2RMsoZKjEBjfpOQze8AvwNRjU9HQ8Nr74Rlfe+0FY25wtm0YhnKc= +MBMGA1UdJQQMMAoGCCsGAQUFBwMBMB0GA1UdDgQWBBSXCLno8eY3GrQCl8idfGUa +CHd2yzAfBgNVHSMEGDAWgBS/Eltye2Mg3kuSyJX4v+CKvSgsCDANBgkqhkiG9w0B +AQsFAAOCAgEAJdEKaRgcAawxFSXKvfQqrP2MPSvpG+Y4Jy7Wn0Mh8zCoAML1EnUa +jBX1/QytZ8APXD+CZlpLGa1Q5+eb6Q3YO1wv1JKJmh4orsjfcU0V6OK7L7Ad3Bl1 +XOnfUYHxJppfCA48hqQOiMSUXzhcSaL0gIGa3T8F4skMiRTwGKPWVA4UFxrDeL1x +MbocXC6KRmFLqKE5KzVi/ffEDmwd4yO/AiTyNgDiffDq/13qyJnrc8M+uSuacYhX +i5MM5Z2o169vs4jwKzbUX/HWx5OS/6Ou9OT0BNK628MgrwFmbblYHZPlqM8XvPXS +sX5VO0VMFuNGfVbgBpA3y/PpbzC/qwiv58kgbcrHiJg0pFkiutdsWcqFmVvTsxU7 ++esELQljIb5WaCvLn0/MAQ8guaugvDQLUb7xbdBF60oAj4fE/rgLa65erHbsEq8f +yQJEhnUiHu+JR3ag/7ETRvY93G9N8H/gtI0BDFxs5B6PcA6HE8zpufde27CvAjG5 +9bEBU0WtVnHu6jhbLheK9jbeQPTLfrjcEWQF0yElamGIUcFI5DH/qwyyJtDwDO5W +d9zOj3vFmpRWJawp+GUJmsJATWE1RLSntzYXFH80xGGN5K72jd13OFGC+unW/lXQ +ePRm4dGl495TYqbl0sDtI3+ZB9MCRSgQ5RRp2YYzWQZTrgsIiotpflg= -----END CERTIFICATE----- diff --git a/src/certificates/api-gateway.key b/src/certificates/api-gateway.key index a245707..aa57810 100644 --- a/src/certificates/api-gateway.key +++ b/src/certificates/api-gateway.key @@ -1,28 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCY2pk1fGnbRSkc -S948e1nd2GnKcJPmKSJFuMZDu0hGQcMndYVi4iqAX+93pRUD478fw39Ig/k8ikCK -uZKIVTux2ldMz0BGdGLMV2HzobkUiEjM9A7y0ebSha9zpgwmWzIZnX2DUJP5kiF8 -qs2ysSkoKa5yn6uCnIRAM8WMmqC+ZeCOUn0nh03en1tCC7egoiY8rL6BHuMMQOPt -0daUeEQY0C4yW369jelVWdtVAZaMrkx4YtJbaHsqhsasMZBW03MwgaNHxsei19QL -dvVZva+K6A22yVZlUdNl5cQm3sIOKLTdUBI8/2zejwqa68BCrJb4oQKW3YS+J1Wh -L+Np421LAgMBAAECggEAMkPkkRWuO+ik6cS7Otl3hoAl3egigtQxDIuES365eD0k -/4Nij09/mYKy3X4AiKxqy/e+kiqwGev+6H+5A7M/s69w+PXIlcKtQLRVpkge9HUS -t69kgQ5soPtMZLQMl8pykcDcJwQm/THEaFpE1Yfz2FzInLIMNSHiTbiYtLGeva2B -kyCKoSLXKuW/SzUmgKnnsTfRkfrvfACg496mvNB1kyAqS8YbHFxDfswcn9vDfH5r -EddHQD1JcLIS0iQ52qWOpcgCE/4uJ4z/MAdGm7G1Y8M+CiglXmNqxpbHIADE6MFe -aXQpmvyoe85H9AYsyEwwXrv7hpoxpZERx2FvWJS1rQKBgQDR8TihqKHUR17eeuMi -Z9eeB7IbbExCKSx3KzpMv+RJQxD7jbglv7F8l2C2j1QG/YasDswCZpSFIu4AT2dI -XquNCZe+nl/WM+XMnNCF9uuZluuTrOV5JZsHyr+UKpzSrvxNcOTb3UNczsWrx6oE -TM7sjOO80vg9BVpBneodrRISnQKBgQC6Yy4Qz3HsSv+tCPXUVCYCoalWRXEF5xlt -TnqYWKo2OHpyI/cTI/BrBNtml2gRO+Y8Db1/5Rgr3QSeqXEUVDiuDTl4F432WS0d -rKmTSgnNDImeozdDWCmfgcgtotNOMp6n1LqqyaPxmYDImxTrObLS5disVdOdJKfP -pwiEoxsnBwKBgFVtvwmpQRDMagJGJx7c+pRHtWYLT4ysjHeBk5ufihl1vPdf18sk -keiNAMHI2PxvNdnVu5ZOf6kdaZOeu/xq6Yvel2ztrTnQrHXyabfZnk1FaF8TP91o -PAmTqxlzrZTdt7Ubd0UwaDTfvvgDq19MkfcX7aPshS7veqawx4+D2ZLRAoGAWVDf -qUSPNgk2fge2LZppYIdxaxr5rzdwEtYxn0GVx0fHPV0IsA5fzhjUvlO9lcybZpm6 -/kedDp/p79IIkxJM2vMRYAABklRnbznnROKM0cq5Q+C4wbfEsl/xuhS1p1pQduJU -1TStMEA722WdX58Vl0R3URYLwtjm5XYIee7jOw8CgYA7e/4phZkK3kiamsAkpW+9 -ouzj3dq0Rpv2QrnflhlfGyBygurq5eR+Nc6wNraoZOhBag7esRnjh1gmjRj7f58j -lYn8n4axUiO+NRt8+bVJc1J42/Ussjzgr6JAx3pTdFYqJVCqGrj56UthgsRUJXXW -fi5NAuP7mZ2dKy6S2F+paQ== +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDXLjuNd4opBQQs +r8kX44rP9qEPty8IxMAX7Ihf7p/rUoplBIRFu3Ep+TkPY1efsElxwFgRKgXo1HYE +2glXauhtrZbu8t2Ux9z6jusprN0+3asPm133ztjG2DlZ+U1i0M2aioOJ5v7CkfYG +PYJLX1WUhjoRt9RXnu+ejV6YGyaVfEbEzukzSRp3F+Nj1EHKFF3IJPV0VEz4Schc +2fCbXc9D+YcDDiBzlNTbO4WrfAfOWJglniwAsfrNZaSy3IgpTCqLOKk6QRnQaR4S +88qYxLyH2PTEY3w5uK+I4PSfvkTC9ySZ0w9RtTQ8P5G2qF0KrR1Rr+cA6mBQGlPm +gz99n8CpAgMBAAECggEACmL3f2400Pg7xG9uGL/ZmGJlJwXL2KkXRPWx0IBLdQJc +iUs/mkEVvDWvi36wq6szTwZpNII6MPapGrYD65W5Zz/mOvL7VJ5AHFJlPLNU0PRw +uHW4Al6YPU2Rw8t3m4yM0XKcWP35hUlNM5ho+hE9kjLXdI79H4dIYDdz3d+OTCVR +7Z1E7ji2AelVbSKCsPtJVENcqZgaLKJoqr075BIeEi9MGm+GDF59y/5Zr9/idtz6 +YjSQ7cJhrcoMXOx4uspkP6CQl69TQiFrsJvLYxXL48FsUysplIYEXw2CYOPcrWWa +/CjC0uvkAnMiwDNMAkVfKO2aYYZdBb3rYI0N5VIMfQKBgQD6UGd5Q6NTudWepiXn +mFoLxxIQ2YSaY1xfQr6nmqy0nCPSHVMBjvmJds8U/MeRtntOr/Pqb2Z5vsR/suJP +YWAKaFr4+cjhGv7xt3oxA5uE3wgjwHdx3d24qgpRKIuPg2F07gnMB8MvnbbsW1xv +2qlwECL+FAA+w381jJMSuFvw5QKBgQDcEYZF2VrOv2qOLt3jwstxz33eW1g1yGHf +BmHhwFJpA4+Fbe5jWBjbT+kf3gGyeiAtuJ8Hx+hlYxxF+PGOoMkFZUlzFEVZ5fZL +1bhwTOMA3m/gBrjC0Arha223x3u8zPjIKce9eJhIzFNeEW2kUoucE147Q2B3fynf +2IR2CA2IdQKBgQC/VZxyffgndKJMPbY1nCggXo95n7sThCXEjzFKzhl7iOp8nnun +clFd+Rn7celegT0p/acVqQeMwfxTnDoO8WDHM9NuAwjAwLDltRjKxHYpD46aPXFP +8YactCVkufhLv+JLzfRhKAHTsNt1ObSjr2Hazgrhagpx71+aYBS/t3pX3QKBgQDG +EF+w7fb0rQLSBQxfuSoxvHWkcsHpZffwKmZeMCH7seCyTkaH0vpMKJfAvqb4Y0Ii +5E79Sca3uYPw1iVSIRPLb2Wz1UK1rmsFxczCBfEpDwnRrzsK2wNv7qhJB5kuS6x9 +Ol0zAh7NJljCCR2ND13nkub0n6dq5WBivxQ4xvanIQKBgCVjfvB+gHAbzKFpKSXu +TPwBHpNZj0QnK25yK5UWkMde7/I4j1RMKTJY8hVPIeadX7gxPTUb53wharA6d+ob +MrHdATCn99Z8yLmqLdSZc+qcSa/9uMpoVLuBi3VeY2gOam1U0TypCF7YUKxfYy2J +OC6TgHEyt5kPmOGt9LIYjh1e -----END PRIVATE KEY----- diff --git a/src/certificates/api-gateway.pfx b/src/certificates/api-gateway.pfx index 63856e85d421f5ab428c5ebde657e5949da1fbad..84be39d90850ab086e4b5d2901822457f1412b37 100644 GIT binary patch delta 4227 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 Z1P~SD(o&hy6Oe^hCWV;Z>h1yp2mnR>G0gw~ delta 4227 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 Z1Q7Bs_~)1rwHVgR0=?h^Nss~p2mp(GS402+ diff --git a/src/certificates/basket.crt b/src/certificates/basket.crt index 2be2e22..c2fe4e8 100644 --- a/src/certificates/basket.crt +++ b/src/certificates/basket.crt @@ -1,28 +1,28 @@ -----BEGIN CERTIFICATE----- -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 -----END CERTIFICATE----- diff --git a/src/certificates/basket.key b/src/certificates/basket.key index d2668c6..12c57f2 100644 --- a/src/certificates/basket.key +++ b/src/certificates/basket.key @@ -1,28 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC6HdS7TwKXrblZ -PpThGLHi+LYzns2s/+2DgJN15Y5G0b1zW6TQAeRlmIbKBVCMarRAhSLZOwbQZgkn -jcAd3+6pGSbzS7yOk2UiPtYqrmEBlFBh5O7mpedr8N7dKKMwWWwpElG7VQ5phiEG -g6hoL9smmOrLIsPlMXNxTc+W7XthQpWGOeqaQwyRSB/8CN/NPe7Vy7/f4/7zc8Pc -uVVEgYPurNSiOWNSJYA4IBOHc0IHDxx7sHlUrgdpCEA0yVg0RlQc1yoWedkKS9Mg -A1XQihcDgeGyTWtv2FAUflKqA0VnTWP7xmvYF0A60vF/aoodxM6rnt1Naq3WAEjq -H2HoGuRBAgMBAAECggEAAn3EO3ahCQE7DioDiajQNsLQA4xgYeyyE/TMZINcXm/P -yqPDJsKjuUVrpnggPiTugT+W+hPrcS4weK5R0ESPWAWdaxvMLBdmfuka6krXwxLm -aY0MMputZ5k7jnfNCWhlBX64h9qpXPm95u2ruytK0m8xE2OFfkOlcTKSsQlAQcrB -xlaPPr6aLSWB3gc6f+ERJIyi6z3gIDLzKkiu5EmQtUF/iKTgDb4YQKWftMk9E2H3 -0Rqm8v3jurqcJzIlZG8ghWQo/c/tCWg+rpUfSeoSsiKurtbVuDpARJNP9vi5r6yA -e7q+nExn7KIMt7D1bCQWuDgjlMIHhMJ1iEY/yLoo3QKBgQDlR2ZuYzmVY3G3pWZf -Vf1072qPZ0M6/icpPEPbtvG6mUzGorBiOXmCt4Fb3RnRMeQlwtx2gN7wCtGIF1i+ -kS+dLWreKi4BwRMvJKKVesXEEpHBNGVrMju4g568pNudNGx782bpPDrii5srYg28 -Hwv39qVFuYEgzkROoNllFLIlVQKBgQDPzqtV5c8yh0zPV0Nu2ijnvJFZXJmnjo5g -VxwzA4r5BoX616e709TraXTPnvwGgGGMjRBnBqIDaqm7Ka6WHKBk7Z6GJj8w2c8x -tiCpRT8TVhbrTRgPsGD9K5aLy+cLqosQrJoRJp3sl6kwocw/Q/QLzSoXt6DOiFxk -4PAs1lgDPQKBgC5jv+nd0azULhIGOSxY7atXNaxGLGgnPC0vsFsoLMigc9RM3ntB -PcCg+F9p4OteuNabEpg3guP2jGaIsr/8CDI5GkJRLnXUZtlHBE5SROljCHKa81o5 -E7RFjTyF7plkHf8GRHA0a4Wi0YZ5lGXXskg9czskSWgl09RE3zeAdHrxAoGATE82 -N6rWNVXd7N28k35lOwPR1CDfA9qjidkzL8CDTgMJPB3pKF4XeAMXtA5Lug92wugi -N9MFt395qJMb21/TvnxLlDODTOsO3NBmmgIlsXIRpIKA7XH1i8Jv3BIaW/xaaNsZ -EGc/4tumc4dWu3y2p4bFiEQUNwN3+ktnpu9nDnkCgYBMcib7zewkAh2mu/IhE/9u -oMV3NEsmOLrtPrhiFz5b6rv1yT+rkn6OYiKGglu0NZl+JQdMUc6NibdQKSb/o5qa -o75yrZbWetTcbvOwdFfVBCxH6GEIMbikK9vzQ2Q/NYojaSOaKJuNntuNltkuXyMV -q67NA/42DvFK8mic2N4hHQ== +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC/Mf8TQCj8Nuo/ +CgEJe62TeWOZv9wQTGpiN8L8cwv2If8RVBrguUTvzaHLwwq4S3TaNK+A/j7XvP9w +/cJLESRaJkfNFAUwTGxvQwa9/a72Iyg/GMIhs2+ElG9ss/RSJIlsSnNqKSwowTvG +Wo8vybH4+ttPJda3eZ28wl1Bk4gk5SfS6mp7MSEaiFYfTlka+VhvosVYINCeIoLV +WoBJf22GxgtDpQMyIJFO4SVHr5q+YFDQIaAZnC3V8sv4kVnxJp8zs2PKUZi14xCZ +nVOfXI7kkA2Y4qbNk0Jt+69Xz40KpQz0RGxIv55FAmOzTcBHmDXLOddt3psOuBWP +p9sPV3cjAgMBAAECggEAARquUPOlaPN+Pdf2cpISyg/A6gHoKPXwBVoyF5gogQbo +PLbiItsfEU18OjuJo8/XwGzeeJ2/SiquxP3KMfnK3nRrJL2RXBqM48Wc09sTuBsy +385qTJyHL9pVnGibqB/K5WO2r+3F8gRPrpEWU53UF86HFrluuIeMyCrNNBRAjIn9 +tvFnc++nl0hFHvFOb+IvlYhV5eLUbIVD/veB0FoeavKR14QsuTq4/dM3tFQSQFSZ +fYKjAL34w1Lh7of/caLS4B4nDuRMDomlOe9T1lyX3NDoVWJINNfbzuEbU0KXyV1D +Qg9bwPtEP7mdINaK63wYMx3pfgbf1owSFlZA3sKNTQKBgQDjUIr+K7/wqj/oO9Zd +ICPW1BbRB0ugd53HMf97bUiRGClcfytXJs79OrDZwNxRjN1vPG2PmAo+3TUcFT6O +Ms2dkOwSA7/CZOPrzXNo3OAgRXPvRa0S1tSnyfBWWz6bqb2COOWk+8ASJiAyhkgz +LAzC0pwflXT2vi4SQHuJyYC2VQKBgQDXUpwG9xrvjR88tYabeI1/F7ZGATUFTZ5s +WPRcixjrRFkwkbzOmmdpGR6wnEg9wwc6yAjwH4QQlujNB45U8+/TWFxWJFe0nEX7 +fFFMs/3NX1mQxRjFl1Wqtl0MT3mTu4CnQjld5dcl/zASbzBTQsN2NcAjbUz8+FYu +Ufx+lFk/lwKBgGhpe56qS9zo5rfunFVkSPIJs31KI5POvdtcfOSd2wJCneUNyMOc +YOFyTv+Gleyjjqbkk9KsXLBpfVar73LzpPymL7lKnY9WNlb+pO9a3VwVat5SG+CW +a1Gy8UFJYiWwPwsMxXcV6DCt8IYkpg9TQX1PrkTXqsUXsCPUGKq+su+NAoGADrPi +WYtn+HF/b4rJnTYXG1WIKbGNaEZLigRs8yDAW9g36twYs1bRtthzQwX43NbDWJ0u +Fw9f2i4jyVQ5wM1DVAAVlgA3SOre0HRFrOIhc3OOTxdWQK+7tsNrCRsoJxFHkKQx +/JpkHYEWTDvxZc4KQLkc3I5rEl72q4UHo7EHgxMCgYEAzEXtf4mp0L+p0gKuIL52 +KPHhvcxykO/FhPVVLw9CXcOgd/d70Vpfu+1cEEfZtCT9n9oYon/8zEFVa/6xvRtw +7OvTwFzV7LKgTVQ+H+lCkZCgfBQB62JB2Mx6qOA544qS4LDH1R3Cvo4gr2yYp9Q2 +mElm/Kv6eJ7cBbUqlEmAXEQ= -----END PRIVATE KEY----- diff --git a/src/certificates/basket.pfx b/src/certificates/basket.pfx index 47d4fd42a7787ec5388cbb46eed8b28dc3eaa0c1..66af2e7acfc2704adeb07f0921b747d1162cf99b 100644 GIT binary patch delta 4227 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 Z1Q48;nO;v01r{f^z^My~EDiz!2mmtMMl%2a diff --git a/src/certificates/ca.crt b/src/certificates/ca.crt index 91ae2b2..50d7dca 100644 --- a/src/certificates/ca.crt +++ b/src/certificates/ca.crt @@ -1,32 +1,32 @@ -----BEGIN CERTIFICATE----- -MIIFbTCCA1WgAwIBAgIUMSNXy7CiBYeMGexQzSIkwq0iy4gwDQYJKoZIhvcNAQEL +MIIFbTCCA1WgAwIBAgIUayRF3jfDuAhtY3C9AHhL7TsgDm8wDQYJKoZIhvcNAQEL BQAwRjEnMCUGA1UEAwweRXNob3BNaWNyb3NlcnZpY2VzIEludGVybmFsIENBMRsw -GQYDVQQKDBJFc2hvcE1pY3Jvc2VydmljZXMwHhcNMjYwMzE2MTA0MjM2WhcNMjcw -MzE2MTA0MjM2WjBGMScwJQYDVQQDDB5Fc2hvcE1pY3Jvc2VydmljZXMgSW50ZXJu +GQYDVQQKDBJFc2hvcE1pY3Jvc2VydmljZXMwHhcNMjYwNjIzMTEzOTQyWhcNMjcw +NjIzMTEzOTQyWjBGMScwJQYDVQQDDB5Fc2hvcE1pY3Jvc2VydmljZXMgSW50ZXJu YWwgQ0ExGzAZBgNVBAoMEkVzaG9wTWljcm9zZXJ2aWNlczCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBAKejs4MkvQiP7Ae+VqYm3rXlM68qA92+D+8Ov3za -VMf3ZweK6xg/HEuD7vbJU9AQ5L8lRaSiSePa/mwvXgvudZE3zpHintEofc/9gsL5 -mHDr2sMhm8b24Ad1bRo//S18aDOY017GJ5LntniFBqqI0cxE9u+STq55JhiRBy9u -DHrXFPvB8wC7nQ2GRiOMdAz5rpg6ao7VOiYI0UIiKrGKFGNP61859YLH7hEvv4S2 -B9rxYIc5TcsQDe4+da4Gl5KcFtr3hHRNQXJtxHXvKuE/0PNp656XyWQY4Mb9Ze9h -bR/xXOCkoTLooXSCjqRdf3IVL/f3BChdgB8DNWYwvTyyHIAGbolkKj/QyE8/RG12 -qw0AZkRdublb51qV9WajzVEMF1P7Bkhj0ZoMN40w95SHgkPUmoZoPbPiJz+ylDKi -kbyIE/ROYDKZ8nkNenaFxkdcuSIEgJw7E9pNbNYILNKl6o4JC21QGUBcwRi9ahpJ -HOOGZSvRbUN/U/vSaq5UR498mzhooe8HT4TEoKxMRDCA092tkrNen7ceckB4Xf0s -ud+wIYFNGrEj7LZGp3WdYZ0bUL/5Unlci1lycCvXbUQX40paHUbO8Uzfj7Y1z4ev -Wl+Wpw6RKchkYUFzpibhQfJjaOzaQs3XB2tNkeTRGWuZy/0elC34mQocFw8VUEgw -4AQZAgMBAAGjUzBRMB0GA1UdDgQWBBTx56zBqYwcdVZrGp5PFuPgViXGATAfBgNV -HSMEGDAWgBTx56zBqYwcdVZrGp5PFuPgViXGATAPBgNVHRMBAf8EBTADAQH/MA0G -CSqGSIb3DQEBCwUAA4ICAQCOOe7qoBszpzilUskWUlL6UJwYrqL+n+k4EYgJAGdR -KyrFgjk/TpWJy+/JJc3kg3ABGUZgnX6lJmzivyZHH3cjjz3zycmFIrXJZnbaDM70 -mveGAoTEfhr2gydYkwHsaspRKsLgwuXmsuzHnQ2ULmIjfL78T3V5XY/TnT/xhDeI -/9wpeq3IzeLCRQB4OdmoUDtRYK4JGBmODND7G5IDGmZgXM/MpyfIp1fqK05KQaMu -swCTwF/fp869/VfCYgT08lJssi2PfZR5Gu2e619a4EpBrpU6qEmYAKrhkRacifh1 -pTXETJaMEym3ClFRIs12Rakz0tQwbW6CvcUW+6KlKzHlHCXi38HrSS1zlhHwNB2p -hdFI8PZHOE/DAhzZyy7+4kKYuNxc4zo6+76Xi1k2LH8pkibQWNcjeoEV+Uc77fpT -FxXPv82CCW4hxBhUPB3Oq/kyTaKZEir0g+86q9UVHEan1caemHPo2CJ3QOGv4pdD -t6liE9nmlyRqdwhI6UkdFsYuGcRY3f5Fj+ZQJtskHqZFGPtzi20gJFI3njwoL6eV -D9RAs3Dzmw0U+ZDhl9ydN0oFqVKvmyXHXG+EeFKxKZQj97I5EDbg1DEEzqVm3KMs -vzBnRDRrn2UEwAswh/ESFUJaDSd9i0O1T7Vncj1JImhALyAk5Pq5dpBAYZO6A430 -oA== +AQEBBQADggIPADCCAgoCggIBALtQi1DHcHumrAxqgxKSqG54rHS+v6ZJtdEPVAga +r/0K3iHr40rg0W3FLE0B4aQrlEGZmgV54b7Vymkwvo1hqrEmCgkb684t61KjsOyW +pKHE1KFrQr6ZKm6pQC6AjsAyOYnxf06IAFi3xzobIx4f+mrmcmrI8xe+4SpeO0us +xPmHnU5AnD2Kvzah3DUtctdjsfzkCWh2PlRk7rMH2T4rQMnELSgoHvhS2ycdIkqx +AmT2ETiN5Tdk1JvHoWZRNXeBK3ITlEEt6bwQhzA4eOZkOG61ZP4EOi4sZvBxc/rK +rwYoEUUYjVDdOz0SR1lPQpPbafH6G8VMpvV5OKTcdom2Fg/wG6I/IjWO1QBq09Jc +MBYeVGpGPDwvdKLvY2uDVPjsQ3cbPCeSL6wSkfWpIq5GJDOsv/fe1fIsi8plbG42 +tX/0jOaBdGUgLMfoSKRtKlXz/2vdGl7EsPH5mYJcSkOaUQERanjq9BYt3VrUMBu5 +p0jVqO3ISBsEfx5ryE7dnJWcGxr3XA+/o5+HsIZ/52aRxmk80p0/Tm37vZFcBqNV +KiSO85ZAwBCEFUnpeieqXB4SkZlsaKeerUhkyWYgFPNV5FI//NWoSeA3Tp9c/BNm +tfvLjIwJ4M71+ASgszRBnnhXXquwYauVzZraL7N07g6DCvPY3R5Kh3CKPBp33OIl +Ki3xAgMBAAGjUzBRMB0GA1UdDgQWBBS/Eltye2Mg3kuSyJX4v+CKvSgsCDAfBgNV +HSMEGDAWgBS/Eltye2Mg3kuSyJX4v+CKvSgsCDAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBCwUAA4ICAQAIc/NrPb6vtf4lpE5/+DQO+a1eFvUYXKFHAz4eN9mt +crkGyEoer/Hw3UHtz/u4vXlzlK21zoDdtl2EioAQlnYNq5ciezhZ0RLUoQfs0nE+ +fZhLepFPuJ64EjlkA8nxkR1+ofx2iPi4IIO5OCSLVenbvzPYg34LxNniXDGrX46S +WYpOrR6NM9OdlQUDsm1SmoIs3mc88go9XxffZNzRSCD4semzUW/GtquJUfTcdKPT +a0ifvTBfB+277m84bPuqoDTlxh9l+y2qfUQKOOyNSvNQxSiuqhY073MxTVQAFfM5 +3qg7IJhH71JJ6ioxpabP3GNQk2dq3X/kqah8+vksuzNZVHmLwdDRLu+S4XfnE57n +mfeGG3IwcD+NHYitwdFAFGFvCOO8hklCyiBgpld0RcxPcmyvfEb1iG7oUmVwUMcG +Bg5ohwrIFEodqCEgmQYm/krAsdzVraSK7aMooW9Pp4gsPkqokrEE+Ij4zXOz7v3F +yd7wYwTimMO0nD+lPEGdsa4CZifeOHgKdYNX/+IG3/v2gw9Z9MPd2LV+JHxsan1W +LesM6GlReimwezZecoVpmpsboNB+qLuz8LOO6jXAXWOG4StX583KJJqaJ2Y0ipvf +wRebshQ4QLzIi3qr8rq+lTtSutoMwSCZScrS3xi/3sSyUlaYSq+NAgsIPEdCStiH +bw== -----END CERTIFICATE----- diff --git a/src/certificates/ca.key b/src/certificates/ca.key index 894ce94..5a7f184 100644 --- a/src/certificates/ca.key +++ b/src/certificates/ca.key @@ -1,52 +1,52 @@ -----BEGIN PRIVATE KEY----- -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 -n7OJGXkkEKDZDlhQitNTsiDNICKa +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 +dRp03p3okPa8byugvgS1FgriAdMcNA== -----END PRIVATE KEY----- diff --git a/src/certificates/ca.srl b/src/certificates/ca.srl index 490a59c..70a2c77 100644 --- a/src/certificates/ca.srl +++ b/src/certificates/ca.srl @@ -1 +1 @@ -01F4F57210C5A77D4B7A8976A112EEB70D2971F1 +01F4F57210C5A77D4B7A8976A112EEB70D297213 diff --git a/src/certificates/catalog.crt b/src/certificates/catalog.crt index 64b618c..a2c41aa 100644 --- a/src/certificates/catalog.crt +++ b/src/certificates/catalog.crt @@ -1,28 +1,28 @@ -----BEGIN CERTIFICATE----- -MIIE0TCCArmgAwIBAgIUAfT1chDFp31Leol2oRLutw0pceowDQYJKoZIhvcNAQEL +MIIE0TCCArmgAwIBAgIUAfT1chDFp31Leol2oRLutw0pcgswDQYJKoZIhvcNAQEL BQAwRjEnMCUGA1UEAwweRXNob3BNaWNyb3NlcnZpY2VzIEludGVybmFsIENBMRsw -GQYDVQQKDBJFc2hvcE1pY3Jvc2VydmljZXMwHhcNMjYwMzE2MTA0MjM2WhcNMjcw -MzE2MTA0MjM2WjASMRAwDgYDVQQDDAdjYXRhbG9nMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAn/NPT6n1lRGaFjEKfmvZwpu/4hfN/8QG6ZYe+ZrkOkHr -NiDgHw6gvURCUwz0kGU98b9Q29iHId19XDE1R2dij84hp3e/med7dDBw1ltTnYg8 -+mvnCz0KR31zEbllwHB6F++TOYWJ8nQRRmS17N1p7WGQWwSdxxAFnnl7VLcFbWnv -1yDvxrLDJErqYRHyRjfJnixdObJcd5gWg80qI/IUHwcveZPDNzCGsaUYXIN6oNyS -NrmKEUgUIonXf3CC+AcXpi1Wb5RWH4fg/iLPOgoxZ4U47a+jdRXwY74kKpY5llg6 -9Vf32SvMNeB+KPb8InuymcUnT6KxcIphdHFGWH2lMwIDAQABo4HqMIHnMIGCBgNV +GQYDVQQKDBJFc2hvcE1pY3Jvc2VydmljZXMwHhcNMjYwNjIzMTEzOTQyWhcNMjcw +NjIzMTEzOTQyWjASMRAwDgYDVQQDDAdjYXRhbG9nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA5GpmC9q86V4wN/cKeAqoVOasVWT5Zq24u4fMp49STVk0 +syPXsljuRNyU6cRxIT7OXOOkm+TTfS1gYVAtuOpK5M92K+US2P7e1X15U4l46UvE +qKpp/g02MJ/w5l88UWQWm+zJOK7BsZnR0WiIgVEebE38GrFHGuHkyFGpdGKBmRq/ +h6c3BLKJkVy9zxaL1UMP1xsVBxUe+HdHIFfUz6EPfoTRd3yRopagSiik6ruwUGXx +7jcYbU+5GE7fwwem1S6vaXo0KrL2+mW2iYZGprqcu5wrNEc7EZubqLiZeIoGXZ2g +cGrOm1p7LlM+1CkY/KDsZofqQf8MfHrkkKCEdG/WLQIDAQABo4HqMIHnMIGCBgNV HREEezB5ggtjYXRhbG9nLmFwaYILY2F0YWxvZy1hcGmCH2NhdGFsb2ctYXBpLmVz aG9wLW1pY3Jvc2VydmljZXOCMWNhdGFsb2ctYXBpLmVzaG9wLW1pY3Jvc2Vydmlj ZXMuc3ZjLmNsdXN0ZXIubG9jYWyCCWxvY2FsaG9zdDALBgNVHQ8EBAMCBaAwEwYD -VR0lBAwwCgYIKwYBBQUHAwEwHQYDVR0OBBYEFMKRTWqTkFL9hpiKXVucT0EvLLV/ -MB8GA1UdIwQYMBaAFPHnrMGpjBx1Vmsank8W4+BWJcYBMA0GCSqGSIb3DQEBCwUA -A4ICAQAe/TYtLkNb900rb593CZzTeaAp0VCDHfobWH4CcDDUcygqgsBTpwIbr4x8 -nN6AovjD0yB6DypuQ7BBxluW4R6Sddraot+qkydZ9Be6ZDQlwDWrzfTu8dESYKQJ -/2yfb31mnzE6whHn+uE/HJkkOKyA3vfUTQfh36DHygWMYnnXWRvwpAvjWT/p39Xx -HJSxTxb/cK+i5kYnKsiTnSQBgP/l1yNm9AzAzk7V/Jytj20N/vtmyAhGo0QHOhY0 -zVZeS77B6ZjQwceWOz/Wh1NAP0KP7Fcv5H2F0qEgM6KalUuYHWzcCXb3NOKlXUw6 -8o/8Hf/rSon6ZcYifmOmkPnKMNB1Xh5L4e+2n9c1v8fqbIV+URDtug9FGXo/uGKZ -T7JFkW5Ri0xT27umvGoLcKX7BBU95sTDVJgk8ZOGD0OFuoiWAGahwwAn5UNeJ+44 -ZCxe0Or6rIyKhhcfdA0Q/hud/EUMJAGWtD3z+ynGkDMDqRqCDKVdxeqrLjOxGops -0lJ45UJoe809gPRGIdkBex+occW1gr5TCb1a/nhdKxWy/FjY/ADpGrvimnM1BlG9 -Fyu7k0xxqIlwboFYg0SDrQL9kOZUie774enTFFnmRHh96PNOo/EmMmLWE5tN8IQJ -ywCsZAOz1yZxZStiYDjqt++V1ozX1Ulb/nlMX81DImXS0NTE4A== +VR0lBAwwCgYIKwYBBQUHAwEwHQYDVR0OBBYEFMS8upEfDvGTUE+zuUc3IDkvTFw8 +MB8GA1UdIwQYMBaAFL8SW3J7YyDeS5LIlfi/4Iq9KCwIMA0GCSqGSIb3DQEBCwUA +A4ICAQA2NibBOh5dfvvDaS5zDFzpwkbg9TrYO1A8aZQvTQUd/a7b02GcjMSsZepk +10W/qiT8IE/jSBqejV+fdcMhACZK9czbsyc/n55mIny5i6gotXDcfdjVykmDDwJg +sgjkOrKKldWgMEBmZT51LXEw+R/CjZK38v1UsuoxFqtsRZSOQyq0jRbjUNuzg9iC +OZU6H5uujgw/AznH8HIODRx1aV8P+EewI3ik1pZLTlZ9m1Wo4tfCJqoQ/AdR891E +8dlcr67CJg7DstPR9YN/pAxtzrsc6C229fqasR7Ph77ZZgIlNOggf+Iypf/9s6HD +qIpdnW7ybfeuwqiftxqPWh3v05nsngrMK9BsEFcDQzo+MXKZe16lWFKpaNrGeOGl +Vb4rGvYV6ARRpUcpYuM5tzSVMbmBPQHpVMRgBjZxKv4DhSX7n5uibewxMb7PSV1a +d5+Yz1L61qIRWDF/2kejN+Z34AMIyrgmGkoOK8gfgEXO8w45xpc7Twy+QkUCtmpX +nIMbPMqf1pt0+RhNkwMzZHlj1TtwBnu+UaKczFcyVpbD6YIeHQACRGreVl7HWaQZ +0S/K404KzyM94xRUvZLRu9JgXRPri+BqA1ckzLz4CJ/PZq+1bwLnvy7zmw9+xnoj +2WfVkK2xfun3m0dvrJFm/eSXp/XEk8aWvBQExgKtnMCj4N8aKw== -----END CERTIFICATE----- diff --git a/src/certificates/catalog.key b/src/certificates/catalog.key index 5c90717..f271abc 100644 --- a/src/certificates/catalog.key +++ b/src/certificates/catalog.key @@ -1,28 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCf809PqfWVEZoW -MQp+a9nCm7/iF83/xAbplh75muQ6Qes2IOAfDqC9REJTDPSQZT3xv1Db2Ich3X1c -MTVHZ2KPziGnd7+Z53t0MHDWW1OdiDz6a+cLPQpHfXMRuWXAcHoX75M5hYnydBFG -ZLXs3WntYZBbBJ3HEAWeeXtUtwVtae/XIO/GssMkSuphEfJGN8meLF05slx3mBaD -zSoj8hQfBy95k8M3MIaxpRhcg3qg3JI2uYoRSBQiidd/cIL4BxemLVZvlFYfh+D+ -Is86CjFnhTjtr6N1FfBjviQqljmWWDr1V/fZK8w14H4o9vwie7KZxSdPorFwimF0 -cUZYfaUzAgMBAAECggEAHMYKzvRuos3jT7mrvxlMt6cICjapDqknay7fzJwyEU7Z -bsfUOZIKlXGpksIiXrVvwsTdWWcmzA9JpWOOx5UQFHmK8VLn61pKiZjLO6x7Krwe -6BewHQPyjPDC2f3lkYxKUnL9I5xjt/NsRiMI3R7pltP1wYHfljdKI3uMFa3E8q0S -RzhUXDPkcR9ZXQcH0tk+B/DoDEO9BaTRVdLSOHrwcOZpkaddWnl1hpGX+SmoVU8y -eQzYcmoLZAMzptirugGljNLotHW3vjOJ54dHZlJTYPhCZmbhR2if4COZALHWVOOK -5MM9s1XI2Va06MqHCEDhgRfdmzVdJt+OoUeCZOZACQKBgQDhZ+TvnC4/D2RopDCM -c8jEIxyrEIOIzXUGcEFCOxrtZAN2YqWceEOOM5qbzjo13rb9REirbYFhCy0Akzjc -gP+TQtuSCYOixbPvfxLg1TVz9Dc+1FhQ8JL2PBBkNm1tMTU3496ug+wnDit6m3JP -cTqKYzA6QSt00tSdjsvJVz3RSwKBgQC1qQ6a9JApmRyx6d0iVjdImG5hkJR0PnLc -8nYi7BrebPR9u3XjC1eWa103hUst9YsyxYdovJW6M5FD1x1wiKc5YHQ6IBIxyKa4 -nUuaf6z/ppRrtxmNYO9YxOEnuwheHUl+jO1ZkA/b5N6UlQ3x6Uo9KDtAsrlInm7T -IhXCDBpyuQKBgCgUNiPYzGxQC1WD5FIFAGzHpYBRRmIbzjQf36qsIcSWJPt23OWu -iKyPRm1vxO/xMu5jptw8c2XS++R/SPwEP+1qVOppoKtfpffuy2eI4aFFilE0pqN1 -s1vvICcBeoGQ31qZvO2g7WugXGDHpRK1Gmii7F9fWR/DoSSG0HtzdL1zAoGAUni6 -ybyICmqZrWfn3ePYW1vgmOijjRag3RAyc+5O0HYUlVRa08XdcMuzWTZpiCb2mAk3 -TWR4cT1iELODiQhxKspQWecfe3yFvEClBzI5nyLINRK+RgIhB2LyeTAfP2L6b7qZ -MtUFbiY8qqX028O20YcHR3scRQywcagCysLl6vkCgYAUEeMKmcumM/CjQKKouicB -zLbuYMK5czxjb/s+jWawYYggJAg7aMmFy/SBISbP6SjbXgpgmFdQrjdZwwlOdct7 -gL71qoAVZbONPcBjIhCUJhXNxeL+pfnSrX/58Ueom1EWPut7royK+GyAwjWd0ggt -5jsWrHCqhs5HhaEy2CdynQ== +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDkamYL2rzpXjA3 +9wp4CqhU5qxVZPlmrbi7h8ynj1JNWTSzI9eyWO5E3JTpxHEhPs5c46Sb5NN9LWBh +UC246krkz3Yr5RLY/t7VfXlTiXjpS8Soqmn+DTYwn/DmXzxRZBab7Mk4rsGxmdHR +aIiBUR5sTfwasUca4eTIUal0YoGZGr+HpzcEsomRXL3PFovVQw/XGxUHFR74d0cg +V9TPoQ9+hNF3fJGilqBKKKTqu7BQZfHuNxhtT7kYTt/DB6bVLq9pejQqsvb6ZbaJ +hkamupy7nCs0RzsRm5uouJl4igZdnaBwas6bWnsuUz7UKRj8oOxmh+pB/wx8euSQ +oIR0b9YtAgMBAAECggEAJUvOP89Gm2BaxTicR/+Nftdvej4TjxV8nXpOC2oWiTSw +qzOGC8QDm9Dcq9L8me4Uagxtm1rgwYbAPwOFg7UV54iMhhxQWIg9QGTNg7tlt8o8 +YUH6LpZfq87h2evhAHU0T994971pOSOho+zKpTrmmc6eBIm/z37lCWR0I+HVwXbS +qELfJqDXiNU1FIb8DxXIsYDmd3ApXKEFy1o5pxq8B6noxhAxk7JvtNVKk83ENnb6 +Ne53k2QJzFiNKG087TSWaG34mXC94Dxa/VUoAZHejgDGwj5MTrJDdvbtkpBEy6zt +he2RW3Zs1jQBk2Yn+8Ggi/d6TQhDqmK+j8eUXN7vYQKBgQD0IfMnQnuK3SSWH6T/ +SFRdZ9GuV+a8zehAzzftpJYdN22T08txgwrzYMT91f/MnmQKKG/uvDtDNjza2DzU +hJYvdF8+qcmMt52Fz5QOSTU/0WhiZUN7UxvCjhOz3tXeufZ0TUZ4KFYrur8+GJ8Z +Cu/h5heG+jOLjihR4KqH/6nlNQKBgQDvhNzExaLP3ts3XHoflGBQCFT05f9nSnBY +Y0H+PvYbM07TzgMwofk1jasmD96Nr8cuonmwJHIjb2xK5HeVwU7+Y9wWsucWRIv4 +g8fwrLWEV8894ygNChs5XWFA81jVCNR6UjJBCZfoeMwPSr+gQRPP1AyfXOGp3x8j +yq3zWskkGQKBgQCQOaJJdkhAEEc1/Tnfqp5UlCnWoo1oywhDiWfUF+CrH/y3UW8l +/zGv+GJIR22YN5aIPb1qv38PRPKMoyTEtBN5s3k1Lt8oJ62CyNAB5JP1wMO3JXXJ +XJ7QwFi5cZLNwvTrXl+cStAlg2zJxYfwJnry7JjHn/ZlorUFMgHs2EhJZQKBgQDU +bxSXeWqzz0bCzUSLacAae6lOJAfohr8pxa8sXo9NBK6vcJKnuaEcfHAFrCGJrROO +KxCex1RsVVDJA+WEbxUuz0bO4xHOUDGM0uSsc6HypSbsDuLg3cvTjxzIzIxHNjOt +4eUsheOzjh/+mB9pdQ6rT7l6RpjnXztxNTwfELBBUQKBgHXkB0wAo4RsJNjnG/f0 +LxlHvNgWMhRoggWJuEA1F+W72lmEFhc3ULCk8cd2SmeChZ5TVqphCxWJeKXWjQTN +u632Jb/oD7nu37q/oqtk/ya93s3Bbkk19J0+iLz7HBA9yUW9m73rRVGWkcFe2Wgl +YrxbP2G0EzJItaMRmqbvLd9H -----END PRIVATE KEY----- diff --git a/src/certificates/catalog.pfx b/src/certificates/catalog.pfx index c1a515c9b35c2e24a16bb57302058bae45f7b75e..8a031418ca0f1a280b9cbcdf2c08e5914427e4e4 100644 GIT binary patch delta 4226 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
?m&RD18P3hmUG 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 delta 4238 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 diff --git a/src/certificates/eshop-local.crt b/src/certificates/eshop-local.crt new file mode 100644 index 0000000..1c4c59e --- /dev/null +++ b/src/certificates/eshop-local.crt @@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE----- +MIIEdzCCAl+gAwIBAgIUAfT1chDFp31Leol2oRLutw0pchMwDQYJKoZIhvcNAQEL +BQAwRjEnMCUGA1UEAwweRXNob3BNaWNyb3NlcnZpY2VzIEludGVybmFsIENBMRsw +GQYDVQQKDBJFc2hvcE1pY3Jvc2VydmljZXMwHhcNMjYwNjIzMTEzOTQzWhcNMjcw +NjIzMTEzOTQzWjAWMRQwEgYDVQQDDAtlc2hvcC1sb2NhbDCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBALghNfMNWZ+3Yor+Bpc6l6ER2C6zHeLN9YhI+5lB +rds7SohpAG0izehL4f+pf1YnBpybBF9ayHehWpiv4a5aDmQpWMIZGOmL4SCFzLwr +RWE7Mi6mdaBCPxWVd7tlhCMrw46JHlqfY+QFrizZo5rJK8oDJe16lNtNHWuJ0700 +C6TiGJVuRLg4i2ZiOeYXApNON02iqd1PPwwG/Q8tngZBtVLYqymRT3TovLQwqRc/ +1cHChcFV10UuCuWU5iKtpPFx9zLFVSaWwOLPmFp02KcgRW3s2h0pR3YwFFuuxivX +TgqBfjduK4/tVvWviwxKfZH7jIwpjqRUdMue4yuWwbS3+KsCAwEAAaOBjDCBiTAl +BgNVHREEHjAcgg0qLmVzaG9wLmxvY2Fsggtlc2hvcC5sb2NhbDALBgNVHQ8EBAMC +BaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwHQYDVR0OBBYEFARefAb0IBMM7Fa1Wayt +hx+DsVfzMB8GA1UdIwQYMBaAFL8SW3J7YyDeS5LIlfi/4Iq9KCwIMA0GCSqGSIb3 +DQEBCwUAA4ICAQAhIuq+KD5tGzHWd0Vpvftq+Dxe2i9QLcwW2wjsY693Ws/EqIjV +dOfrYSDju+48JVNpysx/fqQtEIjGdMPyPNe6dG/gzYIlvHb52UrBzyha08DbsD+v +pa5t70UZBupCJgaFebrB2tz/prP7QuFGbsN+pMon6eBCWszReqQC4kPWt695NDT2 +NYAc+NIyYYn4IJaOfu3n6wEFkPmF5KnzrfZ6OnH3peRL1USM9KNg1lLDUlmrmYKs +lkl44mlaueTRUJxde86qS80gF2O2IKKJnKwddZ3dSzwtnnstamzHDyGVpRWWMXqQ +wSo3+cscgl1Y7HC9aHEboCS4d0iJAG9S1DrbeojwWz/4sEiFwboEb1TaIy9KijRZ +VbRyvWulBdysuXsMJ9tsorj/VTZG0j+Bhzm4kXx6Gb3P2ifQ+en/JmxoxT/XJE9a +MT1t9J0VBiKmiVPjxyJ1vdDAEAbPOAYA/GAFBxfsJaHFAI2xptamPCqzwj1je07/ +0A26pwZvefEcRJ8Z8md/HHV+0fyojINcYASOHnl5tooljedzjSTvau93RbJQBdD+ +/Y/eGjZbKsCV+eE5A8R1kFgIda0EZ8z3J2Ae38RiHfzFK0q9w8DmqUYFPl5FOq+/ +xtK3BicI9dRMTlKZJZ0OjNTYrrULR0Dh4cj1vhg7I0E1x6nAVdp95FvgZQ== +-----END CERTIFICATE----- diff --git a/src/certificates/eshop-local.key b/src/certificates/eshop-local.key new file mode 100644 index 0000000..86f24f8 --- /dev/null +++ b/src/certificates/eshop-local.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC4ITXzDVmft2KK +/gaXOpehEdgusx3izfWISPuZQa3bO0qIaQBtIs3oS+H/qX9WJwacmwRfWsh3oVqY +r+GuWg5kKVjCGRjpi+Eghcy8K0VhOzIupnWgQj8VlXe7ZYQjK8OOiR5an2PkBa4s +2aOaySvKAyXtepTbTR1ridO9NAuk4hiVbkS4OItmYjnmFwKTTjdNoqndTz8MBv0P +LZ4GQbVS2KspkU906Ly0MKkXP9XBwoXBVddFLgrllOYiraTxcfcyxVUmlsDiz5ha +dNinIEVt7NodKUd2MBRbrsYr104KgX43biuP7Vb1r4sMSn2R+4yMKY6kVHTLnuMr +lsG0t/irAgMBAAECggEAHF6Vkty4NdkJ+FNaTZur+BepQMy9KpBEJ9ri1QKfGFui +yLCw7Z/CrOtgJ0WExo/dv2xM+Koin/f+3u6ebYAXnowWTlWSlo1EQwAKguWB25DE +0xY3olkCoj80wu1JtieMil4LDLhpKh1L8EIaKIOdWRMyGUxdOgrAIS0LsCegMaeW +rUGgg74yKt3qFJjTrJy1LbVUju09IqFQvG+wwrY3gmLKSSLHoZEbuYiD+YCjR4uM +IZzRATTZiEMHhsBRsbN+8crloCSyBJd2OCb5RNaCwTf3VNWxRdu9eo4JF7C0BTta +ijzfk3hPHzPLSXNBmUxoO6a/aSGoELCKqTJfCIlf1QKBgQD8NS480We7mStYw4XM +TMtS6T4iqiABvZ/gn63QtRgoXbGLl2EWZjCTJ1u6lu3YRMXNgHad8kWgKNAKDcNL +H6R85amvmDi02eUQv++msXbDvujeYwFu3UHz8kMRBjHL5zbe/CP47hxAytOQqgav +eqj9pqv0AblMzBYVCfVXApQnLwKBgQC65fp+cSXfZ5kl9Hcq9PrKeJYCkqfamTHf +ohR3RacXlY1uJCsOi3L60kEcpJWpkNfDd8zXFMWWu/6BMotKuK+VRO+MLUvGtoUf +jYJoiUwRAowm6HZCdO3J2Y5MOz1XSxLADGoo405Tv8VqEcgBixISkJWmTO/uWYv9 +ovEVB/LnRQKBgQD2K3JWKo71rSuCGFYgc1SCOOdNLoDPMic7OKCPdjN+MvV5Kui4 +1EXVXDVMisTcs0PeseUVhcQv76YgKg7U5K3IuuJFYm73FzdegfmI2u7xYQYrCrf7 +XjthwLV1iHZSb/w+6hyyfLdXBqI6MbsUzMTl0ClGoegb7ZggMPgnVX0GQQKBgQCQ +sFosaQwY1+sIJynaZ61/8bqwYzjvUon5x1BwxcuFxpGnIvjyWaK56uvdcM0saKWg +/a3nFH2jJAbznl2Xi0LjHGsW6jovrD2DH9pFc4Uf5gj6Vhy3di5ghbxT58ilO8lY +REQrQ03wKBZ89ycPisqC9Mvl4soci9aElRBuZ6j0wQKBgQDQrE9w4bA3dE1+zhBJ +pkNjlbEz+OnIDoh7YIAeP2KJXnoaqlNGFEZfmKXU9OSxvBbg1Zta7pY+oXRw2+tR +kg9Ce1r/X5pN8VInZApDDcClVnZuPAieL2mb7+wvWznztIoMLnnQc1k6UM6BSvp4 +96dc4hr4jGECBO3e49Q/C9KJEg== +-----END PRIVATE KEY----- diff --git a/src/certificates/eshop-local.pfx b/src/certificates/eshop-local.pfx new file mode 100644 index 0000000000000000000000000000000000000000..c8b635b01a0d5dcf583b92415c2743599db4dcf3 GIT binary patch literal 4363 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 literal 0 HcmV?d00001 diff --git a/src/certificates/generate-certs.sh b/src/certificates/generate-certs.sh index 26ff6cb..929573a 100755 --- a/src/certificates/generate-certs.sh +++ b/src/certificates/generate-certs.sh @@ -2,7 +2,7 @@ set -e CERT_DIR="$(cd "$(dirname "$0")" && pwd)" -K8S_CERT_DIR="$(cd "$CERT_DIR/../k8s/00-core/certs" 2>/dev/null && pwd)" +K8S_CERT_DIR="$(cd "$CERT_DIR/../../k8s/base/00-core/certs" 2>/dev/null && pwd || true)" CA_PASSWORD="dev" CERT_PASSWORD="dev" DAYS_VALID=365 @@ -77,9 +77,11 @@ EOF # Clean up intermediate files rm -f "$CERT_DIR/${SERVICE_NAME}.csr" "$CERT_DIR/${SERVICE_NAME}.cnf" - # Copy PFX to k8s certs directory + # Copy PFX, CRT, and KEY to k8s certs directory if [ -d "$K8S_CERT_DIR" ]; then cp "$CERT_DIR/${SERVICE_NAME}.pfx" "$K8S_CERT_DIR/${SERVICE_NAME}.pfx" + cp "$CERT_DIR/${SERVICE_NAME}.crt" "$K8S_CERT_DIR/${SERVICE_NAME}.crt" + cp "$CERT_DIR/${SERVICE_NAME}.key" "$K8S_CERT_DIR/${SERVICE_NAME}.key" echo " -> copied to k8s certs" fi @@ -97,6 +99,7 @@ generate_service_cert "order-command-api" "DNS:order.command.api,DNS:o generate_service_cert "order-query-event-api" "DNS:order.query.api,DNS:order-query-api,DNS:order-query-api.${NS},DNS:order-query-api.${NS}.svc.cluster.local,DNS:localhost" generate_service_cert "order-query-event-processor" "DNS:order.query.eventprocessor,DNS:order-query-eventprocessor,DNS:order-query-eventprocessor.${NS},DNS:order-query-eventprocessor.${NS}.svc.cluster.local,DNS:localhost" generate_service_cert "api-gateway" "DNS:api.gateway,DNS:api-gateway,DNS:api-gateway.${NS},DNS:api-gateway.${NS}.svc.cluster.local,DNS:localhost" +generate_service_cert "eshop-local" "DNS:*.eshop.local,DNS:eshop.local" # Copy CA cert to k8s certs directory if [ -d "$K8S_CERT_DIR" ]; then diff --git a/src/certificates/identity.crt b/src/certificates/identity.crt index 3aa2d49..d2e1655 100644 --- a/src/certificates/identity.crt +++ b/src/certificates/identity.crt @@ -1,28 +1,28 @@ -----BEGIN CERTIFICATE----- -MIIE1jCCAr6gAwIBAgIUAfT1chDFp31Leol2oRLutw0pce0wDQYJKoZIhvcNAQEL +MIIE1jCCAr6gAwIBAgIUAfT1chDFp31Leol2oRLutw0pcg4wDQYJKoZIhvcNAQEL BQAwRjEnMCUGA1UEAwweRXNob3BNaWNyb3NlcnZpY2VzIEludGVybmFsIENBMRsw -GQYDVQQKDBJFc2hvcE1pY3Jvc2VydmljZXMwHhcNMjYwMzE2MTA0MjM3WhcNMjcw -MzE2MTA0MjM3WjATMREwDwYDVQQDDAhpZGVudGl0eTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAKdwaB7tGgWjUjuCJS+tu0QSKy187jVmMc6n2Zzm22uy -b4V2f1ZcAD/ZyOCBNikPcpHKNRiKobeMp8xPXB/UfyenhjS58Riu8z1TCtBPb3OA -MmCNNyNN7qlz3eQrMzbCjWoJjZ973qMjTzP4THWUbnS6yQXk40entuZgeYr0szdJ -+aZQ2rLQ+IEeqf8eF7cnstu4FjDTwLY2fUAszgdjqWHirNeu/MJP/79WZxnBDgKs -DyAakPSQyshg54Oc0Ai7ywMpe6B04VWtPeD2IGox116NH+GuuMN7R9OH0CToX2TA -z6yGF+bvX1gLC2Gm1OYEUIg/AACYSaDXELGGQ4X0U4ECAwEAAaOB7jCB6zCBhgYD +GQYDVQQKDBJFc2hvcE1pY3Jvc2VydmljZXMwHhcNMjYwNjIzMTEzOTQyWhcNMjcw +NjIzMTEzOTQyWjATMREwDwYDVQQDDAhpZGVudGl0eTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBALPOe/+aKn193ifxPb11odvZ8bxPNu3Z6YyT/F8Ase4a +VkN0FfeLYag2P9muu9K32ARs8Yb+Br3ppUaryLhUGrAKiPFaa8d+t9nQFAsVZHD2 +D5qc9EzjNtsEc8xxp0YXEPRfe2cyyeuHWA7Y9424VbUGnysFag8u6cjXk/g3GY+R +kwqUymAAPEstldfc0pyRQ66VNDE+ACKgW5CpphaLQmRUDGvhCKo8qxgTVMM5BOJi +wUxE9bpzSJJfP6+Z8nQl17Xdd9tg8grUyY8TLMhZZinYFL9Rr9ThLBAKnNhiPdCz +CW6Fd4XSAzJvSkaaXG8oVmoxqn1LQMW5PqEorFnp0f0CAwEAAaOB7jCB6zCBhgYD VR0RBH8wfYIMaWRlbnRpdHkuYXBpggxpZGVudGl0eS1hcGmCIGlkZW50aXR5LWFw aS5lc2hvcC1taWNyb3NlcnZpY2VzgjJpZGVudGl0eS1hcGkuZXNob3AtbWljcm9z ZXJ2aWNlcy5zdmMuY2x1c3Rlci5sb2NhbIIJbG9jYWxob3N0MAsGA1UdDwQEAwIF -oDATBgNVHSUEDDAKBggrBgEFBQcDATAdBgNVHQ4EFgQUHJr5E7LeI46GFhlP+4YJ -EAJixGowHwYDVR0jBBgwFoAU8eeswamMHHVWaxqeTxbj4FYlxgEwDQYJKoZIhvcN -AQELBQADggIBAIFi9xJaGSWmYv7BFb0QQxr3ZNCHVquPD+s7UYdyxmG64fkcvA0C -/6UjqmO24IHibLD8ScIRbW2mg6g6QIS8AJx/Eix0sqfFKi7SwhNVKk7UrlYmILcr -thGe2PiQjXq32p/4C4mdSuzUL2aLO0OjUrVqH+scwVK5HU4NQpTdhF96RZaHQ4+k -NJ4G8OXUvuoOuZFRN8U6ihV4vUrV3A+t8qoDOJoxcUvfjohwZoUNsczyTXCe06ER -Mujn35XbX1ruDH+l04RuhbDFpjkJtaLGIqFvrGNErNxXKltZC+uBQ345NjmEBb9H -D52MF6ODhm4bdxc65OVzr7axI6yBWjhNTwy0lsu4lAUuX5cH4qpaCEkpe9wnTzuP -7p9nnMxS0q87D2ssf7JDUKjbHKOvjHKbWlqi+gQJb9VPnHTsXWTt/jWQCASO84KZ -IFrNBFdh0m2MTUHfNClCFnEBzylGT8PmtnOQxFNoX4h2fMpqmvahQCuhQy98/3hf -FB6eqTGjBzdUTdRgWYpKeO9/BGBIkRy97AGwSq54/kNIspgF4DSHtq/N/2lwbpF2 -OKhjgwQIWGCE8WzErBOsTK+ULPh4IwOtCjZB6h4hEjd7Es1rhbdzw3muzGoQf8db -f66FEqMIMaYctsnRvkpMcGEWTgzPp0lnKiX9wLVKnTgDPkLof0d5k7Zp +oDATBgNVHSUEDDAKBggrBgEFBQcDATAdBgNVHQ4EFgQUM3ZPspqN320a7PYFjuej +o4ksmvowHwYDVR0jBBgwFoAUvxJbcntjIN5LksiV+L/gir0oLAgwDQYJKoZIhvcN +AQELBQADggIBAIl5IQ4WuhmOaT4NE427n1b1GnjO3nYSQ1ZNuCFFlpm192xrx6pw +2h9R7LkssPR3cytSkRFn98zsNIW7tFT+EqoaUifRgQetHwJpddAylbFGFaxaRLRK +cgfwPU1I/H9pyag9o8z17x+uJuIpcy90l6nEeLda1e5Jqlh6MJcyzRx7GS+ioInh +rAv4ntIT8RqLvXaGAwIJyrrBepqLuiFUjxFSPmrb3oBOCxMyENue/0hNQheG3ZvF +6Tu9jGT11sUSt/rnLl9HUHZvaGbCIIhuvCbrtUPzN+WFfQvTEgbz6bxIwRWw3Edd +A2dshHndxWkIo5Ys1Te9E5VYXm3uBcB7K6OqZMEdIPN0Vfh7VBD2iMvgmtQrlVS8 +/tm57Zj51y+qEYlMjfdW8psNDWkiXqIReLcIWGwiYSkq9kjNHz7SqwDrg8/vX24i +cfRXXqETWdDcEtg7bB6nbN0Ual9p9+JUug/q5fGzEEXBQKaU6xuZypAglVig0wAr +3+Sp6TfQmcClvny91pnFzeaz11Ok58LDR9aJpoDJ0i6dsRvlFX56+y8EnWVIP2HD +Tt0KlmgeGD5jwbM0nPppZe5rAbfcekwqpTLW+7lsL8hrrgvKO2K7lqqFnBQNpXWf +4RVAY8R+hHizObBpAWI6XEG0g5DQNbQRC4h2TDoZiHU3hwqH1e0niaFN -----END CERTIFICATE----- diff --git a/src/certificates/identity.key b/src/certificates/identity.key index a01e951..d4cbf30 100644 --- a/src/certificates/identity.key +++ b/src/certificates/identity.key @@ -1,28 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCncGge7RoFo1I7 -giUvrbtEEistfO41ZjHOp9mc5ttrsm+Fdn9WXAA/2cjggTYpD3KRyjUYiqG3jKfM -T1wf1H8np4Y0ufEYrvM9UwrQT29zgDJgjTcjTe6pc93kKzM2wo1qCY2fe96jI08z -+Ex1lG50uskF5ONHp7bmYHmK9LM3SfmmUNqy0PiBHqn/Hhe3J7LbuBYw08C2Nn1A -LM4HY6lh4qzXrvzCT/+/VmcZwQ4CrA8gGpD0kMrIYOeDnNAIu8sDKXugdOFVrT3g -9iBqMddejR/hrrjDe0fTh9Ak6F9kwM+shhfm719YCwthptTmBFCIPwAAmEmg1xCx -hkOF9FOBAgMBAAECggEADCkHHNDgMg7glOMQr4/k4O6XXW48cBsgDKfGz4T6JE4R -GJ6opJVZrMl0s+5aaDy/l7w5YzMFR+rykE1mrcadZfw+DFQBQSdKkdZ3O3X7bIZf -0kCLQ7iAF+Uq9SxYg7Z5Nf1j4FRrEMrKkKYMqoDpTTe4DAIpqf1xlHVm+lsnbWFH -SMDTfxbD1NvhUc1m8dUrVuLdy0G4oltWylmdzy0Vc/wixc41vAU7wx9X48fJVcWc -fdrAIHO+eGLepNdzSprCSYU40IO48KkDESRUUfP46Pj7OlRxmO14v7m7dzKqJ43/ -RJGdjGDCHt9gLrlNV5ml6bfuE5TdMZgqaeRDDuxEWQKBgQDTP9I/awLPheVApppI -jb/uymiWZ4RVXk505d+cs45Bzp89CyVhXok0OSV8f/9+IzWbiQP19iIvIgBl3ozE -mzPJb9hzi7Lo4NsxFzvjgrKe8m7/TPZepwbCU5Yqbv4Kwc2Uy13Kc4NgfNLteenS -fIn173ErYhIfysDEnVEqj73meQKBgQDK6LsWsksz6dHl4HksWmQsVAwu7tvMnFft -C9pyFwchGUk34N6WGYHCXkGW3qVrS6KtFshm56kmuCsiyfmMXpim5dfy1Ghkjv1n -Cfd5m0KVlsTWv/624pI997LsP2XudWz/PbO8XTm4KU9BUxNI8Z+nUp2HTTW+4rNg -xtIImB+zSQKBgGQC3BQAIqWC+4U/Gt3slgiENT23pnQQIM7BIbt7WocXPlZVF45g -hk5+G5w0sQ3Tt4Z6OLDSpV5xF4Ui9rwBymO8mtohMkOEaOF14XmVn+EWX6xokF9B -bjbEAdz3DTikhiLCoRW+2Fzu26FoTWXEZkBT6t0iIfiBMgAjhpDC2qHpAoGBAKKl -vVorHvcFBXiD3/26kzOpR37TfqLb6+sapkbvyIoyj6tX+HRPC+F21pKN9AE2xraC -Xa+HIOLlm8YuKnfnV+vor5p5wxhgOiW/Kn1zBAOOsEgH7LBCm8FKbUTMaPOlcvKC -TjG+dMb3bg1J/1poPHbOVXGgZWWWqPz5QmEbN8XpAoGBAMANfHjgR2X7Ig8KsDUT -qs9a5qFjF0K4GhzMQ3ciegaf9Xcf00aTDL8zq++rYWIc9ZDKa/+t+YJUWM6n40gH -x8hNuQfMSBUvsVElCNkzlms8yN5bRPQhmFTMDACd40URMyt6knR9gcACMOz+Kaqd -xtzz4zLjYDw/usscQnPo4q2b +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCzznv/mip9fd4n +8T29daHb2fG8Tzbt2emMk/xfALHuGlZDdBX3i2GoNj/ZrrvSt9gEbPGG/ga96aVG +q8i4VBqwCojxWmvHfrfZ0BQLFWRw9g+anPRM4zbbBHPMcadGFxD0X3tnMsnrh1gO +2PeNuFW1Bp8rBWoPLunI15P4NxmPkZMKlMpgADxLLZXX3NKckUOulTQxPgAioFuQ +qaYWi0JkVAxr4QiqPKsYE1TDOQTiYsFMRPW6c0iSXz+vmfJ0Jde13XfbYPIK1MmP +EyzIWWYp2BS/Ua/U4SwQCpzYYj3QswluhXeF0gMyb0pGmlxvKFZqMap9S0DFuT6h +KKxZ6dH9AgMBAAECggEACkMISacZsk4BZIP8pl6OmjA+/ySbbNZPrkTxFaNbarLl +f6kIhFDxbGFYO75T6UVLybwSY5MFsHrWtdW7bJjqnJrYhCnJPLpkyyre3sXd4Yjx +jNa7WW4FGFl4AGmJU4Ztr2MjQfMHAIjmnV/qbpPgJ41useZeGx3uAspNUoO87J5/ +BC8+BqHa1MoRDORq430Fh4iykkUUdhSHSCSHicbQOOmG/8N7VAAbzPzJOn39rKn6 +sysziBDQHZfNx8tel8D/KG/Hyhp8DwLWZQcjF7oufQ8UGsAaC3cAq089yzvVNVfp +1sUQRnyz3aCMdYBIJ7Yn4xVHCzP75M6DbyPc5cuawwKBgQDqcZjicZCsJlmu4ZIC +Hm5HkK+zb8HycHz6K1ig9VCeB9FlmlWOUPk5KHGjBMSqtQsltLIsccGnzGnq9dBu +Ai2utnNrcS2S2N6cHbuK+uWZdqfKoybgpU5o6igp1GXP7z6WT9qViKpkjgzOXfLD +RLYXAGQDmnRdXZlOaodlQ1ZZ/wKBgQDEVtKCsPKBViJ+TsBHYQigPbGPhzcGoNtc +F+YnQWMiJv2mqyf0Wc75bXBb50JiP+2Hg6Y7KbFSQRZUWXMBYXfjlG8hz7taACYI +cAapZvksvoZxLPvBLX1GhlyyRB9xMCnlKW78Dj1lFfWOiulQaRzSvhgcJusgmJbZ +gcgI5zE8AwKBgCrqop8JRP+OgapW1qCWq39kSBWj5rAX0XkGSFImthxHuBhOWU0V +G5pQAgVikRHi1GiRnHAwXs/1xonhd8c7lNs/wP8xF7OjCZUwiC1X4oHmS673kN1c +xW7FNpb5r62R0TY45f2rp+2CZ2u7nP4L7P1m7+gM9TJGORM2wxRRcFRHAoGBALti +cb8xygEOiBUsa+6z+VuWBeUKE8ZLt5AJbyuACHEL7YIoUBWxsQv1Gwtbh8vlX3m6 +d+h3PjlWzUzrogtrTtTxUa9fZ1vaUHI1GOaM1LuTixRw7kXMeIfarJWm1qtcYF/K +T5ZYsNfNQXMtuMd5ynyH2NLlgfq2JyKn7pYwsJipAoGAdi4n98uYkeeNJWQl94Yj +au2K0tPcaNGWQY4mBGIa9sCSLo3ne/oaNN5UZyrb5q8nqA/mzHoGehob7slgoJPG +5EmRayk6qY3YL7acxM5aeZkHax1NNTFvQ+pbuIMeQuvCyANyfXCZfvY4nVZZ5Juc +lpo2id20C30XAt6jBfNGVoE= -----END PRIVATE KEY----- diff --git a/src/certificates/identity.pfx b/src/certificates/identity.pfx index 5a1269188faba58267042ec39dea931cbf5238a6..c0eaf0da053687d663fdb08f5967648e1021dd9c 100644 GIT binary patch delta 4238 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 kcz(0DRI;Kk<0!5K5JtBJA`~h($ delta 4238 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 diff --git a/src/certificates/order-command-api.crt b/src/certificates/order-command-api.crt index eaeb2c6..2fa04db 100644 --- a/src/certificates/order-command-api.crt +++ b/src/certificates/order-command-api.crt @@ -1,29 +1,29 @@ -----BEGIN CERTIFICATE----- -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 -XdgCo6p395bpoMh44Wzv5lMIUmx5lTBuP6Z5 +BgEFBQcDATAdBgNVHQ4EFgQULV0p1enE5a6L7//j/m2VO1MtGGkwHwYDVR0jBBgw +FoAUvxJbcntjIN5LksiV+L/gir0oLAgwDQYJKoZIhvcNAQELBQADggIBABEl5UaG +vugX6BrQES/wmCtPXV3MkzsqO5BNhVUMjhKVd0L4z8wtegBPj9TwocIHs8ORX12U +iiuwhYjOicOMFshYPrwgNEwKJLY5L8cWpVOCeVSTzaceXGk2L38H+Hg6G2ndmCTt +aoBKaa0+s6yKsrlXhK9OXointgpIV6qcqdxws5SalEn4cnVSoFLiOQrLiwpplwH8 +Z9GS7WvCH6i6UZh3uX3xkdyDAyoUgX44lT8Drzsqz3hsKfl6JjH/aLLBlk2WJfwl +riHkRXh2qE5ROH7Ho9u1tm/ZcgnnqEHsC9qqJXiRsXd3Z2ctrRf/bBhByoTuUYqD +mJHJSk1sPS8nnsbwBzULXeDzpG2I+NPgDx+SK4fr0gvacHX/FXqu82iajtdErj7x +AFwpR9kZ3TIBexT22XDxKxQmlT8MHruO3FfsbL/XIYBCH1XCZOoKlTJn1d/U0j27 +OQMPAbp/mHEeJqCqHpykLzuvEEruuSgKpgnUD88XM92H08/79vECsyM1wmXxGg0y +QEQUlyvpRavKQJquXpt+RaxUxIIvpdm2K6ddDM/T6wh8NS5QMMBOdL18lIvSDDb/ +Di8RUtb9B1K080aW7S3I1ToIPbphrcQb4PZ3x3Cv8+UymFUzhhy59HkF9Txu9PaX +8JhSG+qYFhRdjpCELaZAAicYIxC9PtbY7lAK -----END CERTIFICATE----- diff --git a/src/certificates/order-command-api.key b/src/certificates/order-command-api.key index 2430d19..fc78cab 100644 --- a/src/certificates/order-command-api.key +++ b/src/certificates/order-command-api.key @@ -1,28 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIIEugIBADANBgkqhkiG9w0BAQEFAASCBKQwggSgAgEAAoIBAQC50b3x7jFjVuwY -4C9C0wq5c9UpL4Gm81SwaWuiHb0TyG/GJ2an/Ku85if3jCV1MmNK+kHA64NkAb9+ -01tDcmeEH8YJSKUHlSY+h7UtjkMoS0eXdwnFthDFlZ60JkoqCrET/IifRlApk20P -3tJHYp7iYbRRlx0PTKiJAuF09OFo8zaNhLn7z7l9aL7gZaYME/oYen1AuatnnXNB -7LFcUx9sBGaxkKGv1orC4NrYus6iY3Hj6VHHoW0f9hxADp7hOlWwNSS/OaZT4xm3 -IsjeI76uHz+phlddtUQM1ZaJaDE+3gf49LBM412OoOJnSFNIr+0tNAARkqAtCStH -Z6dF2LtZAgMBAAECgf8KMuS40zeiuv3d8p92B+2GdsWvTGsGpeT3xQpfwD+7uJse -EipdSUSHXTu6RAZTxga9uSIsPzK1xuxED61lny7nBIbWgrf94MX1CdV8CD68tj8c -bF8i3UJvlc8CfuzX5EC1CxWCzl8VnT5NZp4J684DL3O5v5UXjIvLO7Yhy7wKAJY9 -Wq8YHzfs5xDYbjBOp+gOn3B/nVgtNpeoIDUG5M2lRbNx64sWNEF1PrTZD5nJFGyg -KU8Hgbdu8ND3iaus3KUdOUG4eEXRUg/dl6FIfhR0AufH1Hs8T4eXYi7d+ojN85lv -ySio5gblbWSq8B4LKxr94GfyuAev/t9pRTSjD+ECgYEA2qEozfzXpHDOIfM/84kN -xVSyhfcjZyk2Cp51GsVNO/GK8HQTjNVcFkqjzU95ahYEQpn6u9SkIS51KWeVdbaj -WUvlJ0iYMDa5u7POSpKbbp3HyqJdNPVyKqZwBxDly89Ot45QHgT+PyOFlkqucuwx -cIZuK+1P9vymB7ayX+GAjSECgYEA2ZTdhjKVmeFR+tfKkZZNzgbPtEwPYsk0MxVp -Xf4H4pe3Yu4ahYEH08hxY+e/VaIigtkHpyP8RopZDthu5QLcDchMRP7GsmppucR2 -Zb2eNTftDghaxEJh3K6/XoliiRod7dMNHJf+ZWJomhcSszuJhR82sff6hMT3LALX -a6oIbzkCgYA7V/VYfGIYO5poMrvQIgp/3q6amGueq9wEY+CLhLSjKbw56ngICT32 -uwndR85AEnvTjDI32881RoP82iYCjrGmImiwEg9lPuWJYpQDP+o6y08Y3JuKLXlw -xD6yXE7T1JCcWF+81kQg5UZ0dg8GGMCOt56eA8tp0khK3bdrOS2IoQKBgGVumLbu -7f8Go4klADJOt4bMdhe/PYz373XBDZXbzyE7SSq9hW+nb1azoujIKNJq+1u0gXTR -udHIvSvGiiwI4T0rmyKvA0I5iYAormlPtGlq4QAhtO65Y5XVgTE5Ks5vdnRgZ0Rl -NxtcfRcYmocjwkBlBMKCsC8lA3Vo/bQbWENBAoGAG4E6hNK5lhVhE9B794Hk7qhe -3kbTJKJCUrudArJohd3jKyjS7Ba9Gi6uOMBLN26uSUdOJmaM1kiGU8vWGWZxRti/ -Z92NHdzKvicI0Bf5s6uPK83TYXK2qJra9jM5Ch8cW5tD3duvdqMJH/DNLrsbkKXe -8t+58l9SbfrvA/XrnLI= +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDBUMK8OCbGJYlY +6vvQ7+KLNtGj8RX4A1n0Nyw6E/nNYOC1B1nU6+2vlZsyRSPis8JJbIZDp61QZHK0 +bls31wmxelbETS5ckq4iAiil+pLXpLIVXeYYhUhB92i0y+r8fE1jjAGqCVtCiQiB +GwX1brshX9zLYBWlMbhQoYLXJMCrxKk0CZnfhnMj2UiTZqbgKroGn2log4qo4ckK +1fAKSVWpjg1hmr4JN4UeogOSAhO/oUfXqBwrP+1kT9cldSYo3K9eYZzKJHilxRGz +4fKB0M7HBezIBRI9igGIPnhNM1VtZ6r0uXEVNSjb9F0O++Wi+2wVbUJgA4ZTER0/ +hAzu5sL7AgMBAAECggEATrUOBEosZ0KDMEPEMSZqK1ovcrtGwYrDxi3sgNz/OQJ3 +mt0aUxmX1YRpAsepu7SKpxBbfhI3+2JaXWING6ge1zbDOvtdo+1InqoYWLOzs77n +jtGDTHp/l/QemnXn/9KwQ5aOWueiU22tm7sf6vShlg4MvHUreu3KaHHJ7sSU+ZnK +kA/fgmLdJZtuN41QyHEq0C2rL65pKRIDvg9x/6tjpXRctrVfdQPI/9L2AiZpNk5l +P706EY+OIwfv5HV+IABmQVeYy0w0gb2tzYyagf73HlHmLd6bOGlupLMFNNMcIRfk +rB89S2Gp1IR09Rup2G57EStk5BGrD9LSrNDHRfkn8QKBgQD/mmn9kioZFE4jcsRe +V6ZgYpJjTOygzLwNPnkOEpBeKUbixT25pE/8/tUw/1GD8dtvkoYSIA+MLZdVnP0i +yGRsb/2fa+MZWcrJT9mn3W8R/tHFLhVfxRDlAmiDDKRIYvSUjmz46Y1aFNmBvdzO +3hKNM6wh0FPbLwD/abzAVLgcwwKBgQDBnZddHODIshTmLju4DE/btvJZRCq7UHIY +UsPdjaL25e16nZJFxj57rzQugLm4fFAZs1/dmJ6cCg8zAFpwQXw9lIYa6NU4Nfn/ +1AVMM0DAcbtSTpYMfflOvLemrYQnB4N3h8YA95ki40BWHcIVfgP6lVyPnk/XVhZ7 +dT9oPs29aQKBgQCg2XF9yy+G3MpXcG+21v2yhhWNO+llP7HPu9K+UlxbhSpAptMz +Mf3MPim3TdTkbZ0j11dbrKVcF4y2qbZ63xSjUM6QNnqRh3ofuYpFIwo0juE/bsKw +o/j/xMY0Qg5YJz23BvH4qjDz0U8XYH3GCOYvyaa3GLzMoAXGtam8dxPttQKBgQC6 +dFJVKD9M5zp7JSD7sFejhr5CuwPP2bvWsrXPAdxjmq+lOmOn8C8yG1rMQckY4had +eYGjvJtaN9HFUtzFaDsGbqbq+TiE5m44MW1coasE6UH1FJspspNJgTH3QPiYQYMY +tFc5jTgbQfAuPoAvBGk+g2JdKJ9JB62k/RewA3NMqQKBgE0ViRuas9/p9t/8mvxs +wp3SBagnQX47PelfywYSTOLeIowF6yjopCg3By2mWMfq0+2KpkuI3c2Tg26R/9pL +JptMqggygFq/9D+6VVrkgMPevXLzu/1iyDsv8+Uw0xYvwtAX0ib3NGrG1EUEcWud +OTZibfBsbA3aJPz/z83kmniS -----END PRIVATE KEY----- diff --git a/src/certificates/order-command-api.pfx b/src/certificates/order-command-api.pfx index 3397b77faa79c756edc9f9af72c411eefe42a5d4..c9c74a1fd0cd9fd727e1cc74eef6cc959c2746a3 100644 GIT binary patch delta 4357 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 delta 4341 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 j*#6N%rKFJ0Q9$FFq0&00s;sC82mv& diff --git a/src/certificates/order-query-event-api.crt b/src/certificates/order-query-event-api.crt index 1e20d60..26e2c43 100644 --- a/src/certificates/order-query-event-api.crt +++ b/src/certificates/order-query-event-api.crt @@ -1,29 +1,29 @@ -----BEGIN CERTIFICATE----- -MIIE8TCCAtmgAwIBAgIUAfT1chDFp31Leol2oRLutw0pce8wDQYJKoZIhvcNAQEL +MIIE8TCCAtmgAwIBAgIUAfT1chDFp31Leol2oRLutw0pchAwDQYJKoZIhvcNAQEL BQAwRjEnMCUGA1UEAwweRXNob3BNaWNyb3NlcnZpY2VzIEludGVybmFsIENBMRsw -GQYDVQQKDBJFc2hvcE1pY3Jvc2VydmljZXMwHhcNMjYwMzE2MTA0MjM3WhcNMjcw -MzE2MTA0MjM3WjAgMR4wHAYDVQQDDBVvcmRlci1xdWVyeS1ldmVudC1hcGkwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDfEF2wL7+kZFVdLYY7Y45k1YwD -ksTdMwbDBSCVe0X5spzGfXrIiMoTcOQuLodKKnZ8LoAvzJUjq6BrSlxtHWDxOL7/ -tEm241mHPhfoTW2wbZKiOUBQBntq4KnLbv5fSRIg327m2WbOK4KP7XfCiT10Ho1y -G1pDrCkiYjdLZGM3P498COLcH9AjuhRnohz5LwVSy1cMj/f7BGN9wSS43ydjBXDr -HLh5uzl745lNtHyGkTw0x17HYCYShP2tRFIungu8+f/l06tp5x0nqpjJA19oAZo/ -pmIe9GYzxZOf1cjKWVXNAok93rl3+cCWal6+ic+NdPQkrDQYRTXyT7OhM+dfAgMB +GQYDVQQKDBJFc2hvcE1pY3Jvc2VydmljZXMwHhcNMjYwNjIzMTEzOTQzWhcNMjcw +NjIzMTEzOTQzWjAgMR4wHAYDVQQDDBVvcmRlci1xdWVyeS1ldmVudC1hcGkwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC8KvlsA4d0XlVxJdMWeP4uZZEw +Rwpc0z3WF+7HsnL6EJy+V7irnQMiV0PwMGag30nugUpZ6ngyAnT3R93QfUyvdBaL +YlWZtgAaKNZO7ZUXNLlluaG2Mz21uqZ43efSpH9++5JodU7XXt7RynHDISWYveph +5ALTvkH2eDajisQXL4kfMUUcg13os8J/wWtt5Kc9788enDRRu7mR19JVTvYSMsH/ +ri0C0iRzgB9AbWph9GC/w+X5WkbsSvyzIdF6kGKayW/gMry8m7C0ud6vleASidDp +1KcjTouMZjT0z89rX4nyq5NMvJUFmoFBpnx0kbp46RMgARSMXWPvyO94HB8FAgMB AAGjgfwwgfkwgZQGA1UdEQSBjDCBiYIPb3JkZXIucXVlcnkuYXBpgg9vcmRlci1x dWVyeS1hcGmCI29yZGVyLXF1ZXJ5LWFwaS5lc2hvcC1taWNyb3NlcnZpY2VzgjVv cmRlci1xdWVyeS1hcGkuZXNob3AtbWljcm9zZXJ2aWNlcy5zdmMuY2x1c3Rlci5s b2NhbIIJbG9jYWxob3N0MAsGA1UdDwQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcD -ATAdBgNVHQ4EFgQU1ECK6eUYame57RR212wK8+HXntwwHwYDVR0jBBgwFoAU8ees -wamMHHVWaxqeTxbj4FYlxgEwDQYJKoZIhvcNAQELBQADggIBAKb5V5b6Au3kJMPU -bdssU3lbD5wrU02toJjvJ/7KnCQUepzrmTt8EZvwAlPwguBipqrIH9dQ7d5JzUOH -+yFYUvfUlP/H1zwxGpmWe8mGY8fHf9nIDfNqhkNaZVP7xfUjb6xiMS978PW/7KAv -FsaI3UApzl6Lppe5DyuaoGN1Q8lzlz//4QARck+wVQzAuGSr1hMNt4uKK7cHcikJ -iSEpUsQsJp7NM5FXJSpkQsgJX0iCJMKz8BqnYr5CXOxgMa0FHyFo+t5iS4ShGq8I -cjONBVyYKcBXWhMM7yv6JyQumlm00GSmqOkZW+9iGRTfgF+UDjwe2CHDiz4hdqAf -hhLziXBGW5CZXyfcSJyLpeS1+vyNfnewhk2+cHQ33IKDUSFQbnrPimBQC1avf8/g -xIuA8Z2VQiy//gRlXOpy7OJbxcahHaZtIj1KojY2SlUduk5ycJP23rAr7u756fJZ -DbmwQYnlogb8A3ubzxqSHtatDcivdmLqsLQy94I0mUJwgbpQPjTFB20B4hwtfMFS -XPUV+0BA7HhwdnRwO4ouG8/rr3yXjKuFiJMj/aft76VhLOqARKEan2n9jkqQjtnT -nDBJqJbxSbnkmafFYGX3b6MnS92W+N7s3aLoyBr8Nw3IsRA1MRkS0uA0KOSPKN0i -0pNW+Bfyr41BkwvrLiqQgvdyZrbk +ATAdBgNVHQ4EFgQU1bHHMbC+suaVUJTbuwhzhzwDXecwHwYDVR0jBBgwFoAUvxJb +cntjIN5LksiV+L/gir0oLAgwDQYJKoZIhvcNAQELBQADggIBADad1CMGhD+bBDtK +QBuvTpWhiMsmhUPF65cMQbslIMKf6TG98bCCZz13Uj7Iul7pEMz8vtUIela6tuMW +Kzi0DP0iNPrQRQ9bDswGGyyYtzM6ghYyuzVm+8WspT6RIiIIhmjnFHHFkN7wGugK ++pb274Om1W1cMdJWjOiKyF2TiWVe6JSNn27Qj8ghHF90JS+BAwmqnfyushQQKJX0 +Nd/mcTJKm6JapNaADFkBuM3u4B4BT+exDrcwbIMXgMjE2WZ4E42lluCQ4GI3tVET +8b26MtzBQGks0seaaHEj2wMUzSDWciBnMH7YSObbWj2WBsitGd6c1/fvkVFWbA68 +YoPO+6Fe4c/FP3UI8MxOei5cexGzb6tCHI/duRRp3g/B7jSKQ3riCZrZmAXxL7sE +ZZPPEUMD/Q94YC0Cm/EntHaVcSVOSxKpbznCY5SAPbRXvqTdXhXU3IRjNfn9kBGP +q9DIAf1vohtGmKFh0CRsOt0XK80mvODY5iOSYpX4uP5AmURep+jSn6CgWE+CVSEg +DnRqFapN9AW1/u3XP2eAU6A8OPg2Ib1PDRYiI+NXrPE7nMrBjXTQA/jQ0vPit+te +7B4caOloq8wSKm8UJ0VDaDzO9vQPu/V1txezD8s8F/zun2O69HEHdaQm1UIW7s7g +UhukI2BgG/JFKkP3j17C6ubup/Ru -----END CERTIFICATE----- diff --git a/src/certificates/order-query-event-api.key b/src/certificates/order-query-event-api.key index 4ddb97f..27ca406 100644 --- a/src/certificates/order-query-event-api.key +++ b/src/certificates/order-query-event-api.key @@ -1,28 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDfEF2wL7+kZFVd -LYY7Y45k1YwDksTdMwbDBSCVe0X5spzGfXrIiMoTcOQuLodKKnZ8LoAvzJUjq6Br -SlxtHWDxOL7/tEm241mHPhfoTW2wbZKiOUBQBntq4KnLbv5fSRIg327m2WbOK4KP -7XfCiT10Ho1yG1pDrCkiYjdLZGM3P498COLcH9AjuhRnohz5LwVSy1cMj/f7BGN9 -wSS43ydjBXDrHLh5uzl745lNtHyGkTw0x17HYCYShP2tRFIungu8+f/l06tp5x0n -qpjJA19oAZo/pmIe9GYzxZOf1cjKWVXNAok93rl3+cCWal6+ic+NdPQkrDQYRTXy -T7OhM+dfAgMBAAECggEAUKtlhnMuNnCGoqT1F4NAmtzTvvMUOP7cIik3iHfFbbEX -m30Dq4Q0uGUqUD1Jdhv3L5/NgfvVr8nAwSxqUpe+WF5yTJ1Rz09XMF7XXI6r7ZMi -5YIY7Rf7CELphQXF/oW5haPoQpo64LLBi/WQSw1A6T6nXq3frfuUALhOUPikHPU1 -mqsdRJT8mf5J7Ler3IEA4T0JAdl6Sb4TB6I4Vd4tHa9Lg/h9hxoDgmaW2S14dpHF -zpT/Dv7mS9leZYfY1oWw/fc6nRxXACVVLcbWpRH5oJdQLiupzZFhtZg4SDB4kgi+ -5L8ybfQd+4hvHGR5k9nJChddVOeWC7FUjPZaHYaNWQKBgQD5RTdeGTLxoxUlXaNA -l188+UsdY+/aI5M00t+UbY29ksxvqIWPa9feGcytMXBnERzp07Y6oTM7qS9+Vxmp -Z6aGQd/bxlEUu/DoNaB9jFXjmFixbR+RNOhvuS4J5EQ4duka1J5fKZ01Ne/R3+uJ -wccUt4NkVA3w6JozBE6xxH6fOwKBgQDlFgdoGSYUz7Md3MDo2EUtU+VdhSCbRh5R -VPGdV1WSbXDjadeS0wa++hKWnEHRxyF450C2tgxeT7eR562eyDbPopFC+oFugSeW -J8aB+rU1tH7PCNvHYpNf9sZD9o6KwgHXsNqOBXPMC/ac5/28aTkD6w4+yr5EXEtt -wC+oLkseLQKBgQDPGNucWVFDAtxBtB87PchJj1EB9RLEaIQYAg7xcWeulfU124xD -kTTC+SpcxlN9vfEIr/WZlm5LZg/oZpMSdOQcbUSAgq7AjDjlpBBX3q1JLzyZBHGS -oaNvlymR3E11oA2hVf7ST2+mUs6RzvkQ9abiJmmKhG8ktQvP0QdUmE0fGwKBgGUP -Hb9XcMw3gA3JZ7SQS5weaY2i/+pfuVopvdiqQU6yRt2bwIS94Tj4eqDEV+jiDqsW -YR75GmW0hwevi5EDQ+K/FZPVjKmiAkOkUlbesXf6owJUJxhDLT5lT7uFlgYyZbuw -Agoq75VxJZ68XNv0EzneRM+AgwUHLiNBaASqP2sVAoGATnwnFN2KqB7HuoH95Pzy -k3VbfGpqBnYAewUwwT0SQu4Vn4P0u0SwlJXgMHT44TDSZ+qRCoGsvEC6PaPlgCqa -oMM0otCTnO5dU3eq8Vo6BPwrKG710ThAQsX/tKW5F0BsBOGPvgV+3ssrYUyEbYrW -k3CBqDUpTNJuHdg3lPZeuX0= +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC8KvlsA4d0XlVx +JdMWeP4uZZEwRwpc0z3WF+7HsnL6EJy+V7irnQMiV0PwMGag30nugUpZ6ngyAnT3 +R93QfUyvdBaLYlWZtgAaKNZO7ZUXNLlluaG2Mz21uqZ43efSpH9++5JodU7XXt7R +ynHDISWYveph5ALTvkH2eDajisQXL4kfMUUcg13os8J/wWtt5Kc9788enDRRu7mR +19JVTvYSMsH/ri0C0iRzgB9AbWph9GC/w+X5WkbsSvyzIdF6kGKayW/gMry8m7C0 +ud6vleASidDp1KcjTouMZjT0z89rX4nyq5NMvJUFmoFBpnx0kbp46RMgARSMXWPv +yO94HB8FAgMBAAECggEAAIK5JQ6LmE7/09wHd95+fORx+BI4e4dOOgD1uRO2PxDH +xoN17cjlPu6Pyy/ScEbS2RayogGIvHgBvPPauZiRc/UKCtKxCuCYNpOPfoZwbfzx +MNu69HcTCIwRkuJLrgICX5DLghGP1A+x/2c/4+JSSz94SpydpL+PYPdM2XV3sg/O +uKTJK4kzcO2TaKRwfm4Cs5uSOJ55K/KTGqdpslPThmLr9ReoU5cqO1C8sEyltcIt +eviZ5PLSH7gAzqJFWR8xumsZvk5KLbnMwo3exA5Vd4W5uMu1P5bXSQOhgbQIUKhN +bC3sC75/yJea+xHwjZIajh7sck8xkR/TsWpz9XXaWQKBgQDcyY9ic+vguJVCO54n +hF7bDmJ8U+Iewn2jAIuiDOmaigNYVUy4k7CSohr4Y4yguO+FnJ1l20HutznK68X5 +R9d2NKWPJzUUfyZ3XS0fBPAjAcBhGrE9AaKdNZsGNjeu/BC2m9oxkgHyj/VTEbFF +lfwKNF2v6PzkKhQduQZZyOJY/QKBgQDaLZs+iK2wY7KiyTbcdm9enrbPGXiIQDlV +7sNfE+V2SW530s6JBUY+JO0ZR6GDDG2pVdgsj1r1C+7Tu0yc1SvcVNNlyZGB7eOl +y8+nFj5/4agxz9CoGjO0ZSonbSOUZOs/LXFDsb1mzuel+2PM13MtY70Fv9jTJ+1F +Sej7SbrgqQKBgQCYmrCCikE1OB/igbaU9cdifZTQ/mHChQe1zMC2p1onuNELExpO +UbawA1/E43nl9S2JGnEoX944k2hcu45A+MkSKN1uDtl/a0s5Iav4Tr90UteXxo1O +73xoUQ7vwjXGuu8KaLrtnE/ASoR0gDwZLsvgecVvuwhg5Dy3NpYPJOxeOQKBgQCW +PdWsCF7jGqSG6Nz4kC49EDp+/uE7ok5ZWKP9MyxOel6x8N79CD7IyJDlWahlIAfc +FhtZBBb0rBT4hQBK95jOjzNL4rRqrrCXGXSTcQP0+CXkt2DOgcydKxUONV/M7nn4 +9YgLv7fXth9a83RUOQE9fnNKJERhlBsWHcFsWedwkQKBgDjYIUTJcrBI1GnpQ93v +ckOHEx2FCshxvd75e0g5j6c43pnNHwfuTI5sBHfuivNZWEQMmLFbSe2zzBC4iRiN +I1L3fbu89FilkyzP/EdSTV1GFn4f7pGhpE/uM47t96e+10ETUjvVT7F6DVOX/UsI +vrS/Z9Jq94bmEH/jWVkT7N0T -----END PRIVATE KEY----- diff --git a/src/certificates/order-query-event-api.pfx b/src/certificates/order-query-event-api.pfx index b04cdcc0766f02658013aee3052ef0c844f6f74f..dc0c3520b8b9b24b6316f15e134f09ceb1087dc8 100644 GIT binary patch delta 4254 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 A-~a#s delta 4254 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 Ax&QzG diff --git a/src/certificates/order-query-event-processor.crt b/src/certificates/order-query-event-processor.crt index 4acfef7..53401ea 100644 --- a/src/certificates/order-query-event-processor.crt +++ b/src/certificates/order-query-event-processor.crt @@ -1,30 +1,30 @@ -----BEGIN CERTIFICATE----- -MIIFJTCCAw2gAwIBAgIUAfT1chDFp31Leol2oRLutw0pcfAwDQYJKoZIhvcNAQEL +MIIFJTCCAw2gAwIBAgIUAfT1chDFp31Leol2oRLutw0pchEwDQYJKoZIhvcNAQEL BQAwRjEnMCUGA1UEAwweRXNob3BNaWNyb3NlcnZpY2VzIEludGVybmFsIENBMRsw -GQYDVQQKDBJFc2hvcE1pY3Jvc2VydmljZXMwHhcNMjYwMzE2MTA0MjM3WhcNMjcw -MzE2MTA0MjM3WjAmMSQwIgYDVQQDDBtvcmRlci1xdWVyeS1ldmVudC1wcm9jZXNz -b3IwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsIY3t/MJglNeDr/Gb -LzznSf1uustWg1dW6Wv1wbBNgIUWHmXUOAR7LT9OO6gSZZnGGeqAdWHKkomy3RhQ -/nrY0RpyfZPvzqB1DMdKZjdmHM/UlWNx+ljlpSuEP+OGJL43M4irGYl2I5l8IKRP -+/tC6RPAwmuZLJR2MsCMUNfk8k25qka67Qj9xyiv1sICH5an7VTBmbOD7vU8Jex8 -/hd/+KxKgYiLq1BPFDSGoH9KgP5nPt6K5saJ6cyfH59h8WtiAx1W4scfzJ+FnfE7 -DyyC4gYYWkTQXbej1HLRFqzpJ9EfKpXzvJ8MwPwzoFUNFak4/IfpIBQ4yT1s/WUk -ENyDAgMBAAGjggEpMIIBJTCBwAYDVR0RBIG4MIG1ghpvcmRlci5xdWVyeS5ldmVu +GQYDVQQKDBJFc2hvcE1pY3Jvc2VydmljZXMwHhcNMjYwNjIzMTEzOTQzWhcNMjcw +NjIzMTEzOTQzWjAmMSQwIgYDVQQDDBtvcmRlci1xdWVyeS1ldmVudC1wcm9jZXNz +b3IwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDl2JfgFgX9LThdRJ52 +fGktHUZhBq0t9o704ne7KGSD6iq43q3T/QEmMPkFPqbUrEbZPmWB99XnpUKDGMVp +bFjM9BAaK3RcJetv86DTRnOIi6IZh/T9XbyDbmgguhtg0KG3UbSlEKrc8b0uaApJ +Eue0rWoiwOGytH+P9yM4G75WdhjKCa4VN24bqSkgTg+dUeHZE5WSpERKBSU2FHSt +7ctYQ8Yy/dUr6y5Kjuc5bOKer3s4e+9Mk2WBm9Fp2lGMAE22fTSH/2i/DAWb/DJa +SLz9tWdLYs9wZq9oiP+0ALAMVAhdo1rjNLCXxPwexTuDxZbpAvCU+yEwAdz6FTLe +AbtnAgMBAAGjggEpMIIBJTCBwAYDVR0RBIG4MIG1ghpvcmRlci5xdWVyeS5ldmVu dHByb2Nlc3NvcoIab3JkZXItcXVlcnktZXZlbnRwcm9jZXNzb3KCLm9yZGVyLXF1 ZXJ5LWV2ZW50cHJvY2Vzc29yLmVzaG9wLW1pY3Jvc2VydmljZXOCQG9yZGVyLXF1 ZXJ5LWV2ZW50cHJvY2Vzc29yLmVzaG9wLW1pY3Jvc2VydmljZXMuc3ZjLmNsdXN0 ZXIubG9jYWyCCWxvY2FsaG9zdDALBgNVHQ8EBAMCBaAwEwYDVR0lBAwwCgYIKwYB -BQUHAwEwHQYDVR0OBBYEFP2BgNEZwqjOHjh0k6Hvi5bRgkF/MB8GA1UdIwQYMBaA -FPHnrMGpjBx1Vmsank8W4+BWJcYBMA0GCSqGSIb3DQEBCwUAA4ICAQAzi7W6dPzU -osoBcG9ts8zf5zrg1fl5QYNd13xjZni1txv4+rAVMyRdQ0Q3d/P4BvSItqrkgdsd -gWpsQ5qy8pq4YUXqbha9RgxrQ4D8GNkT86Uy1Wq8OOu4Vv/BId+iRkP060SC2keO -f+9El00221O2jzIv1puZzGtJptRuOh+bqtJrjAUyQQrS0nfe8Ob7AATIK305HgwN -T7IDbjPLxOwfG12orNTkIR02KTckoyLOhDfinZUs6Ls2sOe3eRsaQYQcVfrGRv+7 -QhILweYGEv3V1dLGnWc2tkmJUvO27fAk0N2t0u9IpvPEJonRdrFdBRbeDmM7RGJ1 -V36xsCyvJy6BONB+bPfdF0Tso1IY+t17+TMP+oyPVNeT0QhXJx48UFlAbvb6fDr9 -eUaZ3GVnjpAWWNRcJcJj/8PR3GjZv4lW0aME4jcL+rE5llaQ9Q8AQGK+umbNEAou -E26hWUJ7oEhQiK8mlmJsqMS94fEvoJvSaPQ+uMUp53A5wpdffSVll+qg4rOlvNqE -SErvG1axr6suoYm1AGHTjExMTRFZYiS7V17PTf6i7SsQVYfxclUUZq6OVuKqMUOZ -ihbTA+/xYEmzPEiwhMRPoK0qRUMa6BGqPm1RHX0ttqFCeSNjYfJDOfCgqOhOzl4o -q7UJpEFQ7z3woojpFVmODTNwP3kYncKM1Q== +BQUHAwEwHQYDVR0OBBYEFF0VPGuHwQ1gBIf5UVZoLQkg7scgMB8GA1UdIwQYMBaA +FL8SW3J7YyDeS5LIlfi/4Iq9KCwIMA0GCSqGSIb3DQEBCwUAA4ICAQBOXSVTrG7c +nZ6iaaSah1aHl0V68gLZLOL03uUcq1HWfx30WU/PgMjyyF4Q+0Jx4E4ooviXSLC4 +lHvJ869Si3urVGmy5NFeimL7KyAUAeHxNt3jcTNWrWXj8RBnnoT1WUmH5x6VBQfn +s2Gx+mC+nHgfoWsoEhUeGGSyoQegbdzNStUy7oKD/YgDbIaHUDpSHN+6Tu7HRRSt +UogV4NcGvCDJoZ1cEH2ZLx667DZ+VLT20vaHOarGda6sal42JJAFwXLMvjjQ7UKp +a59E1jV9n2SMcEWKJsZei8RZg2kjPXQGrQUkX8pRxDROEIBbdflnUqi4PQ4/iz2V +Aasc1zWostOBkncx5+oCe8DA7ZWXRLmaXY2DjOwva9nJXW1w9d1uIBr0N2H3FYxH +PR12Y1qM0A4iAaV1r0hSMOcno83Vx8qcbjSWYmxXdVMT+hORXyy5qzOL95yiaoXL +QaT6NBlY7vxkUtN3a8PLp4OqVzArBE/8rWn0fWkOAIW6G+CPdyx261vbwr4qrCAh +5guRJSu5viopZftsfOc3RmMjplzvqF9ywAFzbvK8ZKfGa79rWzCrEpr0RhbeH1lv +C0ptxYOkETqal5PqUA6MgxW4Ofb9wucXpqTInp8cKOAbxQUNrSQpLQZRvPpD/0mc +vwPeAhSE811NVvJcATYDQgZk3Wflj7h1DQ== -----END CERTIFICATE----- diff --git a/src/certificates/order-query-event-processor.key b/src/certificates/order-query-event-processor.key index f45e4ec..e1910f3 100644 --- a/src/certificates/order-query-event-processor.key +++ b/src/certificates/order-query-event-processor.key @@ -1,28 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCsIY3t/MJglNeD -r/GbLzznSf1uustWg1dW6Wv1wbBNgIUWHmXUOAR7LT9OO6gSZZnGGeqAdWHKkomy -3RhQ/nrY0RpyfZPvzqB1DMdKZjdmHM/UlWNx+ljlpSuEP+OGJL43M4irGYl2I5l8 -IKRP+/tC6RPAwmuZLJR2MsCMUNfk8k25qka67Qj9xyiv1sICH5an7VTBmbOD7vU8 -Jex8/hd/+KxKgYiLq1BPFDSGoH9KgP5nPt6K5saJ6cyfH59h8WtiAx1W4scfzJ+F -nfE7DyyC4gYYWkTQXbej1HLRFqzpJ9EfKpXzvJ8MwPwzoFUNFak4/IfpIBQ4yT1s -/WUkENyDAgMBAAECggEADNM3Mvs5NF8Cq8IpO0nKvOTraBus2NZSZJxhud7jlvKz -d9Ft/uDpnI/jfp29SRme2n7F1SppzeEbN2N301kSqCL0WIF4y05W8EGye52gFRCi -f5Fd5nkjtICY/HKSLkWAkrZZQX5WmqHOZsw70eXRc8vP9/XEdJY4vZHMfOftHha8 -YMgsqsHJ3v/6gXRNUOP0diPtm7qxNwbhtMr/fFK3QhtbJDhzUszDawmyGvFWVv8Z -y2StPfK4wze23x0hsJbSwmFpgouMrSAV3tka/OgqbgPwfQEO39JsAOQ9Fpp22K2P -MJglAYT4Tg+5iMwm+/IRYF0AskbGhNq45Lz1LuKpOQKBgQDVPd331m9vE2+j1XT6 -ppbh9kdBIEv9CGnEIzdoADenhkJyEKNPBMvuBZx2N1nSBBta7ttz6FxhlB/tGrYO -T3GjYdYQIwTq46Q0QfEhMW2Fy1V51POnkLxNZMJ15bp9DOFaK5rozxIyz6h9tw6v -oC7OeMAVwfc5NpA4PY+NatZmbwKBgQDOpWVe8FCw47EJkzJKyAsSo0NsMme4LMUq -nRAOWl9jZv1OHjVG71rJAGD7kChBJ0jrbSTxZDUBnVHPpBP2y3yDNMBFkEq9NyMt -Mcx8raq0E4nmcLirJd+aM1BgfHLPzp9+BV5qhsHrUc1+F5yCjnPCxO9FQtDyTjqb -NOOmWIJVLQKBgQCo7cAAbKIOrqkMczeesYZqL742+6z3IUkYloV4IGP2lMfisQeO -u9AKGevfQu4nEBXTrdGwOu2kZ8H7BeQf5hOySPlaA0QMCJa2x16M2ylWisSGJYt4 -vZJPBXmACKP6GNAVrOGleRWDpzpljTVXMGCkNMiG9Ag0DOOnii1E7NQ4hQKBgFaM -zaVy78j2xLqm7SSHHqQiv2V8wxZPohEUEZqBXXxrsWJboqLgM10GjJgwq7uGMbNx -VkzIVK8lbhOSvE3csnzdxj4cjkEr687NEcGSl3Gu0U40HhSI21thbKPM2+WPvBtz -MjVZ1bSy4WeTihjggzmrdC/FKXCjNUa2YzbT0VrNAoGBALTOdBvA7tCG3y52XcZ0 -S44ua6uLLUVP8dzVCh4esa2OVYEH1/bMCkL4UFj2LCVYxsjsXS5+fSMYD+Sv+6Nh -xxAbzekTNh7wm8YTxGSaNt73jjSHo+8BcmFbh3pg0KZJypYXdjz/6aZUqD0NEtz3 -/4BEev/6oDyrWE+0gIlXbSuL +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDl2JfgFgX9LThd +RJ52fGktHUZhBq0t9o704ne7KGSD6iq43q3T/QEmMPkFPqbUrEbZPmWB99XnpUKD +GMVpbFjM9BAaK3RcJetv86DTRnOIi6IZh/T9XbyDbmgguhtg0KG3UbSlEKrc8b0u +aApJEue0rWoiwOGytH+P9yM4G75WdhjKCa4VN24bqSkgTg+dUeHZE5WSpERKBSU2 +FHSt7ctYQ8Yy/dUr6y5Kjuc5bOKer3s4e+9Mk2WBm9Fp2lGMAE22fTSH/2i/DAWb +/DJaSLz9tWdLYs9wZq9oiP+0ALAMVAhdo1rjNLCXxPwexTuDxZbpAvCU+yEwAdz6 +FTLeAbtnAgMBAAECggEAKoIOwJZCIEszL+inZ+FlcD8IS5x4/dWqJbcWjqoPQOhX +Y15nhpu1kTMgcuxd3VpJNhdYnZtQ16kULnuv0uoDWFBRBA4CVKJ8svU7SqeuaVPt +tEwVLqCd4y7Rmi/hLVwYdHdrcdWty/P3WXRLZq1U5fDmfqvuceb46o652EAlSQbv +lX+sJeSo5K3aVvUvwgVZaTIj+uM8Wd9yc6UMPneBAEEKK63jkn0a5kh4bqO1aiUv +64effCk9tUbb/fLdGza0OFseY4iX9xkWD2lYXLp1COt7RrKJWVx+ArRiutAZoylw +yxMB1/ovKywodUx4kDFiLIiLUvoP6DXxsRvuE7/yXQKBgQD6JRJTLhgjYI/iVfc/ +UX1m9oT3dsrJBgeXr6Mu07Uta2KK7sj484qct/mc4EPJ1Li2DLkCb/lQaBew13Wv +ZjNupfxqgIHG0T4b22xHnR1nWGiCrEU3/C04Ffnp1mlG9u6t2BUoMo35sliW8Tlz +BkpnlM7ENB2FBGZ1YIAE4fgQswKBgQDrOeL9uZ7eZJIEBQNsJT0+KRRwJfuxYDva +iAFlYCVNXQsVuANTW29K4dUy4VjqB5KMbJTkJKmsM136Ai4pGaYlnmNvoIvTdvmk +KxbStkQ1toY+X1rB+9jpvh78Xjkwjr8RKCE+7h0LCSHt9cF57R5e0mCi9pCavSgb +G7VHrLocfQKBgQDz7GCBMkqhfNDx8chHO0ygsbWZpoI6IqIWvVPQHuvmnXebaRwa +/0nkZtaGrn4L+14fUCq9ALnKOacYcBI3dt6igEOzCxsB6Bq7iW1+K+x3UVOgUSKy +ZDsoHO31o3pHlBXM+hAvgZTGr64JirLtwm2dshMqanN6uX676N0NZdjDVwKBgQC9 +lBrYqMhcrqtr5+p5N44jUhJxzHsM2uWCW8jcPl/x+QIdEABGJ1QMAvTEHBCAFXhM +Cpr5QH8rFP8xpp4za8OXYA7+AWOQG7xZTo0HZ/STYbbSACHyY5rPz/XDKeFnvDRL +jI8228u2gDbDRSUYsj2e6GkQDi4/OCJhrrQsvw4ENQKBgQDkgsK6bmglzOhm65H1 +0TFU6nxL7c2D58+y4N9GJzx3tblEPMsX1EHQTYjIeXnoJe0l/l00yOA0HzzldfGs +VktK9kPk3IB4y/lEknDSK27ICnr8w2lvVekDNhsdvaQhxq6ERk7+4zZmkB4jm0Ys +UgpJoDtXjjH1h2htD3A6Qgl00g== -----END PRIVATE KEY----- diff --git a/src/certificates/order-query-event-processor.pfx b/src/certificates/order-query-event-processor.pfx index 1ffd05f1766f53a506d698ec4b86cf60c7c1ec28..313e707febe4e1087578d9440703e0b216d9624e 100644 GIT binary patch delta 4301 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 delta 4301 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 v*ith#X067Z!rLZnb-+p Date: Thu, 25 Jun 2026 00:19:37 +0200 Subject: [PATCH 2/2] temporarily disabling linter.yml --- .github/workflows/linter.yml | 110 +++++++++++++++++------------------ 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 81b6ab3..bd463dc 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -1,60 +1,60 @@ ---- - ################################# - ################################# - ## Super Linter GitHub Actions ## - ################################# - ################################# - name: Lint Code Base +# --- +# ################################# +# ################################# +# ## Super Linter GitHub Actions ## +# ################################# +# ################################# +# name: Lint Code Base - ############################# - # Start the job on all push # - ############################# - on: - push: - branches-ignore: [main] - # Remove the line above to run when pushing to master +# ############################# +# # Start the job on all push # +# ############################# +# on: +# push: +# branches-ignore: [main] +# # Remove the line above to run when pushing to master - ############### - # Set the Job # - ############### - jobs: - build: - # Name the Job - name: Lint Code Base - # Set the agent to run on - runs-on: ubuntu-latest +# ############### +# # Set the Job # +# ############### +# jobs: +# build: +# # Name the Job +# name: Lint Code Base +# # Set the agent to run on +# runs-on: ubuntu-latest - ############################################ - # Grant status permission for MULTI_STATUS # - ############################################ - permissions: - contents: read - packages: read - statuses: write +# ############################################ +# # Grant status permission for MULTI_STATUS # +# ############################################ +# permissions: +# contents: read +# packages: read +# statuses: write - ################## - # Load all steps # - ################## - steps: - ########################## - # Checkout the code base # - ########################## - - name: Checkout Code - uses: actions/checkout@v3 - with: - # Full git history is needed to get a proper - # list of changed files within `super-linter` - fetch-depth: 0 +# ################## +# # Load all steps # +# ################## +# steps: +# ########################## +# # Checkout the code base # +# ########################## +# - name: Checkout Code +# uses: actions/checkout@v3 +# with: +# # Full git history is needed to get a proper +# # list of changed files within `super-linter` +# fetch-depth: 0 - ################################ - # Run Linter against code base # - ################################ - - name: Lint Code Base - uses: super-linter/super-linter@v5 - env: - VALIDATE_ALL_CODEBASE: false - DEFAULT_BRANCH: main - VALIDATE_EDITORCONFIG: true - LINTER_RULES_PATH: / - EDITORCONFIG_FILE_NAME: .editorconfig - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# ################################ +# # Run Linter against code base # +# ################################ +# - name: Lint Code Base +# uses: super-linter/super-linter@v5 +# env: +# VALIDATE_ALL_CODEBASE: false +# DEFAULT_BRANCH: main +# VALIDATE_EDITORCONFIG: true +# LINTER_RULES_PATH: / +# EDITORCONFIG_FILE_NAME: .editorconfig +# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}