Merge branch 'development' into feature/tech-doc-refactoring

This commit is contained in:
Stephan Lo 2025-04-09 22:34:09 +02:00
commit 75a2ad1cfa
56 changed files with 1219 additions and 0 deletions

14
devbox.json Normal file
View file

@ -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"
]
}
}
}

73
devbox.lock Normal file
View file

@ -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"
}
}
}
}
}

View file

@ -0,0 +1,3 @@
{
"name": "project-management"
}

1
likec4/README.md Normal file
View file

@ -0,0 +1 @@
Run ´npx likec4 start´ to start dev server

14
likec4/devbox.json Normal file
View file

@ -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"
]
}
}
}

73
likec4/devbox.lock Normal file
View file

@ -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"
}
}
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 467 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

View file

@ -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)

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 475 KiB

View file

@ -0,0 +1,3 @@
{
"name": "architecture"
}

View file

@ -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
}
}

View file

@ -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
}
}
}

View file

@ -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"
}
}

View file

@ -0,0 +1,9 @@
model {
extend edp {
container api 'API' {
description 'API for the EDP platform'
icon tech:swagger
}
}
}

View file

@ -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'
}
}
}

View file

@ -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'
}
}
}

View file

@ -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'
}
}
}

View file

@ -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'
}
}
}

View file

@ -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
}
}
}

View file

@ -0,0 +1,9 @@
model {
extend edp {
container grafana 'Grafana' {
description 'Data visualization and monitoring'
icon tech:grafana
}
}
}

View file

@ -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'
}
}
}

View file

@ -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'
}
}
}

View file

@ -0,0 +1,9 @@
model {
extend edp {
container kyverno 'Kyverno' {
#internal
description 'Policy-as-Code'
}
}
}

View file

@ -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
}
}
}
}

View file

@ -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
}
}
}
}
}

View file

@ -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'
}
}
}
}

View file

@ -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'
}
}
}

View file

@ -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
}
}
}
}

View file

@ -0,0 +1,13 @@
model {
extend edp {
container velero 'Velero' {
#internal
description 'Backup Kubernetes resources'
component velero 'Velero'
velero -> edp.minio.minio 'store backups'
}
}
}

View file

@ -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'
}
}

View file

@ -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
}
}
}
}

View file

@ -0,0 +1,6 @@
model {
enterprise = system "Customers' Enterprise Systems" {
description "The customers' enterprise systems"
-> cloud 'app specific dependencies'
}
}

View file

@ -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"
}
}

View file

@ -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'
}
}

View file

@ -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
}
}
}

View file

@ -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.*
}
}

31
likec4/models/spec.c4 Normal file
View file

@ -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
}

View file

@ -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
}
}
}
}

View file

@ -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
}
}
}
}

View file

@ -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
}
}
}
}

View file

@ -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
}
}

View file

@ -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
}
}

86
likec4/views/edp.c4 Normal file
View file

@ -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 ->
}
}

View file

@ -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'
}
}

Binary file not shown.

Binary file not shown.