GrampsWeb's fonts.css references url('fonts/file.woff2') but is served
from /ahnenforschung/fonts/fonts.css, causing the browser to request
/ahnenforschung/fonts/fonts/file.woff2 (double fonts/ directory).
Instead of relying on sub_filter to rewrite CSS content, add a dedicated
location block that proxies /ahnenforschung/fonts/fonts/ to the correct
/fonts/ path on the GrampsWeb container. This is more robust as it works
regardless of CSS content-type matching.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
GrampsWeb's fonts.css references fonts as url('fonts/MaterialIcons.woff2').
Since fonts.css is served from /ahnenforschung/fonts/fonts.css, the browser
resolves this to /ahnenforschung/fonts/fonts/MaterialIcons.woff2 (double
fonts/ directory). Strip the fonts/ prefix via sub_filter so the URL
resolves correctly to /ahnenforschung/fonts/MaterialIcons.woff2.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
The sub_filter rule '../fonts/' -> 'fonts/' was rewriting relative font
paths in CSS served from /ahnenforschung/fonts/fonts.css. This caused
the browser to resolve font URLs to /ahnenforschung/fonts/fonts/MaterialIcons.woff2
(double fonts/ directory). The original ../fonts/ paths resolve correctly
from the subpath without rewriting.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
GrampsWeb serves JS files with Content-Type text/javascript, but nginx
sub_filter_types only listed application/javascript. This caused JS bundles
to pass through without path rewriting, resulting in API calls going to
/api/ instead of /ahnenforschung/api/ (404 errors on login).
Co-Authored-By: Paperclip <noreply@paperclip.ing>
nginx includes text/html by default for sub_filter — adding it explicitly
causes a duplicate MIME type warning on reload.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Replace fragile container-side sed/JS patching with comprehensive nginx sub_filter
rules. The container now only handles admin user creation on startup. All SPA route
prefixing is done in nginx via a History API interceptor injected into HTML responses.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
GrampsWeb's SPA has <base href="/"> hardcoded at build time. The
GRAMPSWEB_BASE_URL env var is a full URL for API/OIDC, not a path prefix.
This means assets always load from root, hitting Django instead of GrampsWeb.
Fix: nginx sub_filter rewrites <base href="/"> to <base href="/ahnenforschung/">
so the browser resolves all SPA assets under the correct subpath.
Also revert BASE_URL default to a proper URL (not a path).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Archive deploy-production directory as deploy-production-archived (legacy)
- Add DOCKER_COMPOSE_README.md for documentation
- Main configuration now uses compose.yml with working Paperless integration
- Paperless API URL configured as https://vhtv-stiftung.de/paperless
- Add Paperless-ngx service to Docker Compose configuration
- Configure nginx routing for /paperless/ path with large file support
- Add production environment variables for Paperless
- Create automated setup script for initial Paperless configuration
- Add comprehensive production setup documentation
- Configure Paperless with HTTPS and proper database setup
- Update Django app to use production Paperless instance
- Update nginx config for HTTPS with Let's Encrypt certificates
- Add HTTP to HTTPS redirect
- Configure SSL security headers and HSTS
- Add Django HTTPS security settings for production
- Fix proxy_pass to use correct port 8081
- Enhance Content Security Policy for HTTPS
- Update settings.py to support both ALLOWED_HOSTS and DJANGO_ALLOWED_HOSTS
- Add production CSRF_TRUSTED_ORIGINS for vhtv-stiftung.de
- Update env-template.txt with production variable examples
- Improve compatibility between development and production environments