Skip to content

Commit

Permalink
Improve static deploy (#2609)
Browse files Browse the repository at this point in the history
* Add a utility for purging Fastly by Surrogate-Key

* add a postdeploy step to purge surroage-keys for static files
  • Loading branch information
ewdurbin authored Sep 30, 2024
1 parent a9fab67 commit 18e1d74
Show file tree
Hide file tree
Showing 7 changed files with 50 additions and 3 deletions.
1 change: 1 addition & 0 deletions Procfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ release: python manage.py migrate --noinput
web: bin/start-nginx gunicorn -c gunicorn.conf pydotorg.wsgi
worker: celery -A pydotorg worker -l INFO
worker-beat: celery -A pydotorg beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler
postdeploy: python manage.py postdeploy
20 changes: 20 additions & 0 deletions fastly/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,23 @@ def purge_url(path):
return response

return None


def purge_surrogate_key(key):
"""
Purge a Fastly.com Surrogate-Key given a key.
"""
if settings.DEBUG:
return

api_key = getattr(settings, 'FASTLY_API_KEY', None)
service_id = getattr(settings, 'FASTLY_SERVICE_ID', None)
if api_key and service_id:
response = requests.request(
"POST",
f'https://api.fastly.com/service/{service_id}/purge/{key}',
headers={'Fastly-Key': api_key},
)
return response

return None
Empty file added pydotorg/management/__init__.py
Empty file.
Empty file.
14 changes: 14 additions & 0 deletions pydotorg/management/commands/postdeploy.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from django.core.management.base import BaseCommand
from django.conf import settings

from fastly.utils import purge_surrogate_key


class Command(BaseCommand):
""" Do things after deployment is complete """

def handle(self, *args, **kwargs):
# If we have a STATIC_SURROGATE_KEY set, purge static files to ensure
# that anything cached mid-deploy is ignored (like 404s).
if settings.STATIC_SURROGATE_KEY:
purge_surrogate_key(settings.STATIC_SURROGATE_KEY)
10 changes: 8 additions & 2 deletions pydotorg/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -285,8 +285,10 @@
MAILING_LIST_PSF_MEMBERS = "psf-members-announce-request@python.org"

### Fastly ###
FASTLY_API_KEY = False # Set to Fastly API key in production to allow pages to
# be purged on save
FASTLY_SERVICE_ID = False # Set to a Fastly Service ID in production to allow
# purges by Surrogate-Key
FASTLY_API_KEY = False # Set to Fastly API key in production to allow
# pages to be purged on save

# Jobs
JOB_THRESHOLD_DAYS = 90
Expand Down Expand Up @@ -349,6 +351,10 @@

GLOBAL_SURROGATE_KEY = 'pydotorg-app'

### pydotorg.settings.cabotage.add_surrogate_keys_to_static

STATIC_SURROGATE_KEY = 'pydotorg-static'

### PyCon Integration for Sponsor Voucher Codes
PYCON_API_KEY = config("PYCON_API_KEY", default="deadbeef-dead-beef-dead-beefdeadbeef")
PYCON_API_SECRET = config("PYCON_API_SECRET", default="deadbeef-dead-beef-dead-beefdeadbeef")
Expand Down
8 changes: 7 additions & 1 deletion pydotorg/settings/cabotage.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,11 @@
},
}

def add_surrogate_keys_to_static(headers, path, url):
headers['Surrogate-Key'] = STATIC_SURROGATE_KEY

WHITENOISE_ADD_HEADERS_FUNCTION = add_surrogate_keys_to_static

EMAIL_HOST = config('EMAIL_HOST')
EMAIL_HOST_USER = config('EMAIL_HOST_USER')
EMAIL_HOST_PASSWORD = config('EMAIL_HOST_PASSWORD')
Expand All @@ -63,7 +68,8 @@
PEP_REPO_PATH = None
PEP_ARTIFACT_URL = config('PEP_ARTIFACT_URL')

# Fastly API Key
# Fastly
FASTLY_SERVICE_ID = config('FASTLY_SERVICE_ID')
FASTLY_API_KEY = config('FASTLY_API_KEY')

SECURE_SSL_REDIRECT = True
Expand Down

0 comments on commit 18e1d74

Please sign in to comment.