From a7f9b27a550f0887719c6c6762dd5c019732a384 Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Sun, 12 Jul 2026 12:16:22 +0900 Subject: [PATCH] fix: require production database connection environment --- .gitea/workflows/deploy-prod.yml | 11 +++++++---- src/dotnet/QuantEngine.Web/Program.cs | 6 ++++++ .../QuantEngine.Web/appsettings.Development.json | 2 +- src/dotnet/QuantEngine.Web/appsettings.json | 2 +- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/.gitea/workflows/deploy-prod.yml b/.gitea/workflows/deploy-prod.yml index 23cce7bd..d7cb00d2 100644 --- a/.gitea/workflows/deploy-prod.yml +++ b/.gitea/workflows/deploy-prod.yml @@ -204,12 +204,15 @@ jobs: echo "ERROR: QuantEngine.Web.dll not found" exit 1 fi - if [ ! -f "$DEPLOY_DIR/appsettings.Production.json" ]; then - echo "ERROR: appsettings.Production.json not found" + echo "✓ DLL verified" + # Production connection settings must come from the service + # EnvironmentFile, never from a versioned appsettings file. + SERVICE_ENV=$(sudo systemctl show "$SERVICE_NAME" -p EnvironmentFiles --value 2>/dev/null || true) + if [ -z "$SERVICE_ENV" ]; then + echo "ERROR: $SERVICE_NAME has no EnvironmentFile; database credentials are not configured" exit 1 fi - echo "✓ DLL verified" - echo "✓ Config verified" + echo "✓ External service environment configured" # 3. Update Symlink echo "" diff --git a/src/dotnet/QuantEngine.Web/Program.cs b/src/dotnet/QuantEngine.Web/Program.cs index 77b95202..a595a09f 100644 --- a/src/dotnet/QuantEngine.Web/Program.cs +++ b/src/dotnet/QuantEngine.Web/Program.cs @@ -81,6 +81,12 @@ try // PostgreSQL Dapper Setup var connectionString = builder.Configuration.GetConnectionString("DefaultConnection") ?? throw new InvalidOperationException("Connection string 'DefaultConnection' is required."); + if (builder.Environment.IsProduction() + && string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("ConnectionStrings__DefaultConnection"))) + { + throw new InvalidOperationException( + "Production requires ConnectionStrings__DefaultConnection from the service environment."); + } var configuredDatabase = new NpgsqlConnectionStringBuilder(connectionString).Database; if (!string.Equals(configuredDatabase, "quantenginedb", StringComparison.OrdinalIgnoreCase)) diff --git a/src/dotnet/QuantEngine.Web/appsettings.Development.json b/src/dotnet/QuantEngine.Web/appsettings.Development.json index 13a9204f..672ad901 100644 --- a/src/dotnet/QuantEngine.Web/appsettings.Development.json +++ b/src/dotnet/QuantEngine.Web/appsettings.Development.json @@ -6,7 +6,7 @@ } }, "ConnectionStrings": { - "DefaultConnection": "Host=127.0.0.1;Database=quantenginedb;Username=quantengine_app;Password=quantengine_app;Search Path=quantengine;" + "DefaultConnection": "Host=127.0.0.1;Database=quantenginedb;Username=quantengine_app;Search Path=quantengine;" }, "AllowedHosts": "*", "AdminSettings": { diff --git a/src/dotnet/QuantEngine.Web/appsettings.json b/src/dotnet/QuantEngine.Web/appsettings.json index e5e821d6..9b2d989a 100644 --- a/src/dotnet/QuantEngine.Web/appsettings.json +++ b/src/dotnet/QuantEngine.Web/appsettings.json @@ -7,7 +7,7 @@ }, "AllowedHosts": "*", "ConnectionStrings": { - "DefaultConnection": "Host=127.0.0.1;Database=quantenginedb;Username=quantengine_app;Password=quantengine_app;Search Path=quantengine;" + "DefaultConnection": "Host=127.0.0.1;Database=quantenginedb;Username=quantengine_app;Search Path=quantengine;" }, "AdminSettings": { "Username": "admin",