diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/devbox.json b/devbox.json new file mode 100644 index 0000000..0b3dd28 --- /dev/null +++ b/devbox.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.14.0/.schema/devbox.schema.json", + "packages": [ + "nodejs@latest", + "terraform@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..c826213 --- /dev/null +++ b/devbox.lock @@ -0,0 +1,121 @@ +{ + "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" + } + } + }, + "terraform@latest": { + "last_modified": "2025-04-10T20:20:34Z", + "resolved": "github:NixOS/nixpkgs/d19cf9dfc633816a437204555afeb9e722386b76#terraform", + "source": "devbox-search", + "version": "1.11.4", + "systems": { + "aarch64-darwin": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/46l1vs4h00h1y3n3xxwzab0a16mawfcs-terraform-1.11.4", + "default": true + } + ], + "store_path": "/nix/store/46l1vs4h00h1y3n3xxwzab0a16mawfcs-terraform-1.11.4" + }, + "aarch64-linux": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/knyqig364fi94f3z33q47jawv9b4h4sy-terraform-1.11.4", + "default": true + } + ], + "store_path": "/nix/store/knyqig364fi94f3z33q47jawv9b4h4sy-terraform-1.11.4" + }, + "x86_64-darwin": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/9w7xlspipmx4kal4bagqnf76h0wv8lx8-terraform-1.11.4", + "default": true + } + ], + "store_path": "/nix/store/9w7xlspipmx4kal4bagqnf76h0wv8lx8-terraform-1.11.4" + }, + "x86_64-linux": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/xlg2aqgy2fwilpfnla4313f39vs0hhmb-terraform-1.11.4", + "default": true + } + ], + "store_path": "/nix/store/xlg2aqgy2fwilpfnla4313f39vs0hhmb-terraform-1.11.4" + } + } + } + } +} diff --git a/docs/technical-documentation/.pages b/docs/technical-documentation/.pages new file mode 100644 index 0000000..332b339 --- /dev/null +++ b/docs/technical-documentation/.pages @@ -0,0 +1,6 @@ +title: Technical doc +arrange: + - concepts + - architecture + - product + - project diff --git a/docs/technical-documentation/decisions/0001-pipeline-tools.md b/docs/technical-documentation/architecture/decisions/0001-pipeline-tools.md similarity index 100% rename from docs/technical-documentation/decisions/0001-pipeline-tools.md rename to docs/technical-documentation/architecture/decisions/0001-pipeline-tools.md diff --git a/docs/technical-documentation/architecture/decisions/0002-openbao-as-identity-provider.md b/docs/technical-documentation/architecture/decisions/0002-openbao-as-identity-provider.md new file mode 100644 index 0000000..1131d57 --- /dev/null +++ b/docs/technical-documentation/architecture/decisions/0002-openbao-as-identity-provider.md @@ -0,0 +1,62 @@ +--- +status: "proposed" +decision-makers: {list everyone involved in the decision} +--- + + +# Replace Keycloak with OpenBao as OIDC Provider + +## Context and Problem Statement + +The EDP currently relies on Keycloak as the OpenID Connect (OIDC) provider to handle authentication and authorization. However, Keycloak is fairly complex and has quite some maintenance overhead, which will leads to increased operational effort. We need to determine if replacing Keycloak with OpenBao, a tool we already use for secrets management and which may support OIDC capabilities, can streamline our architecture and reduce these operational burdens. + +## Decision Drivers + +- Simplify architecture by reducing the number of tools in our ecosystem. +- Reduce operational complexity and maintenance overhead to improve team efficiency. +- Ensure seamless integration with existing systems, particularly leveraging our current use of OpenBao. +- Maintain or enhance security and performance to meet platform requirements. + +## Considered Options + +- Keep using Keycloak +- Replace Keycloak with OpenBao + +## Decision Outcome + +Chosen option: "Replace Keycloak with OpenBao", because it enables us to consolidate identity and secrets management into a single tool, reducing operational complexity, improving integration with our existing infrastructure, and potentially enhancing performance, provided OpenBao can meet our OIDC needs. + +### Consequences + +- *Good*, because it simplifies the architecture by reducing the number of tools we need to manage. +- *Good*, because it may lower operational costs by eliminating a separate system and leveraging an existing open-source tool. +- *Bad*, because additional configuration or development might be required to ensure OpenBao fully supports all necessary OIDC features. +- *Bad*, because relying on a single tool for both identity and secrets management increases risk if OpenBao encounters issues. + +### Confirmation + +- Conduct a proof-of-concept to validate that OpenBao can effectively serve as an OIDC provider meeting our platform’s requirements. +- Validate that all EDP components support the Authorization Code Flow +- Review the design and implementation with the development team to confirm alignment with this decision. + +## Pros and Cons of the Options + +### Keep using Keycloak + +Keycloak is a mature, feature-rich OIDC provider widely used for authentication and authorization. +- *Good*, because it offers extensive OIDC features, including support for single sign-on and various authentication protocols. +- *Good*, because it is already integrated into our platform, minimizing immediate changes. +- *Bad*, because its complexity increases configuration and maintenance efforts. +- *Bad*, because maintaining it as a separate tool adds to operational overhead. + +### Replace Keycloak with OpenBao + +OpenBao, a fork of HashiCorp Vault, is currently used for secrets management and may be configurable as an OIDC provider. +- *Good*, because consolidating identity and secrets management into one tool simplifies our architecture. +- *Good*, because it leverages our existing OpenBao deployment, potentially improving integration and reducing costs. +- *Bad*, because OpenBao may not natively support all advanced OIDC features provided by Keycloak, such as comprehensive user management. +- *Bad*, because its community and documentation for OIDC use cases may be less robust compared to Keycloak. + +## More Information + +Before finalizing this decision, we must verify OpenBao’s OIDC capabilities against our specific authentication and authorization requirements, such as user federation and token issuance for our development platform. The team should also assess the long-term implications of relying heavily on OpenBao and consider revisiting this decision if significant gaps in OIDC functionality are identified during the proof-of-concept phase. diff --git a/docs/technical-documentation/decisions/README.md b/docs/technical-documentation/architecture/decisions/README.md similarity index 100% rename from docs/technical-documentation/decisions/README.md rename to docs/technical-documentation/architecture/decisions/README.md diff --git a/docs/technical-documentation/decisions/_adr-template.md b/docs/technical-documentation/architecture/decisions/_adr-template.md similarity index 100% rename from docs/technical-documentation/decisions/_adr-template.md rename to docs/technical-documentation/architecture/decisions/_adr-template.md diff --git a/docs/technical-documentation/solution/design/_index.md b/docs/technical-documentation/architecture/decisions/design-documents/_index.md similarity index 100% rename from docs/technical-documentation/solution/design/_index.md rename to docs/technical-documentation/architecture/decisions/design-documents/_index.md diff --git a/docs/technical-documentation/solution/design/decision-iam-and-edf-self-containment.md b/docs/technical-documentation/architecture/decisions/design-documents/decision-iam-and-edf-self-containment.md similarity index 100% rename from docs/technical-documentation/solution/design/decision-iam-and-edf-self-containment.md rename to docs/technical-documentation/architecture/decisions/design-documents/decision-iam-and-edf-self-containment.md diff --git a/docs/technical-documentation/solution/design/proposal-local-deployment.md b/docs/technical-documentation/architecture/decisions/design-documents/proposal-local-deployment.md similarity index 100% rename from docs/technical-documentation/solution/design/proposal-local-deployment.md rename to docs/technical-documentation/architecture/decisions/design-documents/proposal-local-deployment.md diff --git a/docs/technical-documentation/solution/design/proposal-stack-hydration.md b/docs/technical-documentation/architecture/decisions/design-documents/proposal-stack-hydration.md similarity index 100% rename from docs/technical-documentation/solution/design/proposal-stack-hydration.md rename to docs/technical-documentation/architecture/decisions/design-documents/proposal-stack-hydration.md diff --git a/docs/technical-documentation/architecture/design/CICD/cicd.excalidraw b/docs/technical-documentation/architecture/design/CICD/cicd.excalidraw new file mode 100644 index 0000000..f5de93d --- /dev/null +++ b/docs/technical-documentation/architecture/design/CICD/cicd.excalidraw @@ -0,0 +1,445 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://marketplace.visualstudio.com/items?itemName=pomdtr.excalidraw-editor", + "elements": [ + { + "id": "MU0uyrRpjgC_tZuhbkPxH", + "type": "image", + "x": 316, + "y": 370, + "width": 1440, + "height": 524, + "angle": 0, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0", + "roundness": null, + "seed": 2045227341, + "version": 204, + "versionNonce": 1182366531, + "isDeleted": false, + "boundElements": null, + "updated": 1744358108510, + "link": null, + "locked": false, + "status": "pending", + "fileId": "c3df721bf708e889692e4c9dccd756a33a89d9d0", + "scale": [ + 1, + 1 + ], + "crop": null + }, + { + "id": "GzthvYme8gDK4IY-kfSUz", + "type": "rectangle", + "x": 530.3960396039604, + "y": 113.99999999999997, + "width": 542.6039603960396, + "height": 208.00000000000003, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "EOD4Yoxh9PV8BYS1gdniu" + ], + "frameId": null, + "index": "a0V", + "roundness": { + "type": 3 + }, + "seed": 2070028259, + "version": 280, + "versionNonce": 1214201485, + "isDeleted": false, + "boundElements": [ + { + "id": "hPzuOJQPWsa8OeNuksAGw", + "type": "arrow" + } + ], + "updated": 1744358177895, + "link": null, + "locked": false + }, + { + "id": "msaBCFIVW2YXu8WgO9mby", + "type": "text", + "x": 556.1782178217821, + "y": 139.74257425742573, + "width": 476.21747007464415, + "height": 148.5148514851485, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "EOD4Yoxh9PV8BYS1gdniu" + ], + "frameId": null, + "index": "a1", + "roundness": null, + "seed": 1352878723, + "version": 440, + "versionNonce": 1596161219, + "isDeleted": false, + "boundElements": [ + { + "id": "hPzuOJQPWsa8OeNuksAGw", + "type": "arrow" + } + ], + "updated": 1744358177895, + "link": null, + "locked": false, + "text": "CI: \n- Review existing Forgejo-pipelines pipelines\n- review existing CI/CD concepts\n_ complete pipelines to a professional standard\n- support versioning/releasing \n- check, review, implement artifacts-mgtm, caching", + "fontSize": 19.801980198019802, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "CI: \n- Review existing Forgejo-pipelines pipelines\n- review existing CI/CD concepts\n_ complete pipelines to a professional standard\n- support versioning/releasing \n- check, review, implement artifacts-mgtm, caching", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "hPzuOJQPWsa8OeNuksAGw", + "type": "arrow", + "x": 889.5994150213716, + "y": 317.6329081056757, + "width": 119.40058497862844, + "height": 119.36709189432429, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a2", + "roundness": { + "type": 2 + }, + "seed": 1114576301, + "version": 295, + "versionNonce": 1366241229, + "isDeleted": false, + "boundElements": null, + "updated": 1744358162841, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 119.40058497862844, + 119.36709189432429 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "msaBCFIVW2YXu8WgO9mby", + "focus": 0.026728142595765114, + "gap": 29.375482363101526 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "m9lQffA4A1_eOT-qI7Vj5", + "type": "rectangle", + "x": 1169.5, + "y": 127.94910991657525, + "width": 547.0000000000003, + "height": 150.00000000000003, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "nzbQ1Unwy2WxYfSYDkYzo" + ], + "frameId": null, + "index": "a3l", + "roundness": { + "type": 3 + }, + "seed": 272810573, + "version": 429, + "versionNonce": 387458851, + "isDeleted": false, + "boundElements": [ + { + "id": "thxQ3sDzQAKzv5eKHi89O", + "type": "arrow" + } + ], + "updated": 1744358179786, + "link": null, + "locked": false + }, + { + "id": "dlWrJlleRV3hW2Z5gkUdh", + "type": "text", + "x": 1212.5, + "y": 151.94910991657525, + "width": 489.05389404296875, + "height": 106.66666666666669, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "nzbQ1Unwy2WxYfSYDkYzo" + ], + "frameId": null, + "index": "a4", + "roundness": null, + "seed": 78573741, + "version": 729, + "versionNonce": 245168739, + "isDeleted": false, + "boundElements": [], + "updated": 1744358179787, + "link": null, + "locked": false, + "text": "CD: \n- provide professional roll-out instrumantation \n (based on gitops)\n- design app-repo-model, design app-model", + "fontSize": 21.333333333333336, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "CD: \n- provide professional roll-out instrumantation \n (based on gitops)\n- design app-repo-model, design app-model", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "thxQ3sDzQAKzv5eKHi89O", + "type": "arrow", + "x": 1441.5245797733246, + "y": 278.5464726412813, + "width": 10.024579773324604, + "height": 395.40263727529384, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a5", + "roundness": { + "type": 2 + }, + "seed": 1279677197, + "version": 830, + "versionNonce": 1819101891, + "isDeleted": false, + "boundElements": [], + "updated": 1744358179787, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -10.024579773324604, + 395.40263727529384 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "m9lQffA4A1_eOT-qI7Vj5", + "focus": -0.0016019799071129404, + "gap": 2.2150955858709267 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "7HAyNAc4b3D7vXlCZGG_p", + "type": "rectangle", + "x": 275.5, + "y": 355.94910991657525, + "width": 328, + "height": 116.00000000000001, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#b2f2bb", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "uWWFSCeVyJQEkFRNjPBJ9" + ], + "frameId": null, + "index": "a5V", + "roundness": { + "type": 3 + }, + "seed": 870005347, + "version": 346, + "versionNonce": 2125279011, + "isDeleted": false, + "boundElements": [ + { + "id": "yDETRcYxxQ_TyjnJbdEmr", + "type": "arrow" + } + ], + "updated": 1744358225022, + "link": null, + "locked": false + }, + { + "id": "2VWaSSz-XS7iMxqWl9d5_", + "type": "text", + "x": 302.5, + "y": 381.94910991657525, + "width": 278.77978515625, + "height": 100, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "uWWFSCeVyJQEkFRNjPBJ9" + ], + "frameId": null, + "index": "a6", + "roundness": null, + "seed": 2112615939, + "version": 534, + "versionNonce": 765477677, + "isDeleted": false, + "boundElements": [ + { + "id": "7hfEqACnBhfttMF6oSFeI", + "type": "arrow" + } + ], + "updated": 1744358243813, + "link": null, + "locked": false, + "text": "Production model: \n- design multiple branching / \n deployment models\n", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Production model: \n- design multiple branching / \n deployment models\n", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "7hfEqACnBhfttMF6oSFeI", + "type": "arrow", + "x": 493.8866694638508, + "y": 475.2039438637962, + "width": 201.40058497862844, + "height": 118.36709189432429, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a9", + "roundness": { + "type": 2 + }, + "seed": 1071186925, + "version": 415, + "versionNonce": 1840438275, + "isDeleted": false, + "boundElements": [], + "updated": 1744358249413, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 201.40058497862844, + 118.36709189432429 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "2VWaSSz-XS7iMxqWl9d5_", + "focus": 0.09623327257164412, + "gap": 6.745166052779041 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "c3df721bf708e889692e4c9dccd756a33a89d9d0": { + "mimeType": "image/png", + "id": "c3df721bf708e889692e4c9dccd756a33a89d9d0", + "dataURL": "data:image/png;base64,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T7T8NpTwmu3r2c0bqO0uuq22SUDzFHQwognogyJ8d5PmsCSiNQF9UGaO9kMJKAEloASUgBJQAkpACSgBJaAElIASUAI+CfAk9PgHxfL5PDY3N7G4uGhOQ7t/zxOthUIBx48f37lS4SAkot1rEYq1Pr6+CrS7Q01G+5wL16qae80LE9D8h5sXWq4vAerq6fkgbp4P+ris5Pr1XRPQ14+9tqwElIASUAJKQAkoASWgBJSAElACSkAJKIFrSuDSZDKvUej1euaajlQqhc985jP4xCc+gRe+8IW4//778bznPQ/Ly8vXtA+2L3Pu1x3i01/q4kP/qY9Kk/dwmP+v5XoS4DUPKoTrKYHLth0NA69+YQg/910hZJIhI6KDfiOHJqAP3DTSDikBJaAElIASUAJKQAkoASWgBJSAElACSuDqCDARzX/cU9FMQPMU69NPP43PfvazeOqpp1Cv17GwsIDnP//5eOCBB8xHC93rFq6udXntwYB9BP7z4x386scH5v7n8HO/myh/mT6pBG4AAtSRchN4/f0BvPv7owgEAwge8Ls4NAF9A0xMHaISUAJKQAkoASWgBJSAElACSkAJKAEloARcAjwRffbsWXzuc58zHy08f/48Tp48iXe84x2Ynp42ietIJGKS10xI79UVHSZJDqDf6+GdH+ni4bMBTMSAwUBlpQRuLAK7nWC+9BA670nvDYBEZIAP/EgI33Y6hsGQSeiDy0wT0AdXNtozJaAElIASUAJKQAkoASWgBJSAElACSkAJXFMCTPoyqeyWtbU1fOUrX0EoFMJLX/pSRKNRc180n2ESmh8udE9Ru/99vP7VdM5JbAdQKNXxU/96iNVyGNEwT25fzVu1rhI4XASojrvNeaOul1xJw//W6w3wj7+3j9e+JIn+IGgS0NdKN681QU1AX2ui+j4loASUgBJQAkpACSgBJaAElIASUAJKQAkccAKXnmpmcrndboMfnmPhB+d4VzQT1K94xStw++23I51OX9NRsU0m3tZzFfzcH4exXtEE9DUFrC87FAR6fZjkMa+iuVy53N8zAd3pDfDL39XGD70siX4gqgnoQyFt7aQSUAJKQAkoASWgBJSAElACSkAJKAEloARuMALjiWgmhJmAdu+L/sM//EM88sgj5lT0qVOncNddd+Hee+/F4uKiuZbjak5bundU8w7o1c0S3v7votio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", + "created": 1744357590112, + "lastRetrieved": 1744357590112 + } + } +} \ No newline at end of file diff --git a/docs/technical-documentation/architecture/design/_index.md b/docs/technical-documentation/architecture/design/_index.md new file mode 100644 index 0000000..fbf08c4 --- /dev/null +++ b/docs/technical-documentation/architecture/design/_index.md @@ -0,0 +1,6 @@ +--- +title: Design +weight: 1 +description: Edge Developver Framework Design +--- + diff --git a/docs/technical-documentation/solution/design/architecture/architecture-IMG_20250121_163020.jpg b/docs/technical-documentation/architecture/design/foundry-berlin-january-2025/architecture-IMG_20250121_163020.jpg similarity index 100% rename from docs/technical-documentation/solution/design/architecture/architecture-IMG_20250121_163020.jpg rename to docs/technical-documentation/architecture/design/foundry-berlin-january-2025/architecture-IMG_20250121_163020.jpg diff --git a/docs/technical-documentation/solution/design/architecture/highlevelarch.md b/docs/technical-documentation/architecture/design/foundry-berlin-january-2025/highlevelarch.md similarity index 100% rename from docs/technical-documentation/solution/design/architecture/highlevelarch.md rename to docs/technical-documentation/architecture/design/foundry-berlin-january-2025/highlevelarch.md diff --git a/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/EDPForgejoArch1.svg b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/EDPForgejoArch1.svg new file mode 100644 index 0000000..3760180 --- /dev/null +++ b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/EDPForgejoArch1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/EDPForgejoArch2.svg b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/EDPForgejoArch2.svg new file mode 100644 index 0000000..0202d23 --- /dev/null +++ b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/EDPForgejoArch2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/EDPForgejoArch3.svg b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/EDPForgejoArch3.svg new file mode 100644 index 0000000..075f2a1 --- /dev/null +++ b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/EDPForgejoArch3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/EDPForgejoArch4.svg b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/EDPForgejoArch4.svg new file mode 100644 index 0000000..68ab5c3 --- /dev/null +++ b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/EDPForgejoArch4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/EDPForgejoArch5.svg b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/EDPForgejoArch5.svg new file mode 100644 index 0000000..6e8c679 --- /dev/null +++ b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/EDPForgejoArch5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/EDPForgejoArch6.svg b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/EDPForgejoArch6.svg new file mode 100644 index 0000000..504ac7d --- /dev/null +++ b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/EDPForgejoArch6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/edp-otc-1.png b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/edp-otc-1.png new file mode 100644 index 0000000..b7d8980 Binary files /dev/null and b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/edp-otc-1.png differ diff --git a/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/edp-otc-2.png b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/edp-otc-2.png new file mode 100644 index 0000000..7ac911e Binary files /dev/null and b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/edp-otc-2.png differ diff --git a/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/edp-otc-3.png b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/edp-otc-3.png new file mode 100644 index 0000000..850e512 Binary files /dev/null and b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/edp-otc-3.png differ diff --git a/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/edp-otc-4.png b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/edp-otc-4.png new file mode 100644 index 0000000..c6d73f7 Binary files /dev/null and b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/edp-otc-4.png differ diff --git a/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/edp-otc-5.png b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/edp-otc-5.png new file mode 100644 index 0000000..65e3a4c Binary files /dev/null and b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/edp-otc-5.png differ diff --git a/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/image-1.png b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/image-1.png new file mode 100644 index 0000000..b431a6a Binary files /dev/null and b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/image-1.png differ diff --git a/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/image.png b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/image.png new file mode 100644 index 0000000..a467f35 Binary files /dev/null and b/docs/technical-documentation/architecture/design/mvp1-12-otc/_assets/image.png differ diff --git a/docs/technical-documentation/architecture/design/mvp1-12-otc/deployment.excalidraw b/docs/technical-documentation/architecture/design/mvp1-12-otc/deployment.excalidraw new file mode 100644 index 0000000..72f81b7 --- /dev/null +++ b/docs/technical-documentation/architecture/design/mvp1-12-otc/deployment.excalidraw @@ -0,0 +1,3308 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://marketplace.visualstudio.com/items?itemName=pomdtr.excalidraw-editor", + "elements": [ + { + "id": "hi3ngLiwTJOih4BAEnzxk", + "type": "rectangle", + "x": -238.800048828125, + "y": 467.20006561279286, + "width": 197.59997558593753, + "height": 85, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "Zu", + "roundness": { + "type": 3 + }, + "seed": 1333273348, + "version": 516, + "versionNonce": 1410852228, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "ox8u81F8hhrz3cqIhFP6M" + } + ], + "updated": 1748012724761, + "link": null, + "locked": false + }, + { + "id": "ox8u81F8hhrz3cqIhFP6M", + "type": "text", + "x": -215.4300079345703, + "y": 472.20006561279286, + "width": 150.85989379882812, + "height": 75, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffc9c9", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ZuG", + "roundness": null, + "seed": 850835460, + "version": 85, + "versionNonce": 641160324, + "isDeleted": false, + "boundElements": null, + "updated": 1748012727546, + "link": null, + "locked": false, + "text": "<>\nInitial Central-\nProductForgejo", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "hi3ngLiwTJOih4BAEnzxk", + "originalText": "<>\nInitial Central-ProductForgejo", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "rnZLaRo5IZxB0Qg5J1nj5", + "type": "rectangle", + "x": 37.600006103515625, + "y": 352.0000305175781, + "width": 1057.2001342773438, + "height": 570.3999328613281, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0", + "roundness": { + "type": 3 + }, + "seed": 365897532, + "version": 396, + "versionNonce": 1460716348, + "isDeleted": false, + "boundElements": null, + "updated": 1748012212212, + "link": null, + "locked": false + }, + { + "id": "dwqHcLLhH2dTqNbO1PCrp", + "type": "text", + "x": 60, + "y": 371.6000061035156, + "width": 52.13996887207031, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a1", + "roundness": null, + "seed": 2067741500, + "version": 186, + "versionNonce": 1796012988, + "isDeleted": false, + "boundElements": null, + "updated": 1748012212212, + "link": null, + "locked": false, + "text": "Cloud", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Cloud", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "hZgoe3DWTizByyjZO1FIr", + "type": "rectangle", + "x": 229.60000610351562, + "y": 369.6000061035156, + "width": 325.20007324218756, + "height": 141.60003662109375, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#b2f2bb", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a2", + "roundness": { + "type": 3 + }, + "seed": 130164996, + "version": 277, + "versionNonce": 334373948, + "isDeleted": false, + "boundElements": [ + { + "id": "QAH2VWcVV4JguUZVce2q_", + "type": "arrow" + }, + { + "id": "GTZpW_41N37QceXtSrK0n", + "type": "arrow" + } + ], + "updated": 1748012212212, + "link": null, + "locked": false + }, + { + "id": "qF5DG5B5xvSh2jKSLfOpQ", + "type": "text", + "x": 252.61009216308594, + "y": 383.1000061035156, + "width": 243.97982788085938, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a2V", + "roundness": null, + "seed": 1247582212, + "version": 321, + "versionNonce": 1904426428, + "isDeleted": false, + "boundElements": null, + "updated": 1748012212213, + "link": null, + "locked": false, + "text": "EDPFoundry ProdCluster", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": null, + "originalText": "EDPFoundry ProdCluster", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Mu1wXcYXYalXAyQ7hUuvL", + "type": "rectangle", + "x": 230.80007934570312, + "y": 538.800048828125, + "width": 325.2000122070313, + "height": 141.60003662109375, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#b2f2bb", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a5", + "roundness": { + "type": 3 + }, + "seed": 260488636, + "version": 325, + "versionNonce": 910960188, + "isDeleted": false, + "boundElements": [ + { + "id": "TdNiyAznpX_fz2EYmgm4z", + "type": "arrow" + } + ], + "updated": 1748012212213, + "link": null, + "locked": false + }, + { + "id": "0HiA6WW11wqNZcB6WWCG4", + "type": "text", + "x": 261.4501037597656, + "y": 551.0000610351562, + "width": 270.2998046875, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a6", + "roundness": null, + "seed": 1205839420, + "version": 437, + "versionNonce": 1877788476, + "isDeleted": false, + "boundElements": [], + "updated": 1748012212213, + "link": null, + "locked": false, + "text": "<>\nEDPFoundry StagingCluster", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": null, + "originalText": "<>\nEDPFoundry StagingCluster", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "hauWR5IqR3a2VDvXjZVqa", + "type": "rectangle", + "x": 230.00003051757812, + "y": 694, + "width": 334.0000610351563, + "height": 141.60003662109375, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#b2f2bb", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a7", + "roundness": { + "type": 3 + }, + "seed": 1152159548, + "version": 362, + "versionNonce": 298352572, + "isDeleted": false, + "boundElements": [ + { + "id": "otPltggXoB6RadUxaO3xq", + "type": "arrow" + } + ], + "updated": 1748012212213, + "link": null, + "locked": false + }, + { + "id": "Z34H4bgLUKO5ZAeu4LYbM", + "type": "text", + "x": 241.960205078125, + "y": 707.8000183105469, + "width": 318.07977294921875, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a8", + "roundness": null, + "seed": 1263486908, + "version": 479, + "versionNonce": 1346420924, + "isDeleted": false, + "boundElements": [], + "updated": 1748012212213, + "link": null, + "locked": false, + "text": "<>\nEDPFoundry DevelopmentCluster", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": null, + "originalText": "<>\nEDPFoundry DevelopmentCluster", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "4HvJGQmzlS1cSMYZpxnse", + "type": "rectangle", + "x": 728.60009765625, + "y": 373.99998474121094, + "width": 342.00012207031256, + "height": 141.60003662109375, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a9", + "roundness": { + "type": 3 + }, + "seed": 1708642492, + "version": 402, + "versionNonce": 2068005380, + "isDeleted": false, + "boundElements": [ + { + "id": "tqBOxvuBl9LRnnRFn1pfv", + "type": "arrow" + } + ], + "updated": 1748012570289, + "link": null, + "locked": false + }, + { + "id": "rKqH9_5PgFojQhiV_X1OQ", + "type": "text", + "x": 768.280158996582, + "y": 387.49998474121094, + "width": 210.63987731933594, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aA", + "roundness": null, + "seed": 2023119164, + "version": 440, + "versionNonce": 592783932, + "isDeleted": false, + "boundElements": [], + "updated": 1748012212213, + "link": null, + "locked": false, + "text": "EDPEDP ProdCluster", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": null, + "originalText": "EDPEDP ProdCluster", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "l9a9cAXHwFP97iP3Z0quf", + "type": "rectangle", + "x": 771.5999755859375, + "y": 436.00001525878906, + "width": 157.5999755859375, + "height": 51.19999694824219, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aB", + "roundness": { + "type": 3 + }, + "seed": 129828868, + "version": 232, + "versionNonce": 539787964, + "isDeleted": false, + "boundElements": null, + "updated": 1748012212213, + "link": null, + "locked": false + }, + { + "id": "pssnN4Ve7K1gQ6tqwqTtI", + "type": "arrow", + "x": 850.4000244140625, + "y": 461.6000213623047, + "width": 10.39996337890625, + "height": 3.1999969482421875, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aC", + "roundness": { + "type": 2 + }, + "seed": 720571012, + "version": 239, + "versionNonce": 696568636, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "I2tQg1Q5Qu25X9m9SrpWv" + } + ], + "updated": 1748012212213, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 10.39996337890625, + -3.1999969482421875 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "I2tQg1Q5Qu25X9m9SrpWv", + "type": "text", + "x": 865.3701019287109, + "y": 269.40000915527344, + "width": 150.85989379882812, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aD", + "roundness": null, + "seed": 942049340, + "version": 26, + "versionNonce": 1100549380, + "isDeleted": false, + "boundElements": null, + "updated": 1748011606253, + "link": null, + "locked": false, + "text": "Central-\nProductForgejo", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "pssnN4Ve7K1gQ6tqwqTtI", + "originalText": "Central-ProductForgejo", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Iwt7Wl--Lq_Qx0zjBaDfa", + "type": "rectangle", + "x": 253.20004272460938, + "y": 424.80001068115234, + "width": 157.5999755859375, + "height": 51.19999694824219, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aE", + "roundness": { + "type": 3 + }, + "seed": 831969596, + "version": 243, + "versionNonce": 1639973820, + "isDeleted": false, + "boundElements": [], + "updated": 1748012212213, + "link": null, + "locked": false + }, + { + "id": "d11pS2FFtj4Of-08PLT6r", + "type": "arrow", + "x": 332.0000915527344, + "y": 450.40001678466797, + "width": 10.39996337890625, + "height": 3.1999969482421875, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aF", + "roundness": { + "type": 2 + }, + "seed": 2019578300, + "version": 250, + "versionNonce": 1325411388, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "_Ag6pwIBjm3a4Ylmk0D2f" + } + ], + "updated": 1748012212213, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 10.39996337890625, + -3.1999969482421875 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "_Ag6pwIBjm3a4Ylmk0D2f", + "type": "text", + "x": 465.2501525878906, + "y": 274.7000045776367, + "width": 149.4998779296875, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aG", + "roundness": null, + "seed": 140950076, + "version": 35, + "versionNonce": 117703556, + "isDeleted": false, + "boundElements": [], + "updated": 1748011579733, + "link": null, + "locked": false, + "text": "FoundryForgejo", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "d11pS2FFtj4Of-08PLT6r", + "originalText": "FoundryForgejo", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "pQ9gN-vm0zEnChfx5Kb_M", + "type": "rectangle", + "x": 446.4000244140625, + "y": 424.8000183105469, + "width": 92.79998779296875, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aH", + "roundness": { + "type": 3 + }, + "seed": 507460228, + "version": 143, + "versionNonce": 1663517884, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "0mfcVC7bIEA-7pLG6N7AN" + }, + { + "id": "tqBOxvuBl9LRnnRFn1pfv", + "type": "arrow" + } + ], + "updated": 1748012212213, + "link": null, + "locked": false + }, + { + "id": "0mfcVC7bIEA-7pLG6N7AN", + "type": "text", + "x": 454.2800521850586, + "y": 429.8000183105469, + "width": 77.03993225097656, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aHV", + "roundness": null, + "seed": 335751684, + "version": 105, + "versionNonce": 64441660, + "isDeleted": false, + "boundElements": null, + "updated": 1748012212213, + "link": null, + "locked": false, + "text": "Foundry\nActions", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "pQ9gN-vm0zEnChfx5Kb_M", + "originalText": "FoundryActions", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "QKUMseWXf7_PU-lMHlsDO", + "type": "rectangle", + "x": 951.2000732421875, + "y": 436.0000305175781, + "width": 91.99993896484376, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aI", + "roundness": { + "type": 3 + }, + "seed": 1449844356, + "version": 266, + "versionNonce": 1947872828, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "1b3eKrfI3kk_SfYPL7BMW" + }, + { + "id": "otPltggXoB6RadUxaO3xq", + "type": "arrow" + }, + { + "id": "TdNiyAznpX_fz2EYmgm4z", + "type": "arrow" + }, + { + "id": "QAH2VWcVV4JguUZVce2q_", + "type": "arrow" + } + ], + "updated": 1748012212213, + "link": null, + "locked": false + }, + { + "id": "1b3eKrfI3kk_SfYPL7BMW", + "type": "text", + "x": 960.7400741577148, + "y": 441.0000305175781, + "width": 72.91993713378906, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aJ", + "roundness": null, + "seed": 1244509316, + "version": 166, + "versionNonce": 431031996, + "isDeleted": false, + "boundElements": null, + "updated": 1748012212213, + "link": null, + "locked": false, + "text": "EDP\nActions", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "QKUMseWXf7_PU-lMHlsDO", + "originalText": "EDP Actions", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "tqBOxvuBl9LRnnRFn1pfv", + "type": "arrow", + "x": 545.7583951916573, + "y": 457.5374455116762, + "width": 181.5502932585107, + "height": 1.926844163161718, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aK", + "roundness": { + "type": 2 + }, + "seed": 980750268, + "version": 370, + "versionNonce": 448834692, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "BDmu2uxSH42nptAU-ZLwb" + } + ], + "updated": 1748012212352, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 181.5502932585107, + 1.926844163161718 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "pQ9gN-vm0zEnChfx5Kb_M", + "focus": 0.07134109135673972, + "gap": 6.558382984626064 + }, + "endBinding": { + "elementId": "4HvJGQmzlS1cSMYZpxnse", + "focus": -0.22712785661633486, + "gap": 1.291409206081994 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "BDmu2uxSH42nptAU-ZLwb", + "type": "text", + "x": 756.0600433349609, + "y": 281.1000061035156, + "width": 60.679962158203125, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aKV", + "roundness": null, + "seed": 1344808892, + "version": 10, + "versionNonce": 1301605564, + "isDeleted": false, + "boundElements": null, + "updated": 1748012164938, + "link": null, + "locked": false, + "text": "deploy", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "tqBOxvuBl9LRnnRFn1pfv", + "originalText": "deploy", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "otPltggXoB6RadUxaO3xq", + "type": "arrow", + "x": 992.47583880813, + "y": 499.6513044001237, + "width": 418.3013872092462, + "height": 277.28972008337206, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aL", + "roundness": { + "type": 2 + }, + "seed": 1640029372, + "version": 466, + "versionNonce": 1593256324, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "JT_TiWO1T_HuVpPx-eRdR" + } + ], + "updated": 1748012321024, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -161.2757655659425, + 241.94870170339192 + ], + [ + -418.3013872092462, + 277.28972008337206 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "QKUMseWXf7_PU-lMHlsDO", + "focus": -0.26829566698490465, + "gap": 3.6512738825455813 + }, + "endBinding": { + "elementId": "hauWR5IqR3a2VDvXjZVqa", + "focus": 0.3893078161082114, + "gap": 10.174360046149445 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "JT_TiWO1T_HuVpPx-eRdR", + "type": "text", + "x": 690.8201599121094, + "y": 716.6000061035156, + "width": 280.75982666015625, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aLV", + "roundness": null, + "seed": 1165221124, + "version": 39, + "versionNonce": 1974263740, + "isDeleted": false, + "boundElements": null, + "updated": 1748012319769, + "link": null, + "locked": false, + "text": "foundry next release develop\ndevelop", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "otPltggXoB6RadUxaO3xq", + "originalText": "foundry next release develop develop", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "TdNiyAznpX_fz2EYmgm4z", + "type": "arrow", + "x": 983.2947630482727, + "y": 500.0091892909431, + "width": 424.97929772384657, + "height": 119.80442776372513, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aM", + "roundness": { + "type": 2 + }, + "seed": 692539268, + "version": 759, + "versionNonce": 1422018180, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "XS_ZCh-a7w_EWgs-rQlYJ" + } + ], + "updated": 1748012311008, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -161.56112009115986, + 107.79448658238306 + ], + [ + -424.97929772384657, + 119.80442776372513 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "QKUMseWXf7_PU-lMHlsDO", + "focus": -0.40749533905815083, + "gap": 4.009158773364959 + }, + "endBinding": { + "elementId": "Mu1wXcYXYalXAyQ7hUuvL", + "focus": 0.2267192954360434, + "gap": 2.315373771691725 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "XS_ZCh-a7w_EWgs-rQlYJ", + "type": "text", + "x": 689.3737491582847, + "y": 595.3036758733261, + "width": 264.71978759765625, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aMV", + "roundness": null, + "seed": 1360179972, + "version": 32, + "versionNonce": 2064569020, + "isDeleted": false, + "boundElements": null, + "updated": 1748012309181, + "link": null, + "locked": false, + "text": "foundry next release stage", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "TdNiyAznpX_fz2EYmgm4z", + "originalText": "foundry next release stage", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "QAH2VWcVV4JguUZVce2q_", + "type": "arrow", + "x": 991.3636681407363, + "y": 498.4428675226963, + "width": 441.50711570357873, + "height": 56.29212713078806, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aN", + "roundness": { + "type": 2 + }, + "seed": 1577709500, + "version": 1084, + "versionNonce": 633921412, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "iDa4bOtFijKfMYijuxr3T" + } + ], + "updated": 1748012296079, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -286.85263252702066, + 56.29212713078806 + ], + [ + -441.50711570357873, + 6.610406072284434 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "QKUMseWXf7_PU-lMHlsDO", + "focus": -0.8019436487183847, + "gap": 2.4428370051181787 + }, + "endBinding": { + "elementId": "hZgoe3DWTizByyjZO1FIr", + "focus": 0.11384759397010125, + "gap": 3.4855535897649688 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "iDa4bOtFijKfMYijuxr3T", + "type": "text", + "x": 603.7911106869578, + "y": 542.2349946534844, + "width": 201.43984985351562, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aNV", + "roundness": null, + "seed": 2007405244, + "version": 25, + "versionNonce": 347867580, + "isDeleted": false, + "boundElements": null, + "updated": 1748012294516, + "link": null, + "locked": false, + "text": "foundry next release", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "QAH2VWcVV4JguUZVce2q_", + "originalText": "foundry next release", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "HT9jUxM08GVwGy4_491Ta", + "type": "rectangle", + "x": -132.00006103515625, + "y": 644.800048828125, + "width": 99.20001220703125, + "height": 104, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffc9c9", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aP", + "roundness": { + "type": 3 + }, + "seed": 1801144836, + "version": 197, + "versionNonce": 1742786948, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "4eRgy3kCZVB1w2KJPVCaN" + }, + { + "id": "GTZpW_41N37QceXtSrK0n", + "type": "arrow" + } + ], + "updated": 1748012601553, + "link": null, + "locked": false + }, + { + "id": "4eRgy3kCZVB1w2KJPVCaN", + "type": "text", + "x": -115.86003112792969, + "y": 684.300048828125, + "width": 66.91995239257812, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aQ", + "roundness": null, + "seed": 1778479420, + "version": 168, + "versionNonce": 250139452, + "isDeleted": false, + "boundElements": null, + "updated": 1748012212213, + "link": null, + "locked": false, + "text": "Laptop", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "HT9jUxM08GVwGy4_491Ta", + "originalText": "Laptop", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "GTZpW_41N37QceXtSrK0n", + "type": "arrow", + "x": -27.615260351367482, + "y": 650.2169564849485, + "width": 257.8234022341961, + "height": 162.95044673629218, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aR", + "roundness": { + "type": 2 + }, + "seed": 1032134844, + "version": 372, + "versionNonce": 345293500, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "DR9hlsT13KZp-BYdjyviH" + } + ], + "updated": 1748012285584, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 257.8234022341961, + -162.95044673629218 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "HT9jUxM08GVwGy4_491Ta", + "focus": -0.1434678969962292, + "gap": 9.644680295874993 + }, + "endBinding": { + "elementId": "hZgoe3DWTizByyjZO1FIr", + "focus": 0.31985447582886084, + "gap": 1 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "DR9hlsT13KZp-BYdjyviH", + "type": "text", + "x": 21.89649264561342, + "y": 543.7417331168024, + "width": 158.79989624023438, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aS", + "roundness": null, + "seed": 234649348, + "version": 34, + "versionNonce": 1128400900, + "isDeleted": false, + "boundElements": null, + "updated": 1748012283812, + "link": null, + "locked": false, + "text": " seed foundry\nrelease 1", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "GTZpW_41N37QceXtSrK0n", + "originalText": " seed foundry release 1", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ZijzuElil5t2oVmZCGLyq", + "type": "rectangle", + "x": 266, + "y": 767.2000198364258, + "width": 157.5999755859375, + "height": 51.19999694824219, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aT", + "roundness": { + "type": 3 + }, + "seed": 1793177916, + "version": 306, + "versionNonce": 769501828, + "isDeleted": false, + "boundElements": [], + "updated": 1748012377228, + "link": null, + "locked": false + }, + { + "id": "118DXzvxvU4j90rP4nuwt", + "type": "arrow", + "x": 344.800048828125, + "y": 792.8000259399414, + "width": 10.39996337890625, + "height": 3.1999969482421875, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aU", + "roundness": { + "type": 2 + }, + "seed": 89076156, + "version": 313, + "versionNonce": 1431157252, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "_QaXpoeDqIMAhAd_lDNxZ" + } + ], + "updated": 1748012377228, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 10.39996337890625, + -3.1999969482421875 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "_QaXpoeDqIMAhAd_lDNxZ", + "type": "text", + "x": 358.85009765625, + "y": 473.9000015258789, + "width": 149.4998779296875, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aV", + "roundness": null, + "seed": 1417255484, + "version": 39, + "versionNonce": 1979347900, + "isDeleted": false, + "boundElements": [], + "updated": 1748012371690, + "link": null, + "locked": false, + "text": "FoundryForgejo", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "118DXzvxvU4j90rP4nuwt", + "originalText": "FoundryForgejo", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "O7bgjdue74b0KOIdr35He", + "type": "rectangle", + "x": 250.79998779296875, + "y": 611.9999771118164, + "width": 157.5999755859375, + "height": 51.19999694824219, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aW", + "roundness": { + "type": 3 + }, + "seed": 113395844, + "version": 306, + "versionNonce": 1084452796, + "isDeleted": false, + "boundElements": [], + "updated": 1748012386226, + "link": null, + "locked": false + }, + { + "id": "qT9Efp1eS5irOINjLZUUa", + "type": "arrow", + "x": 329.60003662109375, + "y": 637.599983215332, + "width": 10.39996337890625, + "height": 3.1999969482421875, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aX", + "roundness": { + "type": 2 + }, + "seed": 602839044, + "version": 313, + "versionNonce": 1452677180, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "FElIaWK0KovG90lPrKpbx" + } + ], + "updated": 1748012386226, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 10.39996337890625, + -3.1999969482421875 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "FElIaWK0KovG90lPrKpbx", + "type": "text", + "x": 122.05010986328125, + "y": 790.7000198364258, + "width": 149.4998779296875, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aY", + "roundness": null, + "seed": 98891652, + "version": 39, + "versionNonce": 70284804, + "isDeleted": false, + "boundElements": [], + "updated": 1748012381238, + "link": null, + "locked": false, + "text": "FoundryForgejo", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "qT9Efp1eS5irOINjLZUUa", + "originalText": "FoundryForgejo", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "nSprSjm1UEi4FoefO4hsn", + "type": "rectangle", + "x": -235.60019429524755, + "y": 1341.0668970743818, + "width": 197.59997558593753, + "height": 85, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "af", + "roundness": { + "type": 3 + }, + "seed": 63764612, + "version": 742, + "versionNonce": 239058564, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "g7tW2vsHvJFrllPL8ktJd" + } + ], + "updated": 1748019443933, + "link": null, + "locked": false + }, + { + "id": "g7tW2vsHvJFrllPL8ktJd", + "type": "text", + "x": -212.23015340169286, + "y": 1346.0668970743818, + "width": 150.85989379882812, + "height": 75, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffc9c9", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ag", + "roundness": null, + "seed": 203638788, + "version": 311, + "versionNonce": 139283972, + "isDeleted": false, + "boundElements": [], + "updated": 1748019443933, + "link": null, + "locked": false, + "text": "<>\nInitial Central-\nProductForgejo", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "nSprSjm1UEi4FoefO4hsn", + "originalText": "<>\nInitial Central-ProductForgejo", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "9a_b7YWTk85BI6u4QO8yh", + "type": "rectangle", + "x": 40.79986063639308, + "y": 1225.866861979167, + "width": 1057.2001342773438, + "height": 570.3999328613281, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ah", + "roundness": { + "type": 3 + }, + "seed": 1677961092, + "version": 622, + "versionNonce": 419229060, + "isDeleted": false, + "boundElements": [], + "updated": 1748019443933, + "link": null, + "locked": false + }, + { + "id": "jwKOiiaKs773WMvyy7aFm", + "type": "text", + "x": 63.19985453287745, + "y": 1245.4668375651045, + "width": 52.13996887207031, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ai", + "roundness": null, + "seed": 799807236, + "version": 412, + "versionNonce": 1099734276, + "isDeleted": false, + "boundElements": [], + "updated": 1748019443933, + "link": null, + "locked": false, + "text": "Cloud", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Cloud", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "SVxXF1MTM5vmubnUpS43U", + "type": "rectangle", + "x": 232.79986063639308, + "y": 1243.4668375651045, + "width": 325.20007324218756, + "height": 141.60003662109375, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#b2f2bb", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aj", + "roundness": { + "type": 3 + }, + "seed": 1536857732, + "version": 503, + "versionNonce": 729439364, + "isDeleted": false, + "boundElements": [ + { + "id": "rETVJJQzb4-B-nv0ODSaf", + "type": "arrow" + }, + { + "id": "D26XRd43WAKequylMRcrj", + "type": "arrow" + } + ], + "updated": 1748019443933, + "link": null, + "locked": false + }, + { + "id": "nDCxoihPGN6zQJ6eJp5CA", + "type": "text", + "x": 255.8099466959634, + "y": 1256.9668375651045, + "width": 243.97982788085938, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ak", + "roundness": null, + "seed": 344794628, + "version": 547, + "versionNonce": 1143208708, + "isDeleted": false, + "boundElements": [], + "updated": 1748019443933, + "link": null, + "locked": false, + "text": "EDPFoundry ProdCluster", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": null, + "originalText": "EDPFoundry ProdCluster", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "APIaUjo4w2kpVyaCRyjfQ", + "type": "rectangle", + "x": 233.99993387858058, + "y": 1412.6668802897138, + "width": 325.2000122070313, + "height": 141.60003662109375, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#b2f2bb", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "al", + "roundness": { + "type": 3 + }, + "seed": 1065469316, + "version": 551, + "versionNonce": 1601567364, + "isDeleted": false, + "boundElements": [ + { + "id": "4lJV8J_Cy-svF8mef0DxM", + "type": "arrow" + } + ], + "updated": 1748019443933, + "link": null, + "locked": false + }, + { + "id": "cSNbyri3_x_0IQeWUQVCK", + "type": "text", + "x": 264.6499582926431, + "y": 1424.866892496745, + "width": 270.2998046875, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "am", + "roundness": null, + "seed": 1907782916, + "version": 663, + "versionNonce": 114567556, + "isDeleted": false, + "boundElements": [], + "updated": 1748019443933, + "link": null, + "locked": false, + "text": "<>\nEDPFoundry StagingCluster", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": null, + "originalText": "<>\nEDPFoundry StagingCluster", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "-TL8tjGFyZ5_byIEb5qRB", + "type": "rectangle", + "x": 233.19988505045558, + "y": 1567.8668314615888, + "width": 334.0000610351563, + "height": 141.60003662109375, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#b2f2bb", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "an", + "roundness": { + "type": 3 + }, + "seed": 1755919492, + "version": 588, + "versionNonce": 1763465476, + "isDeleted": false, + "boundElements": [ + { + "id": "YoeNmHsXpnyaCSiCOZFGU", + "type": "arrow" + } + ], + "updated": 1748019443933, + "link": null, + "locked": false + }, + { + "id": "BxObrlVlUewgHqJR9bOUC", + "type": "text", + "x": 245.16005961100245, + "y": 1581.6668497721357, + "width": 318.07977294921875, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ao", + "roundness": null, + "seed": 35128324, + "version": 705, + "versionNonce": 1012197380, + "isDeleted": false, + "boundElements": [], + "updated": 1748019443933, + "link": null, + "locked": false, + "text": "<>\nEDPFoundry DevelopmentCluster", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": null, + "originalText": "<>\nEDPFoundry DevelopmentCluster", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "2UDM4P_noUcp-QXGe6Spc", + "type": "rectangle", + "x": 731.7999521891275, + "y": 1247.8668162027998, + "width": 342.00012207031256, + "height": 141.60003662109375, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ap", + "roundness": { + "type": 3 + }, + "seed": 872473476, + "version": 628, + "versionNonce": 1560364932, + "isDeleted": false, + "boundElements": [ + { + "id": "oAF2m9fWItY6vvRnsAx-i", + "type": "arrow" + } + ], + "updated": 1748019443933, + "link": null, + "locked": false + }, + { + "id": "rDxC6yTxwGuB3DsqNWfjj", + "type": "text", + "x": 771.4800135294595, + "y": 1261.3668162027998, + "width": 210.63987731933594, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aq", + "roundness": null, + "seed": 77714180, + "version": 666, + "versionNonce": 699414148, + "isDeleted": false, + "boundElements": [], + "updated": 1748019443933, + "link": null, + "locked": false, + "text": "EDPEDP ProdCluster", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": null, + "originalText": "EDPEDP ProdCluster", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "_y7Q1cn8XTXNNiiT4XA0_", + "type": "rectangle", + "x": 774.799830118815, + "y": 1309.866846720378, + "width": 157.5999755859375, + "height": 51.19999694824219, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ar", + "roundness": { + "type": 3 + }, + "seed": 41472644, + "version": 458, + "versionNonce": 1324271108, + "isDeleted": false, + "boundElements": [], + "updated": 1748019443933, + "link": null, + "locked": false + }, + { + "id": "zwepccB9QdvXE2BHIMMoA", + "type": "arrow", + "x": 853.59987894694, + "y": 1335.4668528238935, + "width": 10.39996337890625, + "height": 3.1999969482421875, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "as", + "roundness": { + "type": 2 + }, + "seed": 1011081732, + "version": 465, + "versionNonce": 2091869572, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "14xYbNGgJtpnDpDPPkFOu" + } + ], + "updated": 1748019443933, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 10.39996337890625, + -3.1999969482421875 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "14xYbNGgJtpnDpDPPkFOu", + "type": "text", + "x": 1586.1700134277344, + "y": 839.8000437418618, + "width": 150.85989379882812, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "at", + "roundness": null, + "seed": 956367236, + "version": 116, + "versionNonce": 1110011524, + "isDeleted": false, + "boundElements": [], + "updated": 1748019416058, + "link": null, + "locked": false, + "text": "Central-\nProductForgejo", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "zwepccB9QdvXE2BHIMMoA", + "originalText": "Central-ProductForgejo", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "86jtZ3wD_OLlqz7AjjtLQ", + "type": "rectangle", + "x": 256.3998972574868, + "y": 1298.6668421427412, + "width": 157.5999755859375, + "height": 51.19999694824219, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "au", + "roundness": { + "type": 3 + }, + "seed": 1877881092, + "version": 469, + "versionNonce": 2016417028, + "isDeleted": false, + "boundElements": [], + "updated": 1748019443933, + "link": null, + "locked": false + }, + { + "id": "41kNUto2MHWvHA-x-oewK", + "type": "arrow", + "x": 335.1999460856118, + "y": 1324.2668482462568, + "width": 10.39996337890625, + "height": 3.1999969482421875, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "av", + "roundness": { + "type": 2 + }, + "seed": 1082749060, + "version": 476, + "versionNonce": 787403908, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "q65n5OvjGDe35ZX8tMBVq" + } + ], + "updated": 1748019443933, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 10.39996337890625, + -3.1999969482421875 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "q65n5OvjGDe35ZX8tMBVq", + "type": "text", + "x": 1068.4500885009766, + "y": 841.1000391642251, + "width": 149.4998779296875, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aw", + "roundness": null, + "seed": 1787871236, + "version": 125, + "versionNonce": 1066980412, + "isDeleted": false, + "boundElements": [], + "updated": 1748019416058, + "link": null, + "locked": false, + "text": "FoundryForgejo", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "41kNUto2MHWvHA-x-oewK", + "originalText": "FoundryForgejo", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "lTs53OTp7r_oRfFizwf21", + "type": "rectangle", + "x": 449.59987894693995, + "y": 1298.6668497721357, + "width": 92.79998779296875, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ax", + "roundness": { + "type": 3 + }, + "seed": 100802436, + "version": 369, + "versionNonce": 782869508, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "fEv6TK7YrxzskI3Aue5_V" + }, + { + "id": "oAF2m9fWItY6vvRnsAx-i", + "type": "arrow" + } + ], + "updated": 1748019443933, + "link": null, + "locked": false + }, + { + "id": "fEv6TK7YrxzskI3Aue5_V", + "type": "text", + "x": 457.47990671793605, + "y": 1303.6668497721357, + "width": 77.03993225097656, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ay", + "roundness": null, + "seed": 2065403652, + "version": 331, + "versionNonce": 492733316, + "isDeleted": false, + "boundElements": [], + "updated": 1748019443933, + "link": null, + "locked": false, + "text": "Foundry\nActions", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "lTs53OTp7r_oRfFizwf21", + "originalText": "FoundryActions", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "x0Y4kbZo2mhoHWpIPwCtG", + "type": "rectangle", + "x": 954.399927775065, + "y": 1309.866861979167, + "width": 91.99993896484376, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "az", + "roundness": { + "type": 3 + }, + "seed": 2052787844, + "version": 492, + "versionNonce": 686715524, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "YfzDHX8ooEJpjeuaLhGEq" + }, + { + "id": "YoeNmHsXpnyaCSiCOZFGU", + "type": "arrow" + }, + { + "id": "4lJV8J_Cy-svF8mef0DxM", + "type": "arrow" + }, + { + "id": "rETVJJQzb4-B-nv0ODSaf", + "type": "arrow" + } + ], + "updated": 1748019443933, + "link": null, + "locked": false + }, + { + "id": "YfzDHX8ooEJpjeuaLhGEq", + "type": "text", + "x": 963.9399286905923, + "y": 1314.866861979167, + "width": 72.91993713378906, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b00", + "roundness": null, + "seed": 1954455044, + "version": 392, + "versionNonce": 1124434436, + "isDeleted": false, + "boundElements": [], + "updated": 1748019443933, + "link": null, + "locked": false, + "text": "EDP\nActions", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "x0Y4kbZo2mhoHWpIPwCtG", + "originalText": "EDP Actions", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "oAF2m9fWItY6vvRnsAx-i", + "type": "arrow", + "x": 548.9582497245347, + "y": 1331.404276973265, + "width": 181.5502932585107, + "height": 1.926844163161718, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b01", + "roundness": { + "type": 2 + }, + "seed": 310656388, + "version": 1058, + "versionNonce": 444739772, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "Dl7zzxm_ceEPzZdmOxydS" + } + ], + "updated": 1748019444987, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 181.5502932585107, + 1.926844163161718 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "lTs53OTp7r_oRfFizwf21", + "focus": 0.07134109135674495, + "gap": 6.5583829846259505 + }, + "endBinding": { + "elementId": "2UDM4P_noUcp-QXGe6Spc", + "focus": -0.22712785661633622, + "gap": 1.2914092060821076 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "Dl7zzxm_ceEPzZdmOxydS", + "type": "text", + "x": 1417.3934966548968, + "y": 849.2008899728141, + "width": 60.679962158203125, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b02", + "roundness": null, + "seed": 766110980, + "version": 100, + "versionNonce": 962146236, + "isDeleted": false, + "boundElements": [], + "updated": 1748019416058, + "link": null, + "locked": false, + "text": "deploy", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "oAF2m9fWItY6vvRnsAx-i", + "originalText": "deploy", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "YoeNmHsXpnyaCSiCOZFGU", + "type": "arrow", + "x": 995.6756933410074, + "y": 1373.5181358617124, + "width": 418.3013872092462, + "height": 277.28972008337206, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b03", + "roundness": { + "type": 2 + }, + "seed": 1198369924, + "version": 1154, + "versionNonce": 1224880572, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "bYNg3Cvy_P_BuiZb1CE8P" + } + ], + "updated": 1748019444987, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -161.2757655659425, + 241.94870170339192 + ], + [ + -418.3013872092462, + 277.28972008337206 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "x0Y4kbZo2mhoHWpIPwCtG", + "focus": -0.26829566698490753, + "gap": 3.6512738825454107 + }, + "endBinding": { + "elementId": "-TL8tjGFyZ5_byIEb5qRB", + "focus": 0.3893078161082105, + "gap": 10.174360046149445 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "bYNg3Cvy_P_BuiZb1CE8P", + "type": "text", + "x": 1502.0200958251953, + "y": 1119.8000284830728, + "width": 280.75982666015625, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b04", + "roundness": null, + "seed": 26049540, + "version": 128, + "versionNonce": 848549948, + "isDeleted": false, + "boundElements": [], + "updated": 1748019416058, + "link": null, + "locked": false, + "text": "foundry next release develop\ndevelop", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "YoeNmHsXpnyaCSiCOZFGU", + "originalText": "foundry next release develop develop", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "4lJV8J_Cy-svF8mef0DxM", + "type": "arrow", + "x": 986.4946175811501, + "y": 1373.876020752532, + "width": 424.97929772384657, + "height": 119.80442776372513, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b05", + "roundness": { + "type": 2 + }, + "seed": 369580932, + "version": 1447, + "versionNonce": 1177940668, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "KOyfdGWSKFkaic-LZAOWp" + } + ], + "updated": 1748019444988, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -161.56112009115986, + 107.79448658238306 + ], + [ + -424.97929772384657, + 119.80442776372513 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "x0Y4kbZo2mhoHWpIPwCtG", + "focus": -0.40749533905815266, + "gap": 4.009158773365016 + }, + "endBinding": { + "elementId": "APIaUjo4w2kpVyaCRyjfQ", + "focus": 0.22671929543604113, + "gap": 2.315373771691725 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "KOyfdGWSKFkaic-LZAOWp", + "type": "text", + "x": 1500.5736850713706, + "y": 998.5036982528834, + "width": 264.71978759765625, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b06", + "roundness": null, + "seed": 1327057668, + "version": 121, + "versionNonce": 1868918972, + "isDeleted": false, + "boundElements": [], + "updated": 1748019416058, + "link": null, + "locked": false, + "text": "foundry next release stage", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "4lJV8J_Cy-svF8mef0DxM", + "originalText": "foundry next release stage", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "rETVJJQzb4-B-nv0ODSaf", + "type": "arrow", + "x": 994.5635226736138, + "y": 1372.3096989842852, + "width": 441.50711570357873, + "height": 56.29212713078806, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b07", + "roundness": { + "type": 2 + }, + "seed": 2134985348, + "version": 1772, + "versionNonce": 1210938300, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "fGzDxF0lBXrVEnG0PQVXI" + } + ], + "updated": 1748019444988, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -286.85263252702066, + 56.29212713078806 + ], + [ + -441.50711570357873, + 6.610406072284434 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "x0Y4kbZo2mhoHWpIPwCtG", + "focus": -0.8019436487183784, + "gap": 2.4428370051182355 + }, + "endBinding": { + "elementId": "SVxXF1MTM5vmubnUpS43U", + "focus": 0.1138475939701004, + "gap": 3.485553589764853 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "fGzDxF0lBXrVEnG0PQVXI", + "type": "text", + "x": 1414.9910466000438, + "y": 945.4350170330415, + "width": 201.43984985351562, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b08", + "roundness": null, + "seed": 2034063876, + "version": 115, + "versionNonce": 1064302908, + "isDeleted": false, + "boundElements": [], + "updated": 1748019416058, + "link": null, + "locked": false, + "text": "foundry next release", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "rETVJJQzb4-B-nv0ODSaf", + "originalText": "foundry next release", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "NkqSBhy6FIk801O8BvH5X", + "type": "rectangle", + "x": -128.8002065022788, + "y": 1518.6668802897138, + "width": 99.20001220703125, + "height": 104, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffc9c9", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b09", + "roundness": { + "type": 3 + }, + "seed": 134969732, + "version": 423, + "versionNonce": 1738554884, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "cqrVEIbReZ7bvL8H4jy70" + }, + { + "id": "D26XRd43WAKequylMRcrj", + "type": "arrow" + } + ], + "updated": 1748019443933, + "link": null, + "locked": false + }, + { + "id": "cqrVEIbReZ7bvL8H4jy70", + "type": "text", + "x": -112.66017659505223, + "y": 1558.1668802897138, + "width": 66.91995239257812, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0A", + "roundness": null, + "seed": 1726589188, + "version": 394, + "versionNonce": 1886510468, + "isDeleted": false, + "boundElements": [], + "updated": 1748019443933, + "link": null, + "locked": false, + "text": "Laptop", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "NkqSBhy6FIk801O8BvH5X", + "originalText": "Laptop", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "D26XRd43WAKequylMRcrj", + "type": "arrow", + "x": -24.415405818490058, + "y": 1524.0837879465375, + "width": 257.8234022341961, + "height": 162.95044673629218, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0B", + "roundness": { + "type": 2 + }, + "seed": 961931396, + "version": 1060, + "versionNonce": 1090041020, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "PdkLxoIXe9si5znHyn914" + } + ], + "updated": 1748019444988, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 257.8234022341961, + -162.95044673629218 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "NkqSBhy6FIk801O8BvH5X", + "focus": -0.14346789699622786, + "gap": 9.644680295874831 + }, + "endBinding": { + "elementId": "SVxXF1MTM5vmubnUpS43U", + "focus": 0.3198544758288595, + "gap": 1 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "PdkLxoIXe9si5znHyn914", + "type": "text", + "x": 833.0964285586992, + "y": 946.9417554963597, + "width": 158.79989624023438, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0C", + "roundness": null, + "seed": 51263492, + "version": 124, + "versionNonce": 1870213820, + "isDeleted": false, + "boundElements": [], + "updated": 1748019416058, + "link": null, + "locked": false, + "text": " seed foundry\nrelease 1", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "D26XRd43WAKequylMRcrj", + "originalText": " seed foundry release 1", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "yTtBjnr5OZpTC21AS49qZ", + "type": "rectangle", + "x": 269.19985453287745, + "y": 1641.0668512980146, + "width": 157.5999755859375, + "height": 51.19999694824219, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0D", + "roundness": { + "type": 3 + }, + "seed": 537958276, + "version": 532, + "versionNonce": 115284996, + "isDeleted": false, + "boundElements": [], + "updated": 1748019443933, + "link": null, + "locked": false + }, + { + "id": "UWXnO8yM7p4yNaKOrEM6Y", + "type": "arrow", + "x": 347.99990336100245, + "y": 1666.6668574015303, + "width": 10.39996337890625, + "height": 3.1999969482421875, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0E", + "roundness": { + "type": 2 + }, + "seed": 1016792836, + "version": 539, + "versionNonce": 1076165508, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "IqJgrmG1CVq78xi7t7C7B" + } + ], + "updated": 1748019443933, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 10.39996337890625, + -3.1999969482421875 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "IqJgrmG1CVq78xi7t7C7B", + "type": "text", + "x": 1081.2500457763672, + "y": 1183.5000483194985, + "width": 149.4998779296875, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0F", + "roundness": null, + "seed": 1294698116, + "version": 129, + "versionNonce": 2084169348, + "isDeleted": false, + "boundElements": [], + "updated": 1748019416058, + "link": null, + "locked": false, + "text": "FoundryForgejo", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "UWXnO8yM7p4yNaKOrEM6Y", + "originalText": "FoundryForgejo", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Amo1p1yJLOhHnDaiCE3Jt", + "type": "rectangle", + "x": 253.9998423258462, + "y": 1485.8668085734053, + "width": 157.5999755859375, + "height": 51.19999694824219, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0G", + "roundness": { + "type": 3 + }, + "seed": 109057540, + "version": 532, + "versionNonce": 612559620, + "isDeleted": false, + "boundElements": [], + "updated": 1748019443933, + "link": null, + "locked": false + }, + { + "id": "SVFbmF4rMvg_z7TLgZXsp", + "type": "arrow", + "x": 332.7998911539712, + "y": 1511.4668146769209, + "width": 10.39996337890625, + "height": 3.1999969482421875, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0H", + "roundness": { + "type": 2 + }, + "seed": 1435940228, + "version": 539, + "versionNonce": 913762948, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "-H21t83QrfiOJfeOUSBB-" + } + ], + "updated": 1748019443933, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 10.39996337890625, + -3.1999969482421875 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "-H21t83QrfiOJfeOUSBB-", + "type": "text", + "x": 1066.050033569336, + "y": 1028.3000055948892, + "width": 149.4998779296875, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0I", + "roundness": null, + "seed": 1470981380, + "version": 129, + "versionNonce": 2001394748, + "isDeleted": false, + "boundElements": [], + "updated": 1748019416058, + "link": null, + "locked": false, + "text": "FoundryForgejo", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "SVFbmF4rMvg_z7TLgZXsp", + "originalText": "FoundryForgejo", + "autoResize": true, + "lineHeight": 1.25 + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/docs/technical-documentation/architecture/design/mvp1-12-otc/index.md b/docs/technical-documentation/architecture/design/mvp1-12-otc/index.md new file mode 100644 index 0000000..4b6fef2 --- /dev/null +++ b/docs/technical-documentation/architecture/design/mvp1-12-otc/index.md @@ -0,0 +1,59 @@ +# MVP1-12-OTC Milestone + +History: +* 24.04.25: Initial Arch done in lucid by Waldemar +* 06.05.25: Ported to C4 by Stephan +* 13.05.25: Review OTC-EDP + + +https://lucid.app/lucidspark/7134abcb-0c5e-41e5-93da-7118e285a668/edit?invitationId=inv_fbf0d105-7023-4740-806e-fcbb522ea61a&page=0_0# + +## C4 Architecture + +* https://forgejo.edf-bootstrap.cx.fg1.ffm.osc.live/DevFW-CICD/edp-doc/src/branch/development/likec4/views/deployment/otc/otc.c4 + +![alt text](./_assets/image.png) + +![alt text](./_assets/image-1.png) + +## Overall + +### Architecture + +![alt text](./_assets/EDPForgejoArch1.svg) + +### Work packages + +![alt text](./_assets/EDPForgejoArch2.svg) + +## EDP Foundry + +### Sub-Components 'Internal Services' and 'Central Observaability' + +![alt text](./_assets/EDPForgejoArch3.svg) + +## EDP (deployed per tenant) + +### Sub-Components 'Kubernetes' and 'Cloud Services' + +![alt text](./_assets/EDPForgejoArch4.svg) + +## Operator (Provisioning Pipeline) + +### Sub-Components 'Forgejo-Actions' and 'ArgoCD' + +![alt text](./_assets/EDPForgejoArch5.svg) + +![alt text](./_assets/EDPForgejoArch6.svg) + +# OTC EDP product review on 13.05.25 + +![alt text](./_assets/edp-otc-1.png) + +![alt text](./_assets/edp-otc-2.png) + +![alt text](./_assets/edp-otc-3.png) + +![alt text](./_assets/edp-otc-4.png) + +![alt text](./_assets/edp-otc-5.png) \ No newline at end of file diff --git a/docs/technical-documentation/architecture/design/mvp1-12-otc/productline-portal-frontend.md b/docs/technical-documentation/architecture/design/mvp1-12-otc/productline-portal-frontend.md new file mode 100644 index 0000000..2465780 --- /dev/null +++ b/docs/technical-documentation/architecture/design/mvp1-12-otc/productline-portal-frontend.md @@ -0,0 +1,60 @@ +### WiP - needs to be reworked + +Participants: Michael, Robert, Stephan +Date: Thu, 05.06.2025 + +# EDP Product Line 'Portal/Frontend/Forgejo' + +[Also refer to other page here](../../../product/components/forgejo/index.md) + + +## how to proceed + +* let's create tickets! +* let's mob! + +## terms + +Frontend: The part in the platfrom the user accesses. These are CLIs, APIs and Portals. Forgejo is our Portal. + +### Agreement + +* Forgejo=Portal (of the platform) +* Forgejo has a 'Frontend' - this is the touchpoint for users (like HTML-browsers) +* Forgejo has a backend, which delivers the content to be presented in the frontend + +## issues + +* Michael into ArchMeeting?! (agreement!) + * Robert/Stepan: discusion about our mindset - mobbing as avoiding missing detailed planning, in two streams + * Michael - Michal, Felix sind das 'Portal-Frontend' + * Tickets in Jira currently + * TODO creating tickets in forgejo / porting tickets from Jira + * we create the new forgejo-proect 'Portal-Frontend' + * zweiter meilenstein: Backend-activities need to be adressed in the future +* TODO have a look into the old backstage-portal + +* TODO Stephna an Julius ... Logo/CICD: We should define Logo/name tenant name, product name, url schemas + +### Development lifecycle + +* create project in CFor +* create tasks in CFor +* TODO Stephan possible tasks + * Environments -> let's provide a 'productline-forgejo' env in OTC! + * Pipelines + * check all tests! + +### Architecture + +* Goals: + * Stay Open Source compatible! + * stay forgejo-downstreaming compatible! + * provide ADRs before breaking changes + +#### forgejo-Architecture + +* analyse, presnt ad discuss forgejo architecture +* Notice [Forgejo-Design guidleine](https://codeberg.org/forgejo/design/) +* Notice/You must read [Developer Doc](https://forgejo.org/docs/next/contributor/) + diff --git a/docs/technical-documentation/architecture/research/forgejo-opensource/forgejo-releases.jpg b/docs/technical-documentation/architecture/research/forgejo-opensource/forgejo-releases.jpg new file mode 100644 index 0000000..8b28548 Binary files /dev/null and b/docs/technical-documentation/architecture/research/forgejo-opensource/forgejo-releases.jpg differ diff --git a/docs/technical-documentation/architecture/research/forgejo-opensource/licences.md b/docs/technical-documentation/architecture/research/forgejo-opensource/licences.md new file mode 100644 index 0000000..28d59bd --- /dev/null +++ b/docs/technical-documentation/architecture/research/forgejo-opensource/licences.md @@ -0,0 +1,735 @@ +# OSS licenceses and their impact on Forgejo development + +Forgejo ist GPL copylefted [since v9 from October 2024](https://forgejo.org/2024-10-release-v9-0/). The entry to the [discussion is here (blog)](https://forgejo.org/2024-08-monthly-update/#forgejo-is-now-copyleft). and [here (ticket)](https://codeberg.org/forgejo/discussions/issues/192) + +In the follwowing is the documentation of a chat with GPT about OSS licencing in general and the impact of Forgejo's copyleft on our Forgejo development. + +## TL:DR; + +* It looks like that as a SaaS/PaaS product EDP will not be affected to be 'infected' by GPL +* But if we share/distribute the code, all 'integrated' parts (like frontend code) needs to be published under GPL also. + +### Forgejo release line + +The following chart shows the Forgejo releases (and semantiv versioning) over time and their relation - soft- vs hardfork - to Gitea. + +![alt text](forgejo-releases.jpg) + + +## Copyleft + +> was ist copyleft software? + +**Copyleft** ist ein Begriff aus dem Bereich der **freien Softwarelizenzen**. Er bezeichnet eine spezielle Lizenzform, bei der **die Freiheit, Software zu nutzen, zu verändern und weiterzugeben, sichergestellt und auf alle abgeleiteten Werke übertragen wird**. + +### Einfach erklärt: + +Wenn Software unter einer **Copyleft-Lizenz** steht: + +* Darfst du sie **frei verwenden**, **verändern** und **weiterverbreiten**. +* **Aber:** Wenn du sie veränderst oder in eigene Programme einbaust und diese weiterverbreitest, **musst du deinen Code auch wieder unter derselben Lizenz veröffentlichen**. + +### Ziel von Copyleft: + +Copyleft verhindert, dass jemand freie Software nimmt, verbessert und **dann proprietär macht** (also als unfreie Software weiterverkauft). Es sorgt dafür, dass **Freiheit erhalten bleibt** – auch bei Änderungen und Weiterentwicklungen. + +--- + +### Beispiele für Copyleft-Lizenzen: + +* **GNU General Public License (GPL)** – stärkstes Copyleft +* **AGPL (Affero GPL)** – wie GPL, aber auch bei Webdiensten wirksam +* **LGPL (Lesser GPL)** – abgeschwächt, erlaubt Linken mit proprietärem Code + +--- + +### Abgrenzung: + +* **Copyleft**: Freiheit bleibt ansteckend (GPL). +* **Permissive Lizenzen** (wie MIT oder Apache): Du darfst den Code auch in proprietäre Software einbauen, ohne ihn wieder offenlegen zu müssen. + +--- + +### Kurzes Beispiel: + +Du nutzt eine GPL-lizenzierte Bibliothek in deinem Projekt. +→ Du verteilst dein Programm weiter. +→ Du **musst deinen Code offenlegen** und unter GPL stellen. +→ Du **darfst nicht** dein Programm schließen und sagen: „Ist jetzt meins.“ + +--- + +## Integration of proprietary own code + +> ich arbeite in einer company. wir verwenden forgejo als ausgangsprodukt für unser eigenes produkt P. wir wollen forgejo zu einem portal ausbauen. forgejo hat seit v9 eine copyleft lizenz, es ist GPL 3 und höher. wenn jetzt meine company sagt, wir müssen in P die company-eigenen frontend komponenten (javascript und css) K einbauen, dann würde das doch bedeuten, dass bei der veröffentlichung von P alle K mit ausgeliefert werden müssen. Sind sie dann auch copyleft? + +Das ist eine sehr gute und wichtige Frage. Du hast die Ausgangslage korrekt beschrieben: + +* **Forgejo steht seit Version 9 unter der GPLv3 (Copyleft)**. +* Eure Firma baut darauf ein neues Produkt **P** auf. +* In **P** sollen proprietäre **Frontend-Komponenten K (JS + CSS)** integriert werden. +* Jetzt ist die Frage: **Werden K dadurch automatisch copyleft (GPL-3-lizenziert)?** + +--- + +### Die juristisch relevante Frage ist: + +> **Ist K als „abgeleitetes Werk“ (derivative work) von Forgejo zu betrachten?** + +Wenn ja → **GPL-Virus** greift → K müsste **ebenfalls unter der GPL veröffentlicht werden**, sobald P verteilt wird. +Wenn nein → K kann **proprietär** bleiben. + +--- + +### Einschätzung aus der Praxis: + +#### 🔹 Forgejo (bzw. Gitea/Gogs) ist eine Webanwendung: + +* Typisch: Backend (Go) + Web-Frontend (JS/HTML/CSS). +* GPLv3 umfasst das **gesamte Programm**, auch das Web-Frontend. + +#### 🔹 Wenn ihr Frontend-Komponenten K in Forgejo-P einbettet: + +* Also z. B. in `templates/*.tmpl` einbindet +* Oder sie mit Forgejos JS interagieren (über globale Objekte, Hooks, Module usw.) +* Oder sie direkt im Forgejo-Build-Prozess enthalten sind + +→ Dann sind **K Teil des Gesamtwerks** → **GPL-pflichtig**, wenn ihr **P verteilt** (z. B. als installierbare Software oder über ein Download-Angebot). + +#### 🔹 Wenn ihr P **nur als internen Service** betreibt (also nicht verteilt): + +* Dann **greift die GPL nicht**. Die GPL regelt **Verbreitung**, nicht bloße Nutzung (auch intern oder SaaS). +* Ausnahme: Bei AGPL (Affero GPL) wäre das anders. Forgejo nutzt aber **nur GPL**, nicht AGPL. + +--- + +### Fazit: + +| Szenario | Müssen K offen gelegt werden? | +| --------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | +| **P wird nicht verteilt, nur gehostet (z. B. SaaS, internes Portal)** | ❌ Nein, GPL greift hier nicht | +| **P wird an Dritte verteilt (z. B. Kunden, Partner, zum Download)** | ✅ Ja, dann müssen **auch K offen gelegt werden**, wenn sie Teil des Gesamtsystems sind | + +--- + +### Mögliche Strategien: + +1. **Frontend-K modularisieren:** + + * K **außerhalb** von Forgejo laden (z. B. über CDN, iframe, Microfrontend, WebExtension) + * Dann wäre K kein „abgeleitetes Werk“, sondern „separat“ → GPL greift nicht + +2. **Forgejo entkoppeln:** + + * Forgejo als **Backend-Komponente** nutzen, euer Portal ist UI-first + * Forgejo läuft z. B. headless oder als API-only-Service + +3. **Lizenzpflicht akzeptieren:** + + * K offenlegen und unter GPLv3 (oder kompatibler Lizenz) stellen + +4. **Lizenzrechtlich beraten lassen:** + + * Wenn euer Setup komplizierter ist (z. B. komplexes Zusammenspiel, modulare Bundles), ist eine rechtliche Einschätzung sinnvoll + +--- + +## Headless, separtion of forgejo Frontend and Backend + +> angenommen, Forgejo würde sich zu einem headless-Ansatz entwicklen und Frontend und Backend trennen. Und wenn unsere virulenten K Komponenten dann nur im Frontend wären, würde ja dieselbe diskussion gültig sein, diesmal halt nur mit dem Gesamtwerk 'Frontend'. Richtig? + +Ganz genau – **du hast das Prinzip vollständig verstanden**. Lass uns das nochmal im Detail klarmachen: + +--- + +### 🧠 Grundidee: GPL „infiziert“ das **Gesamtwerk** bei *Verbreitung* + +* Ob das „Gesamtwerk“ aus einem **monolithischen Projekt** besteht oder aus **Frontend + Backend getrennt** aufgebaut ist, ist **lizenzrechtlich egal**, solange die Teile als **ein zusammengehöriges Werk** vertrieben werden. + +--- + +### 🔍 Headless Forgejo: Was ändert sich? + +Angenommen Forgejo trennt sich vollständig in: + +* **Forgejo Backend** (API, Auth, Git, etc.) → GPLv3 +* **Forgejo Frontend** (UI, Web-App, REST-Client) → ebenfalls GPLv3 + +Nun baut ihr euer eigenes Frontend: + +* Ihr verwendet Forgejos GPLv3-Frontend als Grundlage +* Ihr integriert eigene proprietäre Komponenten **K** (JS, CSS, React, etc.) + +Dann gilt: + +> Wenn **euer Frontend P'** auf dem GPLv3-Frontend von Forgejo basiert (also *abgeleitet ist*) und **weitergegeben wird**, dann **muss auch P' unter der GPLv3 stehen**. + +→ Und damit **auch K**, wenn sie integraler Bestandteil sind. + +--- + +### 🤔 Was ist „integraler Bestandteil“? + +Wenn K z. B.: + +* direkt in Forgejo-Frontend eingebunden wird (als Module, React-Components, Styles) +* im Build mit Forgejo-Code gebundled wird (z. B. über Webpack, Vite, Rollup) +* von GPL-Code aufgerufen oder mit GPL-Code gemeinsam ausgeliefert wird + +→ Dann ist K **Teil des Frontend-Gesamtwerks** → **GPL-pflichtig** + +--- + +### 🔓 Wie kann man K trotzdem proprietär halten? + +Du musst K **technisch und lizenzrechtlich abtrennen**. Das geht z. B. durch: + +#### 1. **Frontend-Plugins über offene Schnittstellen (APIs, Hooks)** + +* Forgejo lädt externe Komponenten **dynamisch** zur Laufzeit (wie Plugins) +* Plugins liegen **nicht im selben Repository**, werden **nicht mitgebundled** +* Sie kommunizieren z. B. über Events oder JS-APIs + +→ Diese Trennung kann stark genug sein, um K **nicht als abgeleitetes Werk** gelten zu lassen. + +#### 2. **Microfrontend-Architektur** + +* Forgejo-UI + K-Frontend als **völlig getrennte Webapps** +* Sie kommunizieren nur via REST +* Beide haben eigene Buildprozesse, Domains oder Deployments + +→ Dann ist K **nur ein separater Client**, der Forgejo nutzt → **kein Copyleft-Risiko** + +--- + +### ⚖️ Kurzes Lizenz-Merkblatt (bei Verteilung): + +| Du verwendest... | Und veränderst... | Und verbreitest... | Dann musst du... | +| ---------------- | ----------------- | ------------------------ | ----------------------------------------------- | +| GPL-Frontend | nur API-Aufrufe | Nein | Nichts (Nutzung ist frei) | +| GPL-Frontend | nichts | Ja (z. B. als Proxy-App) | GPL-Code beilegen | +| GPL-Frontend | und fügst K ein | Ja | Dann wird K auch GPL (wenn nicht klar getrennt) | + +--- + +**Fazit:** +Ja, auch bei Headless-Struktur bleibt die Diskussion **identisch**, nur auf **Frontend-Ebene**. +Was zählt, ist **Verbreitung** und **Abhängigkeit**: Wenn ihr Forgejos GPL-Code als **technisches Fundament** für euer eigenes UI nehmt und es **weitergebt**, dann **unterliegt das gesamte resultierende UI dem Copyleft** – inklusive eurer Komponenten **K**, falls sie technisch integriert sind. + +## Portal as SaaS/PaaS + +> ok, und wenn unser P nur als SaaS bzw. PaaS verfügbar wird für Kunden, dann erübrigt sich die ganze Lizenzdiskussion? + +Fast – aber mit einer wichtigen Einschränkung: + +--- + +### ✅ Ja: Wenn ihr **P nur als SaaS oder PaaS betreibt**, also **nicht verteilt**, + +dann **greift die GPLv3 nicht**. + +> **Die GPL regelt die *Verbreitung* (distribution)** von Software, **nicht deren Nutzung über ein Netzwerk**. + +Das heißt: + +* Ihr könnt **Forgejo (GPLv3)** hosten +* Ihr könnt es verändern +* Ihr könnt eigene Komponenten **K (JS/CSS)** integrieren, auch tief im System +* Solange ihr **P nicht als Download oder Produkt weitergebt**, + **müsst ihr keinerlei Quellcode veröffentlichen** – auch nicht für K + +--- + +### 🔒 Ausnahme: Die **AGPLv3** + +Die **Affero GPLv3** (nicht die normale GPLv3!) **schließt diese Lücke**: + +> Wenn Software **über ein Netzwerk bereitgestellt wird**, dann gilt das wie eine „Verbreitung“, +> und ihr müsst den **Quellcode bereitstellen**, inklusive Modifikationen. + +Aber: +→ **Forgejo verwendet nur GPLv3**, **nicht** AGPLv3. +→ Daher **greift diese Ausnahme bei euch nicht**. + +--- + +### 🧠 Fazit + +| Szenario | GPLv3-Pflichten? | +| --------------------------------------------- | ------------------------------------------------- | +| P wird nur gehostet (SaaS/PaaS), nie verteilt | ❌ Nein | +| P wird als installierbares Produkt verteilt | ✅ Ja, alle abgeleiteten Werke müssen GPL sein | +| P nutzt AGPL-Komponenten | ⚠️ Ja, auch bei SaaS muss Code offengelegt werden | + +--- + +### 💡 Empfehlung + +Wenn ihr **zukünftig eventuell doch distributieren wollt**, wäre es gut, das in der Architektur zu berücksichtigen (z. B. K trennbar halten). +Solange ihr aber rein **als Betreiber eines SaaS/PaaS-Portals** handelt, seid ihr aus GPLv3-Sicht **vollkommen auf der sicheren Seite** – auch mit euren proprietären K-Komponenten. + +## AGPL vs GPL + +> Das bedeutet ja, dass, im Sinne von OS, die AGPL strenger (schützneder) als die GPl ist? + +Ganz genau – **die AGPL ist eine „strenger schützende“ Lizenz als die GPL**, vor allem im Kontext von Cloud-/SaaS-Anbietern. Hier ist eine kurze, aber präzise Einordnung: + +--- + +### 🔍 Unterschied: GPL vs. AGPL + +| Lizenz | Muss Quellcode offengelegt werden bei… | Ziel | +| ---------- | ---------------------------------------------------------------------------------- | ----------------------- | +| **GPLv3** | Nur wenn Software **verbreitet** wird (z. B. Download, Installationspaket) | Schutz bei Distribution | +| **AGPLv3** | Auch wenn Software **nur übers Netzwerk bereitgestellt** wird (z. B. als **SaaS**) | Schutz auch bei Hosting | + +--- + +### 🧠 Was schützt die AGPL mehr? + +Die AGPL wurde entwickelt, um die sogenannte **„SaaS-Lücke“** in der GPL zu schließen: + +* Viele Unternehmen nahmen GPL-Software, erweiterten sie, **veröffentlichten sie nie**, sondern **hosteten sie einfach als Service**. +* Ergebnis: **Sie profitierten von freier Software, gaben aber nichts zurück** – ganz legal unter der GPL. + +Die AGPL sagt daher: + +> Wenn du Software nutzt, die unter der AGPL steht, +> **und Nutzer über ein Netzwerk mit ihr interagieren können**, +> **musst du deinen geänderten Quellcode offenlegen** – +> auch **ohne Verbreitung der Software an sich**. + +--- + +### 🎯 Beispiel aus der Praxis + +* GitLab hat früher zwischen: + + * **Open-Core GPLv3** (für das Backend), + * und **nicht-freien Premium-Modulen** unterschieden. +* Wäre GitLab stattdessen **AGPL-lizenziert** gewesen, hätten **Cloud-Anbieter wie AWS** den Code nicht einfach benutzen können, ohne ihre Änderungen zu teilen. + +--- + +### 💡 Zusammenfassung + +* **GPL schützt Freiheit bei Distribution** +* **AGPL schützt Freiheit auch bei Netzwerk-Zugriff** +* AGPL ist also: + + * **restriktiver** für Unternehmen (die Software nur hosten) + * **schutzstärker** im Sinne der Open-Source-Idee + +--- + +Wenn euch also wichtig ist, dass **niemand eure Software nehmen und als Cloud-Dienst hosten kann**, ohne den Code freizugeben, dann ist **AGPL die bessere Wahl**. +Aber für viele Firmen ist genau das der Grund, **AGPL zu vermeiden**, z. B. bei kommerziellem SaaS-Geschäft. + +## MIT and LGPL + +> Und LGPL und MIT? Wie sind diese Lizenzen in dieser Hinsicht zu bewerten? + + +Super Frage! Wenn wir GPL, **AGPL**, **LGPL** und **MIT** in Bezug auf **„Schutzwirkung“ im Sinne von Open Source“** vergleichen wollen, entsteht ein ziemlich klar gestaffeltes Bild: + +--- + +### 🧭 Übersicht: GPL, AGPL, LGPL, MIT im Vergleich + +| Lizenz | Verbreitungspflicht bei… | „Infiziert“ abgeleitete Werke? | Kommerziell verwendbar? | SaaS-Abdeckung? | Schutzwirkung (Stärke) | +| ---------- | -------------------------------------- | --------------------------------------- | ---------------------------------- | --------------- | ---------------------- | +| **MIT** | Nur bei direkter Weitergabe (optional) | ❌ Nein | ✅ Ja | ❌ Nein | 🔓 *Sehr schwach* | +| **LGPLv3** | Nur bei Verbreitung als *Library* | 🔸 Nur bei statischer/direkter Kopplung | ✅ Ja (dynamische Kopplung erlaubt) | ❌ Nein | ⚖️ *Moderat* | +| **GPLv3** | ✅ Ja, bei Verbreitung | ✅ Ja | ⚠️ Eingeschränkt | ❌ Nein | 🔐 *Stark* | +| **AGPLv3** | ✅ Ja, auch bei SaaS | ✅ Ja | ⚠️ Eingeschränkt | ✅ Ja | 🛡️ *Sehr stark* | + +--- + +### 🔍 Detail: Was bedeuten diese Lizenzen im Alltag? + +#### 1. **MIT License** + +* Extrem permissiv: „Mach, was du willst – aber lass den Lizenztext dran.“ +* **Keine Copyleft-Wirkung** +* Unternehmen können MIT-Code integrieren, verändern, verkaufen – **ohne irgendetwas offenzulegen** + +🔧 **Typisch für:** + +* Frontend-Libs (React, Lodash) +* Dev-Tools, CLI-Tools +* Universitätscode + +--- + +#### 2. **LGPL (Lesser GPL)** + +* Speziell für **Bibliotheken** entwickelt +* Erlaubt **dynamische Verlinkung** mit proprietärer Software +* Nur wenn du die Library **veränderst** oder **statisch einbindest**, musst du den Quellcode offenlegen + +⚠️ **Aber Achtung:** Wenn du z. B. ein JavaScript-Modul *"inplace"* in dein Bundle einbaust, kann das **als „statische Kopplung“** gelten → Copyleft greift! + +🔧 **Typisch für:** + +* Standard-Bibliotheken wie glibc (GNU C Library) +* Frameworks, die auch kommerziell nutzbar sein sollen + +--- + +#### 3. **GPLv3** + +* Klassisches **„starkes Copyleft“** +* Wer verändert + verteilt, muss **den vollständigen Quellcode** offenlegen +* **ABER:** Keine Wirkung bei reinem SaaS-Hosting + +🔧 **Typisch für:** + +* Linux-Kernel (GPLv2) +* Forgejo, Gitea +* Viele CLI-Tools oder Compiler + +--- + +#### 4. **AGPLv3** + +* Wie GPLv3, **plus Netzwerk-Nutzung** +* „Wenn Benutzer über das Internet mit der Software interagieren können, dann musst du auch bei SaaS den Quellcode offenlegen“ + +🔧 **Typisch für:** + +* Self-hosted SaaS-Alternativen (z. B. Matomo, CryptPad, GitLab CE früher) +* Community-Projekte, die „Cloud-Reselling“ verhindern wollen + +--- + +### 🧠 Zusammenfassung als Diagramm + +```text +⬆ Schutzwirkung / Copyleft +│ +│ 🛡️ AGPLv3 → verteilt + SaaS → Quellcodepflicht +│ 🔐 GPLv3 → verteilt → Quellcodepflicht +│ ⚖️ LGPLv3 → Libs bei Verlinkung → schwächer +│ 🔓 MIT → keine Pflicht, frei nutzbar +│ +└────────────▶ Freiheit für kommerzielle Nutzung +``` + +--- + +### 🔎 Fazit für dich: + +Wenn du in deinem Unternehmen: + +* **keinen Quellcode offenlegen willst**, ist MIT oder (je nach Fall) LGPL sinnvoll +* **SaaS-only anbietest**, und Open-Source-Code nutzt: + + * **MIT, BSD, LGPL → unkritisch** + * **GPL → unkritisch (solange nicht verteilt)** + * **AGPL → kritisch, da *Quellcodeoffenlegungspflicht* trotz SaaS** + +## Apache + +> kannst du in die obige Analyse noch die Apache Lizenz mit aufnehmen? Also alle schritet 1-4, plus die Zusammanfassung bitte, denn das sieht seeeeht übersichtlich aus, was du da geschrieben hast! + +Sehr gern! Hier ist die **erweiterte und überarbeitete Analyse**, diesmal mit der **Apache License 2.0** ergänzt – inklusive aller Schritte, Unterschiede und der praktischen Zusammenfassung. + +--- + +### 🧭 Übersicht: MIT, LGPL, GPLv3, AGPLv3, Apache 2.0 im Vergleich + +| Lizenz | Verbreitungspflicht bei… | „Infiziert“ abgeleitete Werke? | Kommerziell verwendbar? | SaaS-Abdeckung? | Schutzwirkung | +| -------------- | -------------------------------------------- | ----------------------------------- | ----------------------- | --------------- | -------------------------------- | +| **MIT** | ✅ Nur bei direkter Weitergabe | ❌ Nein | ✅ Ja | ❌ Nein | 🔓 *Sehr schwach* | +| **Apache 2.0** | ✅ Nur bei Weitergabe (wie MIT) | ❌ Nein *(aber inkl. Patentklausel)* | ✅ Ja | ❌ Nein | 🔓 *Schwach* + 🧩 *Patentschutz* | +| **LGPLv3** | ✅ Bei Veränderung oder statischer Verlinkung | 🔸 Teilweise (nur bei Kopplung) | ✅ Ja (mit Vorsicht) | ❌ Nein | ⚖️ *Moderat* | +| **GPLv3** | ✅ Bei jeder Weitergabe | ✅ Ja (alles, was „abgeleitet“ ist) | ⚠️ Eingeschränkt | ❌ Nein | 🔐 *Stark* | +| **AGPLv3** | ✅ Auch bei SaaS/Remote-Zugriff | ✅ Ja | ⚠️ Eingeschränkt | ✅ Ja | 🛡️ *Sehr stark* | + +--- + +### 🔍 Schritt 1: **MIT License** + +* Extrem permissiv +* Du kannst fast alles damit machen (auch Closed Source) +* Nur Pflicht: Lizenztext beibehalten +* **Keine** Copyleft-Wirkung +* ⚠️ Keine Patentlizenz (aber selten ein Problem bei typischem JavaScript-Code etc.) + +✅ Ideal für: Bibliotheken, die möglichst breit einsetzbar sein sollen +🧩 Kein Schutz gegen „Trittbrettfahrer“, aber maximal kompatibel + +--- + +### 🔍 Schritt 2: **Apache License 2.0** + +* Sehr ähnlich zu MIT, aber mit einem großen Zusatz: + + * 📄 **Erteilt explizit eine Patentlizenz** + * 🛡️ **Schützt Nutzer davor, von ursprünglichen Autoren verklagt zu werden** +* Keine Copyleft-Wirkung +* Sehr **kompatibel mit kommerziellen Projekten** +* Weit verbreitet in Unternehmen (Google, Apache Software Foundation, etc.) + +✅ Ideal für: Große Projekte, bei denen Patentsicherheit wichtig ist (Cloud, Machine Learning, etc.) + +--- + +### 🔍 Schritt 3: **LGPLv3** + +* „Mittelweg“ zwischen MIT/Apache und GPL +* Typisch für **dynamisch gelinkte Libraries** +* **Du darfst sie in Closed Source nutzen**, solange du: + + * dynamisch linkst, + * **und** keine Änderungen an der LGPL-Bibliothek selbst machst +* Bei **statischer Einbindung**: GPL-Pflichten! + +✅ Ideal für: Libraries, die *frei genutzt* werden sollen, ohne dass jedes Projekt unter GPL stehen muss + +--- + +### 🔍 Schritt 4: **GPLv3 / AGPLv3** + +#### GPLv3: + +* Striktes Copyleft +* Alles, was du daraus baust oder veränderst, **muss auch GPL werden**, sobald du es weitergibst +* **Keine Wirkung bei SaaS** + +#### AGPLv3: + +* Wie GPLv3, aber **greift auch bei SaaS** +* Nutzer über das Netzwerk = „Verbreitung“ → Quellcodepflicht + +✅ Ideal für: Projekte, bei denen sichergestellt werden soll, dass **jede Nutzung** (auch SaaS) zur Veröffentlichung zwingt + +--- + +### 🎯 Zusammenfassung als Diagramm + +```text +⬆ Schutzwirkung / Copyleft +│ +│ 🛡️ AGPLv3 → verteilt + SaaS → Quellcodepflicht +│ 🔐 GPLv3 → verteilt → Quellcodepflicht +│ ⚖️ LGPLv3 → bei Kopplung/Änderung → Quellcodepflicht für die Library +│ 🔓 Apache 2 → freie Nutzung, + Patentlizenz +│ 🔓 MIT → freie Nutzung, einfachste Lizenz +│ +└────────────▶ Freiheit für kommerzielle Nutzung +``` + +--- + +### 🧠 Praxis-Tipps + +| Ziel | Empfohlene Lizenz | +| -------------------------------------------------------------------------------- | --------------------------- | +| Du willst maximale Freiheit für Nutzer und Firmen | **MIT** oder **Apache 2.0** | +| Du baust eine Library, willst Verlinkung erlauben, aber Änderungen offenlegen | **LGPLv3** | +| Du willst, dass alle Ableitungen Open Source bleiben (außer bei SaaS) | **GPLv3** | +| Du willst, dass niemand deinen Code nutzt, ohne ihn offenzulegen – auch bei SaaS | **AGPLv3** | + +--- + +## 'Free software forever' + +> Der Claim 'will be free forever' lässt sich also nur mit GPL und AGPL verwirklcihen? verstehe ich das richtig? Oder anders: Warum ist Forgejo in v9 zur GPL gewechselt? + +Ja, du verstehst das im Kern **richtig** – und wir können den Gedanken noch etwas differenzierter ausleuchten. + +--- + +### 🎯 1. „Will be free forever“ – Was bedeutet das konkret? + +Das ist **kein juristischer Begriff**, sondern ein ideologischer Anspruch: + +> ❝ Jeder, der meine Software nutzt, verändert oder weiterverbreitet, muss sie **frei halten**, so wie ich es getan habe. Niemand soll sie einsperren dürfen. ❞ + +Damit ist gemeint: + +* Der Quellcode bleibt **immer offen** (auch bei Ableitungen) +* Niemand darf durch Ableitungen ein **proprietäres Produkt** daraus machen +* Freiheit für alle Nutzer, **nicht nur für den ersten Entwickler** + +Das nennt man **„starkes Copyleft“**, und das bieten: + +* **GPL (v2, v3)** – schützt vor proprietärer Weitergabe +* **AGPL** – schützt vor proprietärer Weitergabe **und** vor „SaaS-Einschluss“ (Cloud-Tricks) + +--- + +### ✅ 2. Welche Lizenzen sichern diese Freiheit tatsächlich? + +| Lizenz | „Wird für immer frei bleiben“ (auch bei Ableitungen)? | +| -------------------- | -------------------------------------------------------- | +| **AGPLv3** | ✅ Ja – selbst bei SaaS | +| **GPLv3** | ✅ Ja – bei jeder Weitergabe | +| **LGPLv3** | 🔸 Teilweise – nur bei Änderungen an der LGPL-Komponente | +| **MIT / Apache 2.0** | ❌ Nein – Ableitungen dürfen Closed Source sein | + +Also: **Nur AGPL/GPL können mit gutem Gewissen sagen: *„Will be free forever.“*** + +--- + +### 🧩 3. Warum ist **Forgejo** in Version 9 auf **GPLv3+** gewechselt? + +Forgejo ist ein **Fork von Gitea**, und dieser Fork entstand aus **Sorge um Community-Eigentum** und langfristige Offenheit. +Mit dem Wechsel zu GPLv3 wollte das Forgejo-Projekt klarstellen: + +> 💬 „Unsere Plattform bleibt auf ewig frei. Niemand wird Forgejo nehmen und ein Closed-Source-Projekt daraus machen können, ohne ihre Änderungen offenzulegen.“ + +#### Hintergrund: + +* Forgejo sieht sich als „**Community-controlled GitHub-Alternative**“ +* Die GPL verhindert, dass jemand (z. B. ein Cloud-Anbieter oder eine Firma) Forgejo nutzt, verändert und **nicht wieder zurückgibt** +* Bei MIT oder Apache könnte z. B. jemand Forgejo forken, um daraus ein kommerzielles, geschlossenes DevOps-Portal zu bauen – völlig legal. + +Mit der **GPL** ist das **nicht erlaubt**, sobald der Code weitergegeben wird (z. B. als Binary oder Quellcode). +Mit der **AGPL** wäre sogar **SaaS-Nutzung geschützt** – aber Forgejo hat sich (noch?) nicht für AGPL entschieden. + +--- + +### 🏁 Fazit + +* Ja: **Nur GPL und AGPL** gewährleisten, dass der Code „für immer frei“ bleibt +* Forgejo wählte GPL, um: + + * Copyleft-Schutz zu aktivieren + * Die Community gegen proprietäre Forks zu schützen + * Den Open-Source-Gedanken auf Dauer zu sichern + +Wenn du „Free as in freedom“ **rechtlich absichern willst**, führt an **(A)GPL** kaum ein Weg vorbei. +MIT, Apache und LGPL ermöglichen zwar freie Nutzung, aber **keinen dauerhaften Schutz der Freiheit**. + +--- + +## Forgejo and SaaS/PaaS + +> Rückfrage zu "Bei MIT oder Apache könnte z. B. jemand Forgejo forken, um daraus ein kommerzielles, geschlossenes DevOps-Portal zu bauen – völlig legal.": Das ist doch mit der GPL möglich, weil sie SaaS/PaaS nicht einschliesst ?! + +Sehr gute Rückfrage – das ist **genau der Knackpunkt**, den viele übersehen. + +--- + +### 🔍 Ja, du hast recht: + +**GPL (auch v3)** schützt **nicht** vor der sogenannten: + +> **SaaS-Schlupflücke** (auch „ASP loophole“ genannt) + +Das bedeutet konkret: + +> Ein Anbieter kann ein GPL-lizenziertes Programm **modifizieren**, es **auf Servern betreiben** (z. B. als DevOps-Plattform), es **niemals weitergeben** – und somit **nichts zurückgeben müssen**. + +--- + +### 🔁 Was genau *verbietet* die GPL (v3)? + +Sie verpflichtet zur **Offenlegung des Quellcodes**, wenn: + +* du das Programm **weiterverbreitest** (als Binary oder Source) +* du es **mit anderer Software kombinierst** (dann unter bestimmten Bedingungen auch) + +Aber: + +> Wenn du das Programm nur **ausführst** (z. B. auf einem eigenen Server) und **nur als Dienst** anbietest – **greift die GPL nicht**. + +#### Also: + +Mit GPL darf jemand Forgejo **modifizieren**, gehostet als z. B. `SuperForgeDevOps.io`, **ohne** den geänderten Code zu veröffentlichen. +Solange er **nichts weitergibt**, **muss er nichts zurückgeben**. + +--- + +### 🛡️ AGPL schließt diese Lücke + +Die **AGPL (Affero GPL)** ist eine Erweiterung der GPLv3, und sie **fügt explizit hinzu**: + +> **Wenn du das Programm über ein Netzwerk bereitstellst (z. B. SaaS), musst du auch dann den Sourcecode veröffentlichen.** + +Damit ist auch das **Servermodell abgedeckt** – kein Entkommen durch Hosting. + +--- + +### 📌 Fazit zur Rückfrage + +| Lizenz | Schutz vor Closed-Source-Forks | Schutz vor SaaS-Schlupflücke | +| ---------------- | ------------------------------ | ---------------------------- | +| **MIT / Apache** | ❌ nein | ❌ nein | +| **GPLv3** | ✅ ja (bei Weitergabe) | ❌ nein (SaaS erlaubt) | +| **AGPLv3** | ✅ ja | ✅ ja | + +➡️ **Forgejo mit GPLv3** schützt vor klassischen **Closed-Source-Distributionen**, +aber **nicht** vor der **„wir hosten es einfach selbst“-Strategie**. + +Wenn Forgejo also „vollständige Freiheitserhaltung“ auch im SaaS-Kontext will, +müsste es auf **AGPL** umsteigen. + +## Forgejo and SaaS/PaaS - II + +> Also war deine Analyse oben in Punkt 3 "Warum ist Forgejo in Version 9 auf GPLv3+ gewechselt?" noch nicht ganz korrekt ... d.h. Forgejo lässt diese Möglichkeit offen (ein Portal auf eines PaaS zu bauen, so wie ich da plane) + +Ganz genau – **sehr präzise erkannt**. + +--- + +### 🛠️ Korrektur & Präzisierung von Punkt 3: + +Meine Aussage in Punkt 3 war **inhaltlich nicht falsch**, aber **nicht vollständig**. +Ich hatte gesagt: + +> „Mit der GPL ist das nicht erlaubt, sobald der Code weitergegeben wird (z. B. als Binary oder Quellcode).“ + +Das stimmt – **aber nur bei Weitergabe**. +Ich hätte explizit hinzufügen sollen: + +> 🔸 **Die GPL erlaubt es jedoch, modifizierte Versionen privat als Service zu betreiben – ohne Quellcodefreigabe.** + +--- + +### 🤝 Richtigstellung in Bezug auf Forgejo: + +* Mit der Wahl von **GPLv3+** (nicht AGPL) hat Forgejo: + + * ✅ *Copyleft* gegen klassische Forks durch Distribution geschützt + * ❌ *Keinen Schutz* gegen **SaaS-only Forks** geschaffen + +Das heißt für dich: + +> Du darfst Forgejo modifizieren (inkl. Frontend, z. B. zu einem Portal), und **solange du P nur als PaaS anbietest**, **bist du GPL-konform** – **auch wenn du den Quellcode deiner Erweiterungen nicht veröffentlichst**. + +--- + +### Warum dann überhaupt GPL und nicht MIT? + +Forgejo wollte vermutlich: + +* den **klassischen Missbrauch** (Closed-Source-Forks, OEMs, Redistribution als Produkt) **verhindern** +* aber trotzdem eine gewisse **SaaS-Offenheit** erlauben, z. B.: + + * für Hoster + * für Unternehmen, die Forgejo intern/extern als Plattform verwenden + * für Partner wie dich, die es als Basis in Produkten einsetzen + +Eine **AGPL** hätte potenziell: + +* zu mehr **rechtlicher Unsicherheit** geführt +* Hosting-Anbieter **abgeschreckt** +* weniger Verbreitung ermöglicht + +Das ist oft ein **strategischer Trade-off**: +**Mehr Kontrolle** (AGPL) vs. **mehr Adaption & Akzeptanz** (GPL). + +--- + +### 🔍 Fazit zu deiner Einschätzung: + +> **„Forgejo lässt die Möglichkeit offen, ein Portal auf PaaS-Basis zu bauen.“** + +✅ **Richtig.** +Solange du nichts **weitergibst** (Binary, Container, Installationspaket), bist du **nicht verpflichtet**, den Quellcode deiner Erweiterungen zu veröffentlichen – trotz GPLv3. + +--- + diff --git a/docs/technical-documentation/solution/scenarios/gitops/_index.md b/docs/technical-documentation/architecture/research/gitops/_index.md similarity index 100% rename from docs/technical-documentation/solution/scenarios/gitops/_index.md rename to docs/technical-documentation/architecture/research/gitops/_index.md diff --git a/docs/technical-documentation/solution/scenarios/gitops/image.png b/docs/technical-documentation/architecture/research/gitops/image.png similarity index 100% rename from docs/technical-documentation/solution/scenarios/gitops/image.png rename to docs/technical-documentation/architecture/research/gitops/image.png diff --git a/docs/technical-documentation/solution/scenarios/orchestration/_index.md b/docs/technical-documentation/architecture/research/orchestration/_index.md similarity index 100% rename from docs/technical-documentation/solution/scenarios/orchestration/_index.md rename to docs/technical-documentation/architecture/research/orchestration/_index.md diff --git a/docs/technical-documentation/solution/scenarios/orchestration/image-1.png b/docs/technical-documentation/architecture/research/orchestration/image-1.png similarity index 100% rename from docs/technical-documentation/solution/scenarios/orchestration/image-1.png rename to docs/technical-documentation/architecture/research/orchestration/image-1.png diff --git a/docs/technical-documentation/solution/scenarios/orchestration/image.png b/docs/technical-documentation/architecture/research/orchestration/image.png similarity index 100% rename from docs/technical-documentation/solution/scenarios/orchestration/image.png rename to docs/technical-documentation/architecture/research/orchestration/image.png diff --git a/docs/technical-documentation/concepts/.pages b/docs/technical-documentation/concepts/.pages new file mode 100644 index 0000000..86fb01d --- /dev/null +++ b/docs/technical-documentation/concepts/.pages @@ -0,0 +1,6 @@ +title: Concepts +arrange: + - overview.md + - general + - customer-developer + - edp-developer diff --git a/docs/technical-documentation/project/intro-stakeholder-workshop/DevOps-Lifecycle-1.jpg b/docs/technical-documentation/concepts/customer-developer/DevOps-Lifecycle-1.jpg similarity index 100% rename from docs/technical-documentation/project/intro-stakeholder-workshop/DevOps-Lifecycle-1.jpg rename to docs/technical-documentation/concepts/customer-developer/DevOps-Lifecycle-1.jpg diff --git a/docs/technical-documentation/project/intro-stakeholder-workshop/DevOps-Lifecycle.jpg b/docs/technical-documentation/concepts/customer-developer/DevOps-Lifecycle.jpg similarity index 100% rename from docs/technical-documentation/project/intro-stakeholder-workshop/DevOps-Lifecycle.jpg rename to docs/technical-documentation/concepts/customer-developer/DevOps-Lifecycle.jpg diff --git a/docs/technical-documentation/project/intro-stakeholder-workshop/_index.md b/docs/technical-documentation/concepts/customer-developer/_index.md similarity index 100% rename from docs/technical-documentation/project/intro-stakeholder-workshop/_index.md rename to docs/technical-documentation/concepts/customer-developer/_index.md diff --git a/docs/technical-documentation/project/intro-stakeholder-workshop/devops.png b/docs/technical-documentation/concepts/customer-developer/devops.png similarity index 100% rename from docs/technical-documentation/project/intro-stakeholder-workshop/devops.png rename to docs/technical-documentation/concepts/customer-developer/devops.png diff --git a/docs/technical-documentation/project/intro-stakeholder-workshop/image.png b/docs/technical-documentation/concepts/customer-developer/image.png similarity index 100% rename from docs/technical-documentation/project/intro-stakeholder-workshop/image.png rename to docs/technical-documentation/concepts/customer-developer/image.png diff --git a/docs/technical-documentation/concepts/edp-developer/.pages b/docs/technical-documentation/concepts/edp-developer/.pages new file mode 100644 index 0000000..1851e03 --- /dev/null +++ b/docs/technical-documentation/concepts/edp-developer/.pages @@ -0,0 +1,10 @@ +title: edgeDeveloper Framework +arrange: + - storyline.md + - introduction.md + - edge-developer-framework.md + - platforming.md + - orchestrators.md + - cnoe.md + - cnoe-showtime.md + - conclusio.md diff --git a/docs/technical-documentation/project/conceptual-onboarding/3_platforming/humanitec-history.png b/docs/technical-documentation/concepts/edp-developer/3_platforming/humanitec-history.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/3_platforming/humanitec-history.png rename to docs/technical-documentation/concepts/edp-developer/3_platforming/humanitec-history.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/3_platforming/platform-self-services.webp b/docs/technical-documentation/concepts/edp-developer/3_platforming/platform-self-services.webp similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/3_platforming/platform-self-services.webp rename to docs/technical-documentation/concepts/edp-developer/3_platforming/platform-self-services.webp diff --git a/docs/technical-documentation/concepts/3_use-cases/platforms-def.drawio.png b/docs/technical-documentation/concepts/edp-developer/3_platforming/platforms-def.drawio.png similarity index 100% rename from docs/technical-documentation/concepts/3_use-cases/platforms-def.drawio.png rename to docs/technical-documentation/concepts/edp-developer/3_platforming/platforms-def.drawio.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/3_platforming/teams.png b/docs/technical-documentation/concepts/edp-developer/3_platforming/teams.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/3_platforming/teams.png rename to docs/technical-documentation/concepts/edp-developer/3_platforming/teams.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/4_orchestrators/platform-architectures.webp b/docs/technical-documentation/concepts/edp-developer/4_orchestrators/platform-architectures.webp similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/4_orchestrators/platform-architectures.webp rename to docs/technical-documentation/concepts/edp-developer/4_orchestrators/platform-architectures.webp diff --git a/docs/technical-documentation/project/conceptual-onboarding/4_orchestrators/platform-tooling-humanitec-platform-report-2024.PNG b/docs/technical-documentation/concepts/edp-developer/4_orchestrators/platform-tooling-humanitec-platform-report-2024.PNG similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/4_orchestrators/platform-tooling-humanitec-platform-report-2024.PNG rename to docs/technical-documentation/concepts/edp-developer/4_orchestrators/platform-tooling-humanitec-platform-report-2024.PNG diff --git a/docs/technical-documentation/project/conceptual-onboarding/4_orchestrators/vendor-neutral-idp-final.gif b/docs/technical-documentation/concepts/edp-developer/4_orchestrators/vendor-neutral-idp-final.gif similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/4_orchestrators/vendor-neutral-idp-final.gif rename to docs/technical-documentation/concepts/edp-developer/4_orchestrators/vendor-neutral-idp-final.gif diff --git a/docs/technical-documentation/project/conceptual-onboarding/5_cnoe/cnoe-architecture.png b/docs/technical-documentation/concepts/edp-developer/5_cnoe/cnoe-architecture.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/5_cnoe/cnoe-architecture.png rename to docs/technical-documentation/concepts/edp-developer/5_cnoe/cnoe-architecture.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/5_cnoe/cnoe-capabilities.png b/docs/technical-documentation/concepts/edp-developer/5_cnoe/cnoe-capabilities.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/5_cnoe/cnoe-capabilities.png rename to docs/technical-documentation/concepts/edp-developer/5_cnoe/cnoe-capabilities.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/5_cnoe/cnoe-stacks.png b/docs/technical-documentation/concepts/edp-developer/5_cnoe/cnoe-stacks.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/5_cnoe/cnoe-stacks.png rename to docs/technical-documentation/concepts/edp-developer/5_cnoe/cnoe-stacks.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-1.png b/docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-1.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-1.png rename to docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-1.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-10.png b/docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-10.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-10.png rename to docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-10.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-11.png b/docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-11.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-11.png rename to docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-11.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-12.png b/docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-12.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-12.png rename to docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-12.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-13.png b/docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-13.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-13.png rename to docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-13.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-14.png b/docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-14.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-14.png rename to docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-14.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-15.png b/docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-15.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-15.png rename to docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-15.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-16.png b/docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-16.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-16.png rename to docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-16.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-2.png b/docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-2.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-2.png rename to docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-2.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-3.png b/docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-3.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-3.png rename to docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-3.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-4.png b/docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-4.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-4.png rename to docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-4.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-5.png b/docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-5.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-5.png rename to docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-5.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-6.png b/docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-6.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-6.png rename to docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-6.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-7.png b/docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-7.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-7.png rename to docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-7.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-8.png b/docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-8.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-8.png rename to docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-8.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-9.png b/docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-9.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image-9.png rename to docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image-9.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image.png b/docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/image.png rename to docs/technical-documentation/concepts/edp-developer/6_cnoe-showtime/image.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/7_conclusio/domain-architecture.c4 b/docs/technical-documentation/concepts/edp-developer/7_conclusio/domain-architecture.c4 similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/7_conclusio/domain-architecture.c4 rename to docs/technical-documentation/concepts/edp-developer/7_conclusio/domain-architecture.c4 diff --git a/docs/technical-documentation/project/conceptual-onboarding/7_conclusio/images/layers-and-framework-engineer.png b/docs/technical-documentation/concepts/edp-developer/7_conclusio/images/layers-and-framework-engineer.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/7_conclusio/images/layers-and-framework-engineer.png rename to docs/technical-documentation/concepts/edp-developer/7_conclusio/images/layers-and-framework-engineer.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/7_conclusio/images/layers-and-platform-engineer.png b/docs/technical-documentation/concepts/edp-developer/7_conclusio/images/layers-and-platform-engineer.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/7_conclusio/images/layers-and-platform-engineer.png rename to docs/technical-documentation/concepts/edp-developer/7_conclusio/images/layers-and-platform-engineer.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/7_conclusio/images/layers.png b/docs/technical-documentation/concepts/edp-developer/7_conclusio/images/layers.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/7_conclusio/images/layers.png rename to docs/technical-documentation/concepts/edp-developer/7_conclusio/images/layers.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/7_conclusio/images/modern.png b/docs/technical-documentation/concepts/edp-developer/7_conclusio/images/modern.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/7_conclusio/images/modern.png rename to docs/technical-documentation/concepts/edp-developer/7_conclusio/images/modern.png 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/docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/_index.md b/docs/technical-documentation/concepts/edp-developer/cnoe-showtime.md similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/6_cnoe-showtime/_index.md rename to docs/technical-documentation/concepts/edp-developer/cnoe-showtime.md diff --git a/docs/technical-documentation/project/conceptual-onboarding/5_cnoe/_index.md b/docs/technical-documentation/concepts/edp-developer/cnoe.md similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/5_cnoe/_index.md rename to docs/technical-documentation/concepts/edp-developer/cnoe.md diff --git a/docs/technical-documentation/project/conceptual-onboarding/7_conclusio/_index.md b/docs/technical-documentation/concepts/edp-developer/conclusio.md similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/7_conclusio/_index.md rename to docs/technical-documentation/concepts/edp-developer/conclusio.md diff --git a/docs/technical-documentation/project/conceptual-onboarding/2_edge-developer-framework/_index.md b/docs/technical-documentation/concepts/edp-developer/edge-developer-framework.md similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/2_edge-developer-framework/_index.md rename to docs/technical-documentation/concepts/edp-developer/edge-developer-framework.md diff --git a/docs/technical-documentation/project/conceptual-onboarding/1_intro/_index.md b/docs/technical-documentation/concepts/edp-developer/introduction.md similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/1_intro/_index.md rename to docs/technical-documentation/concepts/edp-developer/introduction.md diff --git a/docs/technical-documentation/project/conceptual-onboarding/4_orchestrators/_index.md b/docs/technical-documentation/concepts/edp-developer/orchestrators.md similarity index 71% rename from docs/technical-documentation/project/conceptual-onboarding/4_orchestrators/_index.md rename to docs/technical-documentation/concepts/edp-developer/orchestrators.md index c51b864..9358a73 100644 --- a/docs/technical-documentation/project/conceptual-onboarding/4_orchestrators/_index.md +++ b/docs/technical-documentation/concepts/edp-developer/orchestrators.md @@ -6,7 +6,8 @@ description: Next level platforming is orchestrating platforms ## Summary -When defining and setting up platforms next two intrinsic problems arise: +When defining and setting up platforms next two intrinsic problems arise: + 1. it is not declarative and automated 2. it is not or least not easily changable @@ -21,7 +22,7 @@ This is something extremely new since late 2023 - the rise of the automation of It was Humanitec creating a definition of platform architecture, as they needed to defien what they are building with their 'orchestrator': -https://developer.humanitec.com/introduction/overview/ +![https://developer.humanitec.com/introduction/overview/](./4_orchestrators/vendor-neutral-idp-final.gif) ## Declarative Platform Orchestration @@ -29,16 +30,13 @@ Based on the refence architecture you next can build - or let's say 'orchestrate https://humanitec.com/reference-architectures -https://humanitec.com/blog/aws-azure-and-gcp-open-source-reference-architectures-to-start-your-mvp + +![https://humanitec.com/blog/aws-azure-and-gcp-open-source-reference-architectures-to-start-your-mvp](./4_orchestrators/platform-architectures.webp) > Hint: There is a [slides tool provided by McKinsey](https://platformengineering.org/blog/create-your-own-platform-engineering-reference-architectures) to set up your own platform deign based on the reference architecture - -{{% pageinfo color="info" %}} -### What comes next? - -[Next](../cnoe/) we'll see how we are going to do platform orchestration with CNOE! -{{% /pageinfo %}} +> What comes next? +> [Next](./cnoe.md) we'll see how we are going to do platform orchestration with CNOE! ## Addendum @@ -46,6 +44,4 @@ https://humanitec.com/reference-architectures You remember the [capability mappings from the time before orchestration](../platforming)? Here we have a [similar setup based on Humanitecs platform engineering status ewhite paper](https://humanitec.com/whitepapers/state-of-platform-engineering-report-volume-2): -https://humanitec.com/whitepapers/state-of-platform-engineering-report-volume-2 Whitepaper_ State of Platform Engineering Report.pdf - - +![https://humanitec.com/whitepapers/state-of-platform-engineering-report-volume-2 Whitepaper_ State of Platform Engineering Report.pdf](./4_orchestrators/platform-tooling-humanitec-platform-report-2024.PNG) diff --git a/docs/technical-documentation/project/conceptual-onboarding/3_platforming/_index.md b/docs/technical-documentation/concepts/edp-developer/platforming.md similarity index 92% rename from docs/technical-documentation/project/conceptual-onboarding/3_platforming/_index.md rename to docs/technical-documentation/concepts/edp-developer/platforming.md index a94c203..1332e10 100644 --- a/docs/technical-documentation/project/conceptual-onboarding/3_platforming/_index.md +++ b/docs/technical-documentation/concepts/edp-developer/platforming.md @@ -18,7 +18,7 @@ Let's start with a look into the history of platform engineering. A good startin They create lots of [beautiful articles and insights](https://humanitec.com/blog), their own [platform products](https://humanitec.com/products/) and [basic concepts for the platform architecture](https://humanitec.com/platform-engineering) (we'll meet this later on!). -https://platformengineering.org/blog/the-story-of-platform-engineering +https://platformengineering.org/blog/the-story-of-platform-engineering ### Further nice reference to the raise of platforms @@ -41,7 +41,7 @@ When looking at these 'capabilities', we have CNCF itself: There is a CNCF working group which provides the definition of [Capabilities of platforms](https://tag-app-delivery.cncf.io/whitepapers/platforms/#capabilities-of-platforms) and shows a first idea of the layered architecture of platforms as **service layer for developers** ("product and application teams"): - + > Important: As Platform engineer also notice the [platform-eng-maturity-model](https://tag-app-delivery.cncf.io/whitepapers/platform-eng-maturity-model/) @@ -50,7 +50,7 @@ There is a CNCF working group which provides the definition of [Capabilities of Or, in another illustration for the platform as a developer service interface, which also defines the **'Platform Engineering Team'** inbetween: -https://medium.com/@bijit211987/what-is-platform-engineering-and-how-it-reduce-cognitive-load-on-developers-ac7805603925 +https://medium.com/@bijit211987/what-is-platform-engineering-and-how-it-reduce-cognitive-load-on-developers-ac7805603925 ## How to set up Platforms @@ -77,7 +77,7 @@ Build or buy - this is also in pltaform engineering a tweaked discussion, which {{% pageinfo color="info" %}} ### What comes next? -[Next](../orchestrators/) we'll see how these concepts got structured! +[Next](./orchestrators.md) we'll see how these concepts got structured! {{% /pageinfo %}} ## Addendum diff --git a/docs/technical-documentation/project/conceptual-onboarding/storyline.md b/docs/technical-documentation/concepts/edp-developer/storyline.md similarity index 82% rename from docs/technical-documentation/project/conceptual-onboarding/storyline.md rename to docs/technical-documentation/concepts/edp-developer/storyline.md index 11d2997..283c2be 100644 --- a/docs/technical-documentation/project/conceptual-onboarding/storyline.md +++ b/docs/technical-documentation/concepts/edp-developer/storyline.md @@ -1,3 +1,11 @@ +--- +title: 'Storyline' +linktitle: Conceptual Onboarding +weight: 20 +description: How to conceptually onboard onto the Edge Developer Framework (EDF) requirements and the designed solution +--- + +# Platform 101: Conceptual Onboarding ## Storyline @@ -24,5 +32,3 @@ 3. Don't miss to further investigate and truely understand **CNOE solution** ## Architecture - - diff --git a/docs/technical-documentation/concepts/1_software-and-workloads/_index.md b/docs/technical-documentation/concepts/general/1_software-and-workloads/_index.md similarity index 100% rename from docs/technical-documentation/concepts/1_software-and-workloads/_index.md rename to docs/technical-documentation/concepts/general/1_software-and-workloads/_index.md diff --git a/docs/technical-documentation/concepts/2_engineering-people/_index.md b/docs/technical-documentation/concepts/general/2_engineering-people/_index.md similarity index 100% rename from docs/technical-documentation/concepts/2_engineering-people/_index.md rename to docs/technical-documentation/concepts/general/2_engineering-people/_index.md diff --git a/docs/technical-documentation/concepts/3_use-cases/_index.md b/docs/technical-documentation/concepts/general/3_use-cases/_index.md similarity index 100% rename from docs/technical-documentation/concepts/3_use-cases/_index.md rename to docs/technical-documentation/concepts/general/3_use-cases/_index.md diff --git a/docs/technical-documentation/concepts/3_use-cases/fibonacci-app_cpu-spike.png b/docs/technical-documentation/concepts/general/3_use-cases/fibonacci-app_cpu-spike.png similarity index 100% rename from docs/technical-documentation/concepts/3_use-cases/fibonacci-app_cpu-spike.png rename to docs/technical-documentation/concepts/general/3_use-cases/fibonacci-app_cpu-spike.png diff --git a/docs/technical-documentation/concepts/3_use-cases/image.png b/docs/technical-documentation/concepts/general/3_use-cases/image.png similarity index 100% rename from docs/technical-documentation/concepts/3_use-cases/image.png rename to docs/technical-documentation/concepts/general/3_use-cases/image.png diff --git a/docs/technical-documentation/project/conceptual-onboarding/3_platforming/platforms-def.drawio.png b/docs/technical-documentation/concepts/general/3_use-cases/platforms-def.drawio.png similarity index 100% rename from docs/technical-documentation/project/conceptual-onboarding/3_platforming/platforms-def.drawio.png rename to docs/technical-documentation/concepts/general/3_use-cases/platforms-def.drawio.png diff --git a/docs/technical-documentation/concepts/4_digital-platforms/_index.md b/docs/technical-documentation/concepts/general/4_digital-platforms/_index.md similarity index 100% rename from docs/technical-documentation/concepts/4_digital-platforms/_index.md rename to docs/technical-documentation/concepts/general/4_digital-platforms/_index.md diff --git a/docs/technical-documentation/concepts/4_digital-platforms/platform-components/_index.md b/docs/technical-documentation/concepts/general/4_digital-platforms/platform-components/_index.md similarity index 100% rename from docs/technical-documentation/concepts/4_digital-platforms/platform-components/_index.md rename to docs/technical-documentation/concepts/general/4_digital-platforms/platform-components/_index.md diff --git a/docs/technical-documentation/concepts/4_digital-platforms/platform-components/cicd-pipeline/_index.md b/docs/technical-documentation/concepts/general/4_digital-platforms/platform-components/cicd-pipeline/_index.md similarity index 100% rename from docs/technical-documentation/concepts/4_digital-platforms/platform-components/cicd-pipeline/_index.md rename to docs/technical-documentation/concepts/general/4_digital-platforms/platform-components/cicd-pipeline/_index.md diff --git a/docs/technical-documentation/concepts/4_digital-platforms/platform-components/cicd-pipeline/cicd.drawio.png b/docs/technical-documentation/concepts/general/4_digital-platforms/platform-components/cicd-pipeline/cicd.drawio.png similarity index 100% rename from docs/technical-documentation/concepts/4_digital-platforms/platform-components/cicd-pipeline/cicd.drawio.png rename to docs/technical-documentation/concepts/general/4_digital-platforms/platform-components/cicd-pipeline/cicd.drawio.png diff --git a/docs/technical-documentation/concepts/4_digital-platforms/platform-components/cicd-pipeline/review.md b/docs/technical-documentation/concepts/general/4_digital-platforms/platform-components/cicd-pipeline/review.md similarity index 100% rename from docs/technical-documentation/concepts/4_digital-platforms/platform-components/cicd-pipeline/review.md rename to docs/technical-documentation/concepts/general/4_digital-platforms/platform-components/cicd-pipeline/review.md diff --git a/docs/technical-documentation/concepts/4_digital-platforms/platform-components/developer-portals/_index.md b/docs/technical-documentation/concepts/general/4_digital-platforms/platform-components/developer-portals/_index.md similarity index 100% rename from docs/technical-documentation/concepts/4_digital-platforms/platform-components/developer-portals/_index.md rename to docs/technical-documentation/concepts/general/4_digital-platforms/platform-components/developer-portals/_index.md diff --git a/docs/technical-documentation/concepts/4_digital-platforms/platform-components/orchestrator/_index.md b/docs/technical-documentation/concepts/general/4_digital-platforms/platform-components/orchestrator/_index.md similarity index 100% rename from docs/technical-documentation/concepts/4_digital-platforms/platform-components/orchestrator/_index.md rename to docs/technical-documentation/concepts/general/4_digital-platforms/platform-components/orchestrator/_index.md diff --git a/docs/technical-documentation/concepts/4_digital-platforms/platform-components/references/_index.md b/docs/technical-documentation/concepts/general/4_digital-platforms/platform-components/references/_index.md similarity index 100% rename from docs/technical-documentation/concepts/4_digital-platforms/platform-components/references/_index.md rename to docs/technical-documentation/concepts/general/4_digital-platforms/platform-components/references/_index.md diff --git a/docs/technical-documentation/concepts/4_digital-platforms/platform-engineering/Viktor-restaurant.png b/docs/technical-documentation/concepts/general/4_digital-platforms/platform-engineering/Viktor-restaurant.png similarity index 100% rename from docs/technical-documentation/concepts/4_digital-platforms/platform-engineering/Viktor-restaurant.png rename to docs/technical-documentation/concepts/general/4_digital-platforms/platform-engineering/Viktor-restaurant.png diff --git a/docs/technical-documentation/concepts/4_digital-platforms/platform-engineering/_index.md b/docs/technical-documentation/concepts/general/4_digital-platforms/platform-engineering/_index.md similarity index 100% rename from docs/technical-documentation/concepts/4_digital-platforms/platform-engineering/_index.md rename to docs/technical-documentation/concepts/general/4_digital-platforms/platform-engineering/_index.md diff --git a/docs/technical-documentation/concepts/4_digital-platforms/platform-engineering/cortex-use-cases.png b/docs/technical-documentation/concepts/general/4_digital-platforms/platform-engineering/cortex-use-cases.png similarity index 100% rename from docs/technical-documentation/concepts/4_digital-platforms/platform-engineering/cortex-use-cases.png rename to docs/technical-documentation/concepts/general/4_digital-platforms/platform-engineering/cortex-use-cases.png diff --git a/docs/technical-documentation/concepts/4_digital-platforms/platform-engineering/idp.webp b/docs/technical-documentation/concepts/general/4_digital-platforms/platform-engineering/idp.webp similarity index 100% rename from docs/technical-documentation/concepts/4_digital-platforms/platform-engineering/idp.webp rename to docs/technical-documentation/concepts/general/4_digital-platforms/platform-engineering/idp.webp diff --git a/docs/technical-documentation/concepts/4_digital-platforms/platform-engineering/reference-architecture/_index.md b/docs/technical-documentation/concepts/general/4_digital-platforms/platform-engineering/reference-architecture/_index.md similarity index 100% rename from docs/technical-documentation/concepts/4_digital-platforms/platform-engineering/reference-architecture/_index.md rename to docs/technical-documentation/concepts/general/4_digital-platforms/platform-engineering/reference-architecture/_index.md diff --git a/docs/technical-documentation/concepts/5_platforms/CNOE/_index.md b/docs/technical-documentation/concepts/general/5_platforms/CNOE/_index.md similarity index 100% rename from docs/technical-documentation/concepts/5_platforms/CNOE/_index.md rename to docs/technical-documentation/concepts/general/5_platforms/CNOE/_index.md diff --git a/docs/technical-documentation/concepts/5_platforms/CNOE/cnoe.png b/docs/technical-documentation/concepts/general/5_platforms/CNOE/cnoe.png similarity index 100% rename from docs/technical-documentation/concepts/5_platforms/CNOE/cnoe.png rename to docs/technical-documentation/concepts/general/5_platforms/CNOE/cnoe.png diff --git a/docs/technical-documentation/concepts/5_platforms/CNOE/local-argocd.png b/docs/technical-documentation/concepts/general/5_platforms/CNOE/local-argocd.png similarity index 100% rename from docs/technical-documentation/concepts/5_platforms/CNOE/local-argocd.png rename to docs/technical-documentation/concepts/general/5_platforms/CNOE/local-argocd.png diff --git a/docs/technical-documentation/concepts/5_platforms/CNOE/local-backstage.png b/docs/technical-documentation/concepts/general/5_platforms/CNOE/local-backstage.png similarity index 100% rename from docs/technical-documentation/concepts/5_platforms/CNOE/local-backstage.png rename to docs/technical-documentation/concepts/general/5_platforms/CNOE/local-backstage.png diff --git a/docs/technical-documentation/concepts/5_platforms/Humanitec/_index.md b/docs/technical-documentation/concepts/general/5_platforms/Humanitec/_index.md similarity index 100% rename from docs/technical-documentation/concepts/5_platforms/Humanitec/_index.md rename to docs/technical-documentation/concepts/general/5_platforms/Humanitec/_index.md diff --git a/docs/technical-documentation/concepts/5_platforms/_index.md b/docs/technical-documentation/concepts/general/5_platforms/_index.md similarity index 100% rename from docs/technical-documentation/concepts/5_platforms/_index.md rename to docs/technical-documentation/concepts/general/5_platforms/_index.md diff --git a/docs/technical-documentation/concepts/general/_index.md b/docs/technical-documentation/concepts/general/_index.md new file mode 100644 index 0000000..9507b5a --- /dev/null +++ b/docs/technical-documentation/concepts/general/_index.md @@ -0,0 +1,7 @@ +--- +title: General Concepts +weight: 1 +description: The underlying platforming concepts of the Edge Developer Framework (EDF) solution, i.e. the problem domain +--- + +The underlying platforming concepts of the Edge Developer Framework (EDF) solution, i.e. the problem domain diff --git a/docs/technical-documentation/concepts/_index.md b/docs/technical-documentation/concepts/overview.md similarity index 53% rename from docs/technical-documentation/concepts/_index.md rename to docs/technical-documentation/concepts/overview.md index 9d830d0..1ce92a0 100644 --- a/docs/technical-documentation/concepts/_index.md +++ b/docs/technical-documentation/concepts/overview.md @@ -1,7 +1,8 @@ --- -title: Concepts +title: Overview weight: 1 description: The underlying platforming concepts of the Edge Developer Framework (EDF) solution, i.e. the problem domain --- +The underlying platforming concepts of the Edge Developer Framework (EDF) solution, i.e. the problem domain diff --git a/docs/technical-documentation/solution/_index.md b/docs/technical-documentation/product/_index.md similarity index 52% rename from docs/technical-documentation/solution/_index.md rename to docs/technical-documentation/product/_index.md index aaac88e..6ab69ae 100644 --- a/docs/technical-documentation/solution/_index.md +++ b/docs/technical-documentation/product/_index.md @@ -1,6 +1,7 @@ --- -title: Solution +title: Overview weight: 2 description: "The implemented platforming solutions of EDF, i.e. the solution domain. The documentation of all project output: Design, Building blocks, results, show cases, artifacts and so on" --- +The implemented platforming solutions of EDF, i.e. the solution domain. The documentation of all project output: Design, Building blocks, results, show cases, artifacts and so on \ No newline at end of file diff --git a/docs/technical-documentation/solution/tools/Backstage/CNOE-backstage-commit-history/_index.md b/docs/technical-documentation/product/components/Backstage/CNOE-backstage-commit-history/_index.md similarity index 100% rename from docs/technical-documentation/solution/tools/Backstage/CNOE-backstage-commit-history/_index.md rename to docs/technical-documentation/product/components/Backstage/CNOE-backstage-commit-history/_index.md diff --git a/docs/technical-documentation/solution/tools/Backstage/_index.md b/docs/technical-documentation/product/components/Backstage/_index.md similarity index 100% rename from docs/technical-documentation/solution/tools/Backstage/_index.md rename to docs/technical-documentation/product/components/Backstage/_index.md diff --git a/docs/technical-documentation/solution/tools/Backstage/backstage-setup-tutorial/_index.md b/docs/technical-documentation/product/components/Backstage/backstage-setup-tutorial/_index.md similarity index 100% rename from docs/technical-documentation/solution/tools/Backstage/backstage-setup-tutorial/_index.md rename to docs/technical-documentation/product/components/Backstage/backstage-setup-tutorial/_index.md diff --git a/docs/technical-documentation/product/components/Backstage/backstage-update-tutorial/_index.md b/docs/technical-documentation/product/components/Backstage/backstage-update-tutorial/_index.md new file mode 100644 index 0000000..f42d370 --- /dev/null +++ b/docs/technical-documentation/product/components/Backstage/backstage-update-tutorial/_index.md @@ -0,0 +1,103 @@ +--- +title: Backstage Update Tutorial +--- + +The first Backstage update was performed as described in the ticket https://jira.telekom-mms.com/browse/IPCEICIS-2299 from version 1.28 to version 1.36.1. + +This document provides a detailed guide on the process to update Backstage locally on your machine from version 1.36.1 to 1.38.1. +Later updates can be performed accordingly. (The fixing of deprecated imports should not be necessary, again.) + +## Table of Contents + +1. [Prerequisites](#prerequisites) +2. [Setting Up Backstage](#setting-up-backstage) +3. [Updating Backstage](#updating-backstage) +4. [Fix deprecated import](#fix-deprecated-import) +5. [Running Backstage](#running-backstage) + +## Prerequisites + +Before you start, make sure you have the following installed on your machine: + +1. **Node.js**: Backstage requires Node.js. You can download it from the [Node.js website](https://nodejs.org/). +2. **Yarn**: Backstage uses Yarn as its package manager. +3. **Git** +4. **Docker** + +## Setting Up Backstage + +To download the latest version of our Backstage-EDP app, use git to clone it from the OSC repository at https://forgejo.edf-bootstrap.cx.fg1.ffm.osc.live/DevFW-CICD/backstage-edp.git. + +Make sure yarn ist installed locally. If it hasn't been installed yet, run in the project path: + ```bash + yarn install + ``` + +## Updating Backstage + +In the project path run: + ```bash + yarn backstage-cli versions:bump + ``` + +This will update all relevant components to the newest versions. + +## Fix deprecated import + +In a text editor of your choice open the file '/backstage-edp/packages/backend/src/plugins/proxy.ts' and implement the two following changes. + +### Update import + +First (due to changes in the library) replace the deprecated import + + ```typescript + import { createRouter } from '@backstage/plugin-proxy-backend'; + ``` + +with the following import: + + ```typescript + import { createRouter } from '@roadiehq/backstage-plugin-argo-cd-backend'; + ``` + +### Update method call createRouter() + +Secondly (due to a changed signature) replace the old call of method createRouter() + + ```typescript + return await createRouter({ + logger: env.logger, + config: env.config, + discovery: env.discovery + }); + ``` + +with the following new method call: + + ```typescript + return await createRouter({ + logger: env.logger, + config: env.config + }); + ``` + +## Running backstage + +After completing all updates and fixes, run backstage to verify everything was updated correctly. + +In the project path run: + ```bash + docker build --no-cache -t backstage-cnoe . + ``` + +Start the backend from a console: + ```bash + yarn run start-backend + ``` + +Start the frontend from a console: + ```bash + yarn run start + ``` + +The backstage frontend should now open in your browser. \ No newline at end of file diff --git a/docs/technical-documentation/solution/tools/Backstage/existing-plugins/_index.md b/docs/technical-documentation/product/components/Backstage/existing-plugins/_index.md similarity index 100% rename from docs/technical-documentation/solution/tools/Backstage/existing-plugins/_index.md rename to docs/technical-documentation/product/components/Backstage/existing-plugins/_index.md diff --git a/docs/technical-documentation/solution/tools/Backstage/general-information/_index.md b/docs/technical-documentation/product/components/Backstage/general-information/_index.md similarity index 100% rename from docs/technical-documentation/solution/tools/Backstage/general-information/_index.md rename to docs/technical-documentation/product/components/Backstage/general-information/_index.md diff --git a/docs/technical-documentation/solution/tools/Backstage/plugin-creation-tutorial/_index.md b/docs/technical-documentation/product/components/Backstage/plugin-creation-tutorial/_index.md similarity index 100% rename from docs/technical-documentation/solution/tools/Backstage/plugin-creation-tutorial/_index.md rename to docs/technical-documentation/product/components/Backstage/plugin-creation-tutorial/_index.md diff --git a/docs/technical-documentation/solution/tools/Backstage/plugin-creation-tutorial/example_1.png b/docs/technical-documentation/product/components/Backstage/plugin-creation-tutorial/example_1.png similarity index 100% rename from docs/technical-documentation/solution/tools/Backstage/plugin-creation-tutorial/example_1.png rename to docs/technical-documentation/product/components/Backstage/plugin-creation-tutorial/example_1.png diff --git a/docs/technical-documentation/solution/tools/Backstage/plugin-creation-tutorial/example_2.png b/docs/technical-documentation/product/components/Backstage/plugin-creation-tutorial/example_2.png similarity index 100% rename from docs/technical-documentation/solution/tools/Backstage/plugin-creation-tutorial/example_2.png rename to docs/technical-documentation/product/components/Backstage/plugin-creation-tutorial/example_2.png diff --git a/docs/technical-documentation/solution/tools/Backstage/template-creation/_index.md b/docs/technical-documentation/product/components/Backstage/template-creation/_index.md similarity index 100% rename from docs/technical-documentation/solution/tools/Backstage/template-creation/_index.md rename to docs/technical-documentation/product/components/Backstage/template-creation/_index.md diff --git a/docs/technical-documentation/solution/tools/CNOE/_index.md b/docs/technical-documentation/product/components/CNOE/_index.md similarity index 100% rename from docs/technical-documentation/solution/tools/CNOE/_index.md rename to docs/technical-documentation/product/components/CNOE/_index.md diff --git a/docs/technical-documentation/solution/tools/CNOE/argocd/_index.md b/docs/technical-documentation/product/components/CNOE/argocd/_index.md similarity index 100% rename from docs/technical-documentation/solution/tools/CNOE/argocd/_index.md rename to docs/technical-documentation/product/components/CNOE/argocd/_index.md diff --git a/docs/technical-documentation/solution/tools/CNOE/argocd/argocd-core-components.webp b/docs/technical-documentation/product/components/CNOE/argocd/argocd-core-components.webp similarity index 100% rename from docs/technical-documentation/solution/tools/CNOE/argocd/argocd-core-components.webp rename to docs/technical-documentation/product/components/CNOE/argocd/argocd-core-components.webp diff --git a/docs/technical-documentation/solution/tools/CNOE/argocd/argocd_architecture.webp b/docs/technical-documentation/product/components/CNOE/argocd/argocd_architecture.webp similarity index 100% rename from docs/technical-documentation/solution/tools/CNOE/argocd/argocd_architecture.webp rename to docs/technical-documentation/product/components/CNOE/argocd/argocd_architecture.webp diff --git a/docs/technical-documentation/solution/tools/CNOE/competitors/_index.md b/docs/technical-documentation/product/components/CNOE/competitors/_index.md similarity index 100% rename from docs/technical-documentation/solution/tools/CNOE/competitors/_index.md rename to docs/technical-documentation/product/components/CNOE/competitors/_index.md diff --git a/docs/technical-documentation/solution/tools/CNOE/idpbuilder/_index.md b/docs/technical-documentation/product/components/CNOE/idpbuilder/_index.md similarity index 100% rename from docs/technical-documentation/solution/tools/CNOE/idpbuilder/_index.md rename to docs/technical-documentation/product/components/CNOE/idpbuilder/_index.md diff --git a/docs/technical-documentation/solution/tools/CNOE/idpbuilder/hostname-routing-proxy.png b/docs/technical-documentation/product/components/CNOE/idpbuilder/hostname-routing-proxy.png similarity index 100% rename from docs/technical-documentation/solution/tools/CNOE/idpbuilder/hostname-routing-proxy.png rename to docs/technical-documentation/product/components/CNOE/idpbuilder/hostname-routing-proxy.png diff --git a/docs/technical-documentation/solution/tools/CNOE/idpbuilder/hostname-routing.png b/docs/technical-documentation/product/components/CNOE/idpbuilder/hostname-routing.png similarity index 100% rename from docs/technical-documentation/solution/tools/CNOE/idpbuilder/hostname-routing.png rename to docs/technical-documentation/product/components/CNOE/idpbuilder/hostname-routing.png diff --git a/docs/technical-documentation/solution/tools/CNOE/idpbuilder/http-routing.md b/docs/technical-documentation/product/components/CNOE/idpbuilder/http-routing.md similarity index 100% rename from docs/technical-documentation/solution/tools/CNOE/idpbuilder/http-routing.md rename to docs/technical-documentation/product/components/CNOE/idpbuilder/http-routing.md diff --git a/docs/technical-documentation/solution/tools/CNOE/idpbuilder/installation/_index.md b/docs/technical-documentation/product/components/CNOE/idpbuilder/installation/_index.md similarity index 100% rename from docs/technical-documentation/solution/tools/CNOE/idpbuilder/installation/_index.md rename to docs/technical-documentation/product/components/CNOE/idpbuilder/installation/_index.md diff --git a/docs/technical-documentation/solution/tools/CNOE/idpbuilder/path-routing.png b/docs/technical-documentation/product/components/CNOE/idpbuilder/path-routing.png similarity index 100% rename from docs/technical-documentation/solution/tools/CNOE/idpbuilder/path-routing.png rename to docs/technical-documentation/product/components/CNOE/idpbuilder/path-routing.png diff --git a/docs/technical-documentation/solution/tools/CNOE/included-backstage-templates/_index.md b/docs/technical-documentation/product/components/CNOE/included-backstage-templates/_index.md similarity index 100% rename from docs/technical-documentation/solution/tools/CNOE/included-backstage-templates/_index.md rename to docs/technical-documentation/product/components/CNOE/included-backstage-templates/_index.md diff --git a/docs/technical-documentation/solution/tools/CNOE/included-backstage-templates/basic-argo-workflow/_index.md b/docs/technical-documentation/product/components/CNOE/included-backstage-templates/basic-argo-workflow/_index.md similarity index 100% rename from docs/technical-documentation/solution/tools/CNOE/included-backstage-templates/basic-argo-workflow/_index.md rename to docs/technical-documentation/product/components/CNOE/included-backstage-templates/basic-argo-workflow/_index.md diff --git a/docs/technical-documentation/solution/tools/CNOE/included-backstage-templates/basic-kubernetes-deployment/_index.md b/docs/technical-documentation/product/components/CNOE/included-backstage-templates/basic-kubernetes-deployment/_index.md similarity index 100% rename from docs/technical-documentation/solution/tools/CNOE/included-backstage-templates/basic-kubernetes-deployment/_index.md rename to docs/technical-documentation/product/components/CNOE/included-backstage-templates/basic-kubernetes-deployment/_index.md diff --git a/docs/technical-documentation/solution/tools/CNOE/verification.md b/docs/technical-documentation/product/components/CNOE/verification.md similarity index 100% rename from docs/technical-documentation/solution/tools/CNOE/verification.md rename to docs/technical-documentation/product/components/CNOE/verification.md diff --git a/docs/technical-documentation/solution/tools/Kube-prometheus-stack/_index.md b/docs/technical-documentation/product/components/Kube-prometheus-stack/_index.md similarity index 100% rename from docs/technical-documentation/solution/tools/Kube-prometheus-stack/_index.md rename to docs/technical-documentation/product/components/Kube-prometheus-stack/_index.md diff --git a/docs/technical-documentation/solution/tools/Loki/_index.md b/docs/technical-documentation/product/components/Loki/_index.md similarity index 100% rename from docs/technical-documentation/solution/tools/Loki/_index.md rename to docs/technical-documentation/product/components/Loki/_index.md diff --git a/docs/technical-documentation/solution/tools/Promtail/_index.md b/docs/technical-documentation/product/components/Promtail/_index.md similarity index 100% rename from docs/technical-documentation/solution/tools/Promtail/_index.md rename to docs/technical-documentation/product/components/Promtail/_index.md diff --git a/docs/technical-documentation/solution/tools/_index.md b/docs/technical-documentation/product/components/_index.md similarity index 100% rename from docs/technical-documentation/solution/tools/_index.md rename to docs/technical-documentation/product/components/_index.md diff --git a/docs/technical-documentation/solution/tools/crossplane/_index.md b/docs/technical-documentation/product/components/crossplane/_index.md similarity index 100% rename from docs/technical-documentation/solution/tools/crossplane/_index.md rename to docs/technical-documentation/product/components/crossplane/_index.md diff --git a/docs/technical-documentation/solution/tools/crossplane/provider-kind/_index.md b/docs/technical-documentation/product/components/crossplane/provider-kind/_index.md similarity index 100% rename from docs/technical-documentation/solution/tools/crossplane/provider-kind/_index.md rename to docs/technical-documentation/product/components/crossplane/provider-kind/_index.md diff --git a/docs/technical-documentation/solution/tools/crossplane/provider-kind/composition.drawio b/docs/technical-documentation/product/components/crossplane/provider-kind/composition.drawio similarity index 100% rename from docs/technical-documentation/solution/tools/crossplane/provider-kind/composition.drawio rename to docs/technical-documentation/product/components/crossplane/provider-kind/composition.drawio diff --git a/docs/technical-documentation/solution/tools/crossplane/provider-kind/composition.png b/docs/technical-documentation/product/components/crossplane/provider-kind/composition.png similarity index 100% rename from docs/technical-documentation/solution/tools/crossplane/provider-kind/composition.png rename to docs/technical-documentation/product/components/crossplane/provider-kind/composition.png diff --git a/docs/technical-documentation/solution/tools/crossplane/provider-kind/kindserver_interface.drawio b/docs/technical-documentation/product/components/crossplane/provider-kind/kindserver_interface.drawio similarity index 100% rename from docs/technical-documentation/solution/tools/crossplane/provider-kind/kindserver_interface.drawio rename to docs/technical-documentation/product/components/crossplane/provider-kind/kindserver_interface.drawio diff --git a/docs/technical-documentation/solution/tools/crossplane/provider-kind/kindserver_interface.png b/docs/technical-documentation/product/components/crossplane/provider-kind/kindserver_interface.png similarity index 100% rename from docs/technical-documentation/solution/tools/crossplane/provider-kind/kindserver_interface.png rename to docs/technical-documentation/product/components/crossplane/provider-kind/kindserver_interface.png diff --git a/docs/technical-documentation/solution/tools/crossplane/provider-kind/kindserver_provider-kind.drawio b/docs/technical-documentation/product/components/crossplane/provider-kind/kindserver_provider-kind.drawio similarity index 100% rename from docs/technical-documentation/solution/tools/crossplane/provider-kind/kindserver_provider-kind.drawio rename to docs/technical-documentation/product/components/crossplane/provider-kind/kindserver_provider-kind.drawio diff --git a/docs/technical-documentation/solution/tools/crossplane/provider-kind/kindserver_provider-kind.png b/docs/technical-documentation/product/components/crossplane/provider-kind/kindserver_provider-kind.png similarity index 100% rename from docs/technical-documentation/solution/tools/crossplane/provider-kind/kindserver_provider-kind.png rename to docs/technical-documentation/product/components/crossplane/provider-kind/kindserver_provider-kind.png diff --git a/docs/technical-documentation/solution/tools/crossplane/provider-kind/provider-kind_providerconfig.drawio b/docs/technical-documentation/product/components/crossplane/provider-kind/provider-kind_providerconfig.drawio similarity index 100% rename from docs/technical-documentation/solution/tools/crossplane/provider-kind/provider-kind_providerconfig.drawio rename to docs/technical-documentation/product/components/crossplane/provider-kind/provider-kind_providerconfig.drawio diff --git a/docs/technical-documentation/solution/tools/crossplane/provider-kind/provider-kind_providerconfig.png b/docs/technical-documentation/product/components/crossplane/provider-kind/provider-kind_providerconfig.png similarity index 100% rename from docs/technical-documentation/solution/tools/crossplane/provider-kind/provider-kind_providerconfig.png rename to docs/technical-documentation/product/components/crossplane/provider-kind/provider-kind_providerconfig.png diff --git a/docs/technical-documentation/product/components/forgejo/index.md b/docs/technical-documentation/product/components/forgejo/index.md new file mode 100644 index 0000000..f5ccaad --- /dev/null +++ b/docs/technical-documentation/product/components/forgejo/index.md @@ -0,0 +1,77 @@ +# Forgejo + +## Meta + +* https://codeberg.org/forgejo +* https://codeberg.org/forgejo#meta + +## Forgejo Development + +* https://forgejo.org/docs/v1.21/developer/architecture/ +* https://forgejo.org/docs/v1.21/developer/customization/ + +## UI + +* https://codeberg.org/forgejo/discussions/issues/338 + +## Tasks + +Abstimmung mit Micha (Marschner), 06.05.25: + +1. Einarbeiten, Development Model, zB. Astro Framework +1. Soft-Forking, Down/Up-Streaming +1. 'Sparring' User experience + +Koordination: +* Hinweis: '8 Wochen MVP Forgejo-as-a-Service' ist derzeit der Fokus auf das SaaS in der OTC +* In dieser zeit arbeitet Julius an der UX-Architekturkonzeption +* Michael arbeitet sich ein, Technologie-Stack verstehen +* 'Zum laufen bekommen': Lokales Aufsetzen als Nächstes gemeinsam -> Termin stellt Stephan ein + +## Local Development + +### method 1: docker compose with forgejo:latest + +Method 1: run a latest forgejo with sqlite - configuration is done on first login + +* https://forgejo.org/docs/latest/admin/installation-docker/ + +```bash +docker compose up -d + +# open localhost:3000 + +# check registry + +docker login localhost:3000 + +docker image push localhost:3000// +``` + +### method 2: install and develop it from source + +* https://codeberg.org/forgejo/forgejo.git + +```bash +git clone https://codeberg.org/forgejo/forgejo.git + +# enter devcontainer in VSC (takes 10 mins for the first time) + +# make build + +# then run ./gitea (sic!) --help +# also see ./gitea forgejo-cli actions +``` + +### method 3: 'setup forgejo' (with runner) + +* https://code.forgejo.org/actions/setup-forgejo + +Additional links: +* https://brainsteam.co.uk/2024/03/17/moving-from-gitea-to-forgejo-including-actions-with-docker-compose/ +* https://code.forgejo.org/forgejo/runner +* https://linus.dev/posts/setting-up-a-self-hosted-forgejo-actions-runner-with-docker-compose/ + +```bash +git clone https://code.forgejo.org/actions/setup-forgejo.git +``` \ No newline at end of file diff --git a/docs/technical-documentation/product/components/forgejo/onboarding-local-development.md b/docs/technical-documentation/product/components/forgejo/onboarding-local-development.md new file mode 100644 index 0000000..7dcc568 --- /dev/null +++ b/docs/technical-documentation/product/components/forgejo/onboarding-local-development.md @@ -0,0 +1,290 @@ +# Forgejo + +In the following you will find + +* a lot of interestimg Forgejo links +* to to local setup and local development +* and 4 methods to set up Forgejo locally +* 3 times based only on Docker +* and once only based on Go et.al. + +## Local Setup and Development + +### Forgejo Releases + +* https://forgejo.org/releases/ + +-> the current release is 11.0 + +### method 1: docker ( - compose) with forgejo + +Method 1 is just run the or a docker image. +To be more comfortable in the parameters we can use a docker-compose file. + +run a latest forgejo with sqlite - configuration is done on first login + +* https://forgejo.org/docs/latest/admin/installation-docker/ + +#### prepare and investigate the image + +```bash +docker pull codeberg.org/forgejo/forgejo:11 + +docker inspect codeberg.org/forgejo/forgejo:11 +# check cmd and entrypoint + + # "Env": [ + # "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + # "USER=git", + # "GITEA_CUSTOM=/data/gitea" + # ], + # "Cmd": [ + # "/usr/bin/s6-svscan", + # "/etc/s6" + # ], + # "WorkingDir": "/", + # "Entrypoint": [ + # "/usr/bin/entrypoint" + # ], + +# run the image with a cli +docker run -it --entrypoint="" codeberg.org/forgejo/forgejo:11 bash + +# in the container +cat /usr/bin/entrypoint +# if [ $# -gt 0 ]; then +# exec "$@" +# else +# exec /usr/bin/s6-svscan /etc/s6 +# fi + +# check /etc/s6 + +tree /etc/s6/ +# /etc/s6/ +# ├── gitea +# │ ├── finish +# │ ├── run +# │ └── setup +# └── openssh +# ├── finish +# ├── run +# └── setup + +cat /etc/s6/gitea/run +# #!/bin/bash +# [[ -f ./setup ]] && source ./setup + +# pushd /app/gitea >/dev/null +# exec su-exec $USER /usr/local/bin/gitea web +# popd + +cat /etc/s6/gitea/setup +# #!/bin/bash + +# if [ ! -d /data/git/.ssh ]; then +# mkdir -p /data/git/.ssh +# fi + +# # Set the correct permissions on the .ssh directory and authorized_keys file, +# # or sshd will refuse to use them and lead to clone/push/pull failures. +# # It could happen when users have copied their data to a new volume and changed the file permission by accident, +# # and it would be very hard to troubleshoot unless users know how to check the logs of sshd which is started by s6. +# chmod 700 /data/git/.ssh +# if [ -f /data/git/.ssh/authorized_keys ]; then +# chmod 600 /data/git/.ssh/authorized_keys +# fi + +# if [ ! -f /data/git/.ssh/environment ]; then +# echo "GITEA_CUSTOM=$GITEA_CUSTOM" >| /data/git/.ssh/environment +# chmod 600 /data/git/.ssh/environment + +# elif ! grep -q "^GITEA_CUSTOM=$GITEA_CUSTOM$" /data/git/.ssh/environment; then +# sed -i /^GITEA_CUSTOM=/d /data/git/.ssh/environment +# echo "GITEA_CUSTOM=$GITEA_CUSTOM" >> /data/git/.ssh/environment +# fi + +# if [ ! -f ${GITEA_CUSTOM}/conf/app.ini ]; then +# mkdir -p ${GITEA_CUSTOM}/conf + +# # Set INSTALL_LOCK to true only if SECRET_KEY is not empty and +# # INSTALL_LOCK is empty +# if [ -n "$SECRET_KEY" ] && [ -z "$INSTALL_LOCK" ]; then +# INSTALL_LOCK=true +# fi + +# # Substitute the environment variables in the template +# APP_NAME=${APP_NAME:-"Forgejo: Beyond coding. We forge."} \ +# RUN_MODE=${RUN_MODE:-"prod"} \ +# DOMAIN=${DOMAIN:-"localhost"} \ +# SSH_DOMAIN=${SSH_DOMAIN:-"localhost"} \ +# HTTP_PORT=${HTTP_PORT:-"3000"} \ +# ROOT_URL=${ROOT_URL:-""} \ +# DISABLE_SSH=${DISABLE_SSH:-"false"} \ +# SSH_PORT=${SSH_PORT:-"22"} \ +# SSH_LISTEN_PORT=${SSH_LISTEN_PORT:-"${SSH_PORT}"} \ +# LFS_START_SERVER=${LFS_START_SERVER:-"false"} \ +# DB_TYPE=${DB_TYPE:-"sqlite3"} \ +# DB_HOST=${DB_HOST:-"localhost:3306"} \ +# DB_NAME=${DB_NAME:-"gitea"} \ +# DB_USER=${DB_USER:-"root"} \ +# DB_PASSWD=${DB_PASSWD:-""} \ +# INSTALL_LOCK=${INSTALL_LOCK:-"false"} \ +# DISABLE_REGISTRATION=${DISABLE_REGISTRATION:-"false"} \ +# REQUIRE_SIGNIN_VIEW=${REQUIRE_SIGNIN_VIEW:-"false"} \ +# SECRET_KEY=${SECRET_KEY:-""} \ +# envsubst < /etc/templates/app.ini > ${GITEA_CUSTOM}/conf/app.ini + +# chown ${USER}:git ${GITEA_CUSTOM}/conf/app.ini +# fi + +# # Replace app.ini settings with env variables in the form GITEA__SECTION_NAME__KEY_NAME +# environment-to-ini --config ${GITEA_CUSTOM}/conf/app.ini + +# # only chown if current owner is not already the gitea ${USER}. No recursive check to save time +# if ! [[ $(ls -ld /data/gitea | awk '{print $3}') = ${USER} ]]; then chown -R ${USER}:git /data/gitea; fi +# if ! [[ $(ls -ld /app/gitea | awk '{print $3}') = ${USER} ]]; then chown -R ${USER}:git /app/gitea; fi +# if ! [[ $(ls -ld /data/git | awk '{print $3}') = ${USER} ]]; then chown -R ${USER}:git /data/git; fi +# chmod 0755 /data/gitea /app/gitea /data/git +``` + +#### Outcome + +The container will run +* /usr/local/bin/gitea web +* with USER=git +* and DB_TYPE=${DB_TYPE:-"sqlite3" + + +#### prepare the docker compose file + +From the [link above](https://forgejo.org/docs/latest/admin/installation-docker/) copy and create a docker-compose.yml like this: + +```bash +echo $" +networks: + forgejo: + external: false + +services: + server: + image: codeberg.org/forgejo/forgejo:11 + container_name: forgejo + environment: + - USER_UID=1000 + - USER_GID=1000 + restart: always + networks: + - forgejo + volumes: + - ./forgejo:/data + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + ports: + - '3000:3000' + - '222:22' +" >> docker-compose.yml +``` + +### Run the container and open the WebUI + +```bash +docker compose up -d + +# open http://localhost:3000 + +### test: Check the registry + +# check registry + +docker login localhost:3000 + +docker image push localhost:3000// +``` + +### method 2: install and develop it from source + +The next real 'do development' setup method is by running the source. + + +* https://codeberg.org/forgejo/forgejo.git + +```bash +git clone https://codeberg.org/forgejo/forgejo.git + +# enter devcontainer in VSC (takes 10 mins for the first time) + +# make build + +# then run ./gitea (sic!) --help +# also see ./gitea forgejo-cli actions +``` + +### method 3: setup (a bit) declarativly - Forgejo and Forgejo Runner + +#### The kubernetes operator way + +The highly sophisticated way to do a declarative setup is already provided by the [Forgejo-Operator](https://forgejo.edf-bootstrap.cx.fg1.ffm.osc.live/DevFW/forgejo-operator) running your desired forgejo and forgejo runner state by an operator as custom ressources. + +#### The docker-compose way + +You can also run both [Forgejo and Forgejo Runner the pure docker way.](https://forgejo.edf-bootstrap.cx.fg1.ffm.osc.live/stephan.lo/stl-edp/src/branch/development/09-forgejo) + +```bash +git clone https://forgejo.edf-bootstrap.cx.fg1.ffm.osc.live/stephan.lo/stl-edp.git + +git checkout development + +cd 09-forgejo + +# spin up +# ... first check and understand the content of the script ! +./spin-up.sh + +# destroy +./teardown.sh +``` + +Also have a look into the linsk provided in the README, especially https://codeberg.org/forgejo-contrib/delightful-forgejo + +### method 4: 'setup forgejo' (with runner) + +Really funny and promisingly looking high-end-community-development stuff is this: + +* https://code.forgejo.org/actions/setup-forgejo + + +```bash +git clone https://code.forgejo.org/actions/setup-forgejo.git +``` + + +## References + +### Meta + +* https://codeberg.org/forgejo + +### Forgejo Development + +* https://forgejo.org/docs/v1.21/developer/architecture/ +* https://forgejo.org/docs/v1.21/developer/customization/ + +### UI + +* https://codeberg.org/forgejo/discussions/issues/338 + +### Some nice Setup references + +* https://brainsteam.co.uk/2024/03/17/moving-from-gitea-to-forgejo-including-actions-with-docker-compose/ +* https://code.forgejo.org/forgejo/runner +* https://linus.dev/posts/setting-up-a-self-hosted-forgejo-actions-runner-with-docker-compose/ + + +### Further [curated] references + +* [ArchWiki](https://wiki.archlinux.org/title/Forgejo) +* [Forgejo Command Line and Cli](https://forgejo.org/docs/latest/admin/command-line/) +* [Interface Costomization](https://forgejo.org/docs/next/contributor/customization/) +* [From soft to hard fork from Gitea](https://forgejo.org/docs/next/contributor/customization/): In Feb 2024 it was decided to stop downward compatibility with Gitea +* [Drastic UI consolidation in v8.0](https://forgejo.org/2024-07-release-v8-0/) \ No newline at end of file diff --git a/docs/technical-documentation/solution/tools/kyverno-integration/_index.md b/docs/technical-documentation/product/components/kyverno-integration/_index.md similarity index 100% rename from docs/technical-documentation/solution/tools/kyverno-integration/_index.md rename to docs/technical-documentation/product/components/kyverno-integration/_index.md diff --git a/docs/technical-documentation/solution/tools/kyverno-integration/kyverno.png b/docs/technical-documentation/product/components/kyverno-integration/kyverno.png similarity index 100% rename from docs/technical-documentation/solution/tools/kyverno-integration/kyverno.png rename to docs/technical-documentation/product/components/kyverno-integration/kyverno.png diff --git a/docs/technical-documentation/project/bootstrapping/_index.md b/docs/technical-documentation/product/operations/bootstrapping/_index.md similarity index 100% rename from docs/technical-documentation/project/bootstrapping/_index.md rename to docs/technical-documentation/product/operations/bootstrapping/_index.md diff --git a/docs/technical-documentation/project/bootstrapping/backup/_index.md b/docs/technical-documentation/product/operations/bootstrapping/backup/_index.md similarity index 100% rename from docs/technical-documentation/project/bootstrapping/backup/_index.md rename to docs/technical-documentation/product/operations/bootstrapping/backup/_index.md diff --git a/docs/technical-documentation/solution/scenarios/local-development/edpbuilder-example-network.drawio b/docs/technical-documentation/product/operations/local-development/edpbuilder-example-network.drawio similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/edpbuilder-example-network.drawio rename to docs/technical-documentation/product/operations/local-development/edpbuilder-example-network.drawio diff --git a/docs/technical-documentation/solution/scenarios/local-development/edpbuilder-example-network.drawio.png b/docs/technical-documentation/product/operations/local-development/edpbuilder-example-network.drawio.png similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/edpbuilder-example-network.drawio.png rename to docs/technical-documentation/product/operations/local-development/edpbuilder-example-network.drawio.png diff --git a/docs/technical-documentation/solution/scenarios/local-development/edpbuilder-networking.drawio b/docs/technical-documentation/product/operations/local-development/edpbuilder-networking.drawio similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/edpbuilder-networking.drawio rename to docs/technical-documentation/product/operations/local-development/edpbuilder-networking.drawio diff --git a/docs/technical-documentation/solution/scenarios/local-development/edpbuilder-networking.drawio.png b/docs/technical-documentation/product/operations/local-development/edpbuilder-networking.drawio.png similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/edpbuilder-networking.drawio.png rename to docs/technical-documentation/product/operations/local-development/edpbuilder-networking.drawio.png diff --git a/docs/technical-documentation/solution/scenarios/local-development/host-to-kind-network-routing/index.md b/docs/technical-documentation/product/operations/local-development/host-to-kind-network-routing/index.md similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/host-to-kind-network-routing/index.md rename to docs/technical-documentation/product/operations/local-development/host-to-kind-network-routing/index.md diff --git a/docs/technical-documentation/solution/scenarios/local-development/host-to-kind-network-routing/pings.png b/docs/technical-documentation/product/operations/local-development/host-to-kind-network-routing/pings.png similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/host-to-kind-network-routing/pings.png rename to docs/technical-documentation/product/operations/local-development/host-to-kind-network-routing/pings.png diff --git a/docs/technical-documentation/solution/scenarios/local-development/host-to-kind-network-routing/windows.png b/docs/technical-documentation/product/operations/local-development/host-to-kind-network-routing/windows.png similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/host-to-kind-network-routing/windows.png rename to docs/technical-documentation/product/operations/local-development/host-to-kind-network-routing/windows.png diff --git a/docs/technical-documentation/solution/scenarios/local-development/local-networking.md b/docs/technical-documentation/product/operations/local-development/local-networking.md similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/local-networking.md rename to docs/technical-documentation/product/operations/local-development/local-networking.md diff --git a/docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/0-overview.md b/docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/0-overview.md similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/0-overview.md rename to docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/0-overview.md diff --git a/docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/1-registry-mirror-and-cache-proxy-theory.md b/docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/1-registry-mirror-and-cache-proxy-theory.md similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/1-registry-mirror-and-cache-proxy-theory.md rename to docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/1-registry-mirror-and-cache-proxy-theory.md diff --git a/docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/2-registry-mirror-and-cache-proxy-manual-installation.md b/docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/2-registry-mirror-and-cache-proxy-manual-installation.md similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/2-registry-mirror-and-cache-proxy-manual-installation.md rename to docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/2-registry-mirror-and-cache-proxy-manual-installation.md diff --git a/docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/3-registry-mirror-and-cache-proxy-hacks.md b/docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/3-registry-mirror-and-cache-proxy-hacks.md similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/3-registry-mirror-and-cache-proxy-hacks.md rename to docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/3-registry-mirror-and-cache-proxy-hacks.md diff --git a/docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/1-container-engine.png b/docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/1-container-engine.png similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/1-container-engine.png rename to docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/1-container-engine.png diff --git a/docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/1-image-naming-convention.png b/docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/1-image-naming-convention.png similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/1-image-naming-convention.png rename to docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/1-image-naming-convention.png diff --git a/docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/1-images.png b/docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/1-images.png similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/1-images.png rename to docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/1-images.png diff --git a/docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/1-linux-processes.png b/docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/1-linux-processes.png similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/1-linux-processes.png rename to docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/1-linux-processes.png diff --git a/docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/2-differnt-engines.png b/docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/2-differnt-engines.png similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/2-differnt-engines.png rename to docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/2-differnt-engines.png diff --git a/docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/2-scenario-1-kind-mirror.png b/docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/2-scenario-1-kind-mirror.png similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/2-scenario-1-kind-mirror.png rename to docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/2-scenario-1-kind-mirror.png diff --git a/docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/2-scenario-2-kind-cache.png b/docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/2-scenario-2-kind-cache.png similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/2-scenario-2-kind-cache.png rename to docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/2-scenario-2-kind-cache.png diff --git a/docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/2-scenario-3-docker-mirror.png b/docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/2-scenario-3-docker-mirror.png similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/2-scenario-3-docker-mirror.png rename to docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/2-scenario-3-docker-mirror.png diff --git a/docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/2-scenario-4-docker-cache.png b/docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/2-scenario-4-docker-cache.png similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/2-scenario-4-docker-cache.png rename to docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/2-scenario-4-docker-cache.png diff --git a/docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/container-engines-runtimes-orchestrators.png b/docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/container-engines-runtimes-orchestrators.png similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/container-engines-runtimes-orchestrators.png rename to docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/container-engines-runtimes-orchestrators.png diff --git a/docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/container-runtimes.png b/docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/container-runtimes.png similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/container-runtimes.png rename to docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/container-runtimes.png diff --git a/docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/containerd-runtimes.png b/docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/containerd-runtimes.png similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/containerd-runtimes.png rename to docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/containerd-runtimes.png diff --git a/docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/cri-architecture.png b/docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/cri-architecture.png similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/cri-architecture.png rename to docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/cri-architecture.png diff --git a/docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/docker-containerd-cri-o-und-runc.png b/docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/docker-containerd-cri-o-und-runc.png similarity index 100% rename from docs/technical-documentation/solution/scenarios/local-development/registry-mirror-and-ache/img/docker-containerd-cri-o-und-runc.png rename to docs/technical-documentation/product/operations/local-development/registry-mirror-and-ache/img/docker-containerd-cri-o-und-runc.png diff --git a/docs/technical-documentation/project/250527-review.md b/docs/technical-documentation/project/250527-review.md new file mode 100644 index 0000000..cff70a4 --- /dev/null +++ b/docs/technical-documentation/project/250527-review.md @@ -0,0 +1,16 @@ + +# Review / Product-Demo 27.05.25 + +* central-forgejo in OTC -> war nur test +* API OTC sold out: kann man auf ressourcenengpässe in der cloud beim provisioniren reagieren? + +Fragen Alex endther: +* CI für cluster generieren (nightly?) +* kubernetes version ? +* wie läuft migration von kubernetes? + + +# Retro + +Dailis overload +Salzstruer in den Mobs - not everything can be solved in mobs \ No newline at end of file diff --git a/docs/technical-documentation/project/_index.md b/docs/technical-documentation/project/_index.md index 97f0dad..ea51e48 100644 --- a/docs/technical-documentation/project/_index.md +++ b/docs/technical-documentation/project/_index.md @@ -1,6 +1,7 @@ --- -title: Project +title: Overview weight: 5 description: How we organize work and proceed as team, which decisions we made, what outputs and outcomes we have --- +How we organize work and proceed as team, which decisions we made, what outputs and outcomes we have \ No newline at end of file diff --git a/docs/technical-documentation/project/conceptual-onboarding/_index.md b/docs/technical-documentation/project/conceptual-onboarding/_index.md deleted file mode 100644 index 52cb204..0000000 --- a/docs/technical-documentation/project/conceptual-onboarding/_index.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: 'Platform 101: Conceptual Onboarding ' -linktitle: Conceptual Onboarding -weight: 20 -description: How to conceptually onboard onto the Edge Developer Framework (EDF) requirements and the designed solution ---- - - - diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-1.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-1.png new file mode 100644 index 0000000..a6c4099 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-1.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-10.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-10.png new file mode 100644 index 0000000..c2cf304 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-10.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-100.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-100.png new file mode 100644 index 0000000..067bd1b Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-100.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-101.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-101.png new file mode 100644 index 0000000..df7ed3b Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-101.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-102.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-102.png new file mode 100644 index 0000000..eb09200 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-102.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-103.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-103.png new file mode 100644 index 0000000..773325a Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-103.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-104.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-104.png new file mode 100644 index 0000000..0522a54 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-104.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-105.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-105.png new file mode 100644 index 0000000..334dad6 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-105.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-106.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-106.png new file mode 100644 index 0000000..58833d6 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-106.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-107.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-107.png new file mode 100644 index 0000000..4c3476c Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-107.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-108.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-108.png new file mode 100644 index 0000000..237ef89 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-108.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-109.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-109.png new file mode 100644 index 0000000..2840ef7 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-109.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-11.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-11.png new file mode 100644 index 0000000..9e30478 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-11.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-110.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-110.png new file mode 100644 index 0000000..867aad4 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-110.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-111.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-111.png new file mode 100644 index 0000000..dfdf7c9 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-111.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-112.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-112.png new file mode 100644 index 0000000..c93c341 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-112.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-113.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-113.png new file mode 100644 index 0000000..9cdf82b Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-113.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-114.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-114.png new file mode 100644 index 0000000..30c7d1d Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-114.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-115.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-115.png new file mode 100644 index 0000000..5d50076 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-115.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-116.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-116.png new file mode 100644 index 0000000..90a32ad Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-116.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-117.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-117.png new file mode 100644 index 0000000..01b8aab Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-117.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-118.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-118.png new file mode 100644 index 0000000..8a78345 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-118.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-119.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-119.png new file mode 100644 index 0000000..85f993e Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-119.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-12.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-12.png new file mode 100644 index 0000000..023b03a Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-12.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-120.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-120.png new file mode 100644 index 0000000..6890cdb Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-120.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-121.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-121.png new file mode 100644 index 0000000..1ef39f1 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-121.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-122.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-122.png new file mode 100644 index 0000000..439a1d2 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-122.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-123.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-123.png new file mode 100644 index 0000000..12e65f9 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-123.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-124.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-124.png new file mode 100644 index 0000000..964de41 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-124.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-13.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-13.png new file mode 100644 index 0000000..145af4a Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-13.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-14.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-14.png new file mode 100644 index 0000000..1b4faf8 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-14.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-15.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-15.png new file mode 100644 index 0000000..ab44f16 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-15.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-16.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-16.png new file mode 100644 index 0000000..7af56d2 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-16.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-17.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-17.png new file mode 100644 index 0000000..83f7312 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-17.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-2.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-2.png new file mode 100644 index 0000000..4d528d0 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-2.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-3.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-3.png new file mode 100644 index 0000000..1071cf3 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-3.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-4.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-4.png new file mode 100644 index 0000000..668c3b6 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-4.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-5.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-5.png new file mode 100644 index 0000000..4f846d4 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-5.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-6.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-6.png new file mode 100644 index 0000000..066da6d Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-6.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-7.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-7.png new file mode 100644 index 0000000..798375c Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-7.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-8.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-8.png new file mode 100644 index 0000000..d6b6535 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-8.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image-9.png b/docs/technical-documentation/project/forgejo-service-mob-1/image-9.png new file mode 100644 index 0000000..b3a1058 Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image-9.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/image.png b/docs/technical-documentation/project/forgejo-service-mob-1/image.png new file mode 100644 index 0000000..0cc2e1a Binary files /dev/null and b/docs/technical-documentation/project/forgejo-service-mob-1/image.png differ diff --git a/docs/technical-documentation/project/forgejo-service-mob-1/index.md b/docs/technical-documentation/project/forgejo-service-mob-1/index.md new file mode 100644 index 0000000..248aa1d --- /dev/null +++ b/docs/technical-documentation/project/forgejo-service-mob-1/index.md @@ -0,0 +1,172 @@ +# OTC + +## CCE Cloud Container engine - Kubernetes + +* Kata-Container - MicroVM, e.g. for Forgejo-Runner + + +## Networking + +* compare it with local networking in docker-compose e.g. +* there you also can do 'Software defied Networking' +* like we do in OTC + +![alt text](image.png) + +* Question: When or why to subnet? +* A: It' for security ... for sure, but at first it's for creating domains of transparently interacting applicatios + +* Hint: Use CIDR calculators when getting lost in IP4 networking + +## Routing Table + +![alt text](image-1.png) + +## Peering Connections + +![alt text](image-2.png) + +## tags + +should be possible ... + + +## VM + +### AZ + +is a data center - we take random + +![alt text](image-3.png) + +![alt text](image-5.png) + + +### price calculator + +always be aware of costs! +> Todo: We need to talk about our budgets + +![alt text](image-4.png) + + +## security group + +![alt text](image-6.png) + + +## IP + +![alt text](image-7.png) + +## Creating VM + +![alt text](image-8.png) + + +### result + +![alt text](image-9.png) + +## trying to connect + +![alt text](image-10.png) + +... company VPN issues :-) + +![alt text](image-11.png) + +## try to hand over the key ... + +![alt text](image-12.png) + +![alt text](image-13.png) + +## find IP again, try to get in + +![alt text](image-16.png) + +![alt text](image-14.png) + +![alt text](image-15.png) + +## current state + +![alt text](image-17.png) + +## ... break of stephan from 14h45-16h00 + +## terraform, driver is daniel + +![alt text](image-100.png) + +![alt text](image-101.png) + +![alt text](image-102.png) + +![alt text](image-103.png) + +![alt text](image-104.png) + +![alt text](image-105.png) + +![alt text](image-106.png) + +![alt text](image-107.png) + +![alt text](image-108.png) + +![alt text](image-109.png) + +![alt text](image-110.png) + +## in otc, new driver is cristopher + +![alt text](image-111.png) + +install terraform ... + +![alt text](image-112.png) + +### otc provider + +![alt text](image-113.png) + +![alt text](image-114.png) + +![alt text](image-115.png) + + +![alt text](image-116.png) + + +### auth + +![alt text](image-117.png) + +![alt text](image-118.png) + + +```bash +export OS_ACCESS_KEY= +export OS_SECRET_KEY= +export OS_SECURITY_TOKEN= +``` + +## apply + +![alt text](image-119.png) + +![alt text](image-120.png) + +![alt text](image-121.png) + +## syncing + +![alt text](image-122.png) + +![alt text](image-123.png) + +### statefile, needs to be shared + +![alt text](image-124.png) \ No newline at end of file diff --git a/docs/technical-documentation/project/team-process/ensemble-pairing-mob/index.md b/docs/technical-documentation/project/team-process/ensemble-pairing-mob/index.md new file mode 100644 index 0000000..1eea4a8 --- /dev/null +++ b/docs/technical-documentation/project/team-process/ensemble-pairing-mob/index.md @@ -0,0 +1,820 @@ + +# Mobbing / Ensemble programming + + +Es gibt eine Reihe von Erfahrungen aus Teams, die (Remote-)Mob Programming oder ähnliches wie *ensemble programming*, *pair programming*, oder *swarming* praktizieren – oft mit vergleichbarer Teamzusammensetzung und ähnlichen Dynamiken über die Zeit. + +### Typischer Verlauf bei Mob Programming (grob in Phasen): + +1. **Initiale Euphorie & hoher Output** – durch hohe Energie, Fokus und enge Zusammenarbeit (oft durch starke Facilitator oder Leads getrieben). +2. **Erste Ermüdungserscheinungen** – durch Daueraufmerksamkeit, Entscheidungsmüdigkeit, reduzierte Eigenverantwortung. +3. **Reflexion und Wunsch nach mehr Balance** – Aufkommen von Fragen zur langfristigen Skalierung, individuellen Entwicklung, Ownership, usw. + +## Annahme + +Nach 3 Wochen Mobbing-Initialisierung steen wir jetzt in Phase 3. Das ist gesund und sogar notwendig, damit sich euer Arbeitsmodus weiterentwickeln kann. + +--- + +## 🔁 Mögliche Strategien (aus der Praxis) + +### 1. **Rotierende Mobs / kleinere Ensembles** + +Statt alle 10 Personen in einem Mob: + +* Aufteilung in 2–3 *kleinere Mobs* (z. B. 3–4 Personen), z. B. entlang von Features, Domänen oder Zielen. +* Wöchentlicher Austausch oder Cross-Sessions zum gegenseitigen Updaten („*Mob Review*“). +* Gute Rotation nach 1–2 Wochen, damit kein Wissen isoliert wird (Stichwort: *knowledge silos vermeiden*). + +**Beispiel**: Ein Team bei [Spotify](https://spotify.design/article/2022-04-20_mob-programming-the-spotify-way) hat ab Woche 4 ihre Mobs in „Feature-Mobs“ aufgeteilt und alle 2 Wochen durchgemischt. + +--- + +### 2. **Mob/Pair/Alone-Zyklen** + +Einige Teams fahren gut mit einem **wechselnden Modus**: + +| Wochentag | Modus | +| --------- | ------------------------------------- | +| Mo | Mob | +| Di–Mi | Pairs / Alone | +| Do | Mob | +| Fr | Review / Pair Debug / Wissenstransfer | + +Das erlaubt *fokussiertes individuelles Arbeiten*, aber auch regelmäßige Syncs und gemeinsamen Code-Review mit Mob-Anteil. + +--- + +### 3. **Wissenstransfer durch „Mob Review“ oder „Mob Replay“** + +Wenn nicht alle ständig im Mob sind, kann man regelmäßig kurze Sessions einführen, z. B.: + +* 30min-Session: „Was wurde erreicht?“, mit Screensharing & Walkthrough. +* Jeder darf Fragen stellen, Ideen einwerfen. +* So bleibt das Wissen verteilt, auch wenn nur 2–3 aktiv gecodet haben. + +--- + +### 4. **Entlastung der Senior Leads (Coach statt Treiber)** + +Gerade bei größeren Teams besteht sonst Burnout-Gefahr. + +Empfehlung: + +* Fokus auf Coaching: Fragen stellen, Perspektiven eröffnen, Review geben – aber **nicht dauerhaft den Driver/Navigator machen**. +* Junioren moderieren lassen, auch wenn’s holprig wird. Wachstum passiert genau da. + +--- + +### 5. **Explicit Mob Agreements & Retros** + +Erfolgreiche Mobs leben von **klaren Erwartungen & Feedbackschleifen**: + +* Wie lange dauert eine Session? +* Wer ist Driver? Navigator? Observer? Wer wechselt wann? +* Wie kommunizieren wir Entscheidungen? + +→ Regelmäßige Miro-Retros oder kurze „Mob Health Checks“ (z. B. wöchentlich mit einem simplen Niko-Niko oder Stimmungsbarometer) helfen, frühzeitig Überlastung zu erkennen. + +--- + +## 🧭 Vergleichbare Erfahrungsberichte + +1. **Llewellyn Falco & Woody Zuill (Mob Programming Erfinder)**: + + * Empfehlen *dauerhaft kleine Mobs* mit max. 4–5 Personen. + * Betonung auf "Mob Programming ist kein Dogma", sondern "Just a tool when it makes sense". + +2. **Spotify**: + + * Hat Mob Programming erfolgreich in verteilten Teams eingesetzt, aber mit hoher Rotation und wechselnden Modi (Mob/Pair/Individuell). + * Setzen stark auf „Mob Coaching“ durch Chapter Leads statt dauerhaftes Treiben. + +3. **Basecamp / 37Signals**: + + * Kein klassisches Mob Programming, aber stark auf kleine Units mit klarem Fokus und regelmäßigen Check-ins. + * Betonung auf Deep Work und wenig Synchronisation – dafür aber bewusst geplante Sync-Zeiten. + +--- + +## 🧠 Empfehlung für euer Team (konkret) + +* 💬 **Retrospektive machen**: Was läuft gut? Was stresst? Wo braucht ihr Veränderung? +* 🔀 **Aufteilen in 2–3 Mobs mit Rotation** (z. B. alle 2 Wochen durchwechseln). +* 🧭 **Klare Erwartungen kommunizieren**: Wer darf wann auch allein arbeiten? Wie bleiben wir synchron? +* 🪴 **Rollendefinition anpassen**: Weniger Lead-Treiben, mehr Coaching und Selbstorganisation fördern. +* 📅 **Wöchentliche „Show & Tell“ Sessions** für Austausch und Teamgefühl. + +Wenn du willst, kann ich ein konkretes Vorschlags-Template für eine neue Teamstruktur oder ein leichtgewichtiges Sync-Format liefern. + + +## Konzept: Parallel Hybrid Mobbing + + +### 🔁 **Kernidee des Konzepts (Hybrid-Modell Mob + individuell)** + +#### 1. **Zwei Gruppen (A/B) arbeiten getrennt**, aber: + +* **gleicher Wochentakt** (Weekly Sync, Review, Retro sind gemeinsam), +* **ähnliche Gesamtverteilung von Mob vs. individueller Arbeit** (z. B. 2 halbe Tage Mob, 2 halbe Tage individuell). + +#### 2. **Asynchrone Reihenfolge**: + +* Die Gruppen **arbeiten zeitversetzt**, um: + + * Ermüdung durch gleichzeitiges Vollzeit-Mobbing zu vermeiden, + * gegenseitiges Code-Review oder Input zu ermöglichen (z. B. Mob A am Dienstag → Review durch Gruppe B am Mittwoch), + * Pairings gruppenübergreifend an Donnerstagen zu fördern. + +Das ist also **bewusst nicht symmetrisch im Tagesplan**, aber **symmetrisch im Gesamtpensum**. Diese Asymmetrie ist ein bewusstes Werkzeug, um **mentale Erholung, Rollenrotation und Kontextwechsel** zu fördern. + + +### Fazit + +> **Eine dynamische Balance aus Mob-Arbeit und individueller Arbeit**, +> **sinnvoll verteilt im Team, um Ermüdung zu vermeiden**, **Wissen zu teilen**, und **Feedback-Zyklen zu verbessern**. + +Wenn ihr aktuell eine Ermüdung durch Mob-only spürt, ist **zeitliche Asynchronität zwischen den Gruppen ein Hebel**, der oft hilft – muss aber nicht dauerhaft so bleiben. Ich kann euch auch gerne Varianten für 3er-Gruppen, Rollenrotationen oder Mob-Breakout-Strategien skizzieren. + + +```mermaid +graph TD + A["Montag: Weekly Sync"] --> B1["Mob Gruppe A: Task 1 starten"] + A --> B2["Mob Gruppe B: Task 2 starten"] + + B1 --> C1["Dienstag Vormittag: Mob-Session A"] + B2 --> C2["Dienstag Vormittag: individuelle Arbeit B"] + + C1 --> D1["Dienstag Nachmittag: individuelle Arbeit A"] + C2 --> D2["Dienstag Nachmittag: Mob-Session B"] + + D1 --> E1["Mittwoch Vormittag: Mob-Session A"] + D2 --> E2["Mittwoch Vormittag: individuelle Arbeit B"] + + E1 --> F1["Mittwoch Nachmittag: individuelle Arbeit A"] + E2 --> F2["Mittwoch Nachmittag: Mob-Session B"] + + F1 --> G["Donnerstag: Fokuszeit / freies Pairing"] + F2 --> G + + G --> H["Freitag: Mob Review"] + H --> I["Freitag: Team-Retro"] + I --> A + + subgraph "Rotation (alle 2 Wochen)" + R1["Mob-Gruppen neu mischen"] + end + + A --> R1 + R1 --> B1 + R1 --> B2 +``` + +--- + +## 🧩 **Strukturvorschlag: Mob/Individuell Hybrid (2-Wochen-Zyklus)** + +### 🧠 Grundprinzipien: + +* Kleine, rotierende Mobs (max. 3–4 Personen) +* Bewusste Balance: Deep Work + Sync +* Teamgefühl & Wissensaustausch durch klare Formate +* Fokus auf Selbstorganisation (weniger getrieben, mehr gestaltet) + +--- + +### 📅 **Beispiel-Woche (ab Woche 4)** + +| Tag | Vormittag | Nachmittag | +| ---------- | ------------------------------ | ---------------------- | +| Montag | **Weekly Sync (30min)** | Start Mob-Zyklus | +| Dienstag | Mob-Session Gruppe A | Individuell (Gruppe B) | +| Mittwoch | Mob-Session Gruppe B | Individuell (Gruppe A) | +| Donnerstag | Individuell | ggf. Pairing | +| Freitag | **Mob Review + Retro (60min)** | Offene Zeit / Catch-up | + +> 🧩 *Mob-Gruppen rotieren alle 2 Wochen*, sodass jeder mal mit jedem arbeitet und Wissen zirkuliert. + +--- + +## 🔁 **Formate im Detail** + +### 1. 🗓️ **Weekly Sync (Mo, 30 Min)** + +* Alle zusammen im Call. +* Ziel: Was wollen wir erreichen? Welche Aufgaben priorisieren wir? +* Einteilung: Wer ist diese Woche in welcher Mob-Gruppe? +* Kurzer Check-In zur Stimmung & Energie. + +--- + +### 2. 🧑‍🤝‍🧑 **Mob-Session (2–3x pro Woche, 90–120min)** + +* Feste Slots, jeweils mit 3–4 Leuten. +* Rollen wechseln regelmäßig: Driver, Navigator, Observer. +* Fokus: schwierige Tasks, neue Features, pair-learning. +* **Junior als Driver fördern**, Seniors eher als Navigators/Coaches. + +--- + +### 3. 👤 **Individuelles Arbeiten (nachmittags/Do)** + +* Fokuszeit für einzelne Tasks, Exploration, Refactoring, Dokumentation etc. +* Async-Kommunikation per Chat / Issues. +* Option: freiwilliges Pairing. + +--- + +### 4. 📽️ **Mob Review + Retro (Fr, 60 Min)** + +* Jedes Team zeigt kurz: „Was haben wir gebaut?“ (5–10 Minuten) +* Fragen, Diskussion, Feedback. +* Danach kurze Retro: Was lief gut? Was stressig? Was ändern? + +--- + +### 5. 🔄 **Mob Rotation (alle 2 Wochen)** + +* Nach zwei Wochen werden die Mobs neu gemischt. +* Ziel: Durchmischung, Silos vermeiden, soziales Lernen fördern. + +> Optional: Ein kleines „Mob Memory“ führen – wer war mit wem schon im Team, welche Themen hat man gemeinsam gebaut? + +--- + +## 📌 Rollen & Verantwortungen + +| Rolle | Aufgabe | +| --------------------- | ------------------------------------------------------------------------- | +| **Mob Facilitator** | Achtet auf Timebox, Pausen, Rollenwechsel (rollierend pro Session) | +| **Team Coach (Lead)** | Beobachtet, gibt Feedback, stellt Fragen – aber nicht dauerhaft Navigator | +| **Wissensboten** | Person aus jedem Mob, die in der Review ihre Gruppe vertritt | + +--- + +## 🧰 Tools & Hilfsmittel + +* **Mob Timer App**: z. B. [mob.sh](https://mob.sh) oder ein Timer in VS Code. +* **Notion / Miro / GitHub Projects**: Für Wissensspeicher und Visualisierung von Aufgaben. +* **Daily Async Updates (optional)**: 1 Nachricht/Tag im Slack/Teams: "Heute arbeite ich an X, brauche Y." + +--- + +Möchtest du eine passende Visualisierung (z. B. als Miro-Template oder Mermaid-Diagramm) oder einen Copy-Paste-fertigen Text für euer Confluence oder Onboarding-Dokument? + +```mermaid +graph TD + A["Montag: Weekly Sync"] --> B1["Mob Gruppe A: Task 1 starten"] + A --> B2["Mob Gruppe B: Task 2 starten"] + + B1 --> C1["Dienstag Vormittag: Mob A"] + B2 --> C2["Dienstag Vormittag: individuelle Arbeit B"] + + C1 --> O1["Observer B beobachtet Mob A"] + C2 --> D2["Dienstag Nachmittag: Mob B"] + D2 --> O2["Observer A beobachtet Mob B"] + + C1 --> D1["Dienstag Nachmittag: individuelle Arbeit A"] + + D1 --> E1["Mittwoch Vormittag: Mob A"] + D2 --> E2["Mittwoch Vormittag: individuelle Arbeit B"] + + E1 --> O3["Observer B beobachtet Mob A"] + E2 --> F2["Mittwoch Nachmittag: Mob B"] + F2 --> O4["Observer A beobachtet Mob B"] + + E1 --> F1["Mittwoch Nachmittag: individuelle Arbeit A"] + + F1 --> G["Donnerstag: Fokuszeit / freies Pairing"] + F2 --> G + + G --> H["Freitag: Mob Review"] + H --> I["Freitag: Team-Retro"] + I --> A + + subgraph "Rotation (alle 2 Wochen)" + R1["Mob-Gruppen neu mischen"] + end + + A --> R1 + R1 --> B1 + R1 --> B2 + + style O1 fill:#f0f0f0,stroke:#333,stroke-dasharray: 5 5 + style O2 fill:#f0f0f0,stroke:#333,stroke-dasharray: 5 5 + style O3 fill:#f0f0f0,stroke:#333,stroke-dasharray: 5 5 + style O4 fill:#f0f0f0,stroke:#333,stroke-dasharray: 5 5 +``` + +## Erweitertes Konzept + +Sehr gerne! Hier kommt eine **ausführliche Visualisierung und Beschreibung eines erweiterten Arbeitskonzepts mit mehreren Mobs**, inklusive der **Rollen Driver / Navigator / Observer**, sowie deren zeitlicher Einbettung über mehrere Tage. Dieses Modell ist für ein Team von **ca. 10 Personen** gedacht, das sich in **2 Gruppen (Mob A / Mob B)** aufteilt und **Fokus, Wissensaustausch und Nachhaltigkeit** ausbalancieren will. + +--- + +## 🧱 Strukturprinzipien des Konzepts + +1. **Zweiteilung in zwei Mobs (A & B)** zur Reduktion von Meeting-Fatigue +2. **Wechsel von synchronem und asynchronem Arbeiten** +3. **Explizite Rollenverteilung innerhalb der Mobs**: + + * `Driver`: schreibt Code + * `Navigator`: denkt strategisch, gibt Richtung + * `Observer`: beobachtet Metaebene +4. **Rollenrotation alle 15–30 Minuten** +5. **Feedback- & Sync-Loops:** + + * tägliches Micro-Feedback + * Wochen-Review & Retro + +--- + +## 🧭 Zeitlich-strukturelle Darstellung + +```mermaid +gantt + dateFormat HH:mm + axisFormat %H:%M + title Mob Programming Woche (Gruppen A & B + Rollen) + + section Montag + Weekly Sync :sync, 09:00, 00:30 + Setup Mob A :a1, 10:00, 01:30 + Setup Mob B :b1, 10:00, 01:30 + Individuell A :a2, 13:00, 02:00 + Individuell B :b2, 13:00, 02:00 + + section Dienstag + Mob A (D/N/O rollenweise) :a3, 09:00, 01:30 + Mob B (D/N/O rollenweise) :b3, 11:00, 01:30 + Fokuszeit (alle) :f1, 14:00, 02:00 + + section Mittwoch + Mob B (D/N/O rollenweise) :b4, 09:00, 01:30 + Mob A (D/N/O rollenweise) :a4, 11:00, 01:30 + Individuell A & B :ind, 14:00, 02:00 + + section Donnerstag + Observer Sync A/B :obs, 09:00, 00:45 + Pairing/Fokuszeit :f2, 10:00, 03:00 + + section Freitag + Mob Review :rev, 09:00, 00:45 + Retro (mit Observer-Inputs) :ret, 10:00, 01:00 + Optional: Team-Lunch :lunch, 12:00, 01:00 +``` + +--- + +## 🧑‍🤝‍🧑 Rollenverteilung im Mob + +### Beispiel: Mob A am Dienstag Vormittag (1,5h Session) + +| Time Slot | Driver | Navigator | Observer | +| ----------- | -------- | --------- | ---------------- | +| 09:00–09:30 | Junior A | Senior A | Junior B (Mob B) | +| 09:30–10:00 | Senior A | Junior A | Junior B (Mob B) | +| 10:00–10:30 | Junior B | Senior B | Junior A (Mob B) | + +> Rollen werden **rotierend** vergeben. Observer kommen *aus der anderen Gruppe*, um einen frischen Blick zu erhalten. + +--- + +## 🔄 Feedback-Zyklen + +### Täglich: + +* Nach jeder Mob-Session: 5 Minuten "Observer Insight" + + * Was ist aufgefallen? + * Gab es Kommunikationspausen, Rollenunklarheiten? + * Feedback, keine Bewertung + +### Donnerstag: + +* **Observer-Sync (45min)**: A & B Observer tauschen sich aus +* Sammlung von Mustern, Problemen, Positivem + +### Freitag: + +* **Mob-Review (Output)** +* **Team-Retro (mit strukturiertem Observer-Input)** + + * z. B. Karten an der Wand: *Codequalität*, *Kommunikation*, *Timeboxing*, *Einbindung*, ... + +--- + +## ✅ Vorteile + +| Ziel | Wie dieses Modell hilft | +| ------------------------ | -------------------------------------- | +| Burnout vermeiden | Fokuszeit + individuelle Phasen | +| Wissensaustausch fördern | Rollenrotation + regelmäßige Observer | +| Teamgefühl stärken | Gemeinsamer Wochenrhythmus + Retros | +| Autonomie & Struktur | Asynchrone Slots + klar getaktete Mobs | + +--- + +## 📌 Empfehlungen zur Umsetzung + +* Nutzt Timer-Tools wie [Mobster](https://mobti.me/) oder VS Code Timer Plugins +* Führt ein einfaches **Mob-Logbuch** (z. B. Google Doc oder Notion) +* Macht **Retros auch zur Format-Retro** („Wollen wir 2x 45min statt 1x 90min?“) +* Nutzt eine einfache Visualisierung der Rollen und Rotation (z. B. Whiteboard, digital oder physisch) + +--- + +Wenn du willst, kann ich dieses Modell auch als Markdown-Template, Confluence-Seite oder als ClickUp/Notion-Board strukturieren – sag einfach Bescheid. + + +Super! Hier kommt eine **vollständige Markdown-Dokumentation**, die du als internes Arbeitskonzept in eurem Repo, Wiki oder Knowledge Base verwenden kannst. Außerdem beschreibe ich im Anschluss, wie du dasselbe in **Notion** oder **ClickUp** umsetzen könntest, damit du dir ein Bild machen kannst. + +--- + +## ✅ Mob-Programming-Arbeitsmodell (2 Mobs, Rollen, Balance) + +### 📌 Übersicht + +Wir arbeiten mit zwei Mobs (A & B), einem Wochenrhythmus aus synchroner und individueller Arbeit, sowie mit rollierenden Rollen: + +* **Driver**: Implementiert den aktuellen Code +* **Navigator**: Gibt strategische Richtung +* **Observer**: Beobachtet Muster & Metaebene + +Rollen rotieren ca. alle **15–30 Minuten**. Observer können von außen oder aus dem jeweils anderen Mob kommen. + +--- + +### 🧭 Wöchentlicher Ablauf + +| Tag | Vormittag | Nachmittag | +| ---------- | ----------------------- | --------------------- | +| Montag | Weekly Sync, Setup Mobs | Individuelle Arbeit | +| Dienstag | Mob A & B (mit Rollen) | Fokuszeit (alle) | +| Mittwoch | Mob B & A (umgekehrt) | Individuelle Arbeit | +| Donnerstag | Observer Sync (A & B) | Pairing / Fokuszeit | +| Freitag | Mob-Review, Retro | Team-Lunch (optional) | + +--- + +### 🧑‍🤝‍🧑 Rollenplan (Beispiel: Mob A Dienstag) + +| Zeit | Driver | Navigator | Observer (aus Mob B) | +| ----------- | -------- | --------- | -------------------- | +| 09:00–09:30 | Junior A | Senior A | Junior B | +| 09:30–10:00 | Senior A | Junior A | Junior B | +| 10:00–10:30 | Junior B | Senior B | Junior A | + +--- + +### 🔄 Feedback & Synchronisation + +#### Täglich (Mini-Retro) + +* Direkt nach Mob-Session: 5 Minuten +* Observer: kurzes strukturiertes Feedback + +#### Donnerstag (Observer Sync) + +* 45 Minuten Austausch der Observer von Mob A & B +* Sammeln von: + + * Kommunikationsmustern + * Positivbeispielen + * möglichen Stolpersteinen + +#### Freitag (Review & Retro) + +* Gemeinsames Anschauen der Arbeitsergebnisse +* Retro mit Observer-Feedback +* Optional: Team-Lunch + +--- + +### 🔧 Tools & Praktiken + +* **Timer**: [Mobti.me](https://mobti.me), VS Code Mob-Timer Plugin +* **Logbuch**: Google Doc, Notion, Confluence, etc. +* **Kanban/Todo**: Notion / ClickUp Board (siehe unten) +* **Visualisierung**: Whiteboard / Figma / Miro zur Aufgabenübersicht + +--- + +### 📊 Kanban-Struktur für Notion oder ClickUp + +#### **Spalten im Board** + +``` +| Ideen / Backlog | In Mob A | In Mob B | Individuell | Review | Done | +``` + +#### **Kartenstruktur (pro Task)** + +* **Titel**: Klarer, handlungsorientierter Titel +* **Beschreibung**: Kontext, ggf. Links +* **Rolle** (Multiselect): Driver, Navigator, Observer +* **Team** (Select): Mob A / Mob B +* **Tag**: Montag, Dienstag, … +* **Status** (Board-Spalte) +* **Kommentare**: für tägliche Mini-Retros + +#### Beispiel-Karte: + +``` +**Titel**: „Login-Routing nach erfolgreichem Login optimieren“ +**Beschreibung**: +Aktuell erfolgt Weiterleitung nicht bei JWT-Token Refresh → prüfen & anpassen. +**Rolle**: Navigator, Driver +**Team**: Mob A +**Tag**: Dienstag +``` + +--- + +### 📁 Optional: Struktur für Projektordner/Repo + +```text +/docs/mob-model/ +├── README.md ← (dieses Dokument) +├── mob-rollen.md +├── retros/ +│ ├── 2025-05-16.md +│ ├── 2025-05-09.md +└── logbuch/ + ├── mob-a/ + └── mob-b/ +``` + +--- + +Wenn du willst, kann ich dir gerne ein **Notion Template** oder **ClickUp Export** vorbereiten, das du direkt importieren kannst. Möchtest du das? Und welches Tool nutzt ihr aktuell für eure Projektorganisation (z. B. GitHub Projects, Jira, Notion, ClickUp, ...)? + +Klasse, danke für den Kontext! Dann bauen wir alles so auf, dass es sich optimal in **Forgejo** (also Git + Kanban + Tickets/Milestones) integrieren lässt. Ich erkläre dir trotzdem kurz, was **Notion** und **ClickUp** sind, damit du es einordnen kannst – und danach bekommst du von mir ein angepasstes Setup, das direkt auf **Forgejo** zugeschnitten ist. + +--- + +## 🧠 Was ist Notion? + +**Notion** ist ein All-in-One-Workspace für Teams, mit dem du: + +* Dokumentation (wie ein Wiki) +* Projektpläne +* Kanban-Boards +* Aufgabenlisten +* Kalender +* und sogar einfache Datenbanken + +in einer sehr **visuell ansprechenden** Oberfläche erstellen kannst. Es ist wie eine Mischung aus Google Docs, Trello und Confluence – aber stark modularisiert. + +🔗 Beispiel: +Du könntest dort euer Mob-Setup als Tabelle pflegen, mit Rollenrotation, Notizen, Aufgaben und Beobachtungen – alles an einem Ort. + +--- + +## ⚙️ Was ist ClickUp? + +**ClickUp** ist ein Projektmanagement-Tool wie Jira oder Trello, aber mit sehr vielen Anpassungsmöglichkeiten: + +* Kanban + Gantt + Kalender + Mindmap +* Aufgaben mit Rollen, Zuständigkeiten, Zeittracking +* Workspaces und Docs +* Automation (z. B. „wenn Task erledigt, dann …“) + +👉 Es ist ein mächtiges Tool für **Teams mit vielen parallelen Aufgaben**, braucht aber Einarbeitung. + +--- + +## 🧩 Vergleich zu Forgejo + +| Tool | Hauptfunktion | Vergleichbar in Forgejo | +| ------- | ------------------------------ | ---------------------------- | +| Notion | Dokumentation, Boards, Notizen | Wiki + Markdown-Files | +| ClickUp | Aufgaben, Planung, Rollen | Kanban + Milestones + Labels | +| Forgejo | Git + Issues + Kanban | ✔ Euer Setup passt perfekt | + +--- + +## ✅ Empfehlung für euer Setup (Forgejo-basiert) + +Hier ist, wie ihr das vorgestellte Mob-Konzept mit **Forgejo** umsetzen könnt: + +### 📁 Git-Struktur im Repo + +```text +/docs/mob-programming/ +├── README.md ← Gesamtkonzept (siehe oben) +├── rollenrotation-2025.md ← Tabelle mit täglichem Ablauf +├── retros/ +│ └── 2025-05-16.md ← Kurze Lessons Learned je Woche +├── feedback/ +│ └── observer-insights.md ← Zusammenfassung der Beobachtungen +``` + +### 🏷️ Labels für Tickets (Issues) + +* `mob:A`, `mob:B` +* `rolle:driver`, `rolle:navigator`, `rolle:observer` +* `status:ready`, `status:in mob`, `status:in review`, `status:done` +* `tag:montag`, `tag:dienstag`, ... + +### 🗂️ Boards + +**Beispiel: Board „Mob A“** + +| Idee / Backlog | Nächste Session | In Arbeit | Review | Done | +| -------------- | --------------- | --------- | ------ | ---- | + +* Nutzt hier Tickets mit Rollen- und Zeitangabe in der Beschreibung oder den Labels. + +### 📅 Milestones + +* `Woche 20/2025 – Mob Rotation` +* `Sprint: UI Login` +* `Sprint: Refactor Auth` + +--- + +Wenn du möchtest, kann ich dir: + +* ein **README.md Grundgerüst** erzeugen (direkt zum Einfügen) +* eine **Beispiel-Ticketstruktur als YAML oder JSON** geben (zum Import in Forgejo oder zur Orientierung) +* ein **SVG-Diagramm** für Miro/Excalidraw erzeugen (auf Basis eures Wochenplans) + +Sag einfach, was du brauchst 😊 + + +Das freut mich sehr – **ein leichtgewichtiges, aber wirkungsvolles Logbuch-System** ist perfekt, um Wissen zu sichern, Synchronisation zu verbessern und Eigenverantwortung im Team zu stärken – **ohne Overhead**. +Hier kommt eine strukturierte **Zusammenfassung**, speziell für euer Setup mit **Forgejo**. + +--- + +## 🧭 Ziel des Logbuchs + +* 💡 **Wissenssicherung** trotz Rotation (Mob ⇄ individuell) +* 🔄 **Synchronisation** zwischen Strängen (A/B) und Tagen +* 👁️ **Beobachtungen nutzbar machen**, ohne langwierige Meetings +* ⏱️ **Minimaler Aufwand**, klar verteilt + +--- + +## 🧑‍🤝‍🧑 Rollen & Logbuch-Verantwortung + +| Rolle | Wann wird geloggt? | Wo? | Inhalt (Beispiele) | +| --------------------------- | --------------------------------------- | --------------------------------------------- | ---------------------------------------------------------- | +| 🧭 **Navigator** | Während Mob-Sessions (live) | Im Issue-Kommentar oder `mob-A/2025-05-19.md` | Kurzes Tagesprotokoll: *Was war Ziel? Was wurde gemacht?* | +| 👨‍💻 **Driver** | Optional, ergänzend (nur bei Problemen) | Im Kommentar oder per Commit-Message | *Technische Herausforderungen, „Tricks“, Bugs* | +| 👀 **Observer** | Nach Session (Dienstag/Mittwoch) | Datei `feedback/observer-2025-05-21.md` | *Beobachtungen zur Dynamik, Verbesserungsvorschläge* | +| 📋 **Teamlead** | Freitags in Retro | Datei `retros/2025-05-23.md` | *Knappe Lessons Learned, Entscheidungen* | +| 🧑‍🔧 **Individual Worker** | Nach Abschluss Task oder Review | Direkt im Ticket oder Commit | *„Ich habe X erledigt, Y gelernt“* oder „⚠️ Achtung bei Z“ | + +--- + +## 🗂️ Struktur im Repo (Markdown-Dateien) + +```plaintext +/docs/mob-programming/ +├── README.md +├── mob-A/ +│ ├── 2025-05-19.md ← Navigator-Log Montag +│ ├── 2025-05-20.md ← Navigator-Log Dienstag +│ └── ... +├── mob-B/ +│ ├── 2025-05-19.md +│ └── ... +├── feedback/ +│ └── observer-2025-05-21.md +├── retros/ +│ └── 2025-05-23.md +``` + +--- + +## 🧾 Beispiel für ein Navigator-Log (`mob-A/2025-05-20.md`) + +```markdown +# Mob A – Dienstag, 20.05.2025 + +**Ziel:** Refactor Auth-Handler & testen edge cases + +**Teilnehmer:** Alex (Driver), Robin (Navigator), Kim (Observer) + +**Erreicht:** +- Code umgestellt auf `newAuthHandler` +- Edge Case mit expired token abgedeckt +- Test-Fall `auth.spec.ts` ergänzt + +**Offen:** +- Token-Refresh behandeln (Ticket #123) +- Review durch Team B vor Merge + +**Bemerkung:** Driver hat interessante Lösung für Middleware (siehe Commit f0e1d2) + +``` + +--- + +## 🧠 Minimal-Checkliste für jeden Tag + +| Rolle | Muss ich heute loggen? | Wo? | +| ----------- | ---------------------- | ------------------------------- | +| Navigator | ✅ Ja | Markdown-Datei im Tagesordner | +| Observer | ✅ Ja (Di/Mi) | feedback/observer-\*.md | +| Driver | 🟡 Optional | Commit-Message oder Kommentar | +| Teamlead | ✅ Freitag | retros/\*.md | +| Solo-Worker | ✅ Bei Abschluss | Kommentar im Ticket oder Commit | + +--- + +## 💡 Optional: Forgejo Automatisierungsidee + +Wenn ihr mit Git-Hooks oder CI rumspielen wollt: + +* Label `log:missing` auf Tickets, wenn kein Log nach z. B. 24h +* Release-Milestone „Sprint Logbook 2025-W20“ als Sammelstelle + +--- + +Wenn du möchtest, kann ich dir ein kleines Bash-Script machen, das eine neue Log-Datei automatisch erstellt (z. B. `./new-log.sh mob-A 2025-05-20`) mit vorbefülltem Template. Sag einfach Bescheid. + +Perfekt! Hier ist ein kleines Bash-Skript, das dir automatisch ein Tages-Logbuch im gewünschten Format anlegt – **inkl. Datum, Mob-Gruppe und Template**: + +--- + +### 📄 `new-log.sh` + +```bash +#!/usr/bin/env bash + +# Usage: ./new-log.sh +# Example: ./new-log.sh mob-A 2025-05-20 + +set -e + +MOB_GROUP="$1" +DATE="$2" +BASE_DIR="./docs/mob-programming" +TARGET_DIR="$BASE_DIR/$MOB_GROUP" +FILE="$TARGET_DIR/$DATE.md" + +if [[ -z "$MOB_GROUP" || -z "$DATE" ]]; then + echo "Usage: $0 " + exit 1 +fi + +mkdir -p "$TARGET_DIR" + +if [[ -f "$FILE" ]]; then + echo "⚠️ File already exists: $FILE" + exit 1 +fi + +cat < "$FILE" +# ${MOB_GROUP^} – $(date -d "$DATE" '+%A, %d.%m.%Y') + +**Ziel:** _Was war heute das Ziel der Session?_ + +**Teilnehmer:** +- Driver: _Name_ +- Navigator: _Name_ +- Observer: _Name_ (optional) + +**Erreicht:** +- Punkt 1 +- Punkt 2 + +**Offen:** +- Punkt A +- Punkt B + +**Bemerkung:** +- Commit-Referenz oder besondere Erkenntnisse +EOF + +echo "✅ Logfile erstellt: $FILE" +``` + +--- + +### ✅ Vorteile + +* Immer gleiches Format +* Kein Nachdenken mehr über Ordnerstruktur +* Schnell per `bash` oder `make` ausführbar + +--- + +### 🔧 Optional: ausführbar machen + +```bash +chmod +x new-log.sh +``` + +Und dann z. B.: + +```bash +./new-log.sh mob-B 2025-05-21 +``` + +--- + +Wenn ihr mögt, können wir auch eine Variante für Observer-Feedback oder die Retro-Logs bauen. Sag einfach Bescheid! diff --git a/docs/technical-documentation/solution/scenarios/_index.md b/docs/technical-documentation/solution/scenarios/_index.md deleted file mode 100644 index a7839e3..0000000 --- a/docs/technical-documentation/solution/scenarios/_index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Scenarios -weight: 1 -description: Usage scenarios and system architecture ---- - diff --git a/docs/user-documentation/_assets/vm-deployment-architecture.png b/docs/user-documentation/_assets/vm-deployment-architecture.png new file mode 100644 index 0000000..9d0a7aa Binary files /dev/null and b/docs/user-documentation/_assets/vm-deployment-architecture.png differ diff --git a/docs/user-documentation/_assets/vm-pods.png b/docs/user-documentation/_assets/vm-pods.png new file mode 100644 index 0000000..2180988 Binary files /dev/null and b/docs/user-documentation/_assets/vm-pods.png differ diff --git a/docs/user-documentation/victoria-k8s-stack.md b/docs/user-documentation/victoria-k8s-stack.md new file mode 100644 index 0000000..8491714 --- /dev/null +++ b/docs/user-documentation/victoria-k8s-stack.md @@ -0,0 +1,38 @@ +# Victoria k8s Stack + +We use [Victoria Metrics k8s stack](https://docs.victoriametrics.com/helm/victoriametrics-k8s-stack/) and [Vector](https://docs.victoriametrics.com/helm/victorialogs-single/#sending-logs-to-external-victorialogs). + +## Why do we use it? + +* compare it with competitors like ELK, Loki, Prometheus +* it delivers logging and metrics + +* in ELK we replaced the 'E'(ElasticSearch) by VictoriaLogs and VictoriaMetrics, L(Logstash) is replaced by Vector, 'K'(Kibana) by Grafana +* Loki (also the 'E'): has 5 components (like distrubutor, querier, querier-frontend....), VM +* ELK is hard to manage +* Durability: We need to store logs for years, there should be a 'shrink' process +* Challenge: Scaling, there are huge amounts of data (like TB/d) +* we urde for simplicity, cost, scalability + + +## Big Picture + +### Architecture + +The high level deployment picture of VictoriaMetrics k8 s Stack looks like this: + +![alt text](./_assets/vm-deployment-architecture.png) + +### Deployment + +In detail, after having deployed it, we see the following components: + +![alt text](./_assets/vm-pods.png) + +1. vector-vector: the log shipper to victorialogs, twice because it is a daemon-set and thus deploed on each node in the cluster +2. prometheus-node-exporter: a metrics generator and metrics endpoint of node metrics, also deployed on each node +3. vmagent: the central agent scraping data from the metrics collectors +4. vmalert: not used yet +5. vmsingle-victoria-metrics: the metrics server, getting the data from vmagent +6. vlogs: the logging server, getting the data from vector +7. victoria-metrics-operator: the operator providing and managing the custom resources we deploy diff --git a/docs/technical-documentation/project/conceptual-onboarding/7_conclusio/README.md b/likec4/README.md similarity index 52% rename from docs/technical-documentation/project/conceptual-onboarding/7_conclusio/README.md rename to likec4/README.md index 769478d..cc88733 100644 --- a/docs/technical-documentation/project/conceptual-onboarding/7_conclusio/README.md +++ b/likec4/README.md @@ -1,3 +1,9 @@ +# LikeC4 architecture documentation + +Run `npx likec4 start` to start dev server + +## with docker and how to render/export images + // how to create/export c4 images: // see also https://likec4.dev/tooling/cli/ @@ -15,4 +21,9 @@ npx playwright install npm install likec4 // render -node@e20899c8046f:/app/content/en/docs/project/onboarding$ ./node_modules/.bin/likec4 export png -o ./images . \ No newline at end of file +node@e20899c8046f:/app/content/en/docs/project/onboarding$ ./node_modules/.bin/likec4 export png -o ./images . + +## trouble shooting + +when refactoring you might need to restart the languange server, just that it updates its internal model representation +In VSCode it is: `ctrl+Shift+P' + 'LikeC4: restart languange server` \ No newline at end of file diff --git a/likec4/deployment/kind/edp.c4 b/likec4/deployment/kind/edp.c4 new file mode 100644 index 0000000..e677b53 --- /dev/null +++ b/likec4/deployment/kind/edp.c4 @@ -0,0 +1,86 @@ +// Deployment model +deployment { + + environment local 'Local kind-cluster' { + description 'Local kind-cluster environment for EDP, typically run by edpbuilder' + 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 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 + } + } +} + diff --git a/likec4/deployment/otc/edp.c4 b/likec4/deployment/otc/edp.c4 new file mode 100644 index 0000000..c5b51b5 --- /dev/null +++ b/likec4/deployment/otc/edp.c4 @@ -0,0 +1,49 @@ +// Deployment model +deployment { + + cloud otc-edp-per-tenant 'OTC EDP per tenant cluster' { + description 'OTC environment for EDP. EDP is the environment a customer gets from us. + + This is kubernetes clusters and other infrastructure like nodes and vms, and platform services. All is set up by IaC-pipelines in the Foundry. + ' + technology 'OTC' + + kubernetes cce 'OTC CCE' { + description 'OTC Container Cluster Engine' + icon tech:kubernetes + technology 'Kubernetes' + + cluster edp 'EDP' { + instanceOf edp.argoCD + instanceOf forgejoRunner + instanceOf edp.forgejo { + -> cloudServices.elasticsearch + -> cloudServices.objectstorage + -> cloudServices.postgres + -> cloudServices.redis + } + instanceOf edp.externalSecrets + instanceOf edp.ingressNginx + } + } + + paas cloudServices 'EDP Cloud Services' { + description 'EDP Cloud Services' + technology 'Cloud Services' + + instanceOf postgres + instanceOf redis + instanceOf objectstorage + instanceOf elasticsearch + } + + computeressource forgejoRunnerInfrastructure 'EDP ForgejoRunner infrastructure' { + description 'Infrastructure for Forgejo runners like pods, vms, lxds, etc' + instanceOf forgejoRunner { + -> cce.edp.forgejo 'registers' + } + } + } +} + + \ No newline at end of file diff --git a/likec4/deployment/otc/foundry.c4 b/likec4/deployment/otc/foundry.c4 new file mode 100644 index 0000000..dcd1197 --- /dev/null +++ b/likec4/deployment/otc/foundry.c4 @@ -0,0 +1,74 @@ +// Deployment model +deployment { + + cloud otc-edpFoundry 'OTC EDP Foundry Central Service clusters' { + description ' + OTC environments for the central EDP Foundry services. This is kubernetes clusters and other infrastructure like nodes and vms, and optionally platform services. All is set up by IaC terraform and edpbuilder. + + A tenant is a folder in Foundry-Config-Forgejo. On merge triggers reconciliation to EDP. + Optionally we will have a WebUI/API/CLI + ' + technology 'OTC' + + kubernetes cce 'OTC CCE' { + description 'OTC Container Cluster Engine' + icon tech:kubernetes + technology 'Kubernetes' + + cluster internalServices 'EDP Foundry Internal Services' { + instanceOf edp.argoCD + instanceOf edp.forgejo { + -> workflowSetupEDPInfrastructure.forgejoRunner 'invokes' + -> workflowSetupArgoCDInfrastructure.forgejoRunner 'invokes' + } + instanceOf edp.externalSecrets + instanceOf edp.openbao + instanceOf edp.ingressNginx + } + + cluster centralObservability 'EDP Foundry Central Observability' { + instanceOf edp.grafana + instanceOf edp.prometheus + instanceOf edp.loki + } + } + computeressource workflowSetupEDPInfrastructure 'EDP infrastructure Workflow' { + description 'EDP infrastructure Workflow' + + instanceOf forgejoRunner { + -> forgejoRunnerWorker 'runs' + } + instanceOf forgejoRunnerWorker { + -> edpworkflow 'executes' + } + instanceOf edpworkflow { + -> otc-edp-per-tenant.cce.edp 'deploys edp to otc.cce' + -> otc-edp-per-tenant.cloudServices 'deploys edp to otc.paas' + + } + } + + computeressource workflowSetupArgoCDInfrastructure 'EDP ArgoCD Workflow' { + description 'EDP Setup ArgoCD Workflow' + instanceOf forgejoRunner { + -> forgejoRunnerWorker 'runs' + } + instanceOf forgejoRunnerWorker { + -> edpworkflow 'executes' + } + instanceOf edpworkflow { + -> otc-edp-per-tenant.cce.argoCD + + } + } + + computeressource forgejoRunnerInfrastructure 'EDP ForgejoRunner infrastructure' { + description 'Infrastructure for Forgejo runners like pods, vms, lxds, etc' + instanceOf forgejoRunner { + -> cce.internalServices.forgejo 'registers' + } + } + + } +} + 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-edpbuilder.c4 b/likec4/models/code/workflow-edpbuilder.c4 new file mode 100644 index 0000000..1610d72 --- /dev/null +++ b/likec4/models/code/workflow-edpbuilder.c4 @@ -0,0 +1,103 @@ +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 + } +} diff --git a/likec4/models/code/workflow-setup-edp-argocd.c4 b/likec4/models/code/workflow-setup-edp-argocd.c4 new file mode 100644 index 0000000..b47b9f6 --- /dev/null +++ b/likec4/models/code/workflow-setup-edp-argocd.c4 @@ -0,0 +1,6 @@ +model { + workflow argocdworkflow "EDP ArgoCD Setup Workflow" { + + } +} + diff --git a/likec4/models/code/workflow-setup-edp-infrastructure.c4 b/likec4/models/code/workflow-setup-edp-infrastructure.c4 new file mode 100644 index 0000000..456dfa4 --- /dev/null +++ b/likec4/models/code/workflow-setup-edp-infrastructure.c4 @@ -0,0 +1,7 @@ +model { + workflow edpworkflow "EDP Infrastructure Setup Workflow" { + // step createS3bucket "Create s3 bucket for state" {} + // step setupRedis "Setup Redis" {} + } +} + 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/forgejoRunner.c4 b/likec4/models/components/forgejoRunner.c4 new file mode 100644 index 0000000..2a70d49 --- /dev/null +++ b/likec4/models/components/forgejoRunner.c4 @@ -0,0 +1,6 @@ +model { + component forgejoRunner 'Forgejo Runner' { + description 'A runner is a service that runs jobs triggered by Forgejo. A runner can have different technical implementations like a container or a VM.' + -> edp.forgejoActions 'register' + } +} \ No newline at end of file diff --git a/likec4/models/components/forgejoRunnerWorker.c4 b/likec4/models/components/forgejoRunnerWorker.c4 new file mode 100644 index 0000000..4397bd1 --- /dev/null +++ b/likec4/models/components/forgejoRunnerWorker.c4 @@ -0,0 +1,6 @@ +model { + component forgejoRunnerWorker 'Forgejo Runner Worker' { + description 'A worker is a service that runs a job invoked by a runner. A worker typically is a container.' + + } +} \ No newline at end of file diff --git a/likec4/models/components/promtail.c4 b/likec4/models/components/promtail.c4 new file mode 100644 index 0000000..85b8e5e --- /dev/null +++ b/likec4/models/components/promtail.c4 @@ -0,0 +1,6 @@ +model { + component promtail 'Promtail' { + description 'Log shipper agent for Loki' + + } +} \ 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/elasticsearch.c4 b/likec4/models/containers/elasticsearch.c4 new file mode 100644 index 0000000..c50a766 --- /dev/null +++ b/likec4/models/containers/elasticsearch.c4 @@ -0,0 +1,13 @@ +model { + + container elasticsearch 'Elasticsearch' { + description ' + Elasticsearch is a distributed, RESTful search and analytics engine capable of + addressing a growing number of use cases. It centrally stores your data so you can + discover the expected and uncover the unexpected. + ' + icon tech:elasticsearch + technology 'Elasticsearch' + } + +} \ 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..fcaeacd --- /dev/null +++ b/likec4/models/containers/forgejo.c4 @@ -0,0 +1,42 @@ +model { + + extend edp { + container forgejo 'Forgejo' { + description ' + Fully managed DevOps Platform + 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 + } + + } + + component forgejoActions 'Forgejo Actions' { + description 'Continuous Integration like Github Actions' + technology 'Golang' + icon tech:go + -> forgejoRunner 'runs workflows' + } + + 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..df88bb9 --- /dev/null +++ b/likec4/models/containers/grafana.c4 @@ -0,0 +1,11 @@ +model { + + extend edp { + container grafana 'Grafana' { + description 'Data visualization and monitoring' + icon tech:grafana + -> prometheus 'get metrics and alerts' + -> loki 'get logs' + } + } +} \ 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/loki.c4 b/likec4/models/containers/loki.c4 new file mode 100644 index 0000000..f49070a --- /dev/null +++ b/likec4/models/containers/loki.c4 @@ -0,0 +1,8 @@ +model { + + extend edp { + container loki 'Loki' { + description 'Log aggregation system' + } + } +} \ 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/objectstorage.c4 b/likec4/models/containers/objectstorage.c4 new file mode 100644 index 0000000..d1a9550 --- /dev/null +++ b/likec4/models/containers/objectstorage.c4 @@ -0,0 +1,8 @@ +model { + + container objectstorage 's3 Object Storage' { + description 's3 Object Storage' + technology 'S3 Object Storage' + } + +} \ 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/postgres.c4 b/likec4/models/containers/postgres.c4 new file mode 100644 index 0000000..a77cc73 --- /dev/null +++ b/likec4/models/containers/postgres.c4 @@ -0,0 +1,13 @@ +model { + + container postgres 'PostgreSQL' { + description ' + PostgreSQL is a powerful, open source object-relational database system. + It has more than 15 years of active development and a proven architecture + that has earned it a strong reputation for reliability, data integrity, + and correctness.' + icon tech:postgresql + technology 'PostgreSQL' + } + +} \ No newline at end of file diff --git a/likec4/models/containers/prometheus.c4 b/likec4/models/containers/prometheus.c4 new file mode 100644 index 0000000..5da49e8 --- /dev/null +++ b/likec4/models/containers/prometheus.c4 @@ -0,0 +1,9 @@ +model { + + extend edp { + container prometheus 'Prometheus' { + description 'Monitoring and alerting toolkit' + icon tech:prometheus + } + } +} \ No newline at end of file diff --git a/likec4/models/containers/redis.c4 b/likec4/models/containers/redis.c4 new file mode 100644 index 0000000..4173b72 --- /dev/null +++ b/likec4/models/containers/redis.c4 @@ -0,0 +1,9 @@ +model { + + container redis 'Redis' { + description 'Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker.' + icon tech:redis + technology 'Redis' + } + +} \ 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..2453ca1 --- /dev/null +++ b/likec4/models/context/edfoundry.c4 @@ -0,0 +1,10 @@ +model { + edf = system 'EDF' { + description 'EDP Foundry is a platform for building and deploying EDPs tenantwise.' + 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/spec.c4 b/likec4/models/spec.c4 new file mode 100644 index 0000000..c00ac40 --- /dev/null +++ b/likec4/models/spec.c4 @@ -0,0 +1,35 @@ +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 cloud + deploymentNode environment + deploymentNode computeressource + deploymentNode paas + deploymentNode kubernetes + deploymentNode cluster + deploymentNode namespace + + tag internal +} \ No newline at end of file diff --git a/likec4/views/deployment/kind/kind.c4 b/likec4/views/deployment/kind/kind.c4 new file mode 100644 index 0000000..a6d12f3 --- /dev/null +++ b/likec4/views/deployment/kind/kind.c4 @@ -0,0 +1,16 @@ +views { + deployment view index { + title 'Local Kind Deployment' + + include + *, + local.**, + local.monitoring.*, + local.openbao.*, + local.externalSecrets.*, + local.crossplane.*, + local.spark.*, + local.argocd.* + } +} + diff --git a/likec4/views/deployment/otc/edp.c4 b/likec4/views/deployment/otc/edp.c4 new file mode 100644 index 0000000..b5d9d0b --- /dev/null +++ b/likec4/views/deployment/otc/edp.c4 @@ -0,0 +1,24 @@ +views { + deployment view edp-per-tenant { + title 'EDP per tenant' + + include + otc-edp-per-tenant, + otc-edp-per-tenant.*, + otc-edp-per-tenant.cce, + otc-edp-per-tenant.cce.*, + otc-edp-per-tenant.cce.**, + otc-edp-per-tenant.cce.externalSecrets, + otc-edp-per-tenant.forgejoRunnerInfrastructure, + otc-edp-per-tenant.forgejoRunnerInfrastructure.*, + otc-edp-per-tenant.cloudServices, + otc-edp-per-tenant.cloudServices.* + style otc-edp-per-tenant { + color slate + } + style otc-edp-per-tenant.cce { + color red + } + } +} + diff --git a/likec4/views/deployment/otc/foundry-and-edp.c4 b/likec4/views/deployment/otc/foundry-and-edp.c4 new file mode 100644 index 0000000..ee0794d --- /dev/null +++ b/likec4/views/deployment/otc/foundry-and-edp.c4 @@ -0,0 +1,53 @@ +views { + + deployment view forgejo-as-a-service { + title 'Forgejo as a Service' + + include + + otc-edpFoundry.*, + otc-edpFoundry.internalServices, + otc-edpFoundry.internalServices.*, + otc-edpFoundry.centralObservability, + otc-edpFoundry.centralObservability.*, + otc-edpFoundry.workflowSetupEDPInfrastructure, + otc-edpFoundry.workflowSetupEDPInfrastructure.*, + otc-edpFoundry.workflowSetupArgoCDInfrastructure, + otc-edpFoundry.workflowSetupArgoCDInfrastructure.*, + otc-edpFoundry.forgejoRunnerInfrastructure, + otc-edpFoundry.forgejoRunnerInfrastructure.*, + + otc-edp-per-tenant, + otc-edp-per-tenant.*, + otc-edp-per-tenant.cce, + otc-edp-per-tenant.cce.*, + otc-edp-per-tenant.cce.**, + otc-edp-per-tenant.cce.externalSecrets, + otc-edp-per-tenant.forgejoRunnerInfrastructure, + otc-edp-per-tenant.forgejoRunnerInfrastructure.*, + otc-edp-per-tenant.cloudServices, + otc-edp-per-tenant.cloudServices.* + style otc-edp-per-tenant { + color slate + } + style otc-edpFoundry { + color slate + } + style otc-edpFoundry.workflowSetupEDPInfrastructure { + color amber + } + style otc-edpFoundry.workflowSetupArgoCDInfrastructure { + color amber + } + style otc-edpFoundry.forgejoRunnerInfrastructure { + color green + } + style otc-edp-per-tenant.cce { + color red + } + style otc-edpFoundry.cce { + color red + } + } +} + diff --git a/likec4/views/deployment/otc/foundry.c4 b/likec4/views/deployment/otc/foundry.c4 new file mode 100644 index 0000000..b07546c --- /dev/null +++ b/likec4/views/deployment/otc/foundry.c4 @@ -0,0 +1,37 @@ +views { + deployment view edp-foundry-central-service { + title 'EDP Foundry Central Service' + + include + otc-edpFoundry, + otc-edpFoundry.*, + otc-edpFoundry.internalServices, + otc-edpFoundry.internalServices.*, + otc-edpFoundry.centralObservability, + otc-edpFoundry.centralObservability.*, + otc-edpFoundry.workflowSetupEDPInfrastructure, + otc-edpFoundry.workflowSetupEDPInfrastructure.*, + otc-edpFoundry.workflowSetupArgoCDInfrastructure, + otc-edpFoundry.workflowSetupArgoCDInfrastructure.*, + otc-edpFoundry.workflowSetupArgoCDInfrastructure.*, + otc-edpFoundry.forgejoRunnerInfrastructure, + otc-edpFoundry.forgejoRunnerInfrastructure.* + + style otc-edpFoundry.forgejoRunnerInfrastructure { + color green + } + style otc-edpFoundry.workflowSetupEDPInfrastructure { + color amber + } + style otc-edpFoundry.workflowSetupArgoCDInfrastructure { + color amber + } + style otc-edpFoundry { + color slate + } + style otc-edpFoundry.cce { + color red + } + } +} + diff --git a/likec4/views/dynamic/cicd/gitops-inner-outer-loop.c4 b/likec4/views/dynamic/cicd/gitops-inner-outer-loop.c4 new file mode 100644 index 0000000..d6f60f2 --- /dev/null +++ b/likec4/views/dynamic/cicd/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 -> forgejoRunner 'on push' + + forgejoRunner -> edp.imageregistry 'pushes new image' + 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/likec4/views/edp/edfbuilder.c4 b/likec4/views/edp/edfbuilder.c4 new file mode 100644 index 0000000..a74cb32 --- /dev/null +++ b/likec4/views/edp/edfbuilder.c4 @@ -0,0 +1,8 @@ + +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/views/edp/edp-as-idp.c4 b/likec4/views/edp/edp-as-idp.c4 new file mode 100644 index 0000000..684368d --- /dev/null +++ b/likec4/views/edp/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/edp-as-orchestrator.c4 b/likec4/views/edp/edp-as-orchestrator.c4 new file mode 100644 index 0000000..b149d38 --- /dev/null +++ b/likec4/views/edp/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/edp.c4 b/likec4/views/edp/edp.c4 new file mode 100644 index 0000000..490e553 --- /dev/null +++ b/likec4/views/edp/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/high-level-concept/application-transition.c4 b/likec4/views/high-level-concept/application-transition.c4 new file mode 100644 index 0000000..cf86039 --- /dev/null +++ b/likec4/views/high-level-concept/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/high-level-concept/platform-context/developer-landscape-with-foundry.c4 b/likec4/views/high-level-concept/platform-context/developer-landscape-with-foundry.c4 new file mode 100644 index 0000000..606c91c --- /dev/null +++ b/likec4/views/high-level-concept/platform-context/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/high-level-concept/platform-context/developer-landscape.c4 b/likec4/views/high-level-concept/platform-context/developer-landscape.c4 new file mode 100644 index 0000000..d88a9cb --- /dev/null +++ b/likec4/views/high-level-concept/platform-context/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/live-preview-integration/README-backstage-local.md b/live-preview-integration/README-backstage-local.md index 9d19c71..7ef3ffb 100644 --- a/live-preview-integration/README-backstage-local.md +++ b/live-preview-integration/README-backstage-local.md @@ -57,3 +57,19 @@ rm -rf tmp devbox init devbox add yarn nodejs ``` + +## Troubleshooting + +### When npm package download hangs + +```bash +# install lcocally +npm install @techdocs/cli +node_modules/@techdocs/cli/bin/techdocs-cli serve +``` + +### verbosity level + +```bash + npx --loglevel silly techdocs-cli serve -v + ``` \ No newline at end of file diff --git a/mkdocs.yaml b/mkdocs.yaml index c2061ee..7a6e510 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -5,3 +5,4 @@ site_description: 'EDP documentation' plugins: - techdocs-core + - awesome-pages \ 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