From 8fc5d760575059606682a33402ee6657fff7762e Mon Sep 17 00:00:00 2001 From: Frank Wiles Date: Sun, 26 Feb 2023 14:48:47 -0600 Subject: [PATCH 1/4] Setup django-storages for S3 compatible storage when deployed --- config/settings.py | 13 +++++++++++++ core/storages.py | 8 ++++++++ kube/boost/values.yaml | 25 ++++++++++++------------- requirements.in | 1 + requirements.txt | 3 +++ 5 files changed, 37 insertions(+), 13 deletions(-) create mode 100644 core/storages.py diff --git a/config/settings.py b/config/settings.py index 5ede656b..4519abe7 100755 --- a/config/settings.py +++ b/config/settings.py @@ -339,5 +339,18 @@ if ENV_NAME == "Development Environment": elif ENV_NAME == "Production Environment": ENVIRONMENT_COLOR = "#E53E3E" +# S3 Compatiable Storage Settings +if not LOCAL_DEVELOPMENT: + AWS_ACCESS_KEY_ID = env("AWS_ACCESS_KEY_ID", default="changeme") + AWS_SECRET_ACCESS_KEY = env("AWS_SECRET_ACCESS_KEY", default="changeme") + MEDIA_BUCKET_NAME = env("MEDIA_BUCKET", default="changeme") + AWS_STORAGE_BUCKET_NAME = MEDIA_BUCKET_NAME + AWS_S3_OBJECT_PARAMETERS = {"CacheControl": "max-age=86400"} + AWS_DEFAULT_ACL = None + AWS_S3_ENDPOINT_URL = env("AWS_S3_ENDPOINT_URL", default="https://sfo2.digitaloceanspaces.com") + AWS_S3_REGION_NAME = env("AWS_S3_REGION_NAME", default="sfo2") + DEFAULT_FILE_STORAGE = "core.storages.MediaStorage" + MEDIA_URL = f"{AWS_S3_ENDPOINT_URL}/{MEDIA_BUCKET_NAME}/"" + # Markdown content BASE_CONTENT = env("BOOST_CONTENT_DIRECTORY", "/website") diff --git a/core/storages.py b/core/storages.py new file mode 100644 index 00000000..085ad7d5 --- /dev/null +++ b/core/storages.py @@ -0,0 +1,8 @@ +from storages.backends.s3boto3 import S3Boto3Storage + + +class MediaStorage(S3Boto3Storage): + bucket_name = settings.MEDIA_BUCKET_NAME + default_acl = "public-read" + file_overwrite = True + custom_domain = False diff --git a/kube/boost/values.yaml b/kube/boost/values.yaml index c3533b40..06fd0807 100644 --- a/kube/boost/values.yaml +++ b/kube/boost/values.yaml @@ -89,19 +89,18 @@ Env: key: key - name: ENVIRONMENT_NAME value: "Development Environment" -# Bucket is setup already, but not using storages just yet -# - name: AWS_ACCESS_KEY_ID -# valueFrom: -# secretKeyRef: -# name: digital-ocean-keys -# key: do_access_key -# - name: AWS_SECRET_ACCESS_KEY -# valueFrom: -# secretKeyRef: -# name: digital-ocean-keys -# key: do_secret_key -# - name: MEDIA_BUCKET_NAME -# value: boost-dev-media + - name: AWS_ACCESS_KEY_ID + valueFrom: + secretKeyRef: + name: media-bucket + key: access_key + - name: AWS_SECRET_ACCESS_KEY + valueFrom: + secretKeyRef: + name: media-bucket + key: secret_key + - name: MEDIA_BUCKET_NAME + value: boost-dev-media # Volumes Volumes: diff --git a/requirements.in b/requirements.in index eb40feac..d3adc8f2 100755 --- a/requirements.in +++ b/requirements.in @@ -16,6 +16,7 @@ psycopg2-binary whitenoise django-click Pillow==9.4.0 +django-storages # Logging django-tracer diff --git a/requirements.txt b/requirements.txt index 9c128195..78918d0a 100755 --- a/requirements.txt +++ b/requirements.txt @@ -80,6 +80,7 @@ django==3.2.2 # django-machina # django-redis # django-rest-auth + # django-storages # djangorestframework # model-bakery django-admin-env-notice==0.4 @@ -110,6 +111,8 @@ django-redis==5.0.0 # via -r ./requirements.in django-rest-auth==0.9.5 # via -r ./requirements.in +django-storages==1.13.2 + # via -r ./requirements.in django-test-plus==1.4.0 # via -r ./requirements.in django-tracer==0.9.3 From 45b9b7fb7941df13454444a673c908b1141d081c Mon Sep 17 00:00:00 2001 From: Frank Wiles Date: Mon, 27 Feb 2023 09:39:43 -0600 Subject: [PATCH 2/4] Fix typo in settings --- config/settings.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/config/settings.py b/config/settings.py index 4519abe7..44328338 100755 --- a/config/settings.py +++ b/config/settings.py @@ -347,10 +347,12 @@ if not LOCAL_DEVELOPMENT: AWS_STORAGE_BUCKET_NAME = MEDIA_BUCKET_NAME AWS_S3_OBJECT_PARAMETERS = {"CacheControl": "max-age=86400"} AWS_DEFAULT_ACL = None - AWS_S3_ENDPOINT_URL = env("AWS_S3_ENDPOINT_URL", default="https://sfo2.digitaloceanspaces.com") + AWS_S3_ENDPOINT_URL = env( + "AWS_S3_ENDPOINT_URL", default="https://sfo2.digitaloceanspaces.com" + ) AWS_S3_REGION_NAME = env("AWS_S3_REGION_NAME", default="sfo2") DEFAULT_FILE_STORAGE = "core.storages.MediaStorage" - MEDIA_URL = f"{AWS_S3_ENDPOINT_URL}/{MEDIA_BUCKET_NAME}/"" + MEDIA_URL = f"{AWS_S3_ENDPOINT_URL}/{MEDIA_BUCKET_NAME}/" # Markdown content BASE_CONTENT = env("BOOST_CONTENT_DIRECTORY", "/website") From b41769aa1669f53040d2f3ae9a025accd02d896a Mon Sep 17 00:00:00 2001 From: Frank Wiles Date: Mon, 27 Feb 2023 09:56:00 -0600 Subject: [PATCH 3/4] Fixing local vs CI issue --- core/storages.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/storages.py b/core/storages.py index 085ad7d5..0c3d1d3f 100644 --- a/core/storages.py +++ b/core/storages.py @@ -1,3 +1,5 @@ +from django.conf import settings + from storages.backends.s3boto3 import S3Boto3Storage From 0e51087e820e4ce9bcbf3ca4144ce7eebeb111c8 Mon Sep 17 00:00:00 2001 From: Frank Wiles Date: Mon, 27 Feb 2023 10:00:31 -0600 Subject: [PATCH 4/4] Use default file storage in CI --- config/test_settings.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/config/test_settings.py b/config/test_settings.py index 14637a1b..514df096 100644 --- a/config/test_settings.py +++ b/config/test_settings.py @@ -1,5 +1,4 @@ import logging - from .settings import * # noqa @@ -30,3 +29,6 @@ GITHUB_TOKEN = "changeme" # Make content relative to the project root BASE_CONTENT = BASE_DIR / "core/tests/content" + +# Don't use S3 in tests +DEFAULT_FILE_STORAGE = "django.core.files.storage.FileSystemStorage"