From 72cc0bd76539febcf63836ee807ccf4c3a2e9c2b Mon Sep 17 00:00:00 2001 From: suguanYang Date: Thu, 13 Aug 2026 15:20:26 +0800 Subject: [PATCH] fix: preserve staging ECS configuration --- deploy/ecs/task-definition-api.staging.json | 11 ++- .../ecs/task-definition-worker.staging.json | 23 +++++- deploy/ecs/test_render_task_definitions.py | 74 +++++++++++++++++++ 3 files changed, 103 insertions(+), 5 deletions(-) diff --git a/deploy/ecs/task-definition-api.staging.json b/deploy/ecs/task-definition-api.staging.json index 403f44dc..71025dd3 100644 --- a/deploy/ecs/task-definition-api.staging.json +++ b/deploy/ecs/task-definition-api.staging.json @@ -27,15 +27,24 @@ {"name": "ENVIRONMENT", "value": "staging"}, {"name": "APP_ENV", "value": "staging"}, {"name": "DB_SSL_MODE", "value": "require"}, - {"name": "TMP_PATH", "value": "/tmp/knowhere"}, + {"name": "DB_POOL_SIZE", "value": "5"}, + {"name": "DB_MAX_OVERFLOW", "value": "5"}, + {"name": "TMP_PATH", "value": "/tmp/aismart_bid"}, {"name": "S3_TYPE", "value": "s3"}, {"name": "S3_BUCKET_NAME", "value": "knowhere-storage-staging"}, {"name": "S3_RESULTS_BUCKET", "value": "knowhere-storage-staging"}, + {"name": "S3_TEMP_PATH", "value": "/tmp"}, {"name": "S3_REGION", "value": "us-east-1"}, {"name": "S3_USE_SSL", "value": "true"}, {"name": "S3_ADDRESSING_STYLE", "value": "virtual"}, + {"name": "SUPPORTED_EXTENSIONS", "value": ".doc,.docx,.pdf,.txt,.xls,.xlsx,.csv,.jpg,.jpeg,.png,.pptx,.md"}, {"name": "REDIS_DATABASE", "value": "0"}, {"name": "REDIS_SSL", "value": "true"}, + {"name": "BROKER_POOL_LIMIT", "value": "5"}, + {"name": "DS_URL", "value": "https://api.deepseek.com/v1/chat/completions"}, + {"name": "ALI_URL", "value": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions"}, + {"name": "ARK_URL", "value": "https://ark.cn-beijing.volces.com/api/v3/chat/completions"}, + {"name": "EMBEDDING_MODEL", "value": "text-embedding-v4"}, {"name": "RATE_LIMIT_ENABLED", "value": "true"}, {"name": "TELEMETRY_ENABLED", "value": "false"}, {"name": "API_STANDALONE_MODE_ENABLED", "value": "true"}, diff --git a/deploy/ecs/task-definition-worker.staging.json b/deploy/ecs/task-definition-worker.staging.json index e1044482..0ece2fb7 100644 --- a/deploy/ecs/task-definition-worker.staging.json +++ b/deploy/ecs/task-definition-worker.staging.json @@ -22,15 +22,25 @@ {"name": "APP_ENV", "value": "staging"}, {"name": "REMAP_SIGTERM", "value": "SIGQUIT"}, {"name": "DB_SSL_MODE", "value": "require"}, - {"name": "TMP_PATH", "value": "/tmp/knowhere"}, + {"name": "DB_SYNC_POOL_SIZE", "value": "2"}, + {"name": "DB_SYNC_MAX_OVERFLOW", "value": "2"}, + {"name": "TMP_PATH", "value": "/tmp/aismart_bid"}, {"name": "S3_TYPE", "value": "s3"}, {"name": "S3_BUCKET_NAME", "value": "knowhere-storage-staging"}, {"name": "S3_RESULTS_BUCKET", "value": "knowhere-storage-staging"}, + {"name": "S3_TEMP_PATH", "value": "/tmp"}, {"name": "S3_REGION", "value": "us-east-1"}, {"name": "S3_USE_SSL", "value": "true"}, {"name": "S3_ADDRESSING_STYLE", "value": "virtual"}, + {"name": "SUPPORTED_EXTENSIONS", "value": ".doc,.docx,.pdf,.txt,.xls,.xlsx,.csv,.jpg,.jpeg,.png,.pptx,.md"}, + {"name": "MAX_PDF_PAGE_LIMIT", "value": "200"}, + {"name": "OVERSIZED_PDF_SHARD_ENABLED", "value": "true"}, + {"name": "OVERSIZED_PDF_SOFT_LIMIT", "value": "1500"}, + {"name": "PDF_PROFILE_TOC_ENABLED", "value": "true"}, {"name": "REDIS_DATABASE", "value": "0"}, {"name": "REDIS_SSL", "value": "true"}, + {"name": "REDIS_SYNC_MAX_CONNECTIONS", "value": "200"}, + {"name": "BROKER_POOL_LIMIT", "value": "5"}, {"name": "AWS_REGION", "value": "us-east-1"}, {"name": "AWS_ACCOUNT_ID", "value": "107424103509"}, {"name": "RATE_LIMIT_ENABLED", "value": "false"}, @@ -43,10 +53,15 @@ {"name": "TRANSFORMERS_CACHE", "value": "/mnt/models/huggingface"}, {"name": "BILLING_ENABLED", "value": "true"}, {"name": "SUMMARY_LLM_MAX_CONCURRENT", "value": "8"}, + {"name": "DS_URL", "value": "https://api.deepseek.com/v1/chat/completions"}, + {"name": "ALI_URL", "value": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions"}, + {"name": "ARK_URL", "value": "https://ark.cn-beijing.volces.com/api/v3/chat/completions"}, + {"name": "EMBEDDING_MODEL", "value": "text-embedding-v4"}, {"name": "HIERARCHY_LLM_MODEL", "value": "deepseek-chat"}, - {"name": "NORMOL_MODEL", "value": "deepseek-v4-flash"}, - {"name": "IMAGE_MODEL", "value": "qwen3.6-flash"}, - {"name": "IMAGE_MODEL_MAX", "value": "qwen3.6-flash"} + {"name": "NORMOL_MODEL", "value": "deepseek-chat"}, + {"name": "IMAGE_MODEL", "value": "qwen3.5-flash"}, + {"name": "IMAGE_MODEL_MAX", "value": "qwen3.5-flash"}, + {"name": "ALL_DF_COLS", "value": "content,path,type,length,keywords,summary,know_id,tokens,connectto,addtime,page_nums"} ], "secrets": [ {"name": "DATABASE_URL", "valueFrom": "${STAGING_SECRETS_ARN}:DATABASE_URL::"}, diff --git a/deploy/ecs/test_render_task_definitions.py b/deploy/ecs/test_render_task_definitions.py index 472d1252..7d4bb39a 100644 --- a/deploy/ecs/test_render_task_definitions.py +++ b/deploy/ecs/test_render_task_definitions.py @@ -21,6 +21,40 @@ "STAGING_SECRETS_ARN": "secrets-arn", } +SHARED_STAGING_ENVIRONMENT: dict[str, str] = { + "ALI_URL": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions", + "ARK_URL": "https://ark.cn-beijing.volces.com/api/v3/chat/completions", + "BROKER_POOL_LIMIT": "5", + "DS_URL": "https://api.deepseek.com/v1/chat/completions", + "EMBEDDING_MODEL": "text-embedding-v4", + "S3_TEMP_PATH": "/tmp", + "SUPPORTED_EXTENSIONS": ".doc,.docx,.pdf,.txt,.xls,.xlsx,.csv,.jpg,.jpeg,.png,.pptx,.md", + "TMP_PATH": "/tmp/aismart_bid", +} + +API_STAGING_ENVIRONMENT: dict[str, str] = { + **SHARED_STAGING_ENVIRONMENT, + "DB_MAX_OVERFLOW": "5", + "DB_POOL_SIZE": "5", +} + +WORKER_STAGING_ENVIRONMENT: dict[str, str] = { + **SHARED_STAGING_ENVIRONMENT, + "ALL_DF_COLS": "content,path,type,length,keywords,summary,know_id,tokens,connectto,addtime,page_nums", + "DB_SYNC_MAX_OVERFLOW": "2", + "DB_SYNC_POOL_SIZE": "2", + "HIERARCHY_LLM_MODEL": "deepseek-chat", + "IMAGE_MODEL": "qwen3.5-flash", + "IMAGE_MODEL_MAX": "qwen3.5-flash", + "MAX_PDF_PAGE_LIMIT": "200", + "NORMOL_MODEL": "deepseek-chat", + "OVERSIZED_PDF_SHARD_ENABLED": "true", + "OVERSIZED_PDF_SOFT_LIMIT": "1500", + "PDF_PROFILE_TOC_ENABLED": "true", + "REDIS_SYNC_MAX_CONNECTIONS": "200", + "SUMMARY_LLM_MAX_CONCURRENT": "8", +} + @pytest.mark.parametrize( "template_name", @@ -44,6 +78,46 @@ def test_staging_templates_render_without_long_lived_s3_keys( assert "${" not in output_path.read_text(encoding="utf-8") +@pytest.mark.parametrize( + ("template_name", "container_name", "expected_environment"), + [ + ( + "task-definition-api.staging.json", + "api", + API_STAGING_ENVIRONMENT, + ), + ( + "task-definition-worker.staging.json", + "worker", + WORKER_STAGING_ENVIRONMENT, + ), + ], +) +def test_staging_templates_preserve_expected_staging_configuration( + template_name: str, + container_name: str, + expected_environment: dict[str, str], +) -> None: + """Fargate preserves the verified staging settings captured on 2026-08-13.""" + definition_path: Path = TEMPLATE_DIRECTORY / template_name + definition: dict[str, object] = json.loads( + definition_path.read_text(encoding="utf-8") + ) + container_definitions: list[dict[str, object]] = definition[ + "containerDefinitions" + ] + container: dict[str, object] = next( + item for item in container_definitions if item.get("name") == container_name + ) + environment: list[dict[str, str]] = container["environment"] + environment_values: dict[str, str] = { + item["name"]: item["value"] for item in environment + } + + for name, value in expected_environment.items(): + assert environment_values[name] == value + + def test_renderer_rejects_forbidden_s3_credential_variable() -> None: """Task definitions must never inject long-lived S3 credentials.""" definition: dict[str, object] = {