From ad8384a4d8dee7bd6f0b6cd1827f5991b163903f Mon Sep 17 00:00:00 2001 From: Nicolas Schmid <nicolas@breiten.ch> Date: Tue, 6 Jun 2023 07:58:01 +0200 Subject: [PATCH] feat: improve scripts to create database and debug --- Dockerfile | 3 ++- config/gunicorn.py | 3 ++- db/init_function.sh | 14 ++++++++++++++ db/partition.sql | 10 ++-------- hydws/datamodel/base.py | 2 +- hydws/main.py | 16 +++++++++++++++- requirements.txt | 1 + 7 files changed, 37 insertions(+), 12 deletions(-) create mode 100755 db/init_function.sh diff --git a/Dockerfile b/Dockerfile index 2c06921..19dc8c5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -46,4 +46,5 @@ COPY --chown=python:python . . EXPOSE 8000 -CMD ["gunicorn", "-k", "uvicorn.workers.UvicornWorker", "-c", "python:config.gunicorn", "hydws.main:app"] +# CMD ["gunicorn", "-k", "uvicorn.workers.UvicornWorker", "-c", "python:config.gunicorn", "hydws.main:app"] +CMD ["uvicorn", "hydws.main:app", "--port", "8000", "--workers", "1", "--timeout-keep-alive", "300", "--host", "0.0.0.0"] diff --git a/config/gunicorn.py b/config/gunicorn.py index fe4b2ea..4d6550d 100644 --- a/config/gunicorn.py +++ b/config/gunicorn.py @@ -2,13 +2,14 @@ import multiprocessing import os - from distutils.util import strtobool bind = f"0.0.0.0:{os.getenv('PORT', '8000')}" accesslog = "-" access_log_format = "%(h)s %(l)s %(u)s %(t)s '%(r)s' %(s)s %(b)s '%(f)s' '%(a)s' in %(D)sµs" # noqa: E501 +timeout = "600" + workers = int(os.getenv("WEB_CONCURRENCY", multiprocessing.cpu_count() * 2)) threads = int(os.getenv("PYTHON_MAX_THREADS", 1)) diff --git a/db/init_function.sh b/db/init_function.sh new file mode 100755 index 0000000..4fa4153 --- /dev/null +++ b/db/init_function.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -e + +set -a +. .env +set +a + +psql -d $DB_NAME -U $DB_USER --host $POSTGRES_HOST -f $(pwd)/db/partition.sql +psql -d $DB_NAME -U $DB_USER --host $POSTGRES_HOST -c "CREATE OR REPLACE TRIGGER partition_daily_function + BEFORE INSERT + ON hydraulicsample + FOR EACH ROW + WHEN (pg_trigger_depth() < 1) + EXECUTE FUNCTION partition_daily_function($DB_USER);" \ No newline at end of file diff --git a/db/partition.sql b/db/partition.sql index be8268a..8c5402b 100644 --- a/db/partition.sql +++ b/db/partition.sql @@ -1,5 +1,5 @@ --- CREATE TABLE hydraulicsample_default PARTITION OF hydraulicsample DEFAULT; +CREATE TABLE hydraulicsample_default PARTITION OF hydraulicsample DEFAULT; CREATE OR REPLACE FUNCTION partition_daily_function() RETURNS TRIGGER AS $$ @@ -21,6 +21,7 @@ THEN RAISE NOTICE 'A partition has been created'; BEGIN EXECUTE format(E'CREATE TABLE %I (LIKE hydraulicsample INCLUDING INDEXES)', partition_name); + EXECUTE format(E'ALTER TABLE %I OWNER TO %s', partition_name, TG_ARGV[0]); EXECUTE format(E'NOTIFY hydraulicsample, %L', partition_date); EXCEPTION WHEN duplicate_table THEN @@ -32,10 +33,3 @@ RETURN NULL; END; $$ LANGUAGE plpgsql; - -CREATE OR REPLACE TRIGGER partition_daily_function - BEFORE INSERT - ON hydraulicsample - FOR EACH ROW - WHEN (pg_trigger_depth() < 1) -EXECUTE FUNCTION partition_daily_function(); diff --git a/hydws/datamodel/base.py b/hydws/datamodel/base.py index afa8760..01ee1ad 100644 --- a/hydws/datamodel/base.py +++ b/hydws/datamodel/base.py @@ -1,10 +1,10 @@ -import psycopg2 import asyncio import enum import functools import uuid from datetime import datetime, timedelta +import psycopg2 from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT from sqlalchemy import (Boolean, Column, DateTime, Float, Integer, String, create_engine) diff --git a/hydws/main.py b/hydws/main.py index ec0c5e3..12a75d5 100644 --- a/hydws/main.py +++ b/hydws/main.py @@ -1,9 +1,23 @@ +# import logging + from fastapi import FastAPI +# from fastapi.logger import logger as fastapi_logger from fastapi.middleware.cors import CORSMiddleware -from hydws.datamodel.base import ORMBase, engine +from hydws.datamodel.base import ORMBase, engine from hydws.routers.v1 import boreholes +# gunicorn_error_logger = logging.getLogger("gunicorn.error") +# gunicorn_logger = logging.getLogger("gunicorn") +# uvicorn_access_logger = logging.getLogger("uvicorn.access") +# uvicorn_access_logger.handlers = gunicorn_error_logger.handlers + +# fastapi_logger.handlers = gunicorn_error_logger.handlers + +# if __name__ != "__main__": +# fastapi_logger.setLevel(gunicorn_logger.level) +# else: +# fastapi_logger.setLevel(logging.DEBUG) ORMBase.metadata.create_all(bind=engine) diff --git a/requirements.txt b/requirements.txt index e4e872a..6f782a6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,6 +3,7 @@ autopep8>=1.6.0 fastapi[all]>=0.92.0 flake8>=4.0.1 gunicorn>=20.1.0 +orjson>=3.9.0 pandas>=2.0.0rc1 psycopg2>=2.9.3 pytest>=7.0.1 -- GitLab