From 51de3c7a6d651545cb0eb1be252280e3f3b3a5dc Mon Sep 17 00:00:00 2001
From: badbl0cks <4161747+badbl0cks@users.noreply.github.com>
Date: Fri, 23 May 2025 21:19:33 -0700
Subject: [PATCH 1/3] feat(dev): Enable hot reloading and streamline local
development
This commit significantly improves the local development experience by enabling hot reloading for the Django application. This is achieved by installing the project as an editable package within the Docker services.
Key changes:
- **Hot Reloading:**
- Modified `docker-compose.yml` for `web` and `celery` services to use `uv pip install --editable . --no-deps`.
- Mounted the project root (`./`) to `/code` in `web` and `celery` services to facilitate the editable install.
- **Docker & Build Enhancements:**
- Added `uv` binary to stage-1 in the `Dockerfile` for faster package operations.
- Adjusted file permissions in `Dockerfile` during the app copy.
- Set `DEBUG=true` for the `web` service in `docker-compose.yml` for easier local debugging.
- Changed `restart` policy to `unless-stopped` for `web` and `celery` dev services.
- Added a healthcheck for the `redis` service in the dev `docker-compose.yml`.
- **Code & Script Cleanup:**
- Removed the custom `HealthCheckView` from the `home` app, as health checks are now handled by django-health-checks.
- Updated paths and commands in `scripts/entrypoint.sh`, `scripts/prebuild.sh`, and `scripts/reset-db_make-migrations_seed-data.sh` to align with the new setup and remove obsolete steps (e.g., db cache table creation; we now use redis).
---
Dockerfile | 3 +-
docker-compose.yml | 28 +++++++++++++------
scripts/entrypoint.sh | 4 +--
scripts/prebuild.sh | 5 ++--
scripts/reset-db_make-migrations_seed-data.sh | 8 ++----
src/pkmntrade_club/home/urls.py | 2 +-
src/pkmntrade_club/home/views.py | 26 -----------------
7 files changed, 28 insertions(+), 48 deletions(-)
diff --git a/Dockerfile b/Dockerfile
index f0aa4ae..04896ce 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -86,8 +86,9 @@ EOT
# See .
STOPSIGNAL SIGINT
-COPY --from=build --chown=app:app /app /app
+COPY --from=build --chown=app:app --chmod=u+rw /app /app
+COPY --from=ghcr.io/astral-sh/uv:0.7.2 /uv /app/bin/uv
COPY --chown=app:app --chmod=700 /scripts/entrypoint.sh /entrypoint.sh
COPY --chown=app:app --chmod=700 /scripts/deploy.sh /deploy.sh
COPY --chown=app:app --chmod=700 /manage.py /app/manage.py
diff --git a/docker-compose.yml b/docker-compose.yml
index dbde604..40ea63c 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,30 +1,41 @@
services:
web:
build: .
- #command: ["django-admin", "runserver", "0.0.0.0:8000"]
+ command: bash -c "cd /code && uv pip install --editable . --no-deps && python manage.py runserver 0.0.0.0:8000"
ports:
- - 8000:8000
- restart: always
+ - "8000:8000"
+ restart: unless-stopped
+ environment:
+ - DEBUG=true
volumes:
- ./seed:/seed:ro
- # DANGEROUS DUE TO DOCKERFILE PACKAGE BUILDING/INSTALLATION
- # will need to use editable package instead somehow
- #- ./src/pkmntrade_club:/app/lib/python3.12/site-packages/pkmntrade_club:ro
+ - ./:/code
depends_on:
db:
condition: service_healthy
+ redis:
+ condition: service_started
celery:
build: .
- command: ["celery", "-A", "pkmntrade_club.django_project", "worker", "-l", "INFO", "-B", "-E"]
- restart: always
+ command: bash -c "cd /code && uv pip install --editable . --no-deps && celery -A pkmntrade_club.django_project worker -l INFO -B -E"
+ restart: unless-stopped
+ volumes:
+ - ./:/code
depends_on:
db:
condition: service_healthy
+ redis:
+ condition: service_started
redis:
image: redis:latest
restart: always
ports:
- 6379:6379
+ healthcheck:
+ test: ["CMD", "redis-cli", "ping"]
+ interval: 10s
+ timeout: 5s
+ retries: 5
db:
image: postgres:16
restart: always
@@ -37,6 +48,5 @@ services:
interval: 10s
timeout: 5s
retries: 5
-
volumes:
postgres_data:
\ No newline at end of file
diff --git a/scripts/entrypoint.sh b/scripts/entrypoint.sh
index 3e43ed2..e6e194f 100755
--- a/scripts/entrypoint.sh
+++ b/scripts/entrypoint.sh
@@ -8,10 +8,8 @@ fi
/deploy.sh
-# show command version before running it
-$1 --version
-
if [ "$1" == "granian" ]; then
+ granian --version
echo "Appending static files path to granian command (requires granian >= 2.3.0)"
STATIC_ROOT=$(python -c 'import os; import pkmntrade_club; from django.conf import settings; print(settings.STATIC_ROOT)')
set -- "$@" --static-path-mount "$STATIC_ROOT"
diff --git a/scripts/prebuild.sh b/scripts/prebuild.sh
index 93e436c..c6f540b 100755
--- a/scripts/prebuild.sh
+++ b/scripts/prebuild.sh
@@ -1,11 +1,12 @@
#!/bin/bash
+cd src/pkmntrade_club/
+
# Remove all files in staticfiles except .gitkeep
if [ -d "staticfiles" ]; then
find staticfiles -type f ! -name '.gitkeep' -delete
- find staticfiles -type d -empty -delete
fi
# Build the tailwind theme css
-cd src/pkmntrade_club/theme/static_src
+cd theme/static_src
npm install . && npm run build
\ No newline at end of file
diff --git a/scripts/reset-db_make-migrations_seed-data.sh b/scripts/reset-db_make-migrations_seed-data.sh
index 406e185..5ee4d66 100755
--- a/scripts/reset-db_make-migrations_seed-data.sh
+++ b/scripts/reset-db_make-migrations_seed-data.sh
@@ -9,18 +9,14 @@ source .env
set +a
uv run manage.py makemigrations --noinput
-echo "Resetting database... "
+echo "Resetting dev database... "
docker compose down \
&& docker volume rm -f pkmntradeclub_postgres_data \
&& ./scripts/rebuild-and-run.sh
# Wait for the database to be ready.
-echo "Waiting 15 seconds for the database to be ready, and migrations to be autorun..."
+echo "Waiting 15 seconds for migrations to be auto-run..."
sleep 15
-
-echo "Creating cache table..."
-docker compose exec -it web bash -c "django-admin createcachetable django_cache"
-
echo "Loading seed data..."
docker compose exec -it web bash -c "django-admin loaddata /seed/0*"
diff --git a/src/pkmntrade_club/home/urls.py b/src/pkmntrade_club/home/urls.py
index c135f7a..9dadbe0 100644
--- a/src/pkmntrade_club/home/urls.py
+++ b/src/pkmntrade_club/home/urls.py
@@ -1,6 +1,6 @@
from django.urls import path
-from .views import HomePageView, HealthCheckView
+from .views import HomePageView
urlpatterns = [
path("", HomePageView.as_view(), name="home"),
diff --git a/src/pkmntrade_club/home/views.py b/src/pkmntrade_club/home/views.py
index cdf2449..cc05847 100644
--- a/src/pkmntrade_club/home/views.py
+++ b/src/pkmntrade_club/home/views.py
@@ -139,29 +139,3 @@ class HomePageView(TemplateView):
def get(self, request, *args, **kwargs):
"""Override get method to add caching"""
return super().get(request, *args, **kwargs)
-
-class HealthCheckView(View):
- def get(self, request, *args, **kwargs):
-
- try:
- from django.db import connection
- connection.cursor().execute("SELECT 1")
- except Exception as e:
- return HttpResponse("Database connection failed", status=500)
-
- try:
- from pkmntrade_club.trades.models import TradeOffer
- with contextlib.redirect_stdout(None):
- print(TradeOffer.objects.count())
- except Exception as e:
- return HttpResponse("DB models not reachable, but db is reachable", status=500)
-
- try:
- from django.core.cache import cache
- cache.set("test", "test")
- with contextlib.redirect_stdout(None):
- print(cache.get("test"))
- except Exception as e:
- return HttpResponse("Cache not reachable", status=500)
-
- return HttpResponse("OK/HEALTHY")
From acbbc33efa34621693c49689ba55b856e0f9abb7 Mon Sep 17 00:00:00 2001
From: badbl0cks <4161747+badbl0cks@users.noreply.github.com>
Date: Fri, 23 May 2025 21:35:52 -0700
Subject: [PATCH 2/3] fix(static): For now, replace `@` symbols from static js
filenames as granian doesn't handle URL-encoded static paths properly yet.
But the static file handling is faster with granian, so we want to keep it.
---
...alpinejs@3.14.8.min.js => alpinejs-3.14.8.min.js} | 0
...3.14.8.min.js => alpinejs.collapse-3.14.8.min.js} | 0
.../static/js/{count@v4.js => count-v4.js} | 0
....6.9.9.min.js => floating-ui_core-1.6.9.9.min.js} | 0
...13.13.min.js => floating-ui_dom-1.6.13.13.min.js} | 0
src/pkmntrade_club/theme/templates/base.html | 12 ++++++------
6 files changed, 6 insertions(+), 6 deletions(-)
rename src/pkmntrade_club/static/js/{alpinejs@3.14.8.min.js => alpinejs-3.14.8.min.js} (100%)
rename src/pkmntrade_club/static/js/{alpinejs.collapse@3.14.8.min.js => alpinejs.collapse-3.14.8.min.js} (100%)
rename src/pkmntrade_club/static/js/{count@v4.js => count-v4.js} (100%)
rename src/pkmntrade_club/static/js/{floating-ui_core@1.6.9.9.min.js => floating-ui_core-1.6.9.9.min.js} (100%)
rename src/pkmntrade_club/static/js/{floating-ui_dom@1.6.13.13.min.js => floating-ui_dom-1.6.13.13.min.js} (100%)
diff --git a/src/pkmntrade_club/static/js/alpinejs@3.14.8.min.js b/src/pkmntrade_club/static/js/alpinejs-3.14.8.min.js
similarity index 100%
rename from src/pkmntrade_club/static/js/alpinejs@3.14.8.min.js
rename to src/pkmntrade_club/static/js/alpinejs-3.14.8.min.js
diff --git a/src/pkmntrade_club/static/js/alpinejs.collapse@3.14.8.min.js b/src/pkmntrade_club/static/js/alpinejs.collapse-3.14.8.min.js
similarity index 100%
rename from src/pkmntrade_club/static/js/alpinejs.collapse@3.14.8.min.js
rename to src/pkmntrade_club/static/js/alpinejs.collapse-3.14.8.min.js
diff --git a/src/pkmntrade_club/static/js/count@v4.js b/src/pkmntrade_club/static/js/count-v4.js
similarity index 100%
rename from src/pkmntrade_club/static/js/count@v4.js
rename to src/pkmntrade_club/static/js/count-v4.js
diff --git a/src/pkmntrade_club/static/js/floating-ui_core@1.6.9.9.min.js b/src/pkmntrade_club/static/js/floating-ui_core-1.6.9.9.min.js
similarity index 100%
rename from src/pkmntrade_club/static/js/floating-ui_core@1.6.9.9.min.js
rename to src/pkmntrade_club/static/js/floating-ui_core-1.6.9.9.min.js
diff --git a/src/pkmntrade_club/static/js/floating-ui_dom@1.6.13.13.min.js b/src/pkmntrade_club/static/js/floating-ui_dom-1.6.13.13.min.js
similarity index 100%
rename from src/pkmntrade_club/static/js/floating-ui_dom@1.6.13.13.min.js
rename to src/pkmntrade_club/static/js/floating-ui_dom-1.6.13.13.min.js
diff --git a/src/pkmntrade_club/theme/templates/base.html b/src/pkmntrade_club/theme/templates/base.html
index 9279351..7098131 100644
--- a/src/pkmntrade_club/theme/templates/base.html
+++ b/src/pkmntrade_club/theme/templates/base.html
@@ -38,8 +38,8 @@
-
-
+
+
@@ -130,13 +130,13 @@
-
+
-
+
-
-
+
+
{% block javascript %}{% endblock %}