From dcff6a199985ed381321b5a489ccb775a8d9355e Mon Sep 17 00:00:00 2001 From: Muhammad Faraz Maqsood Date: Wed, 26 Jun 2024 10:21:06 +0500 Subject: [PATCH 1/4] fix: images does not persist On stopping discovery container and deleting it And starting it again, images gives 404 --- tutordiscovery/patches/local-docker-compose-dev-services | 3 ++- tutordiscovery/patches/local-docker-compose-services | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/tutordiscovery/patches/local-docker-compose-dev-services b/tutordiscovery/patches/local-docker-compose-dev-services index d48a7f9..ed1f6bf 100644 --- a/tutordiscovery/patches/local-docker-compose-dev-services +++ b/tutordiscovery/patches/local-docker-compose-dev-services @@ -4,8 +4,9 @@ discovery: command: ./manage.py runserver 0.0.0.0:8381 stdin_open: true tty: true - {%- for mount in iter_mounts(MOUNTS, "discovery") %} volumes: + - ../../data/discovery-media:/openedx/discovery/course_discovery/media + {%- for mount in iter_mounts(MOUNTS, "discovery") %} - {{ mount }} {%- endfor %} ports: diff --git a/tutordiscovery/patches/local-docker-compose-services b/tutordiscovery/patches/local-docker-compose-services index 6bd8e89..c53a607 100644 --- a/tutordiscovery/patches/local-docker-compose-services +++ b/tutordiscovery/patches/local-docker-compose-services @@ -5,6 +5,7 @@ discovery: restart: unless-stopped volumes: - ../plugins/discovery/apps/settings/tutor:/openedx/discovery/course_discovery/settings/tutor:ro + - ../../data/discovery-media:/openedx/discovery/course_discovery/media depends_on: - lms {% if RUN_MYSQL %}- mysql{% endif %} From 4aa9518d2580aba845aa3cab3d99d5977105d41e Mon Sep 17 00:00:00 2001 From: Muhammad Faraz Maqsood Date: Wed, 26 Jun 2024 10:22:31 +0500 Subject: [PATCH 2/4] fix: permission denied error for media directory """ discovery-1 | PermissionError: [Errno 13] Permission denied: '/openedx/discovery/course_discovery/media/media' discovery-1 | 2024-06-25 13:35:29,038 ERROR 7 [django.request] /openedx/venv/lib/python3.8/site-packages/django/utils/log.py:241 - Internal Server Error: /admin/course_metadata/program/9/change/ discovery-1 | Traceback (most recent call last): discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 55, in inner discovery-1 | response = get_response(request) discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 197, in _get_response discovery-1 | response = wrapped_callback(request, *callback_args, **callback_kwargs) discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/django/contrib/admin/options.py", line 688, in wrapper discovery-1 | return self.admin_site.admin_view(view)(*args, **kwargs) discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/django/utils/decorators.py", line 134, in _wrapper_view discovery-1 | response = view_func(request, *args, **kwargs) discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/django/views/decorators/cache.py", line 62, in _wrapper_view_func discovery-1 | response = view_func(request, *args, **kwargs) discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/django/contrib/admin/sites.py", line 242, in inner discovery-1 | return view(request, *args, **kwargs) discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/django_object_actions/utils.py", line 57, in change_view discovery-1 | return super(BaseDjangoObjectActions, self).change_view( discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/django/contrib/admin/options.py", line 1889, in change_view discovery-1 | return self.changeform_view(request, object_id, form_url, extra_context) discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/django/utils/decorators.py", line 46, in _wrapper discovery-1 | return bound_method(*args, **kwargs) discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/django/utils/decorators.py", line 134, in _wrapper_view discovery-1 | response = view_func(request, *args, **kwargs) discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/django/contrib/admin/options.py", line 1747, in changeform_view discovery-1 | return self._changeform_view(request, object_id, form_url, extra_context) discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/django/contrib/admin/options.py", line 1798, in _changeform_view discovery-1 | self.save_model(request, new_object, form, not add) discovery-1 | File "/openedx/discovery/./course_discovery/apps/course_metadata/admin.py", line 462, in save_model discovery-1 | super().save_model(request, obj, form, change) discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/simple_history/admin.py", line 228, in save_model discovery-1 | super().save_model(request, obj, form, change) discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/django/contrib/admin/options.py", line 1227, in save_model discovery-1 | obj.save() discovery-1 | File "/openedx/discovery/./course_discovery/apps/course_metadata/models.py", line 3613, in save discovery-1 | super().save(*args, **kwargs) discovery-1 | File "/openedx/discovery/./course_discovery/apps/course_metadata/models.py", line 102, in save discovery-1 | super().save(*args, **kwargs) discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/django_extensions/db/models.py", line 22, in save discovery-1 | super().save(**kwargs) discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/django/db/models/base.py", line 814, in save discovery-1 | self.save_base( discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/model_utils/tracker.py", line 375, in inner discovery-1 | return original(instance, *args, **kwargs) discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/django/db/models/base.py", line 877, in save_base discovery-1 | updated = self._save_table( discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/django/db/models/base.py", line 981, in _save_table discovery-1 | values = [ discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/django/db/models/base.py", line 985, in discovery-1 | (getattr(self, f.attname) if raw else f.pre_save(self, False)), discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/django/db/models/fields/files.py", line 317, in pre_save discovery-1 | file.save(file.name, file.file, save=False) discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/stdimage/models.py", line 32, in save discovery-1 | super().save(name, content, save) discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/django/db/models/fields/files.py", line 93, in save discovery-1 | self.name = self.storage.save(name, content, max_length=self.field.max_length) discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/django/core/files/storage/base.py", line 38, in save discovery-1 | name = self._save(name, content) discovery-1 | File "/openedx/venv/lib/python3.8/site-packages/django/core/files/storage/filesystem.py", line 87, in _save discovery-1 | os.makedirs(directory, exist_ok=True) discovery-1 | File "/usr/lib/python3.8/os.py", line 213, in makedirs discovery-1 | makedirs(head, exist_ok=exist_ok) discovery-1 | File "/usr/lib/python3.8/os.py", line 213, in makedirs discovery-1 | makedirs(head, exist_ok=exist_ok) discovery-1 | File "/usr/lib/python3.8/os.py", line 223, in makedirs discovery-1 | mkdir(name, mode) discovery-1 | PermissionError: [Errno 13] Permission denied: '/openedx/discovery/course_discovery/media/media' """ --- tutordiscovery/templates/discovery/build/discovery/Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tutordiscovery/templates/discovery/build/discovery/Dockerfile b/tutordiscovery/templates/discovery/build/discovery/Dockerfile index 87894cd..5f78c90 100644 --- a/tutordiscovery/templates/discovery/build/discovery/Dockerfile +++ b/tutordiscovery/templates/discovery/build/discovery/Dockerfile @@ -86,7 +86,10 @@ COPY --chown=app:app assets.py ./course_discovery/settings/assets.py RUN DJANGO_SETTINGS_MODULE=course_discovery.settings.assets make static # Create media directory to serve media files +# have to change user at this step, as it gives permission error +User app RUN mkdir course_discovery/media +User root # Run production server ENV DJANGO_SETTINGS_MODULE=course_discovery.settings.tutor.production From 655c40aa57e630439d44a3e92d7a91c09664a474 Mon Sep 17 00:00:00 2001 From: Muhammad Faraz Maqsood Date: Wed, 26 Jun 2024 12:01:15 +0500 Subject: [PATCH 3/4] doc: add changelog entry --- .../20240626_115731_faraz.maqsood_images_persistance_issue.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/20240626_115731_faraz.maqsood_images_persistance_issue.md diff --git a/changelog.d/20240626_115731_faraz.maqsood_images_persistance_issue.md b/changelog.d/20240626_115731_faraz.maqsood_images_persistance_issue.md new file mode 100644 index 0000000..02233c5 --- /dev/null +++ b/changelog.d/20240626_115731_faraz.maqsood_images_persistance_issue.md @@ -0,0 +1 @@ +- [BugFix] Fix images(media) persistance issue by mounting media directory in volumes through patches. (by @Faraz32123) From 4467226c0ede831dc72817544b68f2ee0ecc13be Mon Sep 17 00:00:00 2001 From: Muhammad Faraz Maqsood Date: Wed, 26 Jun 2024 13:59:02 +0500 Subject: [PATCH 4/4] refactor: address comments --- tutordiscovery/patches/local-docker-compose-dev-services | 2 +- tutordiscovery/patches/local-docker-compose-services | 2 +- tutordiscovery/templates/discovery/build/discovery/Dockerfile | 3 --- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/tutordiscovery/patches/local-docker-compose-dev-services b/tutordiscovery/patches/local-docker-compose-dev-services index ed1f6bf..95906db 100644 --- a/tutordiscovery/patches/local-docker-compose-dev-services +++ b/tutordiscovery/patches/local-docker-compose-dev-services @@ -5,7 +5,7 @@ discovery: stdin_open: true tty: true volumes: - - ../../data/discovery-media:/openedx/discovery/course_discovery/media + - ../../data/discovery/media:/openedx/discovery/course_discovery/media {%- for mount in iter_mounts(MOUNTS, "discovery") %} - {{ mount }} {%- endfor %} diff --git a/tutordiscovery/patches/local-docker-compose-services b/tutordiscovery/patches/local-docker-compose-services index c53a607..ddbf6ab 100644 --- a/tutordiscovery/patches/local-docker-compose-services +++ b/tutordiscovery/patches/local-docker-compose-services @@ -5,7 +5,7 @@ discovery: restart: unless-stopped volumes: - ../plugins/discovery/apps/settings/tutor:/openedx/discovery/course_discovery/settings/tutor:ro - - ../../data/discovery-media:/openedx/discovery/course_discovery/media + - ../../data/discovery/media:/openedx/discovery/course_discovery/media depends_on: - lms {% if RUN_MYSQL %}- mysql{% endif %} diff --git a/tutordiscovery/templates/discovery/build/discovery/Dockerfile b/tutordiscovery/templates/discovery/build/discovery/Dockerfile index 5f78c90..87894cd 100644 --- a/tutordiscovery/templates/discovery/build/discovery/Dockerfile +++ b/tutordiscovery/templates/discovery/build/discovery/Dockerfile @@ -86,10 +86,7 @@ COPY --chown=app:app assets.py ./course_discovery/settings/assets.py RUN DJANGO_SETTINGS_MODULE=course_discovery.settings.assets make static # Create media directory to serve media files -# have to change user at this step, as it gives permission error -User app RUN mkdir course_discovery/media -User root # Run production server ENV DJANGO_SETTINGS_MODULE=course_discovery.settings.tutor.production