Развертывание приложения django на контейнерах aws lightsail
ЧТО Я ПЫТАЮСЬ СДЕЛАТЬ И ЧТО Я СДЕЛАЛ
я пытаюсь развернуть приложение django через контейнер в amazon lightsail containers.
я нашел несколько руководств о том, как это сделать, но некоторые из них, кажется, усложняют все настолько, что файлы становятся нечитаемыми. в частности, все начинают использовать какую-то сложную базу данных, но я должен быть в порядке, используя стандартный db.sqlite3 из django.
наконец я наткнулся на этот учебник, который кажется достаточно понятным. я подумал, что могу просто пропустить часть Postgres и использовать все остальное. это сработало.
МОЯ КОНФИГУРАЦИЯ
Это мои файлы, которые управляют контейнерами. У меня есть многоконтейнерная установка. nginx действует как обратный прокси, который получает все запросы и обслуживает статические файлы и медиа. Другой контейнер - это приложение django. Я использую docker-compose для создания и запуска образов.
Dockerfiles
вот Dockerfile в моем приложении:
# pull official base image
FROM python:3.9.6
# set work directory its an absolute path
WORKDIR /usr/src/app
# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# install dependencies
RUN pip install --upgrade pip
COPY ./requirements.txt .
RUN pip install -r requirements.txt
# copy project
COPY . .
а это Dockerfile для nginx:
FROM nginx:1.21
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d
docker-compose
docker-compose используется для оркестровки двух в разработке:
version: '3.8'
services:
web:
build:
context: ./sito
dockerfile: Dockerfile
command: gunicorn sito.wsgi:application --bind 0.0.0.0:8000
volumes:
- static_volume:/home/app/web/static
- media_volume:/home/app/web/media
expose:
- 8000
env_file:
- ./.env.dev
nginx:
build: ./nginx
ports:
- 1337:80
volumes:
- static_volume:/home/app/web/static
- media_volume:/home/app/web/media
depends_on:
- web
volumes:
static_volume:
media_volume:
nginx conf
Наконец, это nginx.conf:
upstream sito {
server web:8000;
}
server {
listen 80;
location / {
proxy_pass http://sito;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
client_max_body_size 100M;
}
location /static/ {
autoindex on;
alias /home/app/web/static/;
}
location /media/ {
autoindex on;
alias /home/app/web/media/;
}
}
МОЯ ПРОБЛЕМА
Теперь о развертывании в контейнере lightsail. Я не могу использовать docker-compose для развертывания всего, поэтому мне нужно воссоздать настройки, указанные там при создании контейнера на aws.
Я хочу использовать контейнеры, для которых требуется "дистрибутив", представляющий собой образ+контейнер. Мои образы были загружены на dockerHub.
Я создаю 2 контейнера,
Первый - nginx (с именем "nginx"), изображение взято с dockerHub после того, как я загрузил свою версию (так что это не оригинальный nginx). В моем docker-compose я указываю порты, внутренний - 80 и внешний - 1337. Хотя в меню я могу указать внешний порт, я не уверен, нужно ли мне указывать (или как) другой порт (80).
Второй контейнер - это приложение (с именем "sito"), образ также взят с dockerhub, куда я его загрузил. Мой docker-compose определяет команду, которая запускает gunicorn, заставляя его слушать порт 8000, который я могу поместить при создании контейнера, и выставить порт 8000.
Я также объявляю 3 переменные:
- DJANGO_ALLOWED_HOSTS = localhost 127.0.0.1 [::1] >
- SECRET_KEY = mySecretKeyFromDjangoProject .
- DEBUG = 1
settings.py должен посмотреть на эти переменные и использовать их в django.
Распространение не работает. Журналы не дают мне никаких подсказок о том, что делать. вот журналы двух контейнеров:
Nginx log
Самое загадочное для меня в этом журнале - хост не найден в upstream.
Журнал сайта
это еще хуже, так как здесь говорится только о том, что шляпа заняла слишком много времени.
Я очень новичок в развертывании, особенно с контейнерами, поэтому я, возможно, сделал много ошибок, и, к сожалению, я не могу найти никакого правильного объяснения того, как это работает, поскольку документация amazon ужасна (по моему мнению), и обычно люди пытаются развернуть с помощью экземпляра.
N.B. Я знаю, что тома, указанные в файлах docker-compose, не создаются двумя контейнерами, но я полагаю, что это не проблема, так как это может вызвать проблемы с обслуживанием статических файлов, но это должно быть в состоянии функционировать в любом случае. Вы можете спросить, в чем мой вопрос, но у меня его нет, поскольку я совершенно не знаю, что делать. Я полагаю, они могут быть следующими :
- Did i misunderstood something?
- Can you point me to some good tutorial about amazon lightsail containers?
- what do you think about aws containers?
PS: пожалуйста, не хороните меня в даунвотсах
спасибо за внимание и помощь.