Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve static deploy #2609

Merged
merged 2 commits into from
Sep 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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)
JacobCoffee marked this conversation as resolved.
Show resolved Hide resolved
if api_key and service_id:
JacobCoffee marked this conversation as resolved.
Show resolved Hide resolved
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.
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

ewdurbin marked this conversation as resolved.
Show resolved Hide resolved
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