From eab9b53dea6baf6eec9b3cdd097cbc5acd6d47a1 Mon Sep 17 00:00:00 2001 From: Pigbibi <20649888+Pigbibi@users.noreply.github.com> Date: Mon, 25 May 2026 02:39:40 +0800 Subject: [PATCH] Remove legacy crisis alert email config --- .github/workflows/sync-cloud-run-env.yml | 14 -------------- README.md | 12 ++++-------- requirements.txt | 4 ++-- runtime_config_support.py | 9 +-------- tests/test_request_handling.py | 2 -- tests/test_runtime_config_support.py | 6 ------ tests/test_sync_cloud_run_env_workflow.sh | 6 ------ 7 files changed, 7 insertions(+), 46 deletions(-) diff --git a/.github/workflows/sync-cloud-run-env.yml b/.github/workflows/sync-cloud-run-env.yml index f5be490..2aa574a 100644 --- a/.github/workflows/sync-cloud-run-env.yml +++ b/.github/workflows/sync-cloud-run-env.yml @@ -52,9 +52,7 @@ jobs: LONGBRIDGE_RESERVED_CASH_RATIO: ${{ vars.LONGBRIDGE_RESERVED_CASH_RATIO }} LONGBRIDGE_SAFE_HAVEN_CASH_SUBSTITUTE_THRESHOLD_USD: ${{ vars.LONGBRIDGE_SAFE_HAVEN_CASH_SUBSTITUTE_THRESHOLD_USD }} CRISIS_ALERT_GOOGLE_VOICE_TO: ${{ vars.CRISIS_ALERT_GOOGLE_VOICE_TO }} - CRISIS_ALERT_EMAIL_TO: ${{ vars.CRISIS_ALERT_EMAIL_TO }} CRISIS_ALERT_SMTP_FROM: ${{ vars.CRISIS_ALERT_SMTP_FROM }} - CRISIS_ALERT_EMAIL_FROM: ${{ vars.CRISIS_ALERT_EMAIL_FROM }} CRISIS_ALERT_SMTP_HOST: ${{ vars.CRISIS_ALERT_SMTP_HOST }} CRISIS_ALERT_SMTP_PORT: ${{ vars.CRISIS_ALERT_SMTP_PORT }} CRISIS_ALERT_SMTP_USERNAME: ${{ vars.CRISIS_ALERT_SMTP_USERNAME }} @@ -385,24 +383,12 @@ jobs: remove_env_vars+=("CRISIS_ALERT_GOOGLE_VOICE_TO") fi - if [ -n "${CRISIS_ALERT_EMAIL_TO:-}" ]; then - env_pairs+=("CRISIS_ALERT_EMAIL_TO=${CRISIS_ALERT_EMAIL_TO}") - else - remove_env_vars+=("CRISIS_ALERT_EMAIL_TO") - fi - if [ -n "${CRISIS_ALERT_SMTP_FROM:-}" ]; then env_pairs+=("CRISIS_ALERT_SMTP_FROM=${CRISIS_ALERT_SMTP_FROM}") else remove_env_vars+=("CRISIS_ALERT_SMTP_FROM") fi - if [ -n "${CRISIS_ALERT_EMAIL_FROM:-}" ]; then - env_pairs+=("CRISIS_ALERT_EMAIL_FROM=${CRISIS_ALERT_EMAIL_FROM}") - else - remove_env_vars+=("CRISIS_ALERT_EMAIL_FROM") - fi - if [ -n "${CRISIS_ALERT_SMTP_HOST:-}" ]; then env_pairs+=("CRISIS_ALERT_SMTP_HOST=${CRISIS_ALERT_SMTP_HOST}") else diff --git a/README.md b/README.md index 23009c2..4401342 100644 --- a/README.md +++ b/README.md @@ -71,9 +71,7 @@ Telegram notifications include structured execution and heartbeat messages, with | `LONGBRIDGE_DEBUG_POSITION_SNAPSHOT` | No | Set to `true` to log raw LongBridge position quantity and available quantity for troubleshooting. | | `LONGBRIDGE_STRATEGY_PLUGIN_MOUNTS_JSON` | No | Optional LongBridge-side strategy plugin mount JSON. The plugin artifact controls mode; platform config must not set `mode`. | | `CRISIS_ALERT_GOOGLE_VOICE_TO` | No | Comma/semicolon/newline-separated Google Voice SMS gateway recipients, usually ending in `@txt.voice.google.com`. | -| `CRISIS_ALERT_EMAIL_TO` | No | Optional ordinary email recipients that receive the same escalated alert; also accepted as a legacy recipient list. | -| `CRISIS_ALERT_SMTP_FROM` | No | SMTP sender address for Google Voice alerts. Falls back to `CRISIS_ALERT_EMAIL_FROM`. | -| `CRISIS_ALERT_EMAIL_FROM` | No | Legacy SMTP sender alias; prefer `CRISIS_ALERT_SMTP_FROM`. | +| `CRISIS_ALERT_SMTP_FROM` | No | SMTP sender address for Google Voice alerts. | | `CRISIS_ALERT_SMTP_HOST` | No | SMTP host for Google Voice alerts. | | `CRISIS_ALERT_SMTP_PORT` | No | SMTP port; defaults to `587`. | | `CRISIS_ALERT_SMTP_USERNAME` | No | Optional SMTP username. | @@ -131,7 +129,7 @@ Recommended setup: - `TELEGRAM_TOKEN_SECRET_NAME` (recommended: `longbridge-telegram-token`) - `NOTIFY_LANG` - `GLOBAL_TELEGRAM_CHAT_ID` - - Optional crisis Google Voice alerts: `CRISIS_ALERT_GOOGLE_VOICE_TO`, `CRISIS_ALERT_EMAIL_TO`, `CRISIS_ALERT_SMTP_FROM`, `CRISIS_ALERT_EMAIL_FROM`, `CRISIS_ALERT_SMTP_HOST`, `CRISIS_ALERT_SMTP_PORT`, `CRISIS_ALERT_SMTP_USERNAME`, `CRISIS_ALERT_SMTP_PASSWORD_SECRET_NAME`, `CRISIS_ALERT_SMTP_STARTTLS`, `CRISIS_ALERT_SMTP_SSL` + - Optional crisis Google Voice alerts: `CRISIS_ALERT_GOOGLE_VOICE_TO`, `CRISIS_ALERT_SMTP_FROM`, `CRISIS_ALERT_SMTP_HOST`, `CRISIS_ALERT_SMTP_PORT`, `CRISIS_ALERT_SMTP_USERNAME`, `CRISIS_ALERT_SMTP_PASSWORD_SECRET_NAME`, `CRISIS_ALERT_SMTP_STARTTLS`, `CRISIS_ALERT_SMTP_SSL` - **Repository Secrets (shared):** - Optional fallback only: `TELEGRAM_TOKEN` - Optional fallback only: `CRISIS_ALERT_SMTP_PASSWORD` @@ -246,9 +244,7 @@ Telegram 通知包含结构化的调仓和心跳消息,支持中英文切换 | `LONGBRIDGE_DEBUG_POSITION_SNAPSHOT` | 否 | 设为 `true` 时输出 LongBridge 原始持仓数量和可卖数量,便于排查。 | | `LONGBRIDGE_STRATEGY_PLUGIN_MOUNTS_JSON` | 否 | 可选的 LongBridge 侧策略插件挂载 JSON。插件 artifact 自带模式;平台配置不要设置 `mode`。 | | `CRISIS_ALERT_GOOGLE_VOICE_TO` | 否 | Google Voice 短信网关收件人,通常以 `@txt.voice.google.com` 结尾,支持逗号、分号或换行分隔。 | -| `CRISIS_ALERT_EMAIL_TO` | 否 | 可选普通邮件收件人,会收到同一份升级告警;也作为旧版收件人配置兼容。 | -| `CRISIS_ALERT_SMTP_FROM` | 否 | Google Voice 告警的 SMTP 发件人;未设置时回退到 `CRISIS_ALERT_EMAIL_FROM`。 | -| `CRISIS_ALERT_EMAIL_FROM` | 否 | 旧版 SMTP 发件人别名;优先使用 `CRISIS_ALERT_SMTP_FROM`。 | +| `CRISIS_ALERT_SMTP_FROM` | 否 | Google Voice 告警的 SMTP 发件人。 | | `CRISIS_ALERT_SMTP_HOST` | 否 | Google Voice 告警 SMTP host。 | | `CRISIS_ALERT_SMTP_PORT` | 否 | SMTP 端口,默认 `587`。 | | `CRISIS_ALERT_SMTP_USERNAME` | 否 | 可选 SMTP 用户名。 | @@ -306,7 +302,7 @@ Secret Manager 中需存在 `LONGPORT_SECRET_NAME` 指定的密钥(默认: `lo - `TELEGRAM_TOKEN_SECRET_NAME`(建议:`longbridge-telegram-token`) - `NOTIFY_LANG` - `GLOBAL_TELEGRAM_CHAT_ID` - - 可选危机插件 Google Voice 告警:`CRISIS_ALERT_GOOGLE_VOICE_TO`、`CRISIS_ALERT_EMAIL_TO`、`CRISIS_ALERT_SMTP_FROM`、`CRISIS_ALERT_EMAIL_FROM`、`CRISIS_ALERT_SMTP_HOST`、`CRISIS_ALERT_SMTP_PORT`、`CRISIS_ALERT_SMTP_USERNAME`、`CRISIS_ALERT_SMTP_PASSWORD_SECRET_NAME`、`CRISIS_ALERT_SMTP_STARTTLS`、`CRISIS_ALERT_SMTP_SSL` + - 可选危机插件 Google Voice 告警:`CRISIS_ALERT_GOOGLE_VOICE_TO`、`CRISIS_ALERT_SMTP_FROM`、`CRISIS_ALERT_SMTP_HOST`、`CRISIS_ALERT_SMTP_PORT`、`CRISIS_ALERT_SMTP_USERNAME`、`CRISIS_ALERT_SMTP_PASSWORD_SECRET_NAME`、`CRISIS_ALERT_SMTP_STARTTLS`、`CRISIS_ALERT_SMTP_SSL` - **仓库级 Secrets(共享):** - 仅保留为 fallback:`TELEGRAM_TOKEN` - 仅保留为 fallback:`CRISIS_ALERT_SMTP_PASSWORD` diff --git a/requirements.txt b/requirements.txt index a6afad0..6c4616a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ flask gunicorn -quant-platform-kit @ git+https://github.com/QuantStrategyLab/QuantPlatformKit.git@8ed13d9122f52c35425b0802d22467bb6664dcd3 -us-equity-strategies @ git+https://github.com/QuantStrategyLab/UsEquityStrategies.git@e89ea43181f687d3454636b4b2d99ab7771546f4 +quant-platform-kit @ git+https://github.com/QuantStrategyLab/QuantPlatformKit.git@8e87e70d49487bc6d96587d5f9e9850727e9817b +us-equity-strategies @ git+https://github.com/QuantStrategyLab/UsEquityStrategies.git@fe9cc27b608ab18592b338519a5b0826f73e9a80 pandas requests pytz diff --git a/runtime_config_support.py b/runtime_config_support.py index 8137ddf..91ea71b 100644 --- a/runtime_config_support.py +++ b/runtime_config_support.py @@ -56,8 +56,6 @@ class PlatformRuntimeSettings: strategy_plugin_mounts_json: str | None = None crisis_alert_google_voice_to: tuple[str, ...] = () crisis_alert_smtp_from: str | None = None - crisis_alert_email_to: tuple[str, ...] = () - crisis_alert_email_from: str | None = None crisis_alert_smtp_host: str | None = None crisis_alert_smtp_port: int = 587 crisis_alert_smtp_username: str | None = None @@ -161,12 +159,7 @@ def load_platform_runtime_settings( or os.getenv("STRATEGY_PLUGIN_MOUNTS_JSON") ), crisis_alert_google_voice_to=_split_env_list(os.getenv("CRISIS_ALERT_GOOGLE_VOICE_TO")), - crisis_alert_smtp_from=_first_non_empty( - os.getenv("CRISIS_ALERT_SMTP_FROM"), - os.getenv("CRISIS_ALERT_EMAIL_FROM"), - ), - crisis_alert_email_to=_split_env_list(os.getenv("CRISIS_ALERT_EMAIL_TO")), - crisis_alert_email_from=_first_non_empty(os.getenv("CRISIS_ALERT_EMAIL_FROM")), + crisis_alert_smtp_from=_first_non_empty(os.getenv("CRISIS_ALERT_SMTP_FROM")), crisis_alert_smtp_host=_first_non_empty(os.getenv("CRISIS_ALERT_SMTP_HOST")), crisis_alert_smtp_port=_resolve_positive_int_env("CRISIS_ALERT_SMTP_PORT", default=587), crisis_alert_smtp_username=_first_non_empty(os.getenv("CRISIS_ALERT_SMTP_USERNAME")), diff --git a/tests/test_request_handling.py b/tests/test_request_handling.py index cab0dc8..e8f6f7b 100644 --- a/tests/test_request_handling.py +++ b/tests/test_request_handling.py @@ -66,8 +66,6 @@ def run(self, *args, **kwargs): tg_token=None, tg_chat_id="shared-chat-id", dry_run_only=False, - crisis_alert_email_to=(), - crisis_alert_email_from=None, crisis_alert_smtp_host=None, crisis_alert_smtp_port=587, crisis_alert_smtp_username=None, diff --git a/tests/test_runtime_config_support.py b/tests/test_runtime_config_support.py index ade1665..1e55eb4 100644 --- a/tests/test_runtime_config_support.py +++ b/tests/test_runtime_config_support.py @@ -121,8 +121,6 @@ def test_load_platform_runtime_settings_uses_defaults_with_explicit_strategy_pro self.assertIsNone(settings.strategy_plugin_mounts_json) self.assertEqual(settings.crisis_alert_google_voice_to, ()) self.assertIsNone(settings.crisis_alert_smtp_from) - self.assertEqual(settings.crisis_alert_email_to, ()) - self.assertIsNone(settings.crisis_alert_email_from) self.assertIsNone(settings.crisis_alert_smtp_host) self.assertEqual(settings.crisis_alert_smtp_port, 587) self.assertIsNone(settings.crisis_alert_smtp_username) @@ -282,9 +280,7 @@ def test_crisis_alert_google_voice_config_is_loaded_from_env(self): { "RUNTIME_TARGET_JSON": runtime_target_json(SAMPLE_STRATEGY_PROFILE), "CRISIS_ALERT_GOOGLE_VOICE_TO": "gateway@txt.voice.google.com", - "CRISIS_ALERT_EMAIL_TO": "risk@example.com;ops@example.com,risk@example.com", "CRISIS_ALERT_SMTP_FROM": "smtp-from@example.com", - "CRISIS_ALERT_EMAIL_FROM": "bot@example.com", "CRISIS_ALERT_SMTP_HOST": "smtp.example.com", "CRISIS_ALERT_SMTP_PORT": "465", "CRISIS_ALERT_SMTP_USERNAME": "bot", @@ -298,8 +294,6 @@ def test_crisis_alert_google_voice_config_is_loaded_from_env(self): self.assertEqual(settings.crisis_alert_google_voice_to, ("gateway@txt.voice.google.com",)) self.assertEqual(settings.crisis_alert_smtp_from, "smtp-from@example.com") - self.assertEqual(settings.crisis_alert_email_to, ("risk@example.com", "ops@example.com")) - self.assertEqual(settings.crisis_alert_email_from, "bot@example.com") self.assertEqual(settings.crisis_alert_smtp_host, "smtp.example.com") self.assertEqual(settings.crisis_alert_smtp_port, 465) self.assertEqual(settings.crisis_alert_smtp_username, "bot") diff --git a/tests/test_sync_cloud_run_env_workflow.sh b/tests/test_sync_cloud_run_env_workflow.sh index ddf19de..21c60e2 100644 --- a/tests/test_sync_cloud_run_env_workflow.sh +++ b/tests/test_sync_cloud_run_env_workflow.sh @@ -49,9 +49,7 @@ grep -Fq 'LONGBRIDGE_MIN_RESERVED_CASH_USD: ${{ vars.LONGBRIDGE_MIN_RESERVED_CAS grep -Fq 'LONGBRIDGE_RESERVED_CASH_RATIO: ${{ vars.LONGBRIDGE_RESERVED_CASH_RATIO }}' "$workflow_file" grep -Fq 'LONGBRIDGE_SAFE_HAVEN_CASH_SUBSTITUTE_THRESHOLD_USD: ${{ vars.LONGBRIDGE_SAFE_HAVEN_CASH_SUBSTITUTE_THRESHOLD_USD }}' "$workflow_file" grep -Fq 'CRISIS_ALERT_GOOGLE_VOICE_TO: ${{ vars.CRISIS_ALERT_GOOGLE_VOICE_TO }}' "$workflow_file" -grep -Fq 'CRISIS_ALERT_EMAIL_TO: ${{ vars.CRISIS_ALERT_EMAIL_TO }}' "$workflow_file" grep -Fq 'CRISIS_ALERT_SMTP_FROM: ${{ vars.CRISIS_ALERT_SMTP_FROM }}' "$workflow_file" -grep -Fq 'CRISIS_ALERT_EMAIL_FROM: ${{ vars.CRISIS_ALERT_EMAIL_FROM }}' "$workflow_file" grep -Fq 'CRISIS_ALERT_SMTP_HOST: ${{ vars.CRISIS_ALERT_SMTP_HOST }}' "$workflow_file" grep -Fq 'CRISIS_ALERT_SMTP_PORT: ${{ vars.CRISIS_ALERT_SMTP_PORT }}' "$workflow_file" grep -Fq 'CRISIS_ALERT_SMTP_USERNAME: ${{ vars.CRISIS_ALERT_SMTP_USERNAME }}' "$workflow_file" @@ -101,9 +99,7 @@ grep -Fq 'remove_env_vars+=("LONGBRIDGE_MIN_RESERVED_CASH_USD")' "$workflow_file grep -Fq 'remove_env_vars+=("LONGBRIDGE_RESERVED_CASH_RATIO")' "$workflow_file" grep -Fq 'remove_env_vars+=("LONGBRIDGE_SAFE_HAVEN_CASH_SUBSTITUTE_THRESHOLD_USD")' "$workflow_file" grep -Fq 'CRISIS_ALERT_GOOGLE_VOICE_TO=${CRISIS_ALERT_GOOGLE_VOICE_TO}' "$workflow_file" -grep -Fq 'CRISIS_ALERT_EMAIL_TO=${CRISIS_ALERT_EMAIL_TO}' "$workflow_file" grep -Fq 'CRISIS_ALERT_SMTP_FROM=${CRISIS_ALERT_SMTP_FROM}' "$workflow_file" -grep -Fq 'CRISIS_ALERT_EMAIL_FROM=${CRISIS_ALERT_EMAIL_FROM}' "$workflow_file" grep -Fq 'CRISIS_ALERT_SMTP_HOST=${CRISIS_ALERT_SMTP_HOST}' "$workflow_file" grep -Fq 'CRISIS_ALERT_SMTP_PORT=${CRISIS_ALERT_SMTP_PORT}' "$workflow_file" grep -Fq 'CRISIS_ALERT_SMTP_USERNAME=${CRISIS_ALERT_SMTP_USERNAME}' "$workflow_file" @@ -111,9 +107,7 @@ grep -Fq 'CRISIS_ALERT_SMTP_PASSWORD=${CRISIS_ALERT_SMTP_PASSWORD}' "$workflow_f grep -Fq 'CRISIS_ALERT_SMTP_STARTTLS=${CRISIS_ALERT_SMTP_STARTTLS}' "$workflow_file" grep -Fq 'CRISIS_ALERT_SMTP_SSL=${CRISIS_ALERT_SMTP_SSL}' "$workflow_file" grep -Fq 'remove_env_vars+=("CRISIS_ALERT_GOOGLE_VOICE_TO")' "$workflow_file" -grep -Fq 'remove_env_vars+=("CRISIS_ALERT_EMAIL_TO")' "$workflow_file" grep -Fq 'remove_env_vars+=("CRISIS_ALERT_SMTP_FROM")' "$workflow_file" -grep -Fq 'remove_env_vars+=("CRISIS_ALERT_EMAIL_FROM")' "$workflow_file" grep -Fq 'remove_env_vars+=("CRISIS_ALERT_SMTP_HOST")' "$workflow_file" grep -Fq 'remove_env_vars+=("CRISIS_ALERT_SMTP_PORT")' "$workflow_file" grep -Fq 'remove_env_vars+=("CRISIS_ALERT_SMTP_USERNAME")' "$workflow_file"