Wagtail / Django- изображения не отображаются в админке wagtail при публикации на рабочем сервере
Я использую Docker, PostgreSQL, Gunicorn и nginx. Я искал ответ везде. Все отлично работает на сервере разработки.
При публикации на рабочий сервер изображения не отображаются в админке wagtail, а в конце названия изображения добавляется набор цифр/букв (например, название изображения - money-3431461_19201.jpeg, но после публикации это money-3431461_19201_AP6jFFA.jpeg)
Dockerfile.prod
###########
# BUILDER #
###########
# pull official base image
FROM python:3.8.3-alpine as builder
# set work directory
WORKDIR /usr/src/wa-cms
# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# install Wagtail, Django and psycopg2 dependencies
RUN apk update \
&& apk add \
postgresql-dev \
gcc \
python3-dev \
musl-dev \
build-base \
jpeg-dev \
zlib-dev \
libwebp-dev \
openjpeg-dev
# lint
RUN pip install --upgrade pip --no-cache-dir
RUN pip install flake8
COPY . .
# install dependencies
COPY ./requirements.txt .
RUN pip wheel --no-cache-dir --no-deps --wheel-dir /usr/src/wa-cms/wheels -r requirements.txt
######################
# FINAL - PRODUCTION #
######################
# pull official base image
FROM python:3.8.3-alpine
# create directory for the app user
RUN mkdir -p /home/app
# create the app user
RUN addgroup -S app && adduser -S app -G app
# create the appropriate directories
ENV HOME=/home/app
ENV APP_HOME=/home/app/web
RUN mkdir $APP_HOME
RUN mkdir $APP_HOME/static
RUN mkdir $APP_HOME/media
WORKDIR $APP_HOME
# install dependencies
RUN apk update && apk add libpq \
postgresql-dev \
gcc \
python3-dev \
musl-dev \
build-base \
jpeg-dev \
zlib-dev \
libwebp-dev \
openjpeg-dev
RUN pip install --upgrade pip --no-cache-dir
COPY --from=builder /usr/src/wa-cms/wheels /wheels
COPY --from=builder /usr/src/wa-cms/requirements.txt .
RUN pip install --no-cache /wheels/*
# copy entrypoint-prod.sh
COPY ./entrypoint.prod.sh $APP_HOME
# copy project
COPY . $APP_HOME
# chown all the files to the app user
RUN chown -R app:app $APP_HOME
# change to the app user
USER app
# run entrypoint.prod.sh
ENTRYPOINT ["/home/app/web/entrypoint.prod.sh"]
docker-compose.prod.yml
version: "3.8"
services:
web:
build:
context: ./wa-cms
dockerfile: Dockerfile.prod
command: gunicorn backend.wsgi:application --bind 0.0.0.0:8000
volumes:
- static_volume:/home/app/web/static
- media_volume:/home/app/web/media
restart: unless-stopped
expose:
- 8000
env_file:
- ./.env.prod
depends_on:
- db
db:
image: postgres:12.0-alpine
volumes:
- postgres_data:/var/lib/postgresql/data/
env_file:
- ./.env.prod.db
restart: unless-stopped
nginx:
build: ./nginx
volumes:
- static_volume:/home/app/web/static
- media_volume:/home/app/web/media
ports:
- 80:80
depends_on:
- web
volumes:
postgres_data:
static_volume:
media_volume:
nginx.conf
upstream wtwacmsdev01 {
server web:8000;
}
server {
client_max_body_size 50M;
listen 80;
location / {
proxy_pass http://wtwacmsdev01;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
location /static/ {
alias /home/app/web/static/;
}
location /media/ {
alias /home/app/web/media/;
}
}
Я выполняю команды:
chmod +x wa-cms/entrypoint.prod.sh
docker-compose -f docker-compose.prod.yml up -d --build
winpty docker-compose -f docker-compose.prod.yml exec web python manage.py migrate --noinput
winpty docker-compose -f docker-compose.prod.yml exec web python manage.py collectstatic --no-input --clear
Если кто-нибудь может подсказать, что я делаю неправильно, буду очень признателен.
Мне трудно предложить варианты, потому что я не могу представить себе использование тома Docker для хранения загружаемого пользователем контента в продакшене. В Dev - да. Но для продакшена я обычно храню файлы в S3, чтобы они всегда были доступны и имели резервные копии. Что-то вроде приведенного ниже кода:
AWS_STORAGE_BUCKET_NAME = env('AWS_STORAGE_BUCKET_NAME', default=None)
if AWS_STORAGE_BUCKET_NAME:
# https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
MEDIA_ROOT = ''
MEDIA_URL = "http://{}.s3.amazonaws.com/".format(AWS_STORAGE_BUCKET_NAME)
AWS_S3_REGION_NAME = env('AWS_DEFAULT_REGION', default='us-west-2')
AWS_S3_FILE_OVERWRITE = True
AWS_DEFAULT_ACL = 'private'
else:
# Use a docker volume
DEFAULT_FILE_STORAGE = 'catalog.core.utils.FileSystemStorage'
# https://docs.djangoproject.com/en/4.0/ref/settings/#media-root
MEDIA_ROOT = '/media' # noqa
# https://docs.djangoproject.com/en/4.0/ref/settings/#media-url
MEDIA_URL = ''