From: Vladislav Kramorenko <85196001+Xewus@users.noreply.github.com>
Date: Thu, 10 Aug 2023 15:53:26 +0000 (+0300)
Subject: 🌐 Add Russian translation for `docs/ru/docs/deployment/docker.md` (#9971)
X-Git-Tag: 0.101.1~15
X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fe3eaf63e643ba178c7266aeb78a7751b8ca4171;p=thirdparty%2Ffastapi%2Ffastapi.git
🌐 Add Russian translation for `docs/ru/docs/deployment/docker.md` (#9971)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Yois4101 <119609381+Yois4101@users.noreply.github.com>
---
diff --git a/docs/ru/docs/deployment/docker.md b/docs/ru/docs/deployment/docker.md
new file mode 100644
index 0000000000..f045ca9448
--- /dev/null
+++ b/docs/ru/docs/deployment/docker.md
@@ -0,0 +1,700 @@
+# FastAPI и Docker-конÑейнеÑÑ
+
+ÐÑи ÑазвÑÑÑÑвании пÑиложений FastAPI, ÑаÑÑо наÑинаÑÑ Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ **обÑаза конÑейнеÑа на оÑнове Linux**. ÐбÑÑно Ð´Ð»Ñ ÑÑого иÑполÑзÑÑÑ **Docker**. ÐаÑем можно ÑазвеÑнÑÑÑ Ñакой конÑÐµÐ¹Ð½ÐµÑ Ð½Ð° ÑеÑвеÑе одним из неÑколÑкиÑ
ÑпоÑобов.
+
+ÐÑполÑзование конÑейнеÑов на оÑнове Linux Ð¸Ð¼ÐµÐµÑ ÑÑд пÑеимÑÑеÑÑв, вклÑÑÐ°Ñ **безопаÑноÑÑÑ**, **воÑпÑоизводимоÑÑÑ**, **пÑоÑÑоÑÑ** и пÑоÑие.
+
+!!! tip "ÐодÑказка"
+ ТоÑопиÑеÑÑ Ð¸Ð»Ð¸ Ñже Ð·Ð½Ð°ÐºÐ¾Ð¼Ñ Ñ ÑÑой ÑеÑ
нологией? ÐеÑепÑÑгниÑе на Ñаздел [СоздаÑÑ Docker-обÑаз Ð´Ð»Ñ FastAPI ð](#docker-fastapi)
+
+
+РазвеÑнÑÑÑ Dockerfile ð
+
+```Dockerfile
+FROM python:3.9
+
+WORKDIR /code
+
+COPY ./requirements.txt /code/requirements.txt
+
+RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
+
+COPY ./app /code/app
+
+CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
+
+# ÐÑли иÑполÑзÑеÑе пÑокÑи-ÑеÑвеÑ, Ñакой как Nginx или Traefik, добавÑÑе --proxy-headers
+# CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80", "--proxy-headers"]
+```
+
+
+
+## ЧÑо Ñакое "конÑейнеÑ"
+
+ÐонÑейнеÑизаÑÐ¸Ñ - ÑÑо **легковеÑнÑй** ÑпоÑоб ÑпаковаÑÑ Ð¿Ñиложение, вклÑÑÐ°Ñ Ð²Ñе его завиÑимоÑÑи и необÑ
одимÑе ÑайлÑ, ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð¾Ð»Ð¸ÑоваÑÑ ÐµÐ³Ð¾ Ð¾Ñ Ð´ÑÑгиÑ
конÑейнеÑов (дÑÑгиÑ
пÑиложений и компоненÑов) ÑабоÑаÑÑиÑ
на ÑÑой же ÑиÑÑеме.
+
+ÐонÑейнеÑÑ, оÑнованнÑе на Linux, запÑÑкаÑÑÑÑ Ð¸ÑполÑзÑÑ ÑдÑо Linux Ñ
оÑÑа (маÑинÑ, виÑÑÑалÑной маÑинÑ, облаÑного ÑеÑвеÑа и Ñ.п.). ÐÑо знаÑиÑ, ÑÑо они оÑÐµÐ½Ñ Ð»ÐµÐ³ÐºÐ¾Ð²ÐµÑнÑе (по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑеннÑми виÑÑÑалÑнÑми маÑинами, полноÑÑÑÑ ÑмÑлиÑÑÑÑими ÑабоÑÑ Ð¾Ð¿ÐµÑаÑионной ÑиÑÑемÑ).
+
+ÐлагодаÑÑ ÑÑомÑ, конÑейнеÑÑ Ð¿Ð¾ÑÑеблÑÑÑ **малое колиÑеÑÑво ÑеÑÑÑÑов**, ÑÑавнимое Ñ Ð¿ÑоÑеÑÑом запÑÑеннÑм напÑÑмÑÑ (виÑÑÑалÑÐ½Ð°Ñ Ð¼Ð°Ñина поÑÑебÑÐµÑ Ð³Ð¾Ñаздо болÑÑе ÑеÑÑÑÑов).
+
+ÐонÑейнеÑÑ Ñакже имеÑÑ ÑобÑÑвеннÑе запÑÑеннÑе **изолиÑованнÑе** пÑоÑеÑÑÑ (но ÑаÑÑо ÑолÑко один пÑоÑеÑÑ), ÑайловÑÑ ÑиÑÑÐµÐ¼Ñ Ð¸ ÑеÑÑ, ÑÑо ÑпÑоÑÐ°ÐµÑ ÑазвÑÑÑÑвание, ÑазÑабоÑкÑ, ÑпÑавление доÑÑÑпом и Ñ.п.
+
+## ЧÑо Ñакое "обÑаз конÑейнеÑа"
+
+ÐÐ»Ñ Ð·Ð°Ð¿ÑÑка **конÑейнеÑа** нÑжен **обÑаз конÑейнеÑа**.
+
+ÐбÑаз конÑейнеÑа - ÑÑо **замоÑоженнаÑ** веÑÑÐ¸Ñ Ð²ÑеÑ
Ñайлов, пеÑеменнÑÑ
окÑÑжениÑ, пÑогÑамм и команд по ÑмолÑаниÑ, необÑ
одимÑÑ
Ð´Ð»Ñ ÑабоÑÑ Ð¿ÑиложениÑ. **ÐамоÑоженнÑй** - ознаÑаеÑ, ÑÑо **обÑаз** не запÑÑен и не вÑполнÑеÑÑÑ, ÑÑо вÑего лиÑÑ ÑпакованнÑе вмеÑÑе ÑÐ°Ð¹Ð»Ñ Ð¸ меÑаданнÑе.
+
+РоÑлиÑие Ð¾Ñ **обÑаза конÑейнеÑа**, Ñ
ÑанÑÑего неизменное ÑодеÑжимое, под ÑеÑмином **конÑейнеÑ** подÑазÑмеваÑÑ Ð·Ð°Ð¿ÑÑеннÑй обÑаз, Ñо еÑÑÑ Ð¾Ð±ÑÑкÑ, коÑоÑÑй **иÑполнÑеÑÑÑ**.
+
+Ðогда **конÑейнеÑ** запÑÑен (на оÑновании **обÑаза**), он Ð¼Ð¾Ð¶ÐµÑ ÑоздаваÑÑ Ð¸ изменÑÑÑ ÑайлÑ, пеÑеменнÑе окÑÑÐ¶ÐµÐ½Ð¸Ñ Ð¸ Ñ.д. ÐÑи Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±ÑдÑÑ ÑÑÑеÑÑвоваÑÑ ÑолÑко внÑÑÑи конÑейнеÑа, но не бÑдÑÑ ÑоÑ
ÑанÑÑÑÑÑ Ð² обÑазе конÑейнеÑа (не бÑдÑÑ ÑоÑ
ÑÐ°Ð½ÐµÐ½Ñ Ð½Ð° диÑк).
+
+ÐбÑаз конÑейнеÑа можно ÑÑавниÑÑ Ñ Ñайлом, ÑодеÑжаÑем **пÑогÑаммÑ**, напÑимеÑ, как Ñайл `main.py`.
+
+Ð **конÑейнеÑ** (в оÑлиÑие Ð¾Ñ **обÑаза**) - ÑÑо на Ñамом деле вÑполнÑемÑй ÑкземплÑÑ Ð¾Ð±Ñаза, пÑимеÑно как **пÑоÑеÑÑ**. Ðо ÑакÑÑ, конÑÐµÐ¹Ð½ÐµÑ Ð·Ð°Ð¿ÑÑен ÑолÑко когда запÑÑÐµÐ½Ñ ÐµÐ³Ð¾ пÑоÑеÑÑÑ (ÑаÑе, вÑего один пÑоÑеÑÑ) и оÑÑановлен, когда запÑÑеннÑÑ
пÑоÑеÑÑов неÑ.
+
+## ÐбÑÐ°Ð·Ñ ÐºÐ¾Ð½ÑейнеÑов
+
+Docker ÑвлÑеÑÑÑ Ð¾Ð´Ð½Ð¸Ð¼ оз оÑновнÑÑ
инÑÑÑÑменÑов Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ **обÑазов** и **конÑейнеÑов** и ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð¼Ð¸.
+
+СÑÑеÑÑвÑÐµÑ Ð¾Ð±ÑедоÑÑÑпнÑй Docker Hub Ñ Ð¿Ð¾Ð´Ð³Ð¾ÑовленнÑми **оÑиÑиалÑнÑми обÑазами** многиÑ
инÑÑÑÑменÑов, окÑÑжений, баз даннÑÑ
и пÑиложений.
+
+РпÑимеÑÑ, еÑÑÑ Ð¾ÑиÑиалÑнÑй обÑаз Python.
+
+Также Ñам пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð¸ дÑÑгие полезнÑе обÑазÑ, Ñакие как Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
:
+
+* PostgreSQL
+* MySQL
+* MongoDB
+* Redis
+
+и Ñ.п.
+
+ÐÑполÑзование подгоÑовленнÑÑ
обÑазов знаÑиÑелÑно ÑпÑоÑÐ°ÐµÑ **комбиниÑование** и иÑполÑзование ÑазнÑÑ
инÑÑÑÑменÑов. ÐапÑимеÑ, ÐÑ Ð¼Ð¾Ð¶ÐµÑе попÑÑаÑÑÑÑ Ð¸ÑполÑзоваÑÑ Ð½Ð¾Ð²ÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
. РболÑÑинÑÑве ÑлÑÑаев можно иÑполÑзоваÑÑ **оÑиÑиалÑнÑй обÑаз** и вÑего лиÑÑ ÑказаÑÑ Ð¿ÐµÑеменнÑе окÑÑжениÑ.
+
+Таким обÑазом, ÐÑ Ð¼Ð¾Ð¶ÐµÑе изÑÑиÑÑ, ÑÑо Ñакое конÑейнеÑизаÑÐ¸Ñ Ð¸ Docker, и иÑполÑзоваÑÑ Ð¿Ð¾Ð»ÑÑеннÑе Ð·Ð½Ð°Ð½Ð¸Ñ Ñ ÑазнÑми инÑÑÑÑменÑами и компоненÑами.
+
+Так, ÐÑ Ð¼Ð¾Ð¶ÐµÑе запÑÑÑиÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно **множеÑÑво конÑейнеÑов** Ñ Ð±Ð°Ð·Ð¾Ð¹ даннÑÑ
, Python-пÑиложением, веб-ÑеÑвеÑом, React-пÑиложением и ÑоединиÑÑ Ð¸Ñ
вмеÑÑе ÑеÑез внÑÑÑеннÑÑ ÑеÑÑ.
+
+ÐÑе ÑиÑÑÐµÐ¼Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑейнеÑами (Ñакие, как Docker или Kubernetes) имеÑÑ Ð²ÑÑÑоеннÑе возможноÑÑи Ð´Ð»Ñ Ð¾ÑганизаÑии Ñакого ÑеÑевого взаимодейÑÑвиÑ.
+
+## ÐонÑейнеÑÑ Ð¸ пÑоÑеÑÑÑ
+
+ÐбÑÑно **обÑаз конÑейнеÑа** ÑодеÑÐ¶Ð¸Ñ Ð¼ÐµÑаданнÑе пÑедÑÑÑановленной пÑогÑÐ°Ð¼Ð¼Ñ Ð¸Ð»Ð¸ командÑ, коÑоÑÑÑ ÑледÑÐµÑ Ð²ÑполниÑÑ Ð¿Ñи запÑÑке **конÑейнеÑа**. Также он Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð¿Ð°ÑамеÑÑÑ, пеÑедаваемÑе пÑедÑÑÑановленной пÑогÑамме. ÐоÑ
оже на Ñо, как еÑли Ð±Ñ ÐÑ Ð·Ð°Ð¿ÑÑкали ÑакÑÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ ÑеÑез ÑеÑминал.
+
+Ðогда **конÑейнеÑ** запÑÑен, он бÑÐ´ÐµÑ Ð²ÑполнÑÑÑ Ð¿ÑопиÑаннÑе в нÑм ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¸ пÑогÑаммÑ. Ðо ÐÑ Ð¼Ð¾Ð¶ÐµÑе измениÑÑ ÐµÐ³Ð¾ Ñак, ÑÑоб он вÑполнÑл дÑÑгие ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¸ пÑогÑаммÑ.
+
+ÐонÑÐµÐ¹Ð½ÐµÑ Ð±Ñде ÑабоÑаÑÑ Ð´Ð¾ ÑеÑ
поÑ, пока вÑполнÑеÑÑÑ ÐµÐ³Ð¾ **главнÑй пÑоÑеÑÑ** (команда или пÑогÑамма).
+
+РконÑейнеÑе обÑÑно вÑполнÑеÑÑÑ **ÑолÑко один пÑоÑеÑÑ**, но Ð¾Ñ ÐµÐ³Ð¾ имени можно запÑÑÑиÑÑ Ð´ÑÑгие пÑоÑеÑÑÑ, Ñогда в ÑÑом же в конÑейнеÑе бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ **множеÑÑво пÑоÑеÑÑов**.
+
+ÐонÑÐµÐ¹Ð½ÐµÑ Ð½Ðµ ÑÑиÑаеÑÑÑ Ð·Ð°Ð¿ÑÑеннÑм, еÑли в нÑм **не вÑполнÑеÑÑÑ Ñ
оÑÑ Ð±Ñ Ð¾Ð´Ð¸Ð½ пÑоÑеÑÑ**. ÐÑли главнÑй пÑоÑеÑÑ Ð¾ÑÑановлен, знаÑÐ¸Ñ Ð¸ конÑÐµÐ¹Ð½ÐµÑ Ð¾ÑÑановлен.
+
+## СоздаÑÑ Docker-обÑаз Ð´Ð»Ñ FastAPI
+
+ЧÑо ж, давайÑе ÑÐ¶Ñ Ñоздадим ÑÑо-нибÑдÑ! ð
+
+Я Ð¿Ð¾ÐºÐ°Ð¶Ñ Ðам, как ÑобиÑаÑÑ **Docker-обÑаз** Ð´Ð»Ñ FastAPI **Ñ Ð½ÑлÑ**, оÑновÑваÑÑÑ Ð½Ð° **оÑиÑиалÑном обÑазе Python**.
+
+Такой подÑ
од ÑгодиÑÑÑ Ð´Ð»Ñ **болÑÑинÑÑва ÑлÑÑаев**, напÑимеÑ:
+
+* ÐÑполÑзование Ñ **Kubernetes** или аналогиÑнÑм инÑÑÑÑменÑом
+* ÐапÑÑк в **Raspberry Pi**
+* ÐÑполÑзование в облаÑнÑÑ
ÑеÑвиÑаÑ
, запÑÑкаÑÑиÑ
обÑÐ°Ð·Ñ ÐºÐ¾Ð½ÑейнеÑов Ð´Ð»Ñ ÐÐ°Ñ Ð¸ Ñ.п.
+
+### УÑÑановиÑÑ Ð·Ð°Ð²Ð¸ÑимоÑÑи
+
+ÐбÑÑно ÐаÑÐµÐ¼Ñ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ
Ð¾Ð´Ð¸Ð¼Ñ **дополниÑелÑнÑе библиоÑеки**, ÑпиÑок коÑоÑÑÑ
наÑ
одиÑÑÑ Ð² оÑделÑном Ñайле.
+
+Ðа название и ÑодеÑжание Ñакого Ñайла влиÑÐµÑ Ð²ÑбÑаннÑй Ðами инÑÑÑÑÐ¼ÐµÐ½Ñ **ÑÑÑановки** ÑÑиÑ
библиоÑек (завиÑимоÑÑей).
+
+ЧаÑе вÑего ÑÑо пÑоÑÑой Ñайл `requirements.txt` Ñ Ð¿Ð¾ÑÑÑоÑнÑм пеÑеÑиÑлением библиоÑек и иÑ
веÑÑий.
+
+ÐÑи ÑÑом ÐÑ, Ð´Ð»Ñ Ð²ÑбоÑа веÑÑий, бÑдеÑе иÑполÑзоваÑÑ Ñе же идеи, ÑÑо ÑпомÑнÑÑÑ Ð½Ð° ÑÑÑаниÑе [РвеÑÑиÑÑ
FastAPI](./versions.md){.internal-link target=_blank}.
+
+ÐÐ°Ñ Ñайл `requirements.txt` Ð¼Ð¾Ð¶ÐµÑ Ð²ÑглÑдеÑÑ ÐºÐ°Ðº-Ñо Ñак:
+
+```
+fastapi>=0.68.0,<0.69.0
+pydantic>=1.8.0,<2.0.0
+uvicorn>=0.15.0,<0.16.0
+```
+
+УÑÑанавливаÑÑ Ð·Ð°Ð²Ð¸ÑимоÑÑи пÑоÑе вÑего Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ `pip`:
+
+
+
+```console
+$ pip install -r requirements.txt
+---> 100%
+Successfully installed fastapi pydantic uvicorn
+```
+
+
+
+!!! info "ÐнÑоÑмаÑиÑ"
+ СÑÑеÑÑвÑÑÑ Ð¸ дÑÑгие инÑÑÑÑменÑÑ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑÑми.
+
+ Ð ÑÑом же Ñазделе, но позже, Ñ Ð¿Ð¾ÐºÐ°Ð¶Ñ Ðам пÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Poetry. ð
+
+### СоздаÑÑ Ð¿Ñиложение **FastAPI**
+
+* СоздайÑе диÑекÑоÑÐ¸Ñ `app` и пеÑейдиÑе в неÑ.
+* СоздайÑе пÑÑÑой Ñайл `__init__.py`.
+* СоздайÑе Ñайл `main.py` и заполниÑе его:
+
+```Python
+from typing import Union
+
+from fastapi import FastAPI
+
+app = FastAPI()
+
+
+@app.get("/")
+def read_root():
+ return {"Hello": "World"}
+
+
+@app.get("/items/{item_id}")
+def read_item(item_id: int, q: Union[str, None] = None):
+ return {"item_id": item_id, "q": q}
+```
+
+### Dockerfile
+
+Ð ÑÑой же диÑекÑоÑии ÑоздайÑе Ñайл `Dockerfile` и заполниÑе его:
+
+```{ .dockerfile .annotate }
+# (1)
+FROM python:3.9
+
+# (2)
+WORKDIR /code
+
+# (3)
+COPY ./requirements.txt /code/requirements.txt
+
+# (4)
+RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
+
+# (5)
+COPY ./app /code/app
+
+# (6)
+CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
+```
+
+1. ÐаÑниÑе Ñ Ð¾ÑиÑиалÑного обÑаза Python, коÑоÑÑй бÑÐ´ÐµÑ Ð¾Ñновой Ð´Ð»Ñ Ð¾Ð±Ñаза пÑиложениÑ.
+
+2. УкажиÑе, ÑÑо в далÑнейÑем ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð·Ð°Ð¿ÑÑкаемÑе в конÑейнеÑе, бÑдÑÑ Ð²ÑполнÑÑÑÑÑ Ð² диÑекÑоÑии `/code`.
+
+ ÐнÑÑÑÑкÑÐ¸Ñ ÑоздаÑÑ ÑÑÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ Ð²Ð½ÑÑÑи конÑейнеÑа и Ð¼Ñ Ð¿Ð¾Ð¼ÐµÑÑим в Ð½ÐµÑ Ñайл `requirements.txt` и диÑекÑоÑÐ¸Ñ `app`.
+
+3. СкопиÑÑеÑе Ñайл Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑÑми из ÑекÑÑей диÑекÑоÑии в `/code`.
+
+ СнаÑала копиÑÑйÑе **ÑолÑко** Ñайл Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑÑми.
+
+ ÐÑÐ¾Ñ Ñайл **изменÑеÑÑÑ Ð´Ð¾Ð²Ð¾Ð»Ñно Ñедко**, Docker иÑÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñи поÑÑÑойке обÑаза и еÑли не наÑ
одиÑ, Ñо иÑполÑзÑÐµÑ **кÑÑ**, в коÑоÑом Ñ
ÑанÑÑÑÑ Ð¿ÑедÑдÑÑии веÑÑии ÑбоÑки обÑаза.
+
+4. УÑÑановиÑе библиоÑеки пеÑеÑиÑленнÑе в Ñайле Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑÑми.
+
+ ÐпÑÐ¸Ñ `--no-cache-dir` ÑказÑÐ²Ð°ÐµÑ `pip` не ÑоÑ
ÑанÑÑÑ Ð·Ð°Ð³ÑÑжаемÑе библиоÑеки на локалÑной маÑине Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ñ
в ÑлÑÑае повÑоÑной загÑÑзки. РконÑейнеÑе, в ÑлÑÑае пеÑеÑбоÑки ÑÑого Ñага, они вÑÑ Ñавно бÑдÑÑ ÑдаленÑ.
+
+ !!! note "ÐамеÑка"
+ ÐпÑÐ¸Ñ `--no-cache-dir` нÑжна ÑолÑко Ð´Ð»Ñ `pip`, она никак не влиÑÐµÑ Ð½Ð° Docker или конÑейнеÑÑ.
+
+ ÐпÑÐ¸Ñ `--upgrade` ÑказÑÐ²Ð°ÐµÑ `pip` обновиÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñеки, емли они Ñже ÑÑÑановленÑ.
+
+ Ðа и в пÑедÑдÑÑем Ñаге Ñ ÐºÐ¾Ð¿Ð¸Ñованием Ñайла, ÑÑÐ¾Ñ Ñаг Ñакже бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ **кÑÑ Docker** в ÑлÑÑае оÑÑÑÑÑÑÐ²Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹.
+
+ ÐÑполÑзÑвание кÑÑа, оÑобенно на ÑÑом Ñаге, Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ Ðам **ÑÑкономиÑÑ** кÑÑÑ Ð²Ñемени пÑи повÑоÑной ÑбоÑке обÑаза, Ñак как завиÑимоÑÑи бÑдÑÑ ÑоÑ
ÑÐ°Ð½ÐµÐ½Ñ Ð² кеÑе, а не **загÑÑжаÑÑÑÑ Ð¸ ÑÑÑанавливаÑÑÑÑ ÐºÐ°Ð¶Ð´Ñй Ñаз**.
+
+5. СкопиÑÑйÑе диÑекÑоÑÐ¸Ñ `./app` внÑÑÑÑ Ð´Ð¸ÑекÑоÑии `/code` (в конÑейнеÑе).
+
+ Так как в ÑÑой диÑекÑоÑии ÑаÑположен код, коÑоÑÑй **ÑаÑÑо изменÑеÑÑÑ**, Ñо иÑполÑзование **кÑÑа** на ÑÑом Ñаге бÑÐ´ÐµÑ Ð½Ð°Ð¸Ð¼ÐµÐ½ÐµÐµ ÑÑÑекÑивно, а знаÑÐ¸Ñ Ð»ÑÑÑе помеÑÑиÑÑ ÑÑÐ¾Ñ Ñаг **ближе к конÑÑ** `Dockerfile`, Ð´Ð°Ð±Ñ Ð½Ðµ ÑеÑÑÑÑ Ð²ÑÐ³Ð¾Ð´Ñ Ð¾Ñ Ð¾Ð¿ÑимизаÑии пÑедÑдÑÑиÑ
Ñагов.
+
+6. УкажиÑе **командÑ**, запÑÑкаÑÑÑÑ ÑеÑÐ²ÐµÑ `uvicorn`.
+
+ `CMD` пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑпиÑок ÑÑÑок, ÑазделÑннÑÑ
запÑÑÑми, но пÑи вÑполнении обÑÐµÐ´Ð¸Ð½Ð¸Ñ Ð¸Ñ
ÑеÑез пÑобел, ÑобÑав из ниÑ
Ð¾Ð´Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ, коÑоÑÑÑ ÐÑ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ Ð½Ð°Ð¿Ð¸ÑаÑÑ Ð² ÑеÑминале.
+
+ ÐÑа команда бÑÐ´ÐµÑ Ð²Ñполнена в **ÑекÑÑей ÑабоÑей диÑекÑоÑии**, а именно в диÑекÑоÑии `/code`, коÑÐ¾Ð°Ñ Ñказана командой `WORKDIR /code`.
+
+ Так как команда вÑполнÑеÑÑÑ Ð²Ð½ÑÑÑии диÑекÑоÑии `/code`, в коÑоÑÑÑ Ð¼Ñ Ð¿Ð¾Ð¼ÐµÑÑили Ð¿Ð°Ð¿ÐºÑ `./app` Ñ Ð¿Ñиложением, Ñо **Uvicorn** ÑÐ¼Ð¾Ð¶ÐµÑ Ð½Ð°Ð¹Ñи и **импоÑÑиÑоваÑÑ** обÑÐµÐºÑ `app` из Ñайла `app.main`.
+
+!!! tip "ÐодÑказка"
+ ÐÑли ÑкнÑÑе на кÑÑжок Ñ Ð¿Ð»ÑÑом, Ñо ÑвидиÑе поÑÑнениÑ. ð
+
+Ðа данном ÑÑапе ÑÑÑÑкÑÑÑа пÑоекÑа Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑглÑдеÑÑ Ñак:
+
+```
+.
+âââ app
+â  âââ __init__.py
+â âââ main.py
+âââ Dockerfile
+âââ requirements.txt
+```
+
+#### ÐÑполÑзование пÑокÑи-ÑеÑвеÑа
+
+ÐÑли ÐÑ Ð·Ð°Ð¿ÑÑкаеÑе конÑÐµÐ¹Ð½ÐµÑ Ð·Ð° пÑокÑи-ÑеÑвеÑом завеÑÑÐµÐ½Ð¸Ñ TLS (баланÑиÑÑÑÑего нагÑÑзкÑ), Ñаким как Nginx или Traefik, добавÑÑе опÑÐ¸Ñ `--proxy-headers`, коÑоÑÐ°Ñ ÑÐºÐ°Ð¶ÐµÑ Uvicorn, ÑÑо он ÑабоÑÐ°ÐµÑ Ð¿Ð¾Ð·Ð°Ð´Ð¸ пÑокÑи-ÑеÑвеÑа и Ð¼Ð¾Ð¶ÐµÑ Ð´Ð¾Ð²ÐµÑÑÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°Ð¼ оÑпÑавлÑемÑм им.
+
+```Dockerfile
+CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"]
+```
+
+#### ÐÑÑ Docker'а
+
+РнаÑем `Dockerfile` иÑполÑзована Ð¿Ð¾Ð»ÐµÐ·Ð½Ð°Ñ Ñ
иÑÑоÑÑÑ, когда ÑнаÑала копиÑÑеÑÑÑ **ÑолÑко Ñайл Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑÑми**, а не вÑÑ Ð¿Ð°Ð¿ÐºÐ° Ñ ÐºÐ¾Ð´Ð¾Ð¼ пÑиложениÑ.
+
+```Dockerfile
+COPY ./requirements.txt /code/requirements.txt
+```
+
+Docker и подобнÑе ÐµÐ¼Ñ Ð¸Ð½ÑÑÑÑменÑÑ **ÑоздаÑÑ** обÑÐ°Ð·Ñ ÐºÐ¾Ð½ÑейнеÑов **поÑагово**, добавлÑÑ **один Ñлой над дÑÑгим**, наÑÐ¸Ð½Ð°Ñ Ñ Ð¿ÐµÑвой ÑÑÑоки `Dockerfile` и добавлÑÑ ÑайлÑ, ÑоздаваемÑе пÑи вÑполнении каждой инÑÑÑÑкÑии из `Dockerfile`.
+
+ÐÑи Ñоздании обÑаза иÑполÑзÑеÑÑÑ **внÑÑÑенний кÑÑ** и еÑли в ÑайлаÑ
Ð½ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñа поÑледней ÑбоÑки обÑаза, Ñо бÑÐ´ÐµÑ **пеÑеиÑполÑзован** Ñанее ÑозданнÑй Ñлой обÑаза, а не повÑоÑное копиÑование Ñайлов и Ñоздание ÑÐ»Ð¾Ñ Ñ Ð½ÑлÑ.
+ÐамеÑÑÑе, ÑÑо Ñак как Ñлой ÑледÑÑÑего Ñага завиÑÐ¸Ñ Ð¾Ñ ÑÐ»Ð¾Ñ Ð¿ÑедÑдÑÑего, Ñо Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð½ÐµÑÑннÑе в пÑомежÑÑоÑнÑй Ñлой, Ñакже повлиÑÑÑ Ð½Ð° поÑледÑÑÑие.
+
+Ðзбегание копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ñайлов не обÑзаÑелÑно ÑлÑÑÑÐ¸Ñ ÑиÑÑаÑиÑ, но иÑполÑзование кÑÑа на одном Ñаге, Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ **иÑполÑзоваÑÑ ÐºÑÑ Ð¸ на ÑледÑÑÑиÑ
ÑагаÑ
**. ÐапÑимеÑ, можно иÑполÑзоваÑÑ ÐºÑÑ Ð¿Ñи ÑÑÑановке завиÑимоÑÑей:
+
+```Dockerfile
+RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
+```
+
+Файл Ñо ÑпиÑком завиÑимоÑÑей **изменÑеÑÑÑ Ð´Ð¾Ð²Ð¾Ð»Ñно Ñедко**. Так ÑÑо вÑполнив ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ÐºÐ¾Ð¿Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑолÑко ÑÑого Ñайла, Docker ÑÐ¼Ð¾Ð¶ÐµÑ **иÑполÑзоваÑÑ ÐºÑÑ** на ÑÑом Ñаге.
+
+РзаÑем **иÑполÑзоваÑÑ ÐºÑÑ Ð¸ на ÑледÑÑÑем Ñаге**, загÑÑжаÑÑем и ÑÑÑанавливаÑÑем завиÑимоÑÑи. Ð Ð²Ð¾Ñ ÑÑÑ-Ñо Ð¼Ñ Ð¸ **ÑÑкономим много вÑемени**. ⨠...а не бÑдем ÑомиÑÑÑÑ Ð² ÑÑгоÑÑном ожидании. ðªð
+
+ÐÐ»Ñ Ð·Ð°Ð³ÑÑзки и ÑÑÑановки необÑ
одимÑÑ
библиоÑек **Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð½Ð°Ð´Ð¾Ð±Ð¸ÑÑÑÑ Ð½ÐµÑколÑко минÑÑ**, но иÑполÑзование **кÑÑа** Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ Ð½ÐµÑколÑко **ÑекÑнд** макÑимÑм.
+
+Ð Ñак как во вÑÐµÐ¼Ñ ÑазÑабоÑки ÐÑ Ð±ÑдеÑе ÑаÑÑо пеÑеÑобиÑаÑÑ ÐºÐ¾Ð½ÑÐµÐ¹Ð½ÐµÑ Ð´Ð»Ñ Ð¿ÑовеÑки ÑабоÑоÑпоÑобноÑÑи внеÑÑннÑÑ
изменений, Ñо ÑÑкономленнÑе минÑÑÑ ÑложаÑÑÑ Ð² ÑаÑÑ, а Ñо и дни.
+
+Так как папка Ñ ÐºÐ¾Ð´Ð¾Ð¼ пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ **изменÑеÑÑÑ ÑаÑе вÑего**, Ñо Ð¼Ñ ÑаÑположили ÐµÑ Ð² конÑе `Dockerfile`, Ð²ÐµÐ´Ñ Ð¿Ð¾Ñле внеÑÑннÑÑ
в код изменений кÑÑ Ð½Ðµ бÑÐ´ÐµÑ Ð¸ÑполÑзован на ÑÑом и ÑледÑÑÑиÑ
ÑагаÑ
.
+
+```Dockerfile
+COPY ./app /code/app
+```
+
+### СоздаÑÑ Docker-обÑаз
+
+ТепеÑÑ, когда вÑе ÑÐ°Ð¹Ð»Ñ Ð½Ð° ÑвоиÑ
меÑÑаÑ
, давайÑе Ñоздадим обÑаз конÑейнеÑа.
+
+* ÐеÑейдиÑе в диÑекÑоÑÐ¸Ñ Ð¿ÑоекÑа (в ÑÑ, где ÑаÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ñ `Dockerfile` и папка `app` Ñ Ð¿Ñиложением).
+* Создай обÑаз пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ FastAPI:
+
+
+
+```console
+$ docker build -t myimage .
+
+---> 100%
+```
+
+
+
+!!! tip "ÐодÑказка"
+ ÐбÑаÑиÑе внимание, ÑÑо в конÑе напиÑана ÑоÑка - `.`, ÑÑо Ñо же Ñамое ÑÑо и `./`, Ñем ÑамÑм Ð¼Ñ ÑказÑваем Docker диÑекÑоÑиÑ, из коÑоÑой нÑжно вÑполнÑÑÑ ÑбоÑÐºÑ Ð¾Ð±Ñаза конÑейнеÑа.
+
+ Рданном ÑлÑÑае ÑÑо Ñа же ÑÐ°Ð¼Ð°Ñ Ð´Ð¸ÑекÑоÑÐ¸Ñ (`.`).
+
+### ÐапÑÑк Docker-конÑейнеÑа
+
+* ÐапÑÑÑиÑе конÑейнеÑ, оÑнованнÑй на ÐаÑем обÑазе:
+
+
+
+```console
+$ docker run -d --name mycontainer -p 80:80 myimage
+```
+
+
+
+## ÐÑовеÑка
+
+ÐÑ Ð¼Ð¾Ð¶ÐµÑе пÑовеÑиÑÑ, ÑÑо ÐÐ°Ñ Docker-конÑÐµÐ¹Ð½ÐµÑ ÑабоÑÐ°ÐµÑ Ð¿ÐµÑÐµÐ¹Ð´Ñ Ð¿Ð¾ ÑÑÑлке: http://192.168.99.100/items/5?q=somequery или http://127.0.0.1/items/5?q=somequery (или поÑ
ожей, коÑоÑÑÑ Ð¸ÑполÑзÑÐµÑ ÐÐ°Ñ Docker-Ñ
оÑÑ).
+
+Там ÐÑ ÑвидиÑе:
+
+```JSON
+{"item_id": 5, "q": "somequery"}
+```
+
+## ÐнÑеÑакÑÐ¸Ð²Ð½Ð°Ñ Ð´Ð¾ÐºÑменÑаÑÐ¸Ñ API
+
+ТепеÑÑ Ð¿ÐµÑейдиÑе по ÑÑÑлке http://192.168.99.100/docs или http://127.0.0.1/docs (или поÑ
ожей, коÑоÑÑÑ Ð¸ÑполÑзÑÐµÑ ÐÐ°Ñ Docker-Ñ
оÑÑ).
+
+ÐдеÑÑ ÐÑ ÑвидиÑе авÑомаÑиÑеÑкÑÑ Ð¸Ð½ÑеÑакÑивнÑÑ Ð´Ð¾ÐºÑменÑаÑÐ¸Ñ API (пÑедоÑÑавлÑемÑÑ Swagger UI):
+
+
+
+## ÐлÑÑеÑнаÑÐ¸Ð²Ð½Ð°Ñ Ð´Ð¾ÐºÑменÑаÑÐ¸Ñ API
+
+Также ÐÑ Ð¼Ð¾Ð¶ÐµÑе пеÑейÑи по ÑÑÑлке http://192.168.99.100/redoc or http://127.0.0.1/redoc (или поÑ
ожей, коÑоÑÑÑ Ð¸ÑполÑзÑÐµÑ ÐÐ°Ñ Docker-Ñ
оÑÑ).
+
+ÐдеÑÑ ÐÑ ÑвидиÑе алÑÑеÑнаÑивнÑÑ Ð°Ð²ÑомаÑиÑеÑкÑÑ Ð´Ð¾ÐºÑменÑаÑÐ¸Ñ API (пÑедоÑÑавлÑемÑÑ ReDoc):
+
+
+
+## Создание Docker-обÑаза на оÑнове одноÑайлового пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ FastAPI
+
+ÐÑли ÐаÑе пÑиложение FastAPI помеÑено в один Ñайл, напÑимеÑ, `main.py` и ÑÑÑÑкÑÑÑа ÐаÑиÑ
Ñайлов поÑ
ожа на ÑÑÑ:
+
+```
+.
+âââ Dockerfile
+âââ main.py
+âââ requirements.txt
+```
+
+Ðам нÑжно измениÑÑ Ð² `Dockerfile` ÑооÑвеÑÑÑвÑÑÑие пÑÑи копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ñайлов:
+
+```{ .dockerfile .annotate hl_lines="10 13" }
+FROM python:3.9
+
+WORKDIR /code
+
+COPY ./requirements.txt /code/requirements.txt
+
+RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
+
+# (1)
+COPY ./main.py /code/
+
+# (2)
+CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]
+```
+
+1. СкопиÑÑйÑе непоÑÑедÑÑвенно Ñайл `main.py` в диÑекÑоÑÐ¸Ñ `/code` (не ÑказÑвайÑе `./app`).
+
+2. ÐÑи запÑÑке Uvicorn ÑкажиÑе емÑ, ÑÑо обÑÐµÐºÑ `app` нÑжно импоÑÑиÑоваÑÑ Ð¸Ð· Ñайла `main` (вмеÑÑо импоÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð· `app.main`).
+
+ÐаÑÑÑойÑе Uvicorn на иÑполÑзование `main` вмеÑÑо `app.main` Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾ÑÑа обÑекÑа `app`.
+
+## ÐонÑепÑии ÑазвÑÑÑÑваниÑ
+
+ÐавайÑе вÑпомним о [ÐонÑепÑиÑÑ
ÑазвÑÑÑÑваниÑ](./concepts.md){.internal-link target=_blank} и пÑименим иÑ
к конÑейнеÑам.
+
+ÐонÑейнеÑÑ - ÑÑо, в оÑновном, инÑÑÑÑÐ¼ÐµÐ½Ñ ÑпÑоÑаÑÑий **ÑбоÑÐºÑ Ð¸ ÑазвÑÑÑÑвание** пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¸ они не обÑзÑаÑÑ Ðº пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐºÐ°ÐºÐ¾Ð¹-Ñо опÑеделÑнной **конÑепÑии ÑазвÑÑÑÑваниÑ**, а знаÑÐ¸Ñ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ вÑбиÑаÑÑ Ð½ÑжнÑÑ ÑÑÑаÑегиÑ.
+
+**ХоÑоÑÐ°Ñ Ð½Ð¾Ð²Ð¾ÑÑÑ** в Ñом, ÑÑо незавиÑимо Ð¾Ñ Ð²ÑбÑанной ÑÑÑаÑегии, Ð¼Ñ Ð²ÑÑ Ñавно можем покÑÑÑÑ Ð²Ñе конÑепÑии ÑазвÑÑÑÑваниÑ. ð
+
+РаÑÑмоÑÑим ÑÑи **конÑепÑии ÑазвÑÑÑÑваниÑ** пÑимениÑелÑно к конÑейнеÑам:
+
+* ÐÑполÑзование более безопаÑного пÑоÑокола HTTPS
+* ÐаÑÑÑойки запÑÑка пÑиложениÑ
+* ÐеÑезагÑÑзка пÑиложениÑ
+* ÐапÑÑк неÑколÑкиÑ
ÑкземплÑÑов пÑиложениÑ
+* УпÑавление памÑÑÑÑ
+* ÐÑполÑзование пеÑеÑиÑленнÑÑ
ÑÑнкÑий пеÑед запÑÑком пÑиложениÑ
+
+## ÐÑполÑзование более безопаÑного пÑоÑокола HTTPS
+
+ÐÑли Ð¼Ñ Ð¾Ð¿ÑеделимÑÑ, ÑÑо **обÑаз конÑейнеÑа** бÑÐ´ÐµÑ ÑодеÑжаÑÑ ÑолÑко пÑиложение FastAPI, Ñо ÑабоÑÑ Ñ HTTPS можно оÑганизоваÑÑ **ÑнаÑÑжи** конÑейнеÑа пÑи помоÑи дÑÑгого инÑÑÑÑменÑа.
+
+ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´ÑÑгой конÑейнеÑ, в коÑоÑом еÑÑÑ, напÑимеÑ, Traefik, ÑабоÑаÑÑий Ñ **HTTPS** и **ÑамоÑÑоÑÑелÑно** обновлÑÑÑий **ÑеÑÑиÑикаÑÑ**.
+
+!!! tip "ÐодÑказка"
+ Traefik ÑовмеÑÑим Ñ Docker, Kubernetes и им подобнÑми инÑÑÑÑменÑами. Ðн оÑÐµÐ½Ñ Ð¿ÑоÑÑ Ð² ÑÑÑановке и наÑÑÑойке иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ HTTPS Ð´Ð»Ñ ÐаÑиÑ
конÑейнеÑов.
+
+РкаÑеÑÑве алÑÑеÑнаÑивÑ, ÑабоÑÑ Ñ HTTPS можно довеÑиÑÑ Ð¾Ð±Ð»Ð°ÑÐ½Ð¾Ð¼Ñ Ð¿ÑовайдеÑÑ, еÑли он пÑедоÑÑавлÑÐµÑ ÑакÑÑ ÑÑлÑгÑ.
+
+## ÐаÑÑÑойки запÑÑка и пеÑезагÑÑзки пÑиложениÑ
+
+ÐбÑÑно **запÑÑком конÑейнеÑа Ñ Ð¿Ñиложением** занимаеÑÑÑ ÐºÐ°ÐºÐ¾Ð¹-Ñо оÑделÑнÑй инÑÑÑÑменÑ.
+
+ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñам **Docker**, **Docker Compose**, **Kubernetes**, **облаÑнÑй пÑовайдеÑ** и Ñ.п.
+
+РболÑÑинÑÑве ÑлÑÑаев ÑÑо пÑоÑÑейÑие наÑÑÑойки запÑÑка и пеÑезагÑÑзки пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ (пÑи падении). ÐапÑимеÑ, команде запÑÑка Docker-конÑейнеÑа можно добавиÑÑ Ð¾Ð¿ÑÐ¸Ñ `--restart`.
+
+УпÑавление запÑÑком и пеÑезагÑÑзкой пÑиложений без иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½ÑейнеÑов - веÑÑма заÑÑÑдниÑелÑно. Ðо пÑи **ÑабоÑе Ñ ÐºÐ¾Ð½ÑейнеÑами** - ÑÑо вÑего лиÑÑ ÑÑнкÑионал доÑÑÑпнÑй по ÑмолÑаниÑ. â¨
+
+## ÐапÑÑк неÑколÑкиÑ
ÑкземплÑÑов пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ - Указание колиÑеÑÑва пÑоÑеÑÑов
+
+ÐÑли Ñ ÐÐ°Ñ ÐµÑÑÑ ÐºÐ»Ð°ÑÑÐµÑ Ð¼Ð°Ñин под ÑпÑавлением **Kubernetes**, Docker Swarm Mode, Nomad или аналогиÑной Ñложной ÑиÑÑемой оÑкеÑÑÑаÑии конÑейнеÑов, ÑкоÑее вÑего, вмеÑÑо иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑа пÑоÑеÑÑов (Ñипа Gunicorn и его воÑкеÑÑ) в каждом конÑейнеÑе, ÐÑ Ð·Ð°Ñ
оÑиÑе **ÑпÑавлÑÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑвом запÑÑеннÑÑ
ÑкземплÑÑов пÑиложениÑ** на **ÑÑовне клаÑÑеÑа**.
+
+РлÑбÑÑ Ð¸Ð· ÑÑиÑ
ÑиÑÑем ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑейнеÑами обÑÑно вÑÑÑоен ÑпоÑоб ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ **колиÑеÑÑвом запÑÑеннÑÑ
конÑейнеÑов** Ð´Ð»Ñ ÑаÑпÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ **нагÑÑзки** Ð¾Ñ Ð²Ñ
одÑÑиÑ
запÑоÑов на **ÑÑовне клаÑÑеÑа**.
+
+Ð Ñакой ÑиÑÑаÑии ÐÑ, веÑоÑÑно, заÑ
оÑиÑе ÑоздаÑÑ **обÑаз Docker**, как [опиÑано вÑÑе](#dockerfile), Ñ ÑÑÑановленнÑми завиÑимоÑÑÑми и запÑÑкаÑÑий **один пÑоÑеÑÑ Uvicorn** вмеÑÑо Ñого, ÑÑÐ¾Ð±Ñ Ð·Ð°Ð¿ÑÑкаÑÑ Gunicorn ÑпÑавлÑÑÑий неÑколÑкими воÑкеÑами Uvicorn.
+
+### ÐаланÑиÑовÑик нагÑÑзки
+
+ÐбÑÑно пÑи иÑполÑзовании конÑейнеÑов один ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ **пÑоÑлÑÑÐ¸Ð²Ð°ÐµÑ Ð³Ð»Ð°Ð²Ð½Ñй поÑÑ**. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÐºÐ¾Ð½ÑÐµÐ¹Ð½ÐµÑ ÑодеÑжаÑий **пÑокÑи-ÑеÑÐ²ÐµÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ ÑабоÑÑ TLS** Ð´Ð»Ñ ÑабоÑÑ Ñ **HTTPS** или ÑÑо-Ñо подобное.
+
+ÐоÑколÑÐºÑ ÑÑÐ¾Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ **пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð·Ð°Ð¿ÑоÑÑ** и ÑавномеÑно **ÑаÑпÑеделÑеÑ** иÑ
Ð¼ÐµÐ¶Ð´Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñами, его Ñакже назÑваÑÑ **баланÑиÑовÑиком нагÑÑзки**.
+
+!!! tip "ÐодÑказка"
+ **ÐÑокÑи-ÑеÑÐ²ÐµÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ ÑабоÑÑ TLS** одновÑеменно Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ **баланÑиÑовÑиком нагÑÑзки**.
+
+СиÑÑема оÑкеÑÑÑаÑии, коÑоÑÑÑ ÐÑ Ð¸ÑполÑзÑеÑе Ð´Ð»Ñ Ð·Ð°Ð¿ÑÑка и ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑейнеÑами, Ð¸Ð¼ÐµÐµÑ Ð²ÑÑÑоеннÑй инÑÑÑÑÐ¼ÐµÐ½Ñ **ÑеÑевого взаимодейÑÑвиÑ** (напÑимеÑ, Ð´Ð»Ñ Ð¿ÐµÑедаÑи HTTP-запÑоÑов) Ð¼ÐµÐ¶Ð´Ñ ÐºÐ¾Ð½ÑейнеÑами Ñ ÐаÑими пÑиложениÑми и **баланÑиÑовÑиком нагÑÑзки** (коÑоÑÑй Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ **пÑокÑи-ÑеÑвеÑом**).
+
+### Ðдин баланÑиÑовÑик - ÐножеÑÑво конÑейнеÑов
+
+ÐÑи ÑабоÑе Ñ **Kubernetes** или аналогиÑнÑми ÑиÑÑемами оÑкеÑÑÑаÑии иÑполÑзование иÑ
внÑÑÑеннней ÑеÑи позволÑÐµÑ Ð¸Ð¼ÐµÑÑ Ð¾Ð´Ð¸Ð½ **баланÑиÑовÑик нагÑÑзки**, коÑоÑÑй пÑоÑлÑÑÐ¸Ð²Ð°ÐµÑ **главнÑй** поÑÑ Ð¸ пеÑедаÑÑ Ð·Ð°Ð¿ÑоÑÑ **множеÑÑÐ²Ñ Ð·Ð°Ð¿ÑÑеннÑÑ
конÑейнеÑов** Ñ ÐаÑими пÑиложениÑми.
+
+Ркаждом из конÑейнеÑов обÑÑно ÑабоÑÐ°ÐµÑ **ÑолÑко один пÑоÑеÑÑ** (напÑимеÑ, пÑоÑеÑÑ Uvicorn ÑпÑавлÑÑÑий ÐаÑим пÑиложением FastAPI). ÐонÑейнеÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ **иденÑиÑнÑми**, запÑÑеннÑми на оÑнове одного и Ñого же обÑаза, но Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ бÑдÑÑ Ñвои оÑделÑнÑе пÑоÑеÑÑ, памÑÑÑ Ð¸ Ñ.п. Таким обÑазом Ð¼Ñ Ð¿Ð¾Ð»ÑÑаем пÑеимÑÑеÑÑва **ÑаÑпаÑаллеливаниÑ** ÑабоÑÑ Ð¿Ð¾ **ÑазнÑм ÑдÑам** пÑоÑеÑÑоÑа или даже **ÑазнÑм маÑинам**.
+
+СиÑÑема ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑейнеÑами Ñ **баланÑиÑовÑиком нагÑÑзки** бÑÐ´ÐµÑ **ÑаÑпÑеделÑÑÑ Ð·Ð°Ð¿ÑоÑÑ** к конÑейнеÑам Ñ Ð¿ÑиложениÑми **по оÑеÑеди**. То еÑÑÑ ÐºÐ°Ð¶Ð´Ñй запÑÐ¾Ñ Ð±ÑÐ´ÐµÑ Ð¾Ð±ÑабоÑан одним из множеÑÑва **одинаковÑÑ
конÑейнеÑов** Ñ Ð¾Ð´Ð½Ð¸Ð¼ и Ñем же пÑиложением.
+
+**ÐаланÑиÑовÑик нагÑÑзки** Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑабаÑÑваÑÑ Ð·Ð°Ð¿ÑоÑÑ Ðº *ÑазнÑм* пÑиложениÑм, ÑаÑположеннÑм в ÐаÑем клаÑÑеÑе (напÑимеÑ, еÑли Ñ Ð½Ð¸Ñ
ÑазнÑе Ð´Ð¾Ð¼ÐµÐ½Ñ Ð¸Ð»Ð¸ пÑеÑикÑÑ Ð¿ÑÑи) и пеÑедаваÑÑ Ð·Ð°Ð¿ÑоÑÑ Ð½ÑÐ¶Ð½Ð¾Ð¼Ñ ÐºÐ¾Ð½ÑейнеÑÑ Ñ ÑÑебÑемÑм пÑиложением.
+
+### Ðдин пÑоÑеÑÑ Ð½Ð° конÑейнеÑ
+
+Ð ÑÑом ваÑианÑе **в одном конÑейнеÑе бÑÐ´ÐµÑ Ð·Ð°Ð¿ÑÑен ÑолÑко один пÑоÑеÑÑ (Uvicorn)**, а ÑпÑавление изменением колиÑеÑÑва запÑÑеннÑÑ
копий пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð½Ð° ÑÑовне клаÑÑеÑа.
+
+ÐдеÑÑ **не нÑжен** Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑ Ð¿ÑоÑеÑÑов Ñипа Gunicorn, ÑпÑавлÑÑÑий пÑоÑеÑÑами Uvicorn, или же Uvicorn, ÑпÑавлÑÑÑий дÑÑгими пÑоÑеÑÑами Uvicorn. ÐоÑÑаÑоÑно **ÑолÑко одного пÑоÑеÑÑа Uvicorn** на конÑÐµÐ¹Ð½ÐµÑ (но запÑÑк неÑколÑкиÑ
пÑоÑеÑÑов не запÑеÑÑн).
+
+ÐÑполÑзование менеджеÑа пÑоÑеÑÑов (Gunicorn или Uvicorn) внÑÑÑи конÑейнеÑа ÑолÑко добавлÑÐµÑ **излиÑнее ÑÑложнение**, Ñак как ÑпÑавление ÑледÑÐµÑ Ð¾ÑÑÑеÑÑвлÑÑÑ ÑиÑÑемой оÑкеÑÑÑаÑии.
+
+### ÐножеÑÑво пÑоÑеÑÑов внÑÑÑи конÑейнеÑа Ð´Ð»Ñ Ð¾ÑобÑÑ
ÑлÑÑаев
+
+ÐезÑÑловно, бÑваÑÑ **оÑобÑе ÑлÑÑаи**, когда Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð½Ð°Ð´Ð¾Ð±Ð¸ÑÑÑ Ð²Ð½ÑÑÑи конÑейнеÑа запÑÑкаÑÑ **Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑ Ð¿ÑоÑеÑÑов Gunicorn**, ÑпÑавлÑÑÑий неÑколÑкими **пÑоÑеÑÑами Uvicorn**.
+
+ÐÐ»Ñ ÑакиÑ
ÑлÑÑаев ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ **оÑиÑиалÑнÑй Docker-обÑаз** (пÑим. пеÑ: - *здеÑÑ Ð¸ далее на ÑÑой ÑÑÑаниÑе, еÑли ÐÑ Ð²ÑÑÑеÑиÑе ÑоÑеÑание "оÑиÑиалÑнÑй Docker-обÑаз" без ÑÑоÑнений, Ñо авÑÐ¾Ñ Ð¸Ð¼ÐµÐµÑ Ð² Ð²Ð¸Ð´Ñ Ð¸Ð¼ÐµÐ½Ð½Ð¾ пÑедоÑÑавлÑемÑй им обÑаз*), где в каÑеÑÑве менеджеÑа пÑоÑеÑÑов иÑполÑзÑеÑÑÑ **Gunicorn**, запÑÑкаÑÑий неÑколÑко **пÑоÑеÑÑов Uvicorn** и некоÑоÑÑе наÑÑÑойки по ÑмолÑаниÑ, авÑомаÑиÑеÑки ÑÑÑанавливаÑÑие колиÑеÑÑво запÑÑеннÑÑ
пÑоÑеÑÑов в завиÑимоÑÑи Ð¾Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑва ÑÐ´ÐµÑ ÐаÑего пÑоÑеÑÑоÑа. Я ÑаÑÑÐºÐ°Ð¶Ñ Ðам об ÑÑом подÑобнее ÑÑÑ: [ÐÑиÑиалÑнÑй Docker-обÑаз Ñо вÑÑÑоеннÑми Gunicorn и Uvicorn](#docker-gunicorn-uvicorn).
+
+ÐекоÑоÑÑе пÑимеÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½ÑÑ
ÑлÑÑаев:
+
+#### ÐÑоÑÑое пÑиложение
+
+ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑ Ð¿ÑоÑеÑÑов внÑÑÑи конÑейнеÑа, еÑли ÐаÑе пÑиложение **наÑÑолÑко пÑоÑÑое**, ÑÑо Ñ ÐÐ°Ñ Ð½ÐµÑ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑи (по кÑайней меÑе, пока неÑ) в ÑÑаÑелÑнÑÑ
наÑÑÑойкаÑ
колиÑеÑÑва пÑоÑеÑÑов и Ðам доÑÑаÑоÑно имеÑÑиÑ
ÑÑ Ð½Ð°ÑÑÑоек по ÑмолÑÐ°Ð½Ð¸Ñ (еÑли иÑполÑзÑеÑÑÑ Ð¾ÑиÑиалÑнÑй Docker-обÑаз) Ð´Ð»Ñ Ð·Ð°Ð¿ÑÑка пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ **ÑолÑко на одном ÑеÑвеÑе**, а не в клаÑÑеÑе.
+
+#### Docker Compose
+
+С помоÑÑÑ **Docker Compose** можно ÑазвоÑаÑиваÑÑ Ð½ÐµÑколÑко конÑейнеÑов на **одном ÑеÑвеÑе** (не клаÑÑеÑе), но пÑи ÑÑо Ñ ÐÐ°Ñ Ð½Ðµ бÑÐ´ÐµÑ Ð¿ÑоÑÑого ÑпоÑоба ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑвом запÑÑеннÑÑ
конÑейнеÑов Ñ Ð¾Ð´Ð½Ð¾Ð²ÑеменнÑм ÑоÑ
Ñанением обÑей ÑеÑи и **баланÑиÑовки нагÑÑзки**.
+
+Ð ÑÑом ÑлÑÑае можно иÑполÑзоваÑÑ **Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑ Ð¿ÑоÑеÑÑов**, ÑпÑавлÑÑÑий **неÑколÑкими пÑоÑеÑÑами**, внÑÑÑи **одного конÑейнеÑа**.
+
+#### Prometheus и пÑоÑие пÑиÑинÑ
+
+У ÐÐ°Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¸ **дÑÑгие пÑиÑинÑ**, когда иÑполÑзование **множеÑÑва пÑоÑеÑÑов** внÑÑÑи **одного конÑейнеÑа** бÑÐ´ÐµÑ Ð¿ÑоÑе, нежели запÑÑк **неÑколÑкиÑ
конÑейнеÑов** Ñ **единÑÑвеннÑм пÑоÑеÑÑом** в каждом из ниÑ
.
+
+ÐапÑÐ¸Ð¼ÐµÑ (в завиÑимоÑÑи Ð¾Ñ ÐºÐ¾Ð½ÑигÑÑаÑии), Ñ ÐÐ°Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¸Ð½ÑÑÑÑменÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñе ÑкÑпоÑÑÑÑÑ Prometheus, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ Ð´Ð¾ÑÑÑп к **ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ Ð·Ð°Ð¿ÑоÑÑ** пÑиÑ
одÑÑÐµÐ¼Ñ Ð² конÑейнеÑ.
+
+ÐÑли Ñ ÐÐ°Ñ Ð±ÑÐ´ÐµÑ **неÑколÑко конÑейнеÑов**, Ñо Prometheus, по ÑмолÑаниÑ, **пÑи ÑбоÑе меÑÑик** полÑÑÐ¸Ñ Ð¸Ñ
**ÑолÑко Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ конÑейнеÑа**, коÑоÑÑй обÑабаÑÑÐ²Ð°ÐµÑ ÐºÐ¾Ð½ÐºÑеÑнÑй запÑоÑ, вмеÑÑо **ÑбоÑа меÑÑик** Ñо вÑеÑ
ÑабоÑаÑÑиÑ
конÑейнеÑов.
+
+Ð Ñаком ÑлÑÑае Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑоÑе имеÑÑ **один конÑейнеÑ** Ñо **множеÑÑвом пÑоÑеÑÑов**, Ñ Ð½ÑжнÑм инÑÑÑÑменÑом (Ñаким как ÑкÑпоÑÑÑÑ Prometheus) в ÑÑом же конÑейнеÑе и ÑобиÑаÑÑем меÑÑики Ñо вÑеÑ
внÑÑÑенниÑ
пÑоÑеÑÑов ÑÑого конÑейнеÑа.
+
+---
+
+Самое главное - **ни одно** из пеÑеÑиÑленнÑÑ
пÑавил не ÑвлÑеÑÑÑ **вÑÑеÑеннÑм в камне** и ÐÑ Ð½Ðµ обÑÐ·Ð°Ð½Ñ Ñлепо иÑ
повÑоÑÑÑÑ. ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ ÑÑи идеи пÑи **ÑаÑÑмоÑÑении ÐаÑего конкÑеÑного ÑлÑÑаÑ** и ÑамоÑÑоÑÑелÑно ÑеÑаÑÑ, ÐºÐ°ÐºÐ°Ñ Ð¸Ð· конÑепÑии подÑ
Ð¾Ð´Ð¸Ñ Ð»ÑÑÑе:
+
+* ÐÑполÑзование более безопаÑного пÑоÑокола HTTPS
+* ÐаÑÑÑойки запÑÑка пÑиложениÑ
+* ÐеÑезагÑÑзка пÑиложениÑ
+* ÐапÑÑк неÑколÑкиÑ
ÑкземплÑÑов пÑиложениÑ
+* УпÑавление памÑÑÑÑ
+* ÐÑполÑзование пеÑеÑиÑленнÑÑ
ÑÑнкÑий пеÑед запÑÑком пÑиложениÑ
+
+## УпÑавление памÑÑÑÑ
+
+ÐÑи **запÑÑке одного пÑоÑеÑÑа на конÑейнеÑ** ÐÑ Ð¿Ð¾Ð»ÑÑаеÑе оÑноÑиÑелÑно понÑÑнÑй, ÑÑабилÑнÑй и огÑаниÑеннÑй обÑÑм памÑÑи, поÑÑеблÑемÑй одним конÑейнеÑом.
+
+ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑÑÑановиÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸ÑнÑе огÑаниÑÐµÐ½Ð¸Ñ Ð¿Ð¾ памÑÑи пÑи конÑигÑÑиÑовании Ñвоей ÑиÑÑÐµÐ¼Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑейнеÑами (напÑимеÑ, **Kubernetes**). Таким обÑазом ÑиÑÑема ÑÐ¼Ð¾Ð¶ÐµÑ **изменÑÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво конÑейнеÑов** на **доÑÑÑпнÑÑ
ей маÑинаÑ
** пÑÐ¸Ð²Ð¾Ð´Ñ Ð² ÑооÑвеÑÑÑвие колиÑеÑÑво памÑÑи нÑжной конÑейнеÑам Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑвом памÑÑи доÑÑÑпной в клаÑÑеÑе (набоÑе доÑÑÑпнÑÑ
маÑин).
+
+ÐÑли Ñ ÐÐ°Ñ **пÑоÑÑенÑкое** пÑиложение, веÑоÑÑно Ñ ÐÐ°Ñ Ð½Ðµ бÑÐ´ÐµÑ **необÑ
одимоÑÑи** ÑÑÑанавливаÑÑ Ð¶ÑÑÑкие огÑаниÑÐµÐ½Ð¸Ñ Ð½Ð° вÑделÑемÑÑ ÐµÐ¼Ñ Ð¿Ð°Ð¼ÑÑÑ. Ðо еÑли пÑиложение **иÑполÑзÑÐµÑ Ð¼Ð½Ð¾Ð³Ð¾ памÑÑи** (напÑимеÑ, оно иÑполÑзÑÐµÑ Ð¼Ð¾Ð´ÐµÐ»Ð¸ **маÑинного обÑÑениÑ**), Ðам ÑледÑÐµÑ Ð¿ÑовеÑиÑÑ, как много памÑÑи ÐµÐ¼Ñ ÑÑебÑеÑÑÑ Ð¸ оÑÑегÑлиÑоваÑÑ **колиÑеÑÑво конÑейнеÑов** запÑÑеннÑÑ
на **каждой маÑине** (Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð°Ð¶Ðµ добавиÑÑ Ð¼Ð°Ñин в клаÑÑеÑ).
+
+ÐÑли ÐÑ Ð·Ð°Ð¿ÑÑкаеÑе **неÑколÑко пÑоÑеÑÑов в конÑейнеÑе**, Ñо Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑвеÑенÑ, ÑÑо ÑÑи пÑоÑеÑÑÑ Ð½Ðµ **займÑÑ Ð¿Ð°Ð¼ÑÑи болÑÑе**, Ñем доÑÑÑпно Ð´Ð»Ñ ÐºÐ¾Ð½ÑейнеÑа.
+
+## ÐодгоÑовиÑелÑнÑе Ñаги пÑи запÑÑке конÑейнеÑов
+
+ÐÑÑÑ Ð´Ð²Ð° оÑновнÑÑ
подÑ
ода, коÑоÑÑе ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð¿Ñи запÑÑке конÑейнеÑов (Docker, Kubernetes и Ñ.п.).
+
+### ÐножеÑÑво конÑейнеÑов
+
+Ðогда ÐÑ Ð·Ð°Ð¿ÑÑкаеÑе **множеÑÑво конÑейнеÑов**, в каждом из коÑоÑÑÑ
ÑабоÑÐ°ÐµÑ **ÑолÑко один пÑоÑеÑÑ** (напÑимеÑ, в клаÑÑеÑе **Kubernetes**), Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÑÑÑ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑÑ Ð¸Ð¼ÐµÑÑ **оÑделÑнÑй конÑейнеÑ**, коÑоÑÑй оÑÑÑеÑÑÐ²Ð¸Ñ **пÑедваÑиÑелÑнÑе Ñаги пеÑед запÑÑком** оÑÑалÑнÑÑ
конÑейнеÑов (напÑимеÑ, пÑименÑÐµÑ Ð¼Ð¸Ð³ÑаÑии к базе даннÑÑ
).
+
+!!! info "ÐнÑоÑмаÑиÑ"
+ ÐÑи иÑполÑзовании Kubernetes, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÐниÑиализиÑÑÑÑий конÑейнеÑ.
+
+ÐÑи оÑÑÑÑÑÑвии Ñакой необÑ
одимоÑÑи (допÑÑÑим, не нÑжно пÑименÑÑÑ Ð¼Ð¸Ð³ÑаÑии к базе даннÑÑ
, а ÑолÑко пÑовеÑиÑÑ, ÑÑо она гоÑова пÑинимаÑÑ ÑоединениÑ), ÐÑ Ð¼Ð¾Ð¶ÐµÑе пÑоводиÑÑ ÑакÑÑ Ð¿ÑовеÑÐºÑ Ð² каждом конÑейнеÑе пеÑед запÑÑком его оÑновного пÑоÑеÑÑа и запÑÑкаÑÑ Ð²Ñе конÑейнеÑÑ **одновÑеменно**.
+
+### ТолÑко один конÑейнеÑ
+
+ÐÑли Ñ ÐÐ°Ñ Ð½ÐµÑложное пÑиложение Ð´Ð»Ñ ÑабоÑÑ ÐºÐ¾ÑоÑого доÑÑаÑоÑно **одного конÑейнеÑа**, но в коÑоÑом ÑабоÑÐ°ÐµÑ **неÑколÑко пÑоÑеÑÑов** (или один пÑоÑеÑÑ), Ñо пÑоÑ
ождение пÑедваÑиÑелÑнÑÑ
Ñагов можно оÑÑÑеÑÑвиÑÑ Ð² ÑÑом же конÑейнеÑе до запÑÑка оÑновного пÑоÑеÑÑа. ÐÑиÑиалÑнÑй Docker-обÑаз поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ñакие дейÑÑвиÑ.
+
+## ÐÑиÑиалÑнÑй Docker-обÑаз Ñ Gunicorn и Uvicorn
+
+Я подгоÑовил Ð´Ð»Ñ ÐÐ°Ñ Docker-обÑаз, в коÑоÑÑй вклÑÑÑн Gunicorn ÑпÑавлÑÑÑий пÑоÑеÑÑами (воÑкеÑами) Uvicorn, в ÑооÑвеÑÑÑвии Ñ ÐºÐ¾Ð½ÑепÑиÑми ÑаÑÑмоÑÑеннÑми в пÑедÑдÑÑей главе: [РабоÑие пÑоÑеÑÑÑ ÑеÑвеÑа (воÑкеÑÑ) - Gunicorn ÑовмеÑÑно Ñ Uvicorn](./server-workers.md){.internal-link target=_blank}.
+
+ÐÑÐ¾Ñ Ð¾Ð±Ñаз Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½ Ð´Ð»Ñ ÑиÑÑаÑий опиÑаннÑÑ
ÑÑÑ: [ÐножеÑÑво пÑоÑеÑÑов внÑÑÑи конÑейнеÑа Ð´Ð»Ñ Ð¾ÑобÑÑ
ÑлÑÑаев](#special-cases).
+
+* tiangolo/uvicorn-gunicorn-fastapi.
+
+!!! warning "ÐÑедÑпÑеждение"
+ СкоÑее вÑего Ñ ÐÐ°Ñ **Ð½ÐµÑ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑи** в иÑполÑзовании ÑÑого обÑаза или подобного ÐµÐ¼Ñ Ð¸ лÑÑÑе ÑоздаÑÑ Ñвой обÑаз Ñ Ð½ÑÐ»Ñ ÐºÐ°Ðº опиÑано ÑÑÑ: [СоздаÑÑ Docker-обÑаз Ð´Ð»Ñ FastAPI](#docker-fastapi).
+
+Ð ÑÑом обÑазе еÑÑÑ **авÑомаÑиÑеÑкий** меÑ
анизм подÑÑÑойки Ð´Ð»Ñ Ð·Ð°Ð¿ÑÑка **необÑ
одимого колиÑеÑÑва пÑоÑеÑÑов** в ÑооÑвеÑÑÑвии Ñ Ð´Ð¾ÑÑÑпнÑм колиÑеÑÑвом ÑÐ´ÐµÑ Ð¿ÑоÑеÑÑоÑа.
+
+РнÑм ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ **ÑазÑмнÑе знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ**, но можно изменÑÑÑ Ð¸ обновлÑÑÑ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ **пеÑеменнÑÑ
окÑÑжениÑ** или конÑигÑÑаÑионнÑÑ
Ñайлов.
+
+Ðн Ñакже поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿ÑоÑ
ождение **ÐодгоÑовиÑелÑнÑÑ
Ñагов пÑи запÑÑке конÑейнеÑов** пÑи помоÑи ÑкÑипÑа.
+
+!!! tip "ÐодÑказка"
+ ÐÐ»Ñ Ð¿ÑоÑмоÑÑа вÑеÑ
возможнÑÑ
наÑÑÑоек пеÑейдиÑе на ÑÑÑаниÑÑ ÑÑого Docker-обÑаза: tiangolo/uvicorn-gunicorn-fastapi.
+
+### ÐолиÑеÑÑво пÑоÑеÑÑов в оÑиÑиалÑном Docker-обÑазе
+
+**ÐолиÑеÑÑво пÑоÑеÑÑов** в ÑÑом обÑазе **вÑÑиÑлÑеÑÑÑ Ð°Ð²ÑомаÑиÑеÑки** и завиÑÐ¸Ñ Ð¾Ñ Ð´Ð¾ÑÑÑпного колиÑеÑÑва **ÑдеÑ** ÑенÑÑалÑного пÑоÑеÑÑоÑа.
+
+ÐÑо ознаÑаеÑ, ÑÑо он бÑÐ´ÐµÑ Ð¿ÑÑаÑÑÑÑ **вÑжаÑÑ** из пÑоÑеÑÑоÑа как можно болÑÑе **пÑоизводиÑелÑноÑÑи**.
+
+Ðо ÐÑ Ð¼Ð¾Ð¶ÐµÑе изменÑÑÑ Ð¸ обновлÑÑÑ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ **пеÑеменнÑÑ
окÑÑжениÑ** и Ñ.п.
+
+ÐоÑколÑÐºÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво пÑоÑеÑÑов завиÑÐ¸Ñ Ð¾Ñ Ð¿ÑоÑеÑÑоÑа, на коÑоÑом ÑабоÑÐ°ÐµÑ ÐºÐ¾Ð½ÑейнеÑ, **обÑÑм поÑÑеблÑемой памÑÑи** Ñакже бÑÐ´ÐµÑ Ð·Ð°Ð²Ð¸ÑеÑÑ Ð¾Ñ ÑÑого.
+
+РзнаÑиÑ, еÑли ÐаÑÐµÐ¼Ñ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑÑебÑеÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ опеÑаÑивной памÑÑи (напÑимеÑ, оно иÑполÑзÑÐµÑ Ð¼Ð¾Ð´ÐµÐ»Ð¸ маÑинного обÑÑениÑ) и ÐÐ°Ñ ÑеÑÐ²ÐµÑ Ð¸Ð¼ÐµÐµÑ ÑенÑÑалÑнÑй пÑоÑеÑÑÐ¾Ñ Ñ Ð±Ð¾Ð»ÑÑим колиÑеÑÑвом ÑдеÑ, но **не ÑлиÑком болÑÑим обÑÑмом опеÑаÑивной памÑÑи**, Ñо Ð¼Ð¾Ð¶ÐµÑ Ð´Ð¾Ð¹Ñи до Ñого, ÑÑо конÑÐµÐ¹Ð½ÐµÑ Ð¿Ð¾Ð¿ÑÑаеÑÑÑ Ð·Ð°Ð½ÑÑÑ Ð¿Ð°Ð¼ÑÑи болÑÑе, Ñем доÑÑÑпно, из-за Ñего бÑÐ´ÐµÑ Ð¿Ð°Ð´ÐµÐ½Ð¸Ðµ пÑоизводиÑелÑноÑÑи (или ÑеÑÐ²ÐµÑ Ð²Ð¾Ð²Ñе ÑпадÑÑ). ð¨
+
+
+### ÐапиÑание `Dockerfile`
+
+ÐÑак, ÑепеÑÑ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ напиÑаÑÑ `Dockerfile` оÑнованнÑй на ÑÑом оÑиÑиалÑном Docker-обÑазе:
+
+```Dockerfile
+FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9
+
+COPY ./requirements.txt /app/requirements.txt
+
+RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt
+
+COPY ./app /app
+```
+
+### ÐолÑÑие пÑиложениÑ
+
+ÐÑли ÐÑ ÑÑпели ознакомиÑÑÑÑ Ñ Ñазделом [ÐÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑодеÑжаÑие много Ñайлов](../tutorial/bigger-applications.md){.internal-link target=_blank}, ÑоÑÑоÑÑие из множеÑÑва Ñайлов, ÐÐ°Ñ Dockerfile Ð¼Ð¾Ð¶ÐµÑ Ð²ÑглÑдеÑÑ Ñак:
+
+```Dockerfile hl_lines="7"
+FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9
+
+COPY ./requirements.txt /app/requirements.txt
+
+RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt
+
+COPY ./app /app/app
+```
+
+### Ðак им полÑзоваÑÑÑÑ
+
+ÐÑли ÐÑ Ð¸ÑполÑзÑеÑе **Kubernetes** (или ÑÑо-Ñо вÑоде Ñого), ÑкоÑее вÑего Ðам **не нÑжно** иÑполÑзоваÑÑ Ð¾ÑиÑиалÑнÑй Docker-обÑаз (или дÑÑгой поÑ
ожий) в каÑеÑÑве оÑновÑ, Ñак как ÑпÑавление **колиÑеÑÑвом запÑÑеннÑÑ
конÑейнеÑов** должно бÑÑÑ Ð½Ð°ÑÑÑоено на ÑÑовне клаÑÑеÑа. Ð Ñаком ÑлÑÑае лÑÑÑе **ÑоздаÑÑ Ð¾Ð±Ñаз Ñ Ð½ÑлÑ**, как опиÑано в Ñазделе СоздаÑÑ [Docker-обÑаз Ð´Ð»Ñ FastAPI](#docker-fastapi).
+
+ÐÑиÑиалÑнÑй обÑаз Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½ в оÑделÑнÑÑ
ÑлÑÑаÑÑ
, опиÑаннÑÑ
вÑÑе в Ñазделе [ÐножеÑÑво пÑоÑеÑÑов внÑÑÑи конÑейнеÑа Ð´Ð»Ñ Ð¾ÑобÑÑ
ÑлÑÑаев](#special-cases). ÐапÑимеÑ, еÑли ÐаÑе пÑиложение **доÑÑаÑоÑно пÑоÑÑое**, не ÑÑебÑÐµÑ Ð·Ð°Ð¿ÑÑка в клаÑÑеÑе и ÑпоÑобно ÑмеÑÑиÑÑÑÑ Ð² один конÑейнеÑ, Ñо его наÑÑÑойки по ÑмолÑÐ°Ð½Ð¸Ñ Ð±ÑдÑÑ ÑабоÑаÑÑ Ð´Ð¾Ð²Ð¾Ð»Ñно Ñ
оÑоÑо. Ðли же ÐÑ ÑазвеÑÑÑваеÑе его Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ **Docker Compose**, ÑабоÑаеÑе на одном ÑеÑвеÑе и Ñ. д
+
+## РазвÑÑÑÑвание обÑаза конÑейнеÑа
+
+ÐоÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±Ñаза конÑейнеÑа ÑÑÑеÑÑвÑÐµÑ Ð½ÐµÑколÑко ÑпоÑобов его ÑазвÑÑÑÑваниÑ.
+
+ÐапÑимеÑ:
+
+* С иÑполÑзованием **Docker Compose** пÑи ÑазвÑÑÑÑвании на одном ÑеÑвеÑе
+* С иÑполÑзованием **Kubernetes** в клаÑÑеÑе
+* С иÑполÑзованием Ñежима Docker Swarm в клаÑÑеÑе
+* С иÑполÑзованием дÑÑгиÑ
инÑÑÑÑменÑов, ÑакиÑ
как Nomad
+* С иÑполÑзованием облаÑного ÑеÑвиÑа, коÑоÑÑй бÑÐ´ÐµÑ ÑпÑавлÑÑÑ ÑазвоÑаÑиванием ÐаÑего конÑейнеÑа
+
+## Docker-обÑаз и Poetry
+
+ÐÑли ÐÑ Ð¿Ð¾Ð»ÑзÑеÑеÑÑ Poetry Ð´Ð»Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑÑми ÐаÑего пÑоекÑа, Ñо можеÑе иÑполÑзоваÑÑ Ð¼Ð½Ð¾Ð³Ð¾ÑÑапнÑÑ ÑбоÑÐºÑ Ð¾Ð±Ñаза:
+
+```{ .dockerfile .annotate }
+# (1)
+FROM python:3.9 as requirements-stage
+
+# (2)
+WORKDIR /tmp
+
+# (3)
+RUN pip install poetry
+
+# (4)
+COPY ./pyproject.toml ./poetry.lock* /tmp/
+
+# (5)
+RUN poetry export -f requirements.txt --output requirements.txt --without-hashes
+
+# (6)
+FROM python:3.9
+
+# (7)
+WORKDIR /code
+
+# (8)
+COPY --from=requirements-stage /tmp/requirements.txt /code/requirements.txt
+
+# (9)
+RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
+
+# (10)
+COPY ./app /code/app
+
+# (11)
+CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
+```
+
+1. ÐÑо пеÑвÑй ÑÑап, коÑоÑÐ¾Ð¼Ñ Ð¼Ñ Ð´Ð°Ð´Ð¸Ð¼ Ð¸Ð¼Ñ `requirements-stage`.
+
+2. УÑÑановиÑе диÑекÑоÑÐ¸Ñ `/tmp` в каÑеÑÑве ÑабоÑей диÑекÑоÑии.
+
+ Рней бÑÐ´ÐµÑ Ñоздан Ñайл `requirements.txt`
+
+3. Ðа ÑÑом Ñаге ÑÑÑановиÑе Poetry.
+
+4. СкопиÑÑйÑе ÑÐ°Ð¹Ð»Ñ `pyproject.toml` и `poetry.lock` в диÑекÑоÑÐ¸Ñ `/tmp`.
+
+ ÐоÑколÑÐºÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ Ñайла напиÑано как `./poetry.lock*` (Ñ `*` в конÑе), Ñо ниÑего не ÑломаеÑÑÑ, еÑли Ñакой Ñайл не бÑÐ´ÐµÑ Ð½Ð°Ð¹Ð´ÐµÐ½.
+
+5. СоздайÑе Ñайл `requirements.txt`.
+
+6. ÐÑо вÑоÑой (и поÑледний) ÑÑап ÑбоÑки, коÑоÑÑй и ÑоздаÑÑ Ð¾ÐºÐ¾Ð½ÑаÑелÑнÑй обÑаз конÑейнеÑа.
+
+7. УÑÑановиÑе диÑекÑоÑÐ¸Ñ `/code` в каÑеÑÑве ÑабоÑей.
+
+8. СкопиÑÑйÑе Ñайл `requirements.txt` в диÑекÑоÑÐ¸Ñ `/code`.
+
+ ÐÑÐ¾Ñ Ñайл наÑ
одиÑÑÑ Ð² обÑазе, Ñозданном на пÑедÑдÑÑем ÑÑапе, коÑоÑÐ¾Ð¼Ñ Ð¼Ñ Ð´Ð°Ð»Ð¸ Ð¸Ð¼Ñ requirements-stage, поÑÐ¾Ð¼Ñ Ð¿Ñи копиÑовании нÑжно напиÑаÑÑ `--from-requirements-stage`.
+
+9. УÑÑановиÑе завиÑимоÑÑи, ÑказаннÑе в Ñайле `requirements.txt`.
+
+10. СкопиÑÑйÑе Ð¿Ð°Ð¿ÐºÑ `app` в Ð¿Ð°Ð¿ÐºÑ `/code`.
+
+11. ÐапÑÑÑиÑе `uvicorn`, Ñказав ÐµÐ¼Ñ Ð¸ÑполÑзоваÑÑ Ð¾Ð±ÑÐµÐºÑ `app`, ÑаÑположеннÑй в `app.main`.
+
+!!! tip "ÐодÑказка"
+ ÐÑли ÑкнÑÑе на кÑÑжок Ñ Ð¿Ð»ÑÑом, Ñо ÑвидиÑе обÑÑÑнениÑ, ÑÑо пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð² ÑÑой ÑÑÑоке.
+
+**ÐÑÐ°Ð¿Ñ ÑбоÑки Docker-обÑаза** ÑвлÑÑÑÑÑ ÑаÑÑÑÑ `Dockerfile` и ÑабоÑаÑÑ ÐºÐ°Ðº **вÑеменнÑе обÑÐ°Ð·Ñ ÐºÐ¾Ð½ÑейнеÑов**. Ðни нÑÐ¶Ð½Ñ ÑолÑко Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñайлов, иÑполÑзÑемÑÑ
в далÑнейÑиÑ
ÑÑапаÑ
.
+
+ÐеÑвÑй ÑÑап бÑл нÑжен ÑолÑко Ð´Ð»Ñ **ÑÑÑановки Poetry** и **ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñайла `requirements.txt`**, в коÑоÑÑм пÑопиÑÐ°Ð½Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑи ÐаÑего пÑоекÑа, взÑÑÑе из Ñайла `pyproject.toml`.
+
+Ðа **ÑледÑÑÑем ÑÑапе** `pip` бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ Ñайл `requirements.txt`.
+
+РиÑоговом обÑазе бÑÐ´ÐµÑ ÑодеÑжаÑÑÑÑ **ÑолÑко поÑледний ÑÑап ÑбоÑки**, пÑедÑдÑÑие ÑÑÐ°Ð¿Ñ Ð±ÑдÑÑ Ð¾ÑбÑоÑенÑ.
+
+ÐÑи иÑполÑзовании Poetry, Ð¸Ð¼ÐµÐµÑ ÑмÑÑл иÑполÑзоваÑÑ **многоÑÑапнÑÑ ÑбоÑÐºÑ Docker-обÑаза**, поÑÐ¾Ð¼Ñ ÑÑо на Ñамом деле Ðам не нÑжен Poetry и его завиÑимоÑÑи в оконÑаÑелÑном обÑазе конÑейнеÑа, Ðам **нÑжен ÑолÑко** ÑгенеÑиÑованнÑй Ñайл `requirements.txt` Ð´Ð»Ñ ÑÑÑановки завиÑимоÑÑей ÐаÑего пÑоекÑа.
+
+Рна поÑледнем ÑÑапе, пÑидеÑживаÑÑÑ Ð¾Ð¿Ð¸ÑаннÑÑ
Ñанее пÑавил, ÑоздаÑÑÑÑ Ð¸ÑоговÑй обÑаз
+
+### ÐÑполÑзование пÑокÑи-ÑеÑвеÑа завеÑÑÐµÐ½Ð¸Ñ TLS и Poetry
+
+Ð Ñнова повÑоÑÑÑÑ, еÑли иÑполÑзÑеÑе пÑокÑи-ÑеÑÐ²ÐµÑ (баланÑиÑовÑик нагÑÑзки), Ñакой, как Nginx или Traefik, добавÑÑе в ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð·Ð°Ð¿ÑÑка опÑÐ¸Ñ `--proxy-headers`:
+
+```Dockerfile
+CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"]
+```
+
+## РезÑме
+
+ÐÑи помоÑи ÑиÑÑем конÑейнеÑизаÑии (ÑакиÑ
, как **Docker** и **Kubernetes**), ÑÑановиÑÑÑ Ð´Ð¾Ð²Ð¾Ð»Ñно пÑоÑÑо обÑабаÑÑваÑÑ Ð²Ñе **конÑепÑии ÑазвеÑÑÑваниÑ**:
+
+* ÐÑполÑзование более безопаÑного пÑоÑокола HTTPS
+* ÐаÑÑÑойки запÑÑка пÑиложениÑ
+* ÐеÑезагÑÑзка пÑиложениÑ
+* ÐапÑÑк неÑколÑкиÑ
ÑкземплÑÑов пÑиложениÑ
+* УпÑавление памÑÑÑÑ
+* ÐÑполÑзование пеÑеÑиÑленнÑÑ
ÑÑнкÑий пеÑед запÑÑком пÑиложениÑ
+
+РболÑÑинÑÑве ÑлÑÑаев Ðам, веÑоÑÑно, не нÑжно иÑполÑзоваÑÑ ÐºÐ°ÐºÐ¾Ð¹-либо базовÑй обÑаз, **лÑÑÑе ÑоздаÑÑ Ð¾Ð±Ñаз конÑейнеÑа Ñ Ð½ÑлÑ** на оÑнове оÑиÑиалÑного Docker-обÑаза Python.
+
+ÐозабоÑивÑиÑÑ Ð¾ **поÑÑдке напиÑаниÑ** инÑÑÑÑкÑий в `Dockerfile`, ÐÑ ÑможеÑе иÑполÑзоваÑÑ **кÑÑ Docker'а**, **минимизиÑовав вÑÐµÐ¼Ñ ÑбоÑки**, макÑималÑно повÑÑив ÑÐ²Ð¾Ñ Ð¿ÑоизводиÑелÑноÑÑÑ (и избежаÑÑ ÑкÑки). ð
+
+РнекоÑоÑÑÑ
оÑобÑÑ
ÑлÑÑаÑÑ
Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð¾ÑиÑиалÑнÑй обÑаз Docker Ð´Ð»Ñ FastAPI. ð¤