From 7fc17ab3cde554013dc96f48ee822ad756981c78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Tue, 28 Jul 2026 09:37:14 +0400 Subject: [PATCH] =?UTF-8?q?v1.0.92:=20back=20to=20DATABASE=5FURL=20?= =?UTF-8?q?=E2=80=94=20JSON=20format=20for=20jsonEnv?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- secrets/pg-foriot.md | 14 ++++++-------- site/db/init_db.py | 4 ++-- site/db/pool.py | 29 ++++++----------------------- 3 files changed, 14 insertions(+), 33 deletions(-) diff --git a/secrets/pg-foriot.md b/secrets/pg-foriot.md index 46faa1e..4c5bc6b 100644 --- a/secrets/pg-foriot.md +++ b/secrets/pg-foriot.md @@ -1,11 +1,9 @@ -# PostgreSQL foriot — параметры инстанса +# PostgreSQL foriot — jsonEnv для pythonk8s # instanceUid: 509145c3-ba71-4687-a084-d9dcbc88d3d2 # Кластер: iot-naeel | Версия: PostgreSQL 17 -# --- Переменные для jsonEnv pythonk8s --- -DB_HOST=postgresqlk8s-master.509145c3-ba71-4687-a084-d9dcbc88d3d2.svc.cluster.local -DB_PORT=5432 -DB_NAME=autotest -DB_USER=superuser -DB_PASSWORD=3VPcxOiNC0HOT358LFEOpGcubnhJmp9wifwDJYD7Nl3WKu5FRPq07FUte4BazAok -DB_SSLMODE=require +```json +{ + "DATABASE_URL": "postgresql://superuser:3VPcxOiNC0HOT358LFEOpGcubnhJmp9wifwDJYD7Nl3WKu5FRPq07FUte4BazAok@postgresqlk8s-master.509145c3-ba71-4687-a084-d9dcbc88d3d2.svc.cluster.local:5432/autotest?sslmode=require" +} +``` diff --git a/site/db/init_db.py b/site/db/init_db.py index 3be6be8..5898cc7 100644 --- a/site/db/init_db.py +++ b/site/db/init_db.py @@ -49,8 +49,8 @@ CREATE INDEX IF NOT EXISTS idx_runs_created def init_db(): """Применить схему — идемпотентно, безопасно для конкурентного вызова.""" - if not os.getenv("DB_USER"): - print("[DB] DB_USER not set — skipping init", flush=True) + if not os.getenv("DATABASE_URL"): + print("[DB] DATABASE_URL not set — skipping init", flush=True) return conn = get_conn() diff --git a/site/db/pool.py b/site/db/pool.py index 91400fc..203be00 100644 --- a/site/db/pool.py +++ b/site/db/pool.py @@ -2,15 +2,10 @@ Connection pool для PostgreSQL (psycopg2). Lazy-init: пул создаётся при первом обращении к БД в каждом gunicorn-воркере. -Это безопасно для fork-модели — соединения открываются ПОСЛЕ fork. +Безопасно для fork-модели — соединения открываются ПОСЛЕ fork. -Переменные окружения (отдельно!): - DB_HOST — хост (по умолчанию localhost) - DB_PORT — порт (по умолчанию 5432) - DB_NAME — имя БД (по умолчанию autotest) - DB_USER — пользователь - DB_PASSWORD — пароль - DB_SSLMODE — sslmode (по умолчанию require) +Переменная окружения: + DATABASE_URL — postgresql://user:pass@host:5432/dbname?sslmode=require """ import os @@ -20,25 +15,13 @@ from psycopg2 import pool _pool = None -def _build_dsn(): - """Собрать DSN из отдельных переменных окружения.""" - return ( - f"host={os.getenv('DB_HOST', 'localhost')} " - f"port={os.getenv('DB_PORT', '5432')} " - f"dbname={os.getenv('DB_NAME', 'autotest')} " - f"user={os.getenv('DB_USER', '')} " - f"password={os.getenv('DB_PASSWORD', '')} " - f"sslmode={os.getenv('DB_SSLMODE', 'require')}" - ) - - def get_pool(): """Lazy-init ThreadedConnectionPool (1-5 соединений).""" global _pool if _pool is None: - dsn = _build_dsn() - if not os.getenv("DB_USER"): - return None # нет креда — нет пула + dsn = os.getenv("DATABASE_URL", "") + if not dsn: + return None _pool = pool.ThreadedConnectionPool(1, 5, dsn) return _pool