From 3683b811df059bc02a77db90c5fe1be93377a9ce Mon Sep 17 00:00:00 2001
From: Martin Bauer
Date: Wed, 8 Apr 2026 22:28:49 +0200
Subject: [PATCH] static url fix
---
blechreiz/settings.py | 8 ++++++-
docker/entrypoint.sh | 21 +++++++++++++++++++
.../templates/eventplanner/countdown.inc.html | 4 ++--
.../eventplanner_gcal/management.html | 8 +++----
.../templates/musicians/addressbook.html | 8 +++----
musicians/templates/musicians/login.html | 10 ++++-----
musicians/views.py | 2 +-
requirements.txt | 9 +++++++-
.../scoremanager/list_repertoire.html | 2 +-
.../scoremanager/manage_repertoire.html | 10 ++++-----
.../templates/scoremanager/piece_view.html | 2 +-
.../templates/simpleforum/simpleforum.html | 8 +++----
website/templates/website/menu_column.html | 4 ++--
.../templates/website/slider_intern_area.html | 12 +++++------
14 files changed, 71 insertions(+), 37 deletions(-)
create mode 100644 docker/entrypoint.sh
diff --git a/blechreiz/settings.py b/blechreiz/settings.py
index 4e38710..a920b37 100644
--- a/blechreiz/settings.py
+++ b/blechreiz/settings.py
@@ -16,7 +16,8 @@ except ImportError:
# Django settings for blechreiz project.
-DEBUG = True
+# Set DJANGO_DEBUG=True in .env for local development; leave unset (or False) in production.
+DEBUG = os.environ.get("DJANGO_DEBUG", "False") == "True"
ADMINS = [
("Martin Bauer", "bauer_martin@gmx.de"),
@@ -76,6 +77,9 @@ PUBLIC_URLS = (
"^musicians/login/?$",
"^musicians/login/usernames/?$",
"^eventplanner_gcal/gcalApiCallback*",
+ # Static and media files must be accessible without login
+ r"^static/",
+ r"^media/",
)
# Additional locations of static files
@@ -94,6 +98,8 @@ SECRET_KEY = os.environ["DJANGO_SECRET_KEY"]
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
+ # WhiteNoise serves static files directly — must be right after SecurityMiddleware
+ "whitenoise.middleware.WhiteNoiseMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh
new file mode 100644
index 0000000..0c2e9a8
--- /dev/null
+++ b/docker/entrypoint.sh
@@ -0,0 +1,21 @@
+#!/bin/sh
+set -e
+
+cd /app
+
+echo "--- Installing/updating Python dependencies ---"
+pip install --quiet -r requirements.txt
+
+echo "--- Collecting static files ---"
+python manage.py collectstatic --noinput
+
+echo "--- Running database migrations ---"
+python manage.py migrate --noinput
+
+echo "--- Starting gunicorn ---"
+exec gunicorn blechreiz.wsgi:application \
+ --bind 0.0.0.0:8000 \
+ --workers 2 \
+ --timeout 120 \
+ --access-logfile - \
+ --error-logfile -
diff --git a/eventplanner/templates/eventplanner/countdown.inc.html b/eventplanner/templates/eventplanner/countdown.inc.html
index 8313e8c..080033c 100644
--- a/eventplanner/templates/eventplanner/countdown.inc.html
+++ b/eventplanner/templates/eventplanner/countdown.inc.html
@@ -1,11 +1,11 @@
{% load sekizai_tags static %} {% addtoblock "css" strip %}{% endaddtoblock %} {% addtoblock "css" strip %}{% endaddtoblock %} {% if countdown %} {% addtoblock "js" %}
diff --git a/eventplanner_gcal/templates/eventplanner_gcal/management.html b/eventplanner_gcal/templates/eventplanner_gcal/management.html
index 86f520f..273b0dc 100644
--- a/eventplanner_gcal/templates/eventplanner_gcal/management.html
+++ b/eventplanner_gcal/templates/eventplanner_gcal/management.html
@@ -4,7 +4,7 @@
{% block content %}
{% addtoblock "css" strip %}
-
+
{% endaddtoblock %}
{% addtoblock "css" %}
@@ -25,7 +25,7 @@
{% endaddtoblock %}
{% addtoblock "js" strip %}
-
+
{% endaddtoblock %}
{% addtoblock "js" %}
@@ -72,7 +72,7 @@
weil man alle anderen eigenen Termine auch im Blick hat.
-
+
SO GEHTS:
@@ -115,7 +115,7 @@
-

+
diff --git a/musicians/templates/musicians/addressbook.html b/musicians/templates/musicians/addressbook.html
index 832dbfd..8d8014b 100644
--- a/musicians/templates/musicians/addressbook.html
+++ b/musicians/templates/musicians/addressbook.html
@@ -1,16 +1,16 @@
{% extends "website/base.html" %} {% load sekizai_tags static %} {% block content %} {% addtoblock "css" strip %}{% endaddtoblock %} {% addtoblock "css" strip %}{% endaddtoblock %} {% addtoblock "css" strip %}{% endaddtoblock %} {% addtoblock "css" %}
{% endaddtoblock %} {% addtoblock "js" strip %}
-
+
{% endaddtoblock %} {% addtoblock "js" %}
+
{% endaddtoblock %} {% addtoblock "css" strip %}
{% endaddtoblock %} {% addtoblock "css" strip %}
diff --git a/musicians/views.py b/musicians/views.py
index 2a9b09c..63dac26 100644
--- a/musicians/views.py
+++ b/musicians/views.py
@@ -140,7 +140,7 @@ def logout_view(request):
def userlistForAutocompletion(request):
- result = [u.username for u in User.objects.all()]
+ result = [u.username for u in User.objects.filter(is_active=True).order_by("username")]
return HttpResponse(json.dumps(result), content_type="application/json")
diff --git a/requirements.txt b/requirements.txt
index ef7966f..af78914 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -23,4 +23,11 @@ reportlab>=4.2
# Image handling
Pillow>=10.4
-dotenv
\ No newline at end of file
+# Environment variable loading
+python-dotenv
+
+# Production WSGI server
+gunicorn>=22.0
+
+# Serve static files directly from gunicorn (no separate web server needed)
+whitenoise>=6.8
\ No newline at end of file
diff --git a/scoremanager/templates/scoremanager/list_repertoire.html b/scoremanager/templates/scoremanager/list_repertoire.html
index 936e407..7fe8368 100644
--- a/scoremanager/templates/scoremanager/list_repertoire.html
+++ b/scoremanager/templates/scoremanager/list_repertoire.html
@@ -88,7 +88,7 @@