mirror of
https://github.com/tiennm99/DocsGPT.git
synced 2026-10-03 09:12:55 +00:00
The backend import package is now docsgpt, the name it will carry on PyPI; application was far too generic to install into anyone's site-packages. git mv plus a mechanical rewrite of every import, dotted string and path reference: 734 Python files, the compose files, Dockerfile, workflows, docs, setup scripts, devcontainer, k8s manifests, vscode config, pytest and coverage config, .gitignore. Behaviour is unchanged. Kept for one release: - A top-level application package whose meta-path finder resolves application.x.y to the already-imported docsgpt.x.y object, so old imports and entry points (celery -A application.app.celery, uvicorn application.asgi:asgi_app) keep working with a FutureWarning. - Celery registers every application.* task name as an alias of its docsgpt.* task on start-up, so messages queued by the previous release still run. The redbeat key prefix moves to redbeat:docsgpt:v2: so schedule entries the previous release wrote are left unread instead of firing twice. The backend image builds from the repository root (docker build -f docsgpt/Dockerfile .) so it can ship the alias package; a root .dockerignore allow-lists docsgpt/ and application/ and keeps caches, local data, .env files, the sample index files and the Dockerfile out. Compose and the image workflows point at the new context.
93 lines
3.4 KiB
Python
93 lines
3.4 KiB
Python
"""Alembic environment for the DocsGPT user-data Postgres database.
|
|
|
|
The URL is pulled from ``docsgpt.core.settings`` rather than
|
|
``alembic.ini`` so that a single ``POSTGRES_URI`` env var drives both the
|
|
running app and ``alembic`` CLI invocations.
|
|
"""
|
|
|
|
import sys
|
|
from logging.config import fileConfig
|
|
from pathlib import Path
|
|
|
|
# Make the project root importable regardless of cwd. env.py lives at
|
|
# <repo>/docsgpt/alembic/env.py, so parents[2] is the repo root.
|
|
_PROJECT_ROOT = Path(__file__).resolve().parents[2]
|
|
if str(_PROJECT_ROOT) not in sys.path:
|
|
sys.path.insert(0, str(_PROJECT_ROOT))
|
|
|
|
from alembic import context # noqa: E402
|
|
from sqlalchemy import engine_from_config, pool # noqa: E402
|
|
|
|
from docsgpt.core.settings import settings # noqa: E402
|
|
from docsgpt.storage.db.models import metadata as target_metadata # noqa: E402
|
|
|
|
config = context.config
|
|
|
|
# Populate the runtime URL from settings.
|
|
if settings.POSTGRES_URI:
|
|
config.set_main_option("sqlalchemy.url", settings.POSTGRES_URI)
|
|
|
|
if config.config_file_name is not None and config.attributes.get("configure_logger", True):
|
|
# ``fileConfig`` reconfigures the ROOT logger from ``[logger_root]``
|
|
# (level WARNING, a stderr handler), which drops every ``application.*``
|
|
# INFO record, detaches the OTLP handler and the request/trace filter that
|
|
# ``setup_logging()`` installed, and cannot be undone by
|
|
# ``disable_existing_loggers=False`` — that flag only governs whether
|
|
# existing loggers are switched off. ``app.py`` calls ``setup_logging()``
|
|
# before ``ensure_database_ready()``, so an in-process migration would
|
|
# silence the web tier for the life of the process, on exactly the boot
|
|
# where a schema upgrade happened. In-process callers opt out via
|
|
# ``cfg.attributes``; the alembic CLI still gets its configured logging.
|
|
fileConfig(config.config_file_name, disable_existing_loggers=False)
|
|
|
|
|
|
def run_migrations_offline() -> None:
|
|
"""Run migrations in 'offline' mode (emits SQL without a live DB)."""
|
|
url = config.get_main_option("sqlalchemy.url")
|
|
if not url:
|
|
raise RuntimeError(
|
|
"POSTGRES_URI is not configured. Set it in your .env to a "
|
|
"psycopg3 URI such as "
|
|
"'postgresql+psycopg://user:pass@host:5432/docsgpt'."
|
|
)
|
|
context.configure(
|
|
url=url,
|
|
target_metadata=target_metadata,
|
|
literal_binds=True,
|
|
dialect_opts={"paramstyle": "named"},
|
|
compare_type=True,
|
|
)
|
|
with context.begin_transaction():
|
|
context.run_migrations()
|
|
|
|
|
|
def run_migrations_online() -> None:
|
|
"""Run migrations in 'online' mode against a live connection."""
|
|
if not config.get_main_option("sqlalchemy.url"):
|
|
raise RuntimeError(
|
|
"POSTGRES_URI is not configured. Set it in your .env to a "
|
|
"psycopg3 URI such as "
|
|
"'postgresql+psycopg://user:pass@host:5432/docsgpt'."
|
|
)
|
|
connectable = engine_from_config(
|
|
config.get_section(config.config_ini_section, {}),
|
|
prefix="sqlalchemy.",
|
|
poolclass=pool.NullPool,
|
|
future=True,
|
|
)
|
|
|
|
with connectable.connect() as connection:
|
|
context.configure(
|
|
connection=connection,
|
|
target_metadata=target_metadata,
|
|
compare_type=True,
|
|
)
|
|
with context.begin_transaction():
|
|
context.run_migrations()
|
|
|
|
|
|
if context.is_offline_mode():
|
|
run_migrations_offline()
|
|
else:
|
|
run_migrations_online()
|