@Kirill-Gorelov
С ума с IT

FastAPi build приложения?

У меня есть приложение написанное на fastapi.
Но у него есть проблема, что бы его запустить на сервере нужно сделать кучу манипуляций для его работы. И если меняется код, то нужно сделать почти туже самую работу.

Как это происходит сейчас.
Я создаю создаю службу в линуксе по примеру
[Unit]
Description=Gunicorn instance to serve MyApp
After=network.target

[Service]
User=user
Group=uuser
WorkingDirectory=/var/www/site.ru/public_html
Environment="PATH=/var/www/site.ru/public_html"
ExecStart=/usr/bin/python3.7 -m uvicorn sql_app.main:app --host xx.xx.xxx

[Install]
WantedBy=multi-user.target


Запускаю саму службу.
Прописываю конфиги в nginx для прокси что бы приложение открывалось по домену, а не по ip.
И если повезет, на новом сервере это все заработает хотя бы с раза 10......

И если я меняю код приложения, то мне нужно перезагрузить службу....
А это чертовский неудобно становится....

По билду приложения в доках примерно это все и описано. Но это неудобно, может есть способ иначе как это сделать?
Как-то же django само подтягивает изменения из гита и ничего перезагружать не нужно.

Скорее всего я делаю что-то не так, но как это переделать пока не представляю ....

Буду рад любой помощи.
  • Вопрос задан
  • 318 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Jack444
ExecStart=/usr/bin/python3.7 -m uvicorn sql_app.main:app --host xx.xx.xxx --reload
Ответ написан
Buchachalo
@Buchachalo
Есть же хороший паттерн для этого.
Dockerfile
FROM python:3.10-alpine
WORKDIR /app

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

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

COPY ./src .

Тут упаковываете в образ свой проект.

И в docker-compose собираете требуемые сервисы. Nginx, Postgre, Redis и т.д.
docker-compose
version: '3'
services:
  db:
    image: postgres:15-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    expose:
      - 5432
    environment:
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_DB=${POSTGRES_DB}

  api:
    build:
      context: .
    command: uvicorn main:app --host 0.0.0.0
    ports:
      - 8080:8000
    environment:
      - DATABASE_DSN=${DATABASE_DSN}
    restart: always
    depends_on:
      - db

volumes:
  postgres_data:


И что бы руками каждый раз инфраструктуру не разворачивать пользуемся Github Actions, при взаимодействии с репозиторием он может прогнать тесты, собрать новый образ, залить все на прод сервер и развернуть.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы