forked from cardosofelipe/fast-next-template
Refactor and reorganize Alembic and database configuration.
Moved Alembic files into the `app/alembic` directory and updated related paths. Consolidated database configuration in `config.py`, leveraging environment variables and ensuring centralized management. Updated Docker Compose to include `.env` files, providing a more consistent environment setup.
This commit is contained in:
0
backend/__init__.py
Normal file
0
backend/__init__.py
Normal file
@@ -1,5 +1,5 @@
|
|||||||
[alembic]
|
[alembic]
|
||||||
script_location = alembic
|
script_location = app/alembic
|
||||||
sqlalchemy.url = postgresql://postgres:postgres@db:5432/app
|
sqlalchemy.url = postgresql://postgres:postgres@db:5432/app
|
||||||
|
|
||||||
[loggers]
|
[loggers]
|
||||||
|
|||||||
0
backend/app/alembic/__init__.py
Normal file
0
backend/app/alembic/__init__.py
Normal file
@@ -1,10 +1,24 @@
|
|||||||
|
import sys
|
||||||
from logging.config import fileConfig
|
from logging.config import fileConfig
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
from sqlalchemy import engine_from_config
|
from sqlalchemy import engine_from_config
|
||||||
from sqlalchemy import pool
|
from sqlalchemy import pool
|
||||||
|
|
||||||
from alembic import context
|
from alembic import context
|
||||||
|
|
||||||
|
# Get the path to the app directory (parent of 'alembic')
|
||||||
|
app_dir = Path(__file__).resolve().parent.parent
|
||||||
|
# Add the app directory to Python path
|
||||||
|
sys.path.append(str(app_dir.parent))
|
||||||
|
|
||||||
|
# Import Core modules
|
||||||
|
from app.core.config import settings
|
||||||
|
from app.core.database import Base
|
||||||
|
|
||||||
|
# Import all models to ensure they're registered with SQLAlchemy
|
||||||
|
from app.models import *
|
||||||
|
|
||||||
# this is the Alembic Config object, which provides
|
# this is the Alembic Config object, which provides
|
||||||
# access to the values within the .ini file in use.
|
# access to the values within the .ini file in use.
|
||||||
config = context.config
|
config = context.config
|
||||||
@@ -16,14 +30,10 @@ if config.config_file_name is not None:
|
|||||||
|
|
||||||
# add your model's MetaData object here
|
# add your model's MetaData object here
|
||||||
# for 'autogenerate' support
|
# for 'autogenerate' support
|
||||||
# from myapp import mymodel
|
target_metadata = Base.metadata
|
||||||
# target_metadata = mymodel.Base.metadata
|
|
||||||
target_metadata = None
|
|
||||||
|
|
||||||
# other values from the config, defined by the needs of env.py,
|
# Override the SQLAlchemy URL with the one from settings
|
||||||
# can be acquired:
|
config.set_main_option("sqlalchemy.url", settings.database_url)
|
||||||
# my_important_option = config.get_main_option("my_important_option")
|
|
||||||
# ... etc.
|
|
||||||
|
|
||||||
|
|
||||||
def run_migrations_offline() -> None:
|
def run_migrations_offline() -> None:
|
||||||
@@ -75,4 +85,4 @@ def run_migrations_online() -> None:
|
|||||||
if context.is_offline_mode():
|
if context.is_offline_mode():
|
||||||
run_migrations_offline()
|
run_migrations_offline()
|
||||||
else:
|
else:
|
||||||
run_migrations_online()
|
run_migrations_online()
|
||||||
0
backend/app/alembic/versions/__init__.py
Normal file
0
backend/app/alembic/versions/__init__.py
Normal file
@@ -1,29 +0,0 @@
|
|||||||
from pydantic_settings import BaseSettings
|
|
||||||
from typing import Optional, List
|
|
||||||
|
|
||||||
|
|
||||||
class Settings(BaseSettings):
|
|
||||||
PROJECT_NAME: Optional[str] = "App"
|
|
||||||
VERSION: Optional[str] = "1.0.0"
|
|
||||||
API_V1_STR: Optional[str] = "/api/v1"
|
|
||||||
|
|
||||||
# Database configuration
|
|
||||||
DATABASE_URL: Optional[str] = None
|
|
||||||
|
|
||||||
# JWT configuration
|
|
||||||
SECRET_KEY: Optional[str] = None
|
|
||||||
ALGORITHM: Optional[str] = "HS256"
|
|
||||||
ACCESS_TOKEN_EXPIRE_MINUTES: Optional[int] = 30
|
|
||||||
|
|
||||||
# CORS configuration
|
|
||||||
BACKEND_CORS_ORIGINS: Optional[List[str]] = ["http://localhost:3000"] # Frontend URL
|
|
||||||
|
|
||||||
# Admin user
|
|
||||||
FIRST_SUPERUSER_EMAIL: Optional[str] = None
|
|
||||||
FIRST_SUPERUSER_PASSWORD: Optional[str] = None
|
|
||||||
|
|
||||||
class Config:
|
|
||||||
env_file = ".env"
|
|
||||||
|
|
||||||
|
|
||||||
settings = Settings()
|
|
||||||
48
backend/app/core/config.py
Normal file
48
backend/app/core/config.py
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
from pydantic_settings import BaseSettings
|
||||||
|
from typing import Optional, List
|
||||||
|
|
||||||
|
|
||||||
|
class Settings(BaseSettings):
|
||||||
|
PROJECT_NAME: str = "App"
|
||||||
|
VERSION: str = "1.0.0"
|
||||||
|
API_V1_STR: str = "/api/v1"
|
||||||
|
|
||||||
|
# Database configuration
|
||||||
|
POSTGRES_USER: str = "postgres"
|
||||||
|
POSTGRES_PASSWORD: str = "postgres"
|
||||||
|
POSTGRES_HOST: str = "localhost"
|
||||||
|
POSTGRES_PORT: str = "5432"
|
||||||
|
POSTGRES_DB: str = "app"
|
||||||
|
DATABASE_URL: Optional[str] = None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def database_url(self) -> str:
|
||||||
|
"""
|
||||||
|
Get the SQLAlchemy database URL.
|
||||||
|
If DATABASE_URL is explicitly set, use that.
|
||||||
|
Otherwise, construct from components.
|
||||||
|
"""
|
||||||
|
if self.DATABASE_URL:
|
||||||
|
return self.DATABASE_URL
|
||||||
|
self.DATABASE_URL = f"postgresql://{self.POSTGRES_USER}:{self.POSTGRES_PASSWORD}@{self.POSTGRES_HOST}:{self.POSTGRES_PORT}/{self.POSTGRES_DB}"
|
||||||
|
return self.DATABASE_URL
|
||||||
|
|
||||||
|
# JWT configuration
|
||||||
|
SECRET_KEY: str = "your_secret_key_here"
|
||||||
|
ALGORITHM: str = "HS256"
|
||||||
|
ACCESS_TOKEN_EXPIRE_MINUTES: int = 30
|
||||||
|
|
||||||
|
# CORS configuration
|
||||||
|
BACKEND_CORS_ORIGINS: List[str] = ["http://localhost:3000"]
|
||||||
|
|
||||||
|
# Admin user
|
||||||
|
FIRST_SUPERUSER_EMAIL: Optional[str] = None
|
||||||
|
FIRST_SUPERUSER_PASSWORD: Optional[str] = None
|
||||||
|
|
||||||
|
class Config:
|
||||||
|
env_file = ".env"
|
||||||
|
env_file_encoding = "utf-8"
|
||||||
|
case_sensitive = True
|
||||||
|
|
||||||
|
|
||||||
|
settings = Settings()
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
from sqlalchemy import create_engine
|
from sqlalchemy import create_engine
|
||||||
from sqlalchemy.ext.declarative import declarative_base
|
from sqlalchemy.ext.declarative import declarative_base
|
||||||
from sqlalchemy.orm import sessionmaker
|
from sqlalchemy.orm import sessionmaker
|
||||||
import os
|
|
||||||
|
|
||||||
SQLALCHEMY_DATABASE_URL = os.getenv("DATABASE_URL", "postgresql://postgres:postgres@db:5432/app")
|
from app.core.config import settings
|
||||||
|
|
||||||
engine = create_engine(SQLALCHEMY_DATABASE_URL)
|
# Use the database URL from settings
|
||||||
|
engine = create_engine(settings.database_url)
|
||||||
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
||||||
|
|
||||||
Base = declarative_base()
|
Base = declarative_base()
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ services:
|
|||||||
- backend_dev_modules:/app/.venv
|
- backend_dev_modules:/app/.venv
|
||||||
ports:
|
ports:
|
||||||
- "8000:8000"
|
- "8000:8000"
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
environment:
|
environment:
|
||||||
- DATABASE_URL=${DATABASE_URL}
|
- DATABASE_URL=${DATABASE_URL}
|
||||||
- SECRET_KEY=${SECRET_KEY}
|
- SECRET_KEY=${SECRET_KEY}
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ services:
|
|||||||
context: ./backend
|
context: ./backend
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
target: production
|
target: production
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
environment:
|
environment:
|
||||||
- DATABASE_URL=${DATABASE_URL}
|
- DATABASE_URL=${DATABASE_URL}
|
||||||
- SECRET_KEY=${SECRET_KEY}
|
- SECRET_KEY=${SECRET_KEY}
|
||||||
|
|||||||
Reference in New Issue
Block a user