diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 8ecd8fb62..a641af09c 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -111,13 +111,25 @@ jobs: echo "waiting on revision ${revision}" dump_revision_logs() { - echo "----- revision ${revision} console logs -----" - az containerapp logs show \ + echo "----- revision ${revision} details -----" + az containerapp revision show \ --name "${{ vars.AZURE_CONTAINERAPP_NAME }}" \ --resource-group "${{ vars.AZURE_RESOURCE_GROUP }}" \ --revision "$revision" \ + --query "{state:properties.runningState,health:properties.healthState,replicas:properties.replicas,image:properties.template.containers[0].image}" \ + -o json || true + echo "----- console logs (app) -----" + az containerapp logs show \ + --name "${{ vars.AZURE_CONTAINERAPP_NAME }}" \ + --resource-group "${{ vars.AZURE_RESOURCE_GROUP }}" \ --type console \ --tail 120 || true + echo "----- system logs -----" + az containerapp logs show \ + --name "${{ vars.AZURE_CONTAINERAPP_NAME }}" \ + --resource-group "${{ vars.AZURE_RESOURCE_GROUP }}" \ + --type system \ + --tail 80 || true } for attempt in $(seq 1 40); do diff --git a/src/Aspire/DigitalBrain.Aspire/DigitalBrainRuntimeHostingExtensions.cs b/src/Aspire/DigitalBrain.Aspire/DigitalBrainRuntimeHostingExtensions.cs index 05325c848..f8b5f3fa1 100644 --- a/src/Aspire/DigitalBrain.Aspire/DigitalBrainRuntimeHostingExtensions.cs +++ b/src/Aspire/DigitalBrain.Aspire/DigitalBrainRuntimeHostingExtensions.cs @@ -1,6 +1,8 @@ +using Azure.Data.Tables; using DigitalBrain.Abstractions; using DigitalBrain.Core; using DigitalBrain.ServiceDefaults; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Orleans.Configuration; @@ -31,6 +33,7 @@ public static IHostApplicationBuilder AddDigitalBrain( builder.AddKeyedAzureBlobServiceClient(DigitalBrainNames.GrainState); builder.UseOrleans(silo => { + ConfigureStandaloneAzureClustering(silo, builder.Configuration); silo.Services.AddKeyedSingleton( DigitalBrainNames.DefaultGrainStorage, static (services, _) => new OrleansGrainStorageSerializer( @@ -48,4 +51,36 @@ public static IHostApplicationBuilder AddDigitalBrain( builder.AddDigitalBrainOwner(activateOnStart: false); return builder; } + + // Aspire AppHost injects Orleans:Clustering:ProviderType via WithClustering. Published + // containers set DigitalBrain:Standalone and may only have ConnectionStrings:* — wire + // Azure membership/reminders explicitly so the silo does not depend on Aspire DCP env. + private static void ConfigureStandaloneAzureClustering(ISiloBuilder silo, IConfiguration configuration) + { + var standalone = configuration.GetValue("DigitalBrain:Standalone", false); + if (!standalone && !string.IsNullOrWhiteSpace(configuration["Orleans:Clustering:ProviderType"])) + { + return; + } + + var clustering = configuration.GetConnectionString(DigitalBrainNames.Clustering); + if (string.IsNullOrWhiteSpace(clustering)) + { + if (standalone) + { + throw new InvalidOperationException( + $"Missing connection string '{DigitalBrainNames.Clustering}'. " + + "Standalone hosts require Azure Table clustering."); + } + + return; + } + + silo.UseAzureStorageClustering(options => + options.TableServiceClient = new TableServiceClient(clustering)); + + var reminders = configuration.GetConnectionString(DigitalBrainNames.Reminders) + ?? clustering; + silo.UseAzureTableReminderService(reminders); + } } diff --git a/src/Kernel/DigitalBrain.Silo/Properties/PublishProfiles/Container.pubxml b/src/Kernel/DigitalBrain.Silo/Properties/PublishProfiles/Container.pubxml index e51a50c96..b3e2e9f50 100644 --- a/src/Kernel/DigitalBrain.Silo/Properties/PublishProfiles/Container.pubxml +++ b/src/Kernel/DigitalBrain.Silo/Properties/PublishProfiles/Container.pubxml @@ -10,6 +10,7 @@ +