mirror of
https://github.com/ijaric/voice_assistant.git
synced 2025-05-24 22:43:26 +00:00
Рабочий Postgres
This commit is contained in:
parent
cf1a29d520
commit
b1b5b5ce68
|
@ -1,10 +1,10 @@
|
||||||
db_host=db
|
DB_HOST=db
|
||||||
db_port=5432
|
DB_PORT=5432
|
||||||
db_user=user
|
DB_USER=user
|
||||||
db_password=Qwe123
|
DB_PASSWORD=Qwe123
|
||||||
db_name=notification_admin
|
DB_NAME=api_db
|
||||||
|
|
||||||
server_host=0.0.0.0
|
SERVER_HOST=0.0.0.0
|
||||||
server_port=8000
|
SERVER_PORT=8000
|
||||||
|
|
||||||
jwt_secret_key=v9LctjUWwol4XbvczPiLFMDtZ8aal7mm
|
JWT_SECRET_KEY=v9LctjUWwol4XbvczPiLFMDtZ8aal7mm
|
||||||
|
|
|
@ -4,13 +4,13 @@ services:
|
||||||
db:
|
db:
|
||||||
image: postgres:15.2
|
image: postgres:15.2
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_USER: ${db_user}
|
POSTGRES_USER: ${DB_USER}
|
||||||
POSTGRES_PASSWORD: ${db_password}
|
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
||||||
POSTGRES_DB: ${db_name}
|
POSTGRES_DB: ${DB_NAME}
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
ports:
|
ports:
|
||||||
- "${db_port}:{db_port}"
|
- "${DB_PORT}:${DB_PORT}"
|
||||||
volumes:
|
volumes:
|
||||||
- postgres_data:/var/lib/postgresql/data/
|
- postgres_data:/var/lib/postgresql/data/
|
||||||
restart: always
|
restart: always
|
||||||
|
@ -25,7 +25,7 @@ services:
|
||||||
restart: always
|
restart: always
|
||||||
entrypoint: ["/opt/app/entrypoint.sh"]
|
entrypoint: ["/opt/app/entrypoint.sh"]
|
||||||
ports:
|
ports:
|
||||||
- "${server_port}:{server_port}"
|
- "${SERVER_PORT}:${SERVER_PORT}"
|
||||||
depends_on:
|
depends_on:
|
||||||
- db
|
- db
|
||||||
env_file:
|
env_file:
|
||||||
|
|
|
@ -4,13 +4,13 @@ services:
|
||||||
db:
|
db:
|
||||||
image: postgres:15.2
|
image: postgres:15.2
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_USER: ${db_user}
|
POSTGRES_USER: ${DB_USER}
|
||||||
POSTGRES_PASSWORD: ${db_password}
|
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
||||||
POSTGRES_DB: ${db_name}
|
POSTGRES_DB: ${DB_NAME}
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
ports:
|
ports:
|
||||||
- "127.0.0.1:${db_port}:{db_port}"
|
- "127.0.0.1:${DB_PORT}:${DB_PORT}"
|
||||||
volumes:
|
volumes:
|
||||||
- postgres_data:/var/lib/postgresql/data/
|
- postgres_data:/var/lib/postgresql/data/
|
||||||
restart: always
|
restart: always
|
||||||
|
@ -20,7 +20,7 @@ services:
|
||||||
api:
|
api:
|
||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
container_name: fastapi_app
|
container_name: api
|
||||||
image: fastapi_app
|
image: fastapi_app
|
||||||
restart: always
|
restart: always
|
||||||
entrypoint: ["/opt/app/entrypoint.sh"]
|
entrypoint: ["/opt/app/entrypoint.sh"]
|
||||||
|
|
|
@ -18,8 +18,12 @@ class BaseMixin:
|
||||||
|
|
||||||
@declared_attr
|
@declared_attr
|
||||||
def created_at(cls):
|
def created_at(cls):
|
||||||
return sqlalchemy.Column(sqlalchemy.DateTime, server_default=sqlalchemy.sql.func.now())
|
return sqlalchemy.Column(
|
||||||
|
sqlalchemy.DateTime, server_default=sqlalchemy.sql.func.now()
|
||||||
|
)
|
||||||
|
|
||||||
@declared_attr
|
@declared_attr
|
||||||
def updated_at(cls):
|
def updated_at(cls):
|
||||||
return sqlalchemy.Column(sqlalchemy.DateTime, server_default=sqlalchemy.sql.func.now())
|
return sqlalchemy.Column(
|
||||||
|
sqlalchemy.DateTime, server_default=sqlalchemy.sql.func.now()
|
||||||
|
)
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
import fastapi
|
|
||||||
|
|
||||||
from jose import JWTError, jwt
|
from jose import JWTError, jwt
|
||||||
from pydantic import ValidationError
|
|
||||||
|
|
||||||
from lib.api import schemas as app_schemas
|
from lib.api import schemas as app_schemas
|
||||||
from lib.app import settings as app_settings
|
from lib.app import settings as app_settings
|
||||||
|
from pydantic import ValidationError
|
||||||
|
|
||||||
|
import fastapi
|
||||||
|
|
||||||
app = fastapi.FastAPI()
|
app = fastapi.FastAPI()
|
||||||
settings = app_settings.get_settings()
|
settings = app_settings.get_settings()
|
||||||
|
@ -13,7 +12,9 @@ security = fastapi.security.HTTPBearer()
|
||||||
|
|
||||||
|
|
||||||
def get_token_data(
|
def get_token_data(
|
||||||
authorization: fastapi.security.HTTPAuthorizationCredentials = fastapi.Security(security),
|
authorization: fastapi.security.HTTPAuthorizationCredentials = fastapi.Security(
|
||||||
|
security
|
||||||
|
),
|
||||||
) -> app_schemas.entity.Token:
|
) -> app_schemas.entity.Token:
|
||||||
token = authorization.credentials
|
token = authorization.credentials
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -1,10 +1,7 @@
|
||||||
import functools
|
import functools
|
||||||
|
|
||||||
import pydantic_settings
|
import pydantic_settings
|
||||||
from dotenv import load_dotenv
|
from pydantic import Field, field_validator
|
||||||
from pydantic import Field
|
|
||||||
|
|
||||||
load_dotenv(".env.dev")
|
|
||||||
|
|
||||||
|
|
||||||
class DbSettings(pydantic_settings.BaseSettings):
|
class DbSettings(pydantic_settings.BaseSettings):
|
||||||
|
@ -25,11 +22,17 @@ class ApiSettings(pydantic_settings.BaseSettings):
|
||||||
|
|
||||||
|
|
||||||
class Settings(pydantic_settings.BaseSettings):
|
class Settings(pydantic_settings.BaseSettings):
|
||||||
|
debug: str = "false"
|
||||||
db: DbSettings = Field(default_factory=DbSettings)
|
db: DbSettings = Field(default_factory=DbSettings)
|
||||||
api: ApiSettings = Field(default_factory=ApiSettings)
|
api: ApiSettings = Field(default_factory=ApiSettings)
|
||||||
|
|
||||||
jwt_secret_key: str
|
jwt_secret_key: str
|
||||||
|
|
||||||
|
@field_validator("debug")
|
||||||
|
@classmethod
|
||||||
|
def validate_debug(cls, v: str) -> bool:
|
||||||
|
return v.lower() == "true"
|
||||||
|
|
||||||
|
|
||||||
@functools.lru_cache
|
@functools.lru_cache
|
||||||
def get_settings() -> Settings:
|
def get_settings() -> Settings:
|
||||||
|
|
|
@ -15,17 +15,27 @@ class Base(DeclarativeBase):
|
||||||
|
|
||||||
# Создаём движок
|
# Создаём движок
|
||||||
# Настройки подключения к БД передаём из переменных окружения, которые заранее загружены в файл настроек
|
# Настройки подключения к БД передаём из переменных окружения, которые заранее загружены в файл настроек
|
||||||
|
class AsyncDB:
|
||||||
database_dsn = (
|
def __init__(self):
|
||||||
|
self.database_dsn = (
|
||||||
f"postgresql+asyncpg://{settings.db.user}:{settings.db.password}"
|
f"postgresql+asyncpg://{settings.db.user}:{settings.db.password}"
|
||||||
f"@{settings.db.host}:{settings.db.port}/{settings.db.name}"
|
f"@{settings.db.host}:{settings.db.port}/{settings.db.name}"
|
||||||
)
|
)
|
||||||
|
self.engine = create_async_engine(
|
||||||
|
self.database_dsn, echo=settings.debug, future=True
|
||||||
|
)
|
||||||
|
self.async_session = async_sessionmaker(
|
||||||
|
self.engine, class_=AsyncSession, expire_on_commit=False
|
||||||
|
)
|
||||||
|
|
||||||
engine = create_async_engine(database_dsn, echo=True, future=True)
|
|
||||||
|
|
||||||
async_session = async_sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
|
db = AsyncDB()
|
||||||
|
|
||||||
|
|
||||||
async def get_session() -> typing.AsyncGenerator[AsyncSession, typing.Any]:
|
async def get_session() -> typing.AsyncGenerator[AsyncSession, typing.Any]:
|
||||||
async with async_session() as session:
|
async with db.async_session() as session:
|
||||||
|
try:
|
||||||
yield session
|
yield session
|
||||||
|
except Exception:
|
||||||
|
await session.rollback()
|
||||||
|
raise
|
||||||
|
|
Loading…
Reference in New Issue
Block a user