@@ -40,7 +40,7 @@ Deploying to FastAPI Cloud...
## Про FastAPI Cloud { #about-fastapi-cloud }
-**
FastAPI Cloud** створено тим самим автором і командою, що стоїть за **FastAPI**.
+**[FastAPI Cloud](https://fastapicloud.com)** створено тим самим автором і командою, що стоїть за **FastAPI**.
Він спрощує процес **створення**, **розгортання** та **доступу** до API з мінімальними зусиллями.
diff --git a/docs/uk/docs/deployment/https.md b/docs/uk/docs/deployment/https.md
index 29329c88f0..db6cda6367 100644
--- a/docs/uk/docs/deployment/https.md
+++ b/docs/uk/docs/deployment/https.md
@@ -10,31 +10,31 @@
///
-Щоб вивчити основи HTTPS з точки зору споживача, перегляньте
https://howhttps.works/.
-
-Тепер, з точки зору розробника, ось кілька речей, які варто пам'ятати, розмірковуючи про HTTPS:
-
-* Для HTTPS сервер має мати «сертифікати», видані третьою стороною.
- * Насправді ці сертифікати «отримуються» у третьої сторони, а не «генеруються».
-* Сертифікати мають строк дії.
- * Їхній строк дії спливає.
- * І тоді їх потрібно поновити, знову отримавши у третьої сторони.
-* Шифрування з'єднання відбувається на рівні TCP.
- * Це один шар нижче від HTTP.
- * Тож обробка сертифіката та шифрування виконується до HTTP.
-* TCP не знає про «домени». Лише про IP-адреси.
- * Інформація про конкретний домен, який запитується, міститься в даних HTTP.
-* Сертифікати HTTPS «засвідчують» певний домен, але протокол і шифрування працюють на рівні TCP, до того як відомо, з яким доменом маємо справу.
-* Типово це означало б, що на одну IP-адресу можна мати лише один сертифікат HTTPS.
+Щоб **вивчити основи HTTPS** з точки зору споживача, перегляньте [https://howhttps.works/](https://howhttps.works/).
+
+Тепер, з **точки зору розробника**, ось кілька речей, які варто пам'ятати, розмірковуючи про HTTPS:
+
+* Для HTTPS **сервер** має **мати «сертифікати»**, видані **третьою стороною**.
+ * Насправді ці сертифікати **«отримуються»** у третьої сторони, а не **«генеруються»**.
+* Сертифікати мають **строк дії**.
+ * Їхній строк дії **спливає**.
+ * І тоді їх потрібно **поновити**, **знову отримавши** у третьої сторони.
+* Шифрування з'єднання відбувається на **рівні TCP**.
+ * Це один шар **нижче від HTTP**.
+ * Тож **обробка сертифіката та шифрування** виконується **до HTTP**.
+* **TCP не знає про «домени»**. Лише про IP-адреси.
+ * Інформація про **конкретний домен**, який запитується, міститься в **даних HTTP**.
+* **Сертифікати HTTPS** «засвідчують» **певний домен**, але протокол і шифрування працюють на рівні TCP, **до того як відомо**, з яким доменом маємо справу.
+* **Типово**, це означало б, що на одну IP-адресу можна мати **лише один сертифікат HTTPS**.
* Неважливо, наскільки великий ваш сервер або наскільки малий кожен застосунок на ньому.
- * Однак для цього є рішення.
-* Є розширення протоколу TLS (який обробляє шифрування на рівні TCP, до HTTP), що називається
SNI.
- * Це розширення SNI дозволяє одному серверу (з однією IP-адресою) мати кілька сертифікатів HTTPS і обслуговувати кілька доменів/застосунків по HTTPS.
- * Щоб це працювало, один-єдиний компонент (програма), що працює на сервері та слухає публічну IP-адресу, має мати всі сертифікати HTTPS на сервері.
-* Після отримання захищеного з'єднання протокол обміну все ще HTTP.
- * Вміст зашифровано, хоча він надсилається протоколом HTTP.
+ * Однак для цього є **рішення**.
+* Є **розширення** протоколу **TLS** (який обробляє шифрування на рівні TCP, до HTTP), що називається **[
SNI](https://en.wikipedia.org/wiki/Server_Name_Indication)**.
+ * Це розширення SNI дозволяє одному серверу (з **однією IP-адресою**) мати **кілька сертифікатів HTTPS** і обслуговувати **кілька доменів/застосунків через HTTPS**.
+ * Щоб це працювало, один-єдиний компонент (програма), що працює на сервері та слухає **публічну IP-адресу**, має мати **всі сертифікати HTTPS** на сервері.
+* **Після** отримання захищеного з'єднання протокол обміну **залишається HTTP**.
+ * Вміст **зашифровано**, хоча він надсилається з використанням **протоколу HTTP**.
-Поширена практика мати одну програму/HTTP-сервер, що працює на сервері (машині, хості тощо) і керує всіма частинами HTTPS: приймає зашифровані HTTPS-запити, надсилає розшифровані HTTP-запити до фактичного HTTP-застосунку, що працює на тому ж сервері (у нашому випадку застосунок FastAPI), отримує HTTP-відповідь від застосунку, шифрує її за допомогою відповідного сертифіката HTTPS і надсилає її назад клієнту через HTTPS. Такий сервер часто називають
TLS Termination Proxy.
+Поширена практика мати **одну програму/HTTP-сервер**, що працює на сервері (машині, хості тощо) і **керує всіма частинами HTTPS**: приймає **зашифровані HTTPS-запити**, надсилає **розшифровані HTTP-запити** до фактичного HTTP-застосунку, що працює на тому ж сервері (у нашому випадку застосунок **FastAPI**), отримує **HTTP-відповідь** від застосунку, **шифрує її** за допомогою відповідного **сертифіката HTTPS** і надсилає її назад клієнту через **HTTPS**. Такий сервер часто називають **[TLS Termination Proxy](https://en.wikipedia.org/wiki/TLS_termination_proxy)**.
Деякі варіанти, які ви можете використати як TLS Termination Proxy:
@@ -45,17 +45,17 @@
## Let's Encrypt { #lets-encrypt }
-До Let's Encrypt ці сертифікати HTTPS продавалися довіреними третіми сторонами.
+До Let's Encrypt ці **сертифікати HTTPS** продавалися довіреними третіми сторонами.
Процес отримання одного з таких сертифікатів був громіздким, вимагав чимало паперової роботи, а самі сертифікати були доволі дорогими.
-Але потім з'явився проєкт
Let's Encrypt.
+Але потім з'явився проєкт **[Let's Encrypt](https://letsencrypt.org/)**.
-Це проєкт Linux Foundation. Він надає сертифікати HTTPS безкоштовно, в автоматизований спосіб. Ці сертифікати використовують усі стандартні криптографічні механізми безпеки і є короткостроковими (близько 3 місяців), тож безпека насправді краща завдяки зменшеній тривалості життя.
+Це проєкт Linux Foundation. Він надає **сертифікати HTTPS безкоштовно**, в автоматизований спосіб. Ці сертифікати використовують усі стандартні криптографічні механізми безпеки і є короткостроковими (близько 3 місяців), тож **безпека насправді краща** завдяки зменшеній тривалості життя.
Домени безпечно перевіряються, а сертифікати генеруються автоматично. Це також дозволяє автоматизувати поновлення цих сертифікатів.
-Ідея полягає в автоматизації отримання та поновлення цих сертифікатів, щоб ви могли мати безпечний HTTPS безкоштовно та назавжди.
+Ідея полягає в автоматизації отримання та поновлення цих сертифікатів, щоб ви могли мати **безпечний HTTPS, безкоштовно і назавжди**.
## HTTPS для розробників { #https-for-developers }
@@ -63,11 +63,11 @@
### Доменне ім'я { #domain-name }
-Ймовірно, все почнеться з того, що ви придбаєте якесь доменне ім'я. Потім ви налаштуєте його на сервері DNS (можливо, у вашого ж хмарного провайдера).
+Ймовірно, все почнеться з того, що ви **придбаєте** якесь **доменне ім'я**. Потім ви налаштуєте його на сервері DNS (можливо, у вашого ж хмарного провайдера).
-Ви, скоріш за все, отримаєте хмарний сервер (віртуальну машину) або щось подібне, і він матиме
фіксовану публічну IP-адресу.
+Ви, скоріш за все, отримаєте хмарний сервер (віртуальну машину) або щось подібне, і він матиме
фіксовану **публічну IP-адресу**.
-На сервері(ах) DNS ви налаштуєте запис («`A record`»), щоб спрямувати ваш домен на публічну IP-адресу вашого сервера.
+На сервері(ах) DNS ви налаштуєте запис («`A record`»), щоб спрямувати **ваш домен** на публічну **IP-адресу вашого сервера**.
Ймовірно, ви зробите це лише один раз, уперше, коли все налаштовуватимете.
@@ -81,136 +81,136 @@
Тепер зосередьмося на всіх власне частинах HTTPS.
-Спочатку браузер звернеться до серверів DNS, щоб дізнатися, яка IP-адреса для домену, у цьому випадку `someapp.example.com`.
+Спочатку браузер звернеться до **DNS-серверів**, щоб дізнатися, яка **IP-адреса для домену**, у цьому випадку `someapp.example.com`.
-Сервери DNS повідомлять браузеру використати конкретну IP-адресу. Це буде публічна IP-адреса, яку використовує ваш сервер і яку ви налаштували на серверах DNS.
+Сервери DNS повідомлять браузеру використати конкретну **IP-адресу**. Це буде публічна IP-адреса, яку використовує ваш сервер і яку ви налаштували на серверах DNS.

### Початок TLS рукостискання { #tls-handshake-start }
-Потім браузер зв'яжеться з цією IP-адресою на порту 443 (порт HTTPS).
+Потім браузер зв'яжеться з цією IP-адресою на **порту 443** (порт HTTPS).
Перша частина комунікації - це просто встановлення з'єднання між клієнтом і сервером та узгодження криптографічних ключів тощо.

-Ця взаємодія між клієнтом і сервером для встановлення з'єднання TLS називається TLS рукостисканням.
+Ця взаємодія між клієнтом і сервером для встановлення з'єднання TLS називається **TLS рукостисканням**.
### TLS із розширенням SNI { #tls-with-sni-extension }
-Лише один процес на сервері може слухати конкретний порт на конкретній IP-адресі. Інші процеси можуть слухати інші порти на тій самій IP-адресі, але лише один для кожної комбінації IP-адреси та порту.
+**Лише один процес** на сервері може слухати конкретний **порт** на конкретній **IP-адресі**. Інші процеси можуть слухати інші порти на тій самій IP-адресі, але лише один для кожної комбінації IP-адреси та порту.
TLS (HTTPS) за замовчуванням використовує конкретний порт `443`. Отже, це порт, який нам потрібен.
-Оскільки лише один процес може слухати цей порт, процесом, що робитиме це, буде TLS Termination Proxy.
+Оскільки лише один процес може слухати цей порт, процесом, що робитиме це, буде **TLS Termination Proxy**.
-TLS Termination Proxy матиме доступ до одного або кількох сертифікатів TLS (сертифікатів HTTPS).
+TLS Termination Proxy матиме доступ до одного або кількох **сертифікатів TLS** (сертифікатів HTTPS).
-Використовуючи обговорене вище розширення SNI, TLS Termination Proxy перевірить, який із наявних сертифікатів TLS (HTTPS) слід використати для цього з'єднання, обравши той, що відповідає домену, очікуваному клієнтом.
+Використовуючи **розширення SNI**, обговорене вище, TLS Termination Proxy перевірить, який із наявних сертифікатів TLS (HTTPS) слід використати для цього з'єднання, обравши той, що відповідає домену, очікуваному клієнтом.
У цьому випадку він використає сертифікат для `someapp.example.com`.

-Клієнт уже довіряє сутності, яка видала цей сертифікат TLS (у цьому випадку Let's Encrypt, але про це згодом), тож він може перевірити, що сертифікат дійсний.
+Клієнт уже **довіряє** сутності, яка видала цей сертифікат TLS (у цьому випадку Let's Encrypt, але про це згодом), тож він може **перевірити**, що сертифікат дійсний.
-Потім, використовуючи сертифікат, клієнт і TLS Termination Proxy узгоджують, як шифрувати решту TCP-комунікації. На цьому частина TLS рукостискання завершується.
+Потім, використовуючи сертифікат, клієнт і TLS Termination Proxy **вирішать, як шифрувати** решту **TCP-комунікації**. На цьому частина **TLS рукостискання** завершується.
-Після цього клієнт і сервер мають зашифроване TCP-з'єднання - саме це надає TLS. І тоді вони можуть використати це з'єднання, щоб почати власне HTTP-комунікацію.
+Після цього клієнт і сервер мають **зашифроване TCP-з'єднання** - саме це надає TLS. І тоді вони можуть використати це з'єднання, щоб почати власне **HTTP-комунікацію**.
-І це і є HTTPS: це звичайний HTTP усередині захищеного TLS-з'єднання замість чистого (незашифрованого) TCP-з'єднання.
+І це і є **HTTPS**: це звичайний **HTTP** усередині **захищеного TLS-з'єднання** замість чистого (незашифрованого) TCP-з'єднання.
/// tip | Порада
-Зверніть увагу, що шифрування комунікації відбувається на рівні TCP, а не на рівні HTTP.
+Зверніть увагу, що шифрування комунікації відбувається на **рівні TCP**, а не на рівні HTTP.
///
### HTTPS-запит { #https-request }
-Тепер, коли клієнт і сервер (конкретно браузер і TLS Termination Proxy) мають зашифроване TCP-з'єднання, вони можуть почати HTTP-комунікацію.
+Тепер, коли клієнт і сервер (конкретно браузер і TLS Termination Proxy) мають **зашифроване TCP-з'єднання**, вони можуть почати **HTTP-комунікацію**.
-Отже, клієнт надсилає HTTPS-запит. Це просто HTTP-запит через зашифроване TLS-з'єднання.
+Отже, клієнт надсилає **HTTPS-запит**. Це просто HTTP-запит через зашифроване TLS-з'єднання.

### Розшифрування запиту { #decrypt-the-request }
-TLS Termination Proxy використає узгоджене шифрування, щоб розшифрувати запит, і передасть звичайний (розшифрований) HTTP-запит процесу, що запускає застосунок (наприклад, процесу з Uvicorn, який запускає застосунок FastAPI).
+TLS Termination Proxy використає узгоджене шифрування, щоб **розшифрувати запит**, і передасть **звичайний (розшифрований) HTTP-запит** процесу, що запускає застосунок (наприклад, процесу з Uvicorn, який запускає застосунок FastAPI).

### HTTP-відповідь { #http-response }
-Застосунок обробить запит і надішле звичайну (незашифровану) HTTP-відповідь TLS Termination Proxy.
+Застосунок обробить запит і надішле **звичайну (незашифровану) HTTP-відповідь** TLS Termination Proxy.

### HTTPS-відповідь { #https-response }
-Потім TLS Termination Proxy зашифрує відповідь, використовуючи попередньо узгоджену криптографію (що почалася із сертифіката для `someapp.example.com`), і надішле її назад у браузер.
+Потім TLS Termination Proxy **зашифрує відповідь**, використовуючи попередньо узгоджену криптографію (що почалася із сертифіката для `someapp.example.com`), і надішле її назад у браузер.
-Далі браузер перевірить, що відповідь дійсна й зашифрована правильним криптографічним ключем тощо. Потім він розшифрує відповідь і обробить її.
+Далі браузер перевірить, що відповідь дійсна й зашифрована правильним криптографічним ключем тощо. Потім він **розшифрує відповідь** і обробить її.

-Клієнт (браузер) знатиме, що відповідь надходить від правильного сервера, тому що використовується узгоджена раніше криптографія з використанням сертифіката HTTPS.
+Клієнт (браузер) знатиме, що відповідь надходить від правильного сервера, тому що використовується узгоджена раніше криптографія з використанням **сертифіката HTTPS**.
### Кілька застосунків { #multiple-applications }
-На тому самому сервері (або серверах) може бути кілька застосунків, наприклад інші програми API або база даних.
+На тому самому сервері (або серверах) може бути **кілька застосунків**, наприклад інші програми API або база даних.
-Лише один процес може обробляти конкретну IP-адресу і порт (TLS Termination Proxy у нашому прикладі), але інші застосунки/процеси також можуть працювати на сервері(ах), доки вони не намагаються використати ту саму комбінацію публічної IP-адреси й порту.
+Лише один процес може обробляти конкретну IP-адресу і порт (TLS Termination Proxy у нашому прикладі), але інші застосунки/процеси також можуть працювати на сервері(ах), доки вони не намагаються використати ту саму **комбінацію публічної IP-адреси й порту**.

-Таким чином, TLS Termination Proxy може обробляти HTTPS і сертифікати для кількох доменів, для кількох застосунків, а потім передавати запити до відповідного застосунку в кожному випадку.
+Таким чином, TLS Termination Proxy може обробляти HTTPS і сертифікати для **кількох доменів**, для кількох застосунків, а потім передавати запити до відповідного застосунку в кожному випадку.
### Поновлення сертифіката { #certificate-renewal }
-У певний момент у майбутньому строк дії кожного сертифіката спливе (приблизно через 3 місяці після його отримання).
+У певний момент у майбутньому строк дії кожного сертифіката **спливе** (приблизно через 3 місяці після його отримання).
Потім інша програма (в деяких випадках це інша програма, а в деяких - той самий TLS Termination Proxy) зв'яжеться з Let's Encrypt і поновить сертифікат(и).

-Сертифікати TLS пов'язані з доменним іменем, а не з IP-адресою.
+**Сертифікати TLS** пов'язані **з доменним іменем**, а не з IP-адресою.
-Тому, щоб поновити сертифікати, програма поновлення має довести авторитету (Let's Encrypt), що вона справді «володіє» і контролює цей домен.
+Тому, щоб поновити сертифікати, програма поновлення має **довести** авторитету (Let's Encrypt), що вона справді **«володіє» і контролює цей домен**.
Щоб зробити це й задовольнити різні потреби застосунків, є кілька способів. Деякі популярні:
-* Змінити деякі записи DNS.
+* **Змінити деякі записи DNS**.
* Для цього програма поновлення має підтримувати API провайдера DNS, тож залежно від того, якого провайдера DNS ви використовуєте, це може бути або не бути варіантом.
-* Запуститися як сервер (принаймні під час процесу отримання сертифіката) на публічній IP-адресі, пов'язаній із доменом.
+* **Запуститися як сервер** (принаймні під час процесу отримання сертифіката) на публічній IP-адресі, пов'язаній із доменом.
* Як ми казали вище, лише один процес може слухати конкретну IP-адресу та порт.
* Це одна з причин, чому дуже зручно, коли той самий TLS Termination Proxy також займається процесом поновлення сертифікатів.
* Інакше вам, можливо, доведеться на мить зупинити TLS Termination Proxy, запустити програму поновлення, щоб отримати сертифікати, потім налаштувати їх у TLS Termination Proxy і перезапустити TLS Termination Proxy. Це неідеально, оскільки ваші застосунки будуть недоступні під час вимкнення TLS Termination Proxy.
-Увесь цей процес поновлення, паралельно з обслуговуванням застосунку, - одна з головних причин, чому ви можете захотіти мати окрему систему для обробки HTTPS за допомогою TLS Termination Proxy замість того, щоб просто використовувати сертифікати TLS безпосередньо з сервером застосунку (наприклад, Uvicorn).
+Увесь цей процес поновлення, паралельно з обслуговуванням застосунку, - одна з головних причин, чому ви можете захотіти мати **окрему систему для обробки HTTPS** за допомогою TLS Termination Proxy замість того, щоб просто використовувати сертифікати TLS безпосередньо з сервером застосунку (наприклад, Uvicorn).
## Направлені заголовки проксі { #proxy-forwarded-headers }
-Коли ви використовуєте проксі для обробки HTTPS, ваш сервер застосунку (наприклад, Uvicorn через FastAPI CLI) нічого не знає про процес HTTPS, він спілкується звичайним HTTP із TLS Termination Proxy.
+Коли ви використовуєте проксі для обробки HTTPS, ваш **сервер застосунку** (наприклад, Uvicorn через FastAPI CLI) нічого не знає про процес HTTPS, він спілкується звичайним HTTP із **TLS Termination Proxy**.
-Цей проксі зазвичай динамічно встановлює деякі HTTP-заголовки перед передачею запиту серверу застосунку, щоб дати йому знати, що запит направляється проксі.
+Цей **проксі** зазвичай динамічно встановлює деякі HTTP-заголовки перед передачею запиту **серверу застосунку**, щоб дати йому знати, що запит **направляється** проксі.
/// note | Технічні деталі
Заголовки проксі:
-*
X-Forwarded-For
-*
X-Forwarded-Proto
-*
X-Forwarded-Host
+* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For)
+* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto)
+* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host)
///
-Втім, оскільки сервер застосунку не знає, що він стоїть за довіреним проксі, за замовчуванням він не довірятиме цим заголовкам.
+Втім, оскільки **сервер застосунку** не знає, що він стоїть за довіреним **проксі**, за замовчуванням він не довірятиме цим заголовкам.
-Але ви можете налаштувати сервер застосунку, щоб довіряти направленим заголовкам, надісланим проксі. Якщо ви використовуєте FastAPI CLI, ви можете скористатися курсивною *опцією CLI* `--forwarded-allow-ips`, щоб повідомити, з яких IP-адрес слід довіряти цим направленим заголовкам.
+Але ви можете налаштувати **сервер застосунку**, щоб довіряти направленим заголовкам, надісланим **проксі**. Якщо ви використовуєте FastAPI CLI, ви можете скористатися курсивною *опцією CLI* `--forwarded-allow-ips`, щоб повідомити, з яких IP-адрес слід довіряти цим направленим заголовкам.
-Наприклад, якщо сервер застосунку отримує комунікацію лише від довіреного проксі, ви можете встановити `--forwarded-allow-ips="*"`, щоб довіряти всім вхідним IP-адресам, оскільки він отримуватиме запити лише з тієї IP-адреси, яку використовує проксі.
+Наприклад, якщо **сервер застосунку** отримує комунікацію лише від довіреного **проксі**, ви можете встановити `--forwarded-allow-ips="*"`, щоб довіряти всім вхідним IP-адресам, оскільки він отримуватиме запити лише з тієї IP-адреси, яку використовує **проксі**.
Так застосунок зможе знати свою публічну URL-адресу, чи використовує він HTTPS, домен тощо.
@@ -224,8 +224,8 @@ TLS Termination Proxy використає узгоджене шифруванн
## Підсумок { #recap }
-Наявність HTTPS дуже важлива і в більшості випадків критична. Більшість зусиль, які вам як розробнику доведеться докласти навколо HTTPS, полягають лише в розумінні цих концепцій і того, як вони працюють.
+Наявність **HTTPS** дуже важлива і в більшості випадків **критична**. Більшість зусиль, які вам як розробнику доведеться докласти навколо HTTPS, полягають лише в **розумінні цих концепцій** і того, як вони працюють.
-Але як тільки ви знаєте базову інформацію про HTTPS для розробників, ви можете легко комбінувати й налаштовувати різні інструменти, щоб керувати всім просто.
+Але як тільки ви знаєте базову інформацію про **HTTPS для розробників**, ви можете легко комбінувати й налаштовувати різні інструменти, щоб керувати всім просто.
-У деяких наступних розділах я покажу кілька конкретних прикладів налаштування HTTPS для застосунків FastAPI. 🔒
+У деяких наступних розділах я покажу кілька конкретних прикладів налаштування **HTTPS** для застосунків **FastAPI**. 🔒
diff --git a/docs/uk/docs/deployment/index.md b/docs/uk/docs/deployment/index.md
index 7386681397..aa9c1f1fdf 100644
--- a/docs/uk/docs/deployment/index.md
+++ b/docs/uk/docs/deployment/index.md
@@ -16,7 +16,7 @@
Ви можете розгорнути сервер самостійно, використовуючи комбінацію інструментів, можете скористатися **хмарним сервісом**, який виконує частину роботи за вас, або обрати інші варіанти.
-Наприклад, ми, команда, що стоїть за FastAPI, створили
**FastAPI Cloud**, щоб зробити розгортання застосунків FastAPI у хмарі якомога простішим і з тим самим досвідом розробки, що й під час роботи з FastAPI.
+Наприклад, ми, команда, що стоїть за FastAPI, створили [**FastAPI Cloud**](https://fastapicloud.com), щоб зробити розгортання застосунків FastAPI у хмарі якомога простішим і з тим самим досвідом розробки, що й під час роботи з FastAPI.
Я покажу вам кілька основних концепцій, про які, ймовірно, варто пам'ятати під час розгортання **FastAPI**-застосунку (хоча більшість із них стосується будь-яких інших типів веб-застосунків).
diff --git a/docs/uk/docs/deployment/manually.md b/docs/uk/docs/deployment/manually.md
index d70ec5d5d0..7ea2c78e39 100644
--- a/docs/uk/docs/deployment/manually.md
+++ b/docs/uk/docs/deployment/manually.md
@@ -52,11 +52,11 @@ FastAPI використовує стандарт для побудови Python
Є кілька альтернатив, зокрема:
-*
Uvicorn: високопродуктивний ASGI-сервер.
-*
Hypercorn: ASGI-сервер, сумісний з HTTP/2 і Trio, серед інших можливостей.
-*
Daphne: ASGI-сервер, створений для Django Channels.
-*
Granian: Rust HTTP-сервер для Python-застосунків.
-*
NGINX Unit: NGINX Unit - легке й універсальне середовище виконання вебзастосунків.
+* [Uvicorn](https://www.uvicorn.dev/): високопродуктивний ASGI-сервер.
+* [Hypercorn](https://hypercorn.readthedocs.io/): ASGI-сервер, сумісний з HTTP/2 і Trio, серед інших можливостей.
+* [Daphne](https://github.com/django/daphne): ASGI-сервер, створений для Django Channels.
+* [Granian](https://github.com/emmett-framework/granian): Rust HTTP-сервер для Python-застосунків.
+* [NGINX Unit](https://unit.nginx.org/howto/fastapi/): NGINX Unit - легке й універсальне середовище виконання вебзастосунків.
## Серверна машина і серверна програма { #server-machine-and-server-program }
@@ -74,7 +74,7 @@ FastAPI використовує стандарт для побудови Python
Але ви також можете встановити ASGI-сервер вручну.
-Переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md){.internal-link target=_blank}, активували його, після чого можете встановити серверну програму.
+Переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md), активували його, після чого можете встановити серверну програму.
Наприклад, щоб установити Uvicorn:
@@ -137,7 +137,7 @@ Uvicorn та інші сервери підтримують опцію `--reload
Опція `--reload` споживає значно більше ресурсів, є менш стабільною тощо.
-Вона дуже допомагає під час розробки, але її не слід використовувати в продакшні.
+Вона дуже допомагає під час **розробки**, але її **не слід** використовувати в **продакшні**.
///
diff --git a/docs/uk/docs/deployment/server-workers.md b/docs/uk/docs/deployment/server-workers.md
index 81a8bd2a4d..eb488daf23 100644
--- a/docs/uk/docs/deployment/server-workers.md
+++ b/docs/uk/docs/deployment/server-workers.md
@@ -5,7 +5,7 @@
- Безпека - HTTPS
- Запуск під час старту
- Перезапуски
-- Реплікація (кількість процесів, що виконуються)
+- **Реплікація (кількість процесів, що виконуються)**
- Пам'ять
- Попередні кроки перед запуском
@@ -13,13 +13,13 @@
Під час розгортання застосунків ви, найімовірніше, захочете мати реплікацію процесів, щоб використовувати кілька ядер і обробляти більше запитів.
-Як ви бачили в попередньому розділі про [Концепції розгортання](concepts.md){.internal-link target=_blank}, існує кілька стратегій, які можна використовувати.
+Як ви бачили в попередньому розділі про [Концепції розгортання](concepts.md), існує кілька стратегій, які можна використовувати.
Тут я покажу, як використовувати Uvicorn із процесами-працівниками за допомогою команди `fastapi` або безпосередньо команди `uvicorn`.
/// info | Інформація
-Якщо ви використовуєте контейнери, наприклад з Docker або Kubernetes, я розповім про це більше в наступному розділі: [FastAPI у контейнерах - Docker](docker.md){.internal-link target=_blank}.
+Якщо ви використовуєте контейнери, наприклад з Docker або Kubernetes, я розповім про це більше в наступному розділі: [FastAPI у контейнерах - Docker](docker.md).
Зокрема, під час запуску в Kubernetes вам, найімовірніше, не варто використовувати працівників, натомість запускати один процес Uvicorn на контейнер. Але про це я розповім пізніше в тому розділі.
@@ -64,13 +64,13 @@ $
fastapi run --workers 4
INFO Started server process [27368]
INFO Started server process [27369]
INFO Started server process [27370]
- INFO Started server process [27367]
- INFO Waiting for application startup.
+ INFO Started server process [27367]
+ INFO Waiting for application startup.
INFO Waiting for application startup.
INFO Waiting for application startup.
INFO Waiting for application startup.
INFO Application startup complete.
- INFO Application startup complete.
+ INFO Application startup complete.
INFO Application startup complete.
INFO Application startup complete.
```
@@ -117,16 +117,16 @@ $ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4
Із наведеного вище списку концепцій розгортання, використання працівників головним чином допоможе з частиною про реплікацію і трохи з перезапусками, але про інше все ще треба подбати:
-- Безпека - HTTPS
-- Запуск під час старту
+- **Безпека - HTTPS**
+- **Запуск під час старту**
- ***Перезапуски***
- Реплікація (кількість процесів, що виконуються)
-- Пам'ять
-- Попередні кроки перед запуском
+- **Пам'ять**
+- **Попередні кроки перед запуском**
## Контейнери і Docker { #containers-and-docker }
-У наступному розділі про [FastAPI у контейнерах - Docker](docker.md){.internal-link target=_blank} я поясню кілька стратегій, які ви можете використати для інших концепцій розгортання.
+У наступному розділі про [FastAPI у контейнерах - Docker](docker.md) я поясню кілька стратегій, які ви можете використати для інших концепцій розгортання.
Я покажу, як побудувати власний образ з нуля для запуску одного процесу Uvicorn. Це простий процес і, ймовірно, саме те, що потрібно при використанні розподіленої системи керування контейнерами, такої як Kubernetes.
diff --git a/docs/uk/docs/deployment/versions.md b/docs/uk/docs/deployment/versions.md
index 4f6d1b01a2..568ff40ee4 100644
--- a/docs/uk/docs/deployment/versions.md
+++ b/docs/uk/docs/deployment/versions.md
@@ -4,7 +4,7 @@
Нові можливості додаються часто, помилки регулярно виправляються, а код постійно поліпшується.
-Тому поточні версії все ще `0.x.x`, це відображає те, що кожна версія потенційно може містити несумісні зміни. Це відповідає правилам Семантичного версіонування.
+Тому поточні версії все ще `0.x.x`, це відображає те, що кожна версія потенційно може містити несумісні зміни. Це відповідає правилам [Семантичного версіонування](https://semver.org/).
Ви можете створювати продакшн-застосунки з **FastAPI** вже зараз (і, ймовірно, робите це вже певний час), просто переконайтеся, що ви використовуєте версію, яка коректно працює з рештою вашого коду.
@@ -34,7 +34,7 @@ fastapi[standard]>=0.112.0,<0.113.0
## Доступні версії { #available-versions }
-Ви можете переглянути доступні версії (наприклад, щоб перевірити поточну останню) в [Примітках до випусків](../release-notes.md){.internal-link target=_blank}.
+Ви можете переглянути доступні версії (наприклад, щоб перевірити поточну останню) в [Примітках до випусків](../release-notes.md).
## Про версії { #about-versions }
@@ -66,7 +66,7 @@ fastapi>=0.45.0,<0.46.0
Ви повинні додати тести для вашого застосунку.
-З **FastAPI** це дуже легко (завдяки Starlette), перегляньте документацію: [Тестування](../tutorial/testing.md){.internal-link target=_blank}
+З **FastAPI** це дуже легко (завдяки Starlette), перегляньте документацію: [Тестування](../tutorial/testing.md)
Після того як у вас є тести, ви можете оновити версію **FastAPI** до новішої і переконатися, що весь ваш код працює правильно, запустивши тести.
diff --git a/docs/uk/docs/how-to/authentication-error-status-code.md b/docs/uk/docs/how-to/authentication-error-status-code.md
index 58016f261b..d670713711 100644
--- a/docs/uk/docs/how-to/authentication-error-status-code.md
+++ b/docs/uk/docs/how-to/authentication-error-status-code.md
@@ -2,7 +2,7 @@
До версії FastAPI `0.122.0`, коли інтегровані засоби безпеки повертали клієнту помилку після невдалої автентифікації, вони використовували HTTP код статусу `403 Forbidden`.
-Починаючи з версії FastAPI `0.122.0`, вони використовують більш доречний HTTP код статусу `401 Unauthorized` і повертають змістовний заголовок `WWW-Authenticate` у відповіді, відповідно до специфікацій HTTP, RFC 7235, RFC 9110.
+Починаючи з версії FastAPI `0.122.0`, вони використовують більш доречний HTTP код статусу `401 Unauthorized` і повертають змістовний заголовок `WWW-Authenticate` у відповіді, відповідно до специфікацій HTTP, [RFC 7235](https://datatracker.ietf.org/doc/html/rfc7235#section-3.1), [RFC 9110](https://datatracker.ietf.org/doc/html/rfc9110#name-401-unauthorized).
Але якщо з якоїсь причини ваші клієнти залежать від старої поведінки, ви можете повернутися до неї, переписавши метод `make_not_authenticated_error` у ваших класах безпеки.
diff --git a/docs/uk/docs/how-to/conditional-openapi.md b/docs/uk/docs/how-to/conditional-openapi.md
index f8bbaa6498..80c22eeb5d 100644
--- a/docs/uk/docs/how-to/conditional-openapi.md
+++ b/docs/uk/docs/how-to/conditional-openapi.md
@@ -4,13 +4,13 @@
## Про безпеку, API та документацію { #about-security-apis-and-docs }
-Приховування інтерфейсів документації у продукційному середовищі *не має* бути способом захисту вашого API.
+Приховування інтерфейсів документації у продукційному середовищі не має бути способом захисту вашого API.
-Це не додає жодної додаткової безпеки вашому API, *операції шляху* й надалі будуть доступні там, де вони є.
+Це не додає жодної додаткової безпеки вашому API, операції шляху й надалі будуть доступні там, де вони є.
Якщо у вашому коді є вразливість, вона залишиться.
-Приховування документації лише ускладнює розуміння того, як взаємодіяти з вашим API, і може ускладнити для вас його налагодження у продакшні. Це можна вважати просто формою Безпека через неясність.
+Приховування документації лише ускладнює розуміння того, як взаємодіяти з вашим API, і може ускладнити для вас його налагодження у продакшні. Це можна вважати просто формою [Безпека через неясність](https://en.wikipedia.org/wiki/Security_through_obscurity).
Якщо ви хочете захистити ваш API, є кілька кращих дій, які ви можете зробити, наприклад:
diff --git a/docs/uk/docs/how-to/configure-swagger-ui.md b/docs/uk/docs/how-to/configure-swagger-ui.md
index f8c4470dfa..5fe47d12e6 100644
--- a/docs/uk/docs/how-to/configure-swagger-ui.md
+++ b/docs/uk/docs/how-to/configure-swagger-ui.md
@@ -1,6 +1,6 @@
# Налаштуйте Swagger UI { #configure-swagger-ui }
-Ви можете налаштувати додаткові параметри Swagger UI.
+Ви можете налаштувати додаткові [параметри Swagger UI](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/).
Щоб їх налаштувати, передайте аргумент `swagger_ui_parameters` під час створення об’єкта додатка `FastAPI()` або до функції `get_swagger_ui_html()`.
@@ -50,7 +50,7 @@ FastAPI містить деякі параметри конфігурації з
## Інші параметри Swagger UI { #other-swagger-ui-parameters }
-Щоб побачити всі можливі налаштування, які ви можете використовувати, прочитайте офіційну документацію щодо параметрів Swagger UI.
+Щоб побачити всі можливі налаштування, які ви можете використовувати, прочитайте офіційну [документацію щодо параметрів Swagger UI](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/).
## Налаштування лише для JavaScript { #javascript-only-settings }
diff --git a/docs/uk/docs/how-to/custom-docs-ui-assets.md b/docs/uk/docs/how-to/custom-docs-ui-assets.md
index faea3ccc4a..f8a4f99662 100644
--- a/docs/uk/docs/how-to/custom-docs-ui-assets.md
+++ b/docs/uk/docs/how-to/custom-docs-ui-assets.md
@@ -54,7 +54,7 @@ Swagger UI впорається з цим «за лаштунками», але
### Перевірте { #test-it }
-Тепер ви маєте змогу відкрити документацію за http://127.0.0.1:8000/docs і перезавантажити сторінку, вона завантажить ці ресурси з нового CDN.
+Тепер ви маєте змогу відкрити документацію за [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) і перезавантажити сторінку, вона завантажить ці ресурси з нового CDN.
## Самохостинг JavaScript і CSS для документації { #self-hosting-javascript-and-css-for-docs }
@@ -93,12 +93,12 @@ Swagger UI впорається з цим «за лаштунками», але
**Swagger UI** використовує файли:
-- `swagger-ui-bundle.js`
-- `swagger-ui.css`
+- [`swagger-ui-bundle.js`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js)
+- [`swagger-ui.css`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css)
А **ReDoc** використовує файл:
-- `redoc.standalone.js`
+- [`redoc.standalone.js`](https://cdn.jsdelivr.net/npm/redoc@2/bundles/redoc.standalone.js)
Після цього ваша структура файлів може виглядати так:
@@ -122,7 +122,7 @@ Swagger UI впорається з цим «за лаштунками», але
### Перевірте статичні файли { #test-the-static-files }
-Запустіть ваш застосунок і перейдіть до http://127.0.0.1:8000/static/redoc.standalone.js.
+Запустіть ваш застосунок і перейдіть до [http://127.0.0.1:8000/static/redoc.standalone.js](http://127.0.0.1:8000/static/redoc.standalone.js).
Ви маєте побачити дуже довгий файл JavaScript для **ReDoc**.
@@ -180,6 +180,6 @@ Swagger UI впорається з цим «за лаштунками», але
### Перевірте UI зі статичними файлами { #test-static-files-ui }
-Тепер ви маєте змогу вимкнути WiFi, відкрити документацію за http://127.0.0.1:8000/docs і перезавантажити сторінку.
+Тепер ви маєте змогу вимкнути WiFi, відкрити документацію за [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) і перезавантажити сторінку.
І навіть без Інтернету ви зможете побачити документацію для вашого API і взаємодіяти з ним.
diff --git a/docs/uk/docs/how-to/custom-request-and-route.md b/docs/uk/docs/how-to/custom-request-and-route.md
index 9f21da7a86..6a46b57239 100644
--- a/docs/uk/docs/how-to/custom-request-and-route.md
+++ b/docs/uk/docs/how-to/custom-request-and-route.md
@@ -18,7 +18,7 @@
Деякі варіанти використання:
-- Перетворення не-JSON тіл запитів на JSON (наприклад, `msgpack`).
+- Перетворення не-JSON тіл запитів на JSON (наприклад, [`msgpack`](https://msgpack.org/index.html)).
- Розпакування тіл запитів, стиснених gzip.
- Автоматичне логування всіх тіл запитів.
@@ -32,7 +32,7 @@
/// tip | Порада
-Це навчальний приклад, щоб продемонструвати принцип роботи. Якщо вам потрібна підтримка Gzip, скористайтеся вбудованим [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware){.internal-link target=_blank}.
+Це навчальний приклад, щоб продемонструвати принцип роботи. Якщо вам потрібна підтримка Gzip, скористайтеся вбудованим [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware).
///
@@ -66,7 +66,7 @@
І саме ці дві сутності - `scope` та `receive` - потрібні для створення нового екземпляра `Request`.
-Щоб дізнатися більше про `Request`, перегляньте документацію Starlette про запити.
+Щоб дізнатися більше про `Request`, перегляньте [документацію Starlette про запити](https://www.starlette.dev/requests/).
///
@@ -82,7 +82,7 @@
/// tip | Порада
-Щоб розв’язати це саме завдання, скоріш за все, простіше використати `body` у користувацькому обробнику `RequestValidationError` ([Обробка помилок](../tutorial/handling-errors.md#use-the-requestvalidationerror-body){.internal-link target=_blank}).
+Щоб розв’язати це саме завдання, скоріш за все, простіше використати `body` у користувацькому обробнику `RequestValidationError` ([Обробка помилок](../tutorial/handling-errors.md#use-the-requestvalidationerror-body)).
Але цей приклад усе ще корисний і показує, як взаємодіяти з внутрішніми компонентами.
diff --git a/docs/uk/docs/how-to/extending-openapi.md b/docs/uk/docs/how-to/extending-openapi.md
index 1597cbc762..fcd0982a9d 100644
--- a/docs/uk/docs/how-to/extending-openapi.md
+++ b/docs/uk/docs/how-to/extending-openapi.md
@@ -37,7 +37,7 @@
Використовуючи наведене вище, ви можете скористатися тією ж утилітарною функцією для генерації схеми OpenAPI і переписати потрібні частини.
-Наприклад, додаймо розширення OpenAPI для ReDoc для додавання власного логотипа.
+Наприклад, додаймо [розширення OpenAPI ReDoc для додавання власного логотипа](https://github.com/Rebilly/ReDoc/blob/master/docs/redoc-vendor-extensions.md#x-logo).
### Звичайний **FastAPI** { #normal-fastapi }
@@ -75,6 +75,6 @@
### Перевірте { #check-it }
-Коли ви перейдете за адресою http://127.0.0.1:8000/redoc, побачите, що використовується ваш власний логотип (у цьому прикладі логотип **FastAPI**):
+Коли ви перейдете за адресою [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc), побачите, що використовується ваш власний логотип (у цьому прикладі логотип **FastAPI**):
diff --git a/docs/uk/docs/how-to/general.md b/docs/uk/docs/how-to/general.md
index f33ae195c6..75761dff53 100644
--- a/docs/uk/docs/how-to/general.md
+++ b/docs/uk/docs/how-to/general.md
@@ -4,36 +4,40 @@
## Фільтрування даних - Безпека { #filter-data-security }
-Щоб гарантувати, що ви не повертаєте більше даних, ніж слід, прочитайте документацію [Навчальний посібник - Модель відповіді - Тип повернення](../tutorial/response-model.md){.internal-link target=_blank}.
+Щоб гарантувати, що ви не повертаєте більше даних, ніж слід, прочитайте документацію [Навчальний посібник - Модель відповіді - Тип повернення](../tutorial/response-model.md).
+
+## Оптимізувати продуктивність відповіді - Модель відповіді - Тип повернення { #optimize-response-performance-response-model-return-type }
+
+Щоб оптимізувати продуктивність під час повернення даних JSON, використовуйте тип повернення або модель відповіді, таким чином Pydantic виконуватиме серіалізацію в JSON на боці Rust, без проходження через Python. Докладніше читайте в документації [Навчальний посібник - Модель відповіді - Тип повернення](../tutorial/response-model.md).
## Мітки документації - OpenAPI { #documentation-tags-openapi }
-Щоб додати мітки до ваших *операцій шляху* та згрупувати їх в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Мітки](../tutorial/path-operation-configuration.md#tags){.internal-link target=_blank}.
+Щоб додати мітки до ваших *операцій шляху* та згрупувати їх в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Мітки](../tutorial/path-operation-configuration.md#tags).
## Короткий опис і опис - OpenAPI { #documentation-summary-and-description-openapi }
-Щоб додати короткий опис і опис до ваших *операцій шляху* і показати їх в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Короткий опис і опис](../tutorial/path-operation-configuration.md#summary-and-description){.internal-link target=_blank}.
+Щоб додати короткий опис і опис до ваших *операцій шляху* і показати їх в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Короткий опис і опис](../tutorial/path-operation-configuration.md#summary-and-description).
## Опис відповіді в документації - OpenAPI { #documentation-response-description-openapi }
-Щоб визначити опис відповіді, що відображається в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Опис відповіді](../tutorial/path-operation-configuration.md#response-description){.internal-link target=_blank}.
+Щоб визначити опис відповіді, що відображається в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Опис відповіді](../tutorial/path-operation-configuration.md#response-description).
## Позначити застарілою *операцію шляху* - OpenAPI { #documentation-deprecate-a-path-operation-openapi }
-Щоб позначити *операцію шляху* як застарілу і показати це в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Позначення як застаріле](../tutorial/path-operation-configuration.md#deprecate-a-path-operation){.internal-link target=_blank}.
+Щоб позначити *операцію шляху* як застарілу і показати це в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Позначення як застаріле](../tutorial/path-operation-configuration.md#deprecate-a-path-operation).
## Перетворити будь-які дані на сумісні з JSON { #convert-any-data-to-json-compatible }
-Щоб перетворити будь-які дані на сумісні з JSON, прочитайте документацію [Навчальний посібник - Кодувальник, сумісний з JSON](../tutorial/encoder.md){.internal-link target=_blank}.
+Щоб перетворити будь-які дані на сумісні з JSON, прочитайте документацію [Навчальний посібник - Кодувальник, сумісний з JSON](../tutorial/encoder.md).
## Метадані OpenAPI - Документація { #openapi-metadata-docs }
-Щоб додати метадані до вашої схеми OpenAPI, зокрема ліцензію, версію, контактні дані тощо, прочитайте документацію [Навчальний посібник - Метадані та URL документації](../tutorial/metadata.md){.internal-link target=_blank}.
+Щоб додати метадані до вашої схеми OpenAPI, зокрема ліцензію, версію, контактні дані тощо, прочитайте документацію [Навчальний посібник - Метадані та URL документації](../tutorial/metadata.md).
## Власний URL OpenAPI { #openapi-custom-url }
-Щоб налаштувати URL OpenAPI (або прибрати його), прочитайте документацію [Навчальний посібник - Метадані та URL документації](../tutorial/metadata.md#openapi-url){.internal-link target=_blank}.
+Щоб налаштувати URL OpenAPI (або прибрати його), прочитайте документацію [Навчальний посібник - Метадані та URL документації](../tutorial/metadata.md#openapi-url).
## URL документації OpenAPI { #openapi-docs-urls }
-Щоб оновити URL, які використовуються для автоматично згенерованих інтерфейсів користувача документації, прочитайте документацію [Навчальний посібник - Метадані та URL документації](../tutorial/metadata.md#docs-urls){.internal-link target=_blank}.
+Щоб оновити URL, які використовуються для автоматично згенерованих інтерфейсів користувача документації, прочитайте документацію [Навчальний посібник - Метадані та URL документації](../tutorial/metadata.md#docs-urls).
diff --git a/docs/uk/docs/how-to/graphql.md b/docs/uk/docs/how-to/graphql.md
index 2d0e355ea4..c070c7e0cd 100644
--- a/docs/uk/docs/how-to/graphql.md
+++ b/docs/uk/docs/how-to/graphql.md
@@ -18,18 +18,18 @@ GraphQL розв’язує деякі дуже специфічні сцена
Ось деякі бібліотеки GraphQL з підтримкою ASGI. Ви можете використовувати їх із FastAPI:
-* Strawberry 🍓
- * З документацією для FastAPI
-* Ariadne
- * З документацією для FastAPI
-* Tartiflette
- * З Tartiflette ASGI для інтеграції з ASGI
-* Graphene
- * З starlette-graphene3
+* [Strawberry](https://strawberry.rocks/) 🍓
+ * З [документацією для FastAPI](https://strawberry.rocks/docs/integrations/fastapi)
+* [Ariadne](https://ariadnegraphql.org/)
+ * З [документацією для FastAPI](https://ariadnegraphql.org/docs/fastapi-integration)
+* [Tartiflette](https://tartiflette.io/)
+ * З [Tartiflette ASGI](https://tartiflette.github.io/tartiflette-asgi/) для інтеграції з ASGI
+* [Graphene](https://graphene-python.org/)
+ * З [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3)
## GraphQL зі Strawberry { #graphql-with-strawberry }
-Якщо вам потрібен або ви хочете використовувати GraphQL, Strawberry - рекомендована бібліотека, адже її дизайн найближчий до дизайну FastAPI; усе базується на анотаціях типів.
+Якщо вам потрібен або ви хочете використовувати GraphQL, [Strawberry](https://strawberry.rocks/) - рекомендована бібліотека, адже її дизайн найближчий до дизайну FastAPI; усе базується на анотаціях типів.
Залежно від вашого сценарію використання ви можете надати перевагу іншій бібліотеці, але якби ви запитали мене, я, ймовірно, порадив би спробувати Strawberry.
@@ -37,24 +37,24 @@ GraphQL розв’язує деякі дуже специфічні сцена
{* ../../docs_src/graphql_/tutorial001_py310.py hl[3,22,25] *}
-Більше про Strawberry ви можете дізнатися в документації Strawberry.
+Більше про Strawberry ви можете дізнатися в [документації Strawberry](https://strawberry.rocks/).
-І також документацію про Strawberry з FastAPI.
+І також [документацію про Strawberry з FastAPI](https://strawberry.rocks/docs/integrations/fastapi).
## Застарілий `GraphQLApp` зі Starlette { #older-graphqlapp-from-starlette }
-Попередні версії Starlette містили клас `GraphQLApp` для інтеграції з Graphene.
+Попередні версії Starlette містили клас `GraphQLApp` для інтеграції з [Graphene](https://graphene-python.org/).
-Його вилучено з Starlette як застарілий, але якщо у вас є код, що його використовував, ви можете легко мігрувати на starlette-graphene3, який покриває той самий сценарій використання та має майже ідентичний інтерфейс.
+Його вилучено з Starlette як застарілий, але якщо у вас є код, що його використовував, ви можете легко мігрувати на [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3), який покриває той самий сценарій використання та має майже ідентичний інтерфейс.
/// tip | Порада
-Якщо вам потрібен GraphQL, я все ж рекомендую звернути увагу на Strawberry, адже він базується на анотаціях типів, а не на власних класах і типах.
+Якщо вам потрібен GraphQL, я все ж рекомендую звернути увагу на [Strawberry](https://strawberry.rocks/), адже він базується на анотаціях типів, а не на власних класах і типах.
///
## Дізнайтеся більше { #learn-more }
-Ви можете дізнатися більше про GraphQL в офіційній документації GraphQL.
+Ви можете дізнатися більше про GraphQL в [офіційній документації GraphQL](https://graphql.org/).
Також ви можете почитати більше про кожну з цих бібліотек за наведеними посиланнями.
diff --git a/docs/uk/docs/how-to/index.md b/docs/uk/docs/how-to/index.md
index ac2dd16eb9..db72181a35 100644
--- a/docs/uk/docs/how-to/index.md
+++ b/docs/uk/docs/how-to/index.md
@@ -8,6 +8,6 @@
/// tip | Порада
-Якщо ви хочете **вивчити FastAPI** у структурований спосіб (рекомендується), натомість прочитайте [Навчальний посібник - Посібник користувача](../tutorial/index.md){.internal-link target=_blank} розділ за розділом.
+Якщо ви хочете **вивчити FastAPI** у структурований спосіб (рекомендується), натомість прочитайте [Навчальний посібник - Посібник користувача](../tutorial/index.md) розділ за розділом.
///
diff --git a/docs/uk/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md b/docs/uk/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
index 0f5d1c924e..c5519b98d8 100644
--- a/docs/uk/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
+++ b/docs/uk/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
@@ -22,7 +22,7 @@ FastAPI 0.126.0 припинив підтримку Pydantic v1, водноча
## Офіційний посібник { #official-guide }
-У Pydantic є офіційний Посібник з міграції з v1 на v2.
+У Pydantic є офіційний [Посібник з міграції](https://docs.pydantic.dev/latest/migration/) з v1 на v2.
Там описано, що змінилося, як перевірки тепер стали коректнішими та суворішими, можливі застереження тощо.
@@ -30,7 +30,7 @@ FastAPI 0.126.0 припинив підтримку Pydantic v1, водноча
## Тести { #tests }
-Переконайтеся, що у вашій програмі є [тести](../tutorial/testing.md){.internal-link target=_blank} і що ви запускаєте їх у системі безперервної інтеграції (CI).
+Переконайтеся, що у вашій програмі є [тести](../tutorial/testing.md) і що ви запускаєте їх у системі безперервної інтеграції (CI).
Так ви зможете виконати оновлення і впевнитися, що все працює як очікується.
@@ -38,7 +38,7 @@ FastAPI 0.126.0 припинив підтримку Pydantic v1, водноча
У багатьох випадках, якщо ви використовуєте звичайні моделі Pydantic без налаштувань, більшу частину процесу міграції з Pydantic v1 на Pydantic v2 можна автоматизувати.
-Ви можете скористатися `bump-pydantic` від тієї ж команди Pydantic.
+Ви можете скористатися [`bump-pydantic`](https://github.com/pydantic/bump-pydantic) від тієї ж команди Pydantic.
Цей інструмент допоможе автоматично змінити більшість коду, який потрібно змінити.
diff --git a/docs/uk/docs/how-to/testing-database.md b/docs/uk/docs/how-to/testing-database.md
index 2e6b21ced0..0f12b9d529 100644
--- a/docs/uk/docs/how-to/testing-database.md
+++ b/docs/uk/docs/how-to/testing-database.md
@@ -1,7 +1,7 @@
# Тестування бази даних { #testing-a-database }
-Ви можете ознайомитися з базами даних, SQL і SQLModel у документації SQLModel. 🤓
+Ви можете ознайомитися з базами даних, SQL і SQLModel у [документації SQLModel](https://sqlmodel.tiangolo.com/). 🤓
-Є невеликий навчальний посібник про використання SQLModel з FastAPI. ✨
+Є невеликий [навчальний посібник про використання SQLModel з FastAPI](https://sqlmodel.tiangolo.com/tutorial/fastapi/). ✨
-Цей навчальний посібник містить розділ про тестування баз даних SQL. 😎
+Цей навчальний посібник містить розділ про [тестування баз даних SQL](https://sqlmodel.tiangolo.com/tutorial/fastapi/tests/). 😎
diff --git a/docs/uk/docs/tutorial/dependencies/index.md b/docs/uk/docs/tutorial/dependencies/index.md
index cbcf693077..bea5f598d6 100644
--- a/docs/uk/docs/tutorial/dependencies/index.md
+++ b/docs/uk/docs/tutorial/dependencies/index.md
@@ -57,7 +57,7 @@ FastAPI додав підтримку `Annotated` (і почав її реком
Якщо у вас старіша версія, ви отримаєте помилки при спробі використати `Annotated`.
-Переконайтеся, що ви [Оновіть версію FastAPI](../../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} щонайменше до 0.95.1 перед використанням `Annotated`.
+Переконайтеся, що ви [Оновіть версію FastAPI](../../deployment/versions.md#upgrading-the-fastapi-versions) щонайменше до 0.95.1 перед використанням `Annotated`.
///
@@ -152,7 +152,7 @@ commons: Annotated[dict, Depends(common_parameters)]
/// note | Примітка
-Якщо ви не впевнені, перегляньте розділ [Async: *"In a hurry?"*](../../async.md#in-a-hurry){.internal-link target=_blank} про `async` і `await` у документації.
+Якщо ви не впевнені, перегляньте розділ [Async: *"In a hurry?"*](../../async.md#in-a-hurry) про `async` і `await` у документації.
///