]> git.parisson.com Git - teleforma.git/commitdiff
better streaming and bucket option management
authorGuillaume Pellerin <guillaume.pellerin@free.fr>
Wed, 24 Apr 2024 12:11:41 +0000 (14:11 +0200)
committerGuillaume Pellerin <guillaume.pellerin@free.fr>
Wed, 24 Apr 2024 12:11:41 +0000 (14:11 +0200)
app/settings.py
etc/nginx.conf
teleforma/views/core.py

index 0b087050950be0c47df05a171bf643304ccb9063..58b9f144020fa38c7484485faeee32f319cc107f 100644 (file)
@@ -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.
index e2f934183e75f4fa71bea300cd8929a9dcb0024c..9996206e4eb243f920c13383d92f029a49ee24fa 100644 (file)
@@ -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/;
   }
index b2b013311510cbb1b72e6dc784c781ac07004dce..3681ea90af190ba56fe609e484c846a0e46ff00d 100644 (file)
@@ -280,13 +280,13 @@ def render_to_pdf(request, template, context, filename=None, encoding='utf-8',
     return HttpResponse('Errors rendering pdf:<pre>%s</pre>' % 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):