From be4d388e2f130d9785192d037c609f7f44175e85 Mon Sep 17 00:00:00 2001 From: whekin Date: Tue, 10 Mar 2026 18:50:44 +0400 Subject: [PATCH] refactor(config): remove single-household deploy legacy --- .env.example | 13 -------- apps/bot/src/config.ts | 28 ---------------- docs/runbooks/first-deploy.md | 9 ++--- docs/runbooks/iac-terraform.md | 4 --- infra/terraform/README.md | 4 --- infra/terraform/locals.tf | 2 -- infra/terraform/main.tf | 18 ---------- infra/terraform/terraform.tfvars.example | 7 ---- infra/terraform/variables.tf | 42 ------------------------ packages/config/src/env.ts | 11 ------- 10 files changed, 3 insertions(+), 135 deletions(-) diff --git a/.env.example b/.env.example index 3d65365..4d8f7de 100644 --- a/.env.example +++ b/.env.example @@ -6,11 +6,6 @@ PORT=3000 # Database DATABASE_URL=postgres://postgres:postgres@127.0.0.1:54322/postgres -# Optional Supabase -SUPABASE_URL=https://your-project-ref.supabase.co -SUPABASE_PUBLISHABLE_KEY=your-supabase-publishable-key -SUPABASE_SERVICE_ROLE_KEY=your-supabase-service-role-key - # Telegram TELEGRAM_BOT_TOKEN=your-telegram-bot-token TELEGRAM_WEBHOOK_SECRET=your-webhook-secret @@ -23,14 +18,6 @@ MINI_APP_ALLOWED_ORIGINS=http://localhost:5173 OPENAI_API_KEY=your-openai-api-key PARSER_MODEL=gpt-4.1-mini -# Optional monitoring -SENTRY_DSN= - -# Optional GCP / deploy -GCP_PROJECT_ID=your-gcp-project-id -GCP_REGION=europe-west1 -CLOUD_RUN_SERVICE_BOT=household-bot - # Scheduler SCHEDULER_SHARED_SECRET=your-scheduler-shared-secret SCHEDULER_OIDC_ALLOWED_EMAILS=scheduler-invoker@your-project.iam.gserviceaccount.com diff --git a/apps/bot/src/config.ts b/apps/bot/src/config.ts index 45c5046..161f0c2 100644 --- a/apps/bot/src/config.ts +++ b/apps/bot/src/config.ts @@ -5,9 +5,6 @@ export interface BotRuntimeConfig { telegramWebhookSecret: string telegramWebhookPath: string databaseUrl?: string - telegramHouseholdChatId?: string - telegramPurchaseTopicId?: number - telegramFeedbackTopicId?: number purchaseTopicIngestionEnabled: boolean financeCommandsEnabled: boolean anonymousFeedbackEnabled: boolean @@ -60,19 +57,6 @@ function requireValue(value: string | undefined, key: string): string { return value } -function parseOptionalTopicId(raw: string | undefined): number | undefined { - if (!raw) { - return undefined - } - - const parsed = Number(raw) - if (!Number.isInteger(parsed) || parsed <= 0) { - throw new Error(`Invalid Telegram topic id value: ${raw}`) - } - - return parsed -} - function parseOptionalValue(value: string | undefined): string | undefined { const trimmed = value?.trim() return trimmed && trimmed.length > 0 ? trimmed : undefined @@ -93,9 +77,6 @@ function parseOptionalCsv(value: string | undefined): readonly string[] { export function getBotRuntimeConfig(env: NodeJS.ProcessEnv = process.env): BotRuntimeConfig { const databaseUrl = parseOptionalValue(env.DATABASE_URL) - const telegramHouseholdChatId = parseOptionalValue(env.TELEGRAM_HOUSEHOLD_CHAT_ID) - const telegramPurchaseTopicId = parseOptionalTopicId(env.TELEGRAM_PURCHASE_TOPIC_ID) - const telegramFeedbackTopicId = parseOptionalTopicId(env.TELEGRAM_FEEDBACK_TOPIC_ID) const schedulerSharedSecret = parseOptionalValue(env.SCHEDULER_SHARED_SECRET) const schedulerOidcAllowedEmails = parseOptionalCsv(env.SCHEDULER_OIDC_ALLOWED_EMAILS) const miniAppAllowedOrigins = parseOptionalCsv(env.MINI_APP_ALLOWED_ORIGINS) @@ -128,15 +109,6 @@ export function getBotRuntimeConfig(env: NodeJS.ProcessEnv = process.env): BotRu if (databaseUrl !== undefined) { runtime.databaseUrl = databaseUrl } - if (telegramHouseholdChatId !== undefined) { - runtime.telegramHouseholdChatId = telegramHouseholdChatId - } - if (telegramPurchaseTopicId !== undefined) { - runtime.telegramPurchaseTopicId = telegramPurchaseTopicId - } - if (telegramFeedbackTopicId !== undefined) { - runtime.telegramFeedbackTopicId = telegramFeedbackTopicId - } if (schedulerSharedSecret !== undefined) { runtime.schedulerSharedSecret = schedulerSharedSecret } diff --git a/docs/runbooks/first-deploy.md b/docs/runbooks/first-deploy.md index a9b35f8..810534e 100644 --- a/docs/runbooks/first-deploy.md +++ b/docs/runbooks/first-deploy.md @@ -25,23 +25,20 @@ Required in your environment `*.tfvars`: - `environment` - `bot_api_image` - `mini_app_image` -- `bot_household_id` -- `bot_household_chat_id` -- `bot_purchase_topic_id` Recommended: - `database_url_secret_id = "database-url"` - `telegram_bot_token_secret_id = "telegram-bot-token"` - `openai_api_key_secret_id = "openai-api-key"` -- optional `supabase_url_secret_id = "supabase-url"` -- optional `supabase_publishable_key_secret_id = "supabase-publishable-key"` -- `bot_feedback_topic_id` - `bot_mini_app_allowed_origins` - `scheduler_timezone` - `scheduler_paused = true` - `scheduler_dry_run = true` +Household chat/topic bindings are no longer deployment config. Configure them in Telegram with +`/setup`, `/bind_purchase_topic`, `/bind_feedback_topic`, and `/bind_payments_topic` after deploy. + ### Secret Manager values Create the secret resources via Terraform, then add secret versions for: diff --git a/docs/runbooks/iac-terraform.md b/docs/runbooks/iac-terraform.md index 5d5edf3..1c0aca9 100644 --- a/docs/runbooks/iac-terraform.md +++ b/docs/runbooks/iac-terraform.md @@ -54,10 +54,6 @@ If `create_workload_identity = true`, Terraform also grants the GitHub deploy se Keep bot runtime config that is not secret in your `*.tfvars` file: -- `bot_household_id` -- `bot_household_chat_id` -- `bot_purchase_topic_id` -- optional `bot_feedback_topic_id` - `bot_mini_app_allowed_origins` - optional `bot_parser_model` diff --git a/infra/terraform/README.md b/infra/terraform/README.md index b026de8..d6de3bb 100644 --- a/infra/terraform/README.md +++ b/infra/terraform/README.md @@ -72,10 +72,6 @@ Recommended approach: - Use `terraform.tfvars` per environment (`dev.tfvars`, `prod.tfvars`) - Keep `project_id` separate for dev/prod when possible - Keep non-secret bot config in `*.tfvars`: - - `bot_household_id` - - `bot_household_chat_id` - - `bot_purchase_topic_id` - - optional `bot_feedback_topic_id` - optional `bot_parser_model` - optional `bot_mini_app_allowed_origins` diff --git a/infra/terraform/locals.tf b/infra/terraform/locals.tf index 160a629..0fcd60c 100644 --- a/infra/terraform/locals.tf +++ b/infra/terraform/locals.tf @@ -30,8 +30,6 @@ locals { runtime_secret_ids = toset(compact([ var.telegram_webhook_secret_id, var.scheduler_shared_secret_id, - var.supabase_url_secret_id, - var.supabase_publishable_key_secret_id, var.database_url_secret_id, var.telegram_bot_token_secret_id, var.openai_api_key_secret_id diff --git a/infra/terraform/main.tf b/infra/terraform/main.tf index 0d17699..ab28a37 100644 --- a/infra/terraform/main.tf +++ b/infra/terraform/main.tf @@ -90,18 +90,6 @@ module "bot_api_service" { { NODE_ENV = var.environment }, - var.bot_household_id == null ? {} : { - HOUSEHOLD_ID = var.bot_household_id - }, - var.bot_household_chat_id == null ? {} : { - TELEGRAM_HOUSEHOLD_CHAT_ID = var.bot_household_chat_id - }, - var.bot_purchase_topic_id == null ? {} : { - TELEGRAM_PURCHASE_TOPIC_ID = tostring(var.bot_purchase_topic_id) - }, - var.bot_feedback_topic_id == null ? {} : { - TELEGRAM_FEEDBACK_TOPIC_ID = tostring(var.bot_feedback_topic_id) - }, var.bot_parser_model == null ? {} : { PARSER_MODEL = var.bot_parser_model }, @@ -118,12 +106,6 @@ module "bot_api_service" { TELEGRAM_WEBHOOK_SECRET = var.telegram_webhook_secret_id SCHEDULER_SHARED_SECRET = var.scheduler_shared_secret_id }, - var.supabase_url_secret_id == null ? {} : { - SUPABASE_URL = var.supabase_url_secret_id - }, - var.supabase_publishable_key_secret_id == null ? {} : { - SUPABASE_PUBLISHABLE_KEY = var.supabase_publishable_key_secret_id - }, var.database_url_secret_id == null ? {} : { DATABASE_URL = var.database_url_secret_id }, diff --git a/infra/terraform/terraform.tfvars.example b/infra/terraform/terraform.tfvars.example index 684e765..87d4768 100644 --- a/infra/terraform/terraform.tfvars.example +++ b/infra/terraform/terraform.tfvars.example @@ -11,13 +11,6 @@ mini_app_image = "europe-west1-docker.pkg.dev/my-gcp-project/household-bot/mini database_url_secret_id = "database-url" telegram_bot_token_secret_id = "telegram-bot-token" openai_api_key_secret_id = "openai-api-key" -# supabase_url_secret_id = "supabase-url" -# supabase_publishable_key_secret_id = "supabase-publishable-key" - -bot_household_id = "11111111-1111-4111-8111-111111111111" -bot_household_chat_id = "-1001234567890" -bot_purchase_topic_id = 777 -bot_feedback_topic_id = 778 bot_parser_model = "gpt-4.1-mini" bot_mini_app_allowed_origins = [ "https://household-dev-mini-app-abc123-ew.a.run.app" diff --git a/infra/terraform/variables.tf b/infra/terraform/variables.tf index f6b18b7..5cb74f6 100644 --- a/infra/terraform/variables.tf +++ b/infra/terraform/variables.tf @@ -56,20 +56,6 @@ variable "scheduler_shared_secret_id" { default = "scheduler-shared-secret" } -variable "supabase_url_secret_id" { - description = "Optional Secret Manager ID for SUPABASE_URL" - type = string - default = null - nullable = true -} - -variable "supabase_publishable_key_secret_id" { - description = "Optional Secret Manager ID for SUPABASE_PUBLISHABLE_KEY" - type = string - default = null - nullable = true -} - variable "database_url_secret_id" { description = "Optional Secret Manager ID for DATABASE_URL" type = string @@ -83,34 +69,6 @@ variable "telegram_bot_token_secret_id" { default = "telegram-bot-token" } -variable "bot_household_id" { - description = "Optional HOUSEHOLD_ID value for bot runtime" - type = string - default = null - nullable = true -} - -variable "bot_household_chat_id" { - description = "Optional TELEGRAM_HOUSEHOLD_CHAT_ID value for bot runtime" - type = string - default = null - nullable = true -} - -variable "bot_purchase_topic_id" { - description = "Optional TELEGRAM_PURCHASE_TOPIC_ID value for bot runtime" - type = number - default = null - nullable = true -} - -variable "bot_feedback_topic_id" { - description = "Optional TELEGRAM_FEEDBACK_TOPIC_ID value for bot runtime" - type = number - default = null - nullable = true -} - variable "bot_parser_model" { description = "Optional PARSER_MODEL override for bot runtime" type = string diff --git a/packages/config/src/env.ts b/packages/config/src/env.ts index 4c3fe7b..3645fb0 100644 --- a/packages/config/src/env.ts +++ b/packages/config/src/env.ts @@ -19,16 +19,9 @@ const server = { LOG_LEVEL: z.enum(['debug', 'info', 'warn', 'error']).default('info'), PORT: z.coerce.number().int().min(1).max(65535).default(3000), DATABASE_URL: z.string().url(), - HOUSEHOLD_ID: z.string().uuid().optional(), - SUPABASE_URL: z.string().url().optional(), - SUPABASE_PUBLISHABLE_KEY: z.string().min(1).optional(), - SUPABASE_SERVICE_ROLE_KEY: z.string().min(1).optional(), TELEGRAM_BOT_TOKEN: z.string().min(1), TELEGRAM_WEBHOOK_SECRET: z.string().min(1), TELEGRAM_WEBHOOK_PATH: z.string().min(1).default('/webhook/telegram'), - TELEGRAM_HOUSEHOLD_CHAT_ID: z.string().min(1).optional(), - TELEGRAM_PURCHASE_TOPIC_ID: z.coerce.number().int().positive().optional(), - TELEGRAM_FEEDBACK_TOPIC_ID: z.coerce.number().int().positive().optional(), MINI_APP_ALLOWED_ORIGINS: z .string() .optional() @@ -39,10 +32,6 @@ const server = { .transform((value) => parseOptionalCsv(value)), OPENAI_API_KEY: z.string().min(1).optional(), PARSER_MODEL: z.string().min(1).default('gpt-4.1-mini'), - SENTRY_DSN: z.string().url().optional(), - GCP_PROJECT_ID: z.string().min(1).optional(), - GCP_REGION: z.string().min(1).default('europe-west1'), - CLOUD_RUN_SERVICE_BOT: z.string().min(1).default('household-bot'), SCHEDULER_SHARED_SECRET: z.string().min(1).optional() }