{"id":28646732,"url":"https://github.com/harisekhon/diagrams-as-code","last_synced_at":"2025-06-13T02:06:48.436Z","repository":{"id":160799450,"uuid":"628088380","full_name":"HariSekhon/Diagrams-as-Code","owner":"HariSekhon","description":"Cloud \u0026 DevOps Architecture Diagrams-as-Code in Python, D2 and MermaidJS languages","archived":false,"fork":false,"pushed_at":"2025-05-05T01:10:24.000Z","size":28799,"stargazers_count":216,"open_issues_count":0,"forks_count":49,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-05-05T02:23:16.994Z","etag":null,"topics":["analytics","api","api-gateway","architecture","aws","d2","devops","diagrams","diagrams-as-code","gcp","high-availability","k8s","kong","kubernetes","load-balancing","mermaidjs","open-source","python","python3","traefik"],"latest_commit_sha":null,"homepage":"https://www.linkedin.com/in/HariSekhon","language":"D2","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/HariSekhon.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-04-14T22:15:39.000Z","updated_at":"2025-05-05T01:10:28.000Z","dependencies_parsed_at":"2023-09-25T04:23:22.117Z","dependency_job_id":"53ebfba0-6e02-45c9-9fad-4bddb1251c87","html_url":"https://github.com/HariSekhon/Diagrams-as-Code","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/HariSekhon/Diagrams-as-Code","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HariSekhon%2FDiagrams-as-Code","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HariSekhon%2FDiagrams-as-Code/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HariSekhon%2FDiagrams-as-Code/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HariSekhon%2FDiagrams-as-Code/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HariSekhon","download_url":"https://codeload.github.com/HariSekhon/Diagrams-as-Code/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HariSekhon%2FDiagrams-as-Code/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259565562,"owners_count":22877347,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["analytics","api","api-gateway","architecture","aws","d2","devops","diagrams","diagrams-as-code","gcp","high-availability","k8s","kong","kubernetes","load-balancing","mermaidjs","open-source","python","python3","traefik"],"created_at":"2025-06-13T02:06:47.127Z","updated_at":"2025-06-13T02:06:48.410Z","avatar_url":"https://github.com/HariSekhon.png","language":"D2","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Hari Sekhon - Diagrams-as-Code\n\n[![GitHub stars](https://img.shields.io/github/stars/HariSekhon/Diagrams-as-Code?logo=github)](https://github.com/HariSekhon/Diagrams-as-Code/stargazers)\n[![GitHub forks](https://img.shields.io/github/forks/HariSekhon/Diagrams-as-Code?logo=github)](https://github.com/HariSekhon/Diagrams-as-Code/network)\n[![LineCount](https://sloc.xyz/github/HariSekhon/Diagrams-as-Code/?badge-bg-color=2081C2)](https://github.com/boyter/scc/)\n[![Cocomo](https://sloc.xyz/github/HariSekhon/Diagrams-as-Code/?badge-bg-color=2081C2\u0026category=cocomo)](https://github.com/boyter/scc/)\n[![License](https://img.shields.io/badge/license-MIT-green)](https://github.com/HariSekhon/Diagrams-as-Code/blob/master/LICENSE)\n[![My LinkedIn](https://img.shields.io/badge/LinkedIn%20Profile-HariSekhon-blue?logo=data:image/svg%2bxml;base64,PHN2ZyByb2xlPSJpbWciIGZpbGw9IiNmZmZmZmYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+TGlua2VkSW48L3RpdGxlPjxwYXRoIGQ9Ik0yMC40NDcgMjAuNDUyaC0zLjU1NHYtNS41NjljMC0xLjMyOC0uMDI3LTMuMDM3LTEuODUyLTMuMDM3LTEuODUzIDAtMi4xMzYgMS40NDUtMi4xMzYgMi45Mzl2NS42NjdIOS4zNTFWOWgzLjQxNHYxLjU2MWguMDQ2Yy40NzctLjkgMS42MzctMS44NSAzLjM3LTEuODUgMy42MDEgMCA0LjI2NyAyLjM3IDQuMjY3IDUuNDU1djYuMjg2ek01LjMzNyA3LjQzM2MtMS4xNDQgMC0yLjA2My0uOTI2LTIuMDYzLTIuMDY1IDAtMS4xMzguOTItMi4wNjMgMi4wNjMtMi4wNjMgMS4xNCAwIDIuMDY0LjkyNSAyLjA2NCAyLjA2MyAwIDEuMTM5LS45MjUgMi4wNjUtMi4wNjQgMi4wNjV6bTEuNzgyIDEzLjAxOUgzLjU1NVY5aDMuNTY0djExLjQ1MnpNMjIuMjI1IDBIMS43NzFDLjc5MiAwIDAgLjc3NCAwIDEuNzI5djIwLjU0MkMwIDIzLjIyNy43OTIgMjQgMS43NzEgMjRoMjAuNDUxQzIzLjIgMjQgMjQgMjMuMjI3IDI0IDIyLjI3MVYxLjcyOUMyNCAuNzc0IDIzLjIgMCAyMi4yMjIgMGguMDAzeiIvPjwvc3ZnPgo=)](https://www.linkedin.com/in/HariSekhon/)\n[![GitHub Last Commit](https://img.shields.io/github/last-commit/HariSekhon/Diagrams-as-Code?logo=github)](https://github.com/HariSekhon/Diagrams-as-Code/commits/master)\n\n[![Codacy](https://app.codacy.com/project/badge/Grade/b4009a40bf9f48c8b4e444915016160c)](https://www.codacy.com/gh/HariSekhon/Diagrams-as-Code/dashboard)\n[![CodeFactor](https://www.codefactor.io/repository/github/harisekhon/Diagrams-as-Code/badge)](https://www.codefactor.io/repository/github/harisekhon/Diagrams-as-Code)\n[![SonarCloud](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/sonarcloud.yaml/badge.svg)](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/sonarcloud.yaml)\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=HariSekhon_Diagrams-as-Code\u0026metric=alert_status)](https://sonarcloud.io/dashboard?id=HariSekhon_Diagrams-as-Code)\n[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=HariSekhon_Diagrams-as-Code\u0026metric=sqale_rating)](https://sonarcloud.io/dashboard?id=HariSekhon_Diagrams-as-Code)\n[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=HariSekhon_Diagrams-as-Code\u0026metric=reliability_rating)](https://sonarcloud.io/dashboard?id=HariSekhon_Diagrams-as-Code)\n[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=HariSekhon_Diagrams-as-Code\u0026metric=security_rating)](https://sonarcloud.io/dashboard?id=HariSekhon_Diagrams-as-Code)\n[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=HariSekhon_Diagrams-as-Code\u0026metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=HariSekhon_Diagrams-as-Code)\n\n[![CI Builds Overview](https://img.shields.io/badge/CI%20Builds-Overview%20Page-blue?logo=circleci)](https://harisekhon.github.io/CI-CD/)\n[![Azure DevOps Pipeline](https://dev.azure.com/harisekhon/GitHub/_apis/build/status%2FDiagrams-as-Code?branchName=master)](https://dev.azure.com/harisekhon/GitHub/_build/latest?definitionId=14\u0026branchName=master)\n[![GitLab Pipeline](https://img.shields.io/badge/GitLab%20CI-legacy-lightgrey?logo=gitlab)](https://gitlab.com/HariSekhon/Diagrams-as-Code/pipelines)\n[![BitBucket Pipeline](https://img.shields.io/badge/Bitbucket%20CI-legacy-lightgrey?logo=bitbucket)](https://bitbucket.org/HariSekhon/Diagrams-as-Code/addon/pipelines/home#!/)\n\n[![Repo on GitHub](https://img.shields.io/badge/repo-GitHub-2088FF?logo=github)](https://github.com/HariSekhon/Diagrams-as-Code)\n[![Repo on GitLab](https://img.shields.io/badge/repo-GitLab-FCA121?logo=gitlab)](https://gitlab.com/HariSekhon/Diagrams-as-Code)\n[![Repo on Azure DevOps](https://img.shields.io/badge/repo-Azure%20DevOps-0078D7?logo=azure%20devops)](https://dev.azure.com/HariSekhon/GitHub/_git/Diagrams-as-Code)\n[![Repo on BitBucket](https://img.shields.io/badge/repo-BitBucket-0052CC?logo=bitbucket)](https://bitbucket.org/HariSekhon/Diagrams-as-Code)\n[![Mac](https://img.shields.io/badge/OS-Mac-blue?logo=apple)](https://github.com/HariSekhon/DevOps-Bash-tools#hari-sekhon---devops-bash-tools)\n[![Linux](https://img.shields.io/badge/OS-Linux-blue?logo=linux)](https://github.com/HariSekhon/DevOps-Bash-tools#hari-sekhon---devops-bash-tools)\n\n[![Generate D2 Images](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/generate-d2-images.yaml/badge.svg)](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/generate-d2-images.yaml)\n[![Generate Python Images](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/generate-python-images.yaml/badge.svg)](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/generate-python-images.yaml)\n[![D2 fmt](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/d2-fmt.yaml/badge.svg)](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/d2-fmt.yaml)\n[![Markdown](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/markdown.yaml/badge.svg)](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/markdown.yaml)\n[![Validation](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/validate.yaml/badge.svg)](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/validate.yaml)\n[![Kics](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/kics.yaml/badge.svg)](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/kics.yaml)\n[![Grype](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/grype.yaml/badge.svg)](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/grype.yaml)\n[![Semgrep](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/semgrep.yaml/badge.svg)](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/semgrep.yaml)\n[![Semgrep Cloud](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/semgrep-cloud.yaml/badge.svg)](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/semgrep-cloud.yaml)\n[![SonarCloud](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/sonarcloud.yaml/badge.svg)](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/sonarcloud.yaml)\n[![Trivy](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/trivy.yaml/badge.svg)](https://github.com/HariSekhon/Diagrams-as-Code/actions/workflows/trivy.yaml)\n\n[![Draw.io](https://img.shields.io/badge/draw.io-All%20icons%20editor-3776AB?logo=diagrams.net\u0026color=F08705\u0026logoColor=white)](https://app.diagrams.net/?splash=0\u0026ui=dark\u0026libs=aws3;aws3d;aws4;azure;gcp2;network;webicons)\n[![Draw.io](https://img.shields.io/badge/draw.io-AWS%20icons%20editor-FF9900?logo=diagrams.net\u0026color=FF9900\u0026logoColor=white)](https://app.diagrams.net/?splash=0\u0026ui=dark\u0026libs=aws3;aws3d;aws4)\n[![Draw.io](https://img.shields.io/badge/draw.io-Azure%20icons%20editor-007fff?logo=diagrams.net\u0026color=007fff\u0026logoColor=white)](https://app.diagrams.net/?splash=0\u0026ui=dark\u0026libs=azure)\n[![Draw.io](https://img.shields.io/badge/draw.io-GCP%20icons%20editor-4285F4?logo=diagrams.net\u0026color=4285F4\u0026logoColor=white)](https://app.diagrams.net/?splash=0\u0026ui=dark\u0026libs=gcp2)\n[![LucidChart](https://img.shields.io/badge/LucidChart-editor-orange.svg?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOEAAADhCAMAAAAJbSJIAAAAllBMVEX////5axP5ZAD//Pr8tZb8vqf5bhX8uZb5ZwD5aQ35aAj5YgD/+/j+7+f92cf+5NT5XAD+9/H6kVj6hkj+7eT+9O38xan91cH8tpH7mmf5eSn8v6L90Lf7lmP7n2z5cB/8rX76cAv8r4n6gDv6i1T7pXX5hj39zbX6hET8xqf94M37kVL6pnL+6d35gjf6ejH7pn76mVvxCTe5AAADaklEQVR4nO3dfVOiUBTHcS8UXC6CISD4SKJm4dra+39zm7vtrsmjM5n3nPl9/z/FZ1CIJk+9HkIIIYQQQgghhBBCCCGEEEI0i4NbH8F1M/3x6NbHcNUGd5OH+1sfxBULpqHhuHyF5myeKSH4CqNFphzBWPgo5dHHVRjMlq74iKMw8OeGIxgL/XxiCMFXGNmrkxPIT2i+rC0lBF9hMc6kEHyF3sZSzjmQkTC2l0bZx0cYF09ulY+L0PQ3svQG5CQcpCtZfQJ5CPt2qFSdj4Nwti7fITgJo7lV/wJlIIxz2eKjLfS2z24Lj7Qw8IduwwWGvrD4/IzEThjZz61vQNLC8jMSL2Gxq3qG4CMMfjx0fYGSFMZ21u0CQ1Y4rXlGYiM07y48gxBqF4QQ6h+EEOofhBDqH4QQ6h+EEOofhBDqH4QQ6h+EEOofhBDqH4QQ6h+EEOofhBDqH4QQ6h+EEOofhBDqH4QQ6h+EEOofhBDqH4RfJDS//sg7f+vvEJqJfzvidwj3+eSOs9BMQ+VyFiZDoYTBV7ify+Onb9kKo3z556szFXrb17+f3mQp7Cdj+e/j4QyFpp//PFmQwk8YpKtPH39nJ7TDs/0FzIT78oYiVkJvY5Q3FDESRqNV1YYbNsIg2RmVC0S4CP2DVbNCi4dw37DjjYOwPw2t+gUbDIRJKJo2+FAXmvHbQ/OGIuLCKF027uijLvS26/YNRZSFs0XrCSQtHBy67XijKgzSrjveiApnz413COpCc/AmO++wIyg0443b4QJDVxiPXjtsASUrlNlh0bRmmLrQMYZJftkJpCU0JiOvd89XKN2F9z7DVqjkcPB7hqlQOeHLxwxLoSNXafx3hqPQmByK/zP8hFLOZ/2TGW5Cxwi33qcZZkIpc+9shpPQUe5uX5phJFRiN6uYYSN0RGhX/kNOLkJjkg6qZ3gIpdwkdTMchMc7RFw7w0BoZNPzO8Rp5IXKHZfvEKcRFyrx1OwjLlTW2u63zRAWvj8jlX5Eq4iuUGaHovUE9ugKHeMtqb9DnEZT6LjH36J1i6LQkcvHqPMMQaG0hjU/glZ2ufDGf8munHXVM1J999K6MHlToRvmXS6gJxWpfWGpf52j75I5PVzyAiWYGVU+5CKEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgjx7RfeAUw4ubZ1NgAAAABJRU5ErkJggg==)](https://lucid.app/)\n[![CloudCraft](https://img.shields.io/badge/CloudCraft-editor-blue?logo=pending\u0026logoColor=white)](https://app.cloudcraft.co/)\n[![Creately](https://img.shields.io/badge/Creately-editor-blue?logo=pending\u0026logoColor=white)](https://app.creately.com/d/start/dashboard)\n[![VisualParadigm](https://img.shields.io/badge/Visual%20Paradigm-editor-blue?logo=pending\u0026logoColor=white)](https://online.visual-paradigm.com/drive/#diagramlist:proj=0\u0026dashboard)\n\n[![D2](https://img.shields.io/badge/D2-Declarative%20Diagramming-4A6FF3?logo=pending\u0026logoColor=white)](https://d2lang.com/)\n[![MermaidJS](https://img.shields.io/badge/Mermaid-JS-FF3399.svg?logo=data:image/svg%2bxml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cjxzdmcgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDQ5MSA0OTEiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM6c2VyaWY9Imh0dHA6Ly93d3cuc2VyaWYuY29tLyIgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoyOyI+CiAgICA8cGF0aCBkPSJNNDkwLjE2LDg0LjYxQzQ5MC4xNiwzNy45MTIgNDUyLjI0OCwwIDQwNS41NSwwTDg0LjYxLDBDMzcuOTEyLDAgMCwzNy45MTIgMCw4NC42MUwwLDQwNS41NUMwLDQ1Mi4yNDggMzcuOTEyLDQ5MC4xNiA4NC42MSw0OTAuMTZMNDA1LjU1LDQ5MC4xNkM0NTIuMjQ4LDQ5MC4xNiA0OTAuMTYsNDUyLjI0OCA0OTAuMTYsNDA1LjU1TDQ5MC4xNiw4NC42MVoiIHN0eWxlPSJmaWxsOnJnYigyNTUsNTQsMTEyKTsiLz4KICAgIDxwYXRoIGQ9Ik00MDcuNDgsMTExLjE4QzMzNS41ODcsMTA4LjEwMyAyNjkuNTczLDE1Mi4zMzggMjQ1LjA4LDIyMEMyMjAuNTg3LDE1Mi4zMzggMTU0LjU3MywxMDguMTAzIDgyLjY4LDExMS4xOEM4MC4yODUsMTY4LjIyOSAxMDcuNTc3LDIyMi42MzIgMTU0Ljc0LDI1NC44MkMxNzguOTA4LDI3MS40MTkgMTkzLjM1LDI5OC45NTEgMTkzLjI3LDMyOC4yN0wxOTMuMjcsMzc5LjEzTDI5Ni45LDM3OS4xM0wyOTYuOSwzMjguMjdDMjk2LjgxNiwyOTguOTUzIDMxMS4yNTUsMjcxLjQyIDMzNS40MiwyNTQuODJDMzgyLjU5NiwyMjIuNjQ0IDQwOS44OTIsMTY4LjIzMyA0MDcuNDgsMTExLjE4WiIgc3R5bGU9ImZpbGw6d2hpdGU7ZmlsbC1ydWxlOm5vbnplcm87Ii8+Cjwvc3ZnPgo=)](https://mermaid.js.org/)\n[![Python](https://img.shields.io/badge/Python-3-4584b6?logo=python\u0026logoColor=white)](https://www.python.org/)\n[![Python Diagrams](https://img.shields.io/badge/Python-diagrams-5E72E5?logo=python\u0026logoColor=white)](https://diagrams.mingrammer.com/)\n[![PlantUML](https://img.shields.io/badge/Plant-UML-blue?logo=pending\u0026logoColor=white)](https://plantuml.com/)\n[![Graphviz](https://img.shields.io/badge/Graphviz-dot-30638D?logo=\u0026logoColor=white)](https://graphviz.org/)\n[![GNUplot](https://img.shields.io/badge/GNU-plot-30638D?logo=\u0026logoColor=white)](http://www.gnuplot.info/)\n\n[![D2](https://img.shields.io/badge/D2-playground-4A6FF3?logo=pending\u0026logoColor=white)](https://play.d2lang.com/)\n[![MermaidJS](https://img.shields.io/badge/MermaidJS-Live%20Editor-FF3399.svg?logo=data:image/svg%2bxml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cjxzdmcgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDQ5MSA0OTEiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM6c2VyaWY9Imh0dHA6Ly93d3cuc2VyaWYuY29tLyIgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoyOyI+CiAgICA8cGF0aCBkPSJNNDkwLjE2LDg0LjYxQzQ5MC4xNiwzNy45MTIgNDUyLjI0OCwwIDQwNS41NSwwTDg0LjYxLDBDMzcuOTEyLDAgMCwzNy45MTIgMCw4NC42MUwwLDQwNS41NUMwLDQ1Mi4yNDggMzcuOTEyLDQ5MC4xNiA4NC42MSw0OTAuMTZMNDA1LjU1LDQ5MC4xNkM0NTIuMjQ4LDQ5MC4xNiA0OTAuMTYsNDUyLjI0OCA0OTAuMTYsNDA1LjU1TDQ5MC4xNiw4NC42MVoiIHN0eWxlPSJmaWxsOnJnYigyNTUsNTQsMTEyKTsiLz4KICAgIDxwYXRoIGQ9Ik00MDcuNDgsMTExLjE4QzMzNS41ODcsMTA4LjEwMyAyNjkuNTczLDE1Mi4zMzggMjQ1LjA4LDIyMEMyMjAuNTg3LDE1Mi4zMzggMTU0LjU3MywxMDguMTAzIDgyLjY4LDExMS4xOEM4MC4yODUsMTY4LjIyOSAxMDcuNTc3LDIyMi42MzIgMTU0Ljc0LDI1NC44MkMxNzguOTA4LDI3MS40MTkgMTkzLjM1LDI5OC45NTEgMTkzLjI3LDMyOC4yN0wxOTMuMjcsMzc5LjEzTDI5Ni45LDM3OS4xM0wyOTYuOSwzMjguMjdDMjk2LjgxNiwyOTguOTUzIDMxMS4yNTUsMjcxLjQyIDMzNS40MiwyNTQuODJDMzgyLjU5NiwyMjIuNjQ0IDQwOS44OTIsMTY4LjIzMyA0MDcuNDgsMTExLjE4WiIgc3R5bGU9ImZpbGw6d2hpdGU7ZmlsbC1ydWxlOm5vbnplcm87Ii8+Cjwvc3ZnPgo=)](https://mermaid.live/edit)\n[![GraphvizOnline](https://img.shields.io/badge/GraphViz-Online-5d6d7e?logo=pending\u0026logoColor=white)](https://dreampuf.github.io/GraphvizOnline/)\n[![CloudGram](https://img.shields.io/badge/CloudGram-editor-8B72C2?logo=pending\u0026logoColor=white)](https://cloudgram.dedalusone.com/index.html)\n[![PlantUML](https://img.shields.io/badge/PlantUML-editor-blue?logo=pending\u0026logoColor=white)](https://www.planttext.com/)\n[![Excalidraw](https://img.shields.io/badge/Excalidraw-editor-6965DB?logo=excalidraw\u0026logoColor=white)](https://excalidraw.com/)\n[![Miro](https://img.shields.io/badge/Miro-dashboard-FEDD33.svg?logo=miro)](https://miro.com/app/dashboard/)\n\nDiagrams-as-Code using the awesome [D2 language](https://d2lang.com/), [MermaidJS](https://mermaid.js.org/), [Python diagrams](https://github.com/mingrammer/diagrams) and [Graphviz](https://graphviz.org/).\n\nDiagrams shown below are automatically (re)generated by GitHub Actions CI/CD 😎\n\nI read an article that said:\n\u003e the ability to create meaningful diagrams is the pinnacle of communication skills as an engineer\n\n\u003c!-- INDEX_START --\u003e\n\n- [Documentation](#documentation)\n- [Diagrams](#diagrams)\n  - [This Repo's Creation \u0026 GitHub Actions CI/CD to auto-(re)generate diagrams from code changes](#this-repos-creation--github-actions-cicd-to-auto-regenerate-diagrams-from-code-changes)\n  - [GitHub Flow with Jira ticket integration](#github-flow-with-jira-ticket-integration)\n  - [Git - why you shouldn't use long-lived feature branches](#git---why-you-shouldnt-use-long-lived-feature-branches)\n  - [AWS Web Traffic Classic](#aws-web-traffic-classic)\n  - [Azure Active Directory Single Sign-On](#azure-active-directory-single-sign-on)\n  - [Jenkins CI/CD on Kubernetes](#jenkins-cicd-on-kubernetes)\n  - [ArgoCD - GitOps for Kubernetes](#argocd---gitops-for-kubernetes)\n  - [GCP Cloudflare Web Architecture GKE](#gcp-cloudflare-web-architecture-gke)\n  - [GCP Malware Scanner with ClamAV](#gcp-malware-scanner-with-clamav)\n  - [Kubernetes Deployment with Horizontal Pod Autoscaler and Ingress](#kubernetes-deployment-with-horizontal-pod-autoscaler-and-ingress)\n  - [Kubernetes Stateful Architecture with persistent volumes](#kubernetes-stateful-architecture-with-persistent-volumes)\n  - [Kubernetes Service External Traffic Policy](#kubernetes-service-external-traffic-policy)\n  - [Kubernetes on Premise](#kubernetes-on-premise)\n    - [Kubernetes with Traditional Load Balancer](#kubernetes-with-traditional-load-balancer)\n    - [Kubernetes with MetalLB](#kubernetes-with-metallb)\n  - [Traefik Kubernetes Ingress on GKE](#traefik-kubernetes-ingress-on-gke)\n  - [Kong API Gateway on Kubernetes (AWS EKS)](#kong-api-gateway-on-kubernetes-aws-eks)\n  - [OpenTSDB on Kubernetes and HBase](#opentsdb-on-kubernetes-and-hbase)\n  - [MySQL Replica Architecture](#mysql-replica-architecture)\n  - [Kafka Pub/Sub](#kafka-pubsub)\n  - [Elasticsearch Queries](#elasticsearch-queries)\n  - [Kafka Flink Elasticsearch](#kafka-flink-elasticsearch)\n  - [Cassandra Queries](#cassandra-queries)\n  - [Prometheus \u0026 Thanos](#prometheus--thanos)\n  - [RabbitMQ Pub/Sub](#rabbitmq-pubsub)\n  - [AWS S3 Config Notify Lambda DynamoDB](#aws-s3-config-notify-lambda-dynamodb)\n  - [Apigee Akamai EKS](#apigee-akamai-eks)\n  - [Git - Environment Branches](#git---environment-branches)\n  - [CI/CD - Separate Branch Workflows](#cicd---separate-branch-workflows)\n  - [CI/CD - Unified Release Workflow - Trunk Based](#cicd---unified-release-workflow---trunk-based)\n  - [Mobile CI/CD iOS - Separate Branch Workflows](#mobile-cicd-ios---separate-branch-workflows)\n  - [Devs Test in Production](#devs-test-in-production)\n  - [Code, Commit, Push, Boom](#code-commit-push-boom)\n  - [The Danger of Testing Ideas in Production](#the-danger-of-testing-ideas-in-production)\n  - [LucidChart - GCP Architecture](#lucidchart---gcp-architecture)\n  - [Web Basics](#web-basics)\n  - [Network - Layer 2 - Local - ARP](#network---layer-2---local---arp)\n  - [Network - Layer 3 - Remote - IP](#network---layer-3---remote---ip)\n- [Gantt Chart of my Experience](#gantt-chart-of-my-experience)\n- [Gantt Chart of my GitHub Repos](#gantt-chart-of-my-github-repos)\n- [Git Commits per Month for this Repo](#git-commits-per-month-for-this-repo)\n  - [GNUplot - Commits per Month](#gnuplot---commits-per-month)\n  - [MermaidJS - Commits per Month](#mermaidjs---commits-per-month)\n- [Git Commit Times across my Repos](#git-commit-times-across-my-repos)\n  - [GNUplot - Commit Times](#gnuplot---commit-times)\n  - [MermaidJS - Commit Times](#mermaidjs---commit-times)\n  - [Golang GoNum - Commit Times](#golang-gonum---commit-times)\n- [Samples Revamped](#samples-revamped)\n  - [AWS Load Balanced Web Farm](#aws-load-balanced-web-farm)\n  - [AWS Clustered Web Services](#aws-clustered-web-services)\n  - [Advanced Web Services Open Source](#advanced-web-services-open-source)\n  - [GCP Pub/Sub Analytics](#gcp-pubsub-analytics)\n  - [AWS Event Processing](#aws-event-processing)\n  - [AWS Serverless Image Processing](#aws-serverless-image-processing)\n- [Build from Source](#build-from-source)\n- [Diagram Templates](#diagram-templates)\n- [Star History](#star-history)\n- [More Core Repos](#more-core-repos)\n  - [Knowledge](#knowledge)\n  - [DevOps Code](#devops-code)\n  - [Containerization](#containerization)\n  - [CI/CD](#cicd)\n  - [DBA - SQL](#dba---sql)\n  - [DevOps Reloaded](#devops-reloaded)\n  - [Templates](#templates)\n  - [Misc](#misc)\n\n\u003c!-- INDEX_END --\u003e\n\n## Documentation\n\n[Gist](https://gist.github.com/HariSekhon/cb53b7622791718f1ee9d8709c9eec35)\nfrom [Knowledge-Base](https://github.com/HariSekhon/Knowledge-Base/blob/main/diagrams.md)\nrepo full of links to Diagrams technologies and\n[Icon Sets](https://github.com/HariSekhon/Knowledge-Base/blob/main/diagrams.md#important-icon-sets-to-import-into-d2).\n\n## Diagrams\n\nThey say a picture is worth a thousand words...\n\n### This Repo's Creation \u0026 GitHub Actions CI/CD to auto-(re)generate diagrams from code changes\n\n[github_actions_cicd.py](github_actions_cicd.py):\n\n![](images/github_actions_cicd.png)\n\nOpen [README.md](https://github.com/HariSekhon/Diagrams-as-Code/blob/master/README.md#this-repos-creation--github-actions-cicd-to-auto-regenerate-diagrams-from-code-changes) to enlarge:\n\n[github_actions_cicd.d2](github_actions_cicd.d2):\n\n![](images/github_actions_cicd.svg)\n\n### GitHub Flow with Jira ticket integration\n\nPrefix Git branches with Jira ticket numbers in Jira's `AA-NNN` format for GitHub Pull Requests to automatically appear in Jira tickets (see this [doc](https://support.atlassian.com/jira-cloud-administration/docs/integrate-with-github/)):\n\n```mermaid\n%% https://mermaid.js.org/syntax/gitgraph.html#gitgraph-specific-configuration-options\n%% https://htmlcolorcodes.com/\n%%{ init: {\n        \"logLevel\": \"debug\",\n        \"theme\": \"dark\",\n        \"themeVariables\": {\n            \"git0\": \"#839192\",\n            \"git1\": \"#2874A6\",\n            \"gitInv0\": \"#FFFFFF\",\n            \"gitBranchLabel0\": \"#FFFFFF\",\n            \"commitLabelColor\": \"#FFFFFF\"\n        }\n    }\n}%%\ngitGraph\n    commit\n    commit id: \"branch\"\n    branch AA-NNN-my-feature-branch\n    checkout AA-NNN-my-feature-branch\n    commit id: \"add code\"\n    commit id: \"refine code\"\n    checkout main\n    merge AA-NNN-my-feature-branch id: \"merge PR\" type: HIGHLIGHT tag: \"2023.15 release\"\n    commit\n    commit\n```\n\n### Git - why you shouldn't use long-lived feature branches\n\n\\* [Environment Branches](https://github.com/HariSekhon/Diagrams-as-Code/blob/master/README.md#git---environment-branches) may be one of the few exceptions but requires workflow discipline.\n\nSee Also: 100+ scripts for Git and the major Git repo providers like GitHub, GitLab, Bitbucket, Azure DevOps in my [DevOps-Bash-tools](https://github.com/HariSekhon/DevOps-Bash-tools) repo.\n\n```mermaid\n%% https://mermaid.js.org/syntax/gitgraph.html#gitgraph-specific-configuration-options\n%% https://htmlcolorcodes.com/\n%%{ init: {\n        \"logLevel\": \"debug\",\n        \"theme\": \"dark\",\n        \"gitGraph\": {\n            \"mainBranchName\": \"master\"\n        },\n        \"themeVariables\": {\n            \"git0\": \"#839192\",\n            \"git1\": \"#C0392B \",\n            \"git2\": \"#2E86C1\",\n            \"gitInv0\": \"#FFFFFF\",\n            \"gitBranchLabel0\": \"#FFFFFF\",\n            \"commitLabelColor\": \"#FFFFFF\"\n        }\n    }\n}%%\ngitGraph\n    commit  id: \"commit 1\"\n    commit id: \"branch\"\n    branch long-lived-branch\n    checkout long-lived-branch\n    commit id: \"50 clever commits\"\n    checkout master\n    commit id: \"commit 2\"\n    checkout long-lived-branch\n    commit id: \"too clever\"\n    checkout master\n    commit id: \"commit 3\"\n    checkout long-lived-branch\n    commit id: \"too long\"\n    checkout master\n    commit id: \"commit 4\"\n    checkout long-lived-branch\n    commit id: \"try to merge back\"\n    checkout master\n    merge long-lived-branch id: \"Merge Conflict!!\" type: REVERSE\n    checkout long-lived-branch\n    commit id: \"trying to fix\"\n    commit id: \"still trying to fix\"\n    commit id: \"struggling to fix\"\n    commit id: \"ask Hari for help\"\n    branch fixes-branch-to-send-to-naughty-colleague\n    checkout fixes-branch-to-send-to-naughty-colleague\n    commit id: \"fix 1\"\n    commit id: \"fix 2\"\n    commit id: \"fix 3\"\n    commit id: \"could have been working on better things!\"\n    checkout long-lived-branch\n    merge fixes-branch-to-send-to-naughty-colleague id: \"merge fixes\" type: HIGHLIGHT\n    commit id: \"more commits\"\n    commit id: \"because this branch only had 105 commits already\"\n    checkout master\n    merge long-lived-branch id: \"Finallly Merged!\" type: HIGHLIGHT\n    commit id: \"Please never do that again\"\n```\n\n### AWS Web Traffic Classic\n\n[aws_web_traffic_classic.py](aws_web_traffic_classic.py):\n\n![](images/aws_web_traffic_classic.png)\n\n### Azure Active Directory Single Sign-On\n\nI've administered [Azure Active Directory](https://azure.microsoft.com/en-us/products/active-directory) at a couple of companies and integrated a variety of applications including GitHub Enterprise Cloud, AWS IAM Identity Center (formerly AWS SSO), Jenkins, ArgoCD, Keycloak, Hubspot etc using the typical OIDC or SAML integration mechanisms.\n\n[azure_ad_aws_github_keycloak.d2](azure_ad_aws_github_keycloak.d2):\n\n![](images/azure_ad_aws_github_keycloak.svg)\n\n### Jenkins CI/CD on Kubernetes\n\nA production Jenkins on Kubernetes I built for a client with auto-spawning agents for horizontal scaling and integration with Docker, SonarQube, Clair, Grype and Trivy for code \u0026 container scanning.\n\n- GitHub repo: [HariSekhon/Kubernetes-configs](https://github.com/HariSekhon/Kubernetes-configs)\n  - [Jenkins](https://github.com/HariSekhon/Kubernetes-configs/tree/master/jenkins/base)\n  - [Clair](https://github.com/HariSekhon/Kubernetes-configs/tree/master/clair/base)\n  - [SonarQube](https://github.com/HariSekhon/Kubernetes-configs/tree/master/sonarqube/base)\n  - [Trivy server](https://github.com/HariSekhon/Kubernetes-configs/tree/master/trivy/base)\n- GitHub repo: [HariSekhon/Jenkins](https://github.com/HariSekhon/Jenkins)\n  - Advanced [Jenkinsfile](https://github.com/HariSekhon/Jenkins/blob/master/Jenkinsfile)\n  - [Groovy Shared Library](https://github.com/HariSekhon/Jenkins/tree/master/vars) with the code \u0026 container scanning functions\n    - [clair.groovy](https://github.com/HariSekhon/Jenkins/blob/master/vars/clair.groovy)\n    - [grype.groovy](https://github.com/HariSekhon/Jenkins/blob/master/vars/grype.groovy)\n    - [trivy.groovy](https://github.com/HariSekhon/Jenkins/blob/master/vars/trivy.groovy), [trivyFS.groovy](https://github.com/HariSekhon/Jenkins/blob/master/vars/trivyFS.groovy), [trivyImages.groovy](https://github.com/HariSekhon/Jenkins/blob/master/vars/trivyImages.groovy)\n    - [gcrDockerAuth.groovy](https://github.com/HariSekhon/Jenkins/blob/master/vars/gcrDockerAuth.groovy), [garDockerAuth.groovy](https://github.com/HariSekhon/Jenkins/blob/master/vars/garDockerAuth.groovy)\n    - and others in [vars/](https://github.com/HariSekhon/Jenkins/tree/master/vars), and don't forget about the epic [Jenkinsfile](https://github.com/HariSekhon/Jenkins/blob/master/Jenkinsfile)\n\n[jenkins_kubernetes_cicd.d2](jenkins_kubernetes_cicd.d2):\n\n![](images/jenkins_kubernetes_cicd.svg)\n\n- \u003chttps://github.com/HariSekhon/Jenkins\u003e\n- \u003chttps://github.com/HariSekhon/Kubernetes-configs\u003e\n\nscreenshot:\n\n![](screenshots/gcp_cloudbuild_deployed_after_code_container_scans_failed.png)\n\n### ArgoCD - GitOps for Kubernetes\n\n[argocd.d2](argocd.d2):\n\n![](images/argocd.svg)\n\n\u003c!-- \u003cimg src=\"images/argocd.svg\" alt=\"drawing\" width=\"500\"/\u003e --\u003e\n\n### GCP Cloudflare Web Architecture GKE\n\nA production internet customer facing website and apps replatform to Google Kubernetes Engine I did for an internet startup client using:\n\n- GitHub repo: [HariSekhon/Terraform](https://github.com/HariSekhon/Terraform)\n- GitHub repo: [HariSekhon/Kubernetes-configs](https://github.com/HariSekhon/Kubernetes-configs)\n  - [External DNS](https://github.com/HariSekhon/Kubernetes-configs/tree/master/external-dns/base) automatic DNS record creation in Cloudflare for any Kubernetes ingresses\n  - [External Secrets](https://github.com/HariSekhon/Kubernetes-configs/tree/master/external-secrets/base) pulling into Kubernetes from GCP Secret Manager\n\nThere are Cloudflare API scripts in the [HariSekhon/DevOps-Bash-tools](https://github.com/HariSekhon/DevOps-Bash-tools) repo.\n\n[gcp_cloudflare_web_architecture_gke.py](gcp_cloudflare_web_architecture_gke.py):\n\n![](images/gcp_cloudflare_web_architecture_gke.png)\n\n### GCP Malware Scanner with ClamAV\n\nA variation using Kubernetes and Cloud Functions of this GCP malware scanner solution architecture:\n\n\u003chttps://cloud.google.com/architecture/automate-malware-scanning-for-documents-uploaded-to-cloud-storage\u003e\n\n[gcp_malware_scanner.d2](gcp_maleware_scanner.d2):\n\n![](images/gcp_malware_scanner.svg)\n\n### Kubernetes Deployment with Horizontal Pod Autoscaler and Ingress\n\n- GitHub repo: [HariSekhon/Kubernetes-configs](https://github.com/HariSekhon/Kubernetes-configs)\n  - [deployment.yaml](https://github.com/HariSekhon/Kubernetes-configs/blob/master/deployment.yaml)\n  - [horizontal-pod-autoscaler.yaml](https://github.com/HariSekhon/Kubernetes-configs/blob/master/horizontal-pod-autoscaler.yaml)\n  - [ingress.yaml](https://github.com/HariSekhon/Kubernetes-configs/blob/master/ingress.yaml)\n\n[kubernetes_deployment_hpa_ingress.py](kubernetes_deployment_hpa_ingress.py):\n\n![](images/kubernetes_deployment_hpa_ingress.png)\n\n### Kubernetes Stateful Architecture with persistent volumes\n\n- GitHub repo: [HariSekhon/Kubernetes-configs](https://github.com/HariSekhon/Kubernetes-configs)\n  - [statefulset.yaml](https://github.com/HariSekhon/Kubernetes-configs/blob/master/statefulset.yaml)\n\n[kubernetes_stateful_architecture.py](kubernetes_stateful_architecture.py):\n\n![](images/kubernetes_stateful_architecture.png)\n\n### Kubernetes Service External Traffic Policy\n\n- GitHub repo: [HariSekhon/Kubernetes-configs](https://github.com/HariSekhon/Kubernetes-configs)\n  - [service.yaml](https://github.com/HariSekhon/Kubernetes-configs/blob/master/service.yaml#L141)\n\n[GKE docs](https://cloud.google.com/kubernetes-engine/docs/how-to/service-parameters#externalTrafficPolicy)\n\n[kubernetes_external_traffic_policy.d2](kubernetes_external_traffic_policy.d2):\n\n![](images/kubernetes_external_traffic_policy.svg)\n\n### Kubernetes on Premise\n\n#### Kubernetes with Traditional Load Balancer\n\n- GitHub repo: [Kubernetes-configs](https://github.com/HariSekhon/Kubernetes-configs)\n- GitHub repo: [HAProxy-configs](https://github.com/HariSekhon/HAProxy-configs)\n\n[kubernetes_on_premise.d2](kubernetes_on_premise.d2):\n\n![](images/kubernetes_on_premise.svg)\n\n#### Kubernetes with [MetalLB](https://metallb.universe.tf/)\n\n- GitHub repo: [HariSekhon/Kubernetes-configs](https://github.com/HariSekhon/Kubernetes-configs)\n  - [MetalLB](https://github.com/HariSekhon/Kubernetes-configs/tree/master/metal-lb/base)\n\nIs it just me or do MetaLB think they're [Starfleet](https://en.wikipedia.org/wiki/Starfleet)? (compare their logos)\n\n[kubernetes_on_premise_metallb.d2](kubernetes_on_premise_metallb.d2):\n\n![](images/kubernetes_on_premise_metallb.svg)\n\n### Traefik Kubernetes Ingress on GKE\n\nA Traefik deployment I did for a client.\n\n- GitHub repo: [HariSekhon/Kubernetes-configs](https://github.com/HariSekhon/Kubernetes-configs)\n  - [Traefik](https://github.com/HariSekhon/Kubernetes-configs/tree/master/traefik/base)\n  - [Traefik Hub Agent](https://github.com/HariSekhon/Kubernetes-configs/tree/master/traefik-hub-agent/base)\n\n[kubernetes_traefik_ingress_gke.py](kubernetes_traefik_ingress_gke.py):\n\n![](images/kubernetes_traefik_ingress_gke.png)\n\n[kubernetes_traefik_ingress_gke.d2](kubernetes_traefik_ingress_gke.d2):\n\n![](images/kubernetes_traefik_ingress_gke.svg)\n\n### Kong API Gateway on Kubernetes (AWS EKS)\n\nA Kong API Gateway deployment I did for a client.\n\n- GitHub repo: [HariSekhon/Kubernetes-configs](https://github.com/HariSekhon/Kubernetes-configs)\n  - [Kong](https://github.com/HariSekhon/Kubernetes-configs/tree/master/kong/base)\n  - [Cert Manager](https://github.com/HariSekhon/Kubernetes-configs/tree/master/cert-manager/base)\n  - [ArgoCD](https://github.com/HariSekhon/Kubernetes-configs/tree/master/argocd/base)\n\n[kubernetes_kong_api_gateway_eks.py](kubernetes_kong_api_gateway_eks.py):\n\n![](images/kubernetes_kong_api_gateway_eks.png)\n\n### OpenTSDB on Kubernetes and HBase\n\nA high scale production OpenTSDB replatform I did to Kubernetes for a client, ingesting 9 billion data points per day and serving 3 million queries per day.\n\nI also had to do advanced performance tuning of their production HBase cluster which was suffering from frequent outages at this scale due to being set up by a non-SME on the wrong hardware (I had to make do with the existing hardware of course).\n\nThis was the second client I did in-depth performance tuning of HBase for - I've published a selection of useful HBase tools - see `hbase_*.py` and `opentsdb_*.py` in [HariSekhon/DevOps-Python-tools](https://github.com/HariSekhon/DevOps-Python-tools).\n\n[opentsdb_kubernetes_hbase.d2](opentsdb_kubernetes_hbase.d2):\n\n![](images/opentsdb_kubernetes_hbase.svg)\n\n### MySQL Replica Architecture\n\n[mysql_replica_architecture.d2](mysql_replica_architecture.d2):\n\n![](images/mysql_replica_architecture.svg)\n\n### Kafka Pub/Sub\n\n[kafka_pubsub.d2](kafka_pubsub.d2):\n\n![](images/kafka_pubsub.svg)\n\n### Elasticsearch Queries\n\n[elasticsearch_queries.d2](elasticsearch_queries.d2):\n\n![](images/elasticsearch_queries.svg)\n\n### Kafka Flink Elasticsearch\n\n[kafka_flink_elasticsearch.d2](kafka_flink_elasticsearch.d2):\n\n![](images/kafka_flink_elasticsearch.svg)\n\n### Cassandra Queries\n\n[cassandra_queries.d2](cassandra_queries.d2):\n\n![](images/cassandra_queries.svg)\n\n### Prometheus \u0026 Thanos\n\n[prometheus_thanos.d2](prometheus_thanos.d2)\n\nSee Also: Prometheus and components quick install scripts in the\n[DevOps-Bash-tools](https://github.com/HariSekhon/DevOps-Bash-tools) repo.\n\n![](images/prometheus_thanos.svg)\n\n### RabbitMQ Pub/Sub\n\n[rabbitmq_pubsub.d2](rabbitmq_pubsub.d2):\n\n![](images/rabbitmq_pubsub.svg)\n\n### AWS S3 Config Notify Lambda DynamoDB\n\n[aws_s3_config_notify_lambda_dynamodb.d2](aws_s3_config_notify_lambda_dynamodb.d2)\n\n![](images/aws_s3_config_notify_lambda_dynamodb.svg)\n\n### Apigee Akamai EKS\n\n[apigee_akamai_eks.d2](apigee_akamai_eks.d2)\n\n![](images/apigee_akamai_eks.svg)\n\n### Git - Environment Branches\n\nAt least they don't [only test in Production](#devs-test-in-production)!\n\nAnother internet facing client refused to use tagging because they didn't want to have to think up version or release numbers for their website releases.\n\nNot everybody likes environment branches, but they worked in production for over 2 years and they are easy to use.\n\nAlso, contrary to some naysayers it's quite easy to diff environment branches as everything should be in Git, so you can get a very quick and easy difference between your environments in a single `git diff` command. It's also easy to automate backporting hotfixes to lower environments:\n\n- GitHub repo: [HariSekhon/Jenkins](https://github.com/HariSekhon/Jenkin)\n  - [gitMerge.groovy](https://github.com/HariSekhon/Jenkins/blob/master/vars/gitMerge.groovy)\n  - [gitMergePipeline.groovy](https://github.com/HariSekhon/Jenkins/blob/master/vars/gitMergePipeline.groovy)\n\n```mermaid\n%%{ init: {\n        \"logLevel\": \"debug\",\n        \"theme\": \"dark\",\n        \"gitGraph\": {\n            \"mainBranchName\": \"dev\"\n        },\n        \"themeVariables\": {\n            \"git0\": \"red\",\n            \"git1\": \"blue \",\n            \"git2\": \"green\",\n            \"gitInv0\": \"#FFFFFF\",\n            \"gitBranchLabel0\": \"#FFFFFF\",\n            \"commitLabelColor\": \"#FFFFFF\"\n        }\n    }\n}%%\n\ngitGraph\n    branch staging\n    branch production\n\n    checkout dev\n    commit id: \"commit 1\"\n\n    checkout staging\n    commit id: \"QA fix 1 \"\n\n    checkout production\n    commit id: \"hotfix commit\"\n\n    checkout dev\n    commit id: \"commit 2\"\n\n    checkout staging\n    merge dev id: \"fast-forward merge\" tag: \"CI/CD + QA Tests\"\n\n    checkout production\n    merge staging id: \"fast-forward merge \" tag: \"v2023.1 Release (CI/CD)\"\n\n\n    checkout dev\n    commit id: \"commit 3\"\n\n    checkout staging\n    commit id: \"QA fix 2 \"\n\n    %% new MermaidJS comment format\n    %% checkout production\n    %% commit id: \"commit 3  \"\n\n    checkout dev\n    commit id: \"commit 4\"\n\n    checkout staging\n    merge dev id: \"fast-forward merge 2\" tag: \"CI/CD + QA Tests\"\n\n    checkout production\n    merge staging id: \"fast-forward merge 2 \" tag: \"v2023.2 Release (CI/CD)\"\n\n\n    checkout dev\n    commit id: \"commit 5\"\n\n    checkout staging\n    commit id: \"QA fix 3 \"\n\n    %% new MermaidJS comment format\n    %% checkout production\n    %% commit id: \"commit 5  \"\n\n    checkout dev\n    commit id: \"commit 6\"\n\n    checkout staging\n    merge dev id: \"fast-forward merge 3\" tag: \"CI/CD + QA Tests\"\n\n    checkout production\n    merge staging id: \"fast-forward merge 3 \" tag: \"v2023.3 Release (CI/CD)\"\n```\n\nNote: I did eventually move this client to tagged releases using `YYYY.NN` release format, just incrementing `NN` which is a no brainer ([githubNextRelease.groovy](https://github.com/HariSekhon/Jenkins/blob/master/vars/githubNextRelease.groovy)). It turns out the developers had eventually started using releases in Jira labelled as `YYYY.NN` to track which tickets were going into which production deployment, so when I pushed for this, it made sense to them finally as not being too great an inconvenience! It's also easy to automate by creating GitHub Releases in Jenkins ([githubCreateRelease.groovy](https://github.com/HariSekhon/Jenkins/blob/master/vars/githubCreateRelease.groovy)).\n\n### CI/CD - Separate Branch Workflows\n\nIn some environments,\ndevs push to different branches\nwhich have diverged such that they cannot do clean Git merges from one branch to the next as per above.\n\nThis is not recommended because:\n\n1. allows for further drift between branches\n   1. wastes one of the big advantages of Git to track and merge changes across branches\n1. waste of CI/CD build time minutes\n   1. can incur additional cost\n   1. waste of real time\n   1. artifacts pushed to Production were not actually tested in lower environments\n1. untested code can be pushed to Production\n   1. untested code can be pushed to Production branch and released to Production environment\n      without the code having been tested in lower environments\n\n[release_workflows_separate.d2](release_workflows_separate.d2):\n\n![](images/release_workflows_separate.svg)\n\n### CI/CD - Unified Release Workflow - Trunk Based\n\nBuild once \u0026 promote the same artifact is preferred.\n\n1. build once saves physical time and CI/CD costs\n1. test the exact artifact output (Docker image or Mobile iOS `.ipa` or Android `.apk`)\n1. no untested code reaches Production\n\n[release_workflow_trunk.d2](release_workflow_trunk.d2):\n\n![](images/release_workflow_trunk.svg)\n\n### Mobile CI/CD iOS - Separate Branch Workflows\n\nConcrete example of [Separate Branch Workflows](#cicd---separate-branch-workflows) above.\n\nAt one client I had\nto do this because the IPA generated in each environment had different bundle IDs\nand the devs would have had to make changes for me to be able to try a unified release workflow.\n\n[release_workflows_separate_mobile_ios.d2](release_workflows_separate_mobile_ios.d2):\n\n![](images/release_workflows_separate_mobile_ios.svg)\n\n### Devs Test in Production\n\nIirc I created and stuck this meme pic of [The Most Interesting Man in the World](https://en.wikipedia.org/wiki/The_Most_Interesting_Man_in_the_World) on the wall of my tech dept back in 2011 while leading the infra team of an internet Ad Tech company doing several production releases a day. We literally did test in production using a small fraction of live internet traffic via canary deployments.\n\n[test_in_production.d2](test_in_production.d2):\n\n![](images/test_in_production.svg)\n\nIf done badly though without canary release testing or similar then it can result in this...\n\n### Code, Commit, Push, Boom\n\n[code_commit_push.d2](code_commit_push.d2):\n\n![](images/code_commit_push.svg)\n\n### The Danger of Testing Ideas in Production\n\nI may have gone overboard and done so many Diagrams-as-Code I'm starting to see life this way...\n\n[karl_marx_test_ideas_in_production.d2](karl_marx_test_ideas_in_production.d2)\n\n![](images/karl_marx_test_ideas_in_production.svg)\n\n### LucidChart - GCP Architecture\n\nA sample architecture I did for a client for us to talk through, which was similar to what they had in mind (I won the gig).\n\nThis is the only diagram not as code (here for historical interest). I would embed the interactive live diagram but GitHub markdown doesn't allow HTML iframes so this is the png.\n\n![GCP Diagram LucidChart](images/LucidChart_GCP_diagram.png)\n\n### Web Basics\n\nWhen you're trying to explain to your kids how the internet works...\n\n[web_basics.d2](web_basics.d2):\n\n![](images/web_basics.svg)\n\n### Network - Layer 2 - Local - ARP\n\n[network_layer2_local.d2](network_layer2_local.d2):\n\n![](images/network_layer2_local.svg)\n\n### Network - Layer 3 - Remote - IP\n\n[network_layer3_remote.d2](network_layer3_remote.d2):\n\n![](images/network_layer3_remote.svg)\n\n## Gantt Chart of my Experience\n\nThis should give you some idea of my long evolution having reached the level of lead engineer and architect\nby the mid-to-late 2000s.\n\n\u003c!--\n%% MermaidJS inline colour customization is not documented properly:\n%%\n%%    https://github.com/mermaid-js/mermaid/issues/5915\n%%\n%% Have to infer the settings from here:\n%%\n%%    https://github.com/mermaid-js/mermaid/blob/develop/packages/mermaid/src/diagrams/gantt/styles.js\n%%\n%% and especially the styles here:\n%%\n%%    https://github.com/mermaid-js/mermaid/blob/develop/packages/mermaid/src/themes/theme-default.js\n%%\n%% Have to use 'base' theme because the 'dark' theme has hardcoded red for 'crit'\n%%\n%% This is here because we can't have %% comments in the %%{ init: { } } section below\n%%\n%% Even a trailing comma, breaks the colour customization\n%%\n%%          'altSectionBkgColor': 'lightgrey',\n%%          'sectionBkgColor': 'lightgrey',\n%%          'sectionBkgColor2': 'darkgrey',\n--\u003e\n\n```mermaid\n%%{ init: {\n        \"logLevel\": \"debug\",\n        'theme': 'dark',\n        'themeVariables': {\n          'activeTaskBkgColor': '#27ae60',\n          'activeTaskBorderColor': 'lightgrey',\n          'critBkgColor': 'blue',\n          'critBorderColor': 'lightgrey',\n          'doneTaskBkgColor': 'grey',\n          'doneTaskBorderColor': 'lightgrey',\n          'excludeBkgColor': '#eeeeee',\n          'gridColor': 'lightgrey',\n          'taskBkgColor': 'black',\n          'taskBorderColor': 'black',\n          'taskTextClickableColor': 'white',\n          'taskTextColor': 'white',\n          'taskTextDarkColor': 'white',\n          'taskTextLightColor': 'black',\n          'taskTextOutsideColor': 'white',\n          'todayLineColor': 'red'\n        }\n    }\n}%%\n\ngantt\n    title Hari Sekhon's Technology Skills \u0026 Experience\n    dateFormat  YYYY-MM-DD\n\n    20+ years of Skillz to Pay the Billz : 2002-06-01, 2024-12-31\n\n    section Operating Systems\n    Linux                    : crit, 2002-12-01, 2024-12-31\n    Windows Active Directory : done, 2003-01-01, 2009-11-10\n    %%Redhat Linux             : active, 2002-12-01, 2024-12-31\n    %%Debian Linux             : active, 2003-01-01, 2024-12-31\n    %%Gentoo Linux             : done, 2004-06-01, 2009-11-10\n    %%Ubuntu Linux             : active, 2006-06-01, 2024-12-31\n    %%Alpine Linux             : done, 2016-01-01, 2024-12-31\n    Mac                      : active, 2010-02-01, 2024-12-31\n\n    section Coding\n    Coding                 : crit, 2002-12-01, 2024-12-31\n    Bash                   : active, 2002-12-01, 2024-12-31\n    Python                 : active, 2005-11-01, 2024-12-31\n    APIs                   : active, 2006-06-01, 2024-12-31\n    %%VBScript               : done, 2005-05-01, 2009-11-01\n    Perl                   : active, 2009-11-13, 2024-12-31\n    Git                    : active, 2012-06-01, 2024-12-31\n    %%Ruby                   : done, 2009-11-13, 2013-01-31\n    Java                   : active, 2013-01-13, 2024-12-31\n    %%Jython                 : done, 2013-01-13, 2015-12-31\n    %%JRuby                  : done, 2013-03-01, 2013-08-31\n    %%Scala                  : done, 2014-01-01, 2015-12-31\n    Golang                 : active, 2015-06-01, 2024-12-31\n    Groovy                 : active, 2016-01-01, 2024-12-31\n\n    %%section Build Systems\n    %%Make                   : active, 2006-06-01, 2024-12-31\n    %%Maven                  : active, 2013-02-01, 2024-12-31\n    %%SBT                    : active, 2014-01-01, 2024-12-31\n    %%Gradle                 : active, 2014-06-01, 2024-12-31\n\n    %%section Version Control Systems\n    %%Subversion             : done, 2005-11-13, 2012-06-01\n    %%Mercurial              : done, 2011-06-01, 2013-06-01\n    %%Git                    : active, 2012-06-01, 2024-12-31\n    %%GitHub                 : active, 2012-12-31, 2024-12-31\n\n    section Networking\n    Networking             : crit, 2004-03-01, 2024-12-31\n    %%VPNs                   : active, 2006-06-01, 2024-12-31\n    %%Cisco - IOS / NX-OS    : done, 2004-03-01, 2024-12-31\n    %%Juniper - Netscreen / SSG / SRX / ScreenOS / JunOS : done, 2007-01-01, 2013-01-18\n    %%Netgear                : done, 2005-01-01, 2012-12-31\n\n    section Load Balancers\n\n    section Security\n    Security               : crit, 2004-10-01, 2024-12-31\n    %%Kerberos               : active, 2006-06-01, 2024-12-31\n    %%LDAP                   : active, 2006-06-01, 2024-12-31\n\n    section DevOps\n    DevOps                   : crit, 2005-11-11, 2024-12-31\n\n    section Data\n    Data                   : active, 2005-11-11, 2024-12-31\n    %%Data Validation        : done, 2006-06-01, 2024-12-31\n    %%Data Science           : done, 2013-01-18, 2024-12-31\n\n    section Architecture\n    Architecture            : crit,   2005-11-11, 2024-12-31\n    Web-Scale Architecture  : active, 2009-11-01, 2024-12-31\n    MicroServices           : active, 2018-10-01, 2024-12-31\n    Diagrams-as-Code        : active, 2023-04-14, 2024-12-31\n\n    section Databases (RDBMS)\n    Databases (RDBMS)      : crit, 2004-01-01, 2024-12-31\n    SQL                    : active, 2004-01-01, 2024-12-31\n    Microsoft SQL Server   : done, 2004-01-01, 2005-10-31\n    Oracle                 : done, 2005-11-01, 2009-09-10\n    MySQL                  : active, 2007-01-01, 2024-12-31\n    PostgreSQL             : active, 2008-01-01, 2024-12-31\n\n    section Web \u0026 CDNs\n    Web                    : crit, 2005-01-01, 2024-12-31\n    APIs                   : active, 2006-06-01, 2024-12-31\n\n    Load Balancers         : active, 2009-07-01, 2024-12-31\n    %%LVS                    : done, 2009-01-01, 2009-11-11\n    %%Foundry - ServerIron XL / 4G : done, 2009-10-13, 2011-11-31\n    %%F5 BigIP               : done, 2010-06-01, 2013-01-18\n    %%HAProxy                : active, 2018-04-01, 2024-12-31\n    %%Kong                   : active, 2023-03-01, 2024-12-31\n    %%Traefik                : active, 2023-03-01, 2024-12-31\n\n    Web-Scale Architecture : active, 2009-11-01, 2024-12-31\n    CDNs                   : active, 2009-12-01, 2024-12-31\n    %%UlraDNS                : done, 2009-11-01, 2012-06-31\n    %%Cotendo                : done, 2012-06-01, 2013-01-13\n    %%Cloudflare             : active, 2020-08-20, 2024-12-31\n    MicroServices            : active, 2018-10-01, 2024-12-31\n\n    section Virtualization \u0026 Containerization\n    Virtualization         : crit, 2005-01-01, 2024-12-31\n    %%VMware ESX, ESXi, VirtualBox : done, 2005-01-01, 2017-02-16\n    %%Vagrant                : active, 2013-01-01, 2023-12-31\n    Containerization       : crit, 2014-06-01, 2024-12-31\n    Docker                 : active, 2014-06-01, 2024-12-31\n    Kubernetes             : active, 2018-09-01, 2024-12-31\n    MicroServices          : active, 2018-10-01, 2024-12-31\n    ArgoCD                 : active, 2021-01-01, 2024-12-31\n\n    section IaaC \u0026 Configuration Management\n    Configuration Management :crit, 2006-01-01, 2024-12-31\n    Puppet Config Mgmt     : done, 2008-09-01, 2014-02-18\n    Ansible                : active, 2014-06-01, 2024-12-31\n    IaaC                   :crit, 2008-01-01, 2024-12-31\n    Terraform              :active, 2019-09-01, 2024-12-31\n    %%Terraform Cloud        : active, 2021-09-01, 2022-09-31\n    %%Kickstart              : active, 2008-01-01, 2024-12-31\n    %%Preseed                : active, 2009-01-01, 2024-12-31\n    %%AutoInstall            : active, 2023-01-01, 2024-12-31\n\n    section CI/CD\n    CI/CD                  : crit, 2010-06-01, 2024-12-31\n    Jenkins                : active, 2010-06-01, 2024-12-31\n    Travis CI              : done, 2014-05-01, 2023-05-08\n    CircleCI               : done, 2019-09-01, 2021-12-31\n    BuildKite              : done, 2019-09-01, 2021-12-31\n    GitHub Actions         : active, 2019-09-01, 2024-12-31\n    %%GitLab                 : active, 2019-09-01, 2022-12-31\n    %%Azure DevOps           : done, 2019-09-01, 2022-12-31\n    %%Bitbucket              : done, 2019-09-01, 2022-12-31\n    %%Concourse              : active, 2019-11-01, 2020-03-20\n    %%TeamCity               : active, 2020-08-20, 2021-02-31\n    CloudBuild             : active, 2020-08-20, 2023-09-30\n\n    section Monitoring\n    Monitoring             : crit, 2006-06-01, 2024-12-31\n    Nagios                 : active, 2006-06-01, 2019-07-31\n    OpenTSDB               : done, 2016-09-01, 2019-07-31\n    Grafana                : active, 2018-01-01, 2024-12-31\n    Prometheus             : active, 2018-06-01, 2024-12-31\n    %%Pingdom                : done, 2020-08-20, 2023-09-17\n    %%Datadog                : done, 2022-08-20, 2023-09-17\n\n    section Big Data\n    Big Data               : crit, 2009-11-13, 2019-07-31\n    Hadoop                 : done, 2009-11-13, 2019-07-31\n    %%HDFS                   : done, 2009-11-13, 2019-07-31\n    %%MapReduce              : done, 2012-06-01, 2019-07-31\n    Cloudera / Hortonworks : done, 2012-08-01, 2020-03-20\n    Hive                   : done, 2013-01-18, 2019-07-31\n    HBase                  : active, 2013-02-01, 2019-07-31\n    Impala                 : done, 2013-04-01, 2015-06-30\n    Spark                  : active, 2014-01-01, 2019-07-31\n    Kafka                  : active, 2014-01-01, 2019-07-31\n    Apache Drill           : active, 2014-06-01, 2018-12-31\n\n    section NoSQL\n    NoSQL                  : crit, 2009-11-13, 2024-12-31\n    HBase                  : active, 2013-02-01, 2019-07-31\n    %%MongoDB                : done, 2013-06-01, 2013-12-31\n    Cassandra              : active, 2013-08-01, 2024-12-31\n    Couchbase              : done, 2013-11-01, 2024-03-01\n\n    section Caching\n    Caching                : crit, 2009-11-31, 2024-12-31\n    Memcached              : done, 2009-11-31, 2024-12-31\n    Redis                  : active, 2013-03-01, 2024-12-31\n\n    section Cloud\n    Cloud            : crit, 2012-09-01, 2024-12-31\n    AWS              : active, 2012-09-01, 2024-12-31\n    GCP              : active, 2018-09-01, 2024-12-31\n    Azure            : active, 2020-08-01, 2024-12-31\n\n    section Search\n    Search                 : crit, 2013-03-31, 2024-12-31\n    Elasticsearch          : active, 2013-03-31, 2024-12-31\n    %%LogStash               : done, 2013-03-31, 2024-12-31\n    %%Fluentd                : crit, 2018-03-31, 2024-12-31\n    %%Kibana                 : crit, 2013-03-31, 2024-12-31\n    SolrCloud              : done, 2013-04-01, 2024-03-01\n```\n\n## Gantt Chart of my GitHub Repos\n\nGenerated by:\n[HariSekhon/GitHub-Repos-MermaidJS-Gantt-Chart](https://github.com/HariSekhon/GitHub-Repos-MermaidJS-Gantt-Chart)\n\n```mermaid\n%%{ init: {\n        \"logLevel\": \"debug\",\n        'theme': 'dark',\n        'themeVariables': {\n          'activeTaskBkgColor': '#0000ff',\n          'activeTaskBorderColor': 'lightgrey',\n          'critBorderColor': 'lightgrey',\n          'doneTaskBkgColor': 'grey',\n          'doneTaskBorderColor': 'lightgrey',\n          'taskBkgColor': 'black',\n          'taskBorderColor': 'black',\n          'taskTextColor': 'white',\n          'taskTextDarkColor': 'white',\n          'taskTextLightColor': 'black',\n          'todayLineColor': 'red'\n        }\n    }\n}%%\ngantt\n    dateFormat  YYYY-MM-DD\n    title Repositories Gantt Chart\n    Nagios-Plugins : active, 2012-12-30, 2020-12-31\n    lib : active, 2012-12-30, 2015-12-31\n    DevOps-Perl-tools : active, 2012-12-30, 2020-12-31\n    Spotify-tools : active, 2012-12-30, 2020-12-31\n    SQL-keywords : active, 2013-08-13, 2020-12-31\n    spark-apps : done, 2015-05-25, 2020-04-02\n    lib-java : active, 2015-05-31, 2016-12-31\n    DevOps-Python-tools : active, 2015-10-27, 2020-12-31\n    pylib : active, 2015-10-27, 2020-12-31\n    Dockerfiles : active, 2016-01-17, 2022-12-31\n    DevOps-Bash-tools : active, 2016-01-17, 2025-04-30\n    Nagios-Plugin-Kafka : active, 2016-06-07, 2017-12-31\n    HAProxy-configs : active, 2018-06-08, 2022-12-31\n    DevOps-Golang-tools : active, 2020-04-30, 2024-09-22\n    Spotify-Playlists : active, 2020-06-29, 2024-09-22\n    SQL-scripts : active, 2020-08-05, 2025-04-30\n    Kubernetes-configs : active, 2020-09-16, 2025-04-30\n    Templates : active, 2019-11-25, 2025-04-30\n    TeamCity-CI : active, 2020-12-03, 2022-12-31\n    Terraform : active, 2021-01-18, 2025-04-30\n    Jenkins : active, 2022-01-17, 2024-09-23\n    GitHub-Actions : active, 2022-01-17, 2025-04-30\n    CI-CD : active, 2022-03-25, 2023-12-31\n    GitHub-Actions-Contexts : active, 2022-08-17, 2022-12-31\n    Diagrams-as-Code : active, 2023-04-14, 2025-04-30\n    Template-Repo : active, 2023-04-15, 2025-04-30\n    Packer : active, 2023-06-02, 2024-09-21\n    Vagrant-templates : active, 2023-06-12, 2024-09-21\n    Knowledge-Base : active, 2023-11-22, 2025-04-30\n    HariSekhon : active, 2024-08-14, 2025-04-30\n    GitHub-Commit-Times-Graph : active, 2024-09-07, 2024-09-08\n    GitHub-Repos-MermaidJS-Gantt-Chart : active, 2024-10-02, 2024-10-03\n    Prometheus : active, 2024-10-08, 2025-04-30\n    Ansible : active, 2024-10-08, 2025-04-30\n```\n\n## Git Commits per Month for this Repo\n\nCode generated by this script from [DevOps-Bash-tools](https://github.com/HariSekhon/DevOps-Bash-tools).\n\n### GNUplot - Commits per Month\n\n[git_graph_commit_history_gnuplot.sh](https://github.com/HariSekhon/DevOps-Bash-tools/blob/master/git/git_graph_commit_history_gnuplot.sh)\n\n[git_commits_per_month.gnuplot](git_commits_per_month.gnuplot)\n\n![Git Commits per Month](images/git_commits_per_month.png)\n\n### MermaidJS - Commits per Month\n\n[git_graph_commit_history_mermaidjs.sh](https://github.com/HariSekhon/DevOps-Bash-tools/blob/master/git/git_graph_commit_history_mermaidjs.sh)\n\n[git_commits_per_month.mmd](git_commits_per_month.mmd)\n\n![Git Commits per Month](images/git_commits_per_month.svg)\n\n## Git Commit Times across my Repos\n\nCode generated by this script from [DevOps-Bash-tools](https://github.com/HariSekhon/DevOps-Bash-tools).\n\n### GNUplot - Commit Times\n\n[github_graph_commit_times_gnuplot.sh](https://github.com/HariSekhon/DevOps-Bash-tools/blob/master/git/github_graph_commit_times_gnuplot.sh)\n\n[git_commits_times.gnuplot](git_commit_times.gnuplot)\n\n![Git Commits per Hour](images/git_commit_times.png)\n\n### MermaidJS - Commit Times\n\n[github_graph_commit_times_mermaidjs.sh](https://github.com/HariSekhon/DevOps-Bash-tools/blob/master/git/github_graph_commit_times_mermaidjs.sh)\n\n[git_commits_times.mmd](git_commit_times.mmd)\n\n![Git Commits per Hour](images/git_commit_times.svg)\n\n### Golang GoNum - Commit Times\n\nRepo: [HariSekhon/GitHub-Graph-Commit-Times](https://github.com/HariSekhon/GitHub-Graph-Commit-Times)\n\nCoded using [GoNum](https://www.gonum.org/):\n\n![Git Commits per Hour](https://raw.githubusercontent.com/HariSekhon/GitHub-Graph-Commit-Times/main/graph.svg)\n\n## Samples Revamped\n\nThese are reworked from [Python diagrams](https://diagrams.mingrammer.com/docs/getting-started/examples) and [Cloudgram](https://cloudgram.dedalusone.com/examples.html) examples.\n\n### AWS Load Balanced Web Farm\n\n[aws_load_balanced_web_farm.py](aws_load_balanced_web_farm.py):\n\n![](images/aws_load_balanced_web_farm.png)\n\n### AWS Clustered Web Services\n\n[aws_clustered_web_services.py](aws_clustered_web_services.py):\n\n![](images/aws_clustered_web_services.png)\n\n### Advanced Web Services Open Source\n\n[advanced_web_services_open_source.py](advanced_web_services_open_source.py):\n\n![](images/advanced_web_services_open_source.png)\n\n### GCP Pub/Sub Analytics\n\n[gcp_pubsub_analytics.py](gcp_pubsub_analytics.py):\n\n![](images/gcp_pubsub_analytics.png)\n\n### AWS Event Processing\n\n[aws_event_processing.py](aws_event_processing.py):\n\n![](images/aws_event_processing.png)\n\n### AWS Serverless Image Processing\n\n[aws_serverless_image_processing.py](aws_serverless_image_processing.py):\n\n![](images/aws_serverless_image_processing.png)\n\n## Build from Source\n\nInstall D2, Graphviz, Python3 and 'diagrams' pip module:\n\n```shell\ngit clone https://github.com/HariSekhon/Diagrams-as-Code diagrams\n\ncd diagrams\n\nmake install\n```\n\nCreate all the `.png` and `.svg` diagrams in the `images/` dir:\n\n```shell\nmake\n```\n\nGenerate only the D2 svg diagrams:\n\n```shell\nmake d2\n```\n\nGenerate only the Python png diagrams:\n\n```shell\nmake py\n```\n\nCreate any single D2 diagram by running the d2 script file:\n\n```shell\n./jenkins_kubernetes_docker.d2\n```\n\nCreate any single Python diagram and have it open automatically by running the python script file:\n\n```shell\n./gcp_cloudflare_web_architecture_gke.py\n```\n\n## Diagram Templates\n\nThe [templates/diagram.d2](https://github.com/HariSekhon/Templates/blob/master/diagram.d2) and [templates/diagram.py](https://github.com/HariSekhon/Templates/blob/master/diagram.py) show the basics of each language.\n\nThey are a good starting point for creating your own diagrams, and come pre-loaded with many useful icons, links to docs and links to icon sets.\n\n## Star History\n\n[![Star History Chart](https://api.star-history.com/svg?repos=HariSekhon/Diagrams-as-Code\u0026type=Date)](https://star-history.com/#HariSekhon/Diagrams-as-Code\u0026Date)\n\n## More Core Repos\n\n\u003c!-- OTHER_REPOS_START --\u003e\n\n### Knowledge\n\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Knowledge-Base\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Knowledge-Base)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Diagrams-as-Code\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Diagrams-as-Code)\n\n\u003c!--\n\nNot support on GitHub Markdown:\n\n\u003ciframe src=\"https://raw.githubusercontent.com/HariSekhon/HariSekhon/main/knowledge.md\" width=\"100%\" height=\"500px\"\u003e\u003c/iframe\u003e\n\nDoes nothing:\n\n\u003cembed src=\"https://raw.githubusercontent.com/HariSekhon/HariSekhon/main/knowledge.md\" width=\"100%\" height=\"500px\" /\u003e\n\n--\u003e\n\n### DevOps Code\n\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=DevOps-Bash-tools\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/DevOps-Bash-tools)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=DevOps-Python-tools\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/DevOps-Python-tools)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=DevOps-Perl-tools\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/DevOps-Perl-tools)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=DevOps-Golang-tools\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/DevOps-Golang-tools)\n\n\u003c!--\n[![Gist Card](https://github-readme-stats.vercel.app/api/gist?id=f8f551332440f1ca8897ff010e363e03)](https://gist.github.com/HariSekhon/f8f551332440f1ca8897ff010e363e03)\n--\u003e\n\n### Containerization\n\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Kubernetes-configs\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Kubernetes-configs)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Dockerfiles\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Dockerfiles)\n\n### CI/CD\n\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=GitHub-Actions\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/GitHub-Actions)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Jenkins\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Jenkins)\n\n### DBA - SQL\n\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=SQL-scripts\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/SQL-scripts)\n\n### DevOps Reloaded\n\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Nagios-Plugins\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Nagios-Plugins)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=HAProxy-configs\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/HAProxy-configs)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Terraform\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Terraform)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Packer-templates\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Packer-templates)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Nagios-Plugin-Kafka\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Nagios-Plugin-Kafka)\n\n### Templates\n\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Templates\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Templates)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Template-repo\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Template-repo)\n\n### Misc\n\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Spotify-tools\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Spotify-tools)\n[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=HariSekhon\u0026repo=Spotify-playlists\u0026theme=ambient_gradient\u0026description_lines_count=3)](https://github.com/HariSekhon/Spotify-playlists)\n\nThe rest of my original source repos are\n[here](https://github.com/HariSekhon?tab=repositories\u0026q=\u0026type=source\u0026language=\u0026sort=stargazers).\n\nPre-built Docker images are available on my [DockerHub](https://hub.docker.com/u/harisekhon/).\n\n\u003c!-- 1x1 pixel counter to record hits --\u003e\n![](https://hit.yhype.me/github/profile?user_id=2211051)\n\n\u003c!-- OTHER_REPOS_END --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fharisekhon%2Fdiagrams-as-code","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fharisekhon%2Fdiagrams-as-code","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fharisekhon%2Fdiagrams-as-code/lists"}