v1.0.93: separate DB_* env vars (DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASSWORD, DB_SSLMODE) + TEST endpoint default
This commit is contained in:
@@ -3,7 +3,12 @@
|
|||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"DATABASE_URL": "postgresql://superuser:3VPcxOiNC0HOT358LFEOpGcubnhJmp9wifwDJYD7Nl3WKu5FRPq07FUte4BazAok@postgresqlk8s-master.509145c3-ba71-4687-a084-d9dcbc88d3d2.svc.cluster.local:5432/autotest?sslmode=require",
|
"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",
|
||||||
"NUBES_API_TOKEN": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhdXRoLWFwaSIsInN1YiI6IjAxOWNjMjY4LTZjNmEtNzgxZS04NjEzLTRiZWQ0ZWM3Y2QyMCIsImV4cCI6MTc5ODM3NzQ3NywiaWF0IjoxNzgyODI1NDc3LCJqdGkiOiI3NjFhZmQ5YS1hM2U1LTRiNTctODcyYi1jNWY4MzRlYTNlYzQiLCJhdXRoX3RpbWUiOjAsInR5cCI6IiIsImF6cCI6IiIsInNlc3Npb25fc3RhdGUiOiIiLCJhY3IiOiIiLCJhbGxvd2VkLW9yaWdpbnMiOm51bGwsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6bnVsbH0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpudWxsfX0sInNjb3BlIjoiIiwic2lkIjoiIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJuYW1lIjoiIiwiQ2xpZW50SUQiOiJXWjAzNzA5IiwiY29tcGFueV9pZCI6IjAxOWNjMjRhLTcyN2UtNzQwZi1iNDA3LWJlYzc5ZGFiNDE2MiIsImNvbXBhbnlfbmFtZSI6Im5hZWVsX3Rlc3QiLCJ0b2tlbl90eXBlIjoidGVjaCIsImlkcF91c3JfdWlkIjoiMDE5Y2MyNjgtNmM2YS03ODFlLTg2MTMtNGJlZDRlYzdjZDIwIiwibG9naW4iOiJ0YXpldGRpbm92bkBnbWFpbC5jb20iLCJmaXJzdG5hbWUiOiLQndCw0LjQu9GMIiwibWlkZGxlbmFtZSI6ItCk0LDRgNC40YLQvtCy0LjRhyIsImxhc3RuYW1lIjoi0KLQsNC30LXRgtC00LjQvdC-0LIiLCJncm91cHMiOm51bGwsInByZWZlcnJlZF91c2VybmFtZSI6IiIsImdpdmVuX25hbWUiOiIiLCJmYW1pbHlfbmFtZSI6IiIsImVtYWlsIjoidGF6ZXRkaW5vdm5AZ21haWwuY29tIn0.U6lfbr_GazFGNhqS0jC2lJejAOXKRup5Ay_3shbrdncMivKq_QVpTZin6mBvUv6m1p7YjSTRwyij3SrY1ZLVXME0TiImipcfbp2BIvmvOrudCRTnSkfL0tjHoEXeEs0EgsBs9Gmp6UOv7sBijxQosOSfd13uGR8_Vgk4drP7kbNRT7xX7Qon4fUpF_G7YlCSf8i5B_178SaQaVZosnn4BweSBqGO4gWfHD8m11_VyrDANXVzCu1eprfAtCtMj3vD8gQiua-ATB6Fg0iStN5ZVbqO8ep6zVctxwittwH7sN0fgY4_BfiSCVx2fSJ5-EHlodjjIPHTMIlouQSgGB6LCA",
|
"NUBES_API_TOKEN": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhdXRoLWFwaSIsInN1YiI6IjAxOWNjMjY4LTZjNmEtNzgxZS04NjEzLTRiZWQ0ZWM3Y2QyMCIsImV4cCI6MTc5ODM3NzQ3NywiaWF0IjoxNzgyODI1NDc3LCJqdGkiOiI3NjFhZmQ5YS1hM2U1LTRiNTctODcyYi1jNWY4MzRlYTNlYzQiLCJhdXRoX3RpbWUiOjAsInR5cCI6IiIsImF6cCI6IiIsInNlc3Npb25fc3RhdGUiOiIiLCJhY3IiOiIiLCJhbGxvd2VkLW9yaWdpbnMiOm51bGwsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6bnVsbH0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpudWxsfX0sInNjb3BlIjoiIiwic2lkIjoiIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJuYW1lIjoiIiwiQ2xpZW50SUQiOiJXWjAzNzA5IiwiY29tcGFueV9pZCI6IjAxOWNjMjRhLTcyN2UtNzQwZi1iNDA3LWJlYzc5ZGFiNDE2MiIsImNvbXBhbnlfbmFtZSI6Im5hZWVsX3Rlc3QiLCJ0b2tlbl90eXBlIjoidGVjaCIsImlkcF91c3JfdWlkIjoiMDE5Y2MyNjgtNmM2YS03ODFlLTg2MTMtNGJlZDRlYzdjZDIwIiwibG9naW4iOiJ0YXpldGRpbm92bkBnbWFpbC5jb20iLCJmaXJzdG5hbWUiOiLQndCw0LjQu9GMIiwibWlkZGxlbmFtZSI6ItCk0LDRgNC40YLQvtCy0LjRhyIsImxhc3RuYW1lIjoi0KLQsNC30LXRgtC00LjQvdC-0LIiLCJncm91cHMiOm51bGwsInByZWZlcnJlZF91c2VybmFtZSI6IiIsImdpdmVuX25hbWUiOiIiLCJmYW1pbHlfbmFtZSI6IiIsImVtYWlsIjoidGF6ZXRkaW5vdm5AZ21haWwuY29tIn0.U6lfbr_GazFGNhqS0jC2lJejAOXKRup5Ay_3shbrdncMivKq_QVpTZin6mBvUv6m1p7YjSTRwyij3SrY1ZLVXME0TiImipcfbp2BIvmvOrudCRTnSkfL0tjHoEXeEs0EgsBs9Gmp6UOv7sBijxQosOSfd13uGR8_Vgk4drP7kbNRT7xX7Qon4fUpF_G7YlCSf8i5B_178SaQaVZosnn4BweSBqGO4gWfHD8m11_VyrDANXVzCu1eprfAtCtMj3vD8gQiua-ATB6Fg0iStN5ZVbqO8ep6zVctxwittwH7sN0fgY4_BfiSCVx2fSJ5-EHlodjjIPHTMIlouQSgGB6LCA",
|
||||||
"NUBES_API_ENDPOINT": "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc"
|
"NUBES_API_ENDPOINT": "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc"
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -18,7 +18,7 @@ from routes.api import bp as api_bp
|
|||||||
from routes.api_test import bp as api_test_bp
|
from routes.api_test import bp as api_test_bp
|
||||||
|
|
||||||
# Версия — меняется при КАЖДОМ изменении кода. Показывается в топбаре UI.
|
# Версия — меняется при КАЖДОМ изменении кода. Показывается в топбаре UI.
|
||||||
VERSION = "1.0.92"
|
VERSION = "1.0.93"
|
||||||
|
|
||||||
app = Flask(__name__, template_folder="templates", static_folder="static")
|
app = Flask(__name__, template_folder="templates", static_folder="static")
|
||||||
app.config["NUBES_API_ENDPOINT"] = os.getenv("NUBES_API_ENDPOINT", "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc")
|
app.config["NUBES_API_ENDPOINT"] = os.getenv("NUBES_API_ENDPOINT", "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc")
|
||||||
|
|||||||
+2
-2
@@ -49,8 +49,8 @@ CREATE INDEX IF NOT EXISTS idx_runs_created
|
|||||||
|
|
||||||
def init_db():
|
def init_db():
|
||||||
"""Применить схему — идемпотентно, безопасно для конкурентного вызова."""
|
"""Применить схему — идемпотентно, безопасно для конкурентного вызова."""
|
||||||
if not os.getenv("DATABASE_URL"):
|
if not os.getenv("DB_USER"):
|
||||||
print("[DB] DATABASE_URL not set — skipping init", flush=True)
|
print("[DB] DB_USER not set — skipping init", flush=True)
|
||||||
return
|
return
|
||||||
|
|
||||||
conn = get_conn()
|
conn = get_conn()
|
||||||
|
|||||||
+20
-9
@@ -2,10 +2,14 @@
|
|||||||
Connection pool для PostgreSQL (psycopg2).
|
Connection pool для PostgreSQL (psycopg2).
|
||||||
|
|
||||||
Lazy-init: пул создаётся при первом обращении к БД в каждом gunicorn-воркере.
|
Lazy-init: пул создаётся при первом обращении к БД в каждом gunicorn-воркере.
|
||||||
Безопасно для fork-модели — соединения открываются ПОСЛЕ fork.
|
|
||||||
|
|
||||||
Переменная окружения:
|
Переменные окружения (КАЖДАЯ отдельно):
|
||||||
DATABASE_URL — postgresql://user:pass@host:5432/dbname?sslmode=require
|
DB_HOST — хост
|
||||||
|
DB_PORT — порт (5432)
|
||||||
|
DB_NAME — имя БД
|
||||||
|
DB_USER — пользователь
|
||||||
|
DB_PASSWORD — пароль
|
||||||
|
DB_SSLMODE — sslmode (require)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
@@ -15,25 +19,32 @@ from psycopg2 import pool
|
|||||||
_pool = None
|
_pool = None
|
||||||
|
|
||||||
|
|
||||||
|
def _dsn():
|
||||||
|
return (
|
||||||
|
f"host={os.getenv('DB_HOST')} "
|
||||||
|
f"port={os.getenv('DB_PORT', '5432')} "
|
||||||
|
f"dbname={os.getenv('DB_NAME')} "
|
||||||
|
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 соединений)."""
|
|
||||||
global _pool
|
global _pool
|
||||||
if _pool is None:
|
if _pool is None:
|
||||||
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
|
||||||
|
|
||||||
|
|
||||||
def get_conn():
|
def get_conn():
|
||||||
"""Взять соединение из пула."""
|
|
||||||
p = get_pool()
|
p = get_pool()
|
||||||
return p.getconn() if p else None
|
return p.getconn() if p else None
|
||||||
|
|
||||||
|
|
||||||
def put_conn(conn):
|
def put_conn(conn):
|
||||||
"""Вернуть соединение в пул."""
|
|
||||||
p = get_pool()
|
p = get_pool()
|
||||||
if p and conn:
|
if p and conn:
|
||||||
p.putconn(conn)
|
p.putconn(conn)
|
||||||
|
|||||||
Reference in New Issue
Block a user