diff --git a/devbox.json b/devbox.json new file mode 100644 index 0000000..045ef14 --- /dev/null +++ b/devbox.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.14.0/.schema/devbox.schema.json", + "packages": ["nodejs@latest"], + "shell": { + "init_hook": [ + "echo 'Welcome to devbox!' > /dev/null" + ], + "scripts": { + "test": [ + "echo \"Error: no test specified\" && exit 1" + ] + } + } +} diff --git a/devbox.lock b/devbox.lock new file mode 100644 index 0000000..0b3af3b --- /dev/null +++ b/devbox.lock @@ -0,0 +1,73 @@ +{ + "lockfile_version": "1", + "packages": { + "github:NixOS/nixpkgs/nixpkgs-unstable": { + "resolved": "github:NixOS/nixpkgs/2d9e4457f8e83120c9fdf6f1707ed0bc603e5ac9?lastModified=1741462378&narHash=sha256-ZF3YOjq%2BvTcH51S%2BqWa1oGA9FgmdJ67nTNPG2OIlXDc%3D" + }, + "nodejs@latest": { + "last_modified": "2025-03-16T16:17:41Z", + "plugin_version": "0.0.2", + "resolved": "github:NixOS/nixpkgs/8f76cf16b17c51ae0cc8e55488069593f6dab645#nodejs_23", + "source": "devbox-search", + "version": "23.10.0", + "systems": { + "aarch64-darwin": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/dihlffh62qmgzsrxq1igwxicdyr3fn8a-nodejs-23.10.0", + "default": true + }, + { + "name": "libv8", + "path": "/nix/store/ks94i4365833bykrzg3d3mqxnciygyrn-nodejs-23.10.0-libv8" + } + ], + "store_path": "/nix/store/dihlffh62qmgzsrxq1igwxicdyr3fn8a-nodejs-23.10.0" + }, + "aarch64-linux": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/m7j1lf8a4z5bfla1m78pa3y12888hl7b-nodejs-23.10.0", + "default": true + }, + { + "name": "libv8", + "path": "/nix/store/kfvlfxx83n2w2fyb8hiz4p4dc165r035-nodejs-23.10.0-libv8" + } + ], + "store_path": "/nix/store/m7j1lf8a4z5bfla1m78pa3y12888hl7b-nodejs-23.10.0" + }, + "x86_64-darwin": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/nj0d1lc4nanqj7v4ibcgd26m3p5yfb0h-nodejs-23.10.0", + "default": true + }, + { + "name": "libv8", + "path": "/nix/store/k5rvmvqyibamfxa7cfzjfd5ldmi38kf3-nodejs-23.10.0-libv8" + } + ], + "store_path": "/nix/store/nj0d1lc4nanqj7v4ibcgd26m3p5yfb0h-nodejs-23.10.0" + }, + "x86_64-linux": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/m7imcmwi4hschl257dzc33gxciqlf4bm-nodejs-23.10.0", + "default": true + }, + { + "name": "libv8", + "path": "/nix/store/wy7ysxmd2ygdc5zpbhf9ripwgvvvnwsd-nodejs-23.10.0-libv8" + } + ], + "store_path": "/nix/store/m7imcmwi4hschl257dzc33gxciqlf4bm-nodejs-23.10.0" + } + } + } + } +} diff --git a/docs/technical-documentation/concepts/edp-developer/7_conclusio/likec4.config.json b/docs/technical-documentation/concepts/edp-developer/7_conclusio/likec4.config.json new file mode 100644 index 0000000..85c668e --- /dev/null +++ b/docs/technical-documentation/concepts/edp-developer/7_conclusio/likec4.config.json @@ -0,0 +1,3 @@ +{ + "name": "project-management" +} \ No newline at end of file diff --git a/likec4/README.md b/likec4/README.md new file mode 100644 index 0000000..dcb10cc --- /dev/null +++ b/likec4/README.md @@ -0,0 +1 @@ +Run ´npx likec4 start´ to start dev server \ No newline at end of file diff --git a/likec4/devbox.json b/likec4/devbox.json new file mode 100644 index 0000000..045ef14 --- /dev/null +++ b/likec4/devbox.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.14.0/.schema/devbox.schema.json", + "packages": ["nodejs@latest"], + "shell": { + "init_hook": [ + "echo 'Welcome to devbox!' > /dev/null" + ], + "scripts": { + "test": [ + "echo \"Error: no test specified\" && exit 1" + ] + } + } +} diff --git a/likec4/devbox.lock b/likec4/devbox.lock new file mode 100644 index 0000000..80ac876 --- /dev/null +++ b/likec4/devbox.lock @@ -0,0 +1,73 @@ +{ + "lockfile_version": "1", + "packages": { + "github:NixOS/nixpkgs/nixpkgs-unstable": { + "resolved": "github:NixOS/nixpkgs/250b695f41e0e2f5afbf15c6b12480de1fe0001b?lastModified=1743814133&narHash=sha256-drDyYyUmjeYGiHmwB9eOPTQRjmrq3Yz26knwmMPLZFk%3D" + }, + "nodejs@latest": { + "last_modified": "2025-03-16T16:17:41Z", + "plugin_version": "0.0.2", + "resolved": "github:NixOS/nixpkgs/8f76cf16b17c51ae0cc8e55488069593f6dab645#nodejs_23", + "source": "devbox-search", + "version": "23.10.0", + "systems": { + "aarch64-darwin": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/dihlffh62qmgzsrxq1igwxicdyr3fn8a-nodejs-23.10.0", + "default": true + }, + { + "name": "libv8", + "path": "/nix/store/ks94i4365833bykrzg3d3mqxnciygyrn-nodejs-23.10.0-libv8" + } + ], + "store_path": "/nix/store/dihlffh62qmgzsrxq1igwxicdyr3fn8a-nodejs-23.10.0" + }, + "aarch64-linux": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/m7j1lf8a4z5bfla1m78pa3y12888hl7b-nodejs-23.10.0", + "default": true + }, + { + "name": "libv8", + "path": "/nix/store/kfvlfxx83n2w2fyb8hiz4p4dc165r035-nodejs-23.10.0-libv8" + } + ], + "store_path": "/nix/store/m7j1lf8a4z5bfla1m78pa3y12888hl7b-nodejs-23.10.0" + }, + "x86_64-darwin": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/nj0d1lc4nanqj7v4ibcgd26m3p5yfb0h-nodejs-23.10.0", + "default": true + }, + { + "name": "libv8", + "path": "/nix/store/k5rvmvqyibamfxa7cfzjfd5ldmi38kf3-nodejs-23.10.0-libv8" + } + ], + "store_path": "/nix/store/nj0d1lc4nanqj7v4ibcgd26m3p5yfb0h-nodejs-23.10.0" + }, + "x86_64-linux": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/m7imcmwi4hschl257dzc33gxciqlf4bm-nodejs-23.10.0", + "default": true + }, + { + "name": "libv8", + "path": "/nix/store/wy7ysxmd2ygdc5zpbhf9ripwgvvvnwsd-nodejs-23.10.0-libv8" + } + ], + "store_path": "/nix/store/m7imcmwi4hschl257dzc33gxciqlf4bm-nodejs-23.10.0" + } + } + } + } +} diff --git a/likec4/doc/developer-landscape/cicd-outerloop-2.png b/likec4/doc/developer-landscape/cicd-outerloop-2.png new file mode 100644 index 0000000..6199ff1 Binary files /dev/null and b/likec4/doc/developer-landscape/cicd-outerloop-2.png differ diff --git a/likec4/doc/developer-landscape/cicd-outerloop-draft.png b/likec4/doc/developer-landscape/cicd-outerloop-draft.png new file mode 100644 index 0000000..f56ef30 Binary files /dev/null and b/likec4/doc/developer-landscape/cicd-outerloop-draft.png differ diff --git a/likec4/doc/developer-landscape/cicd-outerloop.png b/likec4/doc/developer-landscape/cicd-outerloop.png new file mode 100644 index 0000000..29b5122 Binary files /dev/null and b/likec4/doc/developer-landscape/cicd-outerloop.png differ diff --git a/likec4/doc/developer-landscape/devday-presentation.md b/likec4/doc/developer-landscape/devday-presentation.md new file mode 100644 index 0000000..339d63e --- /dev/null +++ b/likec4/doc/developer-landscape/devday-presentation.md @@ -0,0 +1,44 @@ +# Developer landscape with respect to DevOps Inner-Outer loop + +## Inner loop, outer loop + +![alt text](localdev.png) + +* [What software delivery leaders need to know about inner & outer loops](https://curiositysoftware.medium.com/what-software-delivery-leaders-need-to-know-about-inner-outer-loops-9da765b0ca2c) + +* (original articale is here](https://www.curiositysoftware.ie/blog/software-delivery-leaders-guide-inner-outer-loops) + +## Landscape + +### Draft + +![alt text](developer-landscape-view-draft.png) + +### C4 + +See [developer-landscape](../../views/landscape.c4) + +![alt text](developer-landscape-view-c4.png) +![alt text](developer-landscape-view-c4-2.png) + +![alt text](developer-landscape-view-c4-ppt-layouted.png) +![alt text](developer-landscape-view-c4-ppt-layouted-dark.png) + +## CI/CD Outerloop + +### Draft + +![alt text](cicd-outerloop-draft.png) + +ArgoCD and Cloud are CD, Forgejo is CI + +### C4 + +![alt text](cicd-outerloop.png) + +![alt text](cicd-outerloop-2.png) + + +## PPT + +![alt text](slide-1.png) \ No newline at end of file diff --git a/likec4/doc/developer-landscape/developer-landscape-view-c4-2.png b/likec4/doc/developer-landscape/developer-landscape-view-c4-2.png new file mode 100644 index 0000000..eb9b073 Binary files /dev/null and b/likec4/doc/developer-landscape/developer-landscape-view-c4-2.png differ diff --git a/likec4/doc/developer-landscape/developer-landscape-view-c4-ppt-layouted-dark.png b/likec4/doc/developer-landscape/developer-landscape-view-c4-ppt-layouted-dark.png new file mode 100644 index 0000000..5480fb0 Binary files /dev/null and b/likec4/doc/developer-landscape/developer-landscape-view-c4-ppt-layouted-dark.png differ diff --git a/likec4/doc/developer-landscape/developer-landscape-view-c4-ppt-layouted.png b/likec4/doc/developer-landscape/developer-landscape-view-c4-ppt-layouted.png new file mode 100644 index 0000000..81c4d0d Binary files /dev/null and b/likec4/doc/developer-landscape/developer-landscape-view-c4-ppt-layouted.png differ diff --git a/likec4/doc/developer-landscape/developer-landscape-view-c4.png b/likec4/doc/developer-landscape/developer-landscape-view-c4.png new file mode 100644 index 0000000..58e7847 Binary files /dev/null and b/likec4/doc/developer-landscape/developer-landscape-view-c4.png differ diff --git a/likec4/doc/developer-landscape/developer-landscape-view-draft.png b/likec4/doc/developer-landscape/developer-landscape-view-draft.png new file mode 100644 index 0000000..46b3044 Binary files /dev/null and b/likec4/doc/developer-landscape/developer-landscape-view-draft.png differ diff --git a/likec4/doc/developer-landscape/localdev.png b/likec4/doc/developer-landscape/localdev.png new file mode 100644 index 0000000..6de1218 Binary files /dev/null and b/likec4/doc/developer-landscape/localdev.png differ diff --git a/likec4/doc/developer-landscape/slide-1.png b/likec4/doc/developer-landscape/slide-1.png new file mode 100644 index 0000000..70acab2 Binary files /dev/null and b/likec4/doc/developer-landscape/slide-1.png differ diff --git a/likec4/likec4.config.json b/likec4/likec4.config.json new file mode 100644 index 0000000..bf92db2 --- /dev/null +++ b/likec4/likec4.config.json @@ -0,0 +1,3 @@ +{ + "name": "architecture" +} \ No newline at end of file diff --git a/likec4/models/code/workflow.c4 b/likec4/models/code/workflow.c4 new file mode 100644 index 0000000..cf7b906 --- /dev/null +++ b/likec4/models/code/workflow.c4 @@ -0,0 +1,111 @@ +model { + workflow edfbuilder_workflow "EDFbuilder" { + step runEDP "Run edpbuilder script" { + style { + opacity 25% + } + step createCrossplaneNS "Create Crossplane namespace" + step installCrossplaneHelm "Install Crossplane Helm Chart" + step installCrossplaneFunctionsAndProviders "Install Crossplane Functions and Providers" + step waitForCrossplaneFunctionsAndProviders "Wait for Crossplane Functions and Providers to become available" + step setupCrossplaneServiceAccount "Apply cluster-admin role to crossplane shell provider service account" + step createArgoCdNS "Create ArgoCD namespace" + step createGiteaNS "Create Gitea namespace" + step createArgoCdTlsCert "Create TLS Cert for Argo" + step createGiteaTlsCert "Create TLS Cert for Forgejo" + step createEDFBuilderDefinition "Create EDFbuilder crossplane definition (defines API)" + step createEDFBuilderComposition "Create EDFbuilder crossplane composition (defines what happens when EDFbuilder is applied)" + } + + step applyEDFBuilder "Applies EDFbuilder resource (and triggers creation)" { + style { + opacity 15% + } + + step setEnvVars "Set required environment variables" + step readWriteKubeConf "Make kube.conf write/readbale" + step setWorkDir "Set workdir to /tmp/rundir" + step cloneStacksRepo "Clone steps repo and checkout desired branch" + step hydrateStacksWithValues "Hydrate Stacks with values" + step createNamespaces "Create all required namespaces" + step createGiteaAdminPass "Create Admin Password for Forgejo" + step createGrafanaPass "Create Grafana Admin Password" + step applyServiceMonitorCRD "Apply ServiceMonitor CRDs for Prometheus" + step cloneIngressNginxChart "Git clone ingress-nginx helm chart" + step isntallIngressNginx "Install ingress-nginx from cloned chart" + step waitForIngress "Wait till ingress-nginx is ready" + step cloneArgoCDHelm "Git clone ArgoCD Helm Chart" + step installArgoCD "Install ArgoCD Helm Chart" + step installArgoCDIngress "Install ingress for ArgoCD" + step cloneForgejoHelmChart "Git clone Forgejo Helm Chart" + step installForgejo "Install Forgejo Helm Chart" + step installForgejoIngress "Install ingress for Forgejo" + step waitForArgoCD "Wait till ArgoCD is available" + step waitForForgejo "Wait till Forgejo is available" + step createForgejoUser "Create technical user for Forgejo" + step createForgejoRepo "Create repository for EDP state in Forgejo" + step installForgejoRunner "Install Forgejo Runner deployment" + step registerForgejoRunner "Create registration token secret for runner" + step configGitIdentity "Configure Git identity" + step configCrossplaneArgoCDProvider "Configure Crossplane ArgoCD provider" + step configCrossplaneKindProvider "Configure Crossplane Kind provider" + step uploadStacksToForgjo "Git push hydrated stacks to Forgejo isntance" + step configArgoDockerRegistry "Configure Docker Registry for Argo Workflows" + step createPackagesForgejoUser "Create packages user and token in Forgejo (unused?)" + step installArgoCDStacks "Apply all selected ArgoCD stacks" + step cleanup "Cleanup work folder and unset all env vars" + + setEnvVars -> readWriteKubeConf + readWriteKubeConf -> setWorkDir + setWorkDir -> cloneStacksRepo + cloneStacksRepo -> hydrateStacksWithValues + hydrateStacksWithValues -> createNamespaces + createNamespaces -> createGiteaAdminPass + createGiteaAdminPass -> createGrafanaPass + createGrafanaPass -> applyServiceMonitorCRD + applyServiceMonitorCRD -> cloneIngressNginxChart + cloneIngressNginxChart -> isntallIngressNginx + isntallIngressNginx -> waitForIngress + waitForIngress -> cloneArgoCDHelm + cloneArgoCDHelm -> installArgoCD + installArgoCD -> installArgoCDIngress + installArgoCDIngress -> cloneForgejoHelmChart + cloneForgejoHelmChart -> installForgejo + installForgejo -> installForgejoIngress + installForgejoIngress -> waitForArgoCD + waitForArgoCD -> waitForForgejo + waitForForgejo -> createForgejoUser + createForgejoUser -> createForgejoRepo + createForgejoRepo -> installForgejoRunner + installForgejoRunner -> registerForgejoRunner + registerForgejoRunner -> configGitIdentity + configGitIdentity -> configCrossplaneArgoCDProvider + configCrossplaneArgoCDProvider -> configCrossplaneKindProvider + configCrossplaneKindProvider -> uploadStacksToForgjo + uploadStacksToForgjo -> configArgoDockerRegistry + configArgoDockerRegistry -> createPackagesForgejoUser + createPackagesForgejoUser -> installArgoCDStacks + installArgoCDStacks -> cleanup + } + + createCrossplaneNS -> installCrossplaneHelm + installCrossplaneHelm -> installCrossplaneFunctionsAndProviders + installCrossplaneFunctionsAndProviders -> waitForCrossplaneFunctionsAndProviders + waitForCrossplaneFunctionsAndProviders -> setupCrossplaneServiceAccount + setupCrossplaneServiceAccount -> createArgoCdNS + createArgoCdNS -> createGiteaNS + createGiteaNS -> createArgoCdTlsCert + createArgoCdTlsCert -> createGiteaTlsCert + createGiteaTlsCert -> createEDFBuilderDefinition + createEDFBuilderDefinition -> createEDFBuilderComposition + createEDFBuilderComposition -> applyEDFBuilder + } +} + +views { + view edpbuilderworkflow of edfbuilder { + description 'Describes the process how to create an EDP instance' + include edfbuilder.** + autoLayout LeftRight 120 110 + } +} \ No newline at end of file diff --git a/likec4/models/components/application-specification.c4 b/likec4/models/components/application-specification.c4 new file mode 100644 index 0000000..3916520 --- /dev/null +++ b/likec4/models/components/application-specification.c4 @@ -0,0 +1,16 @@ +model { + component applicationspecification "application-specification" { + description 'The application specification describes the application and its components. It is used to generate the application and its components.' + + component application_gitrepo 'Git App Repo' { + description 'Git Application Repository' + technology 'Git' + icon tech:git + } + component applicationspec_gitrepo 'Git AppSpec Repo' { + description 'Git Application Specification Repository' + technology 'Git' + icon tech:git + } + } +} \ No newline at end of file diff --git a/likec4/models/components/tools.c4 b/likec4/models/components/tools.c4 new file mode 100644 index 0000000..8484713 --- /dev/null +++ b/likec4/models/components/tools.c4 @@ -0,0 +1,13 @@ +model { + component edfbuilder "edfbuilder" { + description 'EDP Foundry Builder' + technology 'Golang' + icon tech:go + style { + shape rectangle + } + -> edf "boots one" + platformdeveloper -> edfbuilder "runs" + } + +} \ No newline at end of file diff --git a/likec4/models/containers/api.c4 b/likec4/models/containers/api.c4 new file mode 100644 index 0000000..8902864 --- /dev/null +++ b/likec4/models/containers/api.c4 @@ -0,0 +1,9 @@ +model { + + extend edp { + container api 'API' { + description 'API for the EDP platform' + icon tech:swagger + } + } +} \ No newline at end of file diff --git a/likec4/models/containers/argocd.c4 b/likec4/models/containers/argocd.c4 new file mode 100644 index 0000000..59fbf47 --- /dev/null +++ b/likec4/models/containers/argocd.c4 @@ -0,0 +1,24 @@ +model { + + extend edp { + container argoCD 'ArgoCD' { + description 'GitOps Service' + + component argocdServer 'ArgoCD Server' + component argocdAppController 'ApplicationController' + component argocdAppSetController 'ApplicationSeetController' + component argocdRedis 'Redis' { + technology: 'Redis' + icon: tech:redis + } + component argocdRepoServer 'Repo Server' + + argocdServer -> argocdRedis 'read/write' + argocdRepoServer -> argocdRedis 'read/write' + argocdAppController -> argocdRedis 'read/write' + argocdAppSetController -> argocdRedis 'read/write' + + argocdRepoServer -> edp.forgejogit 'Syncs git repo' + } + } +} \ No newline at end of file diff --git a/likec4/models/containers/backstage.c4 b/likec4/models/containers/backstage.c4 new file mode 100644 index 0000000..fd323c6 --- /dev/null +++ b/likec4/models/containers/backstage.c4 @@ -0,0 +1,25 @@ +model { + + extend edp { + container ui 'Backstage' { + description 'Developer Portal' + + component backstage 'Backstage' { + style { + icon tech:react + shape browser + } + } + + component database 'Database' { + technology 'Postgresql' + icon tech:postgresql + style { + shape storage + } + } + + backstage -> database 'reads/writes' + } + } +} \ No newline at end of file diff --git a/likec4/models/containers/crossplane.c4 b/likec4/models/containers/crossplane.c4 new file mode 100644 index 0000000..6452b8b --- /dev/null +++ b/likec4/models/containers/crossplane.c4 @@ -0,0 +1,16 @@ +model { + + extend edp { + container crossplane 'Crossplane' { + #internal + description 'Declarative management of ressources' + + component crossplane 'Crossplane' + component crossplaneFunction 'Function Patch and Transform' + component crossplaneRbacManager 'RBAC Manager' + component providerArgoCD 'ArgoCD Provider' + component providerKind 'Kind Provider' + component providerShell 'Shell Provider' + } + } +} \ No newline at end of file diff --git a/likec4/models/containers/externalsecrets.c4 b/likec4/models/containers/externalsecrets.c4 new file mode 100644 index 0000000..f929e19 --- /dev/null +++ b/likec4/models/containers/externalsecrets.c4 @@ -0,0 +1,13 @@ +model { + + extend edp { + container externalSecrets 'external-secrets' { + #internal + description 'Provider to access externally stored Kubernetes secrets' + + component externalSecrets 'external-secrets controller' + component certController 'cert-controller' + component webhook 'webhook' + } + } +} \ No newline at end of file diff --git a/likec4/models/containers/forgejo.c4 b/likec4/models/containers/forgejo.c4 new file mode 100644 index 0000000..62fc883 --- /dev/null +++ b/likec4/models/containers/forgejo.c4 @@ -0,0 +1,45 @@ +model { + + extend edp { + container forgejo 'Forgejo' { + description ' + Fully managed DevOps Platfrom + offering capabilities like + code version controling + collaboration and ticketing + and security scanning + ' + technology 'Golang' + icon tech:go + + component forgejocollaboration 'Collaboration' { + icon tech:github + } + + component forgejoproject 'Project Mgmt' { + icon tech:github + } + + forgejoproject -> forgejoRunner 'executes pipelines' + } + + component forgejoRunner 'Forgejo Actions' { + description 'Continuous Integration like Github Actions' + technology 'Golang' + icon tech:go + style { + multiple true + } + } + + component imageregistry 'Forgejo OCI Image Registry' { + description 'Container Image Registry' + technology 'Golang' + icon tech:go + } + + component forgejogit 'ForgejoGit' { + icon tech:git + } + } +} \ No newline at end of file diff --git a/likec4/models/containers/grafana.c4 b/likec4/models/containers/grafana.c4 new file mode 100644 index 0000000..4686a0e --- /dev/null +++ b/likec4/models/containers/grafana.c4 @@ -0,0 +1,9 @@ +model { + + extend edp { + container grafana 'Grafana' { + description 'Data visualization and monitoring' + icon tech:grafana + } + } +} \ No newline at end of file diff --git a/likec4/models/containers/ingress.c4 b/likec4/models/containers/ingress.c4 new file mode 100644 index 0000000..d0babc4 --- /dev/null +++ b/likec4/models/containers/ingress.c4 @@ -0,0 +1,25 @@ +model { + + extend edp { + container ingressNginx 'Ingress' { + #internal + description 'Ingress Controller for incoming http(s) traffic' + + component ingressNginx 'ingress-nginx' { + technology 'Nginx' + icon tech:nginx + } + + ingressNginx -> edp.forgejo 'https' + ingressNginx -> edp.keycloak.keycloak 'https' + ingressNginx -> edp.openbao.openbao 'https' + ingressNginx -> edp.argoCD.argocdServer 'https' + ingressNginx -> edp.ui.backstage 'https' + ingressNginx -> edp.minio.minio 'https' + ingressNginx -> edp.monitoring.alloy 'https' + ingressNginx -> edp.monitoring.queryFrontend 'https' + ingressNginx -> testApp.fibonacci 'https' + ingressNginx -> mailhog.mailhog 'https' + } + } +} \ No newline at end of file diff --git a/likec4/models/containers/keycloak.c4 b/likec4/models/containers/keycloak.c4 new file mode 100644 index 0000000..7f5ea08 --- /dev/null +++ b/likec4/models/containers/keycloak.c4 @@ -0,0 +1,21 @@ +model { + + extend edp { + container keycloak 'Keycloak' { + description 'Single Sign On for all EDP products' + component keycloak 'Keycloak' { + technology 'Java' + icon tech:java + } + + component keycloakDB 'Database' { + technology 'Postgresql' + icon tech:postgresql + style { + shape storage + } + } + keycloak -> keycloakDB 'reads/writes' + } + } +} \ No newline at end of file diff --git a/likec4/models/containers/kyverno.c4 b/likec4/models/containers/kyverno.c4 new file mode 100644 index 0000000..0ab2d71 --- /dev/null +++ b/likec4/models/containers/kyverno.c4 @@ -0,0 +1,9 @@ +model { + + extend edp { + container kyverno 'Kyverno' { + #internal + description 'Policy-as-Code' + } + } +} \ No newline at end of file diff --git a/likec4/models/containers/mailhog.c4 b/likec4/models/containers/mailhog.c4 new file mode 100644 index 0000000..c773c0f --- /dev/null +++ b/likec4/models/containers/mailhog.c4 @@ -0,0 +1,13 @@ +model { + + extend edp { + container mailhog 'Mailhog' { + description 'Web and API based SMTP testing' + + component mailhog 'Mailhog' { + technology 'Golang' + icon tech:go + } + } + } +} \ No newline at end of file diff --git a/likec4/models/containers/minio.c4 b/likec4/models/containers/minio.c4 new file mode 100644 index 0000000..eb14fce --- /dev/null +++ b/likec4/models/containers/minio.c4 @@ -0,0 +1,15 @@ +model { + + extend edp { + container minio 'Minio' { + description 'S3 compatible blob storage' + + component minio 'S3 Blob Storage' { + technology 'Minio' + style { + shape storage + } + } + } + } +} \ No newline at end of file diff --git a/likec4/models/containers/monitoring.c4 b/likec4/models/containers/monitoring.c4 new file mode 100644 index 0000000..226acde --- /dev/null +++ b/likec4/models/containers/monitoring.c4 @@ -0,0 +1,30 @@ +model { + + extend edp { + container monitoring 'Monitoring' { + description 'Observability system to monitor deployed components' + + component alloy 'Alloy' { + description 'Open Telemetry Collector' + + style { + icon tech:grafana + multiple true + } + } + + container loki 'Loki' { + description 'Log aggregation system' + icon tech:grafana + + component queryFrontend 'Query Frontend' + component distributor 'Distributor' + component gateway 'Gateway' + component ingestor 'Ingestor' + component querier 'Querier' + + alloy -> distributor 'pushes logs' + } + } + } +} \ No newline at end of file diff --git a/likec4/models/containers/openbao.c4 b/likec4/models/containers/openbao.c4 new file mode 100644 index 0000000..039355a --- /dev/null +++ b/likec4/models/containers/openbao.c4 @@ -0,0 +1,17 @@ +model { + + extend edp { + container openbao 'OpenBao' { + description 'Secure secret storage' + + component openbao 'Openbao' { + technology 'Openbao' + style { + shape storage + } + } + + component agentInjector 'Agent Injector' + } + } +} \ No newline at end of file diff --git a/likec4/models/containers/spark-operator.c4 b/likec4/models/containers/spark-operator.c4 new file mode 100644 index 0000000..92a73bb --- /dev/null +++ b/likec4/models/containers/spark-operator.c4 @@ -0,0 +1,14 @@ +model { + + extend edp { + container spark 'Spark' { + #internal + description 'Allows running Spark applications on K8s' + + component sparkoperator 'Spark Operator' { + technology 'Spark' + icon tech:spark + } + } + } +} \ No newline at end of file diff --git a/likec4/models/containers/velero.c4 b/likec4/models/containers/velero.c4 new file mode 100644 index 0000000..3676cbf --- /dev/null +++ b/likec4/models/containers/velero.c4 @@ -0,0 +1,13 @@ +model { + + extend edp { + container velero 'Velero' { + #internal + description 'Backup Kubernetes resources' + + component velero 'Velero' + + velero -> edp.minio.minio 'store backups' + } + } +} \ No newline at end of file diff --git a/likec4/models/context/actors.c4 b/likec4/models/context/actors.c4 new file mode 100644 index 0000000..dd690f5 --- /dev/null +++ b/likec4/models/context/actors.c4 @@ -0,0 +1,35 @@ +model { + developer = actor 'Developer' { + description 'The regular user of the platform' + -> localbox 'inner loop development' + -> edp 'outer loop development' + -> edp.ui 'manages project' + -> edp.forgejo 'manages code' + -> edp.keycloak 'authenticates' + -> edp.argoCD 'manages deployments' + -> edp.grafana 'monitors' + -> edp.backstage 'create and maintain apps' + -> edp.imageregistry 'pushes and pull images' + -> edp.api 'uses API' + -> edp.forgejogit 'uses git' + } + platformdeveloper = actor 'Platform Developer' { + description 'The EDP engineer' + style { + color gray + shape person + } + } + otherProductLifecycleRoles = actor 'Reviewer, Tester, Auditors, Operators' { + description 'Coworking roles in the outer loop' + -> edp 'act according to responibility' + } + customers = actor 'End Customers' { + description 'Consumers of your Application' + style { + color amber + shape person + } + -> cloud 'uses your app' + } +} \ No newline at end of file diff --git a/likec4/models/context/cloud.c4 b/likec4/models/context/cloud.c4 new file mode 100644 index 0000000..0602ac5 --- /dev/null +++ b/likec4/models/context/cloud.c4 @@ -0,0 +1,14 @@ +model { + cloud = system 'Cloud' { + description 'Cloud environments' + technology 'IaaS/PaaS' + + application = schema 'application' { + description 'An application description' + technology 'DSL' + style { + color primary + } + } + } +} diff --git a/likec4/models/context/customer-systems.c4 b/likec4/models/context/customer-systems.c4 new file mode 100644 index 0000000..2d15443 --- /dev/null +++ b/likec4/models/context/customer-systems.c4 @@ -0,0 +1,6 @@ +model { + enterprise = system "Customers' Enterprise Systems" { + description "The customers' enterprise systems" + -> cloud 'app specific dependencies' + } +} diff --git a/likec4/models/context/edfoundry.c4 b/likec4/models/context/edfoundry.c4 new file mode 100644 index 0000000..fdc777b --- /dev/null +++ b/likec4/models/context/edfoundry.c4 @@ -0,0 +1,9 @@ +model { + edf = system 'EDF' { + description 'EDP Foundry, the EDP builder' + technology 'Kubernetes' + icon tech:kubernetes + -> edp 'builds many' + platformdeveloper -> edf "develops EDP and EDF" + } +} \ No newline at end of file diff --git a/likec4/models/context/edp.c4 b/likec4/models/context/edp.c4 new file mode 100644 index 0000000..970e989 --- /dev/null +++ b/likec4/models/context/edp.c4 @@ -0,0 +1,31 @@ +model { + edp = system 'EDP' { + description 'EDP Edge Development Platform' + technology 'Kubernetes' + icon tech:kubernetes + -> enterprise 'integrates' + -> cloud 'deploys and observes' + -> localbox // inner-outer loop synchronization + + application = schema 'application' { + description 'An application description' + technology 'DSL' + style { + color primary + } + } + + container testApp 'Fibonacci' { + description 'Testapp to validate deployments' + + component fibonacci 'Fibonacci' { + technology 'Golang' + icon tech:go + } + } + + // UI requests data from the Backend + // ui -> backend 'fetches via HTTPS' + } +} + diff --git a/likec4/models/context/localbox.c4 b/likec4/models/context/localbox.c4 new file mode 100644 index 0000000..07547d8 --- /dev/null +++ b/likec4/models/context/localbox.c4 @@ -0,0 +1,22 @@ +model { + localbox = system 'localbox' { + description 'A local development system' + technology 'Linux/Windows/Mac' + -> edp 'inner-outer-loop synchronization' + -> enterprise 'company integration' + + application = schema 'application' { + description 'An application description' + technology 'DSL' + style { + color primary + } + } + + git = component 'git' { + description 'local git' + technology 'Git' + icon tech:git + } + } +} diff --git a/likec4/models/deployment/deployment.c4 b/likec4/models/deployment/deployment.c4 new file mode 100644 index 0000000..67f65f8 --- /dev/null +++ b/likec4/models/deployment/deployment.c4 @@ -0,0 +1,101 @@ +// Deployment model +deployment { + + environment local 'Local' { + technology 'Kind' + icon tech:kubernetes + + namespace backstage { + instanceOf edp.ui.backstage + instanceOf edp.ui.database + } + + namespace argocd { + instanceOf edp.argoCD.argocdAppController + instanceOf edp.argoCD.argocdAppSetController + instanceOf edp.argoCD.argocdRedis + instanceOf edp.argoCD.argocdRepoServer + instanceOf edp.argoCD.argocdServer + } + + namespace gitea { + instanceOf edp.forgejo + instanceOf edp.forgejoRunner + } + + namespace keycloak { + instanceOf edp.keycloak.keycloak + instanceOf edp.keycloak.keycloakDB + } + + namespace crossplane 'crossplane-system' { + instanceOf edp.crossplane.crossplane + instanceOf edp.crossplane.crossplaneFunction + instanceOf edp.crossplane.crossplaneRbacManager + instanceOf edp.crossplane.providerArgoCD + instanceOf edp.crossplane.providerKind + instanceOf edp.crossplane.providerShell + } + + namespace externalSecrets 'external-secrets' { + instanceOf edp.externalSecrets.certController + instanceOf edp.externalSecrets.externalSecrets + instanceOf edp.externalSecrets.webhook + } + + namespace velero { + instanceOf edp.velero.velero + } + + namespace minio 'minio-backup' { + instanceOf edp.minio.minio + } + + namespace monitoring { + instanceOf edp.monitoring.alloy + instanceOf edp.monitoring.distributor + instanceOf edp.monitoring.gateway + instanceOf edp.monitoring.ingestor + instanceOf edp.monitoring.querier + instanceOf edp.monitoring.queryFrontend + } + + namespace ingressNginx 'ingress-nginx'{ + instanceOf edp.ingressNginx.ingressNginx + } + + namespace openbao 'openbao' { + instanceOf edp.openbao.openbao + instanceOf edp.openbao.agentInjector + } + + namespace fibonacci 'fibonacci-app' { + instanceOf edp.testApp.fibonacci + } + + namespace mailhog 'mailhog' { + instanceOf edp.mailhog.mailhog + } + + namespace spark 'spark' { + instanceOf edp.spark.sparkoperator + } + } +} + +views { + deployment view index { + title 'Local Deployment' + + include + *, + local.**, + monitoring.*, + openbao.*, + externalSecrets.*, + crossplane.*, + spark.*, + argocd.* + } +} + diff --git a/likec4/models/spec.c4 b/likec4/models/spec.c4 new file mode 100644 index 0000000..80d9d22 --- /dev/null +++ b/likec4/models/spec.c4 @@ -0,0 +1,31 @@ +specification { + element actor { + style { + shape person + color green + } + } + element component + element container { + style { + opacity 20% + } + } + element internalComponent { + style { + color muted + opacity 15% + } + } + + element schema + element step + element system + element workflow + + deploymentNode node + deploymentNode environment + deploymentNode namespace + + tag internal +} \ No newline at end of file diff --git a/likec4/views/application-transition.c4 b/likec4/views/application-transition.c4 new file mode 100644 index 0000000..cf86039 --- /dev/null +++ b/likec4/views/application-transition.c4 @@ -0,0 +1,35 @@ +views { + + // the application meta-definition travels through all deploying components + view application-transition { + title 'application-transistion' + // autoLayout LeftRight 100 100 + + // include * + exclude developer, localbox, edp, otherProductLifecycleRoles + exclude element.kind = workflow + include cloud, cloud.application + + group 'developer-scope' { + color green + opacity 20% + border none + include developer + include otherProductLifecycleRoles + + group 'Devops inner-loop' { + color gray + opacity 30% + border none + + include localbox, localbox.application + } + group 'Devops outer-loop' { + color gray + opacity 30% + border none + include edp, edp.application + } + } + } +} \ No newline at end of file diff --git a/likec4/views/developer-landscape-with-foundry.c4 b/likec4/views/developer-landscape-with-foundry.c4 new file mode 100644 index 0000000..606c91c --- /dev/null +++ b/likec4/views/developer-landscape-with-foundry.c4 @@ -0,0 +1,41 @@ + +global { + style text_large * { + size xlarge + } +} +views { + + view developer-landscape-with-foundry { + title 'Developer Landscape View (with Foundry)' + autoLayout LeftRight 100 100 + + global style text_large + + include * + exclude developer, localbox, edp, otherProductLifecycleRoles + exclude element.kind = workflow + + group 'developer-scope' { + color green + opacity 20% + border none + include developer + include otherProductLifecycleRoles + + group 'Devops inner-loop' { + color gray + opacity 30% + border none + + include localbox + } + group 'Devops outer-loop' { + color gray + opacity 30% + border none + include edp + } + } + } +} \ No newline at end of file diff --git a/likec4/views/developer-landscape.c4 b/likec4/views/developer-landscape.c4 new file mode 100644 index 0000000..d88a9cb --- /dev/null +++ b/likec4/views/developer-landscape.c4 @@ -0,0 +1,33 @@ +views { + + view landscape { + title 'Developer Landscape View' + autoLayout LeftRight 100 100 + + include * + exclude developer, localbox, edp, otherProductLifecycleRoles + exclude element.kind = workflow + + group 'developer-scope' { + color green + opacity 20% + border none + include developer + include otherProductLifecycleRoles + + group 'Devops inner-loop' { + color gray + opacity 30% + border none + + include localbox + } + group 'Devops outer-loop' { + color gray + opacity 30% + border none + include edp + } + } + } +} \ No newline at end of file diff --git a/likec4/views/edp-as-idp.c4 b/likec4/views/edp-as-idp.c4 new file mode 100644 index 0000000..2e69006 --- /dev/null +++ b/likec4/views/edp-as-idp.c4 @@ -0,0 +1,44 @@ +views { + /** + * @likec4-generated(v1) + * iKRoYXNo2ShjOTFkNTk3Y2QyNjFmM2Y1ZjdhOGVjNDAyOTFjM2FiODI4NTg3NTc5qmF1dG9MYXlvdXSBqWRpcmVjdGlvbqJUQqF40fzwoXnR/iqld2lkdGjNGkWmaGVpZ2h0zQjmpW5vZGVz3gAWqWRldmVsb3BlcoKhYpTR/PDR/tPNAgjNASKhY8KkQGdyMYKhYpQd0f4uzQlszQjioWPDpEBncjKCoWKURdH+Zc0JHM0DhaFjw6RAZ3I1gqFilHLNAhbNCNvNAYehY8OkQGdyNoKhYpR3zQO+zQjUzQGJoWPDpEBncjeCoWKUdM0FYc0I2s0Bh6Fjw6RAZ3IzgqFilG7R/pzNCMfNAYWhY8OkQGdyNIKhYpRtNs0IzM0BjKFjw7FlZHAuZm9yZ2Vqb1J1bm5lcoKhYpTMmM0CTM0CCM0BIqFjwrFlZHAuaW1hZ2VyZWdpc3RyeYKhYpTNA8XNAlPNAgrNASKhY8KqZWRwLmFyZ29D + * RIKhYpTNBx3NAlDNAgjNASKhY8KuZWRwLm1vbml0b3JpbmeCoWKUzQcbzQP9zQIIzQEioWPCq2VkcC5ncmFmYW5hgqFilMydzQP1zQIIzQEioWPCrGVkcC5rZXljbG9ha4KhYpTMnM0Fns0CCM0BIqFjwqtlZHAua3l2ZXJub4KhYpTNBPPNBZnNAgjNASKhY8KzZWRwLmV4dGVybmFsU2VjcmV0c4KhYpTNBx7NBZjNAgjNASKhY8KrZWRwLm9wZW5iYW+CoWKUzQLHzQWdzQIIzQEioWPCsGVkcC51aS5iYWNrc3RhZ2WCoWKUzJbR/tPNAgjNASKhY8KnZWRwLmFwaYKhYpTNBwTR/tfNAgjNASKhY8LZLGFwcGxpY2F0aW9uc3BlY2lmaWNhdGlvbi5hcHBsaWNhdGlvbl9naXRyZXBvgqFilM0DvnfNAgjNASKhY8LZMGFwcGxpY2F0aW9uc3BlY2lmaWNhdGlvbi5hcHBsaWNh + * dGlvbnNwZWNfZ2l0cmVwb4KhYpTNBwl3zQIIzQEioWPCrmVkcC5mb3JnZWpvZ2l0gqFilMyVbc0CCM0BIqFjwqVlZGdlc4anMXc5Y3BiMoOiY3CRgqF4y8BheZmZmZmaoXnR/2ShbISheNDHoXnR/2Sld2lkdGjMoaZoZWlnaHQSoXCaks0XAs0BfJLNFaPNAbOSzRMdzQIRks0Q8s0CNJLNENHNAjeSzQfUzQIzks0Htc0CPJLNB4vNAkmSzQdgzQJdks0HOs0CdacxeTNsY3lqg6JjcJGCoXjNBI2hedH+KqFshKF4zQMHoXnR/kald2lkdGg8pmhlaWdodBKhcJqSzRcCzQGNks0WAc0BxZLNFGzNAhSSzRMIzQI0ks0S6c0CN5LNCm/NAjSSzQpRzQI8ks0KIs0CSZLNCfTNAl6SzQnIzQJ1pzFhZ3ZlbjmDomNwkYKheMvAYa6Y5gyf6qF5y0BTTMzMzMzNoWyEoXjQt6F5Z6V3 + * aWR0aDSmaGVpZ2h0EqFwmpLNFwLNAXGSzRU+zQGlks0Res0CDpLNDknNAjSSzQ4pzQI2ks0FUs0CM5LNBTPNAjySzQUJzQJJks0E380CXZLNBLnNAnSnMW52MHc0MYOiY3CRgqF40f9BoXnNAQ+hbISheMzNoXnNAbeld2lkdGjMl6ZoZWlnaHQSoXCaks0XAs0BtpLNFnjNAeeSzRXJzQIcks0VKM0CNJLNFP/NAjuSzQ97zQIwks0PU80CPJLNDynNAkmSzQ7/zQJdks0O2M0CdKYzbnhycTeDomNwkYKhePWhec0DmKFshKF40f8roXnNAimld2lkdGg6pmhlaWdodBKhcJqSzRcCzQGfks0WQM0B1ZLNFS7NAhiSzRQ5zQI0ks0UBc0CO5LNDQPNAi2SzQzRzQI8ks0Mp80CSZLNDH3NAl2SzQxXzQJ0pmJmZ2FwcYOiY3CRgqF40LWhec0FEKFshKF40f7voXnNAxWld2lkdGhX + * pmhlaWdodBKhcJSSzRc1zQHhks0W8c0CEJLNFqXNAkWSzRZgzQJ0 + */ + view idp of edp { + title 'EDP as IDP' + + global style text_large + + include developer + exclude element.tag = #internal + + style * { + opacity 25% + } + group 'EDP' { + group 'Developer Control Plane' { + group 'Frontend' { + include backstage, api + } + group 'Version Control' { + include applicationspecification.application_gitrepo, applicationspecification.applicationspec_gitrepo + include forgejogit + } + } + group 'Integration & Delivery Plane' { + include forgejoRunner, imageregistry, argoCD + exclude -> argoCD -> + } + group 'Monitoring Plane' { + include monitoring, grafana + } + group 'Security Plane' { + include keycloak, kyverno, externalSecrets, openbao + } + } + autoLayout TopBottom + } +} \ No newline at end of file diff --git a/likec4/views/edp-as-orchestrator.c4 b/likec4/views/edp-as-orchestrator.c4 new file mode 100644 index 0000000..b149d38 --- /dev/null +++ b/likec4/views/edp-as-orchestrator.c4 @@ -0,0 +1,42 @@ +views { + + + + /** + * @likec4-generated(v1) + * iKRoYXNo2ShiMmZlZGEwNzE3MDU5ZjQ0Nzg2YzFhYjJiNTI0NmRjZmRlOWNhYjdlqmF1dG9MYXlvdXSBqWRpcmVjdGlvbqJUQqF40f8UoXkOpXdpZHRozQU6pmhlaWdodM0D7aVub2Rlc4ikQGdyMYKhYpTR/xQOzQU6zQPtoWPDpEBncjKCoWKUMEXNAUDMtKFjw6RAZ3IzgqFilM0B3kXNAUDMtKFjw6RAZ3I0gqFilDDNAXHNAUDMtKFjw6RAZ3I1gqFilM0B3s0Bcc0BQMy0oWPDpEBncjaCoWKU0f88zQJSzQTqzQGBoWPDqmVkcC5hcmdvQ0SCoWKU0f9kzQKJzQIIzQEioWPCrmVkcC5jcm9zc3BsYW5lgqFilM0B+M0Cis0CCM0BIqFjwqVlZGdlc4A= + */ + view edporchestrator of edp { + title 'EDP as Orchestrator' + + global style text_large + + exclude element.tag = #internal + + style * { + opacity 25% + } + group 'EDP' { + group 'Developer Control Plane' { + + } + group 'Integration & Delivery Plane' { + + } + group 'Monitoring Plane' { + + } + group 'Security Plane' { + + } + group 'Backend' { + include argoCD with { + description 'Declarative management of platform tools' + } + include crossplane + + } + } + autoLayout TopBottom + } +} \ No newline at end of file diff --git a/likec4/views/edp.c4 b/likec4/views/edp.c4 new file mode 100644 index 0000000..490e553 --- /dev/null +++ b/likec4/views/edp.c4 @@ -0,0 +1,86 @@ +views { + + view edp of edp { + title 'Context view' + include * + exclude ingressNginx -> + exclude element.tag = #internal + + style * { + opacity 25% + } + } + + view keycloak of edp.keycloak { + include + *, + edp.ingressNginx -> + } + + view forgejo of edp.forgejo { + include + *, + edp.ingressNginx -> + } + + view crossplane of edp.crossplane { + include + *, + edp.ingressNginx -> + } + + view externalSecrets of edp.externalSecrets { + include + *, + edp.ingressNginx -> + } + + view velero of edp.velero { + include + *, + edp.ingressNginx -> + } + + view minio of edp.minio { + include + *, + edp.ingressNginx -> + } + + view monitoring of edp.monitoring { + include + *, + edp.ingressNginx -> + loki.* + } + + view ingressNginx of edp.ingressNginx { + include * + } + + view testapp of edp.testApp { + include + *, + edp.ingressNginx -> + } + + view mailhog of edp.mailhog { + include + *, + edp.ingressNginx -> + } + + view spark of edp.spark { + include + *, + edp.ingressNginx -> + } + + view argoCD of edp.argoCD { + include + *, + edp.ingressNginx -> + } +} + + diff --git a/likec4/views/gitops-inner-outer-loop.c4 b/likec4/views/gitops-inner-outer-loop.c4 new file mode 100644 index 0000000..7ba319b --- /dev/null +++ b/likec4/views/gitops-inner-outer-loop.c4 @@ -0,0 +1,26 @@ +views { + dynamic view view_gitops-inner-outer-loop_15 { + title 'outer-ci-loop' + + include localbox, edp + include edp.forgejo with { + color gray + title 'Forgejo' + } + + style edp._ { + color secondary + } + + localbox.git -> edp.forgejogit 'git push' + edp.forgejogit -> edp.forgejoRunner 'on push' + + edp.forgejoRunner -> edp.imageregistry 'pushes new image' + edp.forgejoRunner -> edp.forgejogit 'pushes new appspec' + + edp.forgejogit -> edp.argoCD 'triggers deployment' + edp.argoCD -> cloud 'deploys application' + cloud -> edp.imageregistry 'pulls image' + } + +} \ No newline at end of file diff --git a/references/Cloudomation whitepaper - full list of CDE vendors 2023 (+feature comparison table).pdf b/references/Cloudomation whitepaper - full list of CDE vendors 2023 (+feature comparison table).pdf new file mode 100644 index 0000000..92ff299 Binary files /dev/null and b/references/Cloudomation whitepaper - full list of CDE vendors 2023 (+feature comparison table).pdf differ diff --git a/references/State of Platform Engineering Report Volume 3.pdf b/references/State of Platform Engineering Report Volume 3.pdf new file mode 100644 index 0000000..3f80d38 Binary files /dev/null and b/references/State of Platform Engineering Report Volume 3.pdf differ diff --git a/references/State of Platform Engineering Report.pdf b/references/State of Platform Engineering Report.pdf new file mode 100644 index 0000000..7fdb641 Binary files /dev/null and b/references/State of Platform Engineering Report.pdf differ diff --git a/references/State of Platform Engineering Vol 2.pdf b/references/State of Platform Engineering Vol 2.pdf new file mode 100644 index 0000000..568c3bf Binary files /dev/null and b/references/State of Platform Engineering Vol 2.pdf differ