diff --git a/secrets/pg-foriot.md b/secrets/pg-foriot.md index 6081e37..2daf2b6 100644 --- a/secrets/pg-foriot.md +++ b/secrets/pg-foriot.md @@ -3,7 +3,12 @@ ```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_ENDPOINT": "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc" } diff --git a/site/app.py b/site/app.py index 6fc00bc..d8d0572 100644 --- a/site/app.py +++ b/site/app.py @@ -18,7 +18,7 @@ from routes.api import bp as api_bp from routes.api_test import bp as api_test_bp # Версия — меняется при КАЖДОМ изменении кода. Показывается в топбаре UI. -VERSION = "1.0.92" +VERSION = "1.0.93" 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") diff --git a/site/db/init_db.py b/site/db/init_db.py index 5898cc7..3be6be8 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("DATABASE_URL"): - print("[DB] DATABASE_URL not set — skipping init", flush=True) + if not os.getenv("DB_USER"): + print("[DB] DB_USER not set — skipping init", flush=True) return conn = get_conn() diff --git a/site/db/pool.py b/site/db/pool.py index 203be00..5300785 100644 --- a/site/db/pool.py +++ b/site/db/pool.py @@ -2,10 +2,14 @@ Connection pool для PostgreSQL (psycopg2). 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 @@ -15,25 +19,32 @@ from psycopg2 import pool _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(): - """Lazy-init ThreadedConnectionPool (1-5 соединений).""" global _pool if _pool is None: - dsn = os.getenv("DATABASE_URL", "") - if not dsn: + if not os.getenv("DB_USER"): return None - _pool = pool.ThreadedConnectionPool(1, 5, dsn) + _pool = pool.ThreadedConnectionPool(1, 5, _dsn()) return _pool def get_conn(): - """Взять соединение из пула.""" p = get_pool() return p.getconn() if p else None def put_conn(conn): - """Вернуть соединение в пул.""" p = get_pool() if p and conn: p.putconn(conn)