Merge pull request #224 from grillazz/switch-logger-to-rotoger

docker arch refactor
This commit is contained in:
Ordinary Hobbit
2025-11-13 13:06:34 +01:00
committed by GitHub
7 changed files with 749 additions and 884 deletions

View File

@@ -12,7 +12,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: [ "3.13" ]
python-version: [ "3.14" ]
env:
PYTHONDONTWRITEBYTECODE: 1

View File

@@ -1,32 +1,28 @@
FROM ubuntu:oracular AS build
FROM ubuntu:25.10 AS base
RUN apt-get update -qy && apt-get install -qyy \
RUN apt-get update -qy \
&& apt-get install -qyy \
-o APT::Install-Recommends=false \
-o APT::Install-Suggests=false \
build-essential \
ca-certificates \
python3-setuptools \
python3.13-dev \
git
python3.14-dev
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
ENV UV_LINK_MODE=copy \
UV_COMPILE_BYTECODE=1 \
UV_PYTHON_DOWNLOADS=never \
UV_PYTHON=python3.13 \
UV_PYTHON=python3.14 \
UV_PROJECT_ENVIRONMENT=/panettone
COPY pyproject.toml /_lock/
COPY uv.lock /_lock/
RUN --mount=type=cache,target=/root/.cache
RUN cd /_lock && uv sync \
--locked \
--no-dev \
--no-install-project
RUN cd /_lock && uv sync --locked --no-install-project
##########################################################################
FROM ubuntu:oracular
FROM ubuntu:25.10
ENV PATH=/panettone/bin:$PATH
@@ -38,15 +34,14 @@ STOPSIGNAL SIGINT
RUN apt-get update -qy && apt-get install -qyy \
-o APT::Install-Recommends=false \
-o APT::Install-Suggests=false \
python3.13 \
libpython3.13 \
libpcre3 \
libxml2
python3.14 \
libpython3.14 \
libpcre3
RUN apt-get clean
RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
COPY --from=build --chown=panettone:panettone /panettone /panettone
COPY --from=base --chown=panettone:panettone /panettone /panettone
USER panettone
WORKDIR /panettone
@@ -56,8 +51,4 @@ COPY /templates/ templates/
COPY .env app/
COPY alembic.ini /panettone/alembic.ini
COPY /alembic/ /panettone/alembic/
COPY pyproject.toml /panettone/pyproject.toml
RUN python -V
RUN python -Im site
RUN python -Ic 'import uvicorn'
COPY pyproject.toml /panettone/pyproject.toml

View File

@@ -26,7 +26,7 @@ docker-up: ## Run project with compose
docker-clean: ## Clean and reset project containers and volumes
docker compose down -v --remove-orphans | true
docker compose rm -f | true
docker volume rm panettone_postgres_data | true
docker volume ls -q | grep panettone_postgres_data | xargs -r docker volume rm | true
# ====================================================================================
# DATABASE MIGRATIONS

View File

@@ -20,8 +20,10 @@ services:
ports:
- "8080:8080"
depends_on:
- postgres
- redis
postgres:
condition: service_healthy
redis:
condition: service_started
postgres:
container_name: panettone_postgres

View File

@@ -1,90 +0,0 @@
[tool.poetry]
name = "fastapi-sqlalchemy-asyncpg"
version = "0.0.17"
description = ""
authors = ["Jakub Miazek <the@grillazz.com>"]
packages = []
license = "MIT"
package-mode = false
[tool.poetry.dependencies]
python = "^3.13"
fastapi = {version = "^0.115.6", extras = ["all"]}
pydantic = {version = "^2.10.3", extras = ["email"]}
pydantic-settings = "^2.7.0"
sqlalchemy = "^2.0.36"
uvicorn = { version = "^0.34.0", extras = ["standard"]}
asyncpg = "^0.30.0"
alembic = "^1.14.0"
httpx = "^0.28.1"
pytest = "^8.3.4"
pytest-cov = "^6.0.0"
uvloop = "^0.21.0"
httptools = "^0.6.4"
rich = "^13.9.4"
pyjwt = {version = "^2.10.1", extras = ["cryptography"]}
redis = "^5.2.1"
bcrypt = "^4.2.1"
polars = "^1.17.1"
python-multipart = "^0.0.20"
fastexcel = "^0.12.0"
fastapi-cache2 = "^0.2.1"
inline-snapshot = "^0.17.0"
dirty-equals = "^0.8.0"
polyfactory = "^2.18.1"
granian = "^1.7.0"
apscheduler = {version = "^4.0.0a5", extras = ["redis,sqlalchemy"]}
pendulum = {git = "https://github.com/sdispater/pendulum.git", rev="develop"}
[tool.poetry.group.dev.dependencies]
devtools = { extras = ["pygments"], version = "^0.12.2" }
safety = "*"
pyupgrade = "*"
ipython = "^8.26.0"
ruff = "^0.6.1"
sqlacodegen = "^3.0.0rc5"
tryceratops = "^2.3.3"
locust = "^2.31.3"
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
[tool.ruff]
line-length = 120
indent-width = 4
lint.select = ["E", "F", "UP", "N", "C", "B"]
lint.ignore = ["E501"]
# Exclude a variety of commonly ignored directories.
exclude = ["alembic",]
# Assume Python 3.13
target-version = "py313"
[tool.ruff.lint.flake8-quotes]
docstring-quotes = "double"
[tool.ruff.lint.flake8-bugbear]
extend-immutable-calls = ["fastapi.Depends",]
[tool.pytest.ini_options]
addopts = "-v --doctest-modules --doctest-glob=*.md --ignore=alembic"
asyncio_mode = "strict"
env_files = [".env"]
[tool.tryceratops]
exclude = ["alembic",]
[tool.ruff.format]
# Like Black, use double quotes for strings.
quote-style = "double"
# Like Black, indent with spaces, rather than tabs.
indent-style = "space"
# Like Black, respect magic trailing commas.
skip-magic-trailing-comma = false
# Like Black, automatically detect the appropriate line ending.
line-ending = "auto"

View File

@@ -1,15 +1,15 @@
[project]
name = "fastapi-sqlalchemy-asyncpg"
version = "0.21.0"
version = "0.22.0"
description = "A modern FastAPI application with SQLAlchemy 2.0 and AsyncPG for high-performance async database operations. Features include JWT authentication with Redis token storage, password hashing, connection pooling, data processing with Polars, Rich logging, task scheduling with APScheduler, and Shakespeare datasets integration."
readme = "README.md"
requires-python = ">=3.13"
requires-python = ">=3.14"
dependencies = [
"fastapi[all]>=0.116.2",
"pydantic[email]>=2.12.0a1",
"pydantic-settings>=2.10.1",
"sqlalchemy>=2.0.43",
"uvicorn[standard]>=0.36.0",
"sqlalchemy==2.0.44",
"uvicorn==0.38.0",
"asyncpg>=0.30.0",
"alembic>=1.16.5",
"httpx>=0.28.1",
@@ -21,7 +21,7 @@ dependencies = [
"pyjwt>=2.10.1",
"redis>=6.4.0",
"bcrypt>=4.3.0",
"polars[pyarrow]>=1.33.1",
"polars==1.35.2",
"python-multipart>=0.0.20",
"fastexcel>=0.15.1",
"inline-snapshot>=0.29.0",
@@ -29,7 +29,7 @@ dependencies = [
"polyfactory>=2.22.2",
"granian>=2.5.4",
"apscheduler[redis,sqlalchemy]>=4.0.0a6",
"rotoger>=0.1.1",
"rotoger==0.1.1",
]
[tool.uv]

1484
uv.lock generated

File diff suppressed because it is too large Load Diff