Я пытаюсь выяснить, как использовать django-storageages-redux вместе с django-компрессором на настройке нескольких серверов. Все статические файлы должны храниться на Amazon S3 с помощью boto.Правильный способ использования django-хранилищ с django-компрессором на многосерверной установке
То, что я получил до сих пор
библиотеки:
boto==2.38.0
boto3==1.2.3
botocore==1.3.18
Django==1.7.7
django-compressor==1.6
django-storages-redux==1.3
Важные настройки:
S3_ACCESS_KEY_ID = "-- REMOVED --"
S3_SECRET_ACCESS_KEY = "-- REMOVED --"
S3_DOMAINURL_FRT = "image.mydomain.com"
S3_BUCKETNAME_FRT = "image.mydomain.com"
AWS_ACCESS_KEY_ID = S3_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY = S3_SECRET_ACCESS_KEY
AWS_STORAGE_BUCKET_NAME = S3_BUCKETNAME_FRT
AWS_S3_CUSTOM_DOMAIN = S3_DOMAINURL_FRT
AWS_QUERYSTRING_AUTH = False
AWS_S3_FILE_OVERWRITE = False
AWS_S3_SECURE_URLS = False
AWS_S3_USE_SSL = False
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'site-static'),
)
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'compressor.finders.CompressorFinder',
)
COMPRESS_STORAGE = STATICFILES_STORAGE = 'project.storage.CachedS3BotoStorage'
STATIC_URL = COMPRESS_URL = 'http://%s/' % S3_DOMAINURL_FRT
COMPRESS_OFFLINE = True
COMPRESS_OUTPUT_DIR = 'cache'
"project.storage" Код:
import os
from storages.backends.s3boto import S3BotoStorage
from django.core.files.storage import get_storage_class
os.environ['S3_USE_SIGV4'] = 'True'
class S3Storage(S3BotoStorage):
@property
def connection(self):
if self._connection is None:
self._connection = self.connection_class(
self.access_key, self.secret_key,
calling_format=self.calling_format, host='s3.eu-central-1.amazonaws.com')
return self._connection
class CachedS3BotoStorage(S3Storage):
def __init__(self, *args, **kwargs):
super(CachedS3BotoStorage, self).__init__(*args, **kwargs)
self.local_storage = get_storage_class(
"compressor.storage.CompressorFileStorage")()
def save(self, name, content):
name = super(CachedS3BotoStorage, self).save(name, content)
self.local_storage._save(name, content)
return name
def get_available_name(self, name):
""" Always overwrite existing file with the same name. """
name = self._clean_name(name)
return name
Проблемы
Поскольку у нас есть несколько серверов, мы используем COMPRESS_OFFLINE и запустить Джанго-компресс компресс команды. Эта команда генерирует файлы локально на сервере, на котором была запущена команда. Также manifest.json генерируется локально. Кроме того, поскольку мы используем django-хранилища, локальные файлы копируются на S3. Явление тоже. Но теперь при попытке запустить Джанго из другого веб-сервера, где эти файлы не присутствуют, мы столкнулись с ошибками, подобные этим:
You have offline compression enabled but key "677803469038e2efb349aad5ddc60c39" is missing from offline manifest. You may need to run "python manage.py compress".
Как мы можем сжать наши файлы на одном сервере, и пусть все остальные серверы используют эти файлы соединение с ведром S3? Я думаю, нам нужно каким-то образом получить файл manifest.json для всех остальных локальных файловых систем серверов?
Спасибо за вашу помощь заранее!