V13-FE-011: finalize search list layout slice

This commit is contained in:
2026-08-09 02:57:26 +09:00
parent 9efd202e76
commit 6422cb2b13
984 changed files with 120811 additions and 1498 deletions
@@ -0,0 +1,34 @@
# Generated KBX environment variable template. Do not commit real secret values.
KBX__Runtime__Environment=Development
KBX__Runtime__ReadOnly=false
ConnectionStrings__Main= # secret: inject from environment/secret store
KBX__Database__MigrationsMode=validate
KBX__Database__CommandTimeoutSeconds=30
KBX__Hangfire__Enabled=true
KBX__Hangfire__WorkerCount=4
KBX__SignalR__Enabled=true
KBX__Outbox__DispatcherEnabled=true
KBX__Inbox__CleanupEnabled=true
KBX__Integration__DispatcherEnabled=true
KBX__ExternalData__RefreshEnabled=true
KBX__ExternalData__ObservationRetentionEnabled=true
KBX__Experiments__Enabled=true
KBX__Logging__MinimumLevel=Information
KBX__Logging__JsonConsoleEnabled=true
KBX__Telemetry__Enabled=true
KBX__Telemetry__OtlpEndpoint=
KBX__Telegram__Enabled=false
KBX__Telegram__BotToken= # secret: inject from environment/secret store
KBX__Telegram__ChatId= # secret: inject from environment/secret store
ExternalProviders__Krx__Enabled=false
ExternalProviders__Krx__AuthKey= # secret: inject from environment/secret store
ExternalProviders__OpenDart__Enabled=false
ExternalProviders__OpenDart__ApiKey= # secret: inject from environment/secret store
ExternalProviders__Kis__Enabled=false
ExternalProviders__Kis__Environment=sandbox
ExternalProviders__Kis__AppKey= # secret: inject from environment/secret store
ExternalProviders__Kis__AppSecret= # secret: inject from environment/secret store
KBX__Security__RequireHttps=true
KBX__Health__ReadinessEnabled=true
KBX__Import__MaxUploadBytes=52428800
KBX__Import__MaxRows=100000
@@ -0,0 +1,25 @@
# KBX Deployment Contract
KBX v22는 **동일한 immutable artifact를 환경 간 승격**하고, 환경별 차이는 외부 Configuration/Secret으로 주입하는 것을 기본으로 합니다.
## 기본 승격 순서
```text
Build once
Static governance / unit / integration / canonical scenarios
Staging
↓ configuration validation
↓ migration dry-run + predeploy DbUp
↓ smoke / scenario evidence
Production
↓ configuration validation
↓ migration dry-run + predeploy DbUp
↓ same artifact promotion
```
Production에서 애플리케이션 시작 시 DB Schema를 자동 변경하지 않습니다.
Secret은 `.env`, `appsettings*.json`, generated manifest에 실제 값을 기록하지 않습니다. `deploy/kbx/*.example`은 key/shape만 보여주는 예제입니다.
@@ -0,0 +1,80 @@
{
"sourceSha256": "e09186d626b034a524b7cdf78f1e4bb6adbc112975b3baf4fd6194b1c1abd771",
"environments": [
{
"id": "Development",
"artifactPromotion": false,
"secretSources": [
"user-secrets",
"environment"
],
"migrationStrategy": "startup-apply-allowed",
"providerNetwork": "opt-in",
"requireHttps": false,
"providerEndpointOverrideAllowed": true,
"requiredGates": [
"static-governance"
]
},
{
"id": "Test",
"artifactPromotion": false,
"secretSources": [
"environment"
],
"migrationStrategy": "ephemeral-apply",
"providerNetwork": "forbidden",
"requireHttps": false,
"providerEndpointOverrideAllowed": true,
"requiredGates": [
"static-governance",
"build",
"unit",
"integration",
"scenario"
]
},
{
"id": "Staging",
"artifactPromotion": true,
"secretSources": [
"secret-store",
"environment"
],
"migrationStrategy": "predeploy",
"providerNetwork": "opt-in",
"requireHttps": true,
"providerEndpointOverrideAllowed": false,
"requiredGates": [
"static-governance",
"build",
"unit",
"integration",
"scenario",
"migration-dry-run"
]
},
{
"id": "Production",
"artifactPromotion": true,
"secretSources": [
"secret-store",
"environment"
],
"migrationStrategy": "predeploy",
"providerNetwork": "opt-in",
"requireHttps": true,
"providerEndpointOverrideAllowed": false,
"requiredGates": [
"static-governance",
"build",
"unit",
"integration",
"scenario",
"migration-dry-run",
"configuration-validation",
"release-governance"
]
}
]
}
@@ -0,0 +1,34 @@
# Generated Development example. Secret values intentionally blank.
KBX__Runtime__Environment=Development
KBX__Runtime__ReadOnly=false
ConnectionStrings__Main= # secret
KBX__Database__MigrationsMode=startup-apply
KBX__Database__CommandTimeoutSeconds=30
KBX__Hangfire__Enabled=true
KBX__Hangfire__WorkerCount=4
KBX__SignalR__Enabled=true
KBX__Outbox__DispatcherEnabled=true
KBX__Inbox__CleanupEnabled=true
KBX__Integration__DispatcherEnabled=true
KBX__ExternalData__RefreshEnabled=true
KBX__ExternalData__ObservationRetentionEnabled=true
KBX__Experiments__Enabled=true
KBX__Logging__MinimumLevel=Information
KBX__Logging__JsonConsoleEnabled=true
KBX__Telemetry__Enabled=true
KBX__Telemetry__OtlpEndpoint=
KBX__Telegram__Enabled=false
KBX__Telegram__BotToken= # secret
KBX__Telegram__ChatId= # secret
ExternalProviders__Krx__Enabled=false
ExternalProviders__Krx__AuthKey= # secret
ExternalProviders__OpenDart__Enabled=false
ExternalProviders__OpenDart__ApiKey= # secret
ExternalProviders__Kis__Enabled=false
ExternalProviders__Kis__Environment=sandbox
ExternalProviders__Kis__AppKey= # secret
ExternalProviders__Kis__AppSecret= # secret
KBX__Security__RequireHttps=false
KBX__Health__ReadinessEnabled=true
KBX__Import__MaxUploadBytes=52428800
KBX__Import__MaxRows=100000
@@ -0,0 +1,34 @@
# Generated Production example. Secret values intentionally blank.
KBX__Runtime__Environment=Production
KBX__Runtime__ReadOnly=false
ConnectionStrings__Main= # secret
KBX__Database__MigrationsMode=predeploy
KBX__Database__CommandTimeoutSeconds=30
KBX__Hangfire__Enabled=true
KBX__Hangfire__WorkerCount=4
KBX__SignalR__Enabled=true
KBX__Outbox__DispatcherEnabled=true
KBX__Inbox__CleanupEnabled=true
KBX__Integration__DispatcherEnabled=true
KBX__ExternalData__RefreshEnabled=true
KBX__ExternalData__ObservationRetentionEnabled=true
KBX__Experiments__Enabled=true
KBX__Logging__MinimumLevel=Information
KBX__Logging__JsonConsoleEnabled=true
KBX__Telemetry__Enabled=true
KBX__Telemetry__OtlpEndpoint=
KBX__Telegram__Enabled=false
KBX__Telegram__BotToken= # secret
KBX__Telegram__ChatId= # secret
ExternalProviders__Krx__Enabled=false
ExternalProviders__Krx__AuthKey= # secret
ExternalProviders__OpenDart__Enabled=false
ExternalProviders__OpenDart__ApiKey= # secret
ExternalProviders__Kis__Enabled=false
ExternalProviders__Kis__Environment=production
ExternalProviders__Kis__AppKey= # secret
ExternalProviders__Kis__AppSecret= # secret
KBX__Security__RequireHttps=true
KBX__Health__ReadinessEnabled=true
KBX__Import__MaxUploadBytes=52428800
KBX__Import__MaxRows=100000
@@ -0,0 +1,34 @@
# Generated Staging example. Secret values intentionally blank.
KBX__Runtime__Environment=Staging
KBX__Runtime__ReadOnly=false
ConnectionStrings__Main= # secret
KBX__Database__MigrationsMode=predeploy
KBX__Database__CommandTimeoutSeconds=30
KBX__Hangfire__Enabled=true
KBX__Hangfire__WorkerCount=4
KBX__SignalR__Enabled=true
KBX__Outbox__DispatcherEnabled=true
KBX__Inbox__CleanupEnabled=true
KBX__Integration__DispatcherEnabled=true
KBX__ExternalData__RefreshEnabled=true
KBX__ExternalData__ObservationRetentionEnabled=true
KBX__Experiments__Enabled=true
KBX__Logging__MinimumLevel=Information
KBX__Logging__JsonConsoleEnabled=true
KBX__Telemetry__Enabled=true
KBX__Telemetry__OtlpEndpoint=
KBX__Telegram__Enabled=false
KBX__Telegram__BotToken= # secret
KBX__Telegram__ChatId= # secret
ExternalProviders__Krx__Enabled=false
ExternalProviders__Krx__AuthKey= # secret
ExternalProviders__OpenDart__Enabled=false
ExternalProviders__OpenDart__ApiKey= # secret
ExternalProviders__Kis__Enabled=false
ExternalProviders__Kis__Environment=sandbox
ExternalProviders__Kis__AppKey= # secret
ExternalProviders__Kis__AppSecret= # secret
KBX__Security__RequireHttps=true
KBX__Health__ReadinessEnabled=true
KBX__Import__MaxUploadBytes=52428800
KBX__Import__MaxRows=100000
@@ -0,0 +1,34 @@
# Generated Test example. Secret values intentionally blank.
KBX__Runtime__Environment=Test
KBX__Runtime__ReadOnly=false
ConnectionStrings__Main= # secret
KBX__Database__MigrationsMode=startup-apply
KBX__Database__CommandTimeoutSeconds=30
KBX__Hangfire__Enabled=true
KBX__Hangfire__WorkerCount=4
KBX__SignalR__Enabled=true
KBX__Outbox__DispatcherEnabled=true
KBX__Inbox__CleanupEnabled=true
KBX__Integration__DispatcherEnabled=true
KBX__ExternalData__RefreshEnabled=true
KBX__ExternalData__ObservationRetentionEnabled=true
KBX__Experiments__Enabled=true
KBX__Logging__MinimumLevel=Information
KBX__Logging__JsonConsoleEnabled=true
KBX__Telemetry__Enabled=true
KBX__Telemetry__OtlpEndpoint=
KBX__Telegram__Enabled=false
KBX__Telegram__BotToken= # secret
KBX__Telegram__ChatId= # secret
ExternalProviders__Krx__Enabled=false
ExternalProviders__Krx__AuthKey= # secret
ExternalProviders__OpenDart__Enabled=false
ExternalProviders__OpenDart__ApiKey= # secret
ExternalProviders__Kis__Enabled=false
ExternalProviders__Kis__Environment=sandbox
ExternalProviders__Kis__AppKey= # secret
ExternalProviders__Kis__AppSecret= # secret
KBX__Security__RequireHttps=false
KBX__Health__ReadinessEnabled=true
KBX__Import__MaxUploadBytes=52428800
KBX__Import__MaxRows=100000
@@ -0,0 +1,27 @@
{
"Kbx:Runtime:Environment": "Development",
"Kbx:Runtime:ReadOnly": false,
"Kbx:Database:MigrationsMode": "validate",
"Kbx:Database:CommandTimeoutSeconds": 30,
"Kbx:Hangfire:Enabled": true,
"Kbx:Hangfire:WorkerCount": 4,
"Kbx:SignalR:Enabled": true,
"Kbx:Outbox:DispatcherEnabled": true,
"Kbx:Inbox:CleanupEnabled": true,
"Kbx:Integration:DispatcherEnabled": true,
"Kbx:ExternalData:RefreshEnabled": true,
"Kbx:ExternalData:ObservationRetentionEnabled": true,
"Kbx:Experiments:Enabled": true,
"Kbx:Logging:MinimumLevel": "Information",
"Kbx:Logging:JsonConsoleEnabled": true,
"Kbx:Telemetry:Enabled": true,
"Kbx:Telegram:Enabled": false,
"ExternalProviders:Krx:Enabled": false,
"ExternalProviders:OpenDart:Enabled": false,
"ExternalProviders:Kis:Enabled": false,
"ExternalProviders:Kis:Environment": "sandbox",
"Kbx:Security:RequireHttps": true,
"Kbx:Health:ReadinessEnabled": true,
"Kbx:Import:MaxUploadBytes": 52428800,
"Kbx:Import:MaxRows": 100000
}
@@ -0,0 +1,18 @@
{
"schemaVersion": "1.0",
"configurationSourceSha256": "e09186d626b034a524b7cdf78f1e4bb6adbc112975b3baf4fd6194b1c1abd771",
"immutableArtifact": true,
"environmentSpecificConfigurationExternal": true,
"promotionOrder": [
"Staging",
"Production"
],
"requiredEvidence": [
"generated/release-impact.json",
"generated/configuration-manifest.json",
"generated/test-scenario-manifest.json",
"generated/api-manifest.json",
"migration-dry-run-report",
"configuration-validation-report"
]
}