Complete all deferred hardening items

1. PII in git: Removed 324MB AI/ directory (1012 files of user workout
   data) from git history via git-filter-repo. Added AI/ to .gitignore.

2. Python 3.9 EOL: Upgraded Dockerfile from python:3.9.13 to
   python:3.12-slim. Added build-essential and libpq-dev for C
   extension compilation. Changed netcat to netcat-openbsd (slim compat).

3. Stale dependencies: Updated all packages from 2023 pins to latest
   compatible versions. Django 4.2→5.2 LTS, celery 5.3→5.4+,
   gunicorn 20→23+, redis 4.6→5.0+, DRF 3.14→3.15+, whitenoise 6.4→6.7+,
   debug-toolbar 4.1→4.4+. Switched to >= ranges with upper bounds on
   major versions for celery, kombu, redis, and Django.

4. Retry loop cap: Reduced FINAL_CONFORMANCE_MAX_RETRIES from 4 to 2,
   capping worst-case recursive calls from 15 (3×5) to 9 (3×3).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-02-27 22:48:30 -06:00
parent a1f458ea2b
commit 3ffabf35e2
3 changed files with 49 additions and 49 deletions

View File

@@ -10,13 +10,14 @@ ENV NEXT_PUBLIC_API_URL=
RUN rm -rf .next && npm run build RUN rm -rf .next && npm run build
# ---- Stage 2: Final image (Python + Node runtime) ---- # ---- Stage 2: Final image (Python + Node runtime) ----
FROM python:3.9.13 FROM python:3.12-slim
ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1 ENV PYTHONUNBUFFERED=1
# System deps # System deps
RUN apt-get update && apt-get install -y \ RUN apt-get update && apt-get install -y \
swig libssl-dev dpkg-dev netcat ffmpeg \ build-essential libpq-dev \
swig libssl-dev dpkg-dev netcat-openbsd ffmpeg \
supervisor curl \ supervisor curl \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*

View File

@@ -178,7 +178,7 @@ WORKING_PREFIX = "Working"
# Final pass retries after full assembly (warmup + working + cooldown) # Final pass retries after full assembly (warmup + working + cooldown)
# to guarantee conformance before returning a workout. # to guarantee conformance before returning a workout.
FINAL_CONFORMANCE_MAX_RETRIES = 4 FINAL_CONFORMANCE_MAX_RETRIES = 2
# ====================================================================== # ======================================================================

View File

@@ -1,47 +1,46 @@
amqp==5.1.1 amqp>=5.2.0
asgiref==3.7.2 asgiref>=3.8.0
async-timeout==4.0.2 billiard>=4.2.0
billiard==4.1.0 celery>=5.4.0,<6.0
celery==5.3.1 click>=8.1.7
click==8.1.3 click-didyoumean>=0.3.1
click-didyoumean==0.3.0 click-plugins>=1.1.1
click-plugins==1.1.1 click-repl>=0.3.0
click-repl==0.3.0 defusedxml>=0.7.1
defusedxml==0.7.1 diff-match-patch>=20230430
diff-match-patch==20230430 Django>=5.2,<6.0
Django==4.2.2 django-debug-toolbar>=4.4.0
django-debug-toolbar==4.1.0 django-import-export>=4.0
django-import-export==3.2.0 django-push-notifications>=3.1.0
django-push-notifications==3.0.0 django-redis>=5.4.0
django-redis==5.3.0 djangorestframework>=3.15.0
djangorestframework==3.14.0 et-xmlfile>=2.0.0
et-xmlfile==1.1.0 gevent>=24.2.1
gevent==22.10.1 greenlet>=3.0.0
greenlet==1.1.3.post0 gunicorn>=23.0.0
gunicorn==20.1.0 kombu>=5.4.0,<6.0
kombu==5.3.1 MarkupPy>=1.14
MarkupPy==1.14 odfpy>=1.4.1
odfpy==1.4.1 openpyxl>=3.1.5
openpyxl==3.1.2 prompt-toolkit>=3.0.43
prompt-toolkit==3.0.38 psycopg2>=2.9.9
psycopg2==2.9.6 python-dateutil>=2.9.0
python-dateutil==2.8.2 pytz>=2024.1
pytz==2023.3 PyYAML>=6.0.1
PyYAML==6.0 redis>=5.0.0,<8.0
redis==4.6.0 six>=1.16.0
six==1.16.0 sqlparse>=0.5.0
sqlparse==0.4.4 tablib>=3.6.0
tablib==3.5.0 typing_extensions>=4.9.0
typing_extensions==4.6.3 tzdata>=2024.1
tzdata==2023.3 vine>=5.1.0
vine==5.0.0 wcwidth>=0.2.13
wcwidth==0.2.6 whitenoise>=6.7.0
whitenoise==6.4.0 xlrd>=2.0.1
xlrd==2.0.1 xlwt>=1.3.0
xlwt==1.3.0 zope.event>=5.0
zope.event==5.0 zope.interface>=6.4
zope.interface==6.0
python-ffmpeg-video-streaming>=0.1 python-ffmpeg-video-streaming>=0.1
numpy>=1.24.0 numpy>=1.26.0
scikit-learn>=1.3.0 scikit-learn>=1.4.0
django-cors-headers>=4.3.0 django-cors-headers>=4.4.0