v1.0.92: back to DATABASE_URL — JSON format for jsonEnv
This commit is contained in:
@@ -1,11 +1,9 @@
|
|||||||
# PostgreSQL foriot — параметры инстанса
|
# PostgreSQL foriot — jsonEnv для pythonk8s
|
||||||
# instanceUid: 509145c3-ba71-4687-a084-d9dcbc88d3d2
|
# instanceUid: 509145c3-ba71-4687-a084-d9dcbc88d3d2
|
||||||
# Кластер: iot-naeel | Версия: PostgreSQL 17
|
# Кластер: iot-naeel | Версия: PostgreSQL 17
|
||||||
|
|
||||||
# --- Переменные для jsonEnv pythonk8s ---
|
```json
|
||||||
DB_HOST=postgresqlk8s-master.509145c3-ba71-4687-a084-d9dcbc88d3d2.svc.cluster.local
|
{
|
||||||
DB_PORT=5432
|
"DATABASE_URL": "postgresql://superuser:3VPcxOiNC0HOT358LFEOpGcubnhJmp9wifwDJYD7Nl3WKu5FRPq07FUte4BazAok@postgresqlk8s-master.509145c3-ba71-4687-a084-d9dcbc88d3d2.svc.cluster.local:5432/autotest?sslmode=require"
|
||||||
DB_NAME=autotest
|
}
|
||||||
DB_USER=superuser
|
```
|
||||||
DB_PASSWORD=3VPcxOiNC0HOT358LFEOpGcubnhJmp9wifwDJYD7Nl3WKu5FRPq07FUte4BazAok
|
|
||||||
DB_SSLMODE=require
|
|
||||||
|
|||||||
+2
-2
@@ -49,8 +49,8 @@ CREATE INDEX IF NOT EXISTS idx_runs_created
|
|||||||
|
|
||||||
def init_db():
|
def init_db():
|
||||||
"""Применить схему — идемпотентно, безопасно для конкурентного вызова."""
|
"""Применить схему — идемпотентно, безопасно для конкурентного вызова."""
|
||||||
if not os.getenv("DB_USER"):
|
if not os.getenv("DATABASE_URL"):
|
||||||
print("[DB] DB_USER not set — skipping init", flush=True)
|
print("[DB] DATABASE_URL not set — skipping init", flush=True)
|
||||||
return
|
return
|
||||||
|
|
||||||
conn = get_conn()
|
conn = get_conn()
|
||||||
|
|||||||
+6
-23
@@ -2,15 +2,10 @@
|
|||||||
Connection pool для PostgreSQL (psycopg2).
|
Connection pool для PostgreSQL (psycopg2).
|
||||||
|
|
||||||
Lazy-init: пул создаётся при первом обращении к БД в каждом gunicorn-воркере.
|
Lazy-init: пул создаётся при первом обращении к БД в каждом gunicorn-воркере.
|
||||||
Это безопасно для fork-модели — соединения открываются ПОСЛЕ fork.
|
Безопасно для fork-модели — соединения открываются ПОСЛЕ fork.
|
||||||
|
|
||||||
Переменные окружения (отдельно!):
|
Переменная окружения:
|
||||||
DB_HOST — хост (по умолчанию localhost)
|
DATABASE_URL — postgresql://user:pass@host:5432/dbname?sslmode=require
|
||||||
DB_PORT — порт (по умолчанию 5432)
|
|
||||||
DB_NAME — имя БД (по умолчанию autotest)
|
|
||||||
DB_USER — пользователь
|
|
||||||
DB_PASSWORD — пароль
|
|
||||||
DB_SSLMODE — sslmode (по умолчанию require)
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
@@ -20,25 +15,13 @@ from psycopg2 import pool
|
|||||||
_pool = None
|
_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():
|
def get_pool():
|
||||||
"""Lazy-init ThreadedConnectionPool (1-5 соединений)."""
|
"""Lazy-init ThreadedConnectionPool (1-5 соединений)."""
|
||||||
global _pool
|
global _pool
|
||||||
if _pool is None:
|
if _pool is None:
|
||||||
dsn = _build_dsn()
|
dsn = os.getenv("DATABASE_URL", "")
|
||||||
if not os.getenv("DB_USER"):
|
if not dsn:
|
||||||
return None # нет креда — нет пула
|
return None
|
||||||
_pool = pool.ThreadedConnectionPool(1, 5, dsn)
|
_pool = pool.ThreadedConnectionPool(1, 5, dsn)
|
||||||
return _pool
|
return _pool
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user