Как развернуть приложение fastapi в EC2 с помощью docker-compose.yaml и докеризированного сервера nginx

Попытка переключиться на использование docker-compose для развертывания приложения на EC2. В то же время я хочу, чтобы nginx также был развернут в образе докера.

Докерфайл

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9

WORKDIR /app

COPY ./requirements.txt /app/requirements.txt

RUN pip install --no-cache-dir -r /app/requirements.txt

COPY . .

EXPOSE 8000

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

docker-compose.yaml

version: '3.9'

services:
  web:
    env_file: .env
    build: .
    command: sh -c "alembic upgrade head && uvicorn main:app --host 0.0.0.0 --port 8000"
    volumes:
      - .:/app
    ports:
      - 8000:8000
    depends_on:
      - db
      - redis
  db:
    image: postgres:11
    volumes:
      - postgres_data:/var/lib/postgresql/data
    expose:
      - 5432
    environment:
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASS}
      - POSTGRES_DB=${DB_NAME}
  redis:
    image: redis:6-alpine
    volumes:
      - redis_data:/data
  nginx:
    image: nginx:latest
    ports:
      - "8080:8080"
    volumes:
      - ./nginx_config.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - web

volumes:
  postgres_data:
  redis_data:

nginx_config.conf

server {
    listen 8080;
    server_name 3.70.228.88;

    location /static/ {
    root /app;
    try_files $uri $uri/ =404;
    }

    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;
    }
}

Бег sudo docker-compose up. Ошибок нет, выглядит хорошо

ubuntu@ip-172-31-24-232:~/wplay$ sudo docker-compose up
Starting wplay_redis_1 ... done
Starting wplay_db_1    ... done
Starting wplay_web_1   ... done
Starting wplay_nginx_1 ... done
Attaching to wplay_redis_1, wplay_db_1, wplay_web_1, wplay_nginx_1
db_1     | 
db_1     | PostgreSQL Database directory appears to contain a database; Skipping initialization
db_1     | 
db_1     | 2023-01-10 14:18:04.378 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
db_1     | 2023-01-10 14:18:04.378 UTC [1] LOG:  listening on IPv6 address "::", port 5432
db_1     | 2023-01-10 14:18:04.384 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db_1     | 2023-01-10 14:18:04.417 UTC [24] LOG:  database system was shut down at 2023-01-07 10:52:36 UTC
db_1     | 2023-01-10 14:18:04.451 UTC [1] LOG:  database system is ready to accept connections
redis_1  | 1:C 10 Jan 2023 14:18:04.034 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1  | 1:C 10 Jan 2023 14:18:04.034 # Redis version=6.2.8, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1  | 1:C 10 Jan 2023 14:18:04.034 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1  | 1:M 10 Jan 2023 14:18:04.034 * monotonic clock: POSIX clock_gettime
redis_1  | 1:M 10 Jan 2023 14:18:04.037 * Running mode=standalone, port=6379.
redis_1  | 1:M 10 Jan 2023 14:18:04.038 # Server initialized
redis_1  | 1:M 10 Jan 2023 14:18:04.038 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1  | 1:M 10 Jan 2023 14:18:04.039 * Loading RDB produced by version 6.2.8
redis_1  | 1:M 10 Jan 2023 14:18:04.039 * RDB age 271528 seconds
redis_1  | 1:M 10 Jan 2023 14:18:04.039 * RDB memory usage when created 0.77 Mb
redis_1  | 1:M 10 Jan 2023 14:18:04.039 # Done loading RDB, keys loaded: 0, keys expired: 0.
redis_1  | 1:M 10 Jan 2023 14:18:04.039 * DB loaded from disk: 0.001 seconds
redis_1  | 1:M 10 Jan 2023 14:18:04.039 * Ready to accept connections
nginx_1  | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
nginx_1  | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
nginx_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
nginx_1  | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
nginx_1  | 10-listen-on-ipv6-by-default.sh: info: /etc/nginx/conf.d/default.conf differs from the packaged version
nginx_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
nginx_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
nginx_1  | /docker-entrypoint.sh: Configuration complete; ready for start up
nginx_1  | 2023/01/10 14:18:05 [notice] 1#1: using the "epoll" event method
nginx_1  | 2023/01/10 14:18:05 [notice] 1#1: nginx/1.23.3
nginx_1  | 2023/01/10 14:18:05 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) 
nginx_1  | 2023/01/10 14:18:05 [notice] 1#1: OS: Linux 5.15.0-1026-aws
nginx_1  | 2023/01/10 14:18:05 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
nginx_1  | 2023/01/10 14:18:05 [notice] 1#1: start worker processes
nginx_1  | 2023/01/10 14:18:05 [notice] 1#1: start worker process 28
web_1    | INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
web_1    | INFO  [alembic.runtime.migration] Will assume transactional DDL.
web_1    | INFO:     Started server process [8]
web_1    | INFO:     Waiting for application startup.
web_1    | INFO:     Application startup complete.
web_1    | INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

Но когда я иду в http://<ip address> я получаю

This site can't be reached

В чем моя ошибка?

вверх

Адрес должен быть http://<ip_address>:8080, так как Nginx прослушивает порт 8080.

Triet Doan 10.01.2023 15:42

Пробовал, приложение пытается бесконечно загружаться, но безуспешно

Jekson 10.01.2023 15:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

А как насчет вашей группы безопасности? Например, вы открыли диапазон портов HTTP на порту 80?

Обновить вопрос с изображением

Jekson 10.01.2023 16:38

Похоже, вы были правы, я добавил новое правило с портом 8000 IPv4 Custom TCP TCP 8000 0.0.0.0/0, и оно сработало.

Jekson 10.01.2023 17:00

Другие вопросы по теме