From: Guillaume Pellerin Date: Wed, 24 Apr 2024 12:11:41 +0000 (+0200) Subject: better streaming and bucket option management X-Git-Tag: 2.10.0~10 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=60fa66670f3d631c0232b8e9fa31d7f60517dc28;p=teleforma.git better streaming and bucket option management --- diff --git a/app/settings.py b/app/settings.py index 0b087050..58b9f144 100644 --- a/app/settings.py +++ b/app/settings.py @@ -138,6 +138,8 @@ MEDIA_URL = '/media/' DEFAULT_FILE_STORAGE='django.core.files.storage.FileSystemStorage' +MEDIA_S3_BUCKET = '/media/bucket/' + # Absolute path to the directory static files should be collected to. # Don't put anything in this directory yourself; store your static files # in apps' "static/" subdirectories and in STATICFILES_DIRS. diff --git a/etc/nginx.conf b/etc/nginx.conf index e2f93418..9996206e 100644 --- a/etc/nginx.conf +++ b/etc/nginx.conf @@ -26,6 +26,8 @@ server { root /var/www/html/; + set $bucket s3.gra.io.cloud.ovh.net; + location / { if (-f $document_root/maintenance/index.html) { return 503; @@ -70,11 +72,34 @@ server { internal; } -location /media/private/ { + location /media/private/ { alias /srv/crfpa-docker/var/media/private/; internal; } + location /media/bucket/ { + internal; + rewrite ^/media/bucket/(.*) /$1 break; + resolver 1.1.1.1; + proxy_http_version 1.1; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header Authorization ''; + proxy_set_header Host $bucket; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_hide_header x-amz-id-2; + proxy_hide_header x-amz-request-id; + proxy_hide_header x-amz-meta-server-side-encryption; + proxy_hide_header x-amz-server-side-encryption; + proxy_hide_header Set-Cookie; + proxy_ignore_headers Set-Cookie; + proxy_intercept_errors on; + add_header Cache-Control max-age=31536000; + proxy_pass https://$bucket; # without trailing slash + } + + location /static/ { alias /srv/crfpa-docker/var/static/; } diff --git a/teleforma/views/core.py b/teleforma/views/core.py index b2b01331..3681ea90 100644 --- a/teleforma/views/core.py +++ b/teleforma/views/core.py @@ -280,13 +280,13 @@ def render_to_pdf(request, template, context, filename=None, encoding='utf-8', return HttpResponse('Errors rendering pdf:
%s
' % escape(content)) -def serve_media(file, content_type="", buffering=True, streaming=False, bucket=True): +def serve_media(file, content_type="", buffering=True, streaming=False, bucket=False): if not content_type: content_type = guess_mimetypes(file.url) if not settings.DEBUG: if bucket: - url = '/media/bucket/' + file.url.split(settings.AWS_S3_ENDPOINT_URL)[-1] + url = settings.MEDIA_S3_BUCKET + file.url.split(settings.AWS_S3_ENDPOINT_URL)[-1] else: url = file.url return nginx_media_accel(url, content_type=content_type, @@ -714,7 +714,11 @@ class MediaView(CourseAccessMixin, DetailView): reverse("teleforma-media-detail", kwargs={"period_id": period_id, "pk": media.id})) if get_access(media, courses) and referer == media_detail_url: - return serve_media(media.file, content_type=media.mime_type, streaming=streaming) + return serve_media(media.file, + content_type=media.mime_type, + streaming=streaming, + bucket=False, + ) else: raise Http404("You don't have access to this media.") @@ -765,7 +769,11 @@ class MediaTranscodedView(CourseAccessMixin, DetailView): reverse("teleforma-media-transcoded", kwargs={"period_id": period_id, "pk": media.id})) if get_access(media, courses) and referer == media_detail_url: - return serve_media(media.file, content_type=media.mime_type, streaming=streaming) + return serve_media(media.file, + content_type=media.mime_type, + streaming=streaming, + bucket=False, + ) else: raise Http404("You don't have access to this media.") @@ -818,29 +826,32 @@ class DocumentView(CourseAccessMixin, DetailView): def dispatch(self, *args, **kwargs): return super(DocumentView, self).dispatch(*args, **kwargs) - def download(self, request, pk): + def serve(self, request, pk, streaming=False): courses = get_courses(request.user) document = Document.objects.get(pk=pk) + bucket = False + if get_access(document, courses): if settings.TELEFORMA_PRIVATE_DOCUMENTS_MODE: file = document.private_file(request.user) + if settings.TELEFORMA_PRIVATE_MEDIA_USE_S3: + bucket = True else: file = document.file - return serve_media(file, streaming=False) + + return serve_media( + file, + streaming=streaming, + bucket=bucket, + ) else: return redirect('teleforma-home') + def download(self, request, pk): + return self.serve(self, request, pk, streaming=False) + def view(self, request, pk): - courses = get_courses(request.user) - document = Document.objects.get(pk=pk) - if get_access(document, courses): - if settings.TELEFORMA_PRIVATE_DOCUMENTS_MODE: - file = document.private_file(request.user) - else: - file = document.file - return serve_media(file, streaming=True) - else: - return redirect('teleforma-home') + return self.serve(self, request, pk, streaming=True) class ConferenceView(CourseAccessMixin, DetailView):