Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build-and-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ on:
branches:
- master
env:
VERSION: 10.0.2
VERSION: 10.0.3
jobs:
build-and-deploy:
runs-on: ubuntu-latest
Expand Down
4 changes: 2 additions & 2 deletions Api.Auth.External.Custom/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -133,8 +133,8 @@ The secrets defined in GitHub must also be mapped for the `Staging` and `Product

```yaml
env:
AUTH_JWT_PUBLIC_KEY: ${{ github.ref == 'refs/heads/master' && secrets.PRODUCTION_AUTH_JWT_PUBLIC_KEY || secrets.STAGING_AUTH_JWT_PUBLIC_KEY }}
AUTH_JWT_PRIVATE_KEY: ${{ github.ref == 'refs/heads/master' && secrets.PRODUCTION_AUTH_JWT_PRIVATE_KEY || secrets.STAGING_AUTH_JWT_PRIVATE_KEY }}
AUTH_JWT_PUBLIC_KEY: ${{ github.ref == 'refs/heads/main' && secrets.PRODUCTION_AUTH_JWT_PUBLIC_KEY || secrets.STAGING_AUTH_JWT_PUBLIC_KEY }}
AUTH_JWT_PRIVATE_KEY: ${{ github.ref == 'refs/heads/main' && secrets.PRODUCTION_AUTH_JWT_PRIVATE_KEY || secrets.STAGING_AUTH_JWT_PRIVATE_KEY }}
```

...and created during the Kubernetes deploy step.
4 changes: 2 additions & 2 deletions Api.Auth.RootLogin/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -133,8 +133,8 @@ The secrets defined in GitHub must also be mapped for the `Staging` and `Product

```yaml
env:
AUTH_JWT_PUBLIC_KEY: ${{ github.ref == 'refs/heads/master' && secrets.PRODUCTION_AUTH_JWT_PUBLIC_KEY || secrets.STAGING_AUTH_JWT_PUBLIC_KEY }}
AUTH_JWT_PRIVATE_KEY: ${{ github.ref == 'refs/heads/master' && secrets.PRODUCTION_AUTH_JWT_PRIVATE_KEY || secrets.STAGING_AUTH_JWT_PRIVATE_KEY }}
AUTH_JWT_PUBLIC_KEY: ${{ github.ref == 'refs/heads/main' && secrets.PRODUCTION_AUTH_JWT_PUBLIC_KEY || secrets.STAGING_AUTH_JWT_PUBLIC_KEY }}
AUTH_JWT_PRIVATE_KEY: ${{ github.ref == 'refs/heads/main' && secrets.PRODUCTION_AUTH_JWT_PRIVATE_KEY || secrets.STAGING_AUTH_JWT_PRIVATE_KEY }}
```

...and created during the Kubernetes deploy step.
2 changes: 1 addition & 1 deletion Api.Data.Identity.Auth.ApiKey/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ The secrets defined in GitHub must also be mapped for the `Staging` and `Product

```yaml
env:
AUTH_API_KEY_SECRET: ${{ github.ref == 'refs/heads/master' && secrets.PRODUCTION_AUTH_API_KEY_SECRET || secrets.STAGING_AUTH_API_KEY_SECRET }}
AUTH_API_KEY_SECRET: ${{ github.ref == 'refs/heads/main' && secrets.PRODUCTION_AUTH_API_KEY_SECRET || secrets.STAGING_AUTH_API_KEY_SECRET }}
```

...and created during the Kubernetes deploy step.
4 changes: 2 additions & 2 deletions Api.Data.Identity.Auth.Jwt/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -126,8 +126,8 @@ The secrets defined in GitHub must also be inbcluded in environmental variables

```yaml
env:
AUTH_JWT_PUBLIC_KEY: ${{ github.ref == 'refs/heads/master' && secrets.PRODUCTION_AUTH_JWT_PUBLIC_KEY || secrets.STAGING_AUTH_JWT_PUBLIC_KEY }}
AUTH_JWT_PRIVATE_KEY: ${{ github.ref == 'refs/heads/master' && secrets.PRODUCTION_AUTH_JWT_PRIVATE_KEY || secrets.STAGING_AUTH_JWT_PRIVATE_KEY }}
AUTH_JWT_PUBLIC_KEY: ${{ github.ref == 'refs/heads/main' && secrets.PRODUCTION_AUTH_JWT_PUBLIC_KEY || secrets.STAGING_AUTH_JWT_PUBLIC_KEY }}
AUTH_JWT_PRIVATE_KEY: ${{ github.ref == 'refs/heads/main' && secrets.PRODUCTION_AUTH_JWT_PRIVATE_KEY || secrets.STAGING_AUTH_JWT_PRIVATE_KEY }}
```

...and created during the Kubernetes deploy step.
4 changes: 2 additions & 2 deletions Api.Data.MySql/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -149,8 +149,8 @@ env:
AZURE_GROUP_DATABASE : ${{ vars.AZURE_RESOURCE_GROUP_DATABASE }}
SQL_NAME: nanoDb
SQL_USER: api-data-mysql-user
SQL_PASSWORD: ${{ github.ref == 'refs/heads/master' && secrets.PRODUCTION_SQL_NANO_DB_PASSWORD || secrets.STAGING_SQL_NANO_DB_PASSWORD }}
SQL_ADMIN_PASSWORD: ${{ github.ref == 'refs/heads/master' && secrets.PRODUCTION_SQL_ADMIN_PASSWORD || secrets.STAGING_SQL_ADMIN_PASSWORD }}
SQL_PASSWORD: ${{ github.ref == 'refs/heads/main' && secrets.PRODUCTION_SQL_NANO_DB_PASSWORD || secrets.STAGING_SQL_NANO_DB_PASSWORD }}
SQL_ADMIN_PASSWORD: ${{ github.ref == 'refs/heads/main' && secrets.PRODUCTION_SQL_ADMIN_PASSWORD || secrets.STAGING_SQL_ADMIN_PASSWORD }}
```

Additionally, this step has been added to ensure database migrations are applied, and the application database user has been created before the application is deployed.
Expand Down
4 changes: 2 additions & 2 deletions Api.Data.PostgreSQL/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -147,8 +147,8 @@ env:
AZURE_GROUP_DATABASE : ${{ vars.AZURE_RESOURCE_GROUP_DATABASE }}
SQL_NAME: nanoDb
SQL_USER: api-data-postgres-user
SQL_PASSWORD: ${{ github.ref == 'refs/heads/master' && secrets.PRODUCTION_SQL_NANO_DB_PASSWORD || secrets.STAGING_SQL_NANO_DB_PASSWORD }}
SQL_ADMIN_PASSWORD: ${{ github.ref == 'refs/heads/master' && secrets.PRODUCTION_SQL_ADMIN_PASSWORD || secrets.STAGING_SQL_ADMIN_PASSWORD }}
SQL_PASSWORD: ${{ github.ref == 'refs/heads/main' && secrets.PRODUCTION_SQL_NANO_DB_PASSWORD || secrets.STAGING_SQL_NANO_DB_PASSWORD }}
SQL_ADMIN_PASSWORD: ${{ github.ref == 'refs/heads/main' && secrets.PRODUCTION_SQL_ADMIN_PASSWORD || secrets.STAGING_SQL_ADMIN_PASSWORD }}
```

Additionally, this step has been added to ensure database migrations are applied, and the application database user has been created before the application is deployed.
Expand Down
10 changes: 10 additions & 0 deletions Api.Data.SqlServer.Spatial/.azure/.diagnostic-settings/logs.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[
{
"category": "QueryStoreRuntimeStatistics",
"enabled": true
},
{
"category": "SQLSecurityAuditEvents",
"enabled": true
}
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[
{
"category": "AllMetrics",
"enabled": true,
"timeGrain": "PT1M"
}
]
111 changes: 111 additions & 0 deletions Api.Data.SqlServer.Spatial/.github/workflows/build-and-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ env:
AZURE_GROUP_KUBERNETES: ${{ vars.AZURE_RESOURCE_GROUP_KUBERNETES }}
AZURE_GROUP_DELIVERY: ${{ vars.AZURE_RESOURCE_GROUP_DELIVERY }}
AZURE_GROUP_DATABASE : ${{ vars.AZURE_RESOURCE_GROUP_DATABASE }}
AZURE_GROUP_LOGS: ${{ vars.AZURE_RESOURCE_GROUP_LOGS }}
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
Expand All @@ -37,6 +38,10 @@ env:
KUBERNETES_CPU_LIMIT: 600m
KUBERNETES_CPU_SCALING: 180
ASPNETCORE_ENVIRONMENT: ${{ github.ref == 'refs/heads/main' && 'Production' || 'Staging' }}
SQL_SERVICE_OBJECTIVE: GP_Gen5_2
SQL_EDITION: GeneralPurpose
SQL_MAX_SIZE: 64GB
SQL_BACKUP_RETENTION: 35
SQL_NAME: nanoDb
SQL_USER: api-data-sqlserver-user
SQL_PASSWORD: ${{ github.ref == 'refs/heads/main' && secrets.PRODUCTION_SQL_NANO_DB_PASSWORD || secrets.STAGING_SQL_NANO_DB_PASSWORD }}
Expand Down Expand Up @@ -124,6 +129,112 @@ jobs:

echo "CONTAINER_REGISTRY_HOST=$env:CONTAINER_REGISTRY_HOST" >> $env:GITHUB_ENV;

- name: Create Database
shell: pwsh
run: |
$env:SQL_SERVER_NAME = az sql server list -g $env:AZURE_GROUP_DATABASE --query "[0].name" -o tsv;
$env:SQL_DB_EXISTS = az sql db show -g $env:AZURE_GROUP_DATABASE -s $env:SQL_SERVER_NAME -n $env:SQL_NAME --query name -o tsv 2>$null;

if (-not $env:SQL_DB_EXISTS)
{
az sql db create `
-n $env:SQL_NAME `
-s $env:SQL_SERVER_NAME `
-g $env:AZURE_GROUP_DATABASE `
--edition $env:SQL_EDITION `
--service-objective $env:SQL_SERVICE_OBJECTIVE `
--max-size $env:SQL_MAX_SIZE `
--backup-storage-redundancy Geo `
--zone-redundant true;

$env:MAINTENANCE_CONFIG_ID = az maintenance public-configuration list --query "[?name=='SQL_Default_1'].id" -o tsv;

az sql db update `
-n $env:SQL_NAME `
-s $env:SQL_SERVER_NAME `
-g $env:AZURE_GROUP_DATABASE `
--maint-config-id $env:MAINTENANCE_CONFIG_ID;

$env:DIAGNOSTIC_SETTINGS_NAME = "diagnostics-" + $env:SQL_NAME;
$env:WORKSPACE_ID = az monitor log-analytics workspace list -g $env:AZURE_GROUP_LOGS --query [0].[id] -o tsv;
$env:SQLDB_ID = az sql db show -g $env:AZURE_GROUP_DATABASE -s $env:SQL_SERVER_NAME -n $env:SQL_NAME --query id -o tsv;

az monitor diagnostic-settings create `
--name $env:DIAGNOSTIC_SETTINGS_NAME `
--resource $env:SQLDB_ID `
--workspace $env:WORKSPACE_ID `
--logs '@.azure/.diagnostic-settings/logs.json' `
--metrics '@.azure/.diagnostic-settings/metrics.json';

$env:ACTION_GROUP = az monitor action-group list -g $env:AZURE_GROUP_LOGS --query [0].[id] -o tsv;

az monitor metrics alert create `
--name "High CPU Usage" `
--resource-group $env:AZURE_GROUP_DATABASE `
--scopes $env:SQLDB_ID `
--condition "avg cpu_percent > 80" `
--window-size PT5M `
--evaluation-frequency PT1M `
--action $env:ACTION_GROUP `
--severity 2 `
--description "Alert when CPU usage is above 80% for 5 minutes.";

az monitor metrics alert create `
--name "High Memory/Worker Usage" `
--resource-group $env:AZURE_GROUP_DATABASE `
--scopes $env:SQLDB_ID `
--condition "avg workers_percent > 80" `
--window-size PT5M `
--evaluation-frequency PT1M `
--action $env:ACTION_GROUP `
--severity 2 `
--description "Alert when worker/session usage is above 80% for 5 minutes.";

az monitor metrics alert create `
--name "High Number Of Connections" `
--resource-group $env:AZURE_GROUP_DATABASE `
--scopes $env:SQLDB_ID `
--condition "total connection_successful > 100" `
--window-size PT5M `
--evaluation-frequency PT1M `
--action $env:ACTION_GROUP `
--severity 2 `
--description "Alert when the number of successful connections exceeds 100 in 5 minutes.";

az monitor metrics alert create `
--name "High Storage IO" `
--resource-group $env:AZURE_GROUP_DATABASE `
--scopes $env:SQLDB_ID `
--condition "avg io_consumption_percent > 80" `
--window-size PT5M `
--evaluation-frequency PT1M `
--action $env:ACTION_GROUP `
--severity 2 `
--description "Alert when Storage IO consumption is above 80% for 5 minutes.";

az monitor metrics alert create `
--name "High Storage Percent" `
--resource-group $env:AZURE_GROUP_DATABASE `
--scopes $env:SQLDB_ID `
--condition "avg storage_percent > 80" `
--window-size PT5M `
--evaluation-frequency PT1M `
--action $env:ACTION_GROUP `
--severity 2 `
--description "Alert when Storage usage exceeds 80% for 5 minutes.";

az sql db str-policy set `
-g $env:AZURE_GROUP_DATABASE `
-s $env:SQL_SERVER_NAME `
-n $env:SQL_NAME `
--retention-days $env:SQL_BACKUP_RETENTION;

if ($LastExitCode -ne 0)
{
throw "error";
};
};

- name: Database Migration & User
shell: pwsh
run: |
Expand Down
10 changes: 10 additions & 0 deletions Api.Data.SqlServer/.azure/.diagnostic-settings/logs.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[
{
"category": "QueryStoreRuntimeStatistics",
"enabled": true
},
{
"category": "SQLSecurityAuditEvents",
"enabled": true
}
]
7 changes: 7 additions & 0 deletions Api.Data.SqlServer/.azure/.diagnostic-settings/metrics.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[
{
"category": "AllMetrics",
"enabled": true,
"timeGrain": "PT1M"
}
]
111 changes: 111 additions & 0 deletions Api.Data.SqlServer/.github/workflows/build-and-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ env:
AZURE_GROUP_KUBERNETES: ${{ vars.AZURE_RESOURCE_GROUP_KUBERNETES }}
AZURE_GROUP_DELIVERY: ${{ vars.AZURE_RESOURCE_GROUP_DELIVERY }}
AZURE_GROUP_DATABASE : ${{ vars.AZURE_RESOURCE_GROUP_DATABASE }}
AZURE_GROUP_LOGS: ${{ vars.AZURE_RESOURCE_GROUP_LOGS }}
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
Expand All @@ -37,6 +38,10 @@ env:
KUBERNETES_CPU_LIMIT: 600m
KUBERNETES_CPU_SCALING: 180
ASPNETCORE_ENVIRONMENT: ${{ github.ref == 'refs/heads/main' && 'Production' || 'Staging' }}
SQL_SERVICE_OBJECTIVE: GP_Gen5_2
SQL_EDITION: GeneralPurpose
SQL_MAX_SIZE: 64GB
SQL_BACKUP_RETENTION: 35
SQL_NAME: nanoDb
SQL_USER: api-data-sqlserver-user
SQL_PASSWORD: ${{ github.ref == 'refs/heads/main' && secrets.PRODUCTION_SQL_NANO_DB_PASSWORD || secrets.STAGING_SQL_NANO_DB_PASSWORD }}
Expand Down Expand Up @@ -124,6 +129,112 @@ jobs:

echo "CONTAINER_REGISTRY_HOST=$env:CONTAINER_REGISTRY_HOST" >> $env:GITHUB_ENV;

- name: Create Database
shell: pwsh
run: |
$env:SQL_SERVER_NAME = az sql server list -g $env:AZURE_GROUP_DATABASE --query "[0].name" -o tsv;
$env:SQL_DB_EXISTS = az sql db show -g $env:AZURE_GROUP_DATABASE -s $env:SQL_SERVER_NAME -n $env:SQL_NAME --query name -o tsv 2>$null;

if (-not $env:SQL_DB_EXISTS)
{
az sql db create `
-n $env:SQL_NAME `
-s $env:SQL_SERVER_NAME `
-g $env:AZURE_GROUP_DATABASE `
--edition $env:SQL_EDITION `
--service-objective $env:SQL_SERVICE_OBJECTIVE `
--max-size $env:SQL_MAX_SIZE `
--backup-storage-redundancy Geo `
--zone-redundant true;

$env:MAINTENANCE_CONFIG_ID = az maintenance public-configuration list --query "[?name=='SQL_Default_1'].id" -o tsv;

az sql db update `
-n $env:SQL_NAME `
-s $env:SQL_SERVER_NAME `
-g $env:AZURE_GROUP_DATABASE `
--maint-config-id $env:MAINTENANCE_CONFIG_ID;

$env:DIAGNOSTIC_SETTINGS_NAME = "diagnostics-" + $env:SQL_NAME;
$env:WORKSPACE_ID = az monitor log-analytics workspace list -g $env:AZURE_GROUP_LOGS --query [0].[id] -o tsv;
$env:SQLDB_ID = az sql db show -g $env:AZURE_GROUP_DATABASE -s $env:SQL_SERVER_NAME -n $env:SQL_NAME --query id -o tsv;

az monitor diagnostic-settings create `
--name $env:DIAGNOSTIC_SETTINGS_NAME `
--resource $env:SQLDB_ID `
--workspace $env:WORKSPACE_ID `
--logs '@.azure/.diagnostic-settings/logs.json' `
--metrics '@.azure/.diagnostic-settings/metrics.json';

$env:ACTION_GROUP = az monitor action-group list -g $env:AZURE_GROUP_LOGS --query [0].[id] -o tsv;

az monitor metrics alert create `
--name "High CPU Usage" `
--resource-group $env:AZURE_GROUP_DATABASE `
--scopes $env:SQLDB_ID `
--condition "avg cpu_percent > 80" `
--window-size PT5M `
--evaluation-frequency PT1M `
--action $env:ACTION_GROUP `
--severity 2 `
--description "Alert when CPU usage is above 80% for 5 minutes.";

az monitor metrics alert create `
--name "High Memory/Worker Usage" `
--resource-group $env:AZURE_GROUP_DATABASE `
--scopes $env:SQLDB_ID `
--condition "avg workers_percent > 80" `
--window-size PT5M `
--evaluation-frequency PT1M `
--action $env:ACTION_GROUP `
--severity 2 `
--description "Alert when worker/session usage is above 80% for 5 minutes.";

az monitor metrics alert create `
--name "High Number Of Connections" `
--resource-group $env:AZURE_GROUP_DATABASE `
--scopes $env:SQLDB_ID `
--condition "total connection_successful > 100" `
--window-size PT5M `
--evaluation-frequency PT1M `
--action $env:ACTION_GROUP `
--severity 2 `
--description "Alert when the number of successful connections exceeds 100 in 5 minutes.";

az monitor metrics alert create `
--name "High Storage IO" `
--resource-group $env:AZURE_GROUP_DATABASE `
--scopes $env:SQLDB_ID `
--condition "avg io_consumption_percent > 80" `
--window-size PT5M `
--evaluation-frequency PT1M `
--action $env:ACTION_GROUP `
--severity 2 `
--description "Alert when Storage IO consumption is above 80% for 5 minutes.";

az monitor metrics alert create `
--name "High Storage Percent" `
--resource-group $env:AZURE_GROUP_DATABASE `
--scopes $env:SQLDB_ID `
--condition "avg storage_percent > 80" `
--window-size PT5M `
--evaluation-frequency PT1M `
--action $env:ACTION_GROUP `
--severity 2 `
--description "Alert when Storage usage exceeds 80% for 5 minutes.";

az sql db str-policy set `
-g $env:AZURE_GROUP_DATABASE `
-s $env:SQL_SERVER_NAME `
-n $env:SQL_NAME `
--retention-days $env:SQL_BACKUP_RETENTION;

if ($LastExitCode -ne 0)
{
throw "error";
};
};

- name: Database Migration & User
shell: pwsh
run: |
Expand Down
Loading