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 = ''
Вернуться на верх