# Концепции развёртывания
-СÑ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82 неÑ\81колÑ\8cко конÑ\86епÑ\86ий, пÑ\80именÑ\8fемÑ\8bÑ\85 длÑ\8f Ñ\80азвÑ\91Ñ\80Ñ\82Ñ\8bваниÑ\8f пÑ\80иложений **FastAPI**, Ñ\80авно как и длÑ\8f лÑ\8eбÑ\8bÑ\85 дÑ\80Ñ\83гиÑ\85 Ñ\82ипов веб-пÑ\80иложений, Ñ\81Ñ\80еди коÑ\82оÑ\80Ñ\8bÑ\85 Ð\92ы можете выбрать **наиболее подходящий** способ.
+СÑ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82 неÑ\81колÑ\8cко конÑ\86епÑ\86ий, пÑ\80именÑ\8fемÑ\8bÑ\85 длÑ\8f Ñ\80азвÑ\91Ñ\80Ñ\82Ñ\8bваниÑ\8f пÑ\80иложений **FastAPI**, Ñ\80авно как и длÑ\8f лÑ\8eбÑ\8bÑ\85 дÑ\80Ñ\83гиÑ\85 Ñ\82ипов веб-пÑ\80иложений, Ñ\81Ñ\80еди коÑ\82оÑ\80Ñ\8bÑ\85 вы можете выбрать **наиболее подходящий** способ.
Самые важные из них:
Рассмотрим ниже влияние каждого из них на процесс **развёртывания**.
-Ð\9dаÑ\88а конеÑ\87наÑ\8f Ñ\86елÑ\8c - **обÑ\81лÑ\83живаÑ\82Ñ\8c клиенÑ\82ов Ð\92ашего API безопасно** и **бесперебойно**, с максимально эффективным использованием **вычислительных ресурсов** (например, удалённых серверов/виртуальных машин). 🚀
+Ð\9dаÑ\88а конеÑ\87наÑ\8f Ñ\86елÑ\8c - **обÑ\81лÑ\83живаÑ\82Ñ\8c клиенÑ\82ов вашего API безопасно** и **бесперебойно**, с максимально эффективным использованием **вычислительных ресурсов** (например, удалённых серверов/виртуальных машин). 🚀
-Ð\97деÑ\81Ñ\8c Ñ\8f немного Ñ\80аÑ\81Ñ\81кажÑ\83 Ð\92ам об Ñ\8dÑ\82иÑ\85 **конÑ\86епÑ\86иÑ\8fÑ\85** и надеÑ\8eÑ\81Ñ\8c, Ñ\87Ñ\82о Ñ\83 Ð\92аÑ\81 Ñ\81ложиÑ\82Ñ\81Ñ\8f **инÑ\82Ñ\83иÑ\82ивное понимание**, какой Ñ\81поÑ\81об вÑ\8bбÑ\80аÑ\82Ñ\8c пÑ\80и Ñ\80азвеÑ\80Ñ\82Ñ\8bвании Ð\92ашего API в различных окружениях, возможно, даже **ещё не существующих**.
+Ð\97деÑ\81Ñ\8c Ñ\8f немного Ñ\80аÑ\81Ñ\81кажÑ\83 Ð\92ам об Ñ\8dÑ\82иÑ\85 **конÑ\86епÑ\86иÑ\8fÑ\85** и надеÑ\8eÑ\81Ñ\8c, Ñ\87Ñ\82о Ñ\83 ваÑ\81 Ñ\81ложиÑ\82Ñ\81Ñ\8f **инÑ\82Ñ\83иÑ\82ивное понимание**, какой Ñ\81поÑ\81об вÑ\8bбÑ\80аÑ\82Ñ\8c пÑ\80и Ñ\80азвеÑ\80Ñ\82Ñ\8bвании вашего API в различных окружениях, возможно, даже **ещё не существующих**.
-Ð\9eзнакомивÑ\88иÑ\81Ñ\8c Ñ\81 Ñ\8dÑ\82ими конÑ\86епÑ\86иÑ\8fми, Ð\92ы сможете **оценить и выбрать** лучший способ развёртывании **Вашего API**.
+Ð\9eзнакомивÑ\88иÑ\81Ñ\8c Ñ\81 Ñ\8dÑ\82ими конÑ\86епÑ\86иÑ\8fми, вы сможете **оценить и выбрать** лучший способ развёртывании **Вашего API**.
В последующих главах я предоставлю Вам **конкретные рецепты** развёртывания приложения FastAPI.
## Использование более безопасного протокола HTTPS
-Ð\92 [пÑ\80едÑ\8bдÑ\83Ñ\89ей главе об HTTPS](./https.md){.internal-link target=_blank} мÑ\8b Ñ\80аÑ\81Ñ\81моÑ\82Ñ\80ели, как HTTPS обеÑ\81пеÑ\87иваеÑ\82 Ñ\88иÑ\84Ñ\80ование длÑ\8f Ð\92ашего API.
+Ð\92 [пÑ\80едÑ\8bдÑ\83Ñ\89ей главе об HTTPS](./https.md){.internal-link target=_blank} мÑ\8b Ñ\80аÑ\81Ñ\81моÑ\82Ñ\80ели, как HTTPS обеÑ\81пеÑ\87иваеÑ\82 Ñ\88иÑ\84Ñ\80ование длÑ\8f вашего API.
-Также мÑ\8b замеÑ\82или, Ñ\87Ñ\82о обÑ\8bÑ\87но длÑ\8f Ñ\80абоÑ\82Ñ\8b Ñ\81 HTTPS Ð\92ашему приложению нужен **дополнительный** компонент - **прокси-сервер завершения работы TLS**.
+Также мÑ\8b замеÑ\82или, Ñ\87Ñ\82о обÑ\8bÑ\87но длÑ\8f Ñ\80абоÑ\82Ñ\8b Ñ\81 HTTPS вашему приложению нужен **дополнительный** компонент - **прокси-сервер завершения работы TLS**.
И если прокси-сервер не умеет сам **обновлять сертификаты HTTPS**, то нужен ещё один компонент для этого действия.
### Примеры инструментов для работы с HTTPS
-Ð\92оÑ\82 некоÑ\82оÑ\80Ñ\8bе инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82Ñ\8b, коÑ\82оÑ\80Ñ\8bе Ð\92ы можете применять как прокси-серверы:
+Ð\92оÑ\82 некоÑ\82оÑ\80Ñ\8bе инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82Ñ\8b, коÑ\82оÑ\80Ñ\8bе вы можете применять как прокси-серверы:
* Traefik
* С автоматическим обновлением сертификатов ✨
* С дополнительным компонентом типа cert-manager для обновления сертификатов
* Использование услуг облачного провайдера (читайте ниже 👇)
-Ð\92 поÑ\81леднем ваÑ\80ианÑ\82е Ð\92ы можете воспользоваться услугами **облачного сервиса**, который сделает большую часть работы, включая настройку HTTPS. Это может наложить дополнительные ограничения или потребовать дополнительную плату и т.п. Зато Вам не понадобится самостоятельно заниматься настройками прокси-сервера.
+Ð\92 поÑ\81леднем ваÑ\80ианÑ\82е вы можете воспользоваться услугами **облачного сервиса**, который сделает большую часть работы, включая настройку HTTPS. Это может наложить дополнительные ограничения или потребовать дополнительную плату и т.п. Зато Вам не понадобится самостоятельно заниматься настройками прокси-сервера.
В дальнейшем я покажу Вам некоторые конкретные примеры их применения.
Термином **программа** обычно описывают множество вещей:
-* **Ð\9aод**, коÑ\82оÑ\80Ñ\8bй Ð\92ы написали, в нашем случае **Python-файлы**.
+* **Ð\9aод**, коÑ\82оÑ\80Ñ\8bй вы написали, в нашем случае **Python-файлы**.
* **Файл**, который может быть **исполнен** операционной системой, например `python`, `python.exe` или `uvicorn`.
* Конкретная программа, **запущенная** операционной системой и использующая центральный процессор и память. В таком случае это также называется **процесс**.
* Конкретная программа, **запущенная** операционной системой.
* Это не имеет отношения к какому-либо файлу или коду, но нечто **определённое**, управляемое и **выполняемое** операционной системой.
* Любая программа, любой код, **могут делать что-то** только когда они **выполняются**. То есть, когда являются **работающим процессом**.
-* Ð\9fÑ\80оÑ\86еÑ\81Ñ\81 можеÑ\82 бÑ\8bÑ\82Ñ\8c **пÑ\80еÑ\80ван** (или "Ñ\83биÑ\82") Ð\92ами или Ð\92ашей операционной системой. В результате чего он перестанет исполняться и **не будет продолжать делать что-либо**.
-* Ð\9aаждое пÑ\80иложение, коÑ\82оÑ\80ое Ð\92ы запустили на своём компьютере, каждая программа, каждое "окно" запускает какой-то процесс. И обычно на включенном компьютере **одновременно** запущено множество процессов.
+* Ð\9fÑ\80оÑ\86еÑ\81Ñ\81 можеÑ\82 бÑ\8bÑ\82Ñ\8c **пÑ\80еÑ\80ван** (или "Ñ\83биÑ\82") Ð\92ами или вашей операционной системой. В результате чего он перестанет исполняться и **не будет продолжать делать что-либо**.
+* Ð\9aаждое пÑ\80иложение, коÑ\82оÑ\80ое вы запустили на своём компьютере, каждая программа, каждое "окно" запускает какой-то процесс. И обычно на включенном компьютере **одновременно** запущено множество процессов.
* И **одна программа** может запустить **несколько параллельных процессов**.
-Ð\95Ñ\81ли Ð\92Ñ\8b заглÑ\8fнеÑ\82е в "диÑ\81пеÑ\82Ñ\87еÑ\80 задаÑ\87" или "Ñ\81иÑ\81Ñ\82емнÑ\8bй мониÑ\82оÑ\80" (или аналогиÑ\87нÑ\8bе инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82Ñ\8b) Ð\92ашей операционной системы, то увидите множество работающих процессов.
+Ð\95Ñ\81ли вÑ\8b заглÑ\8fнеÑ\82е в "диÑ\81пеÑ\82Ñ\87еÑ\80 задаÑ\87" или "Ñ\81иÑ\81Ñ\82емнÑ\8bй мониÑ\82оÑ\80" (или аналогиÑ\87нÑ\8bе инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82Ñ\8b) вашей операционной системы, то увидите множество работающих процессов.
-Ð\92полне веÑ\80оÑ\8fÑ\82но, Ñ\87Ñ\82о Ð\92ы увидите несколько процессов с одним и тем же названием браузерной программы (Firefox, Chrome, Edge и т. Д.). Обычно браузеры запускают один процесс на вкладку и вдобавок некоторые дополнительные процессы.
+Ð\92полне веÑ\80оÑ\8fÑ\82но, Ñ\87Ñ\82о вы увидите несколько процессов с одним и тем же названием браузерной программы (Firefox, Chrome, Edge и т. Д.). Обычно браузеры запускают один процесс на вкладку и вдобавок некоторые дополнительные процессы.
<img class="shadow" src="/img/deployment/concepts/image01.png">
## Настройки запуска приложения
-Ð\92 болÑ\8cÑ\88инÑ\81Ñ\82ве Ñ\81лÑ\83Ñ\87аев когда Ð\92Ñ\8b Ñ\81оздаÑ\91Ñ\82е веб-пÑ\80иложение, Ñ\82о желаеÑ\82е, Ñ\87Ñ\82об оно **Ñ\80абоÑ\82ало поÑ\81Ñ\82оÑ\8fнно** и непÑ\80еÑ\80Ñ\8bвно, пÑ\80едоÑ\81Ñ\82авлÑ\8fÑ\8f клиенÑ\82ам доÑ\81Ñ\82Ñ\83п в лÑ\8eбое вÑ\80емÑ\8f. ХоÑ\82Ñ\8f иногда Ñ\83 Ð\92ас могут быть причины, чтоб оно запускалось только при определённых условиях.
+Ð\92 болÑ\8cÑ\88инÑ\81Ñ\82ве Ñ\81лÑ\83Ñ\87аев когда вÑ\8b Ñ\81оздаÑ\91Ñ\82е веб-пÑ\80иложение, Ñ\82о желаеÑ\82е, Ñ\87Ñ\82об оно **Ñ\80абоÑ\82ало поÑ\81Ñ\82оÑ\8fнно** и непÑ\80еÑ\80Ñ\8bвно, пÑ\80едоÑ\81Ñ\82авлÑ\8fÑ\8f клиенÑ\82ам доÑ\81Ñ\82Ñ\83п в лÑ\8eбое вÑ\80емÑ\8f. ХоÑ\82Ñ\8f иногда Ñ\83 вас могут быть причины, чтоб оно запускалось только при определённых условиях.
### Удалённый сервер
-Ð\9aогда Ð\92Ñ\8b наÑ\81Ñ\82Ñ\80аиваеÑ\82е Ñ\83далÑ\91ннÑ\8bй Ñ\81еÑ\80веÑ\80 (облаÑ\87нÑ\8bй Ñ\81еÑ\80веÑ\80, виÑ\80Ñ\82Ñ\83алÑ\8cнÑ\83Ñ\8e маÑ\88инÑ\83 и Ñ\82.п.), Ñ\81амое пÑ\80оÑ\81Ñ\82ое, Ñ\87Ñ\82о можно Ñ\81делаÑ\82Ñ\8c, запÑ\83Ñ\81Ñ\82иÑ\82Ñ\8c Uvicorn (или его аналог) вÑ\80Ñ\83Ñ\87нÑ\83Ñ\8e, как Ð\92ы делаете при локальной разработке.
+Ð\9aогда вÑ\8b наÑ\81Ñ\82Ñ\80аиваеÑ\82е Ñ\83далÑ\91ннÑ\8bй Ñ\81еÑ\80веÑ\80 (облаÑ\87нÑ\8bй Ñ\81еÑ\80веÑ\80, виÑ\80Ñ\82Ñ\83алÑ\8cнÑ\83Ñ\8e маÑ\88инÑ\83 и Ñ\82.п.), Ñ\81амое пÑ\80оÑ\81Ñ\82ое, Ñ\87Ñ\82о можно Ñ\81делаÑ\82Ñ\8c, запÑ\83Ñ\81Ñ\82иÑ\82Ñ\8c Uvicorn (или его аналог) вÑ\80Ñ\83Ñ\87нÑ\83Ñ\8e, как вы делаете при локальной разработке.
Это рабочий способ и он полезен **во время разработки**.
-Ð\9dо еÑ\81ли Ð\92ы потеряете соединение с сервером, то не сможете отслеживать - работает ли всё ещё **запущенный Вами процесс**.
+Ð\9dо еÑ\81ли вы потеряете соединение с сервером, то не сможете отслеживать - работает ли всё ещё **запущенный Вами процесс**.
-Ð\98 еÑ\81ли Ñ\81еÑ\80веÑ\80 пеÑ\80езагÑ\80Ñ\83зиÑ\82Ñ\81Ñ\8f (напÑ\80имеÑ\80, поÑ\81ле обновлениÑ\8f или какиÑ\85-Ñ\82о дейÑ\81Ñ\82вий облаÑ\87ного пÑ\80овайдеÑ\80а), Ð\92ы скорее всего **этого не заметите**, чтобы снова запустить процесс вручную. Вследствие этого Ваш API останется мёртвым. 😱
+Ð\98 еÑ\81ли Ñ\81еÑ\80веÑ\80 пеÑ\80езагÑ\80Ñ\83зиÑ\82Ñ\81Ñ\8f (напÑ\80имеÑ\80, поÑ\81ле обновлениÑ\8f или какиÑ\85-Ñ\82о дейÑ\81Ñ\82вий облаÑ\87ного пÑ\80овайдеÑ\80а), вы скорее всего **этого не заметите**, чтобы снова запустить процесс вручную. Вследствие этого Ваш API останется мёртвым. 😱
### Автоматический запуск программ
-Ð\92еÑ\80оÑ\8fÑ\82но Ð\92Ñ\8b пожелаеÑ\82е, Ñ\87Ñ\82об Ð\92аÑ\88а Ñ\81еÑ\80веÑ\80наÑ\8f пÑ\80огÑ\80амма (Ñ\82акаÑ\8f как Uvicorn) стартовала автоматически при включении сервера, без **человеческого вмешательства** и всегда могла управлять Вашим API (так как Uvicorn запускает приложение FastAPI).
+Ð\92еÑ\80оÑ\8fÑ\82но вÑ\8b заÑ\85оÑ\82иÑ\82е, Ñ\87Ñ\82об Ð\92аÑ\88а Ñ\81еÑ\80веÑ\80наÑ\8f пÑ\80огÑ\80амма (Ñ\82акаÑ\8f, как Uvicorn) стартовала автоматически при включении сервера, без **человеческого вмешательства** и всегда могла управлять Вашим API (так как Uvicorn запускает приложение FastAPI).
### Отдельная программа
## Перезапуск
-Ð\92Ñ\8b, веÑ\80оÑ\8fÑ\82но, Ñ\82акже пожелаеÑ\82е, Ñ\87Ñ\82об Ð\92аше приложение **перезапускалось**, если в нём произошёл сбой.
+Ð\92Ñ\8b, веÑ\80оÑ\8fÑ\82но, Ñ\82акже заÑ\85оÑ\82иÑ\82е, Ñ\87Ñ\82об ваше приложение **перезапускалось**, если в нём произошёл сбой.
### Мы ошибаемся
### Небольшие ошибки обрабатываются автоматически
-Ð\9aогда Ð\92ы создаёте свои API на основе FastAPI и допускаете в коде ошибку, то FastAPI обычно остановит её распространение внутри одного запроса, при обработке которого она возникла. 🛡
+Ð\9aогда вы создаёте свои API на основе FastAPI и допускаете в коде ошибку, то FastAPI обычно остановит её распространение внутри одного запроса, при обработке которого она возникла. 🛡
Клиент получит ошибку **500 Internal Server Error** в ответ на свой запрос, но приложение не сломается и будет продолжать работать с последующими запросами.
Для случаев, когда ошибки приводят к сбою в запущенном **процессе**, Вам понадобится добавить компонент, который **перезапустит** процесс хотя бы пару раз...
!!! tip "Заметка"
- ... Ð\95Ñ\81ли пÑ\80иложение падаеÑ\82 Ñ\81Ñ\80азÑ\83 же поÑ\81ле запÑ\83Ñ\81ка, веÑ\80оÑ\8fÑ\82но беÑ\81полезно его беÑ\81конеÑ\87но пеÑ\80езапÑ\83Ñ\81каÑ\82Ñ\8c. Ð\9dо полагаÑ\8e, Ð\92ы заметите такое поведение во время разработки или, по крайней мере, сразу после развёртывания.
+ ... Ð\95Ñ\81ли пÑ\80иложение падаеÑ\82 Ñ\81Ñ\80азÑ\83 же поÑ\81ле запÑ\83Ñ\81ка, веÑ\80оÑ\8fÑ\82но беÑ\81полезно его беÑ\81конеÑ\87но пеÑ\80езапÑ\83Ñ\81каÑ\82Ñ\8c. Ð\9dо полагаÑ\8e, вы заметите такое поведение во время разработки или, по крайней мере, сразу после развёртывания.
Так что давайте сосредоточимся на конкретных случаях, когда приложение может полностью выйти из строя, но всё ещё есть смысл его запустить заново.
-Ð\92озможно Ð\92Ñ\8b заÑ\85оÑ\82иÑ\82е, Ñ\87Ñ\82об бÑ\8bл некий **внеÑ\88ний компоненÑ\82**, оÑ\82веÑ\82Ñ\81Ñ\82веннÑ\8bй за пеÑ\80езапÑ\83Ñ\81к Ð\92аÑ\88его пÑ\80иложениÑ\8f даже еÑ\81ли Ñ\83же не Ñ\80абоÑ\82аеÑ\82 Uvicorn или Python. То еÑ\81Ñ\82Ñ\8c ниÑ\87его из Ñ\82ого, Ñ\87Ñ\82о напиÑ\81ано в Ð\92ашем коде внутри приложения, не может быть выполнено в принципе.
+Ð\92озможно вÑ\8b заÑ\85оÑ\82иÑ\82е, Ñ\87Ñ\82об бÑ\8bл некий **внеÑ\88ний компоненÑ\82**, оÑ\82веÑ\82Ñ\81Ñ\82веннÑ\8bй за пеÑ\80езапÑ\83Ñ\81к ваÑ\88его пÑ\80иложениÑ\8f даже еÑ\81ли Ñ\83же не Ñ\80абоÑ\82аеÑ\82 Uvicorn или Python. То еÑ\81Ñ\82Ñ\8c ниÑ\87его из Ñ\82ого, Ñ\87Ñ\82о напиÑ\81ано в вашем коде внутри приложения, не может быть выполнено в принципе.
### Примеры инструментов для автоматического перезапуска
### Множество процессов - Воркеры (Workers)
-Ð\95Ñ\81ли колиÑ\87еÑ\81Ñ\82во Ð\92аÑ\88иÑ\85 клиенÑ\82ов болÑ\8cÑ\88е, Ñ\87ем можеÑ\82 обÑ\81лÑ\83жиÑ\82Ñ\8c один пÑ\80оÑ\86еÑ\81Ñ\81 (допÑ\83Ñ\81Ñ\82им, Ñ\87Ñ\82о виÑ\80Ñ\82Ñ\83алÑ\8cнаÑ\8f маÑ\88ина не Ñ\81лиÑ\88ком моÑ\89наÑ\8f), но пÑ\80и Ñ\8dÑ\82ом Ð\92ам доÑ\81Ñ\82Ñ\83пно **неÑ\81колÑ\8cко Ñ\8fдеÑ\80 пÑ\80оÑ\86еÑ\81Ñ\81оÑ\80а**, Ñ\82о Ð\92ы можете запустить **несколько процессов** одного и того же приложения параллельно и распределить запросы между этими процессами.
+Ð\95Ñ\81ли колиÑ\87еÑ\81Ñ\82во Ð\92аÑ\88иÑ\85 клиенÑ\82ов болÑ\8cÑ\88е, Ñ\87ем можеÑ\82 обÑ\81лÑ\83жиÑ\82Ñ\8c один пÑ\80оÑ\86еÑ\81Ñ\81 (допÑ\83Ñ\81Ñ\82им, Ñ\87Ñ\82о виÑ\80Ñ\82Ñ\83алÑ\8cнаÑ\8f маÑ\88ина не Ñ\81лиÑ\88ком моÑ\89наÑ\8f), но пÑ\80и Ñ\8dÑ\82ом Ð\92ам доÑ\81Ñ\82Ñ\83пно **неÑ\81колÑ\8cко Ñ\8fдеÑ\80 пÑ\80оÑ\86еÑ\81Ñ\81оÑ\80а**, Ñ\82о вы можете запустить **несколько процессов** одного и того же приложения параллельно и распределить запросы между этими процессами.
**Несколько запущенных процессов** одной и той же API-программы часто называют **воркерами**.
Работающая программа загружает в память данные, необходимые для её работы, например, переменные содержащие модели машинного обучения или большие файлы. Каждая переменная **потребляет некоторое количество оперативной памяти (RAM)** сервера.
-Ð\9eбÑ\8bÑ\87но пÑ\80оÑ\86еÑ\81Ñ\81Ñ\8b **не делÑ\8fÑ\82Ñ\81Ñ\8f памÑ\8fÑ\82Ñ\8cÑ\8e дÑ\80Ñ\83г Ñ\81 дÑ\80Ñ\83гом**. Сие ознаÑ\87аеÑ\82, Ñ\87Ñ\82о каждÑ\8bй Ñ\80абоÑ\82аÑ\8eÑ\89ий пÑ\80оÑ\86еÑ\81Ñ\81 имееÑ\82 Ñ\81вои даннÑ\8bе, пеÑ\80еменнÑ\8bе и Ñ\81вой кÑ\83Ñ\81ок памÑ\8fÑ\82и. Ð\98 еÑ\81ли длÑ\8f вÑ\8bполнениÑ\8f Ð\92ашего кода процессу нужно много памяти, то **каждый такой же процесс** запущенный дополнительно, потребует такого же количества памяти.
+Ð\9eбÑ\8bÑ\87но пÑ\80оÑ\86еÑ\81Ñ\81Ñ\8b **не делÑ\8fÑ\82Ñ\81Ñ\8f памÑ\8fÑ\82Ñ\8cÑ\8e дÑ\80Ñ\83г Ñ\81 дÑ\80Ñ\83гом**. Сие ознаÑ\87аеÑ\82, Ñ\87Ñ\82о каждÑ\8bй Ñ\80абоÑ\82аÑ\8eÑ\89ий пÑ\80оÑ\86еÑ\81Ñ\81 имееÑ\82 Ñ\81вои даннÑ\8bе, пеÑ\80еменнÑ\8bе и Ñ\81вой кÑ\83Ñ\81ок памÑ\8fÑ\82и. Ð\98 еÑ\81ли длÑ\8f вÑ\8bполнениÑ\8f вашего кода процессу нужно много памяти, то **каждый такой же процесс** запущенный дополнительно, потребует такого же количества памяти.
### Память сервера
-Ð\94опÑ\83Ñ\81Ñ\82им, Ñ\87Ñ\82о Ð\92аÑ\88 код загÑ\80Ñ\83жаеÑ\82 моделÑ\8c маÑ\88инного обÑ\83Ñ\87ениÑ\8f **Ñ\80азмеÑ\80ом 1 Ð\93Ð\91**. Ð\9aогда Ð\92Ñ\8b запÑ\83Ñ\81Ñ\82иÑ\82е Ñ\81воÑ\91 API как один пÑ\80оÑ\86еÑ\81Ñ\81, он займÑ\91Ñ\82 в опеÑ\80аÑ\82ивной памÑ\8fÑ\82и не менее 1 Ð\93Ð\91. Ð\90 еÑ\81ли Ð\92Ñ\8b запÑ\83Ñ\81Ñ\82иÑ\82е **4 Ñ\82акиÑ\85 же пÑ\80оÑ\86еÑ\81Ñ\81а** (4 воÑ\80кеÑ\80а), Ñ\82о каждÑ\8bй из ниÑ\85 займÑ\91Ñ\82 1 Ð\93Ð\91 опеÑ\80аÑ\82ивной памÑ\8fÑ\82и. Ð\92 Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82е Ð\92ашему API потребуется **4 ГБ оперативной памяти (RAM)**.
+Ð\94опÑ\83Ñ\81Ñ\82им, Ñ\87Ñ\82о Ð\92аÑ\88 код загÑ\80Ñ\83жаеÑ\82 моделÑ\8c маÑ\88инного обÑ\83Ñ\87ениÑ\8f **Ñ\80азмеÑ\80ом 1 Ð\93Ð\91**. Ð\9aогда вÑ\8b запÑ\83Ñ\81Ñ\82иÑ\82е Ñ\81воÑ\91 API как один пÑ\80оÑ\86еÑ\81Ñ\81, он займÑ\91Ñ\82 в опеÑ\80аÑ\82ивной памÑ\8fÑ\82и не менее 1 Ð\93Ð\91. Ð\90 еÑ\81ли вÑ\8b запÑ\83Ñ\81Ñ\82иÑ\82е **4 Ñ\82акиÑ\85 же пÑ\80оÑ\86еÑ\81Ñ\81а** (4 воÑ\80кеÑ\80а), Ñ\82о каждÑ\8bй из ниÑ\85 займÑ\91Ñ\82 1 Ð\93Ð\91 опеÑ\80аÑ\82ивной памÑ\8fÑ\82и. Ð\92 Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82е вашему API потребуется **4 ГБ оперативной памяти (RAM)**.
И если Ваш удалённый сервер или виртуальная машина располагает только 3 ГБ памяти, то попытка загрузить в неё 4 ГБ данных вызовет проблемы. 🚨
Менеджер процессов будет слушать определённый **сокет** (IP:порт) и передавать данные работающим процессам.
-Ð\9aаждÑ\8bй из Ñ\8dÑ\82иÑ\85 пÑ\80оÑ\86еÑ\81Ñ\81ов бÑ\83деÑ\82 запÑ\83Ñ\81каÑ\82Ñ\8c Ð\92аше приложение для обработки полученного **запроса** и возвращения вычисленного **ответа** и они будут использовать оперативную память.
+Ð\9aаждÑ\8bй из Ñ\8dÑ\82иÑ\85 пÑ\80оÑ\86еÑ\81Ñ\81ов бÑ\83деÑ\82 запÑ\83Ñ\81каÑ\82Ñ\8c ваше приложение для обработки полученного **запроса** и возвращения вычисленного **ответа** и они будут использовать оперативную память.
<img src="/img/deployment/concepts/process-ram.svg">
-Ð\91езÑ\83Ñ\81ловно, на Ñ\8dÑ\82ом же Ñ\81еÑ\80веÑ\80е бÑ\83дÑ\83Ñ\82 Ñ\80абоÑ\82аÑ\82Ñ\8c и **дÑ\80Ñ\83гие пÑ\80оÑ\86еÑ\81Ñ\81Ñ\8b**, коÑ\82оÑ\80Ñ\8bе не оÑ\82ноÑ\81Ñ\8fÑ\82Ñ\81Ñ\8f к Ð\92ашему приложению.
+Ð\91езÑ\83Ñ\81ловно, на Ñ\8dÑ\82ом же Ñ\81еÑ\80веÑ\80е бÑ\83дÑ\83Ñ\82 Ñ\80абоÑ\82аÑ\82Ñ\8c и **дÑ\80Ñ\83гие пÑ\80оÑ\86еÑ\81Ñ\81Ñ\8b**, коÑ\82оÑ\80Ñ\8bе не оÑ\82ноÑ\81Ñ\8fÑ\82Ñ\81Ñ\8f к вашему приложению.
-Интересная деталь - обычно в течение времени процент **использования центрального процессора (CPU)** каждым процессом может очень сильно **изменяться**, но объём занимаемой **оперативной памяти (RAM)** остаётся относительно **стабильным**.
+Интересная деталь заключается в том, что процент **использования центрального процессора (CPU)** каждым процессом может сильно меняться с течением времени, но объём занимаемой **оперативной памяти (RAM)** остаётся относительно **стабильным**.
-Ð\95Ñ\81ли Ñ\83 Ð\92аÑ\81 еÑ\81Ñ\82Ñ\8c API, коÑ\82оÑ\80Ñ\8bй каждÑ\8bй Ñ\80аз вÑ\8bполнÑ\8fеÑ\82 Ñ\81опоÑ\81Ñ\82авимÑ\8bй обÑ\8aем вÑ\8bÑ\87иÑ\81лений, и Ñ\83 Ð\92ас много клиентов, то **загрузка процессора**, вероятно, *также будет стабильной* (вместо того, чтобы постоянно быстро увеличиваться и уменьшаться).
+Ð\95Ñ\81ли Ñ\83 ваÑ\81 еÑ\81Ñ\82Ñ\8c API, коÑ\82оÑ\80Ñ\8bй каждÑ\8bй Ñ\80аз вÑ\8bполнÑ\8fеÑ\82 Ñ\81опоÑ\81Ñ\82авимÑ\8bй обÑ\8aем вÑ\8bÑ\87иÑ\81лений, и Ñ\83 вас много клиентов, то **загрузка процессора**, вероятно, *также будет стабильной* (вместо того, чтобы постоянно быстро увеличиваться и уменьшаться).
### Примеры стратегий и инструментов для запуска нескольких экземпляров приложения
* **Kubernetes** и аналогичные **контейнерные системы**
* Какой-то компонент в **Kubernetes** будет слушать **IP:port**. Необходимое количество запущенных экземпляров приложения будет осуществляться посредством запуска **нескольких контейнеров**, в каждом из которых работает **один процесс Uvicorn**.
* **Облачные сервисы**, которые позаботятся обо всём за Вас
- * Ð\92озможно, Ñ\87Ñ\82о облаÑ\87нÑ\8bй Ñ\81еÑ\80виÑ\81 Ñ\83мееÑ\82 **Ñ\83пÑ\80авлÑ\8fÑ\82Ñ\8c запÑ\83Ñ\81ком дополниÑ\82елÑ\8cнÑ\8bÑ\85 Ñ\8dкземплÑ\8fÑ\80ов пÑ\80иложениÑ\8f**. Ð\92еÑ\80оÑ\8fÑ\82но, он поÑ\82Ñ\80ебÑ\83еÑ\82, Ñ\87Ñ\82об Ð\92Ñ\8b Ñ\83казали - какой **пÑ\80оÑ\86еÑ\81Ñ\81** или **обÑ\80аз** Ñ\81ледÑ\83еÑ\82 клониÑ\80оваÑ\82Ñ\8c. СкоÑ\80ее вÑ\81его, Ð\92ы укажете **один процесс Uvicorn** и облачный сервис будет запускать его копии при необходимости.
+ * Ð\92озможно, Ñ\87Ñ\82о облаÑ\87нÑ\8bй Ñ\81еÑ\80виÑ\81 Ñ\83мееÑ\82 **Ñ\83пÑ\80авлÑ\8fÑ\82Ñ\8c запÑ\83Ñ\81ком дополниÑ\82елÑ\8cнÑ\8bÑ\85 Ñ\8dкземплÑ\8fÑ\80ов пÑ\80иложениÑ\8f**. Ð\92еÑ\80оÑ\8fÑ\82но, он поÑ\82Ñ\80ебÑ\83еÑ\82, Ñ\87Ñ\82об вÑ\8b Ñ\83казали - какой **пÑ\80оÑ\86еÑ\81Ñ\81** или **обÑ\80аз** Ñ\81ледÑ\83еÑ\82 клониÑ\80оваÑ\82Ñ\8c. СкоÑ\80ее вÑ\81его, вы укажете **один процесс Uvicorn** и облачный сервис будет запускать его копии при необходимости.
!!! tip "Заметка"
- Ð\95Ñ\81ли Ð\92ы не знаете, что такое **контейнеры**, Docker или Kubernetes, не переживайте.
+ Ð\95Ñ\81ли вы не знаете, что такое **контейнеры**, Docker или Kubernetes, не переживайте.
Я поведаю Вам о контейнерах, образах, Docker, Kubernetes и т.п. в главе: [FastAPI внутри контейнеров - Docker](./docker.md){.internal-link target=_blank}.
Поэтому Вам нужен будет **один процесс**, выполняющий эти **подготовительные шаги** до запуска приложения.
-Также Ð\92ам нÑ\83жно бÑ\83деÑ\82 Ñ\83бедиÑ\82Ñ\8cÑ\81Ñ\8f, Ñ\87Ñ\82о Ñ\8dÑ\82оÑ\82 пÑ\80оÑ\86еÑ\81Ñ\81 вÑ\8bполнил подгоÑ\82овиÑ\82елÑ\8cнÑ\8bе Ñ\88аги *даже* еÑ\81ли впоÑ\81ледÑ\81Ñ\82вии Ð\92ы запустите **несколько процессов** (несколько воркеров) самого приложения. Если бы эти шаги выполнялись в каждом **клонированном процессе**, они бы **дублировали** работу, пытаясь выполнить её **параллельно**. И если бы эта работа была бы чем-то деликатным, вроде миграции базы данных, то это может вызвать конфликты между ними.
+Также Ð\92ам нÑ\83жно бÑ\83деÑ\82 Ñ\83бедиÑ\82Ñ\8cÑ\81Ñ\8f, Ñ\87Ñ\82о Ñ\8dÑ\82оÑ\82 пÑ\80оÑ\86еÑ\81Ñ\81 вÑ\8bполнил подгоÑ\82овиÑ\82елÑ\8cнÑ\8bе Ñ\88аги *даже* еÑ\81ли впоÑ\81ледÑ\81Ñ\82вии вы запустите **несколько процессов** (несколько воркеров) самого приложения. Если бы эти шаги выполнялись в каждом **клонированном процессе**, они бы **дублировали** работу, пытаясь выполнить её **параллельно**. И если бы эта работа была бы чем-то деликатным, вроде миграции базы данных, то это может вызвать конфликты между ними.
Безусловно, возможны случаи, когда нет проблем при выполнении предварительной подготовки параллельно или несколько раз. Тогда Вам повезло, работать с ними намного проще.
!!! tip "Заметка"
- Ð\98мейÑ\82е в видÑ\83, Ñ\87Ñ\82о в некоÑ\82оÑ\80Ñ\8bÑ\85 Ñ\81лÑ\83Ñ\87аÑ\8fÑ\85 запÑ\83Ñ\81к Ð\92ашего приложения **может не требовать каких-либо предварительных шагов вовсе**.
+ Ð\98мейÑ\82е в видÑ\83, Ñ\87Ñ\82о в некоÑ\82оÑ\80Ñ\8bÑ\85 Ñ\81лÑ\83Ñ\87аÑ\8fÑ\85 запÑ\83Ñ\81к вашего приложения **может не требовать каких-либо предварительных шагов вовсе**.
Что ж, тогда Вам не нужно беспокоиться об этом. 🤷
### Примеры стратегий запуска предварительных шагов
-СÑ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82 **Ñ\81илÑ\8cнаÑ\8f завиÑ\81имоÑ\81Ñ\82Ñ\8c** оÑ\82 Ñ\82ого, как Ð\92ы **развёртываете свою систему**, запускаете программы, обрабатываете перезапуски и т.д.
+СÑ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82 **Ñ\81илÑ\8cнаÑ\8f завиÑ\81имоÑ\81Ñ\82Ñ\8c** оÑ\82 Ñ\82ого, как вы **развёртываете свою систему**, запускаете программы, обрабатываете перезапуски и т.д.
Вот некоторые возможные идеи:
Ваш сервер располагает ресурсами, которые Ваши программы могут потреблять или **утилизировать**, а именно - время работы центрального процессора и объём оперативной памяти.
-Ð\9aак много Ñ\81иÑ\81Ñ\82емнÑ\8bÑ\85 Ñ\80еÑ\81Ñ\83Ñ\80Ñ\81ов Ð\92Ñ\8b пÑ\80едполагаеÑ\82е поÑ\82Ñ\80ебиÑ\82Ñ\8c/Ñ\83Ñ\82илизиÑ\80оваÑ\82Ñ\8c? Ð\95Ñ\81ли не задÑ\83мÑ\8bваÑ\82Ñ\8cÑ\81Ñ\8f, Ñ\82о можно оÑ\82веÑ\82иÑ\82Ñ\8c - "немного", но на Ñ\81амом деле Ð\92Ñ\8b, веÑ\80оÑ\8fÑ\82но, пожелаете использовать **максимально возможное количество**.
+Ð\9aак много Ñ\81иÑ\81Ñ\82емнÑ\8bÑ\85 Ñ\80еÑ\81Ñ\83Ñ\80Ñ\81ов вÑ\8b пÑ\80едполагаеÑ\82е поÑ\82Ñ\80ебиÑ\82Ñ\8c/Ñ\83Ñ\82илизиÑ\80оваÑ\82Ñ\8c? Ð\95Ñ\81ли не задÑ\83мÑ\8bваÑ\82Ñ\8cÑ\81Ñ\8f, Ñ\82о можно оÑ\82веÑ\82иÑ\82Ñ\8c - "немного", но на Ñ\81амом деле Ð\92Ñ\8b, веÑ\80оÑ\8fÑ\82но, заÑ\85оÑ\82ите использовать **максимально возможное количество**.
-Ð\95Ñ\81ли Ð\92Ñ\8b плаÑ\82иÑ\82е за Ñ\81одеÑ\80жание Ñ\82Ñ\80Ñ\91Ñ\85 Ñ\81еÑ\80веÑ\80ов, но иÑ\81полÑ\8cзÑ\83еÑ\82е лиÑ\88Ñ\8c малÑ\83Ñ\8e Ñ\87аÑ\81Ñ\82Ñ\8c Ñ\81иÑ\81Ñ\82емнÑ\8bÑ\85 Ñ\80еÑ\81Ñ\83Ñ\80Ñ\81ов каждого из ниÑ\85, Ñ\82о Ð\92ы **выбрасываете деньги на ветер**, а также **впустую тратите электроэнергию** и т.п.
+Ð\95Ñ\81ли вÑ\8b плаÑ\82иÑ\82е за Ñ\81одеÑ\80жание Ñ\82Ñ\80Ñ\91Ñ\85 Ñ\81еÑ\80веÑ\80ов, но иÑ\81полÑ\8cзÑ\83еÑ\82е лиÑ\88Ñ\8c малÑ\83Ñ\8e Ñ\87аÑ\81Ñ\82Ñ\8c Ñ\81иÑ\81Ñ\82емнÑ\8bÑ\85 Ñ\80еÑ\81Ñ\83Ñ\80Ñ\81ов каждого из ниÑ\85, Ñ\82о вы **выбрасываете деньги на ветер**, а также **впустую тратите электроэнергию** и т.п.
В таком случае было бы лучше обойтись двумя серверами, но более полно утилизировать их ресурсы (центральный процессор, оперативную память, жёсткий диск, сети передачи данных и т.д).
-С дÑ\80Ñ\83гой Ñ\81Ñ\82оÑ\80онÑ\8b, еÑ\81ли Ð\92ы располагаете только двумя серверами и используете **на 100% их процессоры и память**, но какой-либо процесс запросит дополнительную память, то операционная система сервера будет использовать жёсткий диск для расширения оперативной памяти (а диск работает в тысячи раз медленнее), а то вовсе **упадёт**. Или если какому-то процессу понадобится произвести вычисления, то ему придётся подождать, пока процессор освободится.
+С дÑ\80Ñ\83гой Ñ\81Ñ\82оÑ\80онÑ\8b, еÑ\81ли вы располагаете только двумя серверами и используете **на 100% их процессоры и память**, но какой-либо процесс запросит дополнительную память, то операционная система сервера будет использовать жёсткий диск для расширения оперативной памяти (а диск работает в тысячи раз медленнее), а то вовсе **упадёт**. Или если какому-то процессу понадобится произвести вычисления, то ему придётся подождать, пока процессор освободится.
В такой ситуации лучше подключить **ещё один сервер** и перераспределить процессы между серверами, чтоб всем **хватало памяти и процессорного времени**.
-Также еÑ\81Ñ\82Ñ\8c веÑ\80оÑ\8fÑ\82ноÑ\81Ñ\82Ñ\8c, Ñ\87Ñ\82о по какой-Ñ\82о пÑ\80иÑ\87ине возник **вÑ\81плеÑ\81к** запÑ\80оÑ\81ов к Ð\92аÑ\88емÑ\83 API. Ð\92озможно, Ñ\8dÑ\82о бÑ\8bл виÑ\80Ñ\83Ñ\81, боÑ\82Ñ\8b или дÑ\80Ñ\83гие Ñ\81еÑ\80виÑ\81Ñ\8b наÑ\87али полÑ\8cзоваÑ\82Ñ\8cÑ\81Ñ\8f им. Ð\98 длÑ\8f Ñ\82акиÑ\85 пÑ\80оиÑ\81Ñ\88еÑ\81Ñ\82вий Ð\92ы можете захотеть иметь дополнительные ресурсы.
+Также еÑ\81Ñ\82Ñ\8c веÑ\80оÑ\8fÑ\82ноÑ\81Ñ\82Ñ\8c, Ñ\87Ñ\82о по какой-Ñ\82о пÑ\80иÑ\87ине возник **вÑ\81плеÑ\81к** запÑ\80оÑ\81ов к ваÑ\88емÑ\83 API. Ð\92озможно, Ñ\8dÑ\82о бÑ\8bл виÑ\80Ñ\83Ñ\81, боÑ\82Ñ\8b или дÑ\80Ñ\83гие Ñ\81еÑ\80виÑ\81Ñ\8b наÑ\87али полÑ\8cзоваÑ\82Ñ\8cÑ\81Ñ\8f им. Ð\98 длÑ\8f Ñ\82акиÑ\85 пÑ\80оиÑ\81Ñ\88еÑ\81Ñ\82вий вы можете захотеть иметь дополнительные ресурсы.
-Ð\9fÑ\80и наÑ\81Ñ\82Ñ\80ойке логики Ñ\80азвÑ\91Ñ\80Ñ\82Ñ\8bваний, Ð\92ы можете указать **целевое значение** утилизации ресурсов, допустим, **от 50% до 90%**. Обычно эти метрики и используют.
+Ð\9fÑ\80и наÑ\81Ñ\82Ñ\80ойке логики Ñ\80азвÑ\91Ñ\80Ñ\82Ñ\8bваний, вы можете указать **целевое значение** утилизации ресурсов, допустим, **от 50% до 90%**. Обычно эти метрики и используют.
Вы можете использовать простые инструменты, такие как `htop`, для отслеживания загрузки центрального процессора и оперативной памяти сервера, в том числе каждым процессом. Или более сложные системы мониторинга нескольких серверов.
Осознание этих идей и того, как их применять, должно дать Вам интуитивное понимание, необходимое для принятия решений при настройке развертываний. 🤓
-Ð\92 Ñ\81ледÑ\83Ñ\8eÑ\89иÑ\85 Ñ\80азделаÑ\85 Ñ\8f пÑ\80иведÑ\83 более конкÑ\80еÑ\82нÑ\8bе пÑ\80имеÑ\80Ñ\8b возможнÑ\8bÑ\85 Ñ\81Ñ\82Ñ\80аÑ\82егий, коÑ\82оÑ\80Ñ\8bм Ð\92ы можете следовать. 🚀
+Ð\92 Ñ\81ледÑ\83Ñ\8eÑ\89иÑ\85 Ñ\80азделаÑ\85 Ñ\8f пÑ\80иведÑ\83 более конкÑ\80еÑ\82нÑ\8bе пÑ\80имеÑ\80Ñ\8b возможнÑ\8bÑ\85 Ñ\81Ñ\82Ñ\80аÑ\82егий, коÑ\82оÑ\80Ñ\8bм вы можете следовать. 🚀
и т.п.
-Ð\98Ñ\81полÑ\8cзование подгоÑ\82овленнÑ\8bÑ\85 обÑ\80азов знаÑ\87иÑ\82елÑ\8cно Ñ\83пÑ\80оÑ\89аеÑ\82 **комбиниÑ\80ование** и иÑ\81полÑ\8cзование Ñ\80азнÑ\8bÑ\85 инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82ов. Ð\9dапÑ\80имеÑ\80, Ð\92ы можете попытаться использовать новую базу данных. В большинстве случаев можно использовать **официальный образ** и всего лишь указать переменные окружения.
+Ð\98Ñ\81полÑ\8cзование подгоÑ\82овленнÑ\8bÑ\85 обÑ\80азов знаÑ\87иÑ\82елÑ\8cно Ñ\83пÑ\80оÑ\89аеÑ\82 **комбиниÑ\80ование** и иÑ\81полÑ\8cзование Ñ\80азнÑ\8bÑ\85 инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82ов. Ð\9dапÑ\80имеÑ\80, вы можете попытаться использовать новую базу данных. В большинстве случаев можно использовать **официальный образ** и всего лишь указать переменные окружения.
-Таким обÑ\80азом, Ð\92ы можете изучить, что такое контейнеризация и Docker, и использовать полученные знания с разными инструментами и компонентами.
+Таким обÑ\80азом, вы можете изучить, что такое контейнеризация и Docker, и использовать полученные знания с разными инструментами и компонентами.
-Так, Ð\92ы можете запустить одновременно **множество контейнеров** с базой данных, Python-приложением, веб-сервером, React-приложением и соединить их вместе через внутреннюю сеть.
+Так, вы можете запустить одновременно **множество контейнеров** с базой данных, Python-приложением, веб-сервером, React-приложением и соединить их вместе через внутреннюю сеть.
Все системы управления контейнерами (такие, как Docker или Kubernetes) имеют встроенные возможности для организации такого сетевого взаимодействия.
## Контейнеры и процессы
-Ð\9eбÑ\8bÑ\87но **обÑ\80аз конÑ\82ейнеÑ\80а** Ñ\81одеÑ\80жиÑ\82 меÑ\82аданнÑ\8bе пÑ\80едÑ\83Ñ\81Ñ\82ановленной пÑ\80огÑ\80аммÑ\8b или командÑ\83, коÑ\82оÑ\80Ñ\83Ñ\8e Ñ\81ледÑ\83еÑ\82 вÑ\8bполниÑ\82Ñ\8c пÑ\80и запÑ\83Ñ\81ке **конÑ\82ейнеÑ\80а**. Также он можеÑ\82 Ñ\81одеÑ\80жаÑ\82Ñ\8c паÑ\80амеÑ\82Ñ\80Ñ\8b, пеÑ\80едаваемÑ\8bе пÑ\80едÑ\83Ñ\81Ñ\82ановленной пÑ\80огÑ\80амме. Ð\9fоÑ\85оже на Ñ\82о, как еÑ\81ли бÑ\8b Ð\92ы запускали такую программу через терминал.
+Ð\9eбÑ\8bÑ\87но **обÑ\80аз конÑ\82ейнеÑ\80а** Ñ\81одеÑ\80жиÑ\82 меÑ\82аданнÑ\8bе пÑ\80едÑ\83Ñ\81Ñ\82ановленной пÑ\80огÑ\80аммÑ\8b или командÑ\83, коÑ\82оÑ\80Ñ\83Ñ\8e Ñ\81ледÑ\83еÑ\82 вÑ\8bполниÑ\82Ñ\8c пÑ\80и запÑ\83Ñ\81ке **конÑ\82ейнеÑ\80а**. Также он можеÑ\82 Ñ\81одеÑ\80жаÑ\82Ñ\8c паÑ\80амеÑ\82Ñ\80Ñ\8b, пеÑ\80едаваемÑ\8bе пÑ\80едÑ\83Ñ\81Ñ\82ановленной пÑ\80огÑ\80амме. Ð\9fоÑ\85оже на Ñ\82о, как еÑ\81ли бÑ\8b вы запускали такую программу через терминал.
-Ð\9aогда **конÑ\82ейнеÑ\80** запÑ\83Ñ\89ен, он бÑ\83деÑ\82 вÑ\8bполнÑ\8fÑ\82Ñ\8c пÑ\80опиÑ\81аннÑ\8bе в нÑ\91м командÑ\8b и пÑ\80огÑ\80аммÑ\8b. Ð\9dо Ð\92ы можете изменить его так, чтоб он выполнял другие команды и программы.
+Ð\9aогда **конÑ\82ейнеÑ\80** запÑ\83Ñ\89ен, он бÑ\83деÑ\82 вÑ\8bполнÑ\8fÑ\82Ñ\8c пÑ\80опиÑ\81аннÑ\8bе в нÑ\91м командÑ\8b и пÑ\80огÑ\80аммÑ\8b. Ð\9dо вы можете изменить его так, чтоб он выполнял другие команды и программы.
Контейнер буде работать до тех пор, пока выполняется его **главный процесс** (команда или программа).
* Использование с **Kubernetes** или аналогичным инструментом
* Запуск в **Raspberry Pi**
-* Ð\98Ñ\81полÑ\8cзование в облаÑ\87нÑ\8bÑ\85 Ñ\81еÑ\80виÑ\81аÑ\85, запÑ\83Ñ\81каÑ\8eÑ\89иÑ\85 обÑ\80азÑ\8b конÑ\82ейнеÑ\80ов длÑ\8f Ð\92ас и т.п.
+* Ð\98Ñ\81полÑ\8cзование в облаÑ\87нÑ\8bÑ\85 Ñ\81еÑ\80виÑ\81аÑ\85, запÑ\83Ñ\81каÑ\8eÑ\89иÑ\85 обÑ\80азÑ\8b конÑ\82ейнеÑ\80ов длÑ\8f вас и т.п.
### Установить зависимости
-Ð\9eбÑ\8bÑ\87но Ð\92ашему приложению необходимы **дополнительные библиотеки**, список которых находится в отдельном файле.
+Ð\9eбÑ\8bÑ\87но вашему приложению необходимы **дополнительные библиотеки**, список которых находится в отдельном файле.
На название и содержание такого файла влияет выбранный Вами инструмент **установки** этих библиотек (зависимостей).
!!! info "Информация"
Существуют и другие инструменты управления зависимостями.
- Ð\92 Ñ\8dÑ\82ом же Ñ\80азделе, но позже, Ñ\8f покажÑ\83 Ð\92ам пример использования Poetry. 👇
+ Ð\92 Ñ\8dÑ\82ом же Ñ\80азделе, но позже, Ñ\8f покажÑ\83 вам пример использования Poetry. 👇
### Создать приложение **FastAPI**
Сначала копируйте **только** файл с зависимостями.
- ÐÑ\82оÑ\82 Ñ\84айл **изменÑ\8fеÑ\82Ñ\81Ñ\8f доволÑ\8cно Ñ\80едко**, Docker иÑ\89еÑ\82 изменениÑ\8f пÑ\80и поÑ\81Ñ\82Ñ\80ойке обÑ\80аза и еÑ\81ли не наÑ\85одиÑ\82, Ñ\82о иÑ\81полÑ\8cзÑ\83еÑ\82 **кÑ\8dÑ\88**, в коÑ\82оÑ\80ом Ñ\85Ñ\80анÑ\8fÑ\82Ñ\81Ñ\8f пÑ\80едÑ\8bдÑ\83Ñ\89ии версии сборки образа.
+ ÐÑ\82оÑ\82 Ñ\84айл **изменÑ\8fеÑ\82Ñ\81Ñ\8f доволÑ\8cно Ñ\80едко**, Docker иÑ\89еÑ\82 изменениÑ\8f пÑ\80и поÑ\81Ñ\82Ñ\80ойке обÑ\80аза и еÑ\81ли не наÑ\85одиÑ\82, Ñ\82о иÑ\81полÑ\8cзÑ\83еÑ\82 **кÑ\8dÑ\88**, в коÑ\82оÑ\80ом Ñ\85Ñ\80анÑ\8fÑ\82Ñ\81Ñ\8f пÑ\80едÑ\8bдÑ\83Ñ\89ие версии сборки образа.
4. Установите библиотеки перечисленные в файле с зависимостями.
Ка и в предыдущем шаге с копированием файла, этот шаг также будет использовать **кэш Docker** в случае отсутствия изменений.
- Использрвание кэша, особенно на этом шаге, позволит Вам **сэкономить** кучу времени при повторной сборке образа, так как зависимости будут сохранены в кеше, а не **загружаться и устанавливаться каждый раз**.
+ Использование кэша, особенно на этом шаге, позволит вам **сэкономить** кучу времени при повторной сборке образа, так как зависимости будут сохранены в кеше, а не **загружаться и устанавливаться каждый раз**.
5. Скопируйте директорию `./app` внутрь директории `/code` (в контейнере).
6. Укажите **команду**, запускающую сервер `uvicorn`.
- `CMD` пÑ\80инимаеÑ\82 Ñ\81пиÑ\81ок Ñ\81Ñ\82Ñ\80ок, Ñ\80азделÑ\91ннÑ\8bÑ\85 запÑ\8fÑ\82Ñ\8bми, но пÑ\80и вÑ\8bполнении обÑ\8aединиÑ\82 иÑ\85 Ñ\87еÑ\80ез пÑ\80обел, Ñ\81обÑ\80ав из ниÑ\85 однÑ\83 командÑ\83, коÑ\82оÑ\80Ñ\83Ñ\8e Ð\92ы могли бы написать в терминале.
+ `CMD` пÑ\80инимаеÑ\82 Ñ\81пиÑ\81ок Ñ\81Ñ\82Ñ\80ок, Ñ\80азделÑ\91ннÑ\8bÑ\85 запÑ\8fÑ\82Ñ\8bми, но пÑ\80и вÑ\8bполнении обÑ\8aединиÑ\82 иÑ\85 Ñ\87еÑ\80ез пÑ\80обел, Ñ\81обÑ\80ав из ниÑ\85 однÑ\83 командÑ\83, коÑ\82оÑ\80Ñ\83Ñ\8e вы могли бы написать в терминале.
- Эта команда будет выполнена в **текущей рабочей директории**, а именно в директории `/code`, котоая указана командой `WORKDIR /code`.
+ Эта команда будет выполнена в **текущей рабочей директории**, а именно в директории `/code`, которая указана в команде `WORKDIR /code`.
- Так как команда выполняется внутрии директории `/code`, в которую мы поместили папку `./app` с приложением, то **Uvicorn** сможет найти и **импортировать** объект `app` из файла `app.main`.
+ Так как команда выполняется внутри директории `/code`, в которую мы поместили папку `./app` с приложением, то **Uvicorn** сможет найти и **импортировать** объект `app` из файла `app.main`.
!!! tip "Подсказка"
Если ткнёте на кружок с плюсом, то увидите пояснения. 👆
#### Использование прокси-сервера
-Ð\95Ñ\81ли Ð\92ы запускаете контейнер за прокси-сервером завершения TLS (балансирующего нагрузку), таким как Nginx или Traefik, добавьте опцию `--proxy-headers`, которая укажет Uvicorn, что он работает позади прокси-сервера и может доверять заголовкам отправляемым им.
+Ð\95Ñ\81ли вы запускаете контейнер за прокси-сервером завершения TLS (балансирующего нагрузку), таким как Nginx или Traefik, добавьте опцию `--proxy-headers`, которая укажет Uvicorn, что он работает позади прокси-сервера и может доверять заголовкам отправляемым им.
```Dockerfile
CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"]
Для загрузки и установки необходимых библиотек **может понадобиться несколько минут**, но использование **кэша** занимает несколько **секунд** максимум.
-Ð\98 Ñ\82ак как во вÑ\80емÑ\8f Ñ\80азÑ\80абоÑ\82ки Ð\92ы будете часто пересобирать контейнер для проверки работоспособности внесённых изменений, то сэкономленные минуты сложатся в часы, а то и дни.
+Ð\98 Ñ\82ак как во вÑ\80емÑ\8f Ñ\80азÑ\80абоÑ\82ки вы будете часто пересобирать контейнер для проверки работоспособности внесённых изменений, то сэкономленные минуты сложатся в часы, а то и дни.
Так как папка с кодом приложения **изменяется чаще всего**, то мы расположили её в конце `Dockerfile`, ведь после внесённых в код изменений кэш не будет использован на этом и следующих шагах.
### Запуск Docker-контейнера
-* Ð\97апÑ\83Ñ\81Ñ\82иÑ\82е конÑ\82ейнеÑ\80, оÑ\81нованнÑ\8bй на Ð\92ашем образе:
+* Ð\97апÑ\83Ñ\81Ñ\82иÑ\82е конÑ\82ейнеÑ\80, оÑ\81нованнÑ\8bй на вашем образе:
<div class="termy">
Вы можете проверить, что Ваш Docker-контейнер работает перейдя по ссылке: <a href="http://192.168.99.100/items/5?q=somequery" class="external-link" target="_blank">http://192.168.99.100/items/5?q=somequery</a> или <a href="http://127.0.0.1/items/5?q=somequery" class="external-link" target="_blank">http://127.0.0.1/items/5?q=somequery</a> (или похожей, которую использует Ваш Docker-хост).
-Там Ð\92ы увидите:
+Там вы увидите:
```JSON
{"item_id": 5, "q": "somequery"}
Теперь перейдите по ссылке <a href="http://192.168.99.100/docs" class="external-link" target="_blank">http://192.168.99.100/docs</a> или <a href="http://127.0.0.1/docs" class="external-link" target="_blank">http://127.0.0.1/docs</a> (или похожей, которую использует Ваш Docker-хост).
-Ð\97деÑ\81Ñ\8c Ð\92ы увидите автоматическую интерактивную документацию API (предоставляемую <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a>):
+Ð\97деÑ\81Ñ\8c вы увидите автоматическую интерактивную документацию API (предоставляемую <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a>):

## Альтернативная документация API
-Также Ð\92ы можете перейти по ссылке <a href="http://192.168.99.100/redoc" class="external-link" target="_blank">http://192.168.99.100/redoc</a> or <a href="http://127.0.0.1/redoc" class="external-link" target="_blank">http://127.0.0.1/redoc</a> (или похожей, которую использует Ваш Docker-хост).
+Также вы можете перейти по ссылке <a href="http://192.168.99.100/redoc" class="external-link" target="_blank">http://192.168.99.100/redoc</a> or <a href="http://127.0.0.1/redoc" class="external-link" target="_blank">http://127.0.0.1/redoc</a> (или похожей, которую использует Ваш Docker-хост).
-Ð\97деÑ\81Ñ\8c Ð\92ы увидите альтернативную автоматическую документацию API (предоставляемую <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a>):
+Ð\97деÑ\81Ñ\8c вы увидите альтернативную автоматическую документацию API (предоставляемую <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a>):

## Создание Docker-образа на основе однофайлового приложения FastAPI
-Ð\95Ñ\81ли Ð\92аше приложение FastAPI помещено в один файл, например, `main.py` и структура Ваших файлов похожа на эту:
+Ð\95Ñ\81ли ваше приложение FastAPI помещено в один файл, например, `main.py` и структура Ваших файлов похожа на эту:
```
.
Давайте вспомним о [Концепциях развёртывания](./concepts.md){.internal-link target=_blank} и применим их к контейнерам.
-Контейнеры - это, в основном, инструмент упрощающий **сборку и развёртывание** приложения и они не обязыают к применению какой-то определённой **концепции развёртывания**, а значит мы можем выбирать нужную стратегию.
+Ð\9aонÑ\82ейнеÑ\80Ñ\8b - Ñ\8dÑ\82о, в оÑ\81новном, инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82 Ñ\83пÑ\80оÑ\89аÑ\8eÑ\89ий **Ñ\81боÑ\80кÑ\83 и Ñ\80азвÑ\91Ñ\80Ñ\82Ñ\8bвание** пÑ\80иложениÑ\8f и они не обÑ\8fзÑ\8bваÑ\8eÑ\82 к пÑ\80именениÑ\8e какой-Ñ\82о опÑ\80еделÑ\91нной **конÑ\86епÑ\86ии Ñ\80азвÑ\91Ñ\80Ñ\82Ñ\8bваниÑ\8f**, а знаÑ\87иÑ\82 мÑ\8b можем вÑ\8bбиÑ\80аÑ\82Ñ\8c нÑ\83жнÑ\83Ñ\8e Ñ\81Ñ\82Ñ\80аÑ\82егиÑ\8e.
**Хорошая новость** в том, что независимо от выбранной стратегии, мы всё равно можем покрыть все концепции развёртывания. 🎉
## Запуск нескольких экземпляров приложения - Указание количества процессов
-Ð\95Ñ\81ли Ñ\83 Ð\92аÑ\81 еÑ\81Ñ\82Ñ\8c <abbr title="Ð\9dеÑ\81колÑ\8cко Ñ\81еÑ\80веÑ\80ов наÑ\81Ñ\82Ñ\80оеннÑ\8bÑ\85 длÑ\8f Ñ\81овмеÑ\81Ñ\82ной Ñ\80абоÑ\82Ñ\8b.">клаÑ\81Ñ\82еÑ\80</abbr> маÑ\88ин под Ñ\83пÑ\80авлением **Kubernetes**, Docker Swarm Mode, Nomad или аналогиÑ\87ной Ñ\81ложной Ñ\81иÑ\81Ñ\82емой оÑ\80кеÑ\81Ñ\82Ñ\80аÑ\86ии конÑ\82ейнеÑ\80ов, Ñ\81коÑ\80ее вÑ\81его, вмеÑ\81Ñ\82о иÑ\81полÑ\8cзованиÑ\8f менеджеÑ\80а пÑ\80оÑ\86еÑ\81Ñ\81ов (Ñ\82ипа Gunicorn и его воÑ\80кеÑ\80Ñ\8b) в каждом конÑ\82ейнеÑ\80е, Ð\92ы захотите **управлять количеством запущенных экземпляров приложения** на **уровне кластера**.
+Ð\95Ñ\81ли Ñ\83 ваÑ\81 еÑ\81Ñ\82Ñ\8c <abbr title="Ð\9dеÑ\81колÑ\8cко Ñ\81еÑ\80веÑ\80ов наÑ\81Ñ\82Ñ\80оеннÑ\8bÑ\85 длÑ\8f Ñ\81овмеÑ\81Ñ\82ной Ñ\80абоÑ\82Ñ\8b.">клаÑ\81Ñ\82еÑ\80</abbr> маÑ\88ин под Ñ\83пÑ\80авлением **Kubernetes**, Docker Swarm Mode, Nomad или аналогиÑ\87ной Ñ\81ложной Ñ\81иÑ\81Ñ\82емой оÑ\80кеÑ\81Ñ\82Ñ\80аÑ\86ии конÑ\82ейнеÑ\80ов, Ñ\81коÑ\80ее вÑ\81его, вмеÑ\81Ñ\82о иÑ\81полÑ\8cзованиÑ\8f менеджеÑ\80а пÑ\80оÑ\86еÑ\81Ñ\81ов (Ñ\82ипа Gunicorn и его воÑ\80кеÑ\80Ñ\8b) в каждом конÑ\82ейнеÑ\80е, вы захотите **управлять количеством запущенных экземпляров приложения** на **уровне кластера**.
В любую из этих систем управления контейнерами обычно встроен способ управления **количеством запущенных контейнеров** для распределения **нагрузки** от входящих запросов на **уровне кластера**.
!!! tip "Подсказка"
**Прокси-сервер завершения работы TLS** одновременно может быть **балансировщиком нагрузки**.
-СиÑ\81Ñ\82ема оÑ\80кеÑ\81Ñ\82Ñ\80аÑ\86ии, коÑ\82оÑ\80Ñ\83Ñ\8e Ð\92ы используете для запуска и управления контейнерами, имеет встроенный инструмент **сетевого взаимодействия** (например, для передачи HTTP-запросов) между контейнерами с Вашими приложениями и **балансировщиком нагрузки** (который также может быть **прокси-сервером**).
+СиÑ\81Ñ\82ема оÑ\80кеÑ\81Ñ\82Ñ\80аÑ\86ии, коÑ\82оÑ\80Ñ\83Ñ\8e вы используете для запуска и управления контейнерами, имеет встроенный инструмент **сетевого взаимодействия** (например, для передачи HTTP-запросов) между контейнерами с Вашими приложениями и **балансировщиком нагрузки** (который также может быть **прокси-сервером**).
### Один балансировщик - Множество контейнеров
-Ð\9fÑ\80и Ñ\80абоÑ\82е Ñ\81 **Kubernetes** или аналогиÑ\87нÑ\8bми Ñ\81иÑ\81Ñ\82емами оÑ\80кеÑ\81Ñ\82Ñ\80аÑ\86ии иÑ\81полÑ\8cзование иÑ\85 внÑ\83Ñ\82Ñ\80еннней Ñ\81еÑ\82и позволÑ\8fеÑ\82 имеÑ\82Ñ\8c один **баланÑ\81иÑ\80овÑ\89ик нагÑ\80Ñ\83зки**, коÑ\82оÑ\80Ñ\8bй пÑ\80оÑ\81лÑ\83Ñ\88иваеÑ\82 **главнÑ\8bй** поÑ\80Ñ\82 и пеÑ\80едаÑ\91Ñ\82 запÑ\80оÑ\81Ñ\8b **множеÑ\81Ñ\82вÑ\83 запÑ\83Ñ\89еннÑ\8bÑ\85 конÑ\82ейнеÑ\80ов** Ñ\81 Ð\92аÑ\88ими пÑ\80иложениÑ\8fми.
+При работе с **Kubernetes** или аналогичными системами оркестрации использование их внутренней сети позволяет иметь один **балансировщик нагрузки**, который прослушивает **главный** порт и передаёт запросы **множеству запущенных контейнеров** с Вашими приложениями.
В каждом из контейнеров обычно работает **только один процесс** (например, процесс Uvicorn управляющий Вашим приложением FastAPI). Контейнеры могут быть **идентичными**, запущенными на основе одного и того же образа, но у каждого будут свои отдельные процесс, память и т.п. Таким образом мы получаем преимущества **распараллеливания** работы по **разным ядрам** процессора или даже **разным машинам**.
Система управления контейнерами с **балансировщиком нагрузки** будет **распределять запросы** к контейнерам с приложениями **по очереди**. То есть каждый запрос будет обработан одним из множества **одинаковых контейнеров** с одним и тем же приложением.
-**Ð\91аланÑ\81иÑ\80овÑ\89ик нагÑ\80Ñ\83зки** можеÑ\82 обÑ\80абаÑ\82Ñ\8bваÑ\82Ñ\8c запÑ\80оÑ\81Ñ\8b к *Ñ\80азнÑ\8bм* пÑ\80иложениÑ\8fм, Ñ\80аÑ\81положеннÑ\8bм в Ð\92ашем кластере (например, если у них разные домены или префиксы пути) и передавать запросы нужному контейнеру с требуемым приложением.
+**Ð\91аланÑ\81иÑ\80овÑ\89ик нагÑ\80Ñ\83зки** можеÑ\82 обÑ\80абаÑ\82Ñ\8bваÑ\82Ñ\8c запÑ\80оÑ\81Ñ\8b к *Ñ\80азнÑ\8bм* пÑ\80иложениÑ\8fм, Ñ\80аÑ\81положеннÑ\8bм в вашем кластере (например, если у них разные домены или префиксы пути) и передавать запросы нужному контейнеру с требуемым приложением.
### Один процесс на контейнер
### <a name="special-cases"></a>Множество процессов внутри контейнера для особых случаев</a>
-Безусловно, бывают **особые случаи**, когда может понадобится внутри контейнера запускать **менеджер процессов Gunicorn**, управляющий несколькими **процессами Uvicorn**.
+Ð\91езÑ\83Ñ\81ловно, бÑ\8bваÑ\8eÑ\82 **оÑ\81обÑ\8bе Ñ\81лÑ\83Ñ\87аи**, когда можеÑ\82 понадобиÑ\82Ñ\8cÑ\81Ñ\8f внÑ\83Ñ\82Ñ\80и конÑ\82ейнеÑ\80а запÑ\83Ñ\81каÑ\82Ñ\8c **менеджеÑ\80 пÑ\80оÑ\86еÑ\81Ñ\81ов Gunicorn**, Ñ\83пÑ\80авлÑ\8fÑ\8eÑ\89ий неÑ\81колÑ\8cкими **пÑ\80оÑ\86еÑ\81Ñ\81ами Uvicorn**.
-Ð\94лÑ\8f Ñ\82акиÑ\85 Ñ\81лÑ\83Ñ\87аев Ð\92Ñ\8b можеÑ\82е иÑ\81полÑ\8cзоваÑ\82Ñ\8c **оÑ\84иÑ\86иалÑ\8cнÑ\8bй Docker-обÑ\80аз** (пÑ\80им. пеÑ\80: - *здеÑ\81Ñ\8c и далее на Ñ\8dÑ\82ой Ñ\81Ñ\82Ñ\80аниÑ\86е, еÑ\81ли Ð\92Ñ\8b вÑ\81Ñ\82Ñ\80еÑ\82иÑ\82е Ñ\81оÑ\87еÑ\82ание "оÑ\84иÑ\86иалÑ\8cнÑ\8bй Docker-обÑ\80аз" без Ñ\83Ñ\82оÑ\87нений, Ñ\82о авÑ\82оÑ\80 имееÑ\82 в видÑ\83 именно пÑ\80едоÑ\81Ñ\82авлÑ\8fемÑ\8bй им обÑ\80аз*), где в каÑ\87еÑ\81Ñ\82ве менеджеÑ\80а пÑ\80оÑ\86еÑ\81Ñ\81ов иÑ\81полÑ\8cзÑ\83еÑ\82Ñ\81Ñ\8f **Gunicorn**, запÑ\83Ñ\81каÑ\8eÑ\89ий неÑ\81колÑ\8cко **пÑ\80оÑ\86еÑ\81Ñ\81ов Uvicorn** и некоÑ\82оÑ\80Ñ\8bе наÑ\81Ñ\82Ñ\80ойки по Ñ\83молÑ\87аниÑ\8e, авÑ\82омаÑ\82иÑ\87еÑ\81ки Ñ\83Ñ\81Ñ\82анавливаÑ\8eÑ\89ие колиÑ\87еÑ\81Ñ\82во запÑ\83Ñ\89еннÑ\8bÑ\85 пÑ\80оÑ\86еÑ\81Ñ\81ов в завиÑ\81имоÑ\81Ñ\82и оÑ\82 колиÑ\87еÑ\81Ñ\82ва Ñ\8fдеÑ\80 Ð\92аÑ\88его пÑ\80оÑ\86еÑ\81Ñ\81оÑ\80а. Я Ñ\80аÑ\81Ñ\81кажÑ\83 Ð\92ам об этом подробнее тут: [Официальный Docker-образ со встроенными Gunicorn и Uvicorn](#docker-gunicorn-uvicorn).
+Ð\94лÑ\8f Ñ\82акиÑ\85 Ñ\81лÑ\83Ñ\87аев вÑ\8b можеÑ\82е иÑ\81полÑ\8cзоваÑ\82Ñ\8c **оÑ\84иÑ\86иалÑ\8cнÑ\8bй Docker-обÑ\80аз** (пÑ\80им. пеÑ\80: - *здеÑ\81Ñ\8c и далее на Ñ\8dÑ\82ой Ñ\81Ñ\82Ñ\80аниÑ\86е, еÑ\81ли вÑ\8b вÑ\81Ñ\82Ñ\80еÑ\82иÑ\82е Ñ\81оÑ\87еÑ\82ание "оÑ\84иÑ\86иалÑ\8cнÑ\8bй Docker-обÑ\80аз" без Ñ\83Ñ\82оÑ\87нений, Ñ\82о авÑ\82оÑ\80 имееÑ\82 в видÑ\83 именно пÑ\80едоÑ\81Ñ\82авлÑ\8fемÑ\8bй им обÑ\80аз*), где в каÑ\87еÑ\81Ñ\82ве менеджеÑ\80а пÑ\80оÑ\86еÑ\81Ñ\81ов иÑ\81полÑ\8cзÑ\83еÑ\82Ñ\81Ñ\8f **Gunicorn**, запÑ\83Ñ\81каÑ\8eÑ\89ий неÑ\81колÑ\8cко **пÑ\80оÑ\86еÑ\81Ñ\81ов Uvicorn** и некоÑ\82оÑ\80Ñ\8bе наÑ\81Ñ\82Ñ\80ойки по Ñ\83молÑ\87аниÑ\8e, авÑ\82омаÑ\82иÑ\87еÑ\81ки Ñ\83Ñ\81Ñ\82анавливаÑ\8eÑ\89ие колиÑ\87еÑ\81Ñ\82во запÑ\83Ñ\89еннÑ\8bÑ\85 пÑ\80оÑ\86еÑ\81Ñ\81ов в завиÑ\81имоÑ\81Ñ\82и оÑ\82 колиÑ\87еÑ\81Ñ\82ва Ñ\8fдеÑ\80 ваÑ\88его пÑ\80оÑ\86еÑ\81Ñ\81оÑ\80а. Я Ñ\80аÑ\81Ñ\81кажÑ\83 вам об этом подробнее тут: [Официальный Docker-образ со встроенными Gunicorn и Uvicorn](#docker-gunicorn-uvicorn).
Некоторые примеры подобных случаев:
#### Простое приложение
-Ð\92Ñ\8b можеÑ\82е иÑ\81полÑ\8cзоваÑ\82Ñ\8c менеджеÑ\80 пÑ\80оÑ\86еÑ\81Ñ\81ов внÑ\83Ñ\82Ñ\80и конÑ\82ейнеÑ\80а, еÑ\81ли Ð\92аÑ\88е пÑ\80иложение **наÑ\81Ñ\82олÑ\8cко пÑ\80оÑ\81Ñ\82ое**, Ñ\87Ñ\82о Ñ\83 Ð\92аÑ\81 неÑ\82 необÑ\85одимоÑ\81Ñ\82и (по кÑ\80айней меÑ\80е, пока неÑ\82) в Ñ\82Ñ\89аÑ\82елÑ\8cнÑ\8bÑ\85 наÑ\81Ñ\82Ñ\80ойкаÑ\85 колиÑ\87еÑ\81Ñ\82ва пÑ\80оÑ\86еÑ\81Ñ\81ов и Ð\92ам достаточно имеющихся настроек по умолчанию (если используется официальный Docker-образ) для запуска приложения **только на одном сервере**, а не в кластере.
+Ð\92Ñ\8b можеÑ\82е иÑ\81полÑ\8cзоваÑ\82Ñ\8c менеджеÑ\80 пÑ\80оÑ\86еÑ\81Ñ\81ов внÑ\83Ñ\82Ñ\80и конÑ\82ейнеÑ\80а, еÑ\81ли ваÑ\88е пÑ\80иложение **наÑ\81Ñ\82олÑ\8cко пÑ\80оÑ\81Ñ\82ое**, Ñ\87Ñ\82о Ñ\83 ваÑ\81 неÑ\82 необÑ\85одимоÑ\81Ñ\82и (по кÑ\80айней меÑ\80е, пока неÑ\82) в Ñ\82Ñ\89аÑ\82елÑ\8cнÑ\8bÑ\85 наÑ\81Ñ\82Ñ\80ойкаÑ\85 колиÑ\87еÑ\81Ñ\82ва пÑ\80оÑ\86еÑ\81Ñ\81ов и вам достаточно имеющихся настроек по умолчанию (если используется официальный Docker-образ) для запуска приложения **только на одном сервере**, а не в кластере.
#### Docker Compose
-С помоÑ\89Ñ\8cÑ\8e **Docker Compose** можно Ñ\80азвоÑ\80аÑ\87иваÑ\82Ñ\8c неÑ\81колÑ\8cко конÑ\82ейнеÑ\80ов на **одном Ñ\81еÑ\80веÑ\80е** (не клаÑ\81Ñ\82еÑ\80е), но пÑ\80и Ñ\8dÑ\82о Ñ\83 Ð\92ас не будет простого способа управления количеством запущенных контейнеров с одновременным сохранением общей сети и **балансировки нагрузки**.
+С помоÑ\89Ñ\8cÑ\8e **Docker Compose** можно Ñ\80азвоÑ\80аÑ\87иваÑ\82Ñ\8c неÑ\81колÑ\8cко конÑ\82ейнеÑ\80ов на **одном Ñ\81еÑ\80веÑ\80е** (не клаÑ\81Ñ\82еÑ\80е), но пÑ\80и Ñ\8dÑ\82о Ñ\83 вас не будет простого способа управления количеством запущенных контейнеров с одновременным сохранением общей сети и **балансировки нагрузки**.
В этом случае можно использовать **менеджер процессов**, управляющий **несколькими процессами**, внутри **одного контейнера**.
#### Prometheus и прочие причины
-У Ð\92ас могут быть и **другие причины**, когда использование **множества процессов** внутри **одного контейнера** будет проще, нежели запуск **нескольких контейнеров** с **единственным процессом** в каждом из них.
+У вас могут быть и **другие причины**, когда использование **множества процессов** внутри **одного контейнера** будет проще, нежели запуск **нескольких контейнеров** с **единственным процессом** в каждом из них.
-Ð\9dапÑ\80имеÑ\80 (в завиÑ\81имоÑ\81Ñ\82и оÑ\82 конÑ\84игÑ\83Ñ\80аÑ\86ии), Ñ\83 Ð\92ас могут быть инструменты подобные экспортёру Prometheus, которые должны иметь доступ к **каждому запросу** приходящему в контейнер.
+Ð\9dапÑ\80имеÑ\80 (в завиÑ\81имоÑ\81Ñ\82и оÑ\82 конÑ\84игÑ\83Ñ\80аÑ\86ии), Ñ\83 вас могут быть инструменты подобные экспортёру Prometheus, которые должны иметь доступ к **каждому запросу** приходящему в контейнер.
-Ð\95Ñ\81ли Ñ\83 Ð\92ас будет **несколько контейнеров**, то Prometheus, по умолчанию, **при сборе метрик** получит их **только с одного контейнера**, который обрабатывает конкретный запрос, вместо **сбора метрик** со всех работающих контейнеров.
+Ð\95Ñ\81ли Ñ\83 вас будет **несколько контейнеров**, то Prometheus, по умолчанию, **при сборе метрик** получит их **только с одного контейнера**, который обрабатывает конкретный запрос, вместо **сбора метрик** со всех работающих контейнеров.
В таком случае может быть проще иметь **один контейнер** со **множеством процессов**, с нужным инструментом (таким как экспортёр Prometheus) в этом же контейнере и собирающем метрики со всех внутренних процессов этого контейнера.
---
-Самое главное - **ни одно** из пеÑ\80еÑ\87иÑ\81леннÑ\8bÑ\85 пÑ\80авил не Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f **вÑ\8bÑ\81еÑ\87еннÑ\8bм в камне** и Ð\92Ñ\8b не обÑ\8fзанÑ\8b Ñ\81лепо иÑ\85 повÑ\82оÑ\80Ñ\8fÑ\82Ñ\8c. Ð\92Ñ\8b можеÑ\82е иÑ\81полÑ\8cзоваÑ\82Ñ\8c Ñ\8dÑ\82и идеи пÑ\80и **Ñ\80аÑ\81Ñ\81моÑ\82Ñ\80ении Ð\92ашего конкретного случая** и самостоятельно решать, какая из концепции подходит лучше:
+Самое главное - **ни одно** из пеÑ\80еÑ\87иÑ\81леннÑ\8bÑ\85 пÑ\80авил не Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f **вÑ\8bÑ\81еÑ\87еннÑ\8bм на камне** и вÑ\8b не обÑ\8fзанÑ\8b Ñ\81лепо иÑ\85 повÑ\82оÑ\80Ñ\8fÑ\82Ñ\8c. вÑ\8b можеÑ\82е иÑ\81полÑ\8cзоваÑ\82Ñ\8c Ñ\8dÑ\82и идеи пÑ\80и **Ñ\80аÑ\81Ñ\81моÑ\82Ñ\80ении вашего конкретного случая** и самостоятельно решать, какая из концепции подходит лучше:
* Использование более безопасного протокола HTTPS
* Настройки запуска приложения
## Управление памятью
-Ð\9fÑ\80и **запÑ\83Ñ\81ке одного пÑ\80оÑ\86еÑ\81Ñ\81а на конÑ\82ейнеÑ\80** Ð\92ы получаете относительно понятный, стабильный и ограниченный объём памяти, потребляемый одним контейнером.
+Ð\9fÑ\80и **запÑ\83Ñ\81ке одного пÑ\80оÑ\86еÑ\81Ñ\81а на конÑ\82ейнеÑ\80** вы получаете относительно понятный, стабильный и ограниченный объём памяти, потребляемый одним контейнером.
Вы можете установить аналогичные ограничения по памяти при конфигурировании своей системы управления контейнерами (например, **Kubernetes**). Таким образом система сможет **изменять количество контейнеров** на **доступных ей машинах** приводя в соответствие количество памяти нужной контейнерам с количеством памяти доступной в кластере (наборе доступных машин).
-Ð\95Ñ\81ли Ñ\83 Ð\92аÑ\81 **пÑ\80оÑ\81Ñ\82енÑ\8cкое** пÑ\80иложение, веÑ\80оÑ\8fÑ\82но Ñ\83 Ð\92аÑ\81 не бÑ\83деÑ\82 **необÑ\85одимоÑ\81Ñ\82и** Ñ\83Ñ\81Ñ\82анавливаÑ\82Ñ\8c жÑ\91Ñ\81Ñ\82кие огÑ\80аниÑ\87ениÑ\8f на вÑ\8bделÑ\8fемÑ\83Ñ\8e емÑ\83 памÑ\8fÑ\82Ñ\8c. Ð\9dо еÑ\81ли пÑ\80иложение **иÑ\81полÑ\8cзÑ\83еÑ\82 много памÑ\8fÑ\82и** (напÑ\80имеÑ\80, оно иÑ\81полÑ\8cзÑ\83еÑ\82 модели **маÑ\88инного обÑ\83Ñ\87ениÑ\8f**), Ð\92ам следует проверить, как много памяти ему требуется и отрегулировать **количество контейнеров** запущенных на **каждой машине** (может быть даже добавить машин в кластер).
+Ð\95Ñ\81ли Ñ\83 ваÑ\81 **пÑ\80оÑ\81Ñ\82енÑ\8cкое** пÑ\80иложение, веÑ\80оÑ\8fÑ\82но Ñ\83 ваÑ\81 не бÑ\83деÑ\82 **необÑ\85одимоÑ\81Ñ\82и** Ñ\83Ñ\81Ñ\82анавливаÑ\82Ñ\8c жÑ\91Ñ\81Ñ\82кие огÑ\80аниÑ\87ениÑ\8f на вÑ\8bделÑ\8fемÑ\83Ñ\8e емÑ\83 памÑ\8fÑ\82Ñ\8c. Ð\9dо еÑ\81ли пÑ\80иложение **иÑ\81полÑ\8cзÑ\83еÑ\82 много памÑ\8fÑ\82и** (напÑ\80имеÑ\80, оно иÑ\81полÑ\8cзÑ\83еÑ\82 модели **маÑ\88инного обÑ\83Ñ\87ениÑ\8f**), вам следует проверить, как много памяти ему требуется и отрегулировать **количество контейнеров** запущенных на **каждой машине** (может быть даже добавить машин в кластер).
-Ð\95Ñ\81ли Ð\92ы запускаете **несколько процессов в контейнере**, то должны быть уверены, что эти процессы не **займут памяти больше**, чем доступно для контейнера.
+Ð\95Ñ\81ли вы запускаете **несколько процессов в контейнере**, то должны быть уверены, что эти процессы не **займут памяти больше**, чем доступно для контейнера.
## Подготовительные шаги при запуске контейнеров
-Ð\95Ñ\81Ñ\82Ñ\8c два оÑ\81новнÑ\8bÑ\85 подÑ\85ода, коÑ\82оÑ\80Ñ\8bе Ð\92ы можете использовать при запуске контейнеров (Docker, Kubernetes и т.п.).
+Ð\95Ñ\81Ñ\82Ñ\8c два оÑ\81новнÑ\8bÑ\85 подÑ\85ода, коÑ\82оÑ\80Ñ\8bе вы можете использовать при запуске контейнеров (Docker, Kubernetes и т.п.).
### Множество контейнеров
-Ð\9aогда Ð\92ы запускаете **множество контейнеров**, в каждом из которых работает **только один процесс** (например, в кластере **Kubernetes**), может возникнуть необходимость иметь **отдельный контейнер**, который осуществит **предварительные шаги перед запуском** остальных контейнеров (например, применяет миграции к базе данных).
+Ð\9aогда вы запускаете **множество контейнеров**, в каждом из которых работает **только один процесс** (например, в кластере **Kubernetes**), может возникнуть необходимость иметь **отдельный контейнер**, который осуществит **предварительные шаги перед запуском** остальных контейнеров (например, применяет миграции к базе данных).
!!! info "Информация"
При использовании Kubernetes, это может быть <a href="https://kubernetes.io/docs/concepts/workloads/pods/init-containers/" class="external-link" target="_blank">Инициализирующий контейнер</a>.
-Ð\9fÑ\80и оÑ\82Ñ\81Ñ\83Ñ\82Ñ\81Ñ\82вии Ñ\82акой необÑ\85одимоÑ\81Ñ\82и (допÑ\83Ñ\81Ñ\82им, не нÑ\83жно пÑ\80именÑ\8fÑ\82Ñ\8c мигÑ\80аÑ\86ии к базе даннÑ\8bÑ\85, а Ñ\82олÑ\8cко пÑ\80овеÑ\80иÑ\82Ñ\8c, Ñ\87Ñ\82о она гоÑ\82ова пÑ\80инимаÑ\82Ñ\8c Ñ\81оединениÑ\8f), Ð\92ы можете проводить такую проверку в каждом контейнере перед запуском его основного процесса и запускать все контейнеры **одновременно**.
+Ð\9fÑ\80и оÑ\82Ñ\81Ñ\83Ñ\82Ñ\81Ñ\82вии Ñ\82акой необÑ\85одимоÑ\81Ñ\82и (допÑ\83Ñ\81Ñ\82им, не нÑ\83жно пÑ\80именÑ\8fÑ\82Ñ\8c мигÑ\80аÑ\86ии к базе даннÑ\8bÑ\85, а Ñ\82олÑ\8cко пÑ\80овеÑ\80иÑ\82Ñ\8c, Ñ\87Ñ\82о она гоÑ\82ова пÑ\80инимаÑ\82Ñ\8c Ñ\81оединениÑ\8f), вы можете проводить такую проверку в каждом контейнере перед запуском его основного процесса и запускать все контейнеры **одновременно**.
### Только один контейнер
-Ð\95Ñ\81ли Ñ\83 Ð\92ас несложное приложение для работы которого достаточно **одного контейнера**, но в котором работает **несколько процессов** (или один процесс), то прохождение предварительных шагов можно осуществить в этом же контейнере до запуска основного процесса. Официальный Docker-образ поддерживает такие действия.
+Ð\95Ñ\81ли Ñ\83 вас несложное приложение для работы которого достаточно **одного контейнера**, но в котором работает **несколько процессов** (или один процесс), то прохождение предварительных шагов можно осуществить в этом же контейнере до запуска основного процесса. Официальный Docker-образ поддерживает такие действия.
## Официальный Docker-образ с Gunicorn и Uvicorn
-Я подгоÑ\82овил длÑ\8f Ð\92ас Docker-образ, в который включён Gunicorn управляющий процессами (воркерами) Uvicorn, в соответствии с концепциями рассмотренными в предыдущей главе: [Рабочие процессы сервера (воркеры) - Gunicorn совместно с Uvicorn](./server-workers.md){.internal-link target=_blank}.
+Я подгоÑ\82овил длÑ\8f вас Docker-образ, в который включён Gunicorn управляющий процессами (воркерами) Uvicorn, в соответствии с концепциями рассмотренными в предыдущей главе: [Рабочие процессы сервера (воркеры) - Gunicorn совместно с Uvicorn](./server-workers.md){.internal-link target=_blank}.
Этот образ может быть полезен для ситуаций описанных тут: [Множество процессов внутри контейнера для особых случаев](#special-cases).
* <a href="https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker" class="external-link" target="_blank">tiangolo/uvicorn-gunicorn-fastapi</a>.
!!! warning "Предупреждение"
- СкоÑ\80ее вÑ\81его Ñ\83 Ð\92ас **нет необходимости** в использовании этого образа или подобного ему и лучше создать свой образ с нуля как описано тут: [Создать Docker-образ для FastAPI](#docker-fastapi).
+ СкоÑ\80ее вÑ\81его Ñ\83 вас **нет необходимости** в использовании этого образа или подобного ему и лучше создать свой образ с нуля как описано тут: [Создать Docker-образ для FastAPI](#docker-fastapi).
В этом образе есть **автоматический** механизм подстройки для запуска **необходимого количества процессов** в соответствии с доступным количеством ядер процессора.
Это означает, что он будет пытаться **выжать** из процессора как можно больше **производительности**.
-Ð\9dо Ð\92ы можете изменять и обновлять конфигурацию с помощью **переменных окружения** и т.п.
+Ð\9dо вы можете изменять и обновлять конфигурацию с помощью **переменных окружения** и т.п.
Поскольку количество процессов зависит от процессора, на котором работает контейнер, **объём потребляемой памяти** также будет зависеть от этого.
-Ð\90 знаÑ\87иÑ\82, еÑ\81ли Ð\92ашему приложению требуется много оперативной памяти (например, оно использует модели машинного обучения) и Ваш сервер имеет центральный процессор с большим количеством ядер, но **не слишком большим объёмом оперативной памяти**, то может дойти до того, что контейнер попытается занять памяти больше, чем доступно, из-за чего будет падение производительности (или сервер вовсе упадёт). 🚨
+Ð\90 знаÑ\87иÑ\82, еÑ\81ли вашему приложению требуется много оперативной памяти (например, оно использует модели машинного обучения) и Ваш сервер имеет центральный процессор с большим количеством ядер, но **не слишком большим объёмом оперативной памяти**, то может дойти до того, что контейнер попытается занять памяти больше, чем доступно, из-за чего будет падение производительности (или сервер вовсе упадёт). 🚨
### Написание `Dockerfile`
### Большие приложения
-Ð\95Ñ\81ли Ð\92ы успели ознакомиться с разделом [Приложения содержащие много файлов](../tutorial/bigger-applications.md){.internal-link target=_blank}, состоящие из множества файлов, Ваш Dockerfile может выглядеть так:
+Ð\95Ñ\81ли вы успели ознакомиться с разделом [Приложения содержащие много файлов](../tutorial/bigger-applications.md){.internal-link target=_blank}, состоящие из множества файлов, Ваш Dockerfile может выглядеть так:
```Dockerfile hl_lines="7"
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9
### Как им пользоваться
-Ð\95Ñ\81ли Ð\92Ñ\8b иÑ\81полÑ\8cзÑ\83еÑ\82е **Kubernetes** (или Ñ\87Ñ\82о-Ñ\82о вÑ\80оде Ñ\82ого), Ñ\81коÑ\80ее вÑ\81его Ð\92ам **не нужно** использовать официальный Docker-образ (или другой похожий) в качестве основы, так как управление **количеством запущенных контейнеров** должно быть настроено на уровне кластера. В таком случае лучше **создать образ с нуля**, как описано в разделе Создать [Docker-образ для FastAPI](#docker-fastapi).
+Ð\95Ñ\81ли вÑ\8b иÑ\81полÑ\8cзÑ\83еÑ\82е **Kubernetes** (или Ñ\87Ñ\82о-Ñ\82о вÑ\80оде Ñ\82ого), Ñ\81коÑ\80ее вÑ\81его вам **не нужно** использовать официальный Docker-образ (или другой похожий) в качестве основы, так как управление **количеством запущенных контейнеров** должно быть настроено на уровне кластера. В таком случае лучше **создать образ с нуля**, как описано в разделе Создать [Docker-образ для FastAPI](#docker-fastapi).
-Ð\9eÑ\84иÑ\86иалÑ\8cнÑ\8bй обÑ\80аз можеÑ\82 бÑ\8bÑ\82Ñ\8c полезен в оÑ\82делÑ\8cнÑ\8bÑ\85 Ñ\81лÑ\83Ñ\87аÑ\8fÑ\85, опиÑ\81аннÑ\8bÑ\85 вÑ\8bÑ\88е в Ñ\80азделе [Ð\9cножеÑ\81Ñ\82во пÑ\80оÑ\86еÑ\81Ñ\81ов внÑ\83Ñ\82Ñ\80и конÑ\82ейнеÑ\80а длÑ\8f оÑ\81обÑ\8bÑ\85 Ñ\81лÑ\83Ñ\87аев](#special-cases). Ð\9dапÑ\80имеÑ\80, еÑ\81ли Ð\92аÑ\88е пÑ\80иложение **доÑ\81Ñ\82аÑ\82оÑ\87но пÑ\80оÑ\81Ñ\82ое**, не Ñ\82Ñ\80ебÑ\83еÑ\82 запÑ\83Ñ\81ка в клаÑ\81Ñ\82еÑ\80е и Ñ\81поÑ\81обно Ñ\83меÑ\81Ñ\82иÑ\82Ñ\8cÑ\81Ñ\8f в один конÑ\82ейнеÑ\80, Ñ\82о его наÑ\81Ñ\82Ñ\80ойки по Ñ\83молÑ\87аниÑ\8e бÑ\83дÑ\83Ñ\82 Ñ\80абоÑ\82аÑ\82Ñ\8c доволÑ\8cно Ñ\85оÑ\80оÑ\88о. Ð\98ли же Ð\92ы развертываете его с помощью **Docker Compose**, работаете на одном сервере и т. д
+Ð\9eÑ\84иÑ\86иалÑ\8cнÑ\8bй обÑ\80аз можеÑ\82 бÑ\8bÑ\82Ñ\8c полезен в оÑ\82делÑ\8cнÑ\8bÑ\85 Ñ\81лÑ\83Ñ\87аÑ\8fÑ\85, опиÑ\81аннÑ\8bÑ\85 вÑ\8bÑ\88е в Ñ\80азделе [Ð\9cножеÑ\81Ñ\82во пÑ\80оÑ\86еÑ\81Ñ\81ов внÑ\83Ñ\82Ñ\80и конÑ\82ейнеÑ\80а длÑ\8f оÑ\81обÑ\8bÑ\85 Ñ\81лÑ\83Ñ\87аев](#special-cases). Ð\9dапÑ\80имеÑ\80, еÑ\81ли ваÑ\88е пÑ\80иложение **доÑ\81Ñ\82аÑ\82оÑ\87но пÑ\80оÑ\81Ñ\82ое**, не Ñ\82Ñ\80ебÑ\83еÑ\82 запÑ\83Ñ\81ка в клаÑ\81Ñ\82еÑ\80е и Ñ\81поÑ\81обно Ñ\83меÑ\81Ñ\82иÑ\82Ñ\8cÑ\81Ñ\8f в один конÑ\82ейнеÑ\80, Ñ\82о его наÑ\81Ñ\82Ñ\80ойки по Ñ\83молÑ\87аниÑ\8e бÑ\83дÑ\83Ñ\82 Ñ\80абоÑ\82аÑ\82Ñ\8c доволÑ\8cно Ñ\85оÑ\80оÑ\88о. Ð\98ли же вы развертываете его с помощью **Docker Compose**, работаете на одном сервере и т. д
## Развёртывание образа контейнера
* С использованием **Kubernetes** в кластере
* С использованием режима Docker Swarm в кластере
* С использованием других инструментов, таких как Nomad
-* С иÑ\81полÑ\8cзованием облаÑ\87ного Ñ\81еÑ\80виÑ\81а, коÑ\82оÑ\80Ñ\8bй бÑ\83деÑ\82 Ñ\83пÑ\80авлÑ\8fÑ\82Ñ\8c Ñ\80азвоÑ\80аÑ\87иванием Ð\92ашего контейнера
+* С иÑ\81полÑ\8cзованием облаÑ\87ного Ñ\81еÑ\80виÑ\81а, коÑ\82оÑ\80Ñ\8bй бÑ\83деÑ\82 Ñ\83пÑ\80авлÑ\8fÑ\82Ñ\8c Ñ\80азвоÑ\80аÑ\87иванием вашего контейнера
## Docker-образ и Poetry
-Ð\95Ñ\81ли Ð\92Ñ\8b полÑ\8cзÑ\83еÑ\82еÑ\81Ñ\8c <a href="https://python-poetry.org/" class="external-link" target="_blank">Poetry</a> длÑ\8f Ñ\83пÑ\80авлениÑ\8f завиÑ\81имоÑ\81Ñ\82Ñ\8fми Ð\92ашего проекта, то можете использовать многоэтапную сборку образа:
+Ð\95Ñ\81ли вÑ\8b полÑ\8cзÑ\83еÑ\82еÑ\81Ñ\8c <a href="https://python-poetry.org/" class="external-link" target="_blank">Poetry</a> длÑ\8f Ñ\83пÑ\80авлениÑ\8f завиÑ\81имоÑ\81Ñ\82Ñ\8fми вашего проекта, то можете использовать многоэтапную сборку образа:
```{ .dockerfile .annotate }
# (1)
**Этапы сборки Docker-образа** являются частью `Dockerfile` и работают как **временные образы контейнеров**. Они нужны только для создания файлов, используемых в дальнейших этапах.
-Ð\9fеÑ\80вÑ\8bй Ñ\8dÑ\82ап бÑ\8bл нÑ\83жен Ñ\82олÑ\8cко длÑ\8f **Ñ\83Ñ\81Ñ\82ановки Poetry** и **Ñ\81озданиÑ\8f Ñ\84айла `requirements.txt`**, в коÑ\82оÑ\80Ñ\8bм пÑ\80опиÑ\81анÑ\8b завиÑ\81имоÑ\81Ñ\82и Ð\92ашего проекта, взятые из файла `pyproject.toml`.
+Ð\9fеÑ\80вÑ\8bй Ñ\8dÑ\82ап бÑ\8bл нÑ\83жен Ñ\82олÑ\8cко длÑ\8f **Ñ\83Ñ\81Ñ\82ановки Poetry** и **Ñ\81озданиÑ\8f Ñ\84айла `requirements.txt`**, в коÑ\82оÑ\80Ñ\8bм пÑ\80опиÑ\81анÑ\8b завиÑ\81имоÑ\81Ñ\82и вашего проекта, взятые из файла `pyproject.toml`.
На **следующем этапе** `pip` будет использовать файл `requirements.txt`.
В итоговом образе будет содержаться **только последний этап сборки**, предыдущие этапы будут отброшены.
-Ð\9fÑ\80и иÑ\81полÑ\8cзовании Poetry, имееÑ\82 Ñ\81мÑ\8bÑ\81л иÑ\81полÑ\8cзоваÑ\82Ñ\8c **многоÑ\8dÑ\82апнÑ\83Ñ\8e Ñ\81боÑ\80кÑ\83 Docker-обÑ\80аза**, поÑ\82омÑ\83 Ñ\87Ñ\82о на Ñ\81амом деле Ð\92ам не нÑ\83жен Poetry и его завиÑ\81имоÑ\81Ñ\82и в оконÑ\87аÑ\82елÑ\8cном обÑ\80азе конÑ\82ейнеÑ\80а, Ð\92ам **нÑ\83жен Ñ\82олÑ\8cко** Ñ\81генеÑ\80иÑ\80ованнÑ\8bй Ñ\84айл `requirements.txt` длÑ\8f Ñ\83Ñ\81Ñ\82ановки завиÑ\81имоÑ\81Ñ\82ей Ð\92ашего проекта.
+Ð\9fÑ\80и иÑ\81полÑ\8cзовании Poetry, имееÑ\82 Ñ\81мÑ\8bÑ\81л иÑ\81полÑ\8cзоваÑ\82Ñ\8c **многоÑ\8dÑ\82апнÑ\83Ñ\8e Ñ\81боÑ\80кÑ\83 Docker-обÑ\80аза**, поÑ\82омÑ\83 Ñ\87Ñ\82о на Ñ\81амом деле вам не нÑ\83жен Poetry и его завиÑ\81имоÑ\81Ñ\82и в оконÑ\87аÑ\82елÑ\8cном обÑ\80азе конÑ\82ейнеÑ\80а, вам **нÑ\83жен Ñ\82олÑ\8cко** Ñ\81генеÑ\80иÑ\80ованнÑ\8bй Ñ\84айл `requirements.txt` длÑ\8f Ñ\83Ñ\81Ñ\82ановки завиÑ\81имоÑ\81Ñ\82ей вашего проекта.
А на последнем этапе, придерживаясь описанных ранее правил, создаётся итоговый образ
### Использование прокси-сервера завершения TLS и Poetry
-И снова повторюсь, если используете прокси-сервер (балансировщик нагрузки), такой, как Nginx или Traefik, добавьте в команду запуска опцию `--proxy-headers`:
+И снова повторюсь, если используете прокси-сервер (балансировщик нагрузки), такой как Nginx или Traefik, добавьте в команду запуска опцию `--proxy-headers`:
```Dockerfile
CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"]
В большинстве случаев Вам, вероятно, не нужно использовать какой-либо базовый образ, **лучше создать образ контейнера с нуля** на основе официального Docker-образа Python.
-Ð\9fозабоÑ\82ивÑ\88иÑ\81Ñ\8c о **поÑ\80Ñ\8fдке напиÑ\81аниÑ\8f** инÑ\81Ñ\82Ñ\80Ñ\83кÑ\86ий в `Dockerfile`, Ð\92Ñ\8b Ñ\81можеÑ\82е иÑ\81полÑ\8cзоваÑ\82Ñ\8c **кÑ\8dÑ\88 Docker'а**, **минимизиÑ\80овав вÑ\80емÑ\8f Ñ\81боÑ\80ки**, макÑ\81ималÑ\8cно повÑ\8bÑ\81ив Ñ\81воÑ\8e пÑ\80оизводиÑ\82елÑ\8cноÑ\81Ñ\82Ñ\8c (и избежаÑ\82Ñ\8c Ñ\81кÑ\83ки). 😎
+Ð\9fозабоÑ\82ивÑ\88иÑ\81Ñ\8c о **поÑ\80Ñ\8fдке напиÑ\81аниÑ\8f** инÑ\81Ñ\82Ñ\80Ñ\83кÑ\86ий в `Dockerfile`, вÑ\8b Ñ\81можеÑ\82е иÑ\81полÑ\8cзоваÑ\82Ñ\8c **кÑ\8dÑ\88 Docker'а**, **минимизиÑ\80овав вÑ\80емÑ\8f Ñ\81боÑ\80ки**, макÑ\81ималÑ\8cно повÑ\8bÑ\81ив Ñ\81воÑ\8e пÑ\80оизводиÑ\82елÑ\8cноÑ\81Ñ\82Ñ\8c (и не заÑ\81кÑ\83Ñ\87аÑ\82Ñ\8c). 😎
В некоторых особых случаях вы можете использовать официальный образ Docker для FastAPI. 🤓
# Об HTTPS
-Обычно представляется, что HTTPS это некая опция, которая либо "включена", либо нет.
+Обычно представляется, что HTTPS это некая опция, которая либо "включена", либо нет.
Но всё несколько сложнее.
!!! tip "Заметка"
- Ð\95Ñ\81ли Ð\92Ñ\8b Ñ\82оÑ\80опиÑ\82еÑ\81Ñ\8c или Ð\92ам не интересно, можете перейти на следующую страницу этого пошагового руководства по размещению приложений на серверах с использованием различных технологий.
+ Ð\95Ñ\81ли вÑ\8b Ñ\82оÑ\80опиÑ\82еÑ\81Ñ\8c или вам не интересно, можете перейти на следующую страницу этого пошагового руководства по размещению приложений на серверах с использованием различных технологий.
Чтобы **изучить основы HTTPS** для клиента, перейдите по ссылке <a href="https://howhttps.works/" class="external-link" target="_blank">https://howhttps.works/</a>.
* **TCP не знает о "доменах"**, но знает об IP-адресах.
* Информация о **запрашиваемом домене** извлекается из запроса **на уровне HTTP**.
* **Сертификаты HTTPS** "сертифицируют" **конкретный домен**, но проверка сертификатов и шифрование данных происходит на уровне протокола TCP, то есть **до того**, как станет известен домен-получатель данных.
-* **Ð\9fо Ñ\83молÑ\87аниÑ\8e** Ñ\8dÑ\82о ознаÑ\87аеÑ\82, Ñ\87Ñ\82о Ñ\83 Ð\92ас может быть **только один сертификат HTTPS на один IP-адрес**.
- * Ð\9dе важно, наÑ\81колÑ\8cко болÑ\8cÑ\88ой Ñ\83 Ð\92ас сервер и насколько маленькие приложения на нём могут быть.
+* **Ð\9fо Ñ\83молÑ\87аниÑ\8e** Ñ\8dÑ\82о ознаÑ\87аеÑ\82, Ñ\87Ñ\82о Ñ\83 вас может быть **только один сертификат HTTPS на один IP-адрес**.
+ * Ð\9dе важно, наÑ\81колÑ\8cко болÑ\8cÑ\88ой Ñ\83 вас сервер и насколько маленькие приложения на нём могут быть.
* Однако, у этой проблемы есть **решение**.
* Существует **расширение** протокола **TLS** (который работает на уровне TCP, то есть до HTTP) называемое **<a href="https://en.wikipedia.org/wiki/Server_Name_Indication" class="external-link" target="_blank"><abbr title="Указание имени сервера">SNI</abbr></a>**.
* Расширение SNI позволяет одному серверу (с **одним IP-адресом**) иметь **несколько сертификатов HTTPS** и обслуживать **множество HTTPS-доменов/приложений**.
* получение **зашифрованных HTTPS-запросов**
* отправка **расшифрованных HTTP запросов** в соответствующее HTTP-приложение, работающее на том же сервере (в нашем случае, это приложение **FastAPI**)
-* получние **HTTP-ответа** от приложения
+* полÑ\83Ñ\87ение **HTTP-оÑ\82веÑ\82а** оÑ\82 пÑ\80иложениÑ\8f
* **шифрование ответа** используя подходящий **сертификат HTTPS**
* отправка зашифрованного **HTTPS-ответа клиенту**.
Такой сервер часто называют **<a href="https://en.wikipedia.org/wiki/TLS_termination_proxy" class="external-link" target="_blank">Прокси-сервер завершения работы TLS</a>** или просто "прокси-сервер".
-Ð\92оÑ\82 некоÑ\82оÑ\80Ñ\8bе ваÑ\80ианÑ\82Ñ\8b, коÑ\82оÑ\80Ñ\8bе Ð\92ы можете использовать в качестве такого прокси-сервера:
+Ð\92оÑ\82 некоÑ\82оÑ\80Ñ\8bе ваÑ\80ианÑ\82Ñ\8b, коÑ\82оÑ\80Ñ\8bе вы можете использовать в качестве такого прокси-сервера:
* Traefik (может обновлять сертификаты)
* Caddy (может обновлять сертификаты)
### Имя домена
-ЧаÑ\89е вÑ\81его, вÑ\81Ñ\91 наÑ\87инаеÑ\82Ñ\81Ñ\8f Ñ\81 **пÑ\80иобÑ\80еÑ\82ениÑ\8f имени домена**. Ð\97аÑ\82ем нÑ\83жно наÑ\81Ñ\82Ñ\80оиÑ\82Ñ\8c DNS-Ñ\81еÑ\80веÑ\80 (веÑ\80оÑ\8fÑ\82но Ñ\83 Ñ\82ого же пÑ\80овайдеÑ\80а, коÑ\82оÑ\80Ñ\8bй вÑ\8bдал Ð\92ам домен).
+ЧаÑ\89е вÑ\81его, вÑ\81Ñ\91 наÑ\87инаеÑ\82Ñ\81Ñ\8f Ñ\81 **пÑ\80иобÑ\80еÑ\82ениÑ\8f имени домена**. Ð\97аÑ\82ем нÑ\83жно наÑ\81Ñ\82Ñ\80оиÑ\82Ñ\8c DNS-Ñ\81еÑ\80веÑ\80 (веÑ\80оÑ\8fÑ\82но Ñ\83 Ñ\82ого же пÑ\80овайдеÑ\80а, коÑ\82оÑ\80Ñ\8bй вÑ\8bдал вам домен).
-Ð\94алее, возможно, Ð\92ы получаете "облачный" сервер (виртуальную машину) или что-то типа этого, у которого есть <abbr title="Не изменяемый">постоянный</abbr> **публичный IP-адрес**.
+Ð\94алее, возможно, вы получаете "облачный" сервер (виртуальную машину) или что-то типа этого, у которого есть <abbr title="Не изменяемый">постоянный</abbr> **публичный IP-адрес**.
-Ð\9dа DNS-Ñ\81еÑ\80веÑ\80е (Ñ\81еÑ\80веÑ\80аÑ\85) Ð\92ам Ñ\81ледÑ\83еÑ\82 наÑ\81Ñ\82Ñ\80оиÑ\82Ñ\8c Ñ\81ооÑ\82веÑ\82Ñ\81Ñ\82вÑ\83Ñ\8eÑ\89Ñ\83Ñ\8e Ñ\80еÑ\81Ñ\83Ñ\80Ñ\81нÑ\83Ñ\8e запиÑ\81Ñ\8c ("`запиÑ\81Ñ\8c A`"), Ñ\83казав, Ñ\87Ñ\82о **Ð\92аÑ\88 домен** Ñ\81вÑ\8fзан Ñ\81 пÑ\83блиÑ\87нÑ\8bм **IP-адÑ\80еÑ\81ом Ð\92ашего сервера**.
+Ð\9dа DNS-Ñ\81еÑ\80веÑ\80е (Ñ\81еÑ\80веÑ\80аÑ\85) вам Ñ\81ледÑ\83еÑ\82 наÑ\81Ñ\82Ñ\80оиÑ\82Ñ\8c Ñ\81ооÑ\82веÑ\82Ñ\81Ñ\82вÑ\83Ñ\8eÑ\89Ñ\83Ñ\8e Ñ\80еÑ\81Ñ\83Ñ\80Ñ\81нÑ\83Ñ\8e запиÑ\81Ñ\8c ("`запиÑ\81Ñ\8c A`"), Ñ\83казав, Ñ\87Ñ\82о **Ð\92аÑ\88 домен** Ñ\81вÑ\8fзан Ñ\81 пÑ\83блиÑ\87нÑ\8bм **IP-адÑ\80еÑ\81ом вашего сервера**.
Обычно эту запись достаточно указать один раз, при первоначальной настройке всего сервера.
Теперь давайте сфокусируемся на работе с HTTPS.
-Всё начинается с того, что браузер спрашивает у **DNS-серверов**, какой **IP-адрес связан с доменом**, для примера возьмём домен `someapp.example.com`.
+Всё начинается с того, что браузер спрашивает у **DNS-серверов**, какой **IP-адрес связан с доменом**, для примера возьмём домен `someapp.example.com`.
-DNS-Ñ\81еÑ\80веÑ\80а пÑ\80иÑ\81Ñ\8bлаÑ\8eÑ\82 бÑ\80аÑ\83зеÑ\80Ñ\83 опÑ\80еделÑ\91ннÑ\8bй **IP-адÑ\80еÑ\81**, Ñ\82оÑ\82 Ñ\81амÑ\8bй пÑ\83блиÑ\87нÑ\8bй IP-адÑ\80еÑ\81 Ð\92аÑ\88его Ñ\81еÑ\80веÑ\80а, коÑ\82оÑ\80Ñ\8bй Ð\92ы указали в ресурсной "записи А" при настройке.
+DNS-Ñ\81еÑ\80веÑ\80а пÑ\80иÑ\81Ñ\8bлаÑ\8eÑ\82 бÑ\80аÑ\83зеÑ\80Ñ\83 опÑ\80еделÑ\91ннÑ\8bй **IP-адÑ\80еÑ\81**, Ñ\82оÑ\82 Ñ\81амÑ\8bй пÑ\83блиÑ\87нÑ\8bй IP-адÑ\80еÑ\81 ваÑ\88его Ñ\81еÑ\80веÑ\80а, коÑ\82оÑ\80Ñ\8bй вы указали в ресурсной "записи А" при настройке.
<img src="/img/deployment/https/https01.svg">
<img src="/img/deployment/https/https02.svg">
-Эта часть клиент-серверного взаимодействия устанавливает TLS-соединение и называется **TLS-рукопожатием**.
+Эта часть клиент-серверного взаимодействия устанавливает TLS-соединение и называется **TLS-рукопожатием**.
### TLS с расширением SNI
* **Запуск в качестве программы-сервера** (как минимум, на время обновления сертификатов) на публичном IP-адресе домена.
* Как уже не раз упоминалось, только один процесс может прослушивать определённый порт определённого IP-адреса.
* Это одна из причин использования прокси-сервера ещё и в качестве программы обновления сертификатов.
- * Ð\92 Ñ\81лÑ\83Ñ\87ае, еÑ\81ли обновлением Ñ\81еÑ\80Ñ\82иÑ\84икаÑ\82ов занимаеÑ\82Ñ\81Ñ\8f дÑ\80Ñ\83гаÑ\8f пÑ\80огÑ\80амма, Ð\92ам понадобится остановить прокси-сервер, запустить программу обновления сертификатов на сокете, предназначенном для прокси-сервера, настроить прокси-сервер на работу с новыми сертификатами и перезапустить его. Эта схема далека от идеальной, так как Ваши приложения будут недоступны на время отключения прокси-сервера.
+ * Ð\92 Ñ\81лÑ\83Ñ\87ае, еÑ\81ли обновлением Ñ\81еÑ\80Ñ\82иÑ\84икаÑ\82ов занимаеÑ\82Ñ\81Ñ\8f дÑ\80Ñ\83гаÑ\8f пÑ\80огÑ\80амма, вам понадобится остановить прокси-сервер, запустить программу обновления сертификатов на сокете, предназначенном для прокси-сервера, настроить прокси-сервер на работу с новыми сертификатами и перезапустить его. Эта схема далека от идеальной, так как Ваши приложения будут недоступны на время отключения прокси-сервера.
Весь этот процесс обновления, одновременный с обслуживанием запросов, является одной из основных причин, по которой желательно иметь **отдельную систему для работы с HTTPS** в виде прокси-сервера завершения TLS, а не просто использовать сертификаты TLS непосредственно с сервером приложений (например, Uvicorn).
Наличие **HTTPS** очень важно и довольно **критично** в большинстве случаев. Однако, Вам, как разработчику, не нужно тратить много сил на это, достаточно **понимать эти концепции** и принципы их работы.
-Ð\9dо Ñ\83знав базовÑ\8bе оÑ\81новÑ\8b **HTTPS** Ð\92Ñ\8b можеÑ\82е легко Ñ\81овмеÑ\89аÑ\82Ñ\8c Ñ\80азнÑ\8bе инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82Ñ\8b, коÑ\82оÑ\80Ñ\8bе помогÑ\83Ñ\82 Ð\92ам в дальнейшей разработке.
+Ð\9dо Ñ\83знав базовÑ\8bе оÑ\81новÑ\8b **HTTPS** вÑ\8b можеÑ\82е легко Ñ\81овмеÑ\89аÑ\82Ñ\8c Ñ\80азнÑ\8bе инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82Ñ\8b, коÑ\82оÑ\80Ñ\8bе помогÑ\83Ñ\82 вам в дальнейшей разработке.
-Ð\92 Ñ\81ледÑ\83Ñ\8eÑ\89иÑ\85 главаÑ\85 Ñ\8f покажÑ\83 Ð\92ам несколько примеров, как настраивать **HTTPS** для приложений **FastAPI**. 🔒
+Ð\92 Ñ\81ледÑ\83Ñ\8eÑ\89иÑ\85 главаÑ\85 Ñ\8f покажÑ\83 вам несколько примеров, как настраивать **HTTPS** для приложений **FastAPI**. 🔒
Обычно **веб-приложения** размещают на удалённом компьютере с серверной программой, которая обеспечивает хорошую производительность, стабильность и т. д., Чтобы ваши пользователи могли эффективно, беспрерывно и беспроблемно обращаться к приложению.
-Это отличется от **разработки**, когда вы постоянно меняете код, делаете в нём намеренные ошибки и исправляете их, останавливаете и перезапускаете сервер разработки и т. д.
+ÐÑ\82о оÑ\82лиÑ\87аеÑ\82Ñ\81Ñ\8f оÑ\82 **Ñ\80азÑ\80абоÑ\82ки**, когда вÑ\8b поÑ\81Ñ\82оÑ\8fнно менÑ\8fеÑ\82е код, делаеÑ\82е в нÑ\91м намеÑ\80еннÑ\8bе оÑ\88ибки и иÑ\81пÑ\80авлÑ\8fеÑ\82е иÑ\85, оÑ\81Ñ\82анавливаеÑ\82е и пеÑ\80езапÑ\83Ñ\81каеÑ\82е Ñ\81еÑ\80веÑ\80 Ñ\80азÑ\80абоÑ\82ки и Ñ\82. д.
## Стратегии развёртывания
# Запуск сервера вручную - Uvicorn
-Ð\94лÑ\8f запÑ\83Ñ\81ка пÑ\80иложениÑ\8f **FastAPI** на Ñ\83далÑ\91нной Ñ\81еÑ\80веÑ\80ной маÑ\88ине Ð\92ам необходим программный сервер, поддерживающий протокол ASGI, такой как **Uvicorn**.
+Ð\94лÑ\8f запÑ\83Ñ\81ка пÑ\80иложениÑ\8f **FastAPI** на Ñ\83далÑ\91нной Ñ\81еÑ\80веÑ\80ной маÑ\88ине вам необходим программный сервер, поддерживающий протокол ASGI, такой как **Uvicorn**.
Существует три наиболее распространённые альтернативы:
## Сервер как машина и сервер как программа
-Ð\92 Ñ\8dÑ\82иÑ\85 Ñ\82еÑ\80минаÑ\85 еÑ\81Ñ\82Ñ\8c некоÑ\82оÑ\80Ñ\8bе Ñ\80азлиÑ\87иÑ\8f и Ð\92ам следует запомнить их. 💡
+Ð\92 Ñ\8dÑ\82иÑ\85 Ñ\82еÑ\80минаÑ\85 еÑ\81Ñ\82Ñ\8c некоÑ\82оÑ\80Ñ\8bе Ñ\80азлиÑ\87иÑ\8f и вам следует запомнить их. 💡
Слово "**сервер**" чаще всего используется в двух контекстах:
- удалённый или расположенный в "облаке" компьютер (физическая или виртуальная машина).
- программа, запущенная на таком компьютере (например, Uvicorn).
-Ð\9fÑ\80оÑ\81Ñ\82о запомниÑ\82е, еÑ\81ли Ð\92ам встретился термин "сервер", то обычно он подразумевает что-то из этих двух смыслов.
+Ð\9fÑ\80оÑ\81Ñ\82о запомниÑ\82е, еÑ\81ли вам встретился термин "сервер", то обычно он подразумевает что-то из этих двух смыслов.
-Ð\9aогда имеÑ\8eÑ\82 в видÑ\83 именно Ñ\83далÑ\91ннÑ\8bй компÑ\8cÑ\8eÑ\82еÑ\80, Ñ\87аÑ\81Ñ\82о говоÑ\80Ñ\8fÑ\82 пÑ\80оÑ\81Ñ\82о **Ñ\81еÑ\80веÑ\80**, но еÑ\89Ñ\91 его назÑ\8bваÑ\8eÑ\82 **маÑ\88ина**, **Ð\92Ð\9c** (виÑ\80Ñ\82Ñ\83алÑ\8cнаÑ\8f маÑ\88ина), **нода**. Ð\92Ñ\81е Ñ\8dÑ\82и Ñ\82еÑ\80минÑ\8b обознаÑ\87аÑ\8eÑ\82 одно и Ñ\82о же - Ñ\83далÑ\91ннÑ\8bй компÑ\8cÑ\8eÑ\82еÑ\80, обÑ\8bÑ\87но под Ñ\83пÑ\80авлением Linux, на коÑ\82оÑ\80ом Ð\92ы запускаете программы.
+Ð\9aогда имеÑ\8eÑ\82 в видÑ\83 именно Ñ\83далÑ\91ннÑ\8bй компÑ\8cÑ\8eÑ\82еÑ\80, Ñ\87аÑ\81Ñ\82о говоÑ\80Ñ\8fÑ\82 пÑ\80оÑ\81Ñ\82о **Ñ\81еÑ\80веÑ\80**, но еÑ\89Ñ\91 его назÑ\8bваÑ\8eÑ\82 **маÑ\88ина**, **Ð\92Ð\9c** (виÑ\80Ñ\82Ñ\83алÑ\8cнаÑ\8f маÑ\88ина), **нода**. Ð\92Ñ\81е Ñ\8dÑ\82и Ñ\82еÑ\80минÑ\8b обознаÑ\87аÑ\8eÑ\82 одно и Ñ\82о же - Ñ\83далÑ\91ннÑ\8bй компÑ\8cÑ\8eÑ\82еÑ\80, обÑ\8bÑ\87но под Ñ\83пÑ\80авлением Linux, на коÑ\82оÑ\80ом вы запускаете программы.
## Установка программного сервера
=== "Uvicorn"
- * <a href="https://www.uvicorn.org/" class="external-link" target="_blank">Uvicorn</a>, молниеÑ\81ный ASGI сервер, основанный на библиотеках uvloop и httptools.
+ * <a href="https://www.uvicorn.org/" class="external-link" target="_blank">Uvicorn</a>, оÑ\87енÑ\8c бÑ\8bÑ\81Ñ\82Ñ\80ый ASGI сервер, основанный на библиотеках uvloop и httptools.
<div class="termy">
</div>
!!! tip "Подсказка"
- С опÑ\86ией `standard`, Uvicorn бÑ\83деÑ\82 Ñ\83Ñ\81Ñ\82ановливаться и использоваться с некоторыми дополнительными рекомендованными зависимостями.
+ С опÑ\86ией `standard`, Uvicorn бÑ\83деÑ\82 Ñ\83Ñ\81Ñ\82анавливаться и использоваться с некоторыми дополнительными рекомендованными зависимостями.
В них входит `uvloop`, высокопроизводительная замена `asyncio`, которая значительно ускоряет работу асинхронных программ.
## Запуск серверной программы
-Ð\97аÑ\82ем запÑ\83Ñ\81Ñ\82иÑ\82е Ð\92аше приложение так же, как было указано в руководстве ранее, но без опции `--reload`:
+Ð\97аÑ\82ем запÑ\83Ñ\81Ñ\82иÑ\82е ваше приложение так же, как было указано в руководстве ранее, но без опции `--reload`:
=== "Uvicorn"
Тем не менее Uvicorn совместим только с asyncio и обычно используется совместно с <a href="https://github.com/MagicStack/uvloop" class="external-link" target="_blank">`uvloop`</a>, высокопроизводительной заменой `asyncio`.
-Ð\9dо еÑ\81ли Ð\92ы хотите использовать **Trio** напрямую, то можете воспользоваться **Hypercorn**, так как они совместимы. ✨
+Ð\9dо еÑ\81ли вы хотите использовать **Trio** напрямую, то можете воспользоваться **Hypercorn**, так как они совместимы. ✨
### Установка Hypercorn с Trio
-Ð\94лÑ\8f наÑ\87ала, Ð\92ам нужно установить Hypercorn с поддержкой Trio:
+Ð\94лÑ\8f наÑ\87ала, вам нужно установить Hypercorn с поддержкой Trio:
<div class="termy">
</div>
-Hypercorn, в Ñ\81воÑ\8e оÑ\87еÑ\80едÑ\8c, запÑ\83Ñ\81Ñ\82иÑ\82 Ð\92аше приложение использующее Trio.
+Hypercorn, в Ñ\81воÑ\8e оÑ\87еÑ\80едÑ\8c, запÑ\83Ñ\81Ñ\82иÑ\82 ваше приложение использующее Trio.
-Таким обÑ\80азом, Ð\92ы сможете использовать Trio в своём приложении. Но лучше использовать AnyIO, для сохранения совместимости и с Trio, и с asyncio. 🎉
+Таким обÑ\80азом, вы сможете использовать Trio в своём приложении. Но лучше использовать AnyIO, для сохранения совместимости и с Trio, и с asyncio. 🎉
## Концепции развёртывания
В вышеприведённых примерах серверные программы (например Uvicorn) запускали только **один процесс**, принимающий входящие запросы с любого IP (на это указывал аргумент `0.0.0.0`) на определённый порт (в примерах мы указывали порт `80`).
-ÐÑ\82о оÑ\81новнаÑ\8f идеÑ\8f. Ð\9dо возможно, Ð\92ы озаботитесь добавлением дополнительных возможностей, таких как:
+ÐÑ\82о оÑ\81новнаÑ\8f идеÑ\8f. Ð\9dо возможно, вы озаботитесь добавлением дополнительных возможностей, таких как:
* Использование более безопасного протокола HTTPS
* Настройки запуска приложения
* Управление памятью
* Использование перечисленных функций перед запуском приложения.
-Я поведаю Вам больше о каждой из этих концепций в следующих главах, с конкретными примерами стратегий работы с ними. 🚀
+Я расскажу вам больше о каждой из этих концепций в следующих главах, с конкретными примерами стратегий работы с ними. 🚀