From 766ea750a9111ce10386377f4d1c16b7060dd22c Mon Sep 17 00:00:00 2001 From: Jamie Sinn Date: Tue, 19 Aug 2025 11:09:52 -0400 Subject: [PATCH 1/8] Architecture docs --- diagrams/architecture.puml | 220 +++++++++++++++++++++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 diagrams/architecture.puml diff --git a/diagrams/architecture.puml b/diagrams/architecture.puml new file mode 100644 index 00000000..98b6ee77 --- /dev/null +++ b/diagrams/architecture.puml @@ -0,0 +1,220 @@ +@startuml +'https://plantuml.com/deployment-diagram + +!theme aws-orange +skinparam backgroundColor #f8f9fa +skinparam roundCorner 10 +skinparam defaultFontColor #2c3e50 +skinparam defaultFontSize 11 + +' ================================ +' STYLING CLASSES +' ================================ + +' Customer Infrastructure Styling +skinparam cloud<> { + BackgroundColor #4a90e2 +} + +skinparam collections<> { + BackgroundColor #6bb6ff +} + +' External Integrations Styling +skinparam cloud<> { + BackgroundColor #50c878 +} + +skinparam node<> { + BackgroundColor #7ed321 +} + +' Cloudflare Styling +skinparam rectangle<> { + BackgroundColor #ff6b35 +} + +skinparam portin<> { + BackgroundColor #ff8c42 +} + +skinparam portout<> { + BackgroundColor #d84315 +} + +skinparam cloud<> { + BackgroundColor #bf360c +} + +skinparam rectangle<> { + BackgroundColor #dd2c00 +} + +skinparam frame<> { + BackgroundColor #ff5722 +} + +skinparam database<> { + BackgroundColor #ffa000 +} + +skinparam queue<> { + BackgroundColor #ff8f00 +} + +' AWS Infrastructure Styling +skinparam rectangle<> { + BackgroundColor #e74c3c +} + +skinparam portin<> { + BackgroundColor #c0392b +} + +skinparam queue<> { + BackgroundColor #e67e22 +} + +skinparam node<> { + BackgroundColor #f39c12 +} + +skinparam rectangle<> { + BackgroundColor #8e44ad +} + +skinparam database<> { + BackgroundColor #9b59b6 +} + +skinparam node<> { + BackgroundColor #3498db +} + +' EdgeDB Styling +skinparam database<> { + BackgroundColor #27ae60 +} + +skinparam portin<> { + BackgroundColor #2ecc71 +} + +skinparam collections<> { + BackgroundColor #58d68d +} + +' ================================ +' ARROW STYLING +' ================================ + +skinparam arrow { + Color #2c3e50 + FontColor #2c3e50 + FontSize 10 + Thickness 2 +} + +skinparam class { + ArrowColor #2c3e50 + ArrowFontColor #2c3e50 + ArrowThickness 2 +} + +' ================================ +' ARCHITECTURE COMPONENTS +' ================================ + +cloud "Customer Infrastructure" as customer_infra <> { + collections "DevCycle Cloud Bucketing SDKs" as customer_cloud_sdks <> + collections "DevCycle Local Bucketing SDKs" as customer_local_sdks <> + collections "DevCycle Mobile/Web SDKs" as customer_mobile_web_sdks <> + collections "Management API Clients" as management_api_clients <> +} + +cloud "External Integrations" <> { + node "GitHub Actions" as github_actions <> + node "GitLab CI/CD" as gitlab_ci <> + node "Atlassian Bitbucket Pipelines" as bitbucket_pipelines <> + node "Atlassian JIRA" as jira <> + node "Slack" as slack <> +} + +rectangle "Cloudflare" <> { + portin "Events API" as event_api_in <> + portin "SDK API" as sdk_api_in <> + portin "Cloud Bucketing API" as cloud_bucketing_api_in <> + portin "Config CDN" as config_cdn_in <> + portin "Management API" as management_api_cf_in <> + portout "Events Firehose" as events_firehose_out <> + portout "Management API" as management_api_cf_out <> + + cloud "Cloudflare WAF" as cf_waf <> { + rectangle "Cloudflare Workers" as cloudflare_workers <> { + frame "Bucketing API" as bucketing_api <> + frame "Events API" as event_api <> + frame "SDK API" as sdk_api <> + } + } + + database "Config R2 Buckets" as config_cdn <> + queue "Events Firehose" as events_firehose <> + + ' Internal Cloudflare connections + config_cdn_in --> config_cdn + event_api_in --> event_api + sdk_api_in --> sdk_api + cloud_bucketing_api_in --> bucketing_api + management_api_cf_in --> cf_waf + cf_waf --> management_api_cf_out + sdk_api --> events_firehose + bucketing_api --> events_firehose + event_api --> events_firehose + events_firehose --> events_firehose_out +} + +rectangle "AWS Infrastructure" <> { + portin "Events Firehose" as events_firehose_in <> + portin "Management API" as management_api_in <> + queue "Kinesis Firehose" as events_firehose_aws <> + node "DevCycle Management API" as mgmt_api <> + + rectangle "MongoDB Cloud" <> { + database "MongoDB Atlas" as mongodb_db <> + } + + node "Snowflake Data Warehouse" as snowflake <> + + ' Internal AWS connections + events_firehose_in --> events_firehose_aws + events_firehose_aws --> snowflake + management_api_in --> mgmt_api + mgmt_api --> mongodb_db +} + +database "EdgeDB" as edgedb <> { + portin "Update/Queries" as edgedb_in <> +} + +' Customer to Cloudflare connections +customer_cloud_sdks --> cloud_bucketing_api_in +customer_mobile_web_sdks --> sdk_api_in +customer_local_sdks --> config_cdn_in +customer_local_sdks --> event_api_in + +' Management API connections through Cloudflare protection +management_api_clients --> management_api_cf_in + +' External integrations to Management API through Cloudflare protection +github_actions --> management_api_cf_in +gitlab_ci --> management_api_cf_in +bitbucket_pipelines --> management_api_cf_in + +' Cloudflare to AWS connections +events_firehose_out --> events_firehose_in +management_api_cf_out --> management_api_in + +' Cloudflare Workers to EdgeDB +cloudflare_workers --> edgedb_in + +@enduml \ No newline at end of file From d74a13b90f928d6947272198b11ae6b29dac4ade Mon Sep 17 00:00:00 2001 From: Jamie Sinn Date: Tue, 19 Aug 2025 11:11:46 -0400 Subject: [PATCH 2/8] update ref --- .github/workflows/diagrams.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/diagrams.yml b/.github/workflows/diagrams.yml index 9835ab3a..d7419d3d 100644 --- a/.github/workflows/diagrams.yml +++ b/.github/workflows/diagrams.yml @@ -21,7 +21,7 @@ jobs: echo "::set-output name=files::$(git diff --name-only HEAD^ HEAD | grep .puml | xargs)" - name: Generate SVG Diagrams - uses: holowinski/plantuml-github-action@main + uses: holowinski/plantuml-github-action@035fd446eb4b4a074d4a32a9d6ead9b344132f1e with: args: -v -tsvg "diagrams/**.puml" -o "../static/diagrams" From 494435ee498595dc8bb9a15073e7fe196b4272b7 Mon Sep 17 00:00:00 2001 From: Jamie Sinn Date: Tue, 19 Aug 2025 11:12:41 -0400 Subject: [PATCH 3/8] cleanup --- diagrams/architecture.puml | 1 - 1 file changed, 1 deletion(-) diff --git a/diagrams/architecture.puml b/diagrams/architecture.puml index 98b6ee77..98f65826 100644 --- a/diagrams/architecture.puml +++ b/diagrams/architecture.puml @@ -1,7 +1,6 @@ @startuml 'https://plantuml.com/deployment-diagram -!theme aws-orange skinparam backgroundColor #f8f9fa skinparam roundCorner 10 skinparam defaultFontColor #2c3e50 From 2a42357098fa14595abaac355d1cd80dabb74dbe Mon Sep 17 00:00:00 2001 From: JamieSinn Date: Tue, 19 Aug 2025 15:13:07 +0000 Subject: [PATCH 4/8] Generate SVG files for PlantUML diagrams --- static/diagrams/architecture.svg | 478 ++++++++++++++++++ static/diagrams/config-manager.svg | 139 ++++- static/diagrams/event-manager.svg | 67 ++- static/diagrams/server-sdk-initialization.svg | 143 +++++- 4 files changed, 824 insertions(+), 3 deletions(-) create mode 100644 static/diagrams/architecture.svg diff --git a/static/diagrams/architecture.svg b/static/diagrams/architecture.svg new file mode 100644 index 00000000..b3aa4f30 --- /dev/null +++ b/static/diagrams/architecture.svg @@ -0,0 +1,478 @@ +«customer»Customer Infrastructure«external»External Integrations«cloudflare»Cloudflare«waf»Cloudflare WAF«workers»Cloudflare Workers«aws»AWS Infrastructure«mongodb»MongoDB Cloud«edgedb»EdgeDB«sdk»DevCycle Cloud Bucketing SDKs«sdk»DevCycle Local Bucketing SDKs«sdk»DevCycle Mobile/Web SDKs«sdk»Management API Clients«integration»GitHub Actions«integration»GitLab CI/CD«integration»Atlassian Bitbucket Pipelines«integration»Atlassian JIRA«integration»SlackEvents APISDK APICloud Bucketing APIConfig CDNManagement APIEvents FirehoseManagement API«storage»Config R2 Buckets«events»Events Firehose«api»Bucketing API«api»Events API«api»SDK APIEvents FirehoseManagement API«kinesis»Kinesis Firehose«management»DevCycle Management API«snowflake»Snowflake Data Warehouse«mongo»MongoDB AtlasUpdate/Queries \ No newline at end of file diff --git a/static/diagrams/config-manager.svg b/static/diagrams/config-manager.svg index c82ab42e..b64281f5 100644 --- a/static/diagrams/config-manager.svg +++ b/static/diagrams/config-manager.svg @@ -1 +1,138 @@ -Config ManagerConstructor/InitializationStart Config Consolidation Threadnooptions.DisableRealtimeUpdatesyesConfig Polling ThreadPolling EnabledyesnoFetch ConfigSuccessyesnoUpdate ConfigSend Config Updated Event to EventHandlerRetry FetchnoRetryable ErroryesReturn error to EventHandlerCancel PollingPolling IntervalPolling EnabledyesConfig Consolidation ThreadEvent TypeNew Config AvailableFetch Config with minimum Last-Modified timestampConfig UpdatedDisable SSEUpdate SSE URLStart SSE ConnectionyesSSE URL is different than existing?noSSE Connection ErrorDisable SSEStart Polling ThreadSSE Connection SuccessDisable PollingEvent Received \ No newline at end of file +Config ManagerConstructor/InitializationStart Config Consolidation Threadnooptions.DisableRealtimeUpdatesyesConfig Polling ThreadPolling EnabledyesnoFetch ConfigSuccessyesnoUpdate ConfigSend Config Updated Event to EventHandlerRetry FetchnoRetryable ErroryesReturn error to EventHandlerCancel PollingPolling IntervalPolling EnabledyesConfig Consolidation ThreadEvent TypeNew Config AvailableFetch Config with minimum Last-Modified timestampConfig UpdatedDisable SSEUpdate SSE URLStart SSE ConnectionyesSSE URL is different than existing?noSSE Connection ErrorDisable SSEStart Polling ThreadSSE Connection SuccessDisable PollingEvent Received \ No newline at end of file diff --git a/static/diagrams/event-manager.svg b/static/diagrams/event-manager.svg index 1bcc349d..63d20208 100644 --- a/static/diagrams/event-manager.svg +++ b/static/diagrams/event-manager.svg @@ -1 +1,66 @@ -Event ManagerConstructor/InitializationStart Event Flush Threadnooptions.DisableAutomaticEventLogging and options.DisableCustomEventLoggingyesEvent Flush ThreadEvent TypeFlush IntervalForce FlushFlush Eventsnot Flush StopEvent ReceivedFlush Stop \ No newline at end of file +Event ManagerConstructor/Initializationoptions.DisableAutomaticEventLogging and options.DisableCustomEventLoggingyesnoStart Event Flush ThreadEvent Flush ThreadEvent TypeFlush IntervalForce FlushFlush Eventsnot Flush StopEvent ReceivedFlush Stop \ No newline at end of file diff --git a/static/diagrams/server-sdk-initialization.svg b/static/diagrams/server-sdk-initialization.svg index 0eb67720..12a3ea9c 100644 --- a/static/diagrams/server-sdk-initialization.svg +++ b/static/diagrams/server-sdk-initialization.svg @@ -1 +1,142 @@ -new DevCycleClient(sdkKey, options)Constructor/InitializationValid Server SDK Keyyesnooptions.UseLocalBucketingyesnoInitialize Config ManagerInitialize Config ManagerInitialize Event ManagerInitialize Event Manageroptions.ConfigEventHandler existsyesnoInitial Fetch ThreadFetch Initial ConfigSuccessyesnoInitialize ConfigRetryable ErroryesnoRetry Fetchreturn error to EventHandlerSend Initialized EventFetch Initial ConfigSuccessyesnoInitialize ConfigRetryable ErroryesnoRetry FetchThrow errorStart Config Polling Threadyesoptions.DisableRealtimeUpdatesnoSend Initialized Eventyesoptions.ConfigEventHandler existsnoSDK Key Validation FailedThrow errorReturn DevCycleClient \ No newline at end of file +new DevCycleClient(sdkKey, options)Constructor/InitializationValid Server SDK Keyyesnooptions.UseLocalBucketingyesnoInitialize Config ManagerInitialize Config ManagerInitialize Event ManagerInitialize Event Manageroptions.ConfigEventHandler existsyesnoInitial Fetch ThreadFetch Initial ConfigSuccessyesnoInitialize ConfigRetryable ErroryesnoRetry Fetchreturn error to EventHandlerSend Initialized EventFetch Initial ConfigSuccessyesnoInitialize ConfigRetryable ErroryesnoRetry FetchThrow errorStart Config Polling Threadyesoptions.DisableRealtimeUpdatesnoSend Initialized Eventyesoptions.ConfigEventHandler existsnoSDK Key Validation FailedThrow errorReturn DevCycleClient \ No newline at end of file From 5c1818f4ff1fe93ffb6e383c2af988f3ca9637be Mon Sep 17 00:00:00 2001 From: Jamie Sinn Date: Tue, 19 Aug 2025 11:23:02 -0400 Subject: [PATCH 5/8] update hash --- .github/workflows/diagrams.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/diagrams.yml b/.github/workflows/diagrams.yml index d7419d3d..70d5f8e2 100644 --- a/.github/workflows/diagrams.yml +++ b/.github/workflows/diagrams.yml @@ -21,7 +21,7 @@ jobs: echo "::set-output name=files::$(git diff --name-only HEAD^ HEAD | grep .puml | xargs)" - name: Generate SVG Diagrams - uses: holowinski/plantuml-github-action@035fd446eb4b4a074d4a32a9d6ead9b344132f1e + uses: holowinski/plantuml-github-action@2e381afb2bae7e169b76bfb068e8d8b2089106ee with: args: -v -tsvg "diagrams/**.puml" -o "../static/diagrams" From cf9be18e028fb27e0c67c8fa039d1ed15244af2e Mon Sep 17 00:00:00 2001 From: JamieSinn Date: Tue, 19 Aug 2025 15:23:40 +0000 Subject: [PATCH 6/8] Generate SVG files for PlantUML diagrams --- static/diagrams/architecture.svg | 479 +----------------- static/diagrams/config-manager.svg | 139 +---- static/diagrams/event-manager.svg | 67 +-- static/diagrams/server-sdk-initialization.svg | 143 +----- 4 files changed, 4 insertions(+), 824 deletions(-) diff --git a/static/diagrams/architecture.svg b/static/diagrams/architecture.svg index b3aa4f30..2a76118f 100644 --- a/static/diagrams/architecture.svg +++ b/static/diagrams/architecture.svg @@ -1,478 +1 @@ -«customer»Customer Infrastructure«external»External Integrations«cloudflare»Cloudflare«waf»Cloudflare WAF«workers»Cloudflare Workers«aws»AWS Infrastructure«mongodb»MongoDB Cloud«edgedb»EdgeDB«sdk»DevCycle Cloud Bucketing SDKs«sdk»DevCycle Local Bucketing SDKs«sdk»DevCycle Mobile/Web SDKs«sdk»Management API Clients«integration»GitHub Actions«integration»GitLab CI/CD«integration»Atlassian Bitbucket Pipelines«integration»Atlassian JIRA«integration»SlackEvents APISDK APICloud Bucketing APIConfig CDNManagement APIEvents FirehoseManagement API«storage»Config R2 Buckets«events»Events Firehose«api»Bucketing API«api»Events API«api»SDK APIEvents FirehoseManagement API«kinesis»Kinesis Firehose«management»DevCycle Management API«snowflake»Snowflake Data Warehouse«mongo»MongoDB AtlasUpdate/Queries \ No newline at end of file +«customer»Customer Infrastructure«external»External Integrations«cloudflare»Cloudflare«waf»Cloudflare WAF«workers»Cloudflare Workers«aws»AWS Infrastructure«mongodb»MongoDB Cloud«edgedb»EdgeDB«sdk»DevCycle Cloud Bucketing SDKs«sdk»DevCycle Local Bucketing SDKs«sdk»DevCycle Mobile/Web SDKs«sdk»Management API Clients«integration»GitHub Actions«integration»GitLab CI/CD«integration»Atlassian Bitbucket Pipelines«integration»Atlassian JIRA«integration»SlackEvents APISDK APICloud Bucketing APIConfig CDNManagement APIEvents FirehoseManagement API«storage»Config R2 Buckets«events»Events Firehose«api»Bucketing API«api»Events API«api»SDK APIEvents FirehoseManagement API«kinesis»Kinesis Firehose«management»DevCycle Management API«snowflake»Snowflake Data Warehouse«mongo»MongoDB AtlasUpdate/Queries \ No newline at end of file diff --git a/static/diagrams/config-manager.svg b/static/diagrams/config-manager.svg index b64281f5..2a96e68e 100644 --- a/static/diagrams/config-manager.svg +++ b/static/diagrams/config-manager.svg @@ -1,138 +1 @@ -Config ManagerConstructor/InitializationStart Config Consolidation Threadnooptions.DisableRealtimeUpdatesyesConfig Polling ThreadPolling EnabledyesnoFetch ConfigSuccessyesnoUpdate ConfigSend Config Updated Event to EventHandlerRetry FetchnoRetryable ErroryesReturn error to EventHandlerCancel PollingPolling IntervalPolling EnabledyesConfig Consolidation ThreadEvent TypeNew Config AvailableFetch Config with minimum Last-Modified timestampConfig UpdatedDisable SSEUpdate SSE URLStart SSE ConnectionyesSSE URL is different than existing?noSSE Connection ErrorDisable SSEStart Polling ThreadSSE Connection SuccessDisable PollingEvent Received \ No newline at end of file +Config ManagerConstructor/InitializationStart Config Consolidation Threadnooptions.DisableRealtimeUpdatesyesConfig Polling ThreadPolling EnabledyesnoFetch ConfigSuccessyesnoUpdate ConfigSend Config Updated Event to EventHandlerRetry FetchnoRetryable ErroryesReturn error to EventHandlerCancel PollingPolling IntervalPolling EnabledyesConfig Consolidation ThreadEvent TypeNew Config AvailableFetch Config with minimum Last-Modified timestampConfig UpdatedDisable SSEUpdate SSE URLStart SSE ConnectionyesSSE URL is different than existing?noSSE Connection ErrorDisable SSEStart Polling ThreadSSE Connection SuccessDisable PollingEvent Received \ No newline at end of file diff --git a/static/diagrams/event-manager.svg b/static/diagrams/event-manager.svg index 63d20208..37fda364 100644 --- a/static/diagrams/event-manager.svg +++ b/static/diagrams/event-manager.svg @@ -1,66 +1 @@ -Event ManagerConstructor/Initializationoptions.DisableAutomaticEventLogging and options.DisableCustomEventLoggingyesnoStart Event Flush ThreadEvent Flush ThreadEvent TypeFlush IntervalForce FlushFlush Eventsnot Flush StopEvent ReceivedFlush Stop \ No newline at end of file +Event ManagerConstructor/InitializationStart Event Flush Threadnooptions.DisableAutomaticEventLogging and options.DisableCustomEventLoggingyesEvent Flush ThreadEvent TypeFlush IntervalForce FlushFlush Eventsnot Flush StopEvent ReceivedFlush Stop \ No newline at end of file diff --git a/static/diagrams/server-sdk-initialization.svg b/static/diagrams/server-sdk-initialization.svg index 12a3ea9c..968a4f5c 100644 --- a/static/diagrams/server-sdk-initialization.svg +++ b/static/diagrams/server-sdk-initialization.svg @@ -1,142 +1 @@ -new DevCycleClient(sdkKey, options)Constructor/InitializationValid Server SDK Keyyesnooptions.UseLocalBucketingyesnoInitialize Config ManagerInitialize Config ManagerInitialize Event ManagerInitialize Event Manageroptions.ConfigEventHandler existsyesnoInitial Fetch ThreadFetch Initial ConfigSuccessyesnoInitialize ConfigRetryable ErroryesnoRetry Fetchreturn error to EventHandlerSend Initialized EventFetch Initial ConfigSuccessyesnoInitialize ConfigRetryable ErroryesnoRetry FetchThrow errorStart Config Polling Threadyesoptions.DisableRealtimeUpdatesnoSend Initialized Eventyesoptions.ConfigEventHandler existsnoSDK Key Validation FailedThrow errorReturn DevCycleClient \ No newline at end of file +new DevCycleClient(sdkKey, options)Constructor/InitializationValid Server SDK Keyyesnooptions.UseLocalBucketingyesnoInitialize Config ManagerInitialize Config ManagerInitialize Event ManagerInitialize Event Manageroptions.ConfigEventHandler existsyesnoInitial Fetch ThreadFetch Initial ConfigSuccessyesnoInitialize ConfigRetryable ErroryesnoRetry Fetchreturn error to EventHandlerSend Initialized EventFetch Initial ConfigSuccessyesnoInitialize ConfigRetryable ErroryesnoRetry FetchThrow errorStart Config Polling Threadyesoptions.DisableRealtimeUpdatesnoSend Initialized Eventyesoptions.ConfigEventHandler existsnoSDK Key Validation FailedThrow errorReturn DevCycleClient \ No newline at end of file From ab3018068559ef157c4227b90228d3e3f65a6218 Mon Sep 17 00:00:00 2001 From: Jamie Sinn Date: Tue, 19 Aug 2025 12:43:34 -0400 Subject: [PATCH 7/8] update diagram --- diagrams/architecture.puml | 169 +++++++++++++++++++++---------------- 1 file changed, 96 insertions(+), 73 deletions(-) diff --git a/diagrams/architecture.puml b/diagrams/architecture.puml index 98f65826..66e608e4 100644 --- a/diagrams/architecture.puml +++ b/diagrams/architecture.puml @@ -1,10 +1,12 @@ @startuml 'https://plantuml.com/deployment-diagram +!define DIRECTION top to bottom direction skinparam backgroundColor #f8f9fa skinparam roundCorner 10 skinparam defaultFontColor #2c3e50 skinparam defaultFontSize 11 +skinparam linetype ortho ' ================================ ' STYLING CLASSES @@ -99,10 +101,6 @@ skinparam portin<> { BackgroundColor #2ecc71 } -skinparam collections<> { - BackgroundColor #58d68d -} - ' ================================ ' ARROW STYLING ' ================================ @@ -124,96 +122,121 @@ skinparam class { ' ARCHITECTURE COMPONENTS ' ================================ -cloud "Customer Infrastructure" as customer_infra <> { - collections "DevCycle Cloud Bucketing SDKs" as customer_cloud_sdks <> - collections "DevCycle Local Bucketing SDKs" as customer_local_sdks <> - collections "DevCycle Mobile/Web SDKs" as customer_mobile_web_sdks <> - collections "Management API Clients" as management_api_clients <> -} +' Top Layer - Customer and External +together { + cloud "Customer Infrastructure" as customer_infra <> { + collections "Cloud Bucketing SDKs" as customer_cloud_sdks <> + collections "Local Bucketing SDKs" as customer_local_sdks <> + collections "Mobile/Web SDKs" as customer_mobile_web_sdks <> + collections "Management API Clients" as management_api_clients <> + } -cloud "External Integrations" <> { - node "GitHub Actions" as github_actions <> - node "GitLab CI/CD" as gitlab_ci <> - node "Atlassian Bitbucket Pipelines" as bitbucket_pipelines <> - node "Atlassian JIRA" as jira <> - node "Slack" as slack <> + cloud "External Integrations" <> { + node "GitHub Actions" as github_actions <> + node "GitLab CI/CD" as gitlab_ci <> + node "Bitbucket Pipelines" as bitbucket_pipelines <> + node "JIRA" as jira <> + node "Slack" as slack <> + } } -rectangle "Cloudflare" <> { - portin "Events API" as event_api_in <> - portin "SDK API" as sdk_api_in <> - portin "Cloud Bucketing API" as cloud_bucketing_api_in <> - portin "Config CDN" as config_cdn_in <> - portin "Management API" as management_api_cf_in <> - portout "Events Firehose" as events_firehose_out <> - portout "Management API" as management_api_cf_out <> +' Middle Layer - Cloudflare Edge +rectangle "Cloudflare Edge Layer" <> { + together { + portin "Events API" as event_api_in <> + portin "SDK API" as sdk_api_in <> + portin "Cloud Bucketing API" as cloud_bucketing_api_in <> + portin "Config CDN" as config_cdn_in <> + portin "Management API" as management_api_cf_in <> + } cloud "Cloudflare WAF" as cf_waf <> { - rectangle "Cloudflare Workers" as cloudflare_workers <> { + rectangle "Core Worker APIs" as cloudflare_workers <> { frame "Bucketing API" as bucketing_api <> frame "Events API" as event_api <> frame "SDK API" as sdk_api <> } } - database "Config R2 Buckets" as config_cdn <> - queue "Events Firehose" as events_firehose <> - - ' Internal Cloudflare connections - config_cdn_in --> config_cdn - event_api_in --> event_api - sdk_api_in --> sdk_api - cloud_bucketing_api_in --> bucketing_api - management_api_cf_in --> cf_waf - cf_waf --> management_api_cf_out - sdk_api --> events_firehose - bucketing_api --> events_firehose - event_api --> events_firehose - events_firehose --> events_firehose_out -} - -rectangle "AWS Infrastructure" <> { - portin "Events Firehose" as events_firehose_in <> - portin "Management API" as management_api_in <> - queue "Kinesis Firehose" as events_firehose_aws <> - node "DevCycle Management API" as mgmt_api <> - - rectangle "MongoDB Cloud" <> { - database "MongoDB Atlas" as mongodb_db <> + together { + database "Config R2 Buckets" as config_cdn <> + queue "Events Firehose" as events_firehose <> } - node "Snowflake Data Warehouse" as snowflake <> - - ' Internal AWS connections - events_firehose_in --> events_firehose_aws - events_firehose_aws --> snowflake - management_api_in --> mgmt_api - mgmt_api --> mongodb_db + together { + portout "Events Out" as events_firehose_out <> + portout "Management Out" as management_api_cf_out <> + } } +' Database Layer database "EdgeDB" as edgedb <> { - portin "Update/Queries" as edgedb_in <> + portin "Updates/Queries" as edgedb_in <> } -' Customer to Cloudflare connections -customer_cloud_sdks --> cloud_bucketing_api_in -customer_mobile_web_sdks --> sdk_api_in -customer_local_sdks --> config_cdn_in -customer_local_sdks --> event_api_in +' Backend Layer - AWS +rectangle "AWS Backend" <> { + together { + portin "Events In" as events_firehose_in <> + portin "Management In" as management_api_in <> + } -' Management API connections through Cloudflare protection -management_api_clients --> management_api_cf_in + together { + queue "Kinesis Firehose" as events_firehose_aws <> + node "Snowflake Warehouse" as snowflake <> + } -' External integrations to Management API through Cloudflare protection -github_actions --> management_api_cf_in -gitlab_ci --> management_api_cf_in -bitbucket_pipelines --> management_api_cf_in + node "Management API" as mgmt_api <> -' Cloudflare to AWS connections -events_firehose_out --> events_firehose_in -management_api_cf_out --> management_api_in + rectangle "MongoDB Cloud" <> { + database "MongoDB Atlas" as mongodb_db <> + } +} + +' ================================ +' CONNECTIONS - Organized by Layer +' ================================ -' Cloudflare Workers to EdgeDB -cloudflare_workers --> edgedb_in +' Customer/External to Cloudflare Entry +customer_cloud_sdks -down-> cloud_bucketing_api_in +customer_mobile_web_sdks -down-> sdk_api_in +customer_local_sdks -down-> config_cdn_in +customer_local_sdks -down-> event_api_in +management_api_clients -down-> management_api_cf_in +jira -down-> management_api_cf_in +slack -down-> management_api_cf_in + +github_actions -down-> management_api_cf_in +gitlab_ci -down-> management_api_cf_in +bitbucket_pipelines -down-> management_api_cf_in + +' Cloudflare Entry Points to Core APIs +config_cdn_in -down-> config_cdn +event_api_in -down-> event_api +sdk_api_in -down-> sdk_api +cloud_bucketing_api_in -down-> bucketing_api +management_api_cf_in -down-> cf_waf + +' Core API to Storage/Events +sdk_api -down-> events_firehose +bucketing_api -down-> events_firehose +event_api -down-> events_firehose + +' Core API to EdgeDB +cloudflare_workers -down-> edgedb_in + +' Events and Management Flow +events_firehose -down-> events_firehose_out +cf_waf -down-> management_api_cf_out + +' Cloudflare to AWS +events_firehose_out -down-> events_firehose_in +management_api_cf_out -down-> management_api_in + +' AWS Internal Flow +events_firehose_in -down-> events_firehose_aws +events_firehose_aws -down-> snowflake +management_api_in -down-> mgmt_api +mgmt_api -down-> mongodb_db @enduml \ No newline at end of file From 9ecd2811325db228c3e8cb8c1e64ddbebda19ffd Mon Sep 17 00:00:00 2001 From: JamieSinn Date: Tue, 19 Aug 2025 16:44:04 +0000 Subject: [PATCH 8/8] Generate SVG files for PlantUML diagrams --- static/diagrams/architecture.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/diagrams/architecture.svg b/static/diagrams/architecture.svg index 2a76118f..b47c419c 100644 --- a/static/diagrams/architecture.svg +++ b/static/diagrams/architecture.svg @@ -1 +1 @@ -«customer»Customer Infrastructure«external»External Integrations«cloudflare»Cloudflare«waf»Cloudflare WAF«workers»Cloudflare Workers«aws»AWS Infrastructure«mongodb»MongoDB Cloud«edgedb»EdgeDB«sdk»DevCycle Cloud Bucketing SDKs«sdk»DevCycle Local Bucketing SDKs«sdk»DevCycle Mobile/Web SDKs«sdk»Management API Clients«integration»GitHub Actions«integration»GitLab CI/CD«integration»Atlassian Bitbucket Pipelines«integration»Atlassian JIRA«integration»SlackEvents APISDK APICloud Bucketing APIConfig CDNManagement APIEvents FirehoseManagement API«storage»Config R2 Buckets«events»Events Firehose«api»Bucketing API«api»Events API«api»SDK APIEvents FirehoseManagement API«kinesis»Kinesis Firehose«management»DevCycle Management API«snowflake»Snowflake Data Warehouse«mongo»MongoDB AtlasUpdate/Queries \ No newline at end of file +«customer»Customer Infrastructure«external»External Integrations«cloudflare»Cloudflare Edge Layer«waf»Cloudflare WAF«workers»Core Worker APIs«edgedb»EdgeDB«aws»AWS Backend«mongodb»MongoDB Cloud«sdk»Cloud Bucketing SDKs«sdk»Local Bucketing SDKs«sdk»Mobile/Web SDKs«sdk»Management API Clients«integration»GitHub Actions«integration»GitLab CI/CD«integration»Bitbucket Pipelines«integration»JIRA«integration»SlackEvents APISDK APICloud Bucketing APIConfig CDNManagement API«storage»Config R2 Buckets«events»Events FirehoseEvents OutManagement Out«api»Bucketing API«api»Events API«api»SDK APIUpdates/QueriesEvents InManagement In«kinesis»Kinesis Firehose«snowflake»Snowflake Warehouse«management»Management API«mongo»MongoDB Atlas \ No newline at end of file