Отсутствие статических файлов после развертывания приложения Django
Я развернул многоконтейнерное Django-приложение на AWS EB с платформой ECS running on 64bit Amazon Linux 2/3.2.3
.
Вот Dockerrun.aws.json
файл.
{
"AWSEBDockerrunVersion": "2",
"containerDefinitions": [
{
"essential": true,
"image": "${AWS_ACOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_NAME}:${IMAGE_TAG}",
"mountPoints": [
{
"containerPath": "/code/static",
"sourceVolume": "web"
}
],
"name": "web",
"hostname": "web",
"memoryReservation": 1200,
"portMappings": [
{
"containerPort": 8000,
"hostPort": 8000
}
]
},
{
"name": "nginx-proxy",
"image": "nginx",
"essential": true,
"memoryReservation": 128,
"portMappings": [
{
"containerPort": 80,
"hostPort": 80
}
],
"mountPoints": [
{
"sourceVolume": "nginx-proxy-conf",
"containerPath": "/etc/nginx/nginx.conf"
}
],
"links": ["web"]
}
],
"volumes": [
{
"name": "web"
},
{
"name": "nginx-proxy-conf",
"host": {
"sourcePath": "/var/app/current/nginx.conf"
}
}
]
}
Вот nginx.conf
user nginx;
events {
worker_connections 1024;
}
http {
server {
listen 80;
location /static/ {
alias /static/;
}
location / {
proxy_pass http://web:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
Это Dockerfile
.
FROM python:3.10
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
RUN apt-get update
RUN apt-get upgrade -y
COPY ./requirements.txt requirements.txt
RUN apt-get install -y realmd
RUN pip install -r requirements.txt
WORKDIR /code
EXPOSE 8000
COPY . .
RUN chmod +x entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]
и entrypoint.sh
#!/bin/bash
python manage.py migrate --noinput >/tmp/migrate 2> /tmp/migrate_err
python manage.py collectstatic --no-input
yum install realmd
gunicorn \
--bind 0.0.0.0:8000 \
pos.wsgi:application
Итак, CodePipieline создает образ и развертывает на EB (с t3.small EC2). После развертывания статус "OK", когда я ввожу ссылку, сгенерированную EB и добавляю /admin в конце, я вижу панель администратора, но без стилей.[![введите описание изображения здесь][1]][1]][1]. Теперь приложение django подключено к базе данных RDS, и когда я пытаюсь войти в админ панель, я получаю 504 Gateway Time-out
или 502 Bad Gateway
. Я пытался добавить или удалить некоторые настройки из nginx.conf, но все равно не могу увидеть статические файлы.
Когда я подключаюсь к контейнеру Docker после ssh ing к экземпляру EC2, я вижу каталог /static/.
.
У меня есть эти строки в моем settings.py
STATIC_URL = "/static/"
STATIC_ROOT = os.path.join(BASE_DIR, "static")
Дайте мне знать, если есть чем поделиться. [1]: https://i.stack.imgur.com/cyA3z.png
Вы не указали это четко, но если ваши static
файлы не находятся на nginx
изображении, они не будут обслуживаться правильно.
Есть два варианта, как это исправить.
- отображение
static
папки между контейнерами (аналогичноnginx.conf
) .
- Удалите расположение
/static/
изnginx.conf
, передайте запросы статических файлов проксированному восходящему потоку (django
контейнеру).
Мне кажется, что вы не собрали файл статистики Django defaults
Setps:
- run command python manage.py collectstatic
- urlpatterns = [
path("", include("myapp.urls")),
path('admin/', admin.site.urls),
]
urlpatterns+=static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns+=static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)