Merge branch 'master' into master
|
|
@ -14,7 +14,7 @@ repos:
|
||||||
- id: end-of-file-fixer
|
- id: end-of-file-fixer
|
||||||
- id: trailing-whitespace
|
- id: trailing-whitespace
|
||||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||||
rev: v0.11.7
|
rev: v0.12.1
|
||||||
hooks:
|
hooks:
|
||||||
- id: ruff
|
- id: ruff
|
||||||
args:
|
args:
|
||||||
|
|
|
||||||
|
|
@ -48,20 +48,20 @@ The key features are:
|
||||||
|
|
||||||
<a href="https://blockbee.io?ref=fastapi" target="_blank" title="BlockBee Cryptocurrency Payment Gateway"><img src="https://fastapi.tiangolo.com/img/sponsors/blockbee.png"></a>
|
<a href="https://blockbee.io?ref=fastapi" target="_blank" title="BlockBee Cryptocurrency Payment Gateway"><img src="https://fastapi.tiangolo.com/img/sponsors/blockbee.png"></a>
|
||||||
<a href="https://platform.sh/try-it-now/?utm_source=fastapi-signup&utm_medium=banner&utm_campaign=FastAPI-signup-June-2023" target="_blank" title="Build, run and scale your apps on a modern, reliable, and secure PaaS."><img src="https://fastapi.tiangolo.com/img/sponsors/platform-sh.png"></a>
|
<a href="https://platform.sh/try-it-now/?utm_source=fastapi-signup&utm_medium=banner&utm_campaign=FastAPI-signup-June-2023" target="_blank" title="Build, run and scale your apps on a modern, reliable, and secure PaaS."><img src="https://fastapi.tiangolo.com/img/sponsors/platform-sh.png"></a>
|
||||||
<a href="https://www.porter.run" target="_blank" title="Deploy FastAPI on AWS with a few clicks"><img src="https://fastapi.tiangolo.com/img/sponsors/porter.png"></a>
|
|
||||||
<a href="https://github.com/scalar/scalar/?utm_source=fastapi&utm_medium=website&utm_campaign=main-badge" target="_blank" title="Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files"><img src="https://fastapi.tiangolo.com/img/sponsors/scalar.svg"></a>
|
<a href="https://github.com/scalar/scalar/?utm_source=fastapi&utm_medium=website&utm_campaign=main-badge" target="_blank" title="Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files"><img src="https://fastapi.tiangolo.com/img/sponsors/scalar.svg"></a>
|
||||||
<a href="https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=mainbadge" target="_blank" title="Auth, user management and more for your B2B product"><img src="https://fastapi.tiangolo.com/img/sponsors/propelauth.png"></a>
|
<a href="https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=mainbadge" target="_blank" title="Auth, user management and more for your B2B product"><img src="https://fastapi.tiangolo.com/img/sponsors/propelauth.png"></a>
|
||||||
<a href="https://www.mongodb.com/developer/languages/python/python-quickstart-fastapi/?utm_campaign=fastapi_framework&utm_source=fastapi_sponsorship&utm_medium=web_referral" target="_blank" title="Simplify Full Stack Development with FastAPI & MongoDB"><img src="https://fastapi.tiangolo.com/img/sponsors/mongodb.png"></a>
|
|
||||||
<a href="https://zuplo.link/fastapi-gh" target="_blank" title="Zuplo: Deploy, Secure, Document, and Monetize your FastAPI"><img src="https://fastapi.tiangolo.com/img/sponsors/zuplo.png"></a>
|
<a href="https://zuplo.link/fastapi-gh" target="_blank" title="Zuplo: Deploy, Secure, Document, and Monetize your FastAPI"><img src="https://fastapi.tiangolo.com/img/sponsors/zuplo.png"></a>
|
||||||
<a href="https://liblab.com?utm_source=fastapi" target="_blank" title="liblab - Generate SDKs from FastAPI"><img src="https://fastapi.tiangolo.com/img/sponsors/liblab.png"></a>
|
<a href="https://liblab.com?utm_source=fastapi" target="_blank" title="liblab - Generate SDKs from FastAPI"><img src="https://fastapi.tiangolo.com/img/sponsors/liblab.png"></a>
|
||||||
<a href="https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi" target="_blank" title="Deploy & scale any full-stack web app on Render. Focus on building apps, not infra."><img src="https://fastapi.tiangolo.com/img/sponsors/render.svg"></a>
|
<a href="https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi" target="_blank" title="Deploy & scale any full-stack web app on Render. Focus on building apps, not infra."><img src="https://fastapi.tiangolo.com/img/sponsors/render.svg"></a>
|
||||||
<a href="https://www.coderabbit.ai/?utm_source=fastapi&utm_medium=badge&utm_campaign=fastapi" target="_blank" title="Cut Code Review Time & Bugs in Half with CodeRabbit"><img src="https://fastapi.tiangolo.com/img/sponsors/coderabbit.png"></a>
|
<a href="https://www.coderabbit.ai/?utm_source=fastapi&utm_medium=badge&utm_campaign=fastapi" target="_blank" title="Cut Code Review Time & Bugs in Half with CodeRabbit"><img src="https://fastapi.tiangolo.com/img/sponsors/coderabbit.png"></a>
|
||||||
<a href="https://github.com/deepset-ai/haystack/" target="_blank" title="Build powerful search from composable, open source building blocks"><img src="https://fastapi.tiangolo.com/img/sponsors/haystack-fastapi.svg"></a>
|
<a href="https://subtotal.com/?utm_source=fastapi&utm_medium=sponsorship&utm_campaign=open-source" target="_blank" title="The Gold Standard in Retail Account Linking"><img src="https://fastapi.tiangolo.com/img/sponsors/subtotal.svg"></a>
|
||||||
<a href="https://databento.com/" target="_blank" title="Pay as you go for market data"><img src="https://fastapi.tiangolo.com/img/sponsors/databento.svg"></a>
|
<a href="https://databento.com/" target="_blank" title="Pay as you go for market data"><img src="https://fastapi.tiangolo.com/img/sponsors/databento.svg"></a>
|
||||||
<a href="https://speakeasy.com?utm_source=fastapi+repo&utm_medium=github+sponsorship" target="_blank" title="SDKs for your API | Speakeasy"><img src="https://fastapi.tiangolo.com/img/sponsors/speakeasy.png"></a>
|
<a href="https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship" target="_blank" title="SDKs for your API | Speakeasy"><img src="https://fastapi.tiangolo.com/img/sponsors/speakeasy.png"></a>
|
||||||
<a href="https://www.svix.com/" target="_blank" title="Svix - Webhooks as a service"><img src="https://fastapi.tiangolo.com/img/sponsors/svix.svg"></a>
|
<a href="https://www.svix.com/" target="_blank" title="Svix - Webhooks as a service"><img src="https://fastapi.tiangolo.com/img/sponsors/svix.svg"></a>
|
||||||
<a href="https://www.stainlessapi.com/?utm_source=fastapi&utm_medium=referral" target="_blank" title="Stainless | Generate best-in-class SDKs"><img src="https://fastapi.tiangolo.com/img/sponsors/stainless.png"></a>
|
<a href="https://www.stainlessapi.com/?utm_source=fastapi&utm_medium=referral" target="_blank" title="Stainless | Generate best-in-class SDKs"><img src="https://fastapi.tiangolo.com/img/sponsors/stainless.png"></a>
|
||||||
<a href="https://www.permit.io/blog/implement-authorization-in-fastapi?utm_source=github&utm_medium=referral&utm_campaign=fastapi" target="_blank" title="Fine-Grained Authorization for FastAPI"><img src="https://fastapi.tiangolo.com/img/sponsors/permit.png"></a>
|
<a href="https://www.permit.io/blog/implement-authorization-in-fastapi?utm_source=github&utm_medium=referral&utm_campaign=fastapi" target="_blank" title="Fine-Grained Authorization for FastAPI"><img src="https://fastapi.tiangolo.com/img/sponsors/permit.png"></a>
|
||||||
|
<a href="https://www.interviewpal.com/?utm_source=fastapi&utm_medium=open-source&utm_campaign=dev-hiring" target="_blank" title="InterviewPal - AI Interview Coach for Engineers and Devs"><img src="https://fastapi.tiangolo.com/img/sponsors/interviewpal.png"></a>
|
||||||
|
<a href="https://dribia.com/en/" target="_blank" title="Dribia - Data Science within your reach"><img src="https://fastapi.tiangolo.com/img/sponsors/dribia.png"></a>
|
||||||
|
|
||||||
<!-- /sponsors -->
|
<!-- /sponsors -->
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,298 @@
|
||||||
|
# এনভায়রনমেন্ট ভেরিয়েবলস
|
||||||
|
|
||||||
|
/// tip
|
||||||
|
|
||||||
|
আপনি যদি "এনভায়রনমেন্ট ভেরিয়েবলস" কী এবং সেগুলো কীভাবে ব্যবহার করতে হয় সেটা জানেন, তাহলে এই অংশটি স্কিপ করে যেতে পারেন।
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
এনভায়রনমেন্ট ভেরিয়েবল (সংক্ষেপে "**env var**" নামেও পরিচিত) হলো এমন একটি ভেরিয়েবল যা পাইথন কোডের **বাইরে**, **অপারেটিং সিস্টেমে** থাকে এবং আপনার পাইথন কোড (বা অন্যান্য প্রোগ্রাম) দ্বারা যাকে রিড করা যায়।
|
||||||
|
|
||||||
|
এনভায়রনমেন্ট ভেরিয়েবলস অ্যাপ্লিকেশনের **সেটিংস** পরিচালনা করতে, পাইথনের **ইনস্টলেশন** প্রক্রিয়ার অংশ হিসেবে, ইত্যাদি কাজে উপযোগী হতে পারে।
|
||||||
|
|
||||||
|
## Env Vars তৈরী এবং ব্যবহার
|
||||||
|
|
||||||
|
আপনি **শেল (টার্মিনাল)**-এ, পাইথনের প্রয়োজন ছাড়াই, এনভায়রনমেন্ট ভেরিয়েবলস **তৈরি** এবং ব্যবহার করতে পারবেনঃ
|
||||||
|
|
||||||
|
//// tab | লিনাক্স, ম্যাকওএস, উইন্ডোজ Bash
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
// আপনি চাইলে MY_NAME নামে একটি env var তৈরি করতে পারেন
|
||||||
|
$ export MY_NAME="Wade Wilson"
|
||||||
|
|
||||||
|
// তারপরে এটিকে চাইলে অন্যান্য প্রোগ্রামে ব্যবহার করতে পারেন
|
||||||
|
$ echo "Hello $MY_NAME"
|
||||||
|
|
||||||
|
Hello Wade Wilson
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
//// tab | উইন্ডোজ পাওয়ারশেল
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
// MY_NAME নামে env var তৈরি
|
||||||
|
$ $Env:MY_NAME = "Wade Wilson"
|
||||||
|
|
||||||
|
// অন্যান্য প্রোগ্রামে এটিকে ব্যবহার
|
||||||
|
$ echo "Hello $Env:MY_NAME"
|
||||||
|
|
||||||
|
Hello Wade Wilson
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
## পাইথনে env vars রিড করা
|
||||||
|
|
||||||
|
আপনি চাইলে পাইথনের **বাইরে**, টার্মিনালে (বা অন্য কোনো উপায়ে) এনভায়রনমেন্ট ভেরিয়েবলস তৈরি করতে পারেন, এবং পরে সেগুলো **পাইথনে রিড** (অ্যাক্সেস করতে) পারেন।
|
||||||
|
|
||||||
|
উদাহরণস্বরূপ, আপনার `main.py` নামে একটি ফাইল থাকতে পারেঃ
|
||||||
|
|
||||||
|
```Python hl_lines="3"
|
||||||
|
import os
|
||||||
|
|
||||||
|
name = os.getenv("MY_NAME", "World")
|
||||||
|
print(f"Hello {name} from Python")
|
||||||
|
```
|
||||||
|
|
||||||
|
/// tip
|
||||||
|
|
||||||
|
<a href="https://docs.python.org/3.8/library/os.html#os.getenv" class="external-link" target="_blank">`os.getenv()`</a> এর দ্বিতীয় আর্গুমেন্টটি হলো এর ডিফল্ট ভ্যালু যা রিটার্ন করা হবে।
|
||||||
|
|
||||||
|
যদি এটি দেওয়া না হয়, ডিফল্টভাবে `None` ব্যবহৃত হবে, এখানে আমরা ডিফল্ট ভ্যালু হিসেবে `"World"` ব্যবহার করেছি।
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
তারপরে পাইথন প্রোগ্রামটিকে নিম্নোক্তভাবে কল করা যাবেঃ
|
||||||
|
|
||||||
|
//// tab | লিনাক্স, ম্যাকওএস, উইন্ডোজ Bash
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
// এখনো আমরা এনভায়রনমেন্ট ভেরিয়েবল সেট করিনি
|
||||||
|
$ python main.py
|
||||||
|
|
||||||
|
// যেহেতু env var সেট করা হয়নি, তাই আমরা ডিফল্ট ভ্যালু পাচ্ছি
|
||||||
|
|
||||||
|
Hello World from Python
|
||||||
|
|
||||||
|
// কিন্তু আমরা প্রথমে যদি একটা এনভায়রনমেন্ট ভারিয়েবল তৈরি করে নেই
|
||||||
|
$ export MY_NAME="Wade Wilson"
|
||||||
|
|
||||||
|
// এবং তারপর আবার প্রোগ্রাটিকে কল করি
|
||||||
|
$ python main.py
|
||||||
|
|
||||||
|
// এখন এটি এনভায়রনমেন্ট ভেরিয়েবল রিড করতে পারবে
|
||||||
|
|
||||||
|
Hello Wade Wilson from Python
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
//// tab | উইন্ডোজ পাওয়ারশেল
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
// এখনো আমরা এনভায়রনমেন্ট ভেরিয়েবল সেট করিনি
|
||||||
|
$ python main.py
|
||||||
|
|
||||||
|
// যেহেতু env var সেট করা হয়নি, তাই আমরা ডিফল্ট ভ্যালু পাচ্ছি
|
||||||
|
|
||||||
|
Hello World from Python
|
||||||
|
|
||||||
|
// কিন্তু আমরা প্রথমে যদি একটা এনভায়রনমেন্ট ভারিয়েবল তৈরি করে নেই
|
||||||
|
$ $Env:MY_NAME = "Wade Wilson"
|
||||||
|
|
||||||
|
// এবং তারপর আবার প্রোগ্রাটিকে কল করি
|
||||||
|
$ python main.py
|
||||||
|
|
||||||
|
// এখন এটি এনভায়রনমেন্ট ভেরিয়েবল রিড করতে পারবে
|
||||||
|
|
||||||
|
Hello Wade Wilson from Python
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
যেহেতু এনভায়রনমেন্ট ভেরিয়েবলস কোডের বাইরে সেট করা যায়, কিন্তু পরবর্তীতে কোড দ্বারা রিড করা যায়, এবং বাকি ফাইলগুলোর সাথে রাখতে (`git` এ কমিট) হয় না, তাই কনফিগারেশনস বা **সেটিংস** এর জন্য এগুলো সাধারণত ব্যবহৃত হয়ে থাকে।
|
||||||
|
|
||||||
|
আপনি একটি এনভায়রনমেন্ট ভেরিয়েবল শুধুমাত্র একটি **নির্দিষ্ট প্রোগ্রাম ইনভোকেশনের** জন্যও তৈরি করতে পারেন, যা শুধুমাত্র সেই প্রোগ্রামের জন্যই এভেইলেবল থাকবে এবং শুধুমাত্র তার চলাকালীন সময় পর্যন্তই সক্রিয় থাকবে।
|
||||||
|
|
||||||
|
এটি করতে, প্রোগ্রামটি রান করার ঠিক আগেই, একই লাইনে এনভায়রনমেন্ট ভেরিয়েবল তৈরি করুন:
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
// প্রোগ্রামটি কল করার সময় একই লাইনে MY_NAME এনভায়রনমেন্ট ভেরিয়েবল তৈরি করুন
|
||||||
|
$ MY_NAME="Wade Wilson" python main.py
|
||||||
|
|
||||||
|
// এখন এটি এনভায়রনমেন্ট ভ্যরিয়েবলটিকে রিড করতে পারবে
|
||||||
|
|
||||||
|
Hello Wade Wilson from Python
|
||||||
|
|
||||||
|
// পরবর্তীতে এনভায়রনমেন্ট ভেরিয়েবলটিকে আর ব্যবহার করা যাচ্ছে না
|
||||||
|
$ python main.py
|
||||||
|
|
||||||
|
Hello World from Python
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
/// tip
|
||||||
|
|
||||||
|
এটি নিয়ে আরো বিস্তারিত পড়তে পারেন এখানে <a href="https://12factor.net/config" class="external-link" target="_blank">The Twelve-Factor App: Config</a>।
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## টাইপস এবং ভ্যালিডেশন
|
||||||
|
|
||||||
|
এই এনভায়রনমেন্ট ভেরিয়েবলগুলো শুধুমাত্র **টেক্সট স্ট্রিংস** হ্যান্ডেল করতে পারে, যেহেতু এগুলো পাইথনের বাইরে অবস্থিত এবং অন্যান্য প্রোগ্রাম এবং সিস্টেমের বাকি অংশের (এমনকি বিভিন্ন অপারেটিং সিস্টেম যেমন লিনাক্স, উইন্ডোজ, ম্যাকওএস) সাথে সামঞ্জস্যপূর্ণ হতে হয়।
|
||||||
|
|
||||||
|
এর অর্থ হচ্ছে পাইথনে এনভায়রনমেন্ট ভেরিয়েবল থেকে রিড করা **যেকোনো ভ্যালু** একটি `str` হবে, এবং অন্য কোনো টাইপে কনভার্সন বা যেকোনো ভেলিডেশন কোডে আলাদাভাবে করতে হবে।
|
||||||
|
|
||||||
|
এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে **এপ্লিকেশন সেটিংস** হ্যান্ডেল করা নিয়ে আরো বিস্তারিত জানা যাবে [Advanced User Guide - Settings and Environment Variables](./advanced/settings.md){.internal-link target=_blank}.
|
||||||
|
|
||||||
|
## `PATH` এনভায়রনমেন্ট ভেরিয়েবল
|
||||||
|
|
||||||
|
**`PATH`** নামে একটি **বিশেষ** এনভায়রনমেন্ট ভেরিয়েবল রয়েছে, যেটি প্রোগ্রাম রান করার জন্য অপারেটিং সিস্টেমস (লিনাক্স, ম্যাকওএস, উইন্ডোজ) দ্বারা ব্যবহৃত হয়।
|
||||||
|
|
||||||
|
`PATH` ভেরিয়েবল এর ভ্যালু হচ্ছে একটি বিশাল স্ট্রিং যা ডিরেক্টরিকে কোলন `:` দিয়ে আলাদা করার মাধ্যমে লিনাক্সে ও ম্যাকওএস এ, এবং সেমিকোলন `;` এর মাধ্যমে উইন্ডোজ এ তৈরি করা থাকে।
|
||||||
|
|
||||||
|
উদাহরণস্বরূপ, `PATH` ভেরিয়েবল নিচের মতো দেখতে হতে পারেঃ
|
||||||
|
|
||||||
|
//// tab | লিনাক্স, ম্যাকওএস
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
```
|
||||||
|
|
||||||
|
তারমানে হলো সিস্টেম প্রোগ্রামগুলোকে নিচের ডিরেক্টরিগুলোতে খুঁজবেঃ
|
||||||
|
|
||||||
|
* `/usr/local/bin`
|
||||||
|
* `/usr/bin`
|
||||||
|
* `/bin`
|
||||||
|
* `/usr/sbin`
|
||||||
|
* `/sbin`
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
//// tab | উইন্ডোজ
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32
|
||||||
|
```
|
||||||
|
|
||||||
|
তারমানে হলো সিস্টেম প্রোগ্রামগুলোকে নিচের ডিরেক্টরিগুলোতে খুঁজবেঃ
|
||||||
|
|
||||||
|
* `C:\Program Files\Python312\Scripts`
|
||||||
|
* `C:\Program Files\Python312`
|
||||||
|
* `C:\Windows\System32`
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
যখন আপনি টার্মিনালে কোনো **কমান্ড** লিখবেন, অপারেটিং সিস্টেম **প্রত্যেকটি ডিরেক্টরিতে** প্রোগ্রামটি **খুঁজবে** যেগুলো `PATH` এনভায়রনমেন্ট ভেরিয়েবল এ লিস্ট করা আছে।
|
||||||
|
|
||||||
|
উদাহরণস্বরূপ, যখন আপনি টার্মিনালে `python` টাইপ করবেন, অপারেটিং সিস্টেম এই লিস্ট এর **প্রথম ডিরেক্টরিতে** `python` নামের একটি প্রোগ্রাম খুঁজবে।
|
||||||
|
|
||||||
|
যদি এটি খুঁজে পায়, তাহলে এটি প্রোগ্রামটিকে ব্যবহার করবে। অন্যথায় এটি **অন্যান্য ডিরেক্টরিগুলোতে** এটিকে খুঁজতে থাকবে।
|
||||||
|
|
||||||
|
### পাইথন ইনস্টল এবং `PATH` আপডেট
|
||||||
|
|
||||||
|
যখন আপনি পাইথন ইনস্টল করেন, আপনি `PATH` এনভায়রনমেন্ট ভেরিয়েবল আপডেট করতে চান কিনা সেটা জিজ্ঞেস করা হতে পারে।
|
||||||
|
|
||||||
|
//// tab | লিনাক্স, ম্যাকওএস
|
||||||
|
|
||||||
|
ধরা যাক আপনি পাইথন ইনস্টল করলেন এবং এটি `/opt/custompython/bin` ডিরেক্টরিতে ইনস্টল হচ্ছে।
|
||||||
|
|
||||||
|
যদি আপনি "Yes" সিলেক্ট করে `PATH` এনভায়রনমেন্ট ভেরিয়েবল আপডেট করতে চান, তাহলে ইনস্টলার `/opt/custompython/bin` কে `PATH` এনভায়রনমেন্ট ভেরিয়েবল এ এড করে দিবে।
|
||||||
|
|
||||||
|
এটা দেখতে এমনটা হতে পারেঃ
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/custompython/bin
|
||||||
|
```
|
||||||
|
|
||||||
|
এইভাবে, আপনি যখন টার্মিনালে `python` টাইপ করেন, সিস্টেম পাইথন প্রোগ্রামটিকে `/opt/custompython/bin` (সর্বশেষ ডিরেক্টরি) তে খুঁজে পাবে এবং এটাকে ব্যবহার করবে।
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
//// tab | উইন্ডোজ
|
||||||
|
|
||||||
|
ধরা যাক আপনি পাইথন ইনস্টল করলেন এবং এটি `C:\opt\custompython\bin` ডিরেক্টরিতে ইনস্টল হচ্ছে।
|
||||||
|
|
||||||
|
যদি আপনি "Yes" সিলেক্ট করে `PATH` এনভায়রনমেন্ট ভেরিয়েবল আপডেট করতে চান, তাহলে ইনস্টলার `C:\opt\custompython\bin` কে `PATH` এনভায়রনমেন্ট ভেরিয়েবল এ এড করে দিবে।
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32;C:\opt\custompython\bin
|
||||||
|
```
|
||||||
|
|
||||||
|
এইভাবে, আপনি যখন টার্মিনালে `python` টাইপ করেন, সিস্টেম পাইথন প্রোগ্রামটিকে `C:\opt\custompython\bin` (সর্বশেষ ডিরেক্টরি) তে খুঁজে পাবে এবং এটাকে ব্যবহার করবে।
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
তাই, আপনি যদি টাইপ করেনঃ
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ python
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
//// tab | লিনাক্স, ম্যাকওএস
|
||||||
|
|
||||||
|
সিস্টেম `python` প্রোগ্রামকে `/opt/custompython/bin` এ **খুঁজে পাবে** এবং এটাকে রান করবে।
|
||||||
|
|
||||||
|
এটা মোটামুটিভাবে নিচের মতো করে লেখার সমান হবেঃ
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ /opt/custompython/bin/python
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
//// tab | উইন্ডোজ
|
||||||
|
|
||||||
|
সিস্টেম `python` প্রোগ্রামকে `C:\opt\custompython\bin\python` এ **খুঁজে পাবে** এবং এটাকে রান করবে।
|
||||||
|
|
||||||
|
এটা মোটামুটিভাবে নিচের মতো করে লেখার সমান হবেঃ
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ C:\opt\custompython\bin\python
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
এই তথ্যগুলো [ভার্চুয়াল এনভায়রনমেন্টস](virtual-environments.md){.internal-link target=_blank} শেখার ক্ষেত্রে সহায়ক হবে।
|
||||||
|
|
||||||
|
## উপসংহার
|
||||||
|
|
||||||
|
এর মাধ্যমে আপনি **এনভায়রনমেন্ট ভেরিয়েবলস** কি এবং এটিকে পাইথনে কিভাবে ব্যবহার করতে হয় তার সম্পর্কে বেসিক ধারনা পেলেন।
|
||||||
|
|
||||||
|
চাইলে এই সম্পর্কে আরো বিস্তারিত পড়তে পারেন <a href="https://en.wikipedia.org/wiki/Environment_variable" class="external-link" target="_blank">Wikipedia for Environment Variable</a> এ।
|
||||||
|
|
||||||
|
অনেক ক্ষেত্রে, দেখা মাত্রই এনভায়রনমেন্ট ভেরিয়েবল কীভাবে প্রয়োজন হবে তা স্পষ্ট হয় না। কিন্তু ডেভেলপমেন্টের সময় আপনি নানা রকম পরিস্থিতিতে এগুলোর সম্মুখীন হবেন, তাই এগুলো সম্পর্কে জেনে রাখা ভালো।
|
||||||
|
|
||||||
|
উদাহরণস্বরূপ, আপনার এই ইনফরমেশনটি পরবর্তী, [ভার্চুয়াল এনভায়রনমেন্টস](virtual-environments.md) অংশে দরকার হবে।
|
||||||
|
|
@ -20,7 +20,7 @@ Einige von diesen ✨ [**sponsern FastAPI**](../help-fastapi.md#den-autor-sponse
|
||||||
|
|
||||||
Und es zeigt deren wahres Engagement für FastAPI und seine **Community** (Sie), da diese Ihnen nicht nur einen **guten Service** bieten möchten, sondern auch sicherstellen möchten, dass Sie über ein **gutes und gesundes Framework** verfügen, FastAPI. 🙇
|
Und es zeigt deren wahres Engagement für FastAPI und seine **Community** (Sie), da diese Ihnen nicht nur einen **guten Service** bieten möchten, sondern auch sicherstellen möchten, dass Sie über ein **gutes und gesundes Framework** verfügen, FastAPI. 🙇
|
||||||
|
|
||||||
Beispielsweise könnten Sie <a href="https://speakeasy.com/?utm_source=fastapi+repo&utm_medium=github+sponsorship" class="external-link" target="_blank">Speakeasy</a> ausprobieren.
|
Beispielsweise könnten Sie <a href="https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship" class="external-link" target="_blank">Speakeasy</a> ausprobieren.
|
||||||
|
|
||||||
Es gibt auch mehrere andere Unternehmen, welche ähnliche Dienste anbieten und die Sie online suchen und finden können. 🤓
|
Es gibt auch mehrere andere Unternehmen, welche ähnliche Dienste anbieten und die Sie online suchen und finden können. 🤓
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -216,7 +216,7 @@ Dieser Manager-Prozess wäre wahrscheinlich derjenige, welcher der IP am **Port*
|
||||||
|
|
||||||
Diese Workerprozesse würden Ihre Anwendung ausführen, sie würden die Hauptberechnungen durchführen, um einen **Request** entgegenzunehmen und eine **Response** zurückzugeben, und sie würden alles, was Sie in Variablen einfügen, in den RAM laden.
|
Diese Workerprozesse würden Ihre Anwendung ausführen, sie würden die Hauptberechnungen durchführen, um einen **Request** entgegenzunehmen und eine **Response** zurückzugeben, und sie würden alles, was Sie in Variablen einfügen, in den RAM laden.
|
||||||
|
|
||||||
<img src="/img/deployment/concepts/process-ram.svg">
|
<img src="/img/deployment/concepts/process-ram.drawio.svg">
|
||||||
|
|
||||||
Und natürlich würden auf derselben Maschine neben Ihrer Anwendung wahrscheinlich auch **andere Prozesse** laufen.
|
Und natürlich würden auf derselben Maschine neben Ihrer Anwendung wahrscheinlich auch **andere Prozesse** laufen.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,7 @@ Zuerst würde der Browser mithilfe der **DNS-Server** herausfinden, welches die
|
||||||
|
|
||||||
Die DNS-Server geben dem Browser eine bestimmte **IP-Adresse** zurück. Das wäre die von Ihrem Server verwendete öffentliche IP-Adresse, die Sie in den DNS-Servern konfiguriert haben.
|
Die DNS-Server geben dem Browser eine bestimmte **IP-Adresse** zurück. Das wäre die von Ihrem Server verwendete öffentliche IP-Adresse, die Sie in den DNS-Servern konfiguriert haben.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https01.svg">
|
<img src="/img/deployment/https/https01.drawio.svg">
|
||||||
|
|
||||||
### TLS-Handshake-Start
|
### TLS-Handshake-Start
|
||||||
|
|
||||||
|
|
@ -93,7 +93,7 @@ Der Browser kommuniziert dann mit dieser IP-Adresse über **Port 443** (den HTTP
|
||||||
|
|
||||||
Der erste Teil der Kommunikation besteht lediglich darin, die Verbindung zwischen dem Client und dem Server herzustellen und die zu verwendenden kryptografischen Schlüssel usw. zu vereinbaren.
|
Der erste Teil der Kommunikation besteht lediglich darin, die Verbindung zwischen dem Client und dem Server herzustellen und die zu verwendenden kryptografischen Schlüssel usw. zu vereinbaren.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https02.svg">
|
<img src="/img/deployment/https/https02.drawio.svg">
|
||||||
|
|
||||||
Diese Interaktion zwischen dem Client und dem Server zum Aufbau der TLS-Verbindung wird als **<abbr title="TLS-Handschlag">TLS-Handshake</abbr>** bezeichnet.
|
Diese Interaktion zwischen dem Client und dem Server zum Aufbau der TLS-Verbindung wird als **<abbr title="TLS-Handschlag">TLS-Handshake</abbr>** bezeichnet.
|
||||||
|
|
||||||
|
|
@ -111,7 +111,7 @@ Mithilfe der oben beschriebenen **SNI-Erweiterung** würde der TLS-Terminierungs
|
||||||
|
|
||||||
In diesem Fall würde er das Zertifikat für `someapp.example.com` verwenden.
|
In diesem Fall würde er das Zertifikat für `someapp.example.com` verwenden.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https03.svg">
|
<img src="/img/deployment/https/https03.drawio.svg">
|
||||||
|
|
||||||
Der Client **vertraut** bereits der Entität, die das TLS-Zertifikat generiert hat (in diesem Fall Let's Encrypt, aber wir werden später mehr darüber erfahren), sodass er **verifizieren** kann, dass das Zertifikat gültig ist.
|
Der Client **vertraut** bereits der Entität, die das TLS-Zertifikat generiert hat (in diesem Fall Let's Encrypt, aber wir werden später mehr darüber erfahren), sodass er **verifizieren** kann, dass das Zertifikat gültig ist.
|
||||||
|
|
||||||
|
|
@ -133,19 +133,19 @@ Da Client und Server (sprich, der Browser und der TLS-Terminierungsproxy) nun ü
|
||||||
|
|
||||||
Der Client sendet also einen **HTTPS-Request**. Das ist einfach ein HTTP-Request über eine verschlüsselte TLS-Verbindung.
|
Der Client sendet also einen **HTTPS-Request**. Das ist einfach ein HTTP-Request über eine verschlüsselte TLS-Verbindung.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https04.svg">
|
<img src="/img/deployment/https/https04.drawio.svg">
|
||||||
|
|
||||||
### Den Request entschlüsseln
|
### Den Request entschlüsseln
|
||||||
|
|
||||||
Der TLS-Terminierungsproxy würde die vereinbarte Verschlüsselung zum **Entschlüsseln des Requests** verwenden und den **einfachen (entschlüsselten) HTTP-Request** an den Prozess weiterleiten, der die Anwendung ausführt (z. B. einen Prozess, bei dem Uvicorn die FastAPI-Anwendung ausführt).
|
Der TLS-Terminierungsproxy würde die vereinbarte Verschlüsselung zum **Entschlüsseln des Requests** verwenden und den **einfachen (entschlüsselten) HTTP-Request** an den Prozess weiterleiten, der die Anwendung ausführt (z. B. einen Prozess, bei dem Uvicorn die FastAPI-Anwendung ausführt).
|
||||||
|
|
||||||
<img src="/img/deployment/https/https05.svg">
|
<img src="/img/deployment/https/https05.drawio.svg">
|
||||||
|
|
||||||
### HTTP-Response
|
### HTTP-Response
|
||||||
|
|
||||||
Die Anwendung würde den Request verarbeiten und eine **einfache (unverschlüsselte) HTTP-Response** an den TLS-Terminierungsproxy senden.
|
Die Anwendung würde den Request verarbeiten und eine **einfache (unverschlüsselte) HTTP-Response** an den TLS-Terminierungsproxy senden.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https06.svg">
|
<img src="/img/deployment/https/https06.drawio.svg">
|
||||||
|
|
||||||
### HTTPS-Response
|
### HTTPS-Response
|
||||||
|
|
||||||
|
|
@ -153,7 +153,7 @@ Der TLS-Terminierungsproxy würde dann die Response mithilfe der zuvor vereinbar
|
||||||
|
|
||||||
Als Nächstes überprüft der Browser, ob die Response gültig und mit dem richtigen kryptografischen Schlüssel usw. verschlüsselt ist. Anschließend **entschlüsselt er die Response** und verarbeitet sie.
|
Als Nächstes überprüft der Browser, ob die Response gültig und mit dem richtigen kryptografischen Schlüssel usw. verschlüsselt ist. Anschließend **entschlüsselt er die Response** und verarbeitet sie.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https07.svg">
|
<img src="/img/deployment/https/https07.drawio.svg">
|
||||||
|
|
||||||
Der Client (Browser) weiß, dass die Response vom richtigen Server kommt, da dieser die Kryptografie verwendet, die zuvor mit dem **HTTPS-Zertifikat** vereinbart wurde.
|
Der Client (Browser) weiß, dass die Response vom richtigen Server kommt, da dieser die Kryptografie verwendet, die zuvor mit dem **HTTPS-Zertifikat** vereinbart wurde.
|
||||||
|
|
||||||
|
|
@ -163,7 +163,7 @@ Auf demselben Server (oder denselben Servern) könnten sich **mehrere Anwendunge
|
||||||
|
|
||||||
Nur ein Prozess kann diese spezifische IP und den Port verarbeiten (in unserem Beispiel der TLS-Terminierungsproxy), aber die anderen Anwendungen/Prozesse können auch auf dem/den Server(n) ausgeführt werden, solange sie nicht versuchen, dieselbe **Kombination aus öffentlicher IP und Port** zu verwenden.
|
Nur ein Prozess kann diese spezifische IP und den Port verarbeiten (in unserem Beispiel der TLS-Terminierungsproxy), aber die anderen Anwendungen/Prozesse können auch auf dem/den Server(n) ausgeführt werden, solange sie nicht versuchen, dieselbe **Kombination aus öffentlicher IP und Port** zu verwenden.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https08.svg">
|
<img src="/img/deployment/https/https08.drawio.svg">
|
||||||
|
|
||||||
Auf diese Weise könnte der TLS-Terminierungsproxy HTTPS und Zertifikate für **mehrere Domains**, für mehrere Anwendungen, verarbeiten und die Requests dann jeweils an die richtige Anwendung weiterleiten.
|
Auf diese Weise könnte der TLS-Terminierungsproxy HTTPS und Zertifikate für **mehrere Domains**, für mehrere Anwendungen, verarbeiten und die Requests dann jeweils an die richtige Anwendung weiterleiten.
|
||||||
|
|
||||||
|
|
@ -173,7 +173,7 @@ Irgendwann in der Zukunft würde jedes Zertifikat **ablaufen** (etwa 3 Monate na
|
||||||
|
|
||||||
Und dann gäbe es ein anderes Programm (in manchen Fällen ist es ein anderes Programm, in manchen Fällen ist es derselbe TLS-Terminierungsproxy), das mit Let's Encrypt kommuniziert und das/die Zertifikat(e) erneuert.
|
Und dann gäbe es ein anderes Programm (in manchen Fällen ist es ein anderes Programm, in manchen Fällen ist es derselbe TLS-Terminierungsproxy), das mit Let's Encrypt kommuniziert und das/die Zertifikat(e) erneuert.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https.svg">
|
<img src="/img/deployment/https/https.drawio.svg">
|
||||||
|
|
||||||
Die **TLS-Zertifikate** sind **einem Domainnamen zugeordnet**, nicht einer IP-Adresse.
|
Die **TLS-Zertifikate** sind **einem Domainnamen zugeordnet**, nicht einer IP-Adresse.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ from app.routers import items
|
||||||
* Es gibt auch ein Unterverzeichnis `app/internal/` mit einer weiteren Datei `__init__.py`, es handelt sich also um ein weiteres „Python-Subpackage“: `app.internal`.
|
* Es gibt auch ein Unterverzeichnis `app/internal/` mit einer weiteren Datei `__init__.py`, es handelt sich also um ein weiteres „Python-Subpackage“: `app.internal`.
|
||||||
* Und die Datei `app/internal/admin.py` ist ein weiteres Submodul: `app.internal.admin`.
|
* Und die Datei `app/internal/admin.py` ist ein weiteres Submodul: `app.internal.admin`.
|
||||||
|
|
||||||
<img src="/img/tutorial/bigger-applications/package.svg">
|
<img src="/img/tutorial/bigger-applications/package.drawio.svg">
|
||||||
|
|
||||||
Die gleiche Dateistruktur mit Kommentaren:
|
Die gleiche Dateistruktur mit Kommentaren:
|
||||||
|
|
||||||
|
|
@ -270,7 +270,7 @@ Aber diese Datei existiert nicht, unsere Abhängigkeiten befinden sich in einer
|
||||||
|
|
||||||
Erinnern Sie sich, wie unsere Anwendungs-/Dateistruktur aussieht:
|
Erinnern Sie sich, wie unsere Anwendungs-/Dateistruktur aussieht:
|
||||||
|
|
||||||
<img src="/img/tutorial/bigger-applications/package.svg">
|
<img src="/img/tutorial/bigger-applications/package.drawio.svg">
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -216,7 +216,7 @@
|
||||||
|
|
||||||
👈 👨🏭 🛠️ 🔜 🕐 🏃♂ 👆 🈸, 👫 🔜 🎭 👑 📊 📨 **📨** & 📨 **📨**, & 👫 🔜 📐 🕳 👆 🚮 🔢 💾.
|
👈 👨🏭 🛠️ 🔜 🕐 🏃♂ 👆 🈸, 👫 🔜 🎭 👑 📊 📨 **📨** & 📨 **📨**, & 👫 🔜 📐 🕳 👆 🚮 🔢 💾.
|
||||||
|
|
||||||
<img src="/img/deployment/concepts/process-ram.svg">
|
<img src="/img/deployment/concepts/process-ram.drawio.svg">
|
||||||
|
|
||||||
& ↗️, 🎏 🎰 🔜 🎲 ✔️ **🎏 🛠️** 🏃 👍, ↖️ ⚪️➡️ 👆 🈸.
|
& ↗️, 🎏 🎰 🔜 🎲 ✔️ **🎏 🛠️** 🏃 👍, ↖️ ⚪️➡️ 👆 🈸.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,7 @@
|
||||||
|
|
||||||
🏓 💽 🔜 💬 🖥 ⚙️ 🎯 **📢 📢**. 👈 🔜 📢 📢 📢 ⚙️ 👆 💽, 👈 👆 🔗 🏓 💽.
|
🏓 💽 🔜 💬 🖥 ⚙️ 🎯 **📢 📢**. 👈 🔜 📢 📢 📢 ⚙️ 👆 💽, 👈 👆 🔗 🏓 💽.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https01.svg">
|
<img src="/img/deployment/https/https01.drawio.svg">
|
||||||
|
|
||||||
### 🤝 🤝 ▶️
|
### 🤝 🤝 ▶️
|
||||||
|
|
||||||
|
|
@ -93,7 +93,7 @@
|
||||||
|
|
||||||
🥇 🍕 📻 🛠️ 🔗 🖖 👩💻 & 💽 & 💭 🔐 🔑 👫 🔜 ⚙️, ♒️.
|
🥇 🍕 📻 🛠️ 🔗 🖖 👩💻 & 💽 & 💭 🔐 🔑 👫 🔜 ⚙️, ♒️.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https02.svg">
|
<img src="/img/deployment/https/https02.drawio.svg">
|
||||||
|
|
||||||
👉 🔗 🖖 👩💻 & 💽 🛠️ 🤝 🔗 🤙 **🤝 🤝**.
|
👉 🔗 🖖 👩💻 & 💽 🛠️ 🤝 🔗 🤙 **🤝 🤝**.
|
||||||
|
|
||||||
|
|
@ -111,7 +111,7 @@
|
||||||
|
|
||||||
👉 💼, ⚫️ 🔜 ⚙️ 📄 `someapp.example.com`.
|
👉 💼, ⚫️ 🔜 ⚙️ 📄 `someapp.example.com`.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https03.svg">
|
<img src="/img/deployment/https/https03.drawio.svg">
|
||||||
|
|
||||||
👩💻 ⏪ **💙** 👨💼 👈 🏗 👈 🤝 📄 (👉 💼 ➡️ 🗜, ✋️ 👥 🔜 👀 🔃 👈 ⏪), ⚫️ 💪 **✔** 👈 📄 ☑.
|
👩💻 ⏪ **💙** 👨💼 👈 🏗 👈 🤝 📄 (👉 💼 ➡️ 🗜, ✋️ 👥 🔜 👀 🔃 👈 ⏪), ⚫️ 💪 **✔** 👈 📄 ☑.
|
||||||
|
|
||||||
|
|
@ -133,19 +133,19 @@
|
||||||
|
|
||||||
, 👩💻 📨 **🇺🇸🔍 📨**. 👉 🇺🇸🔍 📨 🔘 🗜 🤝 🔗.
|
, 👩💻 📨 **🇺🇸🔍 📨**. 👉 🇺🇸🔍 📨 🔘 🗜 🤝 🔗.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https04.svg">
|
<img src="/img/deployment/https/https04.drawio.svg">
|
||||||
|
|
||||||
### 🗜 📨
|
### 🗜 📨
|
||||||
|
|
||||||
🤝 ❎ 🗳 🔜 ⚙️ 🔐 ✔ **🗜 📨**, & 🔜 📶 **✅ (🗜) 🇺🇸🔍 📨** 🛠️ 🏃 🈸 (🖼 🛠️ ⏮️ Uvicorn 🏃♂ FastAPI 🈸).
|
🤝 ❎ 🗳 🔜 ⚙️ 🔐 ✔ **🗜 📨**, & 🔜 📶 **✅ (🗜) 🇺🇸🔍 📨** 🛠️ 🏃 🈸 (🖼 🛠️ ⏮️ Uvicorn 🏃♂ FastAPI 🈸).
|
||||||
|
|
||||||
<img src="/img/deployment/https/https05.svg">
|
<img src="/img/deployment/https/https05.drawio.svg">
|
||||||
|
|
||||||
### 🇺🇸🔍 📨
|
### 🇺🇸🔍 📨
|
||||||
|
|
||||||
🈸 🔜 🛠️ 📨 & 📨 **✅ (💽) 🇺🇸🔍 📨** 🤝 ❎ 🗳.
|
🈸 🔜 🛠️ 📨 & 📨 **✅ (💽) 🇺🇸🔍 📨** 🤝 ❎ 🗳.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https06.svg">
|
<img src="/img/deployment/https/https06.drawio.svg">
|
||||||
|
|
||||||
### 🇺🇸🔍 📨
|
### 🇺🇸🔍 📨
|
||||||
|
|
||||||
|
|
@ -153,7 +153,7 @@
|
||||||
|
|
||||||
⏭, 🖥 🔜 ✔ 👈 📨 ☑ & 🗜 ⏮️ ▶️️ 🔐 🔑, ♒️. ⚫️ 🔜 ⤴️ **🗜 📨** & 🛠️ ⚫️.
|
⏭, 🖥 🔜 ✔ 👈 📨 ☑ & 🗜 ⏮️ ▶️️ 🔐 🔑, ♒️. ⚫️ 🔜 ⤴️ **🗜 📨** & 🛠️ ⚫️.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https07.svg">
|
<img src="/img/deployment/https/https07.drawio.svg">
|
||||||
|
|
||||||
👩💻 (🖥) 🔜 💭 👈 📨 👟 ⚪️➡️ ☑ 💽 ↩️ ⚫️ ⚙️ ⚛ 👫 ✔ ⚙️ **🇺🇸🔍 📄** ⏭.
|
👩💻 (🖥) 🔜 💭 👈 📨 👟 ⚪️➡️ ☑ 💽 ↩️ ⚫️ ⚙️ ⚛ 👫 ✔ ⚙️ **🇺🇸🔍 📄** ⏭.
|
||||||
|
|
||||||
|
|
@ -163,7 +163,7 @@
|
||||||
|
|
||||||
🕴 1️⃣ 🛠️ 💪 🚚 🎯 📢 & ⛴ (🤝 ❎ 🗳 👆 🖼) ✋️ 🎏 🈸/🛠️ 💪 🏃 🔛 💽(Ⓜ) 💁♂️, 📏 👫 🚫 🔄 ⚙️ 🎏 **🌀 📢 📢 & ⛴**.
|
🕴 1️⃣ 🛠️ 💪 🚚 🎯 📢 & ⛴ (🤝 ❎ 🗳 👆 🖼) ✋️ 🎏 🈸/🛠️ 💪 🏃 🔛 💽(Ⓜ) 💁♂️, 📏 👫 🚫 🔄 ⚙️ 🎏 **🌀 📢 📢 & ⛴**.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https08.svg">
|
<img src="/img/deployment/https/https08.drawio.svg">
|
||||||
|
|
||||||
👈 🌌, 🤝 ❎ 🗳 💪 🍵 🇺🇸🔍 & 📄 **💗 🆔**, 💗 🈸, & ⤴️ 📶 📨 ▶️️ 🈸 🔠 💼.
|
👈 🌌, 🤝 ❎ 🗳 💪 🍵 🇺🇸🔍 & 📄 **💗 🆔**, 💗 🈸, & ⤴️ 📶 📨 ▶️️ 🈸 🔠 💼.
|
||||||
|
|
||||||
|
|
@ -173,7 +173,7 @@
|
||||||
|
|
||||||
& ⤴️, 📤 🔜 ➕1️⃣ 📋 (💼 ⚫️ ➕1️⃣ 📋, 💼 ⚫️ 💪 🎏 🤝 ❎ 🗳) 👈 🔜 💬 ➡️ 🗜, & ♻ 📄(Ⓜ).
|
& ⤴️, 📤 🔜 ➕1️⃣ 📋 (💼 ⚫️ ➕1️⃣ 📋, 💼 ⚫️ 💪 🎏 🤝 ❎ 🗳) 👈 🔜 💬 ➡️ 🗜, & ♻ 📄(Ⓜ).
|
||||||
|
|
||||||
<img src="/img/deployment/https/https.svg">
|
<img src="/img/deployment/https/https.drawio.svg">
|
||||||
|
|
||||||
**🤝 📄** **🔗 ⏮️ 🆔 📛**, 🚫 ⏮️ 📢 📢.
|
**🤝 📄** **🔗 ⏮️ 🆔 📛**, 🚫 ⏮️ 📢 📢.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ from app.routers import items
|
||||||
* 📤 📁 `app/internal/` ⏮️ ➕1️⃣ 📁 `__init__.py`, ⚫️ ➕1️⃣ "🐍 📦": `app.internal`.
|
* 📤 📁 `app/internal/` ⏮️ ➕1️⃣ 📁 `__init__.py`, ⚫️ ➕1️⃣ "🐍 📦": `app.internal`.
|
||||||
* & 📁 `app/internal/admin.py` ➕1️⃣ 🔁: `app.internal.admin`.
|
* & 📁 `app/internal/admin.py` ➕1️⃣ 🔁: `app.internal.admin`.
|
||||||
|
|
||||||
<img src="/img/tutorial/bigger-applications/package.svg">
|
<img src="/img/tutorial/bigger-applications/package.drawio.svg">
|
||||||
|
|
||||||
🎏 📁 📊 ⏮️ 🏤:
|
🎏 📁 📊 ⏮️ 🏤:
|
||||||
|
|
||||||
|
|
@ -244,7 +244,7 @@ from .dependencies import get_token_header
|
||||||
|
|
||||||
💭 ❔ 👆 📱/📁 📊 👀 💖:
|
💭 ❔ 👆 📱/📁 📊 👀 💖:
|
||||||
|
|
||||||
<img src="/img/tutorial/bigger-applications/package.svg">
|
<img src="/img/tutorial/bigger-applications/package.drawio.svg">
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
tiangolo:
|
tiangolo:
|
||||||
login: tiangolo
|
login: tiangolo
|
||||||
count: 734
|
count: 753
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
|
||||||
url: https://github.com/tiangolo
|
url: https://github.com/tiangolo
|
||||||
dependabot:
|
dependabot:
|
||||||
login: dependabot
|
login: dependabot
|
||||||
count: 100
|
count: 104
|
||||||
avatarUrl: https://avatars.githubusercontent.com/in/29110?v=4
|
avatarUrl: https://avatars.githubusercontent.com/in/29110?v=4
|
||||||
url: https://github.com/apps/dependabot
|
url: https://github.com/apps/dependabot
|
||||||
alejsdev:
|
alejsdev:
|
||||||
|
|
@ -15,7 +15,7 @@ alejsdev:
|
||||||
url: https://github.com/alejsdev
|
url: https://github.com/alejsdev
|
||||||
pre-commit-ci:
|
pre-commit-ci:
|
||||||
login: pre-commit-ci
|
login: pre-commit-ci
|
||||||
count: 27
|
count: 33
|
||||||
avatarUrl: https://avatars.githubusercontent.com/in/68672?v=4
|
avatarUrl: https://avatars.githubusercontent.com/in/68672?v=4
|
||||||
url: https://github.com/apps/pre-commit-ci
|
url: https://github.com/apps/pre-commit-ci
|
||||||
github-actions:
|
github-actions:
|
||||||
|
|
@ -116,7 +116,7 @@ hitrust:
|
||||||
ShahriyarR:
|
ShahriyarR:
|
||||||
login: ShahriyarR
|
login: ShahriyarR
|
||||||
count: 4
|
count: 4
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/3852029?u=c9a1691e5ebdc94cbf543086099a6ed705cdb873&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/3852029?u=631b2ae59360ab380c524b32bc3d245aff1165af&v=4
|
||||||
url: https://github.com/ShahriyarR
|
url: https://github.com/ShahriyarR
|
||||||
adriangb:
|
adriangb:
|
||||||
login: adriangb
|
login: adriangb
|
||||||
|
|
@ -513,6 +513,11 @@ tamird:
|
||||||
count: 2
|
count: 2
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/1535036?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/1535036?v=4
|
||||||
url: https://github.com/tamird
|
url: https://github.com/tamird
|
||||||
|
ndimares:
|
||||||
|
login: ndimares
|
||||||
|
count: 2
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/6267663?u=cfb27efde7a7212be8142abb6c058a1aeadb41b1&v=4
|
||||||
|
url: https://github.com/ndimares
|
||||||
rabinlamadong:
|
rabinlamadong:
|
||||||
login: rabinlamadong
|
login: rabinlamadong
|
||||||
count: 2
|
count: 2
|
||||||
|
|
@ -538,8 +543,18 @@ DanielYang59:
|
||||||
count: 2
|
count: 2
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/80093591?u=63873f701c7c74aac83c906800a1dddc0bc8c92f&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/80093591?u=63873f701c7c74aac83c906800a1dddc0bc8c92f&v=4
|
||||||
url: https://github.com/DanielYang59
|
url: https://github.com/DanielYang59
|
||||||
|
valentinDruzhinin:
|
||||||
|
login: valentinDruzhinin
|
||||||
|
count: 2
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4
|
||||||
|
url: https://github.com/valentinDruzhinin
|
||||||
blueswen:
|
blueswen:
|
||||||
login: blueswen
|
login: blueswen
|
||||||
count: 2
|
count: 2
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/1564148?u=6d6b8cc8f2b5cef715e68d6175154a8a94d518ee&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/1564148?u=6d6b8cc8f2b5cef715e68d6175154a8a94d518ee&v=4
|
||||||
url: https://github.com/blueswen
|
url: https://github.com/blueswen
|
||||||
|
YuriiMotov:
|
||||||
|
login: YuriiMotov
|
||||||
|
count: 2
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4
|
||||||
|
url: https://github.com/YuriiMotov
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,7 @@
|
||||||
sponsors:
|
sponsors:
|
||||||
|
- - login: classmethod
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/1532151?v=4
|
||||||
|
url: https://github.com/classmethod
|
||||||
- - login: renderinc
|
- - login: renderinc
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/36424661?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/36424661?v=4
|
||||||
url: https://github.com/renderinc
|
url: https://github.com/renderinc
|
||||||
|
|
@ -14,9 +17,12 @@ sponsors:
|
||||||
- login: coderabbitai
|
- login: coderabbitai
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/132028505?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/132028505?v=4
|
||||||
url: https://github.com/coderabbitai
|
url: https://github.com/coderabbitai
|
||||||
- login: porter-dev
|
- login: madisonredtfeldt
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/62078005?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/152656511?v=4
|
||||||
url: https://github.com/porter-dev
|
url: https://github.com/madisonredtfeldt
|
||||||
|
- login: subtotal
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/176449348?v=4
|
||||||
|
url: https://github.com/subtotal
|
||||||
- login: Nixtla
|
- login: Nixtla
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/79945230?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/79945230?v=4
|
||||||
url: https://github.com/Nixtla
|
url: https://github.com/Nixtla
|
||||||
|
|
@ -26,7 +32,10 @@ sponsors:
|
||||||
- - login: ObliviousAI
|
- - login: ObliviousAI
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/65656077?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/65656077?v=4
|
||||||
url: https://github.com/ObliviousAI
|
url: https://github.com/ObliviousAI
|
||||||
- - login: svix
|
- - login: dribia
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/41189616?v=4
|
||||||
|
url: https://github.com/dribia
|
||||||
|
- login: svix
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/80175132?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/80175132?v=4
|
||||||
url: https://github.com/svix
|
url: https://github.com/svix
|
||||||
- login: stainless-api
|
- login: stainless-api
|
||||||
|
|
@ -41,18 +50,21 @@ sponsors:
|
||||||
- login: permitio
|
- login: permitio
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/71775833?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/71775833?v=4
|
||||||
url: https://github.com/permitio
|
url: https://github.com/permitio
|
||||||
- - login: mercedes-benz
|
- - login: xoflare
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/34240465?v=4
|
|
||||||
url: https://github.com/mercedes-benz
|
|
||||||
- login: xoflare
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/74335107?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/74335107?v=4
|
||||||
url: https://github.com/xoflare
|
url: https://github.com/xoflare
|
||||||
- login: marvin-robot
|
- login: marvin-robot
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/41086007?u=b9fcab402d0cd0aec738b6574fe60855cb0cd36d&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/41086007?u=b9fcab402d0cd0aec738b6574fe60855cb0cd36d&v=4
|
||||||
url: https://github.com/marvin-robot
|
url: https://github.com/marvin-robot
|
||||||
|
- login: mercedes-benz
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/34240465?v=4
|
||||||
|
url: https://github.com/mercedes-benz
|
||||||
- login: Ponte-Energy-Partners
|
- login: Ponte-Energy-Partners
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/114745848?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/114745848?v=4
|
||||||
url: https://github.com/Ponte-Energy-Partners
|
url: https://github.com/Ponte-Energy-Partners
|
||||||
|
- login: snapit-cypher
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/115662654?v=4
|
||||||
|
url: https://github.com/snapit-cypher
|
||||||
- login: LambdaTest-Inc
|
- login: LambdaTest-Inc
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/171592363?u=96606606a45fa170427206199014f2a5a2a4920b&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/171592363?u=96606606a45fa170427206199014f2a5a2a4920b&v=4
|
||||||
url: https://github.com/LambdaTest-Inc
|
url: https://github.com/LambdaTest-Inc
|
||||||
|
|
@ -68,6 +80,9 @@ sponsors:
|
||||||
- - login: takashi-yoneya
|
- - login: takashi-yoneya
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/33813153?u=2d0522bceba0b8b69adf1f2db866503bd96f944e&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/33813153?u=2d0522bceba0b8b69adf1f2db866503bd96f944e&v=4
|
||||||
url: https://github.com/takashi-yoneya
|
url: https://github.com/takashi-yoneya
|
||||||
|
- login: Doist
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/2565372?v=4
|
||||||
|
url: https://github.com/Doist
|
||||||
- - login: mainframeindustries
|
- - login: mainframeindustries
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/55092103?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/55092103?v=4
|
||||||
url: https://github.com/mainframeindustries
|
url: https://github.com/mainframeindustries
|
||||||
|
|
@ -83,30 +98,24 @@ sponsors:
|
||||||
- - login: upciti
|
- - login: upciti
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/43346262?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/43346262?v=4
|
||||||
url: https://github.com/upciti
|
url: https://github.com/upciti
|
||||||
- login: f4rk4sh
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/90454259?v=4
|
|
||||||
url: https://github.com/f4rk4sh
|
|
||||||
- login: freddiev4
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/8339018?u=1aad5b4f5a04cb750852b843d5e1d8f4ce339c2e&v=4
|
|
||||||
url: https://github.com/freddiev4
|
|
||||||
- - login: samuelcolvin
|
- - login: samuelcolvin
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/4039449?u=42eb3b833047c8c4b4f647a031eaef148c16d93f&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/4039449?u=42eb3b833047c8c4b4f647a031eaef148c16d93f&v=4
|
||||||
url: https://github.com/samuelcolvin
|
url: https://github.com/samuelcolvin
|
||||||
- login: vincentkoc
|
- login: CoodingPenguin
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/25068?u=fbd5b2d51142daa4bdbc21e21953a3b8b8188a4a&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/37505775?u=6a9e1f6647fbf95f99afeee82a3682e15fc6e959&v=4
|
||||||
url: https://github.com/vincentkoc
|
url: https://github.com/CoodingPenguin
|
||||||
|
- login: deight93
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/37678115?u=a608798b5bd0034183a9c430ebb42fb266db86ce&v=4
|
||||||
|
url: https://github.com/deight93
|
||||||
- login: otosky
|
- login: otosky
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/42260747?u=69d089387c743d89427aa4ad8740cfb34045a9e0&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/42260747?u=69d089387c743d89427aa4ad8740cfb34045a9e0&v=4
|
||||||
url: https://github.com/otosky
|
url: https://github.com/otosky
|
||||||
- login: ramonalmeidam
|
- login: ramonalmeidam
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/45269580?u=3358750b3a5854d7c3ed77aaca7dd20a0f529d32&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/45269580?u=3358750b3a5854d7c3ed77aaca7dd20a0f529d32&v=4
|
||||||
url: https://github.com/ramonalmeidam
|
url: https://github.com/ramonalmeidam
|
||||||
- login: ashi-agrawal
|
- login: kaoru0310
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/17105294?u=99c7a854035e5398d8e7b674f2d42baae6c957f8&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/80977929?u=1b61d10142b490e56af932ddf08a390fae8ee94f&v=4
|
||||||
url: https://github.com/ashi-agrawal
|
url: https://github.com/kaoru0310
|
||||||
- login: sepsi77
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/18682303?v=4
|
|
||||||
url: https://github.com/sepsi77
|
|
||||||
- login: RaamEEIL
|
- login: RaamEEIL
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/20320552?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/20320552?v=4
|
||||||
url: https://github.com/RaamEEIL
|
url: https://github.com/RaamEEIL
|
||||||
|
|
@ -125,12 +134,6 @@ sponsors:
|
||||||
- login: ProteinQure
|
- login: ProteinQure
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/33707203?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/33707203?v=4
|
||||||
url: https://github.com/ProteinQure
|
url: https://github.com/ProteinQure
|
||||||
- login: roboflow
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/53104118?v=4
|
|
||||||
url: https://github.com/roboflow
|
|
||||||
- login: kaoru0310
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/80977929?u=1b61d10142b490e56af932ddf08a390fae8ee94f&v=4
|
|
||||||
url: https://github.com/kaoru0310
|
|
||||||
- login: DelfinaCare
|
- login: DelfinaCare
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/83734439?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/83734439?v=4
|
||||||
url: https://github.com/DelfinaCare
|
url: https://github.com/DelfinaCare
|
||||||
|
|
@ -146,6 +149,9 @@ sponsors:
|
||||||
- login: logic-automation
|
- login: logic-automation
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/144732884?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/144732884?v=4
|
||||||
url: https://github.com/logic-automation
|
url: https://github.com/logic-automation
|
||||||
|
- login: roboflow
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/53104118?v=4
|
||||||
|
url: https://github.com/roboflow
|
||||||
- login: dudikbender
|
- login: dudikbender
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/53487583?u=3a57542938ebfd57579a0111db2b297e606d9681&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/53487583?u=3a57542938ebfd57579a0111db2b297e606d9681&v=4
|
||||||
url: https://github.com/dudikbender
|
url: https://github.com/dudikbender
|
||||||
|
|
@ -185,15 +191,15 @@ sponsors:
|
||||||
- login: anomaly
|
- login: anomaly
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/3654837?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/3654837?v=4
|
||||||
url: https://github.com/anomaly
|
url: https://github.com/anomaly
|
||||||
|
- login: mj0331
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/3890353?u=1c627ac1a024515b4871de5c3ebbfaa1a57f65d4&v=4
|
||||||
|
url: https://github.com/mj0331
|
||||||
- login: gorhack
|
- login: gorhack
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/4141690?u=ec119ebc4bdf00a7bc84657a71aa17834f4f27f3&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/4141690?u=ec119ebc4bdf00a7bc84657a71aa17834f4f27f3&v=4
|
||||||
url: https://github.com/gorhack
|
url: https://github.com/gorhack
|
||||||
- login: Ryandaydev
|
- login: vincentkoc
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/4292423?u=679ff84cb7b988c5795a5fa583857f574a055763&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/25068?u=fbd5b2d51142daa4bdbc21e21953a3b8b8188a4a&v=4
|
||||||
url: https://github.com/Ryandaydev
|
url: https://github.com/vincentkoc
|
||||||
- login: jaredtrog
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/4381365?v=4
|
|
||||||
url: https://github.com/jaredtrog
|
|
||||||
- login: jstanden
|
- login: jstanden
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/63288?u=c3658d57d2862c607a0e19c2101c3c51876e36ad&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/63288?u=c3658d57d2862c607a0e19c2101c3c51876e36ad&v=4
|
||||||
url: https://github.com/jstanden
|
url: https://github.com/jstanden
|
||||||
|
|
@ -215,9 +221,6 @@ sponsors:
|
||||||
- login: wshayes
|
- login: wshayes
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/365303?u=07ca03c5ee811eb0920e633cc3c3db73dbec1aa5&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/365303?u=07ca03c5ee811eb0920e633cc3c3db73dbec1aa5&v=4
|
||||||
url: https://github.com/wshayes
|
url: https://github.com/wshayes
|
||||||
- login: gaetanBloch
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/583199?u=50c49e83d6b4feb78a091901ea02ead1462f442b&v=4
|
|
||||||
url: https://github.com/gaetanBloch
|
|
||||||
- login: koxudaxi
|
- login: koxudaxi
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/630670?u=507d8577b4b3670546b449c4c2ccbc5af40d72f7&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/630670?u=507d8577b4b3670546b449c4c2ccbc5af40d72f7&v=4
|
||||||
url: https://github.com/koxudaxi
|
url: https://github.com/koxudaxi
|
||||||
|
|
@ -227,18 +230,9 @@ sponsors:
|
||||||
- login: mintuhouse
|
- login: mintuhouse
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/769950?u=ecfbd79a97d33177e0d093ddb088283cf7fe8444&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/769950?u=ecfbd79a97d33177e0d093ddb088283cf7fe8444&v=4
|
||||||
url: https://github.com/mintuhouse
|
url: https://github.com/mintuhouse
|
||||||
- login: oliverxchen
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/4471774?u=534191f25e32eeaadda22dfab4b0a428733d5489&v=4
|
|
||||||
url: https://github.com/oliverxchen
|
|
||||||
- login: TrevorBenson
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/9167887?u=dccbea3327a57750923333d8ebf1a0b3f1948949&v=4
|
|
||||||
url: https://github.com/TrevorBenson
|
|
||||||
- login: wdwinslow
|
- login: wdwinslow
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/11562137?u=dc01daafb354135603a263729e3d26d939c0c452&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/11562137?u=371272f2c69e680e0559a7b0a57385e83a5dc728&v=4
|
||||||
url: https://github.com/wdwinslow
|
url: https://github.com/wdwinslow
|
||||||
- login: catherinenelson1
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/11951946?u=fe11bc35d36b6038cd46a946e4e46ef8aa5688ab&v=4
|
|
||||||
url: https://github.com/catherinenelson1
|
|
||||||
- login: jsoques
|
- login: jsoques
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/12414216?u=620921d94196546cc8b9eae2cc4cbc3f95bab42f&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/12414216?u=620921d94196546cc8b9eae2cc4cbc3f95bab42f&v=4
|
||||||
url: https://github.com/jsoques
|
url: https://github.com/jsoques
|
||||||
|
|
@ -254,6 +248,18 @@ sponsors:
|
||||||
- login: mjohnsey
|
- login: mjohnsey
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/16784016?u=38fad2e6b411244560b3af99c5f5a4751bc81865&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/16784016?u=38fad2e6b411244560b3af99c5f5a4751bc81865&v=4
|
||||||
url: https://github.com/mjohnsey
|
url: https://github.com/mjohnsey
|
||||||
|
- login: ashi-agrawal
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/17105294?u=99c7a854035e5398d8e7b674f2d42baae6c957f8&v=4
|
||||||
|
url: https://github.com/ashi-agrawal
|
||||||
|
- login: Ryandaydev
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/4292423?u=679ff84cb7b988c5795a5fa583857f574a055763&v=4
|
||||||
|
url: https://github.com/Ryandaydev
|
||||||
|
- login: jaredtrog
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/4381365?v=4
|
||||||
|
url: https://github.com/jaredtrog
|
||||||
|
- login: oliverxchen
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/4471774?u=534191f25e32eeaadda22dfab4b0a428733d5489&v=4
|
||||||
|
url: https://github.com/oliverxchen
|
||||||
- login: ternaus
|
- login: ternaus
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/5481618?u=513a26b02a39e7a28d587cd37c6cc877ea368e6e&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/5481618?u=513a26b02a39e7a28d587cd37c6cc877ea368e6e&v=4
|
||||||
url: https://github.com/ternaus
|
url: https://github.com/ternaus
|
||||||
|
|
@ -263,9 +269,6 @@ sponsors:
|
||||||
- login: FernandoCelmer
|
- login: FernandoCelmer
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/6262214?u=58ba6d5888fa7f355934e52db19f950e20b38162&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/6262214?u=58ba6d5888fa7f355934e52db19f950e20b38162&v=4
|
||||||
url: https://github.com/FernandoCelmer
|
url: https://github.com/FernandoCelmer
|
||||||
- login: simw
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/6322526?v=4
|
|
||||||
url: https://github.com/simw
|
|
||||||
- login: Rehket
|
- login: Rehket
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/7015688?u=3afb0ba200feebbc7f958950e92db34df2a3c172&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/7015688?u=3afb0ba200feebbc7f958950e92db34df2a3c172&v=4
|
||||||
url: https://github.com/Rehket
|
url: https://github.com/Rehket
|
||||||
|
|
@ -278,9 +281,6 @@ sponsors:
|
||||||
- - login: pawamoy
|
- - login: pawamoy
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/3999221?u=b030e4c89df2f3a36bc4710b925bdeb6745c9856&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/3999221?u=b030e4c89df2f3a36bc4710b925bdeb6745c9856&v=4
|
||||||
url: https://github.com/pawamoy
|
url: https://github.com/pawamoy
|
||||||
- login: bnkc
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/34930566?u=db5e6f4f87836cad26c2aa90ce390ce49041c5a9&v=4
|
|
||||||
url: https://github.com/bnkc
|
|
||||||
- login: petercool
|
- login: petercool
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/37613029?u=81c525232bb35780945a68e88afd96bb2cdad9c4&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/37613029?u=81c525232bb35780945a68e88afd96bb2cdad9c4&v=4
|
||||||
url: https://github.com/petercool
|
url: https://github.com/petercool
|
||||||
|
|
@ -296,9 +296,6 @@ sponsors:
|
||||||
- login: caviri
|
- login: caviri
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/45425937?u=4e14bd64282bad8f385eafbdb004b5a279366d6e&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/45425937?u=4e14bd64282bad8f385eafbdb004b5a279366d6e&v=4
|
||||||
url: https://github.com/caviri
|
url: https://github.com/caviri
|
||||||
- login: hgalytoby
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/50397689?u=62c7ff3519858423579676cd0efbd7e3f1ffe63a&v=4
|
|
||||||
url: https://github.com/hgalytoby
|
|
||||||
- login: joshuatz
|
- login: joshuatz
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/17817563?u=f1bf05b690d1fc164218f0b420cdd3acb7913e21&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/17817563?u=f1bf05b690d1fc164218f0b420cdd3acb7913e21&v=4
|
||||||
url: https://github.com/joshuatz
|
url: https://github.com/joshuatz
|
||||||
|
|
@ -317,27 +314,24 @@ sponsors:
|
||||||
- login: rlnchow
|
- login: rlnchow
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/28018479?u=a93ca9cf1422b9ece155784a72d5f2fdbce7adff&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/28018479?u=a93ca9cf1422b9ece155784a72d5f2fdbce7adff&v=4
|
||||||
url: https://github.com/rlnchow
|
url: https://github.com/rlnchow
|
||||||
- login: dvlpjrs
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/32254642?u=fbd6ad0324d4f1eb6231cf775be1c7bd4404e961&v=4
|
|
||||||
url: https://github.com/dvlpjrs
|
|
||||||
- login: engineerjoe440
|
- login: engineerjoe440
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/33275230?u=eb223cad27017bb1e936ee9b429b450d092d0236&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/33275230?u=eb223cad27017bb1e936ee9b429b450d092d0236&v=4
|
||||||
url: https://github.com/engineerjoe440
|
url: https://github.com/engineerjoe440
|
||||||
- login: conservative-dude
|
- login: bnkc
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/55538308?u=f250c44942ea6e73a6bd90739b381c470c192c11&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/34930566?u=db5e6f4f87836cad26c2aa90ce390ce49041c5a9&v=4
|
||||||
url: https://github.com/conservative-dude
|
url: https://github.com/bnkc
|
||||||
- login: CR1337
|
- login: lukzmu
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/62649536?u=57a6aab10d2421a497306da8bcded01b826c54ae&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/175964415?u=75348f25bb99a5f92ddb40c0b9b1ff7acb39c150&v=4
|
||||||
url: https://github.com/CR1337
|
url: https://github.com/lukzmu
|
||||||
|
- login: hgalytoby
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/50397689?u=62c7ff3519858423579676cd0efbd7e3f1ffe63a&v=4
|
||||||
|
url: https://github.com/hgalytoby
|
||||||
- login: PunRabbit
|
- login: PunRabbit
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/70463212?u=1a835cfbc99295a60c8282f6aa6199d1b42241a5&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/70463212?u=1a835cfbc99295a60c8282f6aa6199d1b42241a5&v=4
|
||||||
url: https://github.com/PunRabbit
|
url: https://github.com/PunRabbit
|
||||||
- login: PelicanQ
|
- login: PelicanQ
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/77930606?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/77930606?v=4
|
||||||
url: https://github.com/PelicanQ
|
url: https://github.com/PelicanQ
|
||||||
- login: tochikuji
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/851759?v=4
|
|
||||||
url: https://github.com/tochikuji
|
|
||||||
- login: browniebroke
|
- login: browniebroke
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/861044?u=5abfca5588f3e906b31583d7ee62f6de4b68aa24&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/861044?u=5abfca5588f3e906b31583d7ee62f6de4b68aa24&v=4
|
||||||
url: https://github.com/browniebroke
|
url: https://github.com/browniebroke
|
||||||
|
|
@ -350,9 +344,6 @@ sponsors:
|
||||||
- login: my3
|
- login: my3
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/1825270?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/1825270?v=4
|
||||||
url: https://github.com/my3
|
url: https://github.com/my3
|
||||||
- login: leobiscassi
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/1977418?u=f9f82445a847ab479bd7223debd677fcac6c49a0&v=4
|
|
||||||
url: https://github.com/leobiscassi
|
|
||||||
- login: Alisa-lisa
|
- login: Alisa-lisa
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/4137964?u=e7e393504f554f4ff15863a1e01a5746863ef9ce&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/4137964?u=e7e393504f554f4ff15863a1e01a5746863ef9ce&v=4
|
||||||
url: https://github.com/Alisa-lisa
|
url: https://github.com/Alisa-lisa
|
||||||
|
|
@ -368,6 +359,9 @@ sponsors:
|
||||||
- login: ceb10n
|
- login: ceb10n
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4
|
||||||
url: https://github.com/ceb10n
|
url: https://github.com/ceb10n
|
||||||
|
- login: tochikuji
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/851759?v=4
|
||||||
|
url: https://github.com/tochikuji
|
||||||
- login: moonape1226
|
- login: moonape1226
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/8532038?u=d9f8b855a429fff9397c3833c2ff83849ebf989d&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/8532038?u=d9f8b855a429fff9397c3833c2ff83849ebf989d&v=4
|
||||||
url: https://github.com/moonape1226
|
url: https://github.com/moonape1226
|
||||||
|
|
@ -425,13 +419,7 @@ sponsors:
|
||||||
- login: harsh183
|
- login: harsh183
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/7780198?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/7780198?v=4
|
||||||
url: https://github.com/harsh183
|
url: https://github.com/harsh183
|
||||||
- login: hcristea
|
- - login: andrecorumba
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/7814406?u=19092923a4ea5b338567961c8270b9206a6d81bb&v=4
|
|
||||||
url: https://github.com/hcristea
|
|
||||||
- - login: larsyngvelundin
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/34173819?u=74958599695bf83ac9f1addd935a51548a10c6b0&v=4
|
|
||||||
url: https://github.com/larsyngvelundin
|
|
||||||
- login: andrecorumba
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/37807517?u=9b9be3b41da9bda60957da9ef37b50dbf65baa61&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/37807517?u=9b9be3b41da9bda60957da9ef37b50dbf65baa61&v=4
|
||||||
url: https://github.com/andrecorumba
|
url: https://github.com/andrecorumba
|
||||||
- login: rwxd
|
- login: rwxd
|
||||||
|
|
@ -446,27 +434,24 @@ sponsors:
|
||||||
- login: Olegt0rr
|
- login: Olegt0rr
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/25399456?u=3e87b5239a2f4600975ba13be73054f8567c6060&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/25399456?u=3e87b5239a2f4600975ba13be73054f8567c6060&v=4
|
||||||
url: https://github.com/Olegt0rr
|
url: https://github.com/Olegt0rr
|
||||||
- login: Miles-Arts
|
- login: larsyngvelundin
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/82297475?u=c41881e4b386d9dbf737218542b120336b5731a1&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/34173819?u=74958599695bf83ac9f1addd935a51548a10c6b0&v=4
|
||||||
url: https://github.com/Miles-Arts
|
url: https://github.com/larsyngvelundin
|
||||||
- login: sandeepsalwan1
|
- login: 0ne-stone
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/118837112?u=fc9b0330fa4791950661b7decd9bf56f07599b43&v=4
|
|
||||||
url: https://github.com/sandeepsalwan1
|
|
||||||
- login: fabioantonioastore
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/132024075?u=b3a267f2e2c7ce2379f82163f88111bd2a2a2f1e&v=4
|
|
||||||
url: https://github.com/fabioantonioastore
|
|
||||||
- login: zhandos256
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/60260671?u=aa9ed698bc3cd06fb553d2ef91d3895bbb00cce1&v=4
|
|
||||||
url: https://github.com/zhandos256
|
|
||||||
- login: one-st-one
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/62360849?u=746dd21c34e7e06eefb11b03e8bb01aaae3c2a4f&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/62360849?u=746dd21c34e7e06eefb11b03e8bb01aaae3c2a4f&v=4
|
||||||
url: https://github.com/one-st-one
|
url: https://github.com/0ne-stone
|
||||||
|
- login: darixsamani
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/67915678?u=cfa82128692eeeec4bf0e7a0faaa9a614695c0f9&v=4
|
||||||
|
url: https://github.com/darixsamani
|
||||||
|
- login: nayasinghania
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/74111380?u=af853245a21fe052b6a27e41a8de8cf4cdf76e85&v=4
|
||||||
|
url: https://github.com/nayasinghania
|
||||||
- login: Toothwitch
|
- login: Toothwitch
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/1710406?u=5eebb23b46cd26e48643b9e5179536cad491c17a&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/1710406?u=5eebb23b46cd26e48643b9e5179536cad491c17a&v=4
|
||||||
url: https://github.com/Toothwitch
|
url: https://github.com/Toothwitch
|
||||||
- login: ssbarnea
|
- login: roboman-tech
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/102495?u=c7bd9ddf127785286fc939dd18cb02db0a453bce&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/8183070?u=fdeaa2ed29f598eb7901693884c0ad32b16982e3&v=4
|
||||||
url: https://github.com/ssbarnea
|
url: https://github.com/roboman-tech
|
||||||
- login: andreagrandi
|
- login: andreagrandi
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/636391?u=13d90cb8ec313593a5b71fbd4e33b78d6da736f5&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/636391?u=13d90cb8ec313593a5b71fbd4e33b78d6da736f5&v=4
|
||||||
url: https://github.com/andreagrandi
|
url: https://github.com/andreagrandi
|
||||||
|
|
|
||||||
|
|
@ -5,18 +5,12 @@ gold:
|
||||||
- url: https://platform.sh/try-it-now/?utm_source=fastapi-signup&utm_medium=banner&utm_campaign=FastAPI-signup-June-2023
|
- url: https://platform.sh/try-it-now/?utm_source=fastapi-signup&utm_medium=banner&utm_campaign=FastAPI-signup-June-2023
|
||||||
title: "Build, run and scale your apps on a modern, reliable, and secure PaaS."
|
title: "Build, run and scale your apps on a modern, reliable, and secure PaaS."
|
||||||
img: https://fastapi.tiangolo.com/img/sponsors/platform-sh.png
|
img: https://fastapi.tiangolo.com/img/sponsors/platform-sh.png
|
||||||
- url: https://www.porter.run
|
|
||||||
title: Deploy FastAPI on AWS with a few clicks
|
|
||||||
img: https://fastapi.tiangolo.com/img/sponsors/porter.png
|
|
||||||
- url: https://github.com/scalar/scalar/?utm_source=fastapi&utm_medium=website&utm_campaign=main-badge
|
- url: https://github.com/scalar/scalar/?utm_source=fastapi&utm_medium=website&utm_campaign=main-badge
|
||||||
title: "Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files"
|
title: "Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files"
|
||||||
img: https://fastapi.tiangolo.com/img/sponsors/scalar.svg
|
img: https://fastapi.tiangolo.com/img/sponsors/scalar.svg
|
||||||
- url: https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=mainbadge
|
- url: https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=mainbadge
|
||||||
title: Auth, user management and more for your B2B product
|
title: Auth, user management and more for your B2B product
|
||||||
img: https://fastapi.tiangolo.com/img/sponsors/propelauth.png
|
img: https://fastapi.tiangolo.com/img/sponsors/propelauth.png
|
||||||
- url: https://www.mongodb.com/developer/languages/python/python-quickstart-fastapi/?utm_campaign=fastapi_framework&utm_source=fastapi_sponsorship&utm_medium=web_referral
|
|
||||||
title: Simplify Full Stack Development with FastAPI & MongoDB
|
|
||||||
img: https://fastapi.tiangolo.com/img/sponsors/mongodb.png
|
|
||||||
- url: https://zuplo.link/fastapi-gh
|
- url: https://zuplo.link/fastapi-gh
|
||||||
title: 'Zuplo: Deploy, Secure, Document, and Monetize your FastAPI'
|
title: 'Zuplo: Deploy, Secure, Document, and Monetize your FastAPI'
|
||||||
img: https://fastapi.tiangolo.com/img/sponsors/zuplo.png
|
img: https://fastapi.tiangolo.com/img/sponsors/zuplo.png
|
||||||
|
|
@ -29,14 +23,14 @@ gold:
|
||||||
- url: https://www.coderabbit.ai/?utm_source=fastapi&utm_medium=badge&utm_campaign=fastapi
|
- url: https://www.coderabbit.ai/?utm_source=fastapi&utm_medium=badge&utm_campaign=fastapi
|
||||||
title: Cut Code Review Time & Bugs in Half with CodeRabbit
|
title: Cut Code Review Time & Bugs in Half with CodeRabbit
|
||||||
img: https://fastapi.tiangolo.com/img/sponsors/coderabbit.png
|
img: https://fastapi.tiangolo.com/img/sponsors/coderabbit.png
|
||||||
|
- url: https://subtotal.com/?utm_source=fastapi&utm_medium=sponsorship&utm_campaign=open-source
|
||||||
|
title: The Gold Standard in Retail Account Linking
|
||||||
|
img: https://fastapi.tiangolo.com/img/sponsors/subtotal.svg
|
||||||
silver:
|
silver:
|
||||||
- url: https://github.com/deepset-ai/haystack/
|
|
||||||
title: Build powerful search from composable, open source building blocks
|
|
||||||
img: https://fastapi.tiangolo.com/img/sponsors/haystack-fastapi.svg
|
|
||||||
- url: https://databento.com/
|
- url: https://databento.com/
|
||||||
title: Pay as you go for market data
|
title: Pay as you go for market data
|
||||||
img: https://fastapi.tiangolo.com/img/sponsors/databento.svg
|
img: https://fastapi.tiangolo.com/img/sponsors/databento.svg
|
||||||
- url: https://speakeasy.com?utm_source=fastapi+repo&utm_medium=github+sponsorship
|
- url: https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship
|
||||||
title: SDKs for your API | Speakeasy
|
title: SDKs for your API | Speakeasy
|
||||||
img: https://fastapi.tiangolo.com/img/sponsors/speakeasy.png
|
img: https://fastapi.tiangolo.com/img/sponsors/speakeasy.png
|
||||||
- url: https://www.svix.com/
|
- url: https://www.svix.com/
|
||||||
|
|
@ -48,6 +42,12 @@ silver:
|
||||||
- url: https://www.permit.io/blog/implement-authorization-in-fastapi?utm_source=github&utm_medium=referral&utm_campaign=fastapi
|
- url: https://www.permit.io/blog/implement-authorization-in-fastapi?utm_source=github&utm_medium=referral&utm_campaign=fastapi
|
||||||
title: Fine-Grained Authorization for FastAPI
|
title: Fine-Grained Authorization for FastAPI
|
||||||
img: https://fastapi.tiangolo.com/img/sponsors/permit.png
|
img: https://fastapi.tiangolo.com/img/sponsors/permit.png
|
||||||
|
- url: https://www.interviewpal.com/?utm_source=fastapi&utm_medium=open-source&utm_campaign=dev-hiring
|
||||||
|
title: InterviewPal - AI Interview Coach for Engineers and Devs
|
||||||
|
img: https://fastapi.tiangolo.com/img/sponsors/interviewpal.png
|
||||||
|
- url: https://dribia.com/en/
|
||||||
|
title: Dribia - Data Science within your reach
|
||||||
|
img: https://fastapi.tiangolo.com/img/sponsors/dribia.png
|
||||||
bronze:
|
bronze:
|
||||||
- url: https://www.exoflare.com/open-source/?utm_source=FastAPI&utm_campaign=open_source
|
- url: https://www.exoflare.com/open-source/?utm_source=FastAPI&utm_campaign=open_source
|
||||||
title: Biosecurity risk assessments made easy.
|
title: Biosecurity risk assessments made easy.
|
||||||
|
|
|
||||||
|
|
@ -38,3 +38,8 @@ logins:
|
||||||
- render-sponsorships
|
- render-sponsorships
|
||||||
- renderinc
|
- renderinc
|
||||||
- stainless-api
|
- stainless-api
|
||||||
|
- snapit-cypher
|
||||||
|
- coderabbitai
|
||||||
|
- permitio
|
||||||
|
- LambdaTest-Inc
|
||||||
|
- dribia
|
||||||
|
|
|
||||||
|
|
@ -1,251 +1,251 @@
|
||||||
- name: full-stack-fastapi-template
|
- name: full-stack-fastapi-template
|
||||||
html_url: https://github.com/fastapi/full-stack-fastapi-template
|
html_url: https://github.com/fastapi/full-stack-fastapi-template
|
||||||
stars: 32337
|
stars: 34156
|
||||||
owner_login: fastapi
|
owner_login: fastapi
|
||||||
owner_html_url: https://github.com/fastapi
|
owner_html_url: https://github.com/fastapi
|
||||||
- name: Hello-Python
|
- name: Hello-Python
|
||||||
html_url: https://github.com/mouredev/Hello-Python
|
html_url: https://github.com/mouredev/Hello-Python
|
||||||
stars: 29833
|
stars: 30835
|
||||||
owner_login: mouredev
|
owner_login: mouredev
|
||||||
owner_html_url: https://github.com/mouredev
|
owner_html_url: https://github.com/mouredev
|
||||||
- name: serve
|
- name: serve
|
||||||
html_url: https://github.com/jina-ai/serve
|
html_url: https://github.com/jina-ai/serve
|
||||||
stars: 21544
|
stars: 21631
|
||||||
owner_login: jina-ai
|
owner_login: jina-ai
|
||||||
owner_html_url: https://github.com/jina-ai
|
owner_html_url: https://github.com/jina-ai
|
||||||
- name: sqlmodel
|
|
||||||
html_url: https://github.com/fastapi/sqlmodel
|
|
||||||
stars: 15799
|
|
||||||
owner_login: fastapi
|
|
||||||
owner_html_url: https://github.com/fastapi
|
|
||||||
- name: HivisionIDPhotos
|
- name: HivisionIDPhotos
|
||||||
html_url: https://github.com/Zeyi-Lin/HivisionIDPhotos
|
html_url: https://github.com/Zeyi-Lin/HivisionIDPhotos
|
||||||
stars: 15676
|
stars: 18125
|
||||||
owner_login: Zeyi-Lin
|
owner_login: Zeyi-Lin
|
||||||
owner_html_url: https://github.com/Zeyi-Lin
|
owner_html_url: https://github.com/Zeyi-Lin
|
||||||
|
- name: sqlmodel
|
||||||
|
html_url: https://github.com/fastapi/sqlmodel
|
||||||
|
stars: 16249
|
||||||
|
owner_login: fastapi
|
||||||
|
owner_html_url: https://github.com/fastapi
|
||||||
- name: Douyin_TikTok_Download_API
|
- name: Douyin_TikTok_Download_API
|
||||||
html_url: https://github.com/Evil0ctal/Douyin_TikTok_Download_API
|
html_url: https://github.com/Evil0ctal/Douyin_TikTok_Download_API
|
||||||
stars: 12183
|
stars: 13279
|
||||||
owner_login: Evil0ctal
|
owner_login: Evil0ctal
|
||||||
owner_html_url: https://github.com/Evil0ctal
|
owner_html_url: https://github.com/Evil0ctal
|
||||||
- name: fastapi-best-practices
|
- name: fastapi-best-practices
|
||||||
html_url: https://github.com/zhanymkanov/fastapi-best-practices
|
html_url: https://github.com/zhanymkanov/fastapi-best-practices
|
||||||
stars: 11594
|
stars: 12334
|
||||||
owner_login: zhanymkanov
|
owner_login: zhanymkanov
|
||||||
owner_html_url: https://github.com/zhanymkanov
|
owner_html_url: https://github.com/zhanymkanov
|
||||||
- name: awesome-fastapi
|
- name: awesome-fastapi
|
||||||
html_url: https://github.com/mjhea0/awesome-fastapi
|
html_url: https://github.com/mjhea0/awesome-fastapi
|
||||||
stars: 9586
|
stars: 9934
|
||||||
owner_login: mjhea0
|
owner_login: mjhea0
|
||||||
owner_html_url: https://github.com/mjhea0
|
owner_html_url: https://github.com/mjhea0
|
||||||
- name: FastUI
|
- name: FastUI
|
||||||
html_url: https://github.com/pydantic/FastUI
|
html_url: https://github.com/pydantic/FastUI
|
||||||
stars: 8804
|
stars: 8838
|
||||||
owner_login: pydantic
|
owner_login: pydantic
|
||||||
owner_html_url: https://github.com/pydantic
|
owner_html_url: https://github.com/pydantic
|
||||||
|
- name: XHS-Downloader
|
||||||
|
html_url: https://github.com/JoeanAmier/XHS-Downloader
|
||||||
|
stars: 7962
|
||||||
|
owner_login: JoeanAmier
|
||||||
|
owner_html_url: https://github.com/JoeanAmier
|
||||||
- name: nonebot2
|
- name: nonebot2
|
||||||
html_url: https://github.com/nonebot/nonebot2
|
html_url: https://github.com/nonebot/nonebot2
|
||||||
stars: 6688
|
stars: 6834
|
||||||
owner_login: nonebot
|
owner_login: nonebot
|
||||||
owner_html_url: https://github.com/nonebot
|
owner_html_url: https://github.com/nonebot
|
||||||
- name: FileCodeBox
|
- name: FileCodeBox
|
||||||
html_url: https://github.com/vastsa/FileCodeBox
|
html_url: https://github.com/vastsa/FileCodeBox
|
||||||
stars: 6502
|
stars: 6783
|
||||||
owner_login: vastsa
|
owner_login: vastsa
|
||||||
owner_html_url: https://github.com/vastsa
|
owner_html_url: https://github.com/vastsa
|
||||||
- name: serge
|
|
||||||
html_url: https://github.com/serge-chat/serge
|
|
||||||
stars: 5720
|
|
||||||
owner_login: serge-chat
|
|
||||||
owner_html_url: https://github.com/serge-chat
|
|
||||||
- name: hatchet
|
|
||||||
html_url: https://github.com/hatchet-dev/hatchet
|
|
||||||
stars: 5515
|
|
||||||
owner_login: hatchet-dev
|
|
||||||
owner_html_url: https://github.com/hatchet-dev
|
|
||||||
- name: fastapi-users
|
|
||||||
html_url: https://github.com/fastapi-users/fastapi-users
|
|
||||||
stars: 5162
|
|
||||||
owner_login: fastapi-users
|
|
||||||
owner_html_url: https://github.com/fastapi-users
|
|
||||||
- name: polar
|
|
||||||
html_url: https://github.com/polarsource/polar
|
|
||||||
stars: 5119
|
|
||||||
owner_login: polarsource
|
|
||||||
owner_html_url: https://github.com/polarsource
|
|
||||||
- name: chatgpt-web-share
|
|
||||||
html_url: https://github.com/chatpire/chatgpt-web-share
|
|
||||||
stars: 4302
|
|
||||||
owner_login: chatpire
|
|
||||||
owner_html_url: https://github.com/chatpire
|
|
||||||
- name: strawberry
|
|
||||||
html_url: https://github.com/strawberry-graphql/strawberry
|
|
||||||
stars: 4244
|
|
||||||
owner_login: strawberry-graphql
|
|
||||||
owner_html_url: https://github.com/strawberry-graphql
|
|
||||||
- name: fastapi_mcp
|
- name: fastapi_mcp
|
||||||
html_url: https://github.com/tadata-org/fastapi_mcp
|
html_url: https://github.com/tadata-org/fastapi_mcp
|
||||||
stars: 4178
|
stars: 5846
|
||||||
owner_login: tadata-org
|
owner_login: tadata-org
|
||||||
owner_html_url: https://github.com/tadata-org
|
owner_html_url: https://github.com/tadata-org
|
||||||
|
- name: hatchet
|
||||||
|
html_url: https://github.com/hatchet-dev/hatchet
|
||||||
|
stars: 5773
|
||||||
|
owner_login: hatchet-dev
|
||||||
|
owner_html_url: https://github.com/hatchet-dev
|
||||||
|
- name: serge
|
||||||
|
html_url: https://github.com/serge-chat/serge
|
||||||
|
stars: 5728
|
||||||
|
owner_login: serge-chat
|
||||||
|
owner_html_url: https://github.com/serge-chat
|
||||||
|
- name: polar
|
||||||
|
html_url: https://github.com/polarsource/polar
|
||||||
|
stars: 5709
|
||||||
|
owner_login: polarsource
|
||||||
|
owner_html_url: https://github.com/polarsource
|
||||||
|
- name: fastapi-users
|
||||||
|
html_url: https://github.com/fastapi-users/fastapi-users
|
||||||
|
stars: 5336
|
||||||
|
owner_login: fastapi-users
|
||||||
|
owner_html_url: https://github.com/fastapi-users
|
||||||
|
- name: strawberry
|
||||||
|
html_url: https://github.com/strawberry-graphql/strawberry
|
||||||
|
stars: 4317
|
||||||
|
owner_login: strawberry-graphql
|
||||||
|
owner_html_url: https://github.com/strawberry-graphql
|
||||||
|
- name: chatgpt-web-share
|
||||||
|
html_url: https://github.com/chatpire/chatgpt-web-share
|
||||||
|
stars: 4301
|
||||||
|
owner_login: chatpire
|
||||||
|
owner_html_url: https://github.com/chatpire
|
||||||
- name: atrilabs-engine
|
- name: atrilabs-engine
|
||||||
html_url: https://github.com/Atri-Labs/atrilabs-engine
|
html_url: https://github.com/Atri-Labs/atrilabs-engine
|
||||||
stars: 4112
|
stars: 4106
|
||||||
owner_login: Atri-Labs
|
owner_login: Atri-Labs
|
||||||
owner_html_url: https://github.com/Atri-Labs
|
owner_html_url: https://github.com/Atri-Labs
|
||||||
- name: dynaconf
|
- name: dynaconf
|
||||||
html_url: https://github.com/dynaconf/dynaconf
|
html_url: https://github.com/dynaconf/dynaconf
|
||||||
stars: 3985
|
stars: 4045
|
||||||
owner_login: dynaconf
|
owner_login: dynaconf
|
||||||
owner_html_url: https://github.com/dynaconf
|
owner_html_url: https://github.com/dynaconf
|
||||||
- name: poem
|
- name: poem
|
||||||
html_url: https://github.com/poem-web/poem
|
html_url: https://github.com/poem-web/poem
|
||||||
stars: 3918
|
stars: 4037
|
||||||
owner_login: poem-web
|
owner_login: poem-web
|
||||||
owner_html_url: https://github.com/poem-web
|
owner_html_url: https://github.com/poem-web
|
||||||
- name: farfalle
|
- name: farfalle
|
||||||
html_url: https://github.com/rashadphz/farfalle
|
html_url: https://github.com/rashadphz/farfalle
|
||||||
stars: 3287
|
stars: 3348
|
||||||
owner_login: rashadphz
|
owner_login: rashadphz
|
||||||
owner_html_url: https://github.com/rashadphz
|
owner_html_url: https://github.com/rashadphz
|
||||||
|
- name: LitServe
|
||||||
|
html_url: https://github.com/Lightning-AI/LitServe
|
||||||
|
stars: 3347
|
||||||
|
owner_login: Lightning-AI
|
||||||
|
owner_html_url: https://github.com/Lightning-AI
|
||||||
- name: fastapi-admin
|
- name: fastapi-admin
|
||||||
html_url: https://github.com/fastapi-admin/fastapi-admin
|
html_url: https://github.com/fastapi-admin/fastapi-admin
|
||||||
stars: 3192
|
stars: 3309
|
||||||
owner_login: fastapi-admin
|
owner_login: fastapi-admin
|
||||||
owner_html_url: https://github.com/fastapi-admin
|
owner_html_url: https://github.com/fastapi-admin
|
||||||
- name: datamodel-code-generator
|
- name: datamodel-code-generator
|
||||||
html_url: https://github.com/koxudaxi/datamodel-code-generator
|
html_url: https://github.com/koxudaxi/datamodel-code-generator
|
||||||
stars: 3141
|
stars: 3291
|
||||||
owner_login: koxudaxi
|
owner_login: koxudaxi
|
||||||
owner_html_url: https://github.com/koxudaxi
|
owner_html_url: https://github.com/koxudaxi
|
||||||
- name: opyrator
|
|
||||||
html_url: https://github.com/ml-tooling/opyrator
|
|
||||||
stars: 3116
|
|
||||||
owner_login: ml-tooling
|
|
||||||
owner_html_url: https://github.com/ml-tooling
|
|
||||||
- name: LitServe
|
|
||||||
html_url: https://github.com/Lightning-AI/LitServe
|
|
||||||
stars: 3088
|
|
||||||
owner_login: Lightning-AI
|
|
||||||
owner_html_url: https://github.com/Lightning-AI
|
|
||||||
- name: logfire
|
- name: logfire
|
||||||
html_url: https://github.com/pydantic/logfire
|
html_url: https://github.com/pydantic/logfire
|
||||||
stars: 3059
|
stars: 3288
|
||||||
owner_login: pydantic
|
owner_login: pydantic
|
||||||
owner_html_url: https://github.com/pydantic
|
owner_html_url: https://github.com/pydantic
|
||||||
- name: docarray
|
|
||||||
html_url: https://github.com/docarray/docarray
|
|
||||||
stars: 3052
|
|
||||||
owner_login: docarray
|
|
||||||
owner_html_url: https://github.com/docarray
|
|
||||||
- name: huma
|
- name: huma
|
||||||
html_url: https://github.com/danielgtaylor/huma
|
html_url: https://github.com/danielgtaylor/huma
|
||||||
stars: 3025
|
stars: 3201
|
||||||
owner_login: danielgtaylor
|
owner_login: danielgtaylor
|
||||||
owner_html_url: https://github.com/danielgtaylor
|
owner_html_url: https://github.com/danielgtaylor
|
||||||
- name: fastapi-realworld-example-app
|
- name: opyrator
|
||||||
html_url: https://github.com/nsidnev/fastapi-realworld-example-app
|
html_url: https://github.com/ml-tooling/opyrator
|
||||||
stars: 2883
|
stars: 3132
|
||||||
owner_login: nsidnev
|
|
||||||
owner_html_url: https://github.com/nsidnev
|
|
||||||
- name: uvicorn-gunicorn-fastapi-docker
|
|
||||||
html_url: https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker
|
|
||||||
stars: 2756
|
|
||||||
owner_login: tiangolo
|
|
||||||
owner_html_url: https://github.com/tiangolo
|
|
||||||
- name: tracecat
|
|
||||||
html_url: https://github.com/TracecatHQ/tracecat
|
|
||||||
stars: 2587
|
|
||||||
owner_login: TracecatHQ
|
|
||||||
owner_html_url: https://github.com/TracecatHQ
|
|
||||||
- name: best-of-web-python
|
|
||||||
html_url: https://github.com/ml-tooling/best-of-web-python
|
|
||||||
stars: 2502
|
|
||||||
owner_login: ml-tooling
|
owner_login: ml-tooling
|
||||||
owner_html_url: https://github.com/ml-tooling
|
owner_html_url: https://github.com/ml-tooling
|
||||||
- name: Kokoro-FastAPI
|
- name: Kokoro-FastAPI
|
||||||
html_url: https://github.com/remsky/Kokoro-FastAPI
|
html_url: https://github.com/remsky/Kokoro-FastAPI
|
||||||
stars: 2500
|
stars: 3099
|
||||||
owner_login: remsky
|
owner_login: remsky
|
||||||
owner_html_url: https://github.com/remsky
|
owner_html_url: https://github.com/remsky
|
||||||
|
- name: docarray
|
||||||
|
html_url: https://github.com/docarray/docarray
|
||||||
|
stars: 3075
|
||||||
|
owner_login: docarray
|
||||||
|
owner_html_url: https://github.com/docarray
|
||||||
|
- name: fastapi-realworld-example-app
|
||||||
|
html_url: https://github.com/nsidnev/fastapi-realworld-example-app
|
||||||
|
stars: 2902
|
||||||
|
owner_login: nsidnev
|
||||||
|
owner_html_url: https://github.com/nsidnev
|
||||||
|
- name: tracecat
|
||||||
|
html_url: https://github.com/TracecatHQ/tracecat
|
||||||
|
stars: 2888
|
||||||
|
owner_login: TracecatHQ
|
||||||
|
owner_html_url: https://github.com/TracecatHQ
|
||||||
|
- name: uvicorn-gunicorn-fastapi-docker
|
||||||
|
html_url: https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker
|
||||||
|
stars: 2775
|
||||||
|
owner_login: tiangolo
|
||||||
|
owner_html_url: https://github.com/tiangolo
|
||||||
|
- name: best-of-web-python
|
||||||
|
html_url: https://github.com/ml-tooling/best-of-web-python
|
||||||
|
stars: 2537
|
||||||
|
owner_login: ml-tooling
|
||||||
|
owner_html_url: https://github.com/ml-tooling
|
||||||
- name: RasaGPT
|
- name: RasaGPT
|
||||||
html_url: https://github.com/paulpierre/RasaGPT
|
html_url: https://github.com/paulpierre/RasaGPT
|
||||||
stars: 2419
|
stars: 2427
|
||||||
owner_login: paulpierre
|
owner_login: paulpierre
|
||||||
owner_html_url: https://github.com/paulpierre
|
owner_html_url: https://github.com/paulpierre
|
||||||
- name: fastapi-react
|
- name: fastapi-react
|
||||||
html_url: https://github.com/Buuntu/fastapi-react
|
html_url: https://github.com/Buuntu/fastapi-react
|
||||||
stars: 2350
|
stars: 2397
|
||||||
owner_login: Buuntu
|
owner_login: Buuntu
|
||||||
owner_html_url: https://github.com/Buuntu
|
owner_html_url: https://github.com/Buuntu
|
||||||
- name: nextpy
|
|
||||||
html_url: https://github.com/dot-agent/nextpy
|
|
||||||
stars: 2277
|
|
||||||
owner_login: dot-agent
|
|
||||||
owner_html_url: https://github.com/dot-agent
|
|
||||||
- name: FastAPI-template
|
- name: FastAPI-template
|
||||||
html_url: https://github.com/s3rius/FastAPI-template
|
html_url: https://github.com/s3rius/FastAPI-template
|
||||||
stars: 2273
|
stars: 2334
|
||||||
owner_login: s3rius
|
owner_login: s3rius
|
||||||
owner_html_url: https://github.com/s3rius
|
owner_html_url: https://github.com/s3rius
|
||||||
- name: 30-Days-of-Python
|
- name: nextpy
|
||||||
html_url: https://github.com/codingforentrepreneurs/30-Days-of-Python
|
html_url: https://github.com/dot-agent/nextpy
|
||||||
stars: 2183
|
stars: 2295
|
||||||
owner_login: codingforentrepreneurs
|
owner_login: dot-agent
|
||||||
owner_html_url: https://github.com/codingforentrepreneurs
|
owner_html_url: https://github.com/dot-agent
|
||||||
- name: sqladmin
|
- name: sqladmin
|
||||||
html_url: https://github.com/aminalaee/sqladmin
|
html_url: https://github.com/aminalaee/sqladmin
|
||||||
stars: 2141
|
stars: 2235
|
||||||
owner_login: aminalaee
|
owner_login: aminalaee
|
||||||
owner_html_url: https://github.com/aminalaee
|
owner_html_url: https://github.com/aminalaee
|
||||||
|
- name: 30-Days-of-Python
|
||||||
|
html_url: https://github.com/codingforentrepreneurs/30-Days-of-Python
|
||||||
|
stars: 2181
|
||||||
|
owner_login: codingforentrepreneurs
|
||||||
|
owner_html_url: https://github.com/codingforentrepreneurs
|
||||||
- name: langserve
|
- name: langserve
|
||||||
html_url: https://github.com/langchain-ai/langserve
|
html_url: https://github.com/langchain-ai/langserve
|
||||||
stars: 2070
|
stars: 2119
|
||||||
owner_login: langchain-ai
|
owner_login: langchain-ai
|
||||||
owner_html_url: https://github.com/langchain-ai
|
owner_html_url: https://github.com/langchain-ai
|
||||||
- name: fastapi-utils
|
- name: fastapi-utils
|
||||||
html_url: https://github.com/fastapiutils/fastapi-utils
|
html_url: https://github.com/fastapiutils/fastapi-utils
|
||||||
stars: 2063
|
stars: 2100
|
||||||
owner_login: fastapiutils
|
owner_login: fastapiutils
|
||||||
owner_html_url: https://github.com/fastapiutils
|
owner_html_url: https://github.com/fastapiutils
|
||||||
- name: solara
|
|
||||||
html_url: https://github.com/widgetti/solara
|
|
||||||
stars: 2028
|
|
||||||
owner_login: widgetti
|
|
||||||
owner_html_url: https://github.com/widgetti
|
|
||||||
- name: supabase-py
|
- name: supabase-py
|
||||||
html_url: https://github.com/supabase/supabase-py
|
html_url: https://github.com/supabase/supabase-py
|
||||||
stars: 1996
|
stars: 2084
|
||||||
owner_login: supabase
|
owner_login: supabase
|
||||||
owner_html_url: https://github.com/supabase
|
owner_html_url: https://github.com/supabase
|
||||||
|
- name: solara
|
||||||
|
html_url: https://github.com/widgetti/solara
|
||||||
|
stars: 2056
|
||||||
|
owner_login: widgetti
|
||||||
|
owner_html_url: https://github.com/widgetti
|
||||||
- name: mangum
|
- name: mangum
|
||||||
html_url: https://github.com/Kludex/mangum
|
html_url: https://github.com/Kludex/mangum
|
||||||
stars: 1870
|
stars: 1923
|
||||||
owner_login: Kludex
|
owner_login: Kludex
|
||||||
owner_html_url: https://github.com/Kludex
|
owner_html_url: https://github.com/Kludex
|
||||||
- name: python-week-2022
|
- name: python-week-2022
|
||||||
html_url: https://github.com/rochacbruno/python-week-2022
|
html_url: https://github.com/rochacbruno/python-week-2022
|
||||||
stars: 1827
|
stars: 1821
|
||||||
owner_login: rochacbruno
|
owner_login: rochacbruno
|
||||||
owner_html_url: https://github.com/rochacbruno
|
owner_html_url: https://github.com/rochacbruno
|
||||||
- name: SurfSense
|
|
||||||
html_url: https://github.com/MODSetter/SurfSense
|
|
||||||
stars: 1763
|
|
||||||
owner_login: MODSetter
|
|
||||||
owner_html_url: https://github.com/MODSetter
|
|
||||||
- name: manage-fastapi
|
|
||||||
html_url: https://github.com/ycd/manage-fastapi
|
|
||||||
stars: 1743
|
|
||||||
owner_login: ycd
|
|
||||||
owner_html_url: https://github.com/ycd
|
|
||||||
- name: agentkit
|
- name: agentkit
|
||||||
html_url: https://github.com/BCG-X-Official/agentkit
|
html_url: https://github.com/BCG-X-Official/agentkit
|
||||||
stars: 1741
|
stars: 1765
|
||||||
owner_login: BCG-X-Official
|
owner_login: BCG-X-Official
|
||||||
owner_html_url: https://github.com/BCG-X-Official
|
owner_html_url: https://github.com/BCG-X-Official
|
||||||
|
- name: manage-fastapi
|
||||||
|
html_url: https://github.com/ycd/manage-fastapi
|
||||||
|
stars: 1756
|
||||||
|
owner_login: ycd
|
||||||
|
owner_html_url: https://github.com/ycd
|
||||||
- name: ormar
|
- name: ormar
|
||||||
html_url: https://github.com/collerek/ormar
|
html_url: https://github.com/collerek/ormar
|
||||||
stars: 1730
|
stars: 1755
|
||||||
owner_login: collerek
|
owner_login: collerek
|
||||||
owner_html_url: https://github.com/collerek
|
owner_html_url: https://github.com/collerek
|
||||||
- name: langchain-serve
|
- name: langchain-serve
|
||||||
|
|
@ -253,243 +253,243 @@
|
||||||
stars: 1631
|
stars: 1631
|
||||||
owner_login: jina-ai
|
owner_login: jina-ai
|
||||||
owner_html_url: https://github.com/jina-ai
|
owner_html_url: https://github.com/jina-ai
|
||||||
- name: termpair
|
|
||||||
html_url: https://github.com/cs01/termpair
|
|
||||||
stars: 1610
|
|
||||||
owner_login: cs01
|
|
||||||
owner_html_url: https://github.com/cs01
|
|
||||||
- name: piccolo
|
- name: piccolo
|
||||||
html_url: https://github.com/piccolo-orm/piccolo
|
html_url: https://github.com/piccolo-orm/piccolo
|
||||||
stars: 1588
|
stars: 1629
|
||||||
owner_login: piccolo-orm
|
owner_login: piccolo-orm
|
||||||
owner_html_url: https://github.com/piccolo-orm
|
owner_html_url: https://github.com/piccolo-orm
|
||||||
- name: coronavirus-tracker-api
|
- name: termpair
|
||||||
html_url: https://github.com/ExpDev07/coronavirus-tracker-api
|
html_url: https://github.com/cs01/termpair
|
||||||
stars: 1587
|
stars: 1616
|
||||||
owner_login: ExpDev07
|
owner_login: cs01
|
||||||
owner_html_url: https://github.com/ExpDev07
|
owner_html_url: https://github.com/cs01
|
||||||
- name: fastapi-cache
|
|
||||||
html_url: https://github.com/long2ice/fastapi-cache
|
|
||||||
stars: 1552
|
|
||||||
owner_login: long2ice
|
|
||||||
owner_html_url: https://github.com/long2ice
|
|
||||||
- name: openapi-python-client
|
- name: openapi-python-client
|
||||||
html_url: https://github.com/openapi-generators/openapi-python-client
|
html_url: https://github.com/openapi-generators/openapi-python-client
|
||||||
stars: 1536
|
stars: 1603
|
||||||
owner_login: openapi-generators
|
owner_login: openapi-generators
|
||||||
owner_html_url: https://github.com/openapi-generators
|
owner_html_url: https://github.com/openapi-generators
|
||||||
- name: fastapi-crudrouter
|
- name: fastapi-cache
|
||||||
html_url: https://github.com/awtkns/fastapi-crudrouter
|
html_url: https://github.com/long2ice/fastapi-cache
|
||||||
stars: 1491
|
stars: 1589
|
||||||
owner_login: awtkns
|
owner_login: long2ice
|
||||||
owner_html_url: https://github.com/awtkns
|
owner_html_url: https://github.com/long2ice
|
||||||
|
- name: coronavirus-tracker-api
|
||||||
|
html_url: https://github.com/ExpDev07/coronavirus-tracker-api
|
||||||
|
stars: 1580
|
||||||
|
owner_login: ExpDev07
|
||||||
|
owner_html_url: https://github.com/ExpDev07
|
||||||
- name: slowapi
|
- name: slowapi
|
||||||
html_url: https://github.com/laurentS/slowapi
|
html_url: https://github.com/laurentS/slowapi
|
||||||
stars: 1450
|
stars: 1533
|
||||||
owner_login: laurentS
|
owner_login: laurentS
|
||||||
owner_html_url: https://github.com/laurentS
|
owner_html_url: https://github.com/laurentS
|
||||||
|
- name: fastapi-crudrouter
|
||||||
|
html_url: https://github.com/awtkns/fastapi-crudrouter
|
||||||
|
stars: 1518
|
||||||
|
owner_login: awtkns
|
||||||
|
owner_html_url: https://github.com/awtkns
|
||||||
- name: awesome-fastapi-projects
|
- name: awesome-fastapi-projects
|
||||||
html_url: https://github.com/Kludex/awesome-fastapi-projects
|
html_url: https://github.com/Kludex/awesome-fastapi-projects
|
||||||
stars: 1443
|
stars: 1461
|
||||||
owner_login: Kludex
|
owner_login: Kludex
|
||||||
owner_html_url: https://github.com/Kludex
|
owner_html_url: https://github.com/Kludex
|
||||||
|
- name: vue-fastapi-admin
|
||||||
|
html_url: https://github.com/mizhexiaoxiao/vue-fastapi-admin
|
||||||
|
stars: 1409
|
||||||
|
owner_login: mizhexiaoxiao
|
||||||
|
owner_html_url: https://github.com/mizhexiaoxiao
|
||||||
- name: awesome-python-resources
|
- name: awesome-python-resources
|
||||||
html_url: https://github.com/DjangoEx/awesome-python-resources
|
html_url: https://github.com/DjangoEx/awesome-python-resources
|
||||||
stars: 1387
|
stars: 1393
|
||||||
owner_login: DjangoEx
|
owner_login: DjangoEx
|
||||||
owner_html_url: https://github.com/DjangoEx
|
owner_html_url: https://github.com/DjangoEx
|
||||||
- name: budgetml
|
|
||||||
html_url: https://github.com/ebhy/budgetml
|
|
||||||
stars: 1341
|
|
||||||
owner_login: ebhy
|
|
||||||
owner_html_url: https://github.com/ebhy
|
|
||||||
- name: fastapi-pagination
|
- name: fastapi-pagination
|
||||||
html_url: https://github.com/uriyyo/fastapi-pagination
|
html_url: https://github.com/uriyyo/fastapi-pagination
|
||||||
stars: 1331
|
stars: 1378
|
||||||
owner_login: uriyyo
|
owner_login: uriyyo
|
||||||
owner_html_url: https://github.com/uriyyo
|
owner_html_url: https://github.com/uriyyo
|
||||||
- name: fastapi-boilerplate
|
- name: fastapi-boilerplate
|
||||||
html_url: https://github.com/teamhide/fastapi-boilerplate
|
html_url: https://github.com/teamhide/fastapi-boilerplate
|
||||||
stars: 1299
|
stars: 1348
|
||||||
owner_login: teamhide
|
owner_login: teamhide
|
||||||
owner_html_url: https://github.com/teamhide
|
owner_html_url: https://github.com/teamhide
|
||||||
|
- name: budgetml
|
||||||
|
html_url: https://github.com/ebhy/budgetml
|
||||||
|
stars: 1344
|
||||||
|
owner_login: ebhy
|
||||||
|
owner_html_url: https://github.com/ebhy
|
||||||
- name: fastapi-amis-admin
|
- name: fastapi-amis-admin
|
||||||
html_url: https://github.com/amisadmin/fastapi-amis-admin
|
html_url: https://github.com/amisadmin/fastapi-amis-admin
|
||||||
stars: 1235
|
stars: 1284
|
||||||
owner_login: amisadmin
|
owner_login: amisadmin
|
||||||
owner_html_url: https://github.com/amisadmin
|
owner_html_url: https://github.com/amisadmin
|
||||||
|
- name: bracket
|
||||||
|
html_url: https://github.com/evroon/bracket
|
||||||
|
stars: 1274
|
||||||
|
owner_login: evroon
|
||||||
|
owner_html_url: https://github.com/evroon
|
||||||
- name: fastapi-tutorial
|
- name: fastapi-tutorial
|
||||||
html_url: https://github.com/liaogx/fastapi-tutorial
|
html_url: https://github.com/liaogx/fastapi-tutorial
|
||||||
stars: 1222
|
stars: 1265
|
||||||
owner_login: liaogx
|
owner_login: liaogx
|
||||||
owner_html_url: https://github.com/liaogx
|
owner_html_url: https://github.com/liaogx
|
||||||
- name: vue-fastapi-admin
|
|
||||||
html_url: https://github.com/mizhexiaoxiao/vue-fastapi-admin
|
|
||||||
stars: 1190
|
|
||||||
owner_login: mizhexiaoxiao
|
|
||||||
owner_html_url: https://github.com/mizhexiaoxiao
|
|
||||||
- name: fastapi-code-generator
|
- name: fastapi-code-generator
|
||||||
html_url: https://github.com/koxudaxi/fastapi-code-generator
|
html_url: https://github.com/koxudaxi/fastapi-code-generator
|
||||||
stars: 1180
|
stars: 1216
|
||||||
owner_login: koxudaxi
|
owner_login: koxudaxi
|
||||||
owner_html_url: https://github.com/koxudaxi
|
owner_html_url: https://github.com/koxudaxi
|
||||||
- name: bolt-python
|
- name: bolt-python
|
||||||
html_url: https://github.com/slackapi/bolt-python
|
html_url: https://github.com/slackapi/bolt-python
|
||||||
stars: 1166
|
stars: 1190
|
||||||
owner_login: slackapi
|
owner_login: slackapi
|
||||||
owner_html_url: https://github.com/slackapi
|
owner_html_url: https://github.com/slackapi
|
||||||
|
- name: fastcrud
|
||||||
|
html_url: https://github.com/benavlabs/fastcrud
|
||||||
|
stars: 1169
|
||||||
|
owner_login: benavlabs
|
||||||
|
owner_html_url: https://github.com/benavlabs
|
||||||
|
- name: prometheus-fastapi-instrumentator
|
||||||
|
html_url: https://github.com/trallnag/prometheus-fastapi-instrumentator
|
||||||
|
stars: 1167
|
||||||
|
owner_login: trallnag
|
||||||
|
owner_html_url: https://github.com/trallnag
|
||||||
- name: fastapi_production_template
|
- name: fastapi_production_template
|
||||||
html_url: https://github.com/zhanymkanov/fastapi_production_template
|
html_url: https://github.com/zhanymkanov/fastapi_production_template
|
||||||
stars: 1134
|
stars: 1165
|
||||||
owner_login: zhanymkanov
|
owner_login: zhanymkanov
|
||||||
owner_html_url: https://github.com/zhanymkanov
|
owner_html_url: https://github.com/zhanymkanov
|
||||||
|
- name: bedrock-chat
|
||||||
|
html_url: https://github.com/aws-samples/bedrock-chat
|
||||||
|
stars: 1163
|
||||||
|
owner_login: aws-samples
|
||||||
|
owner_html_url: https://github.com/aws-samples
|
||||||
- name: langchain-extract
|
- name: langchain-extract
|
||||||
html_url: https://github.com/langchain-ai/langchain-extract
|
html_url: https://github.com/langchain-ai/langchain-extract
|
||||||
stars: 1127
|
stars: 1142
|
||||||
owner_login: langchain-ai
|
owner_login: langchain-ai
|
||||||
owner_html_url: https://github.com/langchain-ai
|
owner_html_url: https://github.com/langchain-ai
|
||||||
- name: odmantic
|
- name: odmantic
|
||||||
html_url: https://github.com/art049/odmantic
|
html_url: https://github.com/art049/odmantic
|
||||||
stars: 1115
|
stars: 1121
|
||||||
owner_login: art049
|
owner_login: art049
|
||||||
owner_html_url: https://github.com/art049
|
owner_html_url: https://github.com/art049
|
||||||
- name: prometheus-fastapi-instrumentator
|
|
||||||
html_url: https://github.com/trallnag/prometheus-fastapi-instrumentator
|
|
||||||
stars: 1112
|
|
||||||
owner_login: trallnag
|
|
||||||
owner_html_url: https://github.com/trallnag
|
|
||||||
- name: bedrock-chat
|
|
||||||
html_url: https://github.com/aws-samples/bedrock-chat
|
|
||||||
stars: 1107
|
|
||||||
owner_login: aws-samples
|
|
||||||
owner_html_url: https://github.com/aws-samples
|
|
||||||
- name: fastapi-alembic-sqlmodel-async
|
|
||||||
html_url: https://github.com/jonra1993/fastapi-alembic-sqlmodel-async
|
|
||||||
stars: 1094
|
|
||||||
owner_login: jonra1993
|
|
||||||
owner_html_url: https://github.com/jonra1993
|
|
||||||
- name: restish
|
|
||||||
html_url: https://github.com/rest-sh/restish
|
|
||||||
stars: 1041
|
|
||||||
owner_login: rest-sh
|
|
||||||
owner_html_url: https://github.com/rest-sh
|
|
||||||
- name: fastcrud
|
|
||||||
html_url: https://github.com/igorbenav/fastcrud
|
|
||||||
stars: 1036
|
|
||||||
owner_login: igorbenav
|
|
||||||
owner_html_url: https://github.com/igorbenav
|
|
||||||
- name: runhouse
|
|
||||||
html_url: https://github.com/run-house/runhouse
|
|
||||||
stars: 1022
|
|
||||||
owner_login: run-house
|
|
||||||
owner_html_url: https://github.com/run-house
|
|
||||||
- name: fastapi_best_architecture
|
- name: fastapi_best_architecture
|
||||||
html_url: https://github.com/fastapi-practices/fastapi_best_architecture
|
html_url: https://github.com/fastapi-practices/fastapi_best_architecture
|
||||||
stars: 997
|
stars: 1118
|
||||||
owner_login: fastapi-practices
|
owner_login: fastapi-practices
|
||||||
owner_html_url: https://github.com/fastapi-practices
|
owner_html_url: https://github.com/fastapi-practices
|
||||||
- name: lanarky
|
- name: fastapi-alembic-sqlmodel-async
|
||||||
html_url: https://github.com/ajndkr/lanarky
|
html_url: https://github.com/jonra1993/fastapi-alembic-sqlmodel-async
|
||||||
stars: 990
|
stars: 1116
|
||||||
owner_login: ajndkr
|
owner_login: jonra1993
|
||||||
owner_html_url: https://github.com/ajndkr
|
owner_html_url: https://github.com/jonra1993
|
||||||
|
- name: FastAPI-boilerplate
|
||||||
|
html_url: https://github.com/benavlabs/FastAPI-boilerplate
|
||||||
|
stars: 1070
|
||||||
|
owner_login: benavlabs
|
||||||
|
owner_html_url: https://github.com/benavlabs
|
||||||
|
- name: restish
|
||||||
|
html_url: https://github.com/rest-sh/restish
|
||||||
|
stars: 1069
|
||||||
|
owner_login: rest-sh
|
||||||
|
owner_html_url: https://github.com/rest-sh
|
||||||
|
- name: runhouse
|
||||||
|
html_url: https://github.com/run-house/runhouse
|
||||||
|
stars: 1037
|
||||||
|
owner_login: run-house
|
||||||
|
owner_html_url: https://github.com/run-house
|
||||||
- name: autollm
|
- name: autollm
|
||||||
html_url: https://github.com/viddexa/autollm
|
html_url: https://github.com/viddexa/autollm
|
||||||
stars: 990
|
stars: 994
|
||||||
owner_login: viddexa
|
owner_login: viddexa
|
||||||
owner_html_url: https://github.com/viddexa
|
owner_html_url: https://github.com/viddexa
|
||||||
- name: secure
|
- name: lanarky
|
||||||
html_url: https://github.com/TypeError/secure
|
html_url: https://github.com/ajndkr/lanarky
|
||||||
stars: 932
|
stars: 992
|
||||||
owner_login: TypeError
|
owner_login: ajndkr
|
||||||
owner_html_url: https://github.com/TypeError
|
owner_html_url: https://github.com/ajndkr
|
||||||
- name: langcorn
|
|
||||||
html_url: https://github.com/msoedov/langcorn
|
|
||||||
stars: 925
|
|
||||||
owner_login: msoedov
|
|
||||||
owner_html_url: https://github.com/msoedov
|
|
||||||
- name: FastAPI-boilerplate
|
|
||||||
html_url: https://github.com/igorbenav/FastAPI-boilerplate
|
|
||||||
stars: 925
|
|
||||||
owner_login: igorbenav
|
|
||||||
owner_html_url: https://github.com/igorbenav
|
|
||||||
- name: authx
|
- name: authx
|
||||||
html_url: https://github.com/yezz123/authx
|
html_url: https://github.com/yezz123/authx
|
||||||
stars: 913
|
stars: 953
|
||||||
owner_login: yezz123
|
owner_login: yezz123
|
||||||
owner_html_url: https://github.com/yezz123
|
owner_html_url: https://github.com/yezz123
|
||||||
|
- name: secure
|
||||||
|
html_url: https://github.com/TypeError/secure
|
||||||
|
stars: 941
|
||||||
|
owner_login: TypeError
|
||||||
|
owner_html_url: https://github.com/TypeError
|
||||||
- name: energy-forecasting
|
- name: energy-forecasting
|
||||||
html_url: https://github.com/iusztinpaul/energy-forecasting
|
html_url: https://github.com/iusztinpaul/energy-forecasting
|
||||||
stars: 907
|
stars: 928
|
||||||
owner_login: iusztinpaul
|
owner_login: iusztinpaul
|
||||||
owner_html_url: https://github.com/iusztinpaul
|
owner_html_url: https://github.com/iusztinpaul
|
||||||
|
- name: langcorn
|
||||||
|
html_url: https://github.com/msoedov/langcorn
|
||||||
|
stars: 927
|
||||||
|
owner_login: msoedov
|
||||||
|
owner_html_url: https://github.com/msoedov
|
||||||
- name: titiler
|
- name: titiler
|
||||||
html_url: https://github.com/developmentseed/titiler
|
html_url: https://github.com/developmentseed/titiler
|
||||||
stars: 873
|
stars: 901
|
||||||
owner_login: developmentseed
|
owner_login: developmentseed
|
||||||
owner_html_url: https://github.com/developmentseed
|
owner_html_url: https://github.com/developmentseed
|
||||||
- name: httpdbg
|
|
||||||
html_url: https://github.com/cle-b/httpdbg
|
|
||||||
stars: 850
|
|
||||||
owner_login: cle-b
|
|
||||||
owner_html_url: https://github.com/cle-b
|
|
||||||
- name: marker-api
|
|
||||||
html_url: https://github.com/adithya-s-k/marker-api
|
|
||||||
stars: 844
|
|
||||||
owner_login: adithya-s-k
|
|
||||||
owner_html_url: https://github.com/adithya-s-k
|
|
||||||
- name: ludic
|
|
||||||
html_url: https://github.com/getludic/ludic
|
|
||||||
stars: 842
|
|
||||||
owner_login: getludic
|
|
||||||
owner_html_url: https://github.com/getludic
|
|
||||||
- name: flock
|
- name: flock
|
||||||
html_url: https://github.com/Onelevenvy/flock
|
html_url: https://github.com/Onelevenvy/flock
|
||||||
stars: 805
|
stars: 896
|
||||||
owner_login: Onelevenvy
|
owner_login: Onelevenvy
|
||||||
owner_html_url: https://github.com/Onelevenvy
|
owner_html_url: https://github.com/Onelevenvy
|
||||||
- name: fastapi-observability
|
- name: fastapi-langgraph-agent-production-ready-template
|
||||||
html_url: https://github.com/blueswen/fastapi-observability
|
html_url: https://github.com/wassim249/fastapi-langgraph-agent-production-ready-template
|
||||||
stars: 797
|
stars: 896
|
||||||
owner_login: blueswen
|
owner_login: wassim249
|
||||||
owner_html_url: https://github.com/blueswen
|
owner_html_url: https://github.com/wassim249
|
||||||
|
- name: marker-api
|
||||||
|
html_url: https://github.com/adithya-s-k/marker-api
|
||||||
|
stars: 875
|
||||||
|
owner_login: adithya-s-k
|
||||||
|
owner_html_url: https://github.com/adithya-s-k
|
||||||
|
- name: httpdbg
|
||||||
|
html_url: https://github.com/cle-b/httpdbg
|
||||||
|
stars: 870
|
||||||
|
owner_login: cle-b
|
||||||
|
owner_html_url: https://github.com/cle-b
|
||||||
- name: fastapi-do-zero
|
- name: fastapi-do-zero
|
||||||
html_url: https://github.com/dunossauro/fastapi-do-zero
|
html_url: https://github.com/dunossauro/fastapi-do-zero
|
||||||
stars: 786
|
stars: 855
|
||||||
owner_login: dunossauro
|
owner_login: dunossauro
|
||||||
owner_html_url: https://github.com/dunossauro
|
owner_html_url: https://github.com/dunossauro
|
||||||
- name: fastapi-mail
|
- name: ludic
|
||||||
html_url: https://github.com/sabuhish/fastapi-mail
|
html_url: https://github.com/getludic/ludic
|
||||||
stars: 781
|
stars: 849
|
||||||
owner_login: sabuhish
|
owner_login: getludic
|
||||||
owner_html_url: https://github.com/sabuhish
|
owner_html_url: https://github.com/getludic
|
||||||
|
- name: fastapi-observability
|
||||||
|
html_url: https://github.com/blueswen/fastapi-observability
|
||||||
|
stars: 837
|
||||||
|
owner_login: blueswen
|
||||||
|
owner_html_url: https://github.com/blueswen
|
||||||
|
- name: fastapi-scaf
|
||||||
|
html_url: https://github.com/atpuxiner/fastapi-scaf
|
||||||
|
stars: 821
|
||||||
|
owner_login: atpuxiner
|
||||||
|
owner_html_url: https://github.com/atpuxiner
|
||||||
- name: starlette-admin
|
- name: starlette-admin
|
||||||
html_url: https://github.com/jowilf/starlette-admin
|
html_url: https://github.com/jowilf/starlette-admin
|
||||||
stars: 764
|
stars: 808
|
||||||
owner_login: jowilf
|
owner_login: jowilf
|
||||||
owner_html_url: https://github.com/jowilf
|
owner_html_url: https://github.com/jowilf
|
||||||
- name: lccn_predictor
|
- name: fastapi-mail
|
||||||
html_url: https://github.com/baoliay2008/lccn_predictor
|
html_url: https://github.com/sabuhish/fastapi-mail
|
||||||
stars: 759
|
stars: 807
|
||||||
owner_login: baoliay2008
|
owner_login: sabuhish
|
||||||
owner_html_url: https://github.com/baoliay2008
|
owner_html_url: https://github.com/sabuhish
|
||||||
- name: KonomiTV
|
- name: aktools
|
||||||
html_url: https://github.com/tsukumijima/KonomiTV
|
html_url: https://github.com/akfamily/aktools
|
||||||
stars: 741
|
stars: 796
|
||||||
owner_login: tsukumijima
|
owner_login: akfamily
|
||||||
owner_html_url: https://github.com/tsukumijima
|
owner_html_url: https://github.com/akfamily
|
||||||
- name: FastAPI-Backend-Template
|
- name: RuoYi-Vue3-FastAPI
|
||||||
html_url: https://github.com/Aeternalis-Ingenium/FastAPI-Backend-Template
|
html_url: https://github.com/insistence/RuoYi-Vue3-FastAPI
|
||||||
stars: 734
|
stars: 782
|
||||||
owner_login: Aeternalis-Ingenium
|
owner_login: insistence
|
||||||
owner_html_url: https://github.com/Aeternalis-Ingenium
|
owner_html_url: https://github.com/insistence
|
||||||
- name: learn-generative-ai
|
|
||||||
html_url: https://github.com/panaverse/learn-generative-ai
|
|
||||||
stars: 731
|
|
||||||
owner_login: panaverse
|
|
||||||
owner_html_url: https://github.com/panaverse
|
|
||||||
- name: annotated-py-projects
|
|
||||||
html_url: https://github.com/hhstore/annotated-py-projects
|
|
||||||
stars: 730
|
|
||||||
owner_login: hhstore
|
|
||||||
owner_html_url: https://github.com/hhstore
|
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ Xewus:
|
||||||
url: https://github.com/Xewus
|
url: https://github.com/Xewus
|
||||||
sodaMelon:
|
sodaMelon:
|
||||||
login: sodaMelon
|
login: sodaMelon
|
||||||
count: 124
|
count: 126
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/66295123?u=be939db90f1119efee9e6110cc05066ff1f40f00&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/66295123?u=be939db90f1119efee9e6110cc05066ff1f40f00&v=4
|
||||||
url: https://github.com/sodaMelon
|
url: https://github.com/sodaMelon
|
||||||
ceb10n:
|
ceb10n:
|
||||||
|
|
@ -30,7 +30,7 @@ hasansezertasan:
|
||||||
url: https://github.com/hasansezertasan
|
url: https://github.com/hasansezertasan
|
||||||
hard-coders:
|
hard-coders:
|
||||||
login: hard-coders
|
login: hard-coders
|
||||||
count: 92
|
count: 93
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/9651103?u=95db33927bbff1ed1c07efddeb97ac2ff33068ed&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/9651103?u=95db33927bbff1ed1c07efddeb97ac2ff33068ed&v=4
|
||||||
url: https://github.com/hard-coders
|
url: https://github.com/hard-coders
|
||||||
alv2017:
|
alv2017:
|
||||||
|
|
@ -70,7 +70,7 @@ mattwang44:
|
||||||
url: https://github.com/mattwang44
|
url: https://github.com/mattwang44
|
||||||
tiangolo:
|
tiangolo:
|
||||||
login: tiangolo
|
login: tiangolo
|
||||||
count: 52
|
count: 53
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
|
||||||
url: https://github.com/tiangolo
|
url: https://github.com/tiangolo
|
||||||
Laineyzhang55:
|
Laineyzhang55:
|
||||||
|
|
@ -148,6 +148,11 @@ nilslindemann:
|
||||||
count: 35
|
count: 35
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/6892179?u=1dca6a22195d6cd1ab20737c0e19a4c55d639472&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/6892179?u=1dca6a22195d6cd1ab20737c0e19a4c55d639472&v=4
|
||||||
url: https://github.com/nilslindemann
|
url: https://github.com/nilslindemann
|
||||||
|
mezgoodle:
|
||||||
|
login: mezgoodle
|
||||||
|
count: 35
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/41520940?u=4a9c765af688389d54296845d18b8f6cd6ddf09a&v=4
|
||||||
|
url: https://github.com/mezgoodle
|
||||||
rjNemo:
|
rjNemo:
|
||||||
login: rjNemo
|
login: rjNemo
|
||||||
count: 34
|
count: 34
|
||||||
|
|
@ -158,11 +163,6 @@ codingjenny:
|
||||||
count: 34
|
count: 34
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/103817302?u=3a042740dc0ff58615da0d8679230966fd7693e8&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/103817302?u=3a042740dc0ff58615da0d8679230966fd7693e8&v=4
|
||||||
url: https://github.com/codingjenny
|
url: https://github.com/codingjenny
|
||||||
mezgoodle:
|
|
||||||
login: mezgoodle
|
|
||||||
count: 33
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/41520940?u=4a9c765af688389d54296845d18b8f6cd6ddf09a&v=4
|
|
||||||
url: https://github.com/mezgoodle
|
|
||||||
akarev0:
|
akarev0:
|
||||||
login: akarev0
|
login: akarev0
|
||||||
count: 33
|
count: 33
|
||||||
|
|
@ -243,6 +243,11 @@ mycaule:
|
||||||
count: 25
|
count: 25
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/6161385?u=e3cec75bd6d938a0d73fae0dc5534d1ab2ed1b0e&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/6161385?u=e3cec75bd6d938a0d73fae0dc5534d1ab2ed1b0e&v=4
|
||||||
url: https://github.com/mycaule
|
url: https://github.com/mycaule
|
||||||
|
YuriiMotov:
|
||||||
|
login: YuriiMotov
|
||||||
|
count: 24
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4
|
||||||
|
url: https://github.com/YuriiMotov
|
||||||
Aruelius:
|
Aruelius:
|
||||||
login: Aruelius
|
login: Aruelius
|
||||||
count: 24
|
count: 24
|
||||||
|
|
@ -268,6 +273,11 @@ axel584:
|
||||||
count: 23
|
count: 23
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/1334088?u=9667041f5b15dc002b6f9665fda8c0412933ac04&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/1334088?u=9667041f5b15dc002b6f9665fda8c0412933ac04&v=4
|
||||||
url: https://github.com/axel584
|
url: https://github.com/axel584
|
||||||
|
DianaTrufanova:
|
||||||
|
login: DianaTrufanova
|
||||||
|
count: 23
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/119067607?u=1cd55f841b68b4a187fa6d06a7dafa5f070195aa&v=4
|
||||||
|
url: https://github.com/DianaTrufanova
|
||||||
AGolicyn:
|
AGolicyn:
|
||||||
login: AGolicyn
|
login: AGolicyn
|
||||||
count: 21
|
count: 21
|
||||||
|
|
@ -328,6 +338,11 @@ Limsunoh:
|
||||||
count: 18
|
count: 18
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/90311848?u=f456e0c5709fd50c8cd2898b551558eda14e5f21&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/90311848?u=f456e0c5709fd50c8cd2898b551558eda14e5f21&v=4
|
||||||
url: https://github.com/Limsunoh
|
url: https://github.com/Limsunoh
|
||||||
|
SofiiaTrufanova:
|
||||||
|
login: SofiiaTrufanova
|
||||||
|
count: 18
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/63260929?u=483e0b64fabc76343b3be39b7e1dcb930a95e1bb&v=4
|
||||||
|
url: https://github.com/SofiiaTrufanova
|
||||||
bezaca:
|
bezaca:
|
||||||
login: bezaca
|
login: bezaca
|
||||||
count: 17
|
count: 17
|
||||||
|
|
@ -373,11 +388,6 @@ JaeHyuckSa:
|
||||||
count: 16
|
count: 16
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/104830931?u=6e352201714a05154e5d0ccf91b4715a951c622e&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/104830931?u=6e352201714a05154e5d0ccf91b4715a951c622e&v=4
|
||||||
url: https://github.com/JaeHyuckSa
|
url: https://github.com/JaeHyuckSa
|
||||||
SofiiaTrufanova:
|
|
||||||
login: SofiiaTrufanova
|
|
||||||
count: 16
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/63260929?u=483e0b64fabc76343b3be39b7e1dcb930a95e1bb&v=4
|
|
||||||
url: https://github.com/SofiiaTrufanova
|
|
||||||
Jedore:
|
Jedore:
|
||||||
login: Jedore
|
login: Jedore
|
||||||
count: 15
|
count: 15
|
||||||
|
|
@ -388,11 +398,6 @@ kim-sangah:
|
||||||
count: 15
|
count: 15
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/173775778?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/173775778?v=4
|
||||||
url: https://github.com/kim-sangah
|
url: https://github.com/kim-sangah
|
||||||
DianaTrufanova:
|
|
||||||
login: DianaTrufanova
|
|
||||||
count: 15
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/119067607?u=1cd55f841b68b4a187fa6d06a7dafa5f070195aa&v=4
|
|
||||||
url: https://github.com/DianaTrufanova
|
|
||||||
PandaHun:
|
PandaHun:
|
||||||
login: PandaHun
|
login: PandaHun
|
||||||
count: 14
|
count: 14
|
||||||
|
|
@ -533,6 +538,11 @@ Lufa1u:
|
||||||
count: 11
|
count: 11
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/112495876?u=087658920ed9e74311597bdd921d8d2de939d276&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/112495876?u=087658920ed9e74311597bdd921d8d2de939d276&v=4
|
||||||
url: https://github.com/Lufa1u
|
url: https://github.com/Lufa1u
|
||||||
|
waketzheng:
|
||||||
|
login: waketzheng
|
||||||
|
count: 11
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/35413830?u=df19e4fd5bb928e7d086e053ef26a46aad23bf84&v=4
|
||||||
|
url: https://github.com/waketzheng
|
||||||
KNChiu:
|
KNChiu:
|
||||||
login: KNChiu
|
login: KNChiu
|
||||||
count: 11
|
count: 11
|
||||||
|
|
@ -593,16 +603,21 @@ nick-cjyx9:
|
||||||
count: 10
|
count: 10
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/119087246?u=c35aab03f082430be8a1edd80f5625b44819a0d8&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/119087246?u=c35aab03f082430be8a1edd80f5625b44819a0d8&v=4
|
||||||
url: https://github.com/nick-cjyx9
|
url: https://github.com/nick-cjyx9
|
||||||
waketzheng:
|
|
||||||
login: waketzheng
|
|
||||||
count: 10
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/35413830?u=df19e4fd5bb928e7d086e053ef26a46aad23bf84&v=4
|
|
||||||
url: https://github.com/waketzheng
|
|
||||||
lucasbalieiro:
|
lucasbalieiro:
|
||||||
login: lucasbalieiro
|
login: lucasbalieiro
|
||||||
count: 10
|
count: 10
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/37416577?u=eabaf4aebbaa88a94a4886273edba689012cee70&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/37416577?u=eabaf4aebbaa88a94a4886273edba689012cee70&v=4
|
||||||
url: https://github.com/lucasbalieiro
|
url: https://github.com/lucasbalieiro
|
||||||
|
maru0123-2004:
|
||||||
|
login: maru0123-2004
|
||||||
|
count: 10
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/43961566?u=16ed8603a4d6a4665cb6c53a7aece6f31379b769&v=4
|
||||||
|
url: https://github.com/maru0123-2004
|
||||||
|
Zhongheng-Cheng:
|
||||||
|
login: Zhongheng-Cheng
|
||||||
|
count: 10
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/95612344?u=a0f7730a3cc7486827965e01a119ad610bda4b0a&v=4
|
||||||
|
url: https://github.com/Zhongheng-Cheng
|
||||||
RunningIkkyu:
|
RunningIkkyu:
|
||||||
login: RunningIkkyu
|
login: RunningIkkyu
|
||||||
count: 9
|
count: 9
|
||||||
|
|
@ -646,7 +661,7 @@ riroan:
|
||||||
MinLee0210:
|
MinLee0210:
|
||||||
login: MinLee0210
|
login: MinLee0210
|
||||||
count: 9
|
count: 9
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/57653278?u=175010b24bc3a15a5705424badf9b18823bfd67d&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/57653278?u=8ca05a7efbc76048183da00da87d148b755a3ba8&v=4
|
||||||
url: https://github.com/MinLee0210
|
url: https://github.com/MinLee0210
|
||||||
yodai-yodai:
|
yodai-yodai:
|
||||||
login: yodai-yodai
|
login: yodai-yodai
|
||||||
|
|
@ -663,11 +678,6 @@ JoaoGustavoRogel:
|
||||||
count: 9
|
count: 9
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/29525510?u=a0a91251f5e43e132608d55d28ccb8645c5ea405&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/29525510?u=a0a91251f5e43e132608d55d28ccb8645c5ea405&v=4
|
||||||
url: https://github.com/JoaoGustavoRogel
|
url: https://github.com/JoaoGustavoRogel
|
||||||
Zhongheng-Cheng:
|
|
||||||
login: Zhongheng-Cheng
|
|
||||||
count: 9
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/95612344?u=a0f7730a3cc7486827965e01a119ad610bda4b0a&v=4
|
|
||||||
url: https://github.com/Zhongheng-Cheng
|
|
||||||
Yarous:
|
Yarous:
|
||||||
login: Yarous
|
login: Yarous
|
||||||
count: 9
|
count: 9
|
||||||
|
|
@ -713,16 +723,16 @@ camigomezdev:
|
||||||
count: 8
|
count: 8
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/16061815?u=25b5ebc042fff53fa03dc107ded10e36b1b7a5b9&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/16061815?u=25b5ebc042fff53fa03dc107ded10e36b1b7a5b9&v=4
|
||||||
url: https://github.com/camigomezdev
|
url: https://github.com/camigomezdev
|
||||||
maru0123-2004:
|
|
||||||
login: maru0123-2004
|
|
||||||
count: 8
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/43961566?u=16ed8603a4d6a4665cb6c53a7aece6f31379b769&v=4
|
|
||||||
url: https://github.com/maru0123-2004
|
|
||||||
minaton-ru:
|
minaton-ru:
|
||||||
login: minaton-ru
|
login: minaton-ru
|
||||||
count: 8
|
count: 8
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/53541518?u=67336ca11a85493f75031508aade588dad3b9910&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/53541518?u=67336ca11a85493f75031508aade588dad3b9910&v=4
|
||||||
url: https://github.com/minaton-ru
|
url: https://github.com/minaton-ru
|
||||||
|
sungchan1:
|
||||||
|
login: sungchan1
|
||||||
|
count: 8
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/28076127?u=a816d86ef3e60450a7225f128caf9a394c9320f9&v=4
|
||||||
|
url: https://github.com/sungchan1
|
||||||
Serrones:
|
Serrones:
|
||||||
login: Serrones
|
login: Serrones
|
||||||
count: 7
|
count: 7
|
||||||
|
|
@ -743,6 +753,11 @@ anthonycepeda:
|
||||||
count: 7
|
count: 7
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/72019805?u=60bdf46240cff8fca482ff0fc07d963fd5e1a27c&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/72019805?u=60bdf46240cff8fca482ff0fc07d963fd5e1a27c&v=4
|
||||||
url: https://github.com/anthonycepeda
|
url: https://github.com/anthonycepeda
|
||||||
|
Muaytie666:
|
||||||
|
login: Muaytie666
|
||||||
|
count: 7
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/198508825?v=4
|
||||||
|
url: https://github.com/Muaytie666
|
||||||
fabioueno:
|
fabioueno:
|
||||||
login: fabioueno
|
login: fabioueno
|
||||||
count: 7
|
count: 7
|
||||||
|
|
@ -768,15 +783,20 @@ d2a-raudenaerde:
|
||||||
count: 7
|
count: 7
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/5213150?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/5213150?v=4
|
||||||
url: https://github.com/d2a-raudenaerde
|
url: https://github.com/d2a-raudenaerde
|
||||||
sungchan1:
|
valentinDruzhinin:
|
||||||
login: sungchan1
|
login: valentinDruzhinin
|
||||||
count: 7
|
count: 7
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/28076127?u=a816d86ef3e60450a7225f128caf9a394c9320f9&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4
|
||||||
url: https://github.com/sungchan1
|
url: https://github.com/valentinDruzhinin
|
||||||
|
Zerohertz:
|
||||||
|
login: Zerohertz
|
||||||
|
count: 7
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/42334717?u=5ebf4d33e73b1ad373154f6cdee44f7cab4d05ba&v=4
|
||||||
|
url: https://github.com/Zerohertz
|
||||||
deniscapeto:
|
deniscapeto:
|
||||||
login: deniscapeto
|
login: deniscapeto
|
||||||
count: 6
|
count: 6
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/12864353?u=dbc20c5c1171feab5df4db46488b675d53cb5b07&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/12864353?u=20c5b2300b264a585a8381acf3cef44bcfcc1ead&v=4
|
||||||
url: https://github.com/deniscapeto
|
url: https://github.com/deniscapeto
|
||||||
bsab:
|
bsab:
|
||||||
login: bsab
|
login: bsab
|
||||||
|
|
@ -873,11 +893,11 @@ bankofsardine:
|
||||||
count: 6
|
count: 6
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/44944207?u=0368e1b698ffab6bf29e202f9fd2dddd352429f1&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/44944207?u=0368e1b698ffab6bf29e202f9fd2dddd352429f1&v=4
|
||||||
url: https://github.com/bankofsardine
|
url: https://github.com/bankofsardine
|
||||||
valentinDruzhinin:
|
Rekl0w:
|
||||||
login: valentinDruzhinin
|
login: Rekl0w
|
||||||
count: 6
|
count: 6
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/91488737?u=3b62b04a3e6699eab9b1eea4e88c09a39b753a17&v=4
|
||||||
url: https://github.com/valentinDruzhinin
|
url: https://github.com/Rekl0w
|
||||||
rsip22:
|
rsip22:
|
||||||
login: rsip22
|
login: rsip22
|
||||||
count: 5
|
count: 5
|
||||||
|
|
@ -921,7 +941,7 @@ Wuerike:
|
||||||
jvmazagao:
|
jvmazagao:
|
||||||
login: jvmazagao
|
login: jvmazagao
|
||||||
count: 5
|
count: 5
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/22477816?u=f3b2d503b53e6ec8c808f0601b756a063a07f06e&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/22477816?u=2b57addf5830906bf6ae5f25cd4c8c2fa5c2d68e&v=4
|
||||||
url: https://github.com/jvmazagao
|
url: https://github.com/jvmazagao
|
||||||
cun3yt:
|
cun3yt:
|
||||||
login: cun3yt
|
login: cun3yt
|
||||||
|
|
@ -961,7 +981,7 @@ ChuyuChoyeon:
|
||||||
frwl404:
|
frwl404:
|
||||||
login: frwl404
|
login: frwl404
|
||||||
count: 5
|
count: 5
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/42642656?u=572a5a33762e07eaa6ebd58d9d773abdb1de41c3&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/42642656?u=8395a3d991d9fac86901277d76f0f70857b56ec5&v=4
|
||||||
url: https://github.com/frwl404
|
url: https://github.com/frwl404
|
||||||
esrefzeki:
|
esrefzeki:
|
||||||
login: esrefzeki
|
login: esrefzeki
|
||||||
|
|
@ -1003,11 +1023,6 @@ devluisrodrigues:
|
||||||
count: 5
|
count: 5
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/103431660?u=d9674a3249edc4601d2c712cdebf899918503c3a&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/103431660?u=d9674a3249edc4601d2c712cdebf899918503c3a&v=4
|
||||||
url: https://github.com/devluisrodrigues
|
url: https://github.com/devluisrodrigues
|
||||||
Zerohertz:
|
|
||||||
login: Zerohertz
|
|
||||||
count: 5
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/42334717?u=c6acda352c866b1747921e0ff8782b58571d849e&v=4
|
|
||||||
url: https://github.com/Zerohertz
|
|
||||||
11kkw:
|
11kkw:
|
||||||
login: 11kkw
|
login: 11kkw
|
||||||
count: 5
|
count: 5
|
||||||
|
|
@ -1328,6 +1343,11 @@ Sion99:
|
||||||
count: 3
|
count: 3
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/82511301?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/82511301?v=4
|
||||||
url: https://github.com/Sion99
|
url: https://github.com/Sion99
|
||||||
|
nymous:
|
||||||
|
login: nymous
|
||||||
|
count: 3
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/4216559?u=360a36fb602cded27273cbfc0afc296eece90662&v=4
|
||||||
|
url: https://github.com/nymous
|
||||||
EpsilonRationes:
|
EpsilonRationes:
|
||||||
login: EpsilonRationes
|
login: EpsilonRationes
|
||||||
count: 3
|
count: 3
|
||||||
|
|
@ -1366,7 +1386,7 @@ GDemay:
|
||||||
maxscheijen:
|
maxscheijen:
|
||||||
login: maxscheijen
|
login: maxscheijen
|
||||||
count: 3
|
count: 3
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/47034840?u=eb98f37882528ea349ca4e5255fa64ac3fef0294&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/47034840?v=4
|
||||||
url: https://github.com/maxscheijen
|
url: https://github.com/maxscheijen
|
||||||
celestywang:
|
celestywang:
|
||||||
login: celestywang
|
login: celestywang
|
||||||
|
|
@ -1386,7 +1406,7 @@ tienduong-21:
|
||||||
soroushgh1:
|
soroushgh1:
|
||||||
login: soroushgh1
|
login: soroushgh1
|
||||||
count: 3
|
count: 3
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/178516095?u=e4d791c982cf7899c69f6baeebc4d7bbe86635d1&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/178516095?u=5e26f6a5f66cdb32d7b56e6ab362bf18ba7858b9&v=4
|
||||||
url: https://github.com/soroushgh1
|
url: https://github.com/soroushgh1
|
||||||
zbellos:
|
zbellos:
|
||||||
login: zbellos
|
login: zbellos
|
||||||
|
|
@ -1508,11 +1528,11 @@ tyzh-dev:
|
||||||
count: 2
|
count: 2
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/51972581?u=ba3882da7c009918a8e2d6b9ead31c89f09c922d&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/51972581?u=ba3882da7c009918a8e2d6b9ead31c89f09c922d&v=4
|
||||||
url: https://github.com/tyzh-dev
|
url: https://github.com/tyzh-dev
|
||||||
WaFeeAL:
|
yurkevich-dev:
|
||||||
login: WaFeeAL
|
login: yurkevich-dev
|
||||||
count: 2
|
count: 2
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/45145188?u=db2de8c186073d95693279dcf085fcebffab57d0&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/45145188?u=db2de8c186073d95693279dcf085fcebffab57d0&v=4
|
||||||
url: https://github.com/WaFeeAL
|
url: https://github.com/yurkevich-dev
|
||||||
emp7yhead:
|
emp7yhead:
|
||||||
login: emp7yhead
|
login: emp7yhead
|
||||||
count: 2
|
count: 2
|
||||||
|
|
@ -1566,7 +1586,7 @@ raphaelauv:
|
||||||
Fahad-Md-Kamal:
|
Fahad-Md-Kamal:
|
||||||
login: Fahad-Md-Kamal
|
login: Fahad-Md-Kamal
|
||||||
count: 2
|
count: 2
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/34704464?u=84abea85e59c30b2e3bc700ae42424f3fe704332&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/34704464?u=141086368c5557d5a1a533fe291f21f9fc584458&v=4
|
||||||
url: https://github.com/Fahad-Md-Kamal
|
url: https://github.com/Fahad-Md-Kamal
|
||||||
zxcq544:
|
zxcq544:
|
||||||
login: zxcq544
|
login: zxcq544
|
||||||
|
|
@ -1733,6 +1753,11 @@ Heumhub:
|
||||||
count: 2
|
count: 2
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/173761521?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/173761521?v=4
|
||||||
url: https://github.com/Heumhub
|
url: https://github.com/Heumhub
|
||||||
|
manumolina:
|
||||||
|
login: manumolina
|
||||||
|
count: 2
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/2404208?u=fdc5502910f8dec814b2477f89587b9e45fac846&v=4
|
||||||
|
url: https://github.com/manumolina
|
||||||
logan2d5:
|
logan2d5:
|
||||||
login: logan2d5
|
login: logan2d5
|
||||||
count: 2
|
count: 2
|
||||||
|
|
@ -1748,6 +1773,11 @@ kiharito:
|
||||||
count: 2
|
count: 2
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/38311245?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/38311245?v=4
|
||||||
url: https://github.com/kiharito
|
url: https://github.com/kiharito
|
||||||
|
t4f1d:
|
||||||
|
login: t4f1d
|
||||||
|
count: 2
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/4054172?u=463d5ce0ec8ad8582f6e9351bb8c9a5105b39bb7&v=4
|
||||||
|
url: https://github.com/t4f1d
|
||||||
J-Fuji:
|
J-Fuji:
|
||||||
login: J-Fuji
|
login: J-Fuji
|
||||||
count: 2
|
count: 2
|
||||||
|
|
@ -1768,8 +1798,23 @@ EgorOnishchuk:
|
||||||
count: 2
|
count: 2
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/120256301?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/120256301?v=4
|
||||||
url: https://github.com/EgorOnishchuk
|
url: https://github.com/EgorOnishchuk
|
||||||
|
iamantonreznik:
|
||||||
|
login: iamantonreznik
|
||||||
|
count: 2
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/112612414?u=bf6de9a1ab17326fe14de0709719fff3826526d0&v=4
|
||||||
|
url: https://github.com/iamantonreznik
|
||||||
Azazul123:
|
Azazul123:
|
||||||
login: Azazul123
|
login: Azazul123
|
||||||
count: 2
|
count: 2
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/102759111?u=b48ce6e30a81a23467cc30e0c011bcc57f0326ab&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/102759111?u=b48ce6e30a81a23467cc30e0c011bcc57f0326ab&v=4
|
||||||
url: https://github.com/Azazul123
|
url: https://github.com/Azazul123
|
||||||
|
ykertytsky:
|
||||||
|
login: ykertytsky
|
||||||
|
count: 2
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/83857001?u=1172902656ee604cf37f5e36abe938cd34a97a32&v=4
|
||||||
|
url: https://github.com/ykertytsky
|
||||||
|
NavesSapnis:
|
||||||
|
login: NavesSapnis
|
||||||
|
count: 2
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/79222417?u=b5b10291b8e9130ca84fd20f0a641e04ed94b6b1&v=4
|
||||||
|
url: https://github.com/NavesSapnis
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,11 @@ jaystone776:
|
||||||
count: 46
|
count: 46
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/11191137?u=299205a95e9b6817a43144a48b643346a5aac5cc&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/11191137?u=299205a95e9b6817a43144a48b643346a5aac5cc&v=4
|
||||||
url: https://github.com/jaystone776
|
url: https://github.com/jaystone776
|
||||||
|
valentinDruzhinin:
|
||||||
|
login: valentinDruzhinin
|
||||||
|
count: 29
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4
|
||||||
|
url: https://github.com/valentinDruzhinin
|
||||||
ceb10n:
|
ceb10n:
|
||||||
login: ceb10n
|
login: ceb10n
|
||||||
count: 27
|
count: 27
|
||||||
|
|
@ -33,11 +38,6 @@ waynerv:
|
||||||
count: 20
|
count: 20
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/39515546?u=ec35139777597cdbbbddda29bf8b9d4396b429a9&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/39515546?u=ec35139777597cdbbbddda29bf8b9d4396b429a9&v=4
|
||||||
url: https://github.com/waynerv
|
url: https://github.com/waynerv
|
||||||
valentinDruzhinin:
|
|
||||||
login: valentinDruzhinin
|
|
||||||
count: 18
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4
|
|
||||||
url: https://github.com/valentinDruzhinin
|
|
||||||
AlertRED:
|
AlertRED:
|
||||||
login: AlertRED
|
login: AlertRED
|
||||||
count: 16
|
count: 16
|
||||||
|
|
@ -108,6 +108,11 @@ ptt3199:
|
||||||
count: 7
|
count: 7
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/51350651?u=2c3d947a80283e32bf616d4c3af139a6be69680f&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/51350651?u=2c3d947a80283e32bf616d4c3af139a6be69680f&v=4
|
||||||
url: https://github.com/ptt3199
|
url: https://github.com/ptt3199
|
||||||
|
NinaHwang:
|
||||||
|
login: NinaHwang
|
||||||
|
count: 6
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/79563565?u=241f2cb6d38a2d379536608a8ea5a22ed4b1a3ea&v=4
|
||||||
|
url: https://github.com/NinaHwang
|
||||||
batlopes:
|
batlopes:
|
||||||
login: batlopes
|
login: batlopes
|
||||||
count: 6
|
count: 6
|
||||||
|
|
@ -138,11 +143,6 @@ Attsun1031:
|
||||||
count: 5
|
count: 5
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/1175560?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/1175560?v=4
|
||||||
url: https://github.com/Attsun1031
|
url: https://github.com/Attsun1031
|
||||||
NinaHwang:
|
|
||||||
login: NinaHwang
|
|
||||||
count: 5
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/79563565?u=241f2cb6d38a2d379536608a8ea5a22ed4b1a3ea&v=4
|
|
||||||
url: https://github.com/NinaHwang
|
|
||||||
tiangolo:
|
tiangolo:
|
||||||
login: tiangolo
|
login: tiangolo
|
||||||
count: 5
|
count: 5
|
||||||
|
|
@ -296,7 +296,7 @@ pe-brian:
|
||||||
maxscheijen:
|
maxscheijen:
|
||||||
login: maxscheijen
|
login: maxscheijen
|
||||||
count: 3
|
count: 3
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/47034840?u=eb98f37882528ea349ca4e5255fa64ac3fef0294&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/47034840?v=4
|
||||||
url: https://github.com/maxscheijen
|
url: https://github.com/maxscheijen
|
||||||
ilacftemp:
|
ilacftemp:
|
||||||
login: ilacftemp
|
login: ilacftemp
|
||||||
|
|
@ -328,6 +328,11 @@ nahyunkeem:
|
||||||
count: 3
|
count: 3
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/174440096?u=e12401d492eee58570f8914d0872b52e421a776e&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/174440096?u=e12401d492eee58570f8914d0872b52e421a776e&v=4
|
||||||
url: https://github.com/nahyunkeem
|
url: https://github.com/nahyunkeem
|
||||||
|
timothy-jeong:
|
||||||
|
login: timothy-jeong
|
||||||
|
count: 3
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/53824764?u=db3d0cea2f5fab64d810113c5039a369699a2774&v=4
|
||||||
|
url: https://github.com/timothy-jeong
|
||||||
gerry-sabar:
|
gerry-sabar:
|
||||||
login: gerry-sabar
|
login: gerry-sabar
|
||||||
count: 3
|
count: 3
|
||||||
|
|
@ -338,6 +343,11 @@ Rishat-F:
|
||||||
count: 3
|
count: 3
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/66554797?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/66554797?v=4
|
||||||
url: https://github.com/Rishat-F
|
url: https://github.com/Rishat-F
|
||||||
|
ruzia:
|
||||||
|
login: ruzia
|
||||||
|
count: 3
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/24503?v=4
|
||||||
|
url: https://github.com/ruzia
|
||||||
izaguerreiro:
|
izaguerreiro:
|
||||||
login: izaguerreiro
|
login: izaguerreiro
|
||||||
count: 2
|
count: 2
|
||||||
|
|
@ -468,6 +478,11 @@ imtiaz101325:
|
||||||
count: 2
|
count: 2
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/54007087?u=194d972b501b9ea9d2ddeaed757c492936e0121a&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/54007087?u=194d972b501b9ea9d2ddeaed757c492936e0121a&v=4
|
||||||
url: https://github.com/imtiaz101325
|
url: https://github.com/imtiaz101325
|
||||||
|
fabianfalon:
|
||||||
|
login: fabianfalon
|
||||||
|
count: 2
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/3700760?u=95f69e31280b17ac22299cdcd345323b142fe0af&v=4
|
||||||
|
url: https://github.com/fabianfalon
|
||||||
waketzheng:
|
waketzheng:
|
||||||
login: waketzheng
|
login: waketzheng
|
||||||
count: 2
|
count: 2
|
||||||
|
|
@ -498,11 +513,6 @@ saeye:
|
||||||
count: 2
|
count: 2
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/62229734?u=312d619db2588b60d5d5bde65260a2f44fdc6c76&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/62229734?u=312d619db2588b60d5d5bde65260a2f44fdc6c76&v=4
|
||||||
url: https://github.com/saeye
|
url: https://github.com/saeye
|
||||||
timothy-jeong:
|
|
||||||
login: timothy-jeong
|
|
||||||
count: 2
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/53824764?u=db3d0cea2f5fab64d810113c5039a369699a2774&v=4
|
|
||||||
url: https://github.com/timothy-jeong
|
|
||||||
11kkw:
|
11kkw:
|
||||||
login: 11kkw
|
login: 11kkw
|
||||||
count: 2
|
count: 2
|
||||||
|
|
@ -513,3 +523,13 @@ yes0ng:
|
||||||
count: 2
|
count: 2
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/25501794?u=3aed18b0d491e0220a167a1e9e58bea3638c6707&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/25501794?u=3aed18b0d491e0220a167a1e9e58bea3638c6707&v=4
|
||||||
url: https://github.com/yes0ng
|
url: https://github.com/yes0ng
|
||||||
|
EgorOnishchuk:
|
||||||
|
login: EgorOnishchuk
|
||||||
|
count: 2
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/120256301?v=4
|
||||||
|
url: https://github.com/EgorOnishchuk
|
||||||
|
NavesSapnis:
|
||||||
|
login: NavesSapnis
|
||||||
|
count: 2
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/79222417?u=b5b10291b8e9130ca84fd20f0a641e04ed94b6b1&v=4
|
||||||
|
url: https://github.com/NavesSapnis
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ And it shows their true commitment to FastAPI and its **community** (you), as th
|
||||||
|
|
||||||
For example, you might want to try:
|
For example, you might want to try:
|
||||||
|
|
||||||
* <a href="https://speakeasy.com/?utm_source=fastapi+repo&utm_medium=github+sponsorship" class="external-link" target="_blank">Speakeasy</a>
|
* <a href="https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship" class="external-link" target="_blank">Speakeasy</a>
|
||||||
* <a href="https://www.stainlessapi.com/?utm_source=fastapi&utm_medium=referral" class="external-link" target="_blank">Stainless</a>
|
* <a href="https://www.stainlessapi.com/?utm_source=fastapi&utm_medium=referral" class="external-link" target="_blank">Stainless</a>
|
||||||
* <a href="https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi" class="external-link" target="_blank">liblab</a>
|
* <a href="https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi" class="external-link" target="_blank">liblab</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ You could put your XML content in a string, put that in a `Response`, and return
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
When you return a `Response` directly its data is not validated, converted (serialized), nor documented automatically.
|
When you return a `Response` directly its data is not validated, converted (serialized), or documented automatically.
|
||||||
|
|
||||||
But you can still document it as described in [Additional Responses in OpenAPI](additional-responses.md){.internal-link target=_blank}.
|
But you can still document it as described in [Additional Responses in OpenAPI](additional-responses.md){.internal-link target=_blank}.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ def results():
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
If your application (somehow) doesn't have to communicate with anything else and wait for it to respond, use `async def`.
|
If your application (somehow) doesn't have to communicate with anything else and wait for it to respond, use `async def`, even if you don't need to use `await` inside.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -216,7 +216,7 @@ This Manager Process would probably be the one listening on the **port** in the
|
||||||
|
|
||||||
Those worker processes would be the ones running your application, they would perform the main computations to receive a **request** and return a **response**, and they would load anything you put in variables in RAM.
|
Those worker processes would be the ones running your application, they would perform the main computations to receive a **request** and return a **response**, and they would load anything you put in variables in RAM.
|
||||||
|
|
||||||
<img src="/img/deployment/concepts/process-ram.svg">
|
<img src="/img/deployment/concepts/process-ram.drawio.svg">
|
||||||
|
|
||||||
And of course, the same machine would probably have **other processes** running as well, apart from your application.
|
And of course, the same machine would probably have **other processes** running as well, apart from your application.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,7 @@ First, the browser would check with the **DNS servers** what is the **IP for the
|
||||||
|
|
||||||
The DNS servers would tell the browser to use some specific **IP address**. That would be the public IP address used by your server, that you configured in the DNS servers.
|
The DNS servers would tell the browser to use some specific **IP address**. That would be the public IP address used by your server, that you configured in the DNS servers.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https01.svg">
|
<img src="/img/deployment/https/https01.drawio.svg">
|
||||||
|
|
||||||
### TLS Handshake Start
|
### TLS Handshake Start
|
||||||
|
|
||||||
|
|
@ -93,7 +93,7 @@ The browser would then communicate with that IP address on **port 443** (the HTT
|
||||||
|
|
||||||
The first part of the communication is just to establish the connection between the client and the server and to decide the cryptographic keys they will use, etc.
|
The first part of the communication is just to establish the connection between the client and the server and to decide the cryptographic keys they will use, etc.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https02.svg">
|
<img src="/img/deployment/https/https02.drawio.svg">
|
||||||
|
|
||||||
This interaction between the client and the server to establish the TLS connection is called the **TLS handshake**.
|
This interaction between the client and the server to establish the TLS connection is called the **TLS handshake**.
|
||||||
|
|
||||||
|
|
@ -111,7 +111,7 @@ Using the **SNI extension** discussed above, the TLS Termination Proxy would che
|
||||||
|
|
||||||
In this case, it would use the certificate for `someapp.example.com`.
|
In this case, it would use the certificate for `someapp.example.com`.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https03.svg">
|
<img src="/img/deployment/https/https03.drawio.svg">
|
||||||
|
|
||||||
The client already **trusts** the entity that generated that TLS certificate (in this case Let's Encrypt, but we'll see about that later), so it can **verify** that the certificate is valid.
|
The client already **trusts** the entity that generated that TLS certificate (in this case Let's Encrypt, but we'll see about that later), so it can **verify** that the certificate is valid.
|
||||||
|
|
||||||
|
|
@ -133,19 +133,19 @@ Now that the client and server (specifically the browser and the TLS Termination
|
||||||
|
|
||||||
So, the client sends an **HTTPS request**. This is just an HTTP request through an encrypted TLS connection.
|
So, the client sends an **HTTPS request**. This is just an HTTP request through an encrypted TLS connection.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https04.svg">
|
<img src="/img/deployment/https/https04.drawio.svg">
|
||||||
|
|
||||||
### Decrypt the Request
|
### Decrypt the Request
|
||||||
|
|
||||||
The TLS Termination Proxy would use the encryption agreed to **decrypt the request**, and would transmit the **plain (decrypted) HTTP request** to the process running the application (for example a process with Uvicorn running the FastAPI application).
|
The TLS Termination Proxy would use the encryption agreed to **decrypt the request**, and would transmit the **plain (decrypted) HTTP request** to the process running the application (for example a process with Uvicorn running the FastAPI application).
|
||||||
|
|
||||||
<img src="/img/deployment/https/https05.svg">
|
<img src="/img/deployment/https/https05.drawio.svg">
|
||||||
|
|
||||||
### HTTP Response
|
### HTTP Response
|
||||||
|
|
||||||
The application would process the request and send a **plain (unencrypted) HTTP response** to the TLS Termination Proxy.
|
The application would process the request and send a **plain (unencrypted) HTTP response** to the TLS Termination Proxy.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https06.svg">
|
<img src="/img/deployment/https/https06.drawio.svg">
|
||||||
|
|
||||||
### HTTPS Response
|
### HTTPS Response
|
||||||
|
|
||||||
|
|
@ -153,7 +153,7 @@ The TLS Termination Proxy would then **encrypt the response** using the cryptogr
|
||||||
|
|
||||||
Next, the browser would verify that the response is valid and encrypted with the right cryptographic key, etc. It would then **decrypt the response** and process it.
|
Next, the browser would verify that the response is valid and encrypted with the right cryptographic key, etc. It would then **decrypt the response** and process it.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https07.svg">
|
<img src="/img/deployment/https/https07.drawio.svg">
|
||||||
|
|
||||||
The client (browser) will know that the response comes from the correct server because it is using the cryptography they agreed using the **HTTPS certificate** before.
|
The client (browser) will know that the response comes from the correct server because it is using the cryptography they agreed using the **HTTPS certificate** before.
|
||||||
|
|
||||||
|
|
@ -163,7 +163,7 @@ In the same server (or servers), there could be **multiple applications**, for e
|
||||||
|
|
||||||
Only one process can be handling the specific IP and port (the TLS Termination Proxy in our example) but the other applications/processes can be running on the server(s) too, as long as they don't try to use the same **combination of public IP and port**.
|
Only one process can be handling the specific IP and port (the TLS Termination Proxy in our example) but the other applications/processes can be running on the server(s) too, as long as they don't try to use the same **combination of public IP and port**.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https08.svg">
|
<img src="/img/deployment/https/https08.drawio.svg">
|
||||||
|
|
||||||
That way, the TLS Termination Proxy could handle HTTPS and certificates for **multiple domains**, for multiple applications, and then transmit the requests to the right application in each case.
|
That way, the TLS Termination Proxy could handle HTTPS and certificates for **multiple domains**, for multiple applications, and then transmit the requests to the right application in each case.
|
||||||
|
|
||||||
|
|
@ -173,7 +173,7 @@ At some point in the future, each certificate would **expire** (about 3 months a
|
||||||
|
|
||||||
And then, there would be another program (in some cases it's another program, in some cases it could be the same TLS Termination Proxy) that would talk to Let's Encrypt, and renew the certificate(s).
|
And then, there would be another program (in some cases it's another program, in some cases it could be the same TLS Termination Proxy) that would talk to Let's Encrypt, and renew the certificate(s).
|
||||||
|
|
||||||
<img src="/img/deployment/https/https.svg">
|
<img src="/img/deployment/https/https.drawio.svg">
|
||||||
|
|
||||||
The **TLS certificates** are **associated with a domain name**, not with an IP address.
|
The **TLS certificates** are **associated with a domain name**, not with an IP address.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,106 +0,0 @@
|
||||||
<mxfile host="65bd71144e">
|
|
||||||
<diagram id="BkDNbdtn8_9fWQybnc8v" name="Page-1">
|
|
||||||
<mxGraphModel dx="741" dy="1167" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1200" math="0" shadow="0">
|
|
||||||
<root>
|
|
||||||
<mxCell id="0"/>
|
|
||||||
<mxCell id="1" parent="0"/>
|
|
||||||
<mxCell id="2" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="420" y="280" width="920" height="670" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="3" value="<font face="Roboto"><span style="font-size: 24px">Server</span></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="755" y="290" width="300" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="6" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="1110" y="410" width="190" height="500" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="7" value="<font style="font-size: 24px" face="Roboto">RAM<br></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="1166.92" y="420" width="76.16" height="30" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="470" y="410" width="250" height="500" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="10" value="<font style="font-size: 24px" face="Roboto">CPU<br></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="554.61" y="420" width="80.77" height="30" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;exitX=0.092;exitY=1.01;exitDx=0;exitDy=0;dashed=1;exitPerimeter=0;" parent="1" source="11" target="12" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="800" y="521"/>
|
|
||||||
<mxPoint x="800" y="560"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;dashed=1;" parent="1" source="11" target="13" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="820" y="525" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="800" y="680"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;endArrow=none;endFill=0;" parent="1" source="11" target="17" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;strokeWidth=3;" parent="1" source="11" target="18" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="11" value="<font face="roboto"><span style="font-size: 24px">Process&nbsp;</span></font><span style="font-family: &#34;roboto&#34; ; font-size: 24px">Manager</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="780" y="420" width="250" height="100" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="25" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;strokeWidth=3;" parent="1" source="12" target="23" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="12" value="<font face="roboto"><span style="font-size: 24px">Worker Process</span></font>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="840" y="540" width="240" height="100" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="26" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;strokeWidth=3;" parent="1" source="13" target="24" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="29" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;strokeWidth=3;" parent="1" source="13" target="22" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="775" y="710"/>
|
|
||||||
<mxPoint x="775" y="688"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="13" value="<font face="roboto"><span style="font-size: 24px">Worker Process</span></font>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="840" y="660" width="240" height="100" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;strokeWidth=3;" parent="1" source="16" target="27" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;strokeWidth=3;" parent="1" source="16" target="30" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="16" value="<font face="roboto"><span style="font-size: 24px">Another Process</span></font>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="780" y="790" width="250" height="100" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="17" value="" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#d5e8d4;strokeColor=#82b366;dashed=1;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="480" y="458" width="230" height="40" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="18" value="" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="1130" y="460" width="150" height="20" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="21" value="" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#fff2cc;strokeColor=#d6b656;dashed=1;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="480" y="508" width="230" height="100" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="22" value="" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#e1d5e7;strokeColor=#9673a6;dashed=1;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="480" y="618" width="230" height="140" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="23" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">1 GB</font>" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="1130" y="490" width="150" height="150" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="24" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">1 GB</font>" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="1130" y="650" width="150" height="150" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="27" value="" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;dashed=1;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="480" y="768" width="230" height="50" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="30" value="" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="1130" y="810" width="150" height="50" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
</root>
|
|
||||||
</mxGraphModel>
|
|
||||||
</diagram>
|
|
||||||
</mxfile>
|
|
||||||
|
|
@ -0,0 +1,297 @@
|
||||||
|
<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="924px" height="674px" viewBox="-0.5 -0.5 924 674" content="<mxfile><diagram id="BkDNbdtn8_9fWQybnc8v" name="Page-1">7VvRkqI4FP0aH8eCAAEfHae792G7qmusqdl9jBCFHSRMiK3u128iQQzElm5B6C2fJJdAwj0nh3tvcGTN1rsnitLwmQQ4HgEj2I2sbyMAgON6/EdY9rnFhC7ILSsaBdJWGubRv1gaDWndRAHOlI6MkJhFqWr0SZJgnyk2RCnZqt2WJFZHTdEK1wxzH8V1688oYKG0ToBRnvgDR6uwGBoY8swaFb2lIQtRQLYnJuthZM0oISw/Wu9mOBbuKxyTX/d45uxxZhQnrMkF0vGvKN7Ih5PzYvviaSnZJAEW/Y2R9XUbRgzPU+SLs1sOMLeFbB3zlskPlyRhc3mtaGeMkl9HL9myxyNaR7FA/ztZEEb4eM8k4T8z4aLjUYaS7EuGabTkl9UfTD7rK6YM705M8kGfMFljRve8izxrF06XvAOebG9LEI8Yhif4QVcakSTO6njv0rX8QHpX72lL42kYM+GjFCWKy+HvjcD/4Kov2YH+U94B2Onu4IniPD9ayd+46C/4nINT9iu8XHFq7T5zTLk3i7vxB8pvqA7CzfmEC3OFLhwMpnIi58CMxIRyS0ISLOYaxXHFhOJolfCmzyHm07C+Cmgjvuym8sQ6CgIxjJaEKk1V3lnneNcFzVzHUWk2qdPMMjQ081pgGbz9ej4BcgSsAGFv6ddQ52eg7+HFslcFME1TlQDbrGNjTjTYOEYL4LhnJUCu3GYS0Nn6/z59vrD4F1QjB2rHzywHNyIhhOMJUHkI6jx04diEdSZaLRBxcleJt+IE97JIcEHoSCSKwQarErOXH3eV6JyEjmOPoXlRJDxj7LrdiIRp12DCAc+DZJNQFpIVSVD8UForDi37/ElIKpH9BzO2l0kd2nCHanA/xQDvIvaXuOHY4KqZt/8WvceGKZvfdnLAQ2MvGwHKwsNUim4vHB7uBkGTQ4e20c3IhvpFjlgkpoiu8DEPzG3CjW9ygOIYsehVTTd1WB4unVKK9icdUhIlLDu584swlNTyDFXfHDnCY9P+0KjwKJ9ByarjozQjmjMMoil8uTk3rE64UQcTVMF31FvkE5VXlShfSzLotUyayTBIg5NgKkpK5RuJWx4jMe9+NMZtm0dN3xfHktZNEbnk/+7f6RcR8fpCpJjN+VDyw0HgxZD0/CVXl7teKPFxxrUHorUI4pJFlqqxplqgejNWvXo2zyhBK6Vq1mj0ykrJQpSKwxDvEF8AvEt6EqxI6zF+AQ1SsmiHi9K5XrmqKZmDvcDWpWQeWFgQ9hoNu14lJdOEwtqUzGwjJQO9BCgDUzZQVzbQeszSWNl0+xYDq6b/JPSX0AWj1Ktr6ur9K8RyuQS+tmgTwAV0+lUIz67EtbZGIezOFALeFaLIYBSFsHuLRnvJDz4BIsOoQbiuuknmmpV96gv9oedV2HBlOvkJtmf/dy8UbPKg09W9UCbQtdCwXigQ3vSF4t3lq9j9UuSrt/KGZd4R0SFSbDX0kAToPnYYmGZPE8LCTy7ag8n6Xc2XNN1l/abuc40KHO/aJW+jBNPpHsU7tsir9RjHqyNjaZCx2wDGGyAwfX5PYlXA0EQqpm6ZgDYCFV2NuVMwGpQhBrpKHKPhKmknhNTVyDpFpkE8P1BkoNkUmTYE7I1vgT8eb3z0syDuKOOp8T7FzZfykHRVE35odfVovIok9p0kw68S1EgCnZuSpPsYdaCK7cKGit2Gm4v7dvkqHQ6FPd1H8frvXd/tWt4s/9yU12nLP4lZD/8B</diagram></mxfile>">
|
||||||
|
<defs/>
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<rect x="2" y="2" width="920" height="670" fill="#ffffff" stroke="#000000" stroke-width="4" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="337" y="12" width="300" height="80" fill="none" stroke="none" pointer-events="all"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 298px; height: 1px; padding-top: 52px; margin-left: 338px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Roboto", "sans-serif"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
Server
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="487" y="56" fill="light-dark(#000000, #ffffff)" font-family=""Roboto", "sans-serif"" font-size="12px" text-anchor="middle">
|
||||||
|
Server
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="692" y="132" width="190" height="500" fill="#dae8fc" stroke="#6c8ebf" stroke-width="4" pointer-events="all" style="fill: light-dark(rgb(218, 232, 252), rgb(29, 41, 59)); stroke: light-dark(rgb(108, 142, 191), rgb(92, 121, 163));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="748.92" y="142" width="76.16" height="30" fill="none" stroke="none" pointer-events="all"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 74px; height: 1px; padding-top: 157px; margin-left: 750px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Roboto Mono", "mono", "sans-serif"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
RAM
|
||||||
|
</font>
|
||||||
|
<br/>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="787" y="161" fill="light-dark(#000000, #ffffff)" font-family=""Roboto Mono", "mono", "sans-serif"" font-size="12px" text-anchor="middle">
|
||||||
|
RAM
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="52" y="132" width="250" height="500" fill="#dae8fc" stroke="#6c8ebf" stroke-width="4" pointer-events="all" style="fill: light-dark(rgb(218, 232, 252), rgb(29, 41, 59)); stroke: light-dark(rgb(108, 142, 191), rgb(92, 121, 163));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="136.61" y="142" width="80.77" height="30" fill="none" stroke="none" pointer-events="all"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 79px; height: 1px; padding-top: 157px; margin-left: 138px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Roboto Mono", "mono", "sans-serif"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
CPU
|
||||||
|
</font>
|
||||||
|
<br/>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="177" y="161" fill="light-dark(#000000, #ffffff)" font-family=""Roboto Mono", "mono", "sans-serif"" font-size="12px" text-anchor="middle">
|
||||||
|
CPU
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 385 243 L 382 243 L 382 282 L 423.9 282" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
<path d="M 430.65 282 L 421.65 286.5 L 423.9 282 L 421.65 277.5 Z" fill="#000000" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 382 242 L 382 402 L 423.9 402" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
<path d="M 430.65 402 L 421.65 406.5 L 423.9 402 L 421.65 397.5 Z" fill="#000000" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 362 192 L 327 192 L 327 200 L 292 200" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 612 192 L 712 192" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 382 142 L 592 142 L 612 192 L 592 242 L 382 242 L 362 192 Z" fill="#d5e8d4" stroke="#82b366" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 248px; height: 1px; padding-top: 192px; margin-left: 363px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Roboto Mono", "mono", "sans-serif"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
<font style="">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
Process
|
||||||
|
</span>
|
||||||
|
</font>
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
Manager
|
||||||
|
</span>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="487" y="196" fill="light-dark(#000000, #ffffff)" font-family=""Roboto Mono", "mono", "sans-serif"" font-size="12px" text-anchor="middle">
|
||||||
|
Process Manager
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 662 312 L 687 312 L 687 287 L 712 287" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 442 262 L 642 262 L 662 312 L 642 362 L 442 362 L 422 312 Z" fill="#fff2cc" stroke="#d6b656" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(255, 242, 204), rgb(40, 29, 0)); stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 238px; height: 1px; padding-top: 312px; margin-left: 423px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Roboto Mono", "mono", "sans-serif"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
Worker Process
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="542" y="316" fill="light-dark(#000000, #ffffff)" font-family=""Roboto Mono", "mono", "sans-serif"" font-size="12px" text-anchor="middle">
|
||||||
|
Worker Process
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 662 432 L 687 432 L 687 447 L 712 447" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 422 432 L 357 432 L 357 410 L 292 410" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 442 382 L 642 382 L 662 432 L 642 482 L 442 482 L 422 432 Z" fill="#e1d5e7" stroke="#9673a6" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(225, 213, 231), rgb(57, 47, 63)); stroke: light-dark(rgb(150, 115, 166), rgb(149, 119, 163));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 238px; height: 1px; padding-top: 432px; margin-left: 423px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Roboto Mono", "mono", "sans-serif"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
Worker Process
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="542" y="436" fill="light-dark(#000000, #ffffff)" font-family=""Roboto Mono", "mono", "sans-serif"" font-size="12px" text-anchor="middle">
|
||||||
|
Worker Process
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 362 562 L 327 562 L 327 515 L 292 515" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 612 562 L 662 562 L 662 557 L 712 557" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 382 512 L 592 512 L 612 562 L 592 612 L 382 612 L 362 562 Z" fill="#ffffff" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 248px; height: 1px; padding-top: 562px; margin-left: 363px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Roboto Mono", "mono", "sans-serif"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
Another Process
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="487" y="566" fill="light-dark(#000000, #ffffff)" font-family=""Roboto Mono", "mono", "sans-serif"" font-size="12px" text-anchor="middle">
|
||||||
|
Another Process
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="62" y="180" width="230" height="40" fill="#d5e8d4" stroke="#82b366" stroke-width="3" stroke-dasharray="9 9" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="712" y="182" width="150" height="20" fill="#d5e8d4" stroke="#82b366" stroke-width="3" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="62" y="230" width="230" height="100" fill="#fff2cc" stroke="#d6b656" stroke-width="3" stroke-dasharray="9 9" pointer-events="all" style="fill: light-dark(rgb(255, 242, 204), rgb(40, 29, 0)); stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="62" y="340" width="230" height="140" fill="#e1d5e7" stroke="#9673a6" stroke-width="3" stroke-dasharray="9 9" pointer-events="all" style="fill: light-dark(rgb(225, 213, 231), rgb(57, 47, 63)); stroke: light-dark(rgb(150, 115, 166), rgb(149, 119, 163));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="712" y="212" width="150" height="150" fill="#fff2cc" stroke="#d6b656" stroke-width="3" pointer-events="all" style="fill: light-dark(rgb(255, 242, 204), rgb(40, 29, 0)); stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 287px; margin-left: 713px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Roboto Mono", "mono", "sans-serif"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px" face="Roboto, sans-serif">
|
||||||
|
1 GB
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="787" y="291" fill="light-dark(#000000, #ffffff)" font-family=""Roboto Mono", "mono", "sans-serif"" font-size="12px" text-anchor="middle">
|
||||||
|
1 GB
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="712" y="372" width="150" height="150" fill="#e1d5e7" stroke="#9673a6" stroke-width="3" pointer-events="all" style="fill: light-dark(rgb(225, 213, 231), rgb(57, 47, 63)); stroke: light-dark(rgb(150, 115, 166), rgb(149, 119, 163));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 447px; margin-left: 713px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Roboto Mono", "mono", "sans-serif"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px" face="Roboto, sans-serif">
|
||||||
|
1 GB
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="787" y="451" fill="light-dark(#000000, #ffffff)" font-family=""Roboto Mono", "mono", "sans-serif"" font-size="12px" text-anchor="middle">
|
||||||
|
1 GB
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="62" y="490" width="230" height="50" fill="#ffffff" stroke="#000000" stroke-width="3" stroke-dasharray="9 9" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="712" y="532" width="150" height="50" fill="#ffffff" stroke="#000000" stroke-width="3" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<switch>
|
||||||
|
<g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>
|
||||||
|
<a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank">
|
||||||
|
<text text-anchor="middle" font-size="10px" x="50%" y="100%">
|
||||||
|
Text is not SVG - cannot display
|
||||||
|
</text>
|
||||||
|
</a>
|
||||||
|
</switch>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
|
@ -1,277 +0,0 @@
|
||||||
<mxfile host="65bd71144e">
|
|
||||||
<diagram id="jyERGzDynktFHFRGN0ph" name="Page-1">
|
|
||||||
<mxGraphModel dx="3321" dy="2867" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1200" math="0" shadow="0">
|
|
||||||
<root>
|
|
||||||
<mxCell id="0"/>
|
|
||||||
<mxCell id="1" parent="0"/>
|
|
||||||
<mxCell id="2" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="450" y="-50" width="820" height="970" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="3" value="<font face="Roboto"><span style="font-size: 24px">Server(s)</span></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="710" y="-50" width="300" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;exitX=0.092;exitY=1.01;exitDx=0;exitDy=0;dashed=1;exitPerimeter=0;" edge="1" parent="1" target="14">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="800" y="521"/>
|
|
||||||
<mxPoint x="800" y="560"/>
|
|
||||||
</Array>
|
|
||||||
<mxPoint x="803" y="521" as="sourcePoint"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;dashed=1;" edge="1" parent="1" target="17">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="800" y="520" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="800" y="680"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="33" value="" style="group" vertex="1" connectable="0" parent="1">
|
|
||||||
<mxGeometry x="-140" y="-75" width="500" height="350" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="29" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">https://someapp.example.com</font>" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;" vertex="1" parent="33">
|
|
||||||
<mxGeometry x="60" y="27" width="380" height="250" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="32" value="" style="pointerEvents=1;shadow=0;dashed=0;html=1;fillColor=#505050;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.laptop;strokeColor=none;" vertex="1" parent="33">
|
|
||||||
<mxGeometry width="500" height="350" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="90" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" edge="1" parent="1" source="101" target="32">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="390" y="-190" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="390" y="-132"/>
|
|
||||||
<mxPoint x="280" y="-132"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="34" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">DNS Servers</font>" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="-60" y="-540" width="330" height="260" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="6" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="495" y="320" width="355" height="440" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="7" value="<font style="font-size: 24px" face="Roboto">TLS Termination Proxy<br></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="525" y="330" width="280" height="40" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="56" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;" edge="1" parent="1" source="55" target="49">
|
|
||||||
<mxGeometry relative="1" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="58" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;dashed=1;startArrow=none;" edge="1" parent="1" source="102" target="57">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="410" y="400" as="targetPoint"/>
|
|
||||||
<mxPoint x="585" y="1050" as="sourcePoint"/>
|
|
||||||
<Array as="points"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="55" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px ; font-weight: normal">Cert Renovation Program</font>" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="515" y="780" width="300" height="100" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="59" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;strokeWidth=3;startArrow=none;" edge="1" parent="1" source="103" target="55">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="875" y="1030" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="790" y="930"/>
|
|
||||||
<mxPoint x="790" y="930"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="57" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">Let's Encrypt</font>" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="500" y="1150" width="330" height="260" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="73" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" edge="1" parent="1" source="85" target="6">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="82" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" edge="1" parent="1" source="62" target="78">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="920" y="770"/>
|
|
||||||
<mxPoint x="920" y="770"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="62" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">FastAPI</font><font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px ; font-weight: normal"> app for: someapp.example.com</font>" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="890" y="650" width="300" height="100" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="65" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px ; font-weight: normal">Another app</font><font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px ; font-weight: normal">: another.example.com</font>" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="890" y="50" width="300" height="100" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="66" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px ; font-weight: normal">One more app</font><font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px ; font-weight: normal">: onemore.example.com</font>" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="890" y="180" width="300" height="100" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="78" value="<font face="Roboto"><span style="font-size: 24px ; font-weight: 400">A Database</span></font>" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="890" y="780" width="300" height="100" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="80" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;strokeWidth=3;endArrow=none;" edge="1" parent="1" source="57" target="103">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="480" y="1090" as="sourcePoint"/>
|
|
||||||
<mxPoint x="875" y="1110" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="915" y="1250"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="81" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;dashed=1;endArrow=none;" edge="1" parent="1" source="55" target="102">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="525" y="970" as="targetPoint"/>
|
|
||||||
<mxPoint x="550" y="880" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="525" y="930"/>
|
|
||||||
<mxPoint x="525" y="930"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="85" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Plain response from: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeColor=#9673a6;strokeWidth=3;fillColor=#e1d5e7;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="890" y="500" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="86" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" edge="1" parent="1" source="62" target="85">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="1030.0000000000005" y="649.9999999999995" as="sourcePoint"/>
|
|
||||||
<mxPoint x="850" y="540.0000000000005" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="1030" y="540"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="87" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" edge="1" parent="1" source="84" target="62">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="1240" y="390"/>
|
|
||||||
<mxPoint x="1240" y="700"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="88" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;dashed=1;" edge="1" parent="1" source="100" target="34">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="65.05882352941171" y="-220" as="sourcePoint"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="89" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;dashed=1;" edge="1" parent="1" source="32" target="100">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="110" y="-75" as="sourcePoint"/>
|
|
||||||
<mxPoint x="-4.941176470588289" y="-139.99999999999955" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-5" y="-80"/>
|
|
||||||
<mxPoint x="-5" y="-80"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="91" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" edge="1" parent="1" source="34" target="101">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="105" y="-280" as="sourcePoint"/>
|
|
||||||
<mxPoint x="390" y="-260" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="390" y="-430"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="109" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" edge="1" parent="1" source="97" target="32">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="340" y="480"/>
|
|
||||||
<mxPoint x="340" y="480"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="36" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">Port 443 (HTTPS)</font>" style="ellipse;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="330" y="680" width="170" height="120" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="92" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" edge="1" parent="1" source="96" target="36">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="50" y="500" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="50" y="740"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="93" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" edge="1" parent="1" source="32" target="96">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="300" y="350" as="sourcePoint"/>
|
|
||||||
<mxPoint x="55" y="330" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="160" y="340"/>
|
|
||||||
<mxPoint x="160" y="340"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="96" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Encrypted request for: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeColor=#82b366;strokeWidth=3;fillColor=#d5e8d4;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="-10" y="400" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="100" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Who is: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="-110" y="-210" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="101" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">IP:</span><br style="font-family: &#34;roboto&#34;"><span style="font-family: &#34;roboto&#34; ; font-size: 24px">123.124.125.126</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="270" y="-290" width="240" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="102" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Renew HTTPS cert for: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="430" y="960" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="103" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">New HTTPS cert for: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="750" y="1070" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="106" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=0;strokeWidth=3;" edge="1" parent="1" source="104" target="36">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-40" y="770"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="104" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">TLS Handshake</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="-110" y="300" width="230" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="107" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" edge="1" parent="1" source="32" target="104">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="-40" y="275" as="sourcePoint"/>
|
|
||||||
<mxPoint x="341.38784067832285" y="770" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-40" y="290"/>
|
|
||||||
<mxPoint x="-40" y="290"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="97" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Encrypted response from: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeColor=#9673a6;strokeWidth=3;fillColor=#e1d5e7;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="90" y="500" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="110" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" edge="1" parent="1" source="36" target="97">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="415" y="680" as="sourcePoint"/>
|
|
||||||
<mxPoint x="110" y="275" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="245" y="710"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="49" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="510" y="400" width="310" height="320" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="50" value="<font style="font-size: 24px" face="Roboto">HTTPS certificates<br></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="550.9" y="410" width="228.21" height="40" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="51" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">someapp.example.com</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="530" y="465" width="270" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="52" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">another.example.net</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#666666;strokeWidth=3;fillColor=#f5f5f5;fontColor=#333333;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="530" y="545" width="270" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="53" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">onemore.example.org</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#666666;strokeWidth=3;fillColor=#f5f5f5;fontColor=#333333;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="530" y="625" width="270" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="42" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">IP:</span><br><span style="font-size: 24px">123.124.125.126</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="290" y="600" width="220" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="84" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Decrypted request for: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeColor=#82b366;strokeWidth=3;fillColor=#d5e8d4;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="885" y="350" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="111" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" edge="1" parent="1" source="6" target="84">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="850" y="390" as="sourcePoint"/>
|
|
||||||
<mxPoint x="1190" y="700" as="targetPoint"/>
|
|
||||||
<Array as="points"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
</root>
|
|
||||||
</mxGraphModel>
|
|
||||||
</diagram>
|
|
||||||
</mxfile>
|
|
||||||
|
After Width: | Height: | Size: 647 KiB |
|
Before Width: | Height: | Size: 40 KiB |
|
|
@ -1,78 +0,0 @@
|
||||||
<mxfile host="65bd71144e">
|
|
||||||
<diagram id="jyERGzDynktFHFRGN0ph" name="Page-1">
|
|
||||||
<mxGraphModel dx="2738" dy="2173" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1200" math="0" shadow="0">
|
|
||||||
<root>
|
|
||||||
<mxCell id="0"/>
|
|
||||||
<mxCell id="1" parent="0"/>
|
|
||||||
<mxCell id="8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;exitX=0.092;exitY=1.01;exitDx=0;exitDy=0;dashed=1;exitPerimeter=0;" parent="1" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="800" y="521"/>
|
|
||||||
<mxPoint x="800" y="560"/>
|
|
||||||
</Array>
|
|
||||||
<mxPoint x="803" y="521" as="sourcePoint"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;dashed=1;" parent="1" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="800" y="520" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="800" y="680"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="33" value="" style="group" parent="1" vertex="1" connectable="0">
|
|
||||||
<mxGeometry x="-140" y="-75" width="500" height="350" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="29" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">https://someapp.example.com</font>" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;" parent="33" vertex="1">
|
|
||||||
<mxGeometry x="60" y="27" width="380" height="250" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="32" value="" style="pointerEvents=1;shadow=0;dashed=0;html=1;fillColor=#505050;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.laptop;strokeColor=none;" parent="33" vertex="1">
|
|
||||||
<mxGeometry width="500" height="350" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="90" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" parent="1" source="101" target="32" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="390" y="-190" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="390" y="-132"/>
|
|
||||||
<mxPoint x="280" y="-132"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="34" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">DNS Servers</font>" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-60" y="-540" width="330" height="260" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="88" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;dashed=1;" parent="1" source="100" target="34" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="65.05882352941171" y="-220" as="sourcePoint"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="89" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;dashed=1;" parent="1" source="32" target="100" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="110" y="-75" as="sourcePoint"/>
|
|
||||||
<mxPoint x="-4.941176470588289" y="-139.99999999999955" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-10" y="-120"/>
|
|
||||||
<mxPoint x="-10" y="-120"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="91" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="34" target="101" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="105" y="-280" as="sourcePoint"/>
|
|
||||||
<mxPoint x="390" y="-260" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="390" y="-430"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="100" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Who is: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-110" y="-210" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="101" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">IP:</span><br style="font-family: &#34;roboto&#34;"><span style="font-family: &#34;roboto&#34; ; font-size: 24px">123.124.125.126</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="270" y="-290" width="240" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
</root>
|
|
||||||
</mxGraphModel>
|
|
||||||
</diagram>
|
|
||||||
</mxfile>
|
|
||||||
|
|
@ -0,0 +1,131 @@
|
||||||
|
<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="652px" height="817px" viewBox="-0.5 -0.5 652 817" content="<mxfile><diagram id="jyERGzDynktFHFRGN0ph" name="Page-1">1VnbkuI2EP0aHnH5jv04MDO7W7VJTYWHTR41trC1EZYjCzD5+kiW5DuDGWBmA0WBWq1Wq/uodSxmzmpbfqEgT38jMcQz24zLmfM4s+2FufD5l5AcpcT1XFdKEopiKbMawRr9C5XQVNIdimHRUWSEYIbyrjAiWQYj1pEBSsmhq7YhuDtrDhI4EKwjgIfSHyhmqZKGttl0fIUoSfXUtql6tkBrK0GRgpgcWiLnaeasKCFM/tqWK4hF+HRg5LjnE721ZxRmbMoAx5Yj9gDv1OqUY+yol5sTlDFIn/bcpoicNXOWtd8mb8SgSGGsGinbYqW0QRivCCa0suN4pnhzOQavEL+QAjFEMt4XQWGfd+whZYjH+XtP4ZUwRrYthQeMEtHBSM6lZMcwyuCqTreYBCiV2jh3ORcr2paJwKVBNhsUQSOGe/5VGBjk0lrBKPkbar8zkvFBy2FcVaiFR7BsiVScv0CyhYweuYrqnVuuSrrC/XzhyfahAZGnkZK28MMjp8CrgJvUxpvU8h8qu+OZDgZ5hTFHtWoSylKSkAzgp0a6pGSXxXVmG53vRESqyvFPyNhRbVGwY6SLABlLvUkcLoElYn8Kg4YZ2qr9l9A2TEs1H0s1YdU49kGm1V4gRTwKIreVwskUiXW+mSAKMWBo393dY7Guhj5QCo4thWp7FC3LL0LQ5D0wu2n31AzPU/V9s5dn6cGp0c7obLW7BdnRCKpRPfjUMZmEqPDXQFQHGB8FgglZNifF/Vo0+cEb6HhPUs3PyGonhwUDlD2Ic7qpv5XsGQm3ZWnIYq0RYVAUKJJCpTKOlJPgkLnRJENTCkATqCuw/TEocsLeEWGF94HRcCK1xFNVyQ7eHnA18Bx3hIn4mAkeQSpPNkDlyP9nJ/jR8g/CiQGZ2SuRQpAV84IfCZumvwNjLRTG5kUFxAeuYLt52R7hJ+L78fc171tDyo/3QrvBVyA9kTrDfYIxZ6CwRTUiTHZ8ectDihhc59L/A2cfYzWtxZTM6nUZhi8gIn4vlZ4mJi0i4jgjRMT2b0FEPomJ3KmoTDt+uhXGHKkw7sdUGN8zTC8IOKe0Q9eyFlYXCvbEY+sdGzwIRzb4Lw8EpXF7FOgjpQ2CGhn3RoFlnXgUOZP2gaG5a1Qw8t1FBSud5OaUCI2w9fJ688jVX32czfvrsfrPvRcOuJ5H6bL8uWi/hlhNhP40tLtjaP8gbm6ZXq/KBdOq3HnaNDgRbwTowUSuc1t81qVmhG8VOcgmc6eKNPXo0/XETdr5kRLhciGnK/j6QJ4bsATbHEMjItuT1KwWy7WcYGyap6XcZCJumpZ561JBSet7Bvs8k9ugEuoLywt3yyUXSf3iVd+MtgmcNULg+rh/D3+rt+1NmXo3cVcj8NtLpXACBlL8SkenuKNXlu0Ylu3yj8c//hn/zj1v/D/Ray/64A2H4LXdO4HXHiOhn/WUmTKWy9r2LCBwQXnrIaFLE85lmVvSrGOYZfdGNap/XeAGwwoVjD1ivuOumzebf0zkWdj88+Q8/Qc=</diagram></mxfile>">
|
||||||
|
<defs/>
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<rect x="0" y="466" width="500" height="350" fill="none" stroke="none" pointer-events="all"/>
|
||||||
|
<path d="M 289.06 793.99 C 293.87 793.99 297.23 791.75 296.28 790.03 L 286.73 773.39 C 285.53 770.86 283.81 770.35 280.97 770.35 L 219.03 770.35 C 216.02 770.35 214.47 770.96 213.01 773.49 L 204.15 789.93 C 202.43 792.57 207.59 793.99 211.29 793.99 Z M 433.76 739.91 L 433.76 496.43 L 65.98 496.43 L 65.98 739.91 Z M 25.89 816 C 16.09 815.9 7.31 812.04 3.61 806.06 C 0 800.17 1.46 794.29 4.56 790.23 L 40.18 747.52 L 40.18 495.12 C 40.18 482.43 49.81 466 65.81 466 L 433.84 466 C 446.32 466 459.57 477.77 459.57 496.74 L 459.57 747.52 L 495.53 790.64 C 498.54 794.7 500 800.07 496.39 805.86 C 491.66 813.16 482.71 815.49 474.28 816 Z" fill="#505050" stroke="none" pointer-events="all" style="fill: light-dark(rgb(80, 80, 80), rgb(168, 168, 168));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 530 331 L 530 409 L 420 409 L 420 455.9" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
<path d="M 420 462.65 L 415.5 453.65 L 420 455.9 L 424.5 453.65 Z" fill="#000000" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 162.5 66 C 96.5 66 80 131 132.8 144 C 80 172.6 139.4 235 182.3 209 C 212 261 311 261 344 209 C 410 209 410 157 368.75 131 C 410 79 344 27 286.25 53 C 245 14 179 14 162.5 66 Z" fill="#ffffff" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 328px; height: 1px; padding-top: 131px; margin-left: 81px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px" face="Roboto, sans-serif">
|
||||||
|
DNS Servers
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="245" y="135" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
DNS Servers
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 185.2 331 L 185.2 296.2 L 245.2 296.2 L 245.06 271.1" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
<path d="M 245.02 264.35 L 249.57 273.33 L 245.06 271.1 L 240.57 273.38 Z" fill="#000000" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 130 466 L 130 421 L 130 411" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 408.04 111 L 530 111 L 530 251" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 50 331 L 320 331 L 340 371 L 320 411 L 50 411 L 30 371 Z" fill="#ffffff" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 308px; height: 1px; padding-top: 371px; margin-left: 31px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
Who is: someapp.example.com
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="185" y="375" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
Who is: someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 430 251 L 630 251 L 650 291 L 630 331 L 430 331 L 410 291 Z" fill="#ffffff" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 238px; height: 1px; padding-top: 291px; margin-left: 411px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
IP:
|
||||||
|
</span>
|
||||||
|
<br style=""/>
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
123.124.125.126
|
||||||
|
</span>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="530" y="295" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
IP:...
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="60" y="493" width="380" height="250" fill="#ffffff" stroke="#000000" stroke-width="4" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 378px; height: 1px; padding-top: 618px; margin-left: 61px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px" face="Roboto, sans-serif">
|
||||||
|
https://someapp.example.com
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="250" y="622" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle" font-weight="bold">
|
||||||
|
https://someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<switch>
|
||||||
|
<g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>
|
||||||
|
<a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank">
|
||||||
|
<text text-anchor="middle" font-size="10px" x="50%" y="100%">
|
||||||
|
Text is not SVG - cannot display
|
||||||
|
</text>
|
||||||
|
</a>
|
||||||
|
</switch>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
|
@ -1,110 +0,0 @@
|
||||||
<mxfile host="65bd71144e">
|
|
||||||
<diagram id="jyERGzDynktFHFRGN0ph" name="Page-1">
|
|
||||||
<mxGraphModel dx="2481" dy="1867" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1200" math="0" shadow="0">
|
|
||||||
<root>
|
|
||||||
<mxCell id="0"/>
|
|
||||||
<mxCell id="1" parent="0"/>
|
|
||||||
<mxCell id="2" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="450" y="-50" width="820" height="970" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="3" value="<font face="Roboto"><span style="font-size: 24px">Server(s)</span></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="710" y="-50" width="300" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;exitX=0.092;exitY=1.01;exitDx=0;exitDy=0;dashed=1;exitPerimeter=0;" parent="1" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="800" y="521"/>
|
|
||||||
<mxPoint x="800" y="560"/>
|
|
||||||
</Array>
|
|
||||||
<mxPoint x="803" y="521" as="sourcePoint"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;dashed=1;" parent="1" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="800" y="520" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="800" y="680"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="33" value="" style="group" parent="1" vertex="1" connectable="0">
|
|
||||||
<mxGeometry x="-140" y="-75" width="500" height="350" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="29" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">https://someapp.example.com</font>" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;" parent="33" vertex="1">
|
|
||||||
<mxGeometry x="60" y="27" width="380" height="250" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="32" value="" style="pointerEvents=1;shadow=0;dashed=0;html=1;fillColor=#505050;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.laptop;strokeColor=none;" parent="33" vertex="1">
|
|
||||||
<mxGeometry width="500" height="350" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="90" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" parent="1" source="101" target="32" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="390" y="-190" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="390" y="-132"/>
|
|
||||||
<mxPoint x="280" y="-132"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="34" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">DNS Servers</font>" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-60" y="-540" width="330" height="260" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="88" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;dashed=1;" parent="1" source="100" target="34" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="65.05882352941171" y="-220" as="sourcePoint"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="89" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;dashed=1;" parent="1" source="32" target="100" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="110" y="-75" as="sourcePoint"/>
|
|
||||||
<mxPoint x="-4.941176470588289" y="-139.99999999999955" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-5" y="-90"/>
|
|
||||||
<mxPoint x="-5" y="-90"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="91" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="34" target="101" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="105" y="-280" as="sourcePoint"/>
|
|
||||||
<mxPoint x="390" y="-260" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="390" y="-430"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="36" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">Port 443 (HTTPS)</font>" style="ellipse;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="330" y="680" width="170" height="120" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="42" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">IP:</span><br><span style="font-size: 24px">123.124.125.126</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="290" y="600" width="220" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="100" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Who is: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-110" y="-210" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="101" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">IP:</span><br style="font-family: &#34;roboto&#34;"><span style="font-family: &#34;roboto&#34; ; font-size: 24px">123.124.125.126</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="270" y="-290" width="240" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="106" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=0;strokeWidth=3;" parent="1" source="104" target="36" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-40" y="770"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="104" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">TLS Handshake</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-110" y="300" width="230" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="107" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="32" target="104" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="-40" y="275" as="sourcePoint"/>
|
|
||||||
<mxPoint x="341.38784067832285" y="770" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-40" y="290"/>
|
|
||||||
<mxPoint x="-40" y="290"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
</root>
|
|
||||||
</mxGraphModel>
|
|
||||||
</diagram>
|
|
||||||
</mxfile>
|
|
||||||
|
|
@ -0,0 +1,245 @@
|
||||||
|
<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1413px" height="1464px" viewBox="-0.5 -0.5 1413 1464" content="<mxfile><diagram id="jyERGzDynktFHFRGN0ph" name="Page-1">7Vpbj6s2EP41kU4fgriFkMfd7OZspT1V1Kx02kcvOMQ9BlNwdpP++tpgEzDOnVxO1axWgfH4wsznmc9Des44Xn3NQLr4RkKIe7YZrnrOU8+2B57psC8uWZcSZ+CPSkmUobCUWRvBDP0DhdAU0iUKYd5QpIRgitKmMCBJAgPakIEsI59NtTnBzVlTEMGWYBYA3JZ+RyFdCOnINjcNLxBFCzm1bYqWGEhtIcgXICSfNZHz3HPGGSG0vIpXY4i5+aRhyn6TLa3VyjKY0EM6OHbZ4wPgpXg6sTC6lo+bEpRQmD1/sDG55aye81it22Q3IcgXMBQ3CxpjoTRHGI8JJlkxjjMw+R+TY/AO8ZTkiCKSsLYA8vFZwwfMKGJ2flUU3gmlJK4pPGAU8QZKUiYlS4pRAseVu/kkQKhUg7Mlp/yJ4lXEcWmQ+RwF0AjhB/vKDQzScrScZuQHlOtOSMI6PbbtKkzNVwRXNZGw81dIYkizNVMRrX3LFU4XuO8PB+X95wZEA4mURQ0/zHICvAK4UTX4xrXsQnhX7+kDHJ2RZRJWjvxcIApnKQh46yczmeJcktCZ6GtVZpP7we3GZu5AMZm8r5nMtzUmGw07MJmjMZmHKX/YFCQN23l/L/mWLazSz4uI9cAUbDddFZaQ7ewqEt9Y6vMQVFp5o/c7YZgnPXvMZwFJ3s9hhubtcWYwY9b8kv8iB2TPVI7ZnIeJyzVLseJ65g/a9K92G9R3tBC19pm6R2MUhnwaLaCakGtiyBH2mYAYYQ4AaRTzG0mEbWJ+5TxO3tbF3o66gd3Q2g87R7dT/Q5Q57ecA0OWfsQtyeiCRCQB+HkjVcy40XklPKQV/vwLUroWuRQsKdF5u255uEL0Dz6gYY5scf8n1zZMS9w+rcSExc1azQZSbcqgy6zAwVEobHUQf86d7skgBhR9NNOwztZF14csA+uaQpHH8trIUy7YeN03m14fiBkmh+p7puLncgXbejva2arl5mSZBVD0UuBT2eQgRI3uA1ENYFwLBAd42TzI7ueiyfN3oOMUp5q38GrDhzkFGX3ghHqTDgrZBPFll6EhCaVGgEGeo6AUChU9UraCo/SNEJmS+4MsgpIq2ddBkTNSMoQ1ugyM2hOJR9wWlaoctKXD2cBz3K206HQ2cyCVavGfp99mrK1kQflWDqTuE4zZURHWzgQBJstwP+dtcqIe5wD8cxyGjzgxeCoNcTU8xNHwENvrgojciIlcKKgcln6aEcbURBj3OhHGGxjmwPfZ4c8euZY1tJpQsA9MWydscFmN2XVUvD8gCI3uUSBTSh0EFTIujQJLPYnImsEet7cG6rtGASPPHRawkk7eZImRMap9Bso85dOfnc76g+a0I3P3qneqn8+hZEi+LdLPIVUHwv4wpLs6pF+Jl1um4uvWYfpQqLcoUysbdgTm1kSu0y0+He+OqNaUIZs1ui47t5pfXt7eprPtVaetjOu+GFZFnpRDWp1gWUMNwbLU9HsKwXJ1NdmGe0NAQb/0ThY0XLaglL/teOCTlcbPjYiQCEOQotwISMzEQc5UJnO1fnapYmRn1dFfp4XCltJlKX7POp/Wsh3Dsl32P2D/3p4FbKm0tte1b3McVXa/8gaxlRDnme0NYusK8F3U3yuWdc8V+O8LXpFG5V5k6TRmGzA14ArEKYblPjyrMi+PqAs2ZMTfhj2mtXqqkFYlVns/guZoBeVL1SPJwjEvu1TiWr29rZ9dLQ1yuqihV6yl08x5oyinmeKCqzozCP4n0FtFrwq8I03Ycy8GXu+nP4UcmZCaVRfNMUQy4Ru/Iuorr/CHw24Jf/Xs95zx3l55zfUFJCHb3T/g//mtAKiOGOlKs91EiKEGJj95yDincKEt0V2pUKvGBPvUEp3jWobjD33X9Ia+w5DSLIgMVUrdVUlOXf++mtxu/bNjoK0rP9+q6NE8Zh/D7s855F3lt1V99UWh67cJuq+JYPYJP0djt5sfNZag2Pw41Hn+Fw==</diagram></mxfile>">
|
||||||
|
<defs/>
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<rect x="0" y="466" width="500" height="350" fill="none" stroke="none" pointer-events="all"/>
|
||||||
|
<path d="M 289.06 793.99 C 293.87 793.99 297.23 791.75 296.28 790.03 L 286.73 773.39 C 285.53 770.86 283.81 770.35 280.97 770.35 L 219.03 770.35 C 216.02 770.35 214.47 770.96 213.01 773.49 L 204.15 789.93 C 202.43 792.57 207.59 793.99 211.29 793.99 Z M 433.76 739.91 L 433.76 496.43 L 65.98 496.43 L 65.98 739.91 Z M 25.89 816 C 16.09 815.9 7.31 812.04 3.61 806.06 C 0 800.17 1.46 794.29 4.56 790.23 L 40.18 747.52 L 40.18 495.12 C 40.18 482.43 49.81 466 65.81 466 L 433.84 466 C 446.32 466 459.57 477.77 459.57 496.74 L 459.57 747.52 L 495.53 790.64 C 498.54 794.7 500 800.07 496.39 805.86 C 491.66 813.16 482.71 815.49 474.28 816 Z" fill="#505050" stroke="none" pointer-events="all" style="fill: light-dark(rgb(80, 80, 80), rgb(168, 168, 168));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="590" y="491" width="820" height="970" fill="#ffffff" stroke="#000000" stroke-width="4" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="850" y="491" width="300" height="80" fill="none" stroke="none" pointer-events="all"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 298px; height: 1px; padding-top: 531px; margin-left: 851px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Roboto Mono", "mono"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
Server(s)
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="1000" y="535" fill="light-dark(#000000, #ffffff)" font-family=""Roboto Mono", "mono"" font-size="12px" text-anchor="middle">
|
||||||
|
Server(s)
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 529.86 331 L 529.86 408.86 L 419.86 408.86 L 419.86 455.9" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
<path d="M 419.86 462.65 L 415.36 453.65 L 419.86 455.9 L 424.36 453.65 Z" fill="#000000" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 162.5 66 C 96.5 66 80 131 132.8 144 C 80 172.6 139.4 235 182.3 209 C 212 261 311 261 344 209 C 410 209 410 157 368.75 131 C 410 79 344 27 286.25 53 C 245 14 179 14 162.5 66 Z" fill="#ffffff" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 328px; height: 1px; padding-top: 131px; margin-left: 81px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px" face="Roboto, sans-serif">
|
||||||
|
DNS Servers
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="245" y="135" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
DNS Servers
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 185 331 L 185 296 L 245 296 L 245 271.1" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
<path d="M 245 264.35 L 249.5 273.35 L 245 271.1 L 240.5 273.35 Z" fill="#000000" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 135 466 L 135 450.86 L 135 411" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 408.01 110.86 L 529.86 110.86 L 529.86 251" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<ellipse cx="555" cy="1281" rx="85" ry="60.00000000000001" fill="#ffffff" stroke="#000000" stroke-width="3" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 168px; height: 1px; padding-top: 1281px; margin-left: 471px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px" face="Roboto, sans-serif">
|
||||||
|
Port 443 (HTTPS)
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="555" y="1285" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
Port 443 (HTTPS)
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="430" y="1141" width="220" height="70" fill="#ffffff" stroke="#000000" stroke-width="3" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 218px; height: 1px; padding-top: 1176px; margin-left: 431px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font data-font-src="https://fonts.googleapis.com/css?family=Roboto">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
IP:
|
||||||
|
</span>
|
||||||
|
<br/>
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
123.124.125.126
|
||||||
|
</span>
|
||||||
|
</font>
|
||||||
|
<br/>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="540" y="1180" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
IP:...
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 50 331 L 320 331 L 340 371 L 320 411 L 50 411 L 30 371 Z" fill="#ffffff" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 308px; height: 1px; padding-top: 371px; margin-left: 31px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
Who is: someapp.example.com
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="185" y="375" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
Who is: someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 430 251 L 630 251 L 650 291 L 630 331 L 430 331 L 410 291 Z" fill="#ffffff" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 238px; height: 1px; padding-top: 291px; margin-left: 411px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
IP:
|
||||||
|
</span>
|
||||||
|
<br style=""/>
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
123.124.125.126
|
||||||
|
</span>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="530" y="295" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
IP:...
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 100.14 921 L 100.14 1310.86 L 481.27 1310.86" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 50 841 L 240 841 L 260 881 L 240 921 L 50 921 L 30 881 Z" fill="#ffffff" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 228px; height: 1px; padding-top: 881px; margin-left: 31px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
TLS Handshake
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="145" y="885" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
TLS Handshake
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 100.14 816 L 100.14 830.86 L 100.14 841" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="60" y="493" width="380" height="250" fill="#ffffff" stroke="#000000" stroke-width="4" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 378px; height: 1px; padding-top: 618px; margin-left: 61px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px" face="Roboto, sans-serif">
|
||||||
|
https://someapp.example.com
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="250" y="622" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle" font-weight="bold">
|
||||||
|
https://someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<switch>
|
||||||
|
<g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>
|
||||||
|
<a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank">
|
||||||
|
<text text-anchor="middle" font-size="10px" x="50%" y="100%">
|
||||||
|
Text is not SVG - cannot display
|
||||||
|
</text>
|
||||||
|
</a>
|
||||||
|
</switch>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
|
@ -1,131 +0,0 @@
|
||||||
<mxfile host="65bd71144e">
|
|
||||||
<diagram id="jyERGzDynktFHFRGN0ph" name="Page-1">
|
|
||||||
<mxGraphModel dx="2481" dy="1867" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1200" math="0" shadow="0">
|
|
||||||
<root>
|
|
||||||
<mxCell id="0"/>
|
|
||||||
<mxCell id="1" parent="0"/>
|
|
||||||
<mxCell id="2" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="450" y="-50" width="820" height="970" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="3" value="<font face="Roboto"><span style="font-size: 24px">Server(s)</span></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="710" y="-50" width="300" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;exitX=0.092;exitY=1.01;exitDx=0;exitDy=0;dashed=1;exitPerimeter=0;" parent="1" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="800" y="521"/>
|
|
||||||
<mxPoint x="800" y="560"/>
|
|
||||||
</Array>
|
|
||||||
<mxPoint x="803" y="521" as="sourcePoint"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;dashed=1;" parent="1" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="800" y="520" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="800" y="680"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="33" value="" style="group" parent="1" vertex="1" connectable="0">
|
|
||||||
<mxGeometry x="-140" y="-75" width="500" height="350" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="29" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">https://someapp.example.com</font>" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;" parent="33" vertex="1">
|
|
||||||
<mxGeometry x="60" y="27" width="380" height="250" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="32" value="" style="pointerEvents=1;shadow=0;dashed=0;html=1;fillColor=#505050;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.laptop;strokeColor=none;" parent="33" vertex="1">
|
|
||||||
<mxGeometry width="500" height="350" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="90" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" parent="1" source="101" target="32" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="390" y="-190" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="390" y="-132"/>
|
|
||||||
<mxPoint x="280" y="-132"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="34" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">DNS Servers</font>" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-60" y="-540" width="330" height="260" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="6" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="495" y="320" width="355" height="440" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="7" value="<font style="font-size: 24px" face="Roboto">TLS Termination Proxy<br></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="525" y="330" width="280" height="40" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="88" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;dashed=1;" parent="1" source="100" target="34" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="65.05882352941171" y="-220" as="sourcePoint"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="89" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;dashed=1;" parent="1" source="32" target="100" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="110" y="-75" as="sourcePoint"/>
|
|
||||||
<mxPoint x="-4.941176470588289" y="-139.99999999999955" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-5" y="-90"/>
|
|
||||||
<mxPoint x="-5" y="-90"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="91" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="34" target="101" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="105" y="-280" as="sourcePoint"/>
|
|
||||||
<mxPoint x="390" y="-260" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="390" y="-430"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="36" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">Port 443 (HTTPS)</font>" style="ellipse;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="330" y="680" width="170" height="120" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="100" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Who is: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-110" y="-210" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="101" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">IP:</span><br style="font-family: &#34;roboto&#34;"><span style="font-family: &#34;roboto&#34; ; font-size: 24px">123.124.125.126</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="270" y="-290" width="240" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="106" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=0;strokeWidth=3;" parent="1" source="104" target="36" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-40" y="770"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="104" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">TLS Handshake</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-110" y="300" width="230" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="107" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="32" target="104" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="-40" y="275" as="sourcePoint"/>
|
|
||||||
<mxPoint x="341.38784067832285" y="770" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-40" y="290"/>
|
|
||||||
<mxPoint x="-40" y="290"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="49" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="510" y="400" width="310" height="320" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="50" value="<font style="font-size: 24px" face="Roboto">HTTPS certificates<br></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="550.9" y="410" width="228.21" height="40" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="51" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">someapp.example.com</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="530" y="465" width="270" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="52" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">another.example.net</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#666666;strokeWidth=3;fillColor=#f5f5f5;fontColor=#333333;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="530" y="545" width="270" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="53" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">onemore.example.org</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#666666;strokeWidth=3;fillColor=#f5f5f5;fontColor=#333333;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="530" y="625" width="270" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="42" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">IP:</span><br><span style="font-size: 24px">123.124.125.126</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="290" y="600" width="220" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
</root>
|
|
||||||
</mxGraphModel>
|
|
||||||
</diagram>
|
|
||||||
</mxfile>
|
|
||||||
|
After Width: | Height: | Size: 1.2 MiB |
|
Before Width: | Height: | Size: 21 KiB |
|
|
@ -1,152 +0,0 @@
|
||||||
<mxfile host="65bd71144e">
|
|
||||||
<diagram id="jyERGzDynktFHFRGN0ph" name="Page-1">
|
|
||||||
<mxGraphModel dx="2312" dy="1667" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1200" math="0" shadow="0">
|
|
||||||
<root>
|
|
||||||
<mxCell id="0"/>
|
|
||||||
<mxCell id="1" parent="0"/>
|
|
||||||
<mxCell id="2" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="450" y="-50" width="820" height="970" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="3" value="<font face="Roboto"><span style="font-size: 24px">Server(s)</span></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="710" y="-50" width="300" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;exitX=0.092;exitY=1.01;exitDx=0;exitDy=0;dashed=1;exitPerimeter=0;" parent="1" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="800" y="521"/>
|
|
||||||
<mxPoint x="800" y="560"/>
|
|
||||||
</Array>
|
|
||||||
<mxPoint x="803" y="521" as="sourcePoint"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;dashed=1;" parent="1" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="800" y="520" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="800" y="680"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="33" value="" style="group" parent="1" vertex="1" connectable="0">
|
|
||||||
<mxGeometry x="-140" y="-75" width="500" height="350" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="29" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">https://someapp.example.com</font>" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;" parent="33" vertex="1">
|
|
||||||
<mxGeometry x="60" y="27" width="380" height="250" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="32" value="" style="pointerEvents=1;shadow=0;dashed=0;html=1;fillColor=#505050;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.laptop;strokeColor=none;" parent="33" vertex="1">
|
|
||||||
<mxGeometry width="500" height="350" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="90" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" parent="1" source="101" target="32" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="390" y="-190" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="390" y="-132"/>
|
|
||||||
<mxPoint x="280" y="-132"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="34" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">DNS Servers</font>" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-60" y="-540" width="330" height="260" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="6" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="495" y="320" width="355" height="440" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="7" value="<font style="font-size: 24px" face="Roboto">TLS Termination Proxy<br></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="525" y="330" width="280" height="40" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="88" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;dashed=1;" parent="1" source="100" target="34" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="65.05882352941171" y="-220" as="sourcePoint"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="89" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;dashed=1;" parent="1" source="32" target="100" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="110" y="-75" as="sourcePoint"/>
|
|
||||||
<mxPoint x="-4.941176470588289" y="-139.99999999999955" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-5" y="-90"/>
|
|
||||||
<mxPoint x="-5" y="-90"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="91" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="34" target="101" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="105" y="-280" as="sourcePoint"/>
|
|
||||||
<mxPoint x="390" y="-260" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="390" y="-430"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="36" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">Port 443 (HTTPS)</font>" style="ellipse;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="330" y="680" width="170" height="120" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="92" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" parent="1" source="96" target="36" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="50" y="500" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="50" y="740"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="93" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="32" target="96" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="300" y="350" as="sourcePoint"/>
|
|
||||||
<mxPoint x="55" y="330" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="160" y="340"/>
|
|
||||||
<mxPoint x="160" y="340"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="96" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Encrypted request for: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeColor=#82b366;strokeWidth=3;fillColor=#d5e8d4;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-10" y="400" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="100" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Who is: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-110" y="-210" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="101" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">IP:</span><br style="font-family: &#34;roboto&#34;"><span style="font-family: &#34;roboto&#34; ; font-size: 24px">123.124.125.126</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="270" y="-290" width="240" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="106" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=0;strokeWidth=3;" parent="1" source="104" target="36" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-40" y="770"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="104" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">TLS Handshake</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-110" y="300" width="230" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="107" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="32" target="104" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="-40" y="275" as="sourcePoint"/>
|
|
||||||
<mxPoint x="341.38784067832285" y="770" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-40" y="290"/>
|
|
||||||
<mxPoint x="-40" y="290"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="49" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="510" y="400" width="310" height="320" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="50" value="<font style="font-size: 24px" face="Roboto">HTTPS certificates<br></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="550.9" y="410" width="228.21" height="40" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="51" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">someapp.example.com</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="530" y="465" width="270" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="52" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">another.example.net</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#666666;strokeWidth=3;fillColor=#f5f5f5;fontColor=#333333;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="530" y="545" width="270" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="53" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">onemore.example.org</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#666666;strokeWidth=3;fillColor=#f5f5f5;fontColor=#333333;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="530" y="625" width="270" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="42" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">IP:</span><br><span style="font-size: 24px">123.124.125.126</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="290" y="600" width="220" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
</root>
|
|
||||||
</mxGraphModel>
|
|
||||||
</diagram>
|
|
||||||
</mxfile>
|
|
||||||
|
|
@ -0,0 +1,419 @@
|
||||||
|
<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1413px" height="1464px" viewBox="-0.5 -0.5 1413 1464" content="<mxfile><diagram id="jyERGzDynktFHFRGN0ph" name="Page-1">7Vxfc6M2EP80nrk+2AMSYHhMcvFdZ66dTJOZax8VkG16gDiQE7ufvhIIDELYxJYdu40zic1qkcTuT/tPckbwLl5/yVC6/I0EOBoBI1iP4OcRALZjQPbGKZuSAm3XKymLLAxKmrklPIb/YEE0BHUVBjhvMVJCIhqmbaJPkgT7tEVDWUZe22xzErVHTdECdwiPPoq61O9hQJeC6gFj2/AVh4tlNTQwREuMKm5ByJcoIK8NErwfwbuMEFp+itd3OOLiqwRT3jfraa1nluGEDrkBgvKOFxStxNOJidFN9bgpCROKs/sX1ieXnDmCt/W8DXYRoHyJA3GxpHEkmOZhFN2RiGRFP9A2+A+jR+gZRw8kD2lIEtbmY94/a3jBGQ2ZnL9JDM+EUhI3GG6icMEbKEkZlaxoFCb4rlY3HwQJlrpzNuWUP1G8XnBcTsh8Hvp4EuAX9pZPIpSWveU0Iz9wNe+EJOym265chaj5jPC6QRJy/oJJjGm2YSyidWxaQukC9+OpXV6/bkFkV0hZNvDDJCfAK4C7qDvfqpZ9ENpVa3qAojOySoJaka/LkOLHFPm89ZWJTFIuSeijuNesxVatB0uPzCxbEll13RCZCxQi86YaRAYVInMiyh82RUlLds7PFV+yhVTGeWGxbhgDsNJ1IYmqnX1aiPeo4ucmqJTylu8PwjBPRuCOj4KSfJzjLJx3+3nEGZPmp/yXqkP2TGWf7XEYuZxzRZZUz/RB2/pVLoPmihakzjqT12gcBgEfRgmoNuTaGIJCPjMUhxEHQCUU4zeSCNnE/BO8nT1tirW90AO7qbkfdlC1Ul0NqHM7ysEBcz/ikmR0SRYkQdH9liqJccvzjXCTVujzb0zpRvhStKJEpe2m5PE6pH/yDieGB8T1X5x7Ypji8vNaDFhcbGRvULE9MOgyKXBwFAy9CuLPuVM9GY4QDV/ablgl6+LWmyxDmwZD4cfyRs8PnLDVumu0tW6LEWZD+R1D0nM5g767oXK0ero5WWU+FndJ8KllMghR3mUgqgWMc4FggJaNQXI/Fk2OuwMdhyjVeA+ttnSYU5TRGx5Qb91BQZuFfNqlaUiCisOPUJ6HfkkULGqk9IKj1I0gGVXsj7IFrkIlcB4UQU/yEKZ3Ghh1BxKP2GeVah/Uc8PRwINWb1h0eDQzMJTqxD+ff39kbWUUlPfGQPI6iSKWKuJGTuBHZBXsj3nbMdGIxwD89TYMvyFjcOQwxFLEIVARhwBHQyDiKPR82oxBShgDhN25r5K747v4ea4px/DslpQhUAjZtrtCtiwNQp7uW0wHLgxdCcbTN77AnnAWhwkq0nFgPGRkvdmTcDxnihRk56r8SEGaqLSBhErYRWVt6luo1JGCvFMOcqJwYljg2Y4tDEVsYZ0ntnDsiWG7LjM6wLNMc2q2nQAYGLAe4NqrOuwuk395QBAc+lFQBZNNENTIODUKTLkGUVUL96i909HYmhQwcqxpAatKydv40Jt4jZctjVM+/dGB7Lhtz8aesXvWO9mPz54qg/y+SD8mnRoI+2FIt1RIP1NGbhqSrjtltKFQ7yRLnThYE5g7A1lQLz6hKvh+ryTrgSGbNVoWZH8/fX16enjsrzf35lqXlVvV8ZRUnmnGV+ZUEV+Zsvs9JMDyrs7aaC7eeI4ivnLOY2+kPaV6y01z5UYaZmpp9mCq3anrwpRWD6aI1bwzAQpKpd7Ofu1Q/2X35HyavZcp1ZWgtTsW28N/PJT7nd3FbLTeJ362SSmDOofLzxXOi+64s7opoBhjlKYTvEZxGuGJT+Ijd2Sr0uSSdbngpyBu08Y+mqDWW2tgQPktXOPqMI3S4brgGTqOugYiFeZs7AaatvjHUp5jGYrym6lwxDr2Wuts7pKh933JC05hfuVI010c7yTI9fmw8yBHlUHqUbg2BP76UDD0wGBbqFUMccJZmQBOTGCxX5v9Onvmty/BuE70gqkMXq8L3rqWqx+8ztXHim/MDNvVXUW540TZx5vLZNIhwelUb6xVP/sle7xy0+krSgK2un/gD//WyjKaFkK1+avHQqg2Jq/cZGhOL+uldOr8UrYJ4NCtAGiZE+hOXctwpi5kSGnnm1P50Kyu0r88/321/938R9tAa8A212lPNsznc+ArTzYEzrNjO3pMiH1oagV11Djt/tTqMo42FIVsxuPz0wLz0EcU9x8h+jjVoAWRtjFpbz9aiqSNGaZJ1bfuow323rQtQBSNSyBmfgtYS0rTMgufCbXnkwUhi4gl5GFeZuIzP2css7ks2pNlU7pWg4a6wqFr5E229sz7RLa0T2Q53S/tANU+kY4voNjgA6xKsKKE0CXOarAmmF4HWJ3ipbbIUohg8x8hqwa9fJ0G3LZ1TnD3f73q/w1u5v5jkuEa3CRbfID7eHA74Izgti7Mcl9dSfqyas7/xcgGSGeYHFV9SfXdWh3rA6hS8Pc639RecG8JhE9bNNCg5LH8bSDL7ZYAVMfIwQHfOWeX2/9cUNZltv8BAt7/Cw==</diagram></mxfile>">
|
||||||
|
<defs/>
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<rect x="0" y="466" width="500" height="350" fill="none" stroke="none" pointer-events="all"/>
|
||||||
|
<path d="M 289.06 793.99 C 293.87 793.99 297.23 791.75 296.28 790.03 L 286.73 773.39 C 285.53 770.86 283.81 770.35 280.97 770.35 L 219.03 770.35 C 216.02 770.35 214.47 770.96 213.01 773.49 L 204.15 789.93 C 202.43 792.57 207.59 793.99 211.29 793.99 Z M 433.76 739.91 L 433.76 496.43 L 65.98 496.43 L 65.98 739.91 Z M 25.89 816 C 16.09 815.9 7.31 812.04 3.61 806.06 C 0 800.17 1.46 794.29 4.56 790.23 L 40.18 747.52 L 40.18 495.12 C 40.18 482.43 49.81 466 65.81 466 L 433.84 466 C 446.32 466 459.57 477.77 459.57 496.74 L 459.57 747.52 L 495.53 790.64 C 498.54 794.7 500 800.07 496.39 805.86 C 491.66 813.16 482.71 815.49 474.28 816 Z" fill="#505050" stroke="none" pointer-events="all" style="fill: light-dark(rgb(80, 80, 80), rgb(168, 168, 168));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="590" y="491" width="820" height="970" fill="#ffffff" stroke="#000000" stroke-width="4" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="850" y="491" width="300" height="80" fill="none" stroke="none" pointer-events="all"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 298px; height: 1px; padding-top: 531px; margin-left: 851px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Roboto Mono", "mono"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
Server(s)
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="1000" y="535" fill="light-dark(#000000, #ffffff)" font-family=""Roboto Mono", "mono"" font-size="12px" text-anchor="middle">
|
||||||
|
Server(s)
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 529.86 331 L 529.86 408.86 L 419.86 408.86 L 419.86 455.9" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
<path d="M 419.86 462.65 L 415.36 453.65 L 419.86 455.9 L 424.36 453.65 Z" fill="#000000" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 162.5 66 C 96.5 66 80 131 132.8 144 C 80 172.6 139.4 235 182.3 209 C 212 261 311 261 344 209 C 410 209 410 157 368.75 131 C 410 79 344 27 286.25 53 C 245 14 179 14 162.5 66 Z" fill="#ffffff" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 328px; height: 1px; padding-top: 131px; margin-left: 81px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px" face="Roboto, sans-serif">
|
||||||
|
DNS Servers
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="245" y="135" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
DNS Servers
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="635" y="861" width="355" height="440" fill="#dae8fc" stroke="#6c8ebf" stroke-width="4" pointer-events="all" style="fill: light-dark(rgb(218, 232, 252), rgb(29, 41, 59)); stroke: light-dark(rgb(108, 142, 191), rgb(92, 121, 163));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="665" y="871" width="280" height="40" fill="none" stroke="none" pointer-events="all"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 278px; height: 1px; padding-top: 891px; margin-left: 666px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Roboto Mono", "mono"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
TLS Termination Proxy
|
||||||
|
</font>
|
||||||
|
<br/>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="805" y="895" fill="light-dark(#000000, #ffffff)" font-family=""Roboto Mono", "mono"" font-size="12px" text-anchor="middle">
|
||||||
|
TLS Termination Proxy
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 185 331 L 185 296 L 245 296 L 245 271.1" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
<path d="M 245 264.35 L 249.5 273.35 L 245 271.1 L 240.5 273.35 Z" fill="#000000" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 135 466 L 135 450.86 L 135 411" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 408.01 110.86 L 529.86 110.86 L 529.86 251" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<ellipse cx="555" cy="1281" rx="85" ry="60.00000000000001" fill="#ffffff" stroke="#000000" stroke-width="3" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 168px; height: 1px; padding-top: 1281px; margin-left: 471px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px" face="Roboto, sans-serif">
|
||||||
|
Port 443 (HTTPS)
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="555" y="1285" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
Port 443 (HTTPS)
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 190.14 1021 L 190.14 1280.86 L 459.9 1280.86" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
<path d="M 466.65 1280.86 L 457.65 1285.36 L 459.9 1280.86 L 457.65 1276.36 Z" fill="#000000" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 300.14 816 L 300.14 880.86 L 300.14 941" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 150 941 L 420 941 L 440 981 L 420 1021 L 150 1021 L 130 981 Z" fill="#d5e8d4" stroke="#82b366" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 308px; height: 1px; padding-top: 981px; margin-left: 131px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
Encrypted request for: someapp.example.com
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="285" y="985" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
Encrypted request for: someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 50 331 L 320 331 L 340 371 L 320 411 L 50 411 L 30 371 Z" fill="#ffffff" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 308px; height: 1px; padding-top: 371px; margin-left: 31px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
Who is: someapp.example.com
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="185" y="375" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
Who is: someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 430 251 L 630 251 L 650 291 L 630 331 L 430 331 L 410 291 Z" fill="#ffffff" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 238px; height: 1px; padding-top: 291px; margin-left: 411px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
IP:
|
||||||
|
</span>
|
||||||
|
<br style=""/>
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
123.124.125.126
|
||||||
|
</span>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="530" y="295" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
IP:...
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 100.14 921 L 100.14 1310.86 L 481.27 1310.86" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 50 841 L 240 841 L 260 881 L 240 921 L 50 921 L 30 881 Z" fill="#ffffff" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 228px; height: 1px; padding-top: 881px; margin-left: 31px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
TLS Handshake
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="145" y="885" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
TLS Handshake
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 100.14 816 L 100.14 830.86 L 100.14 841" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="650" y="941" width="310" height="320" fill="#fff2cc" stroke="#d6b656" stroke-width="4" pointer-events="all" style="fill: light-dark(rgb(255, 242, 204), rgb(40, 29, 0)); stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="690.9" y="951" width="228.21" height="40" fill="none" stroke="none" pointer-events="all"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 226px; height: 1px; padding-top: 971px; margin-left: 692px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Roboto Mono", "mono"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
HTTPS certificates
|
||||||
|
</font>
|
||||||
|
<br/>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="805" y="975" fill="light-dark(#000000, #ffffff)" font-family=""Roboto Mono", "mono"" font-size="12px" text-anchor="middle">
|
||||||
|
HTTPS certificates
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="670" y="1006" width="270" height="70" fill="#ffffff" stroke="#000000" stroke-width="3" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 268px; height: 1px; padding-top: 1041px; margin-left: 671px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font data-font-src="https://fonts.googleapis.com/css?family=Roboto">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
someapp.example.com
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
<br/>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="805" y="1045" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="670" y="1086" width="270" height="70" fill="#f5f5f5" stroke="#666666" stroke-width="3" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 268px; height: 1px; padding-top: 1121px; margin-left: 671px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #333333; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#333333, #c1c1c1); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font data-font-src="https://fonts.googleapis.com/css?family=Roboto">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
another.example.net
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
<br/>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="805" y="1125" fill="#333333" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
another.example.net
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="670" y="1166" width="270" height="70" fill="#f5f5f5" stroke="#666666" stroke-width="3" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 268px; height: 1px; padding-top: 1201px; margin-left: 671px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #333333; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#333333, #c1c1c1); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font data-font-src="https://fonts.googleapis.com/css?family=Roboto">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
onemore.example.org
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
<br/>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="805" y="1205" fill="#333333" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
onemore.example.org
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="430" y="1141" width="220" height="70" fill="#ffffff" stroke="#000000" stroke-width="3" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 218px; height: 1px; padding-top: 1176px; margin-left: 431px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font data-font-src="https://fonts.googleapis.com/css?family=Roboto">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
IP:
|
||||||
|
</span>
|
||||||
|
<br/>
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
123.124.125.126
|
||||||
|
</span>
|
||||||
|
</font>
|
||||||
|
<br/>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="540" y="1180" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
IP:...
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="60" y="493" width="380" height="250" fill="#ffffff" stroke="#000000" stroke-width="4" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 378px; height: 1px; padding-top: 618px; margin-left: 61px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px" face="Roboto, sans-serif">
|
||||||
|
https://someapp.example.com
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="250" y="622" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle" font-weight="bold">
|
||||||
|
https://someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<switch>
|
||||||
|
<g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>
|
||||||
|
<a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank">
|
||||||
|
<text text-anchor="middle" font-size="10px" x="50%" y="100%">
|
||||||
|
Text is not SVG - cannot display
|
||||||
|
</text>
|
||||||
|
</a>
|
||||||
|
</switch>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
|
@ -1,166 +0,0 @@
|
||||||
<mxfile host="65bd71144e">
|
|
||||||
<diagram id="jyERGzDynktFHFRGN0ph" name="Page-1">
|
|
||||||
<mxGraphModel dx="5190" dy="5090" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1200" math="0" shadow="0">
|
|
||||||
<root>
|
|
||||||
<mxCell id="0"/>
|
|
||||||
<mxCell id="1" parent="0"/>
|
|
||||||
<mxCell id="2" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="450" y="-50" width="820" height="970" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="3" value="<font face="Roboto"><span style="font-size: 24px">Server(s)</span></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="710" y="-50" width="300" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;exitX=0.092;exitY=1.01;exitDx=0;exitDy=0;dashed=1;exitPerimeter=0;" parent="1" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="800" y="521"/>
|
|
||||||
<mxPoint x="800" y="560"/>
|
|
||||||
</Array>
|
|
||||||
<mxPoint x="803" y="521" as="sourcePoint"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;dashed=1;" parent="1" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="800" y="520" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="800" y="680"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="33" value="" style="group" parent="1" vertex="1" connectable="0">
|
|
||||||
<mxGeometry x="-140" y="-75" width="500" height="350" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="29" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">https://someapp.example.com</font>" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;" parent="33" vertex="1">
|
|
||||||
<mxGeometry x="60" y="27" width="380" height="250" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="32" value="" style="pointerEvents=1;shadow=0;dashed=0;html=1;fillColor=#505050;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.laptop;strokeColor=none;" parent="33" vertex="1">
|
|
||||||
<mxGeometry width="500" height="350" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="90" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" parent="1" source="101" target="32" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="390" y="-190" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="390" y="-132"/>
|
|
||||||
<mxPoint x="280" y="-132"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="34" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">DNS Servers</font>" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-60" y="-540" width="330" height="260" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="6" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="495" y="320" width="355" height="440" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="7" value="<font style="font-size: 24px" face="Roboto">TLS Termination Proxy<br></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="525" y="330" width="280" height="40" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="62" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">FastAPI</font><font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px ; font-weight: normal"> app for: someapp.example.com</font>" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="895" y="640" width="300" height="100" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="87" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" parent="1" source="6" target="62" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="1240" y="390"/>
|
|
||||||
<mxPoint x="1240" y="700"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="84" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Decrypted request for: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeColor=#82b366;strokeWidth=3;fillColor=#d5e8d4;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="890" y="350" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="88" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;dashed=1;" parent="1" source="100" target="34" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="65.05882352941171" y="-220" as="sourcePoint"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="89" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;dashed=1;" parent="1" source="32" target="100" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="110" y="-75" as="sourcePoint"/>
|
|
||||||
<mxPoint x="-4.941176470588289" y="-139.99999999999955" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-5" y="-80"/>
|
|
||||||
<mxPoint x="-5" y="-80"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="91" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="34" target="101" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="105" y="-280" as="sourcePoint"/>
|
|
||||||
<mxPoint x="390" y="-260" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="390" y="-430"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="36" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">Port 443 (HTTPS)</font>" style="ellipse;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="330" y="680" width="170" height="120" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="92" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" parent="1" source="96" target="36" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="50" y="500" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="50" y="740"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="93" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="32" target="96" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="300" y="350" as="sourcePoint"/>
|
|
||||||
<mxPoint x="55" y="330" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="160" y="340"/>
|
|
||||||
<mxPoint x="160" y="340"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="96" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Encrypted request for: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeColor=#82b366;strokeWidth=3;fillColor=#d5e8d4;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-10" y="400" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="100" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Who is: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-110" y="-210" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="101" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">IP:</span><br style="font-family: &#34;roboto&#34;"><span style="font-family: &#34;roboto&#34; ; font-size: 24px">123.124.125.126</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="270" y="-290" width="240" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="106" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=0;strokeWidth=3;" parent="1" source="104" target="36" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-40" y="770"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="104" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">TLS Handshake</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-110" y="300" width="230" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="107" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="32" target="104" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="-40" y="275" as="sourcePoint"/>
|
|
||||||
<mxPoint x="341.38784067832285" y="770" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-40" y="290"/>
|
|
||||||
<mxPoint x="-40" y="290"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="49" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="510" y="400" width="310" height="320" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="50" value="<font style="font-size: 24px" face="Roboto">HTTPS certificates<br></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="550.9" y="410" width="228.21" height="40" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="51" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">someapp.example.com</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="530" y="465" width="270" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="52" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">another.example.net</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#666666;strokeWidth=3;fillColor=#f5f5f5;fontColor=#333333;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="530" y="545" width="270" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="53" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">onemore.example.org</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#666666;strokeWidth=3;fillColor=#f5f5f5;fontColor=#333333;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="530" y="625" width="270" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="42" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">IP:</span><br><span style="font-size: 24px">123.124.125.126</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="290" y="600" width="220" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
</root>
|
|
||||||
</mxGraphModel>
|
|
||||||
</diagram>
|
|
||||||
</mxfile>
|
|
||||||
|
After Width: | Height: | Size: 624 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
|
@ -1,183 +0,0 @@
|
||||||
<mxfile host="65bd71144e">
|
|
||||||
<diagram id="jyERGzDynktFHFRGN0ph" name="Page-1">
|
|
||||||
<mxGraphModel dx="3321" dy="2867" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1200" math="0" shadow="0">
|
|
||||||
<root>
|
|
||||||
<mxCell id="0"/>
|
|
||||||
<mxCell id="1" parent="0"/>
|
|
||||||
<mxCell id="2" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="450" y="-50" width="820" height="970" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="3" value="<font face="Roboto"><span style="font-size: 24px">Server(s)</span></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="710" y="-50" width="300" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;exitX=0.092;exitY=1.01;exitDx=0;exitDy=0;dashed=1;exitPerimeter=0;" parent="1" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="800" y="521"/>
|
|
||||||
<mxPoint x="800" y="560"/>
|
|
||||||
</Array>
|
|
||||||
<mxPoint x="803" y="521" as="sourcePoint"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;dashed=1;" parent="1" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="800" y="520" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="800" y="680"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="33" value="" style="group" parent="1" vertex="1" connectable="0">
|
|
||||||
<mxGeometry x="-140" y="-75" width="500" height="350" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="29" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">https://someapp.example.com</font>" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;" parent="33" vertex="1">
|
|
||||||
<mxGeometry x="60" y="27" width="380" height="250" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="32" value="" style="pointerEvents=1;shadow=0;dashed=0;html=1;fillColor=#505050;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.laptop;strokeColor=none;" parent="33" vertex="1">
|
|
||||||
<mxGeometry width="500" height="350" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="90" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" parent="1" source="101" target="32" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="390" y="-190" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="390" y="-132"/>
|
|
||||||
<mxPoint x="280" y="-132"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="34" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">DNS Servers</font>" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-60" y="-540" width="330" height="260" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="6" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="495" y="320" width="355" height="440" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="7" value="<font style="font-size: 24px" face="Roboto">TLS Termination Proxy<br></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="525" y="330" width="280" height="40" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="73" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" parent="1" source="85" target="6" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="62" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">FastAPI</font><font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px ; font-weight: normal"> app for: someapp.example.com</font>" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="895" y="650" width="300" height="100" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="85" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Plain response from: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeColor=#9673a6;strokeWidth=3;fillColor=#e1d5e7;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="890" y="500" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="86" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="62" target="85" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="1030.0000000000005" y="649.9999999999995" as="sourcePoint"/>
|
|
||||||
<mxPoint x="850" y="540.0000000000005" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="1030" y="540"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="87" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" parent="1" source="6" target="62" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="1240" y="390"/>
|
|
||||||
<mxPoint x="1240" y="700"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="84" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Decrypted request for: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeColor=#82b366;strokeWidth=3;fillColor=#d5e8d4;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="890" y="350" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="88" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;dashed=1;" parent="1" source="100" target="34" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="65.05882352941171" y="-220" as="sourcePoint"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="89" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;dashed=1;" parent="1" source="32" target="100" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="110" y="-75" as="sourcePoint"/>
|
|
||||||
<mxPoint x="-4.941176470588289" y="-139.99999999999955" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-5" y="-90"/>
|
|
||||||
<mxPoint x="-5" y="-90"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="91" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="34" target="101" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="105" y="-280" as="sourcePoint"/>
|
|
||||||
<mxPoint x="390" y="-260" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="390" y="-430"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="36" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">Port 443 (HTTPS)</font>" style="ellipse;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="330" y="680" width="170" height="120" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="92" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" parent="1" source="96" target="36" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="50" y="500" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="50" y="740"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="93" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="32" target="96" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="300" y="350" as="sourcePoint"/>
|
|
||||||
<mxPoint x="55" y="330" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="160" y="340"/>
|
|
||||||
<mxPoint x="160" y="340"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="96" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Encrypted request for: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeColor=#82b366;strokeWidth=3;fillColor=#d5e8d4;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-10" y="400" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="100" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Who is: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-110" y="-210" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="101" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">IP:</span><br style="font-family: &#34;roboto&#34;"><span style="font-family: &#34;roboto&#34; ; font-size: 24px">123.124.125.126</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="270" y="-290" width="240" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="106" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=0;strokeWidth=3;" parent="1" source="104" target="36" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-40" y="770"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="104" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">TLS Handshake</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-110" y="300" width="230" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="107" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="32" target="104" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="-40" y="275" as="sourcePoint"/>
|
|
||||||
<mxPoint x="341.38784067832285" y="770" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-40" y="290"/>
|
|
||||||
<mxPoint x="-40" y="290"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="49" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="510" y="400" width="310" height="320" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="50" value="<font style="font-size: 24px" face="Roboto">HTTPS certificates<br></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="550.9" y="410" width="228.21" height="40" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="51" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">someapp.example.com</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="530" y="465" width="270" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="52" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">another.example.net</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#666666;strokeWidth=3;fillColor=#f5f5f5;fontColor=#333333;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="530" y="545" width="270" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="53" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">onemore.example.org</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#666666;strokeWidth=3;fillColor=#f5f5f5;fontColor=#333333;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="530" y="625" width="270" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="42" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">IP:</span><br><span style="font-size: 24px">123.124.125.126</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="290" y="600" width="220" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
</root>
|
|
||||||
</mxGraphModel>
|
|
||||||
</diagram>
|
|
||||||
</mxfile>
|
|
||||||
|
After Width: | Height: | Size: 627 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
|
@ -1,203 +0,0 @@
|
||||||
<mxfile host="65bd71144e">
|
|
||||||
<diagram id="jyERGzDynktFHFRGN0ph" name="Page-1">
|
|
||||||
<mxGraphModel dx="3321" dy="2867" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1200" math="0" shadow="0">
|
|
||||||
<root>
|
|
||||||
<mxCell id="0"/>
|
|
||||||
<mxCell id="1" parent="0"/>
|
|
||||||
<mxCell id="2" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="450" y="-50" width="820" height="970" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="3" value="<font face="Roboto"><span style="font-size: 24px">Server(s)</span></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="710" y="-50" width="300" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;exitX=0.092;exitY=1.01;exitDx=0;exitDy=0;dashed=1;exitPerimeter=0;" parent="1" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="800" y="521"/>
|
|
||||||
<mxPoint x="800" y="560"/>
|
|
||||||
</Array>
|
|
||||||
<mxPoint x="803" y="521" as="sourcePoint"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;dashed=1;" parent="1" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="800" y="520" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="800" y="680"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="33" value="" style="group" parent="1" vertex="1" connectable="0">
|
|
||||||
<mxGeometry x="-140" y="-75" width="500" height="350" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="29" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">https://someapp.example.com</font>" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;" parent="33" vertex="1">
|
|
||||||
<mxGeometry x="60" y="27" width="380" height="250" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="32" value="" style="pointerEvents=1;shadow=0;dashed=0;html=1;fillColor=#505050;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.laptop;strokeColor=none;" parent="33" vertex="1">
|
|
||||||
<mxGeometry width="500" height="350" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="90" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" parent="1" source="101" target="32" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="390" y="-190" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="390" y="-132"/>
|
|
||||||
<mxPoint x="280" y="-132"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="34" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">DNS Servers</font>" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-60" y="-540" width="330" height="260" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="6" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="495" y="320" width="355" height="440" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="7" value="<font style="font-size: 24px" face="Roboto">TLS Termination Proxy<br></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="525" y="330" width="280" height="40" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="73" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" parent="1" source="85" target="6" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="62" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">FastAPI</font><font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px ; font-weight: normal"> app for: someapp.example.com</font>" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="895" y="650" width="300" height="100" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="85" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Plain response from: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeColor=#9673a6;strokeWidth=3;fillColor=#e1d5e7;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="890" y="500" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="86" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="62" target="85" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="1030.0000000000005" y="649.9999999999995" as="sourcePoint"/>
|
|
||||||
<mxPoint x="850" y="540.0000000000005" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="1030" y="540"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="87" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" parent="1" source="6" target="62" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="1240" y="390"/>
|
|
||||||
<mxPoint x="1240" y="700"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="84" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Decrypted request for: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeColor=#82b366;strokeWidth=3;fillColor=#d5e8d4;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="890" y="350" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="88" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;dashed=1;" parent="1" source="100" target="34" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="65.05882352941171" y="-220" as="sourcePoint"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="89" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;dashed=1;" parent="1" source="32" target="100" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="110" y="-75" as="sourcePoint"/>
|
|
||||||
<mxPoint x="-4.941176470588289" y="-139.99999999999955" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-5" y="-90"/>
|
|
||||||
<mxPoint x="-5" y="-90"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="91" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="34" target="101" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="105" y="-280" as="sourcePoint"/>
|
|
||||||
<mxPoint x="390" y="-260" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="390" y="-430"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="109" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" parent="1" source="97" target="32" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="340" y="480"/>
|
|
||||||
<mxPoint x="340" y="480"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="36" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">Port 443 (HTTPS)</font>" style="ellipse;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="330" y="680" width="170" height="120" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="92" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" parent="1" source="96" target="36" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="50" y="500" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="50" y="740"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="93" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="32" target="96" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="300" y="350" as="sourcePoint"/>
|
|
||||||
<mxPoint x="55" y="330" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="160" y="340"/>
|
|
||||||
<mxPoint x="160" y="340"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="96" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Encrypted request for: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeColor=#82b366;strokeWidth=3;fillColor=#d5e8d4;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-10" y="400" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="100" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Who is: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-110" y="-210" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="101" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">IP:</span><br style="font-family: &#34;roboto&#34;"><span style="font-family: &#34;roboto&#34; ; font-size: 24px">123.124.125.126</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="270" y="-290" width="240" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="106" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=0;strokeWidth=3;" parent="1" source="104" target="36" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-40" y="770"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="104" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">TLS Handshake</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-110" y="300" width="230" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="107" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="32" target="104" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="-40" y="275" as="sourcePoint"/>
|
|
||||||
<mxPoint x="341.38784067832285" y="770" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-40" y="290"/>
|
|
||||||
<mxPoint x="-40" y="290"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="97" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Encrypted response from: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeColor=#9673a6;strokeWidth=3;fillColor=#e1d5e7;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="90" y="500" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="110" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="36" target="97" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="415" y="680" as="sourcePoint"/>
|
|
||||||
<mxPoint x="110" y="275" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="245" y="710"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="49" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="510" y="400" width="310" height="320" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="50" value="<font style="font-size: 24px" face="Roboto">HTTPS certificates<br></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="550.9" y="410" width="228.21" height="40" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="51" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">someapp.example.com</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="530" y="465" width="270" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="52" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">another.example.net</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#666666;strokeWidth=3;fillColor=#f5f5f5;fontColor=#333333;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="530" y="545" width="270" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="53" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">onemore.example.org</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#666666;strokeWidth=3;fillColor=#f5f5f5;fontColor=#333333;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="530" y="625" width="270" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="42" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">IP:</span><br><span style="font-size: 24px">123.124.125.126</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="290" y="600" width="220" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
</root>
|
|
||||||
</mxGraphModel>
|
|
||||||
</diagram>
|
|
||||||
</mxfile>
|
|
||||||
|
|
@ -0,0 +1,540 @@
|
||||||
|
<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1413px" height="1464px" viewBox="-0.5 -0.5 1413 1464" content="<mxfile><diagram id="jyERGzDynktFHFRGN0ph" name="Page-1">7VxZk6M2EP41rto82AWI83HO3a3apFyZqdrkUQOyTRYjFuQZO78+EggMQvgUPjb21MyYppFE96fuVrdgAB7my88pTGa/4wBFA0MLlgPwODAMy9YA/ccoq4ICLNcrKNM0DAqavia8hP8iTtQ4dREGKGswEowjEiZNoo/jGPmkQYNpij+abBMcNXtN4BS1CC8+jNrU72FAZpzqGdr6xBcUTmdl14bGz8xhyc0J2QwG+KNGAk8D8JBiTIpv8+UDipj4SsEU1z13nK1GlqKY7HIBMIor3mG04HfHB0ZW5e0mOIwJSp/eaZtMcvoA3Ffj1uhBALMZCvjBjMwjzjQJo+gBRzjN2wGWxn4oPYJvKBrjLCQhjuk5H7H26Yl3lJKQyvmbwPCGCcHzGsNdFE7ZCYITSsULEoUxeqjUzTqBnKVqnA45YXc0X04ZLkd4Mgl9NArQO/2XjSKYFK1lJMU/UDnuGMf0ovu2XLmo2YjQskbicv6M8ByRdEVZ+NmhbnKlc9wPHas4/liDyCqRMqvhh0qOg5cDd1o1vlYt/cK1K9f0DopO8SIOKkV+zEKCXhLos7MfVGSCcnFMXvi1eiW2cj6YamRmWoLIyuOayFxDIjLPUSAyIBGZHRF2swmMG7Kzfy7YlM2lMsxyi3VHGQwzWeaSKM/Tb1P+Pyr5mQkqpLzm+xNTzOOB8cB6gXE2zFAaTtrtvKCUSvNT9lvZIL2nos1mP5RcjLkkC6qn+iBN/UqnQX1Gc1JrnolzdB4GAetGCqgm5JoYAlw+z3AeRgwApVC033HMZTNn38D98+sqn9tTNbBz9O2wA7KZ6ipAndtSDgqo++GHOCUzPMUxjJ7WVEGMa55vmJm0XJ//IEJW3JfCBcEybdclj5Yh+Ys1ONI8gx//zbhHms4PH5e8w/xgJXqDkm1MoUulwMCRM3QqiN3nRvWkKIIkfG+6YZms80vv0hSuagy5H8tqLY8ZYa11V2tq3eI9PO/Kb2uCnosRdF0NpL1Vw83wIvURv0qATyWTnRDlXQaiGsA4FQh20LK2k9yPRZPtbkDHIUrVzqHVhg4zAlNyxwLqtTvIac8hG3ZhGuKg5PAjmGWhXxA5ixwpneAodMNJWhn7w3SKylDJOA2KgCd4CN3rB0btjvgtdlmlygd1XHA08IDZGRYdHs3sGEq14p/HP17ouSIKyjpjIHGeRBFdKqLamsCP8CLYHvM2Y6IBiwHYZz8M77FisMUwxJTEIUAShxi2gkDElui53xWDsGAMIHInvkzutu+it4miNYZnNaQMDImQLastZNNUIGRn22Q6cGKoWmC8fmMT7BWl8zCG+XLc0MYpXq62LDjeUskSZOOsvC1B6qi0DAGVoI3KytQ3UKkClOA8EeM5wwnXakcTdi/BRHcIcESMb8vyO2pMgNBOAAkcFjYo9RsNzghhGdg7dh/FZM9GU4ynEYJJmI18PKdkP6MszxNxQu0dCsiyKs8wI3fjr1tM0+Xdh5af+OCzmJ2KcTqHUUfqSINJkl+UFswZBQoljdASzpMIFQPclg7aaIt/Bb/uCn7d3jWJo2sqsjhW53y8mOThOIJhnJuvLMExDYhpWynLsx8Mqo05xjLYntEmpyyvf5/UMkOcWiWLjB2AFy5RWR6Shuee7QBoy716E5JIDyzkqAKekGHQJMDT+8oe7hC1X54v5xxKHHnpCeuOvJyNfacFdA1oI632EUyQ6Y282sdqtt+RMminloSqCF0Wyjotmy0EcXQmgt2b2K2AzOMSC65zBUhVHHXakqCznxTW3uo2hHJlmYnqQmXrAkdTjI/uxNPFuNRH5KerhFBAMv38XKCMHB2pXZhTdY03YO/kVKlLdQNFlWDRqQJZNNebUz1TTa4ny7RbIaaZa9fahqpMBPftVG1rpFmuS1VueKauO3oDCENjxwLOIRbH+4WDqf1RUBZX6iCokNF7aCXW5J0Do6ehOcphZJtODqtSyet6iRCk9RNODZuh4XCLd93Mfnw1sTTI50X6MeVFlWuI0rQ1kX6iCrUurBqGLR+2K9RbxcNWXUgRmFsdmUAtPnXtLJsYLqjc7TkSD3wZSwUgBP6mu9mWbeE/vkIty4Gcq0I9prCjJ00T0L+fvry+jl+6N+uJCK8K1ZdVmAZCJqDc21IPxnVHEozrYqx2SDTuXZ1rUm0KJFkD0E+tqjV3xdSTmCtXtO1F6MZRnGryZFt7rwtTSsMdSWDvnQhQQOtY2O8b7FgdBXPVaVBhUw4wNzu7LfzHQ7nb2V1MVuwpvmXFesmKDYVFsXnKUlO19L9k6H2fsd06YXblSFO9s7CVTakerjsNcmTpBrW7VY5G4NdxztABg/UuN0kXPY5KN8BIN0z6a9Ffe8v4ti0wrhO9hiOC12uDt6pGqQevffWx4p4rw2YpQJIb62n1sXdOVaxAOqqzUFdQgix27H6BcUBn9w9082+NVUbdQsh2zquxELJd3VduMhQvL6up1Pf6UrQJxqF1I2DqI+A6rqnZjgvWe4oEW6O8TiSOf1uhaDP/8evN7icWLsYENtebt82NCjc3nnNvY2XUb3a1EXU10nbOacyqqQtbGw+tUYqeumWfFdlRwxTsta7WLpo77BXpd1v9ZDIxfOm2+sB+sy1bjQGwDk05ARW1H0tmAS7pebm8wEd5fPYI2iT0IUHdz6XeHpVTgkhLGzX38JiSZBZ1QaOybdXPy1lb01l9P2ykOMukajYoiLMOnSN72doT188toX5u2u03QRmy+rmKtxpZxg2sUrDCGJMZSiuwxohcB1jt/LPLSmBisR8uqxq9+PQDbss8Jbi739n1/wY3df9znKIK3Did3sB9PLht44TgNi/Mcl9dqe6yanG/YmQj5odsWd5d9sJGFfPDkC3Bz7Xvsznh9gmE+00aKFDyUHzFlOm2UwCyd5MYB7zIlB6uX4db5GXWrxUGT/8B</diagram></mxfile>">
|
||||||
|
<defs/>
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<rect x="0" y="466" width="500" height="350" fill="none" stroke="none" pointer-events="all"/>
|
||||||
|
<path d="M 289.06 793.99 C 293.87 793.99 297.23 791.75 296.28 790.03 L 286.73 773.39 C 285.53 770.86 283.81 770.35 280.97 770.35 L 219.03 770.35 C 216.02 770.35 214.47 770.96 213.01 773.49 L 204.15 789.93 C 202.43 792.57 207.59 793.99 211.29 793.99 Z M 433.76 739.91 L 433.76 496.43 L 65.98 496.43 L 65.98 739.91 Z M 25.89 816 C 16.09 815.9 7.31 812.04 3.61 806.06 C 0 800.17 1.46 794.29 4.56 790.23 L 40.18 747.52 L 40.18 495.12 C 40.18 482.43 49.81 466 65.81 466 L 433.84 466 C 446.32 466 459.57 477.77 459.57 496.74 L 459.57 747.52 L 495.53 790.64 C 498.54 794.7 500 800.07 496.39 805.86 C 491.66 813.16 482.71 815.49 474.28 816 Z" fill="#505050" stroke="none" pointer-events="all" style="fill: light-dark(rgb(80, 80, 80), rgb(168, 168, 168));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="590" y="491" width="820" height="970" fill="#ffffff" stroke="#000000" stroke-width="4" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="850" y="491" width="300" height="80" fill="none" stroke="none" pointer-events="all"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 298px; height: 1px; padding-top: 531px; margin-left: 851px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Roboto Mono", "mono"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
Server(s)
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="1000" y="535" fill="light-dark(#000000, #ffffff)" font-family=""Roboto Mono", "mono"" font-size="12px" text-anchor="middle">
|
||||||
|
Server(s)
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 529.86 331 L 529.86 408.86 L 419.86 408.86 L 419.86 455.9" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
<path d="M 419.86 462.65 L 415.36 453.65 L 419.86 455.9 L 424.36 453.65 Z" fill="#000000" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 162.5 66 C 96.5 66 80 131 132.8 144 C 80 172.6 139.4 235 182.3 209 C 212 261 311 261 344 209 C 410 209 410 157 368.75 131 C 410 79 344 27 286.25 53 C 245 14 179 14 162.5 66 Z" fill="#ffffff" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 328px; height: 1px; padding-top: 131px; margin-left: 81px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px" face="Roboto, sans-serif">
|
||||||
|
DNS Servers
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="245" y="135" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
DNS Servers
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="635" y="861" width="355" height="440" fill="#dae8fc" stroke="#6c8ebf" stroke-width="4" pointer-events="all" style="fill: light-dark(rgb(218, 232, 252), rgb(29, 41, 59)); stroke: light-dark(rgb(108, 142, 191), rgb(92, 121, 163));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="665" y="871" width="280" height="40" fill="none" stroke="none" pointer-events="all"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 278px; height: 1px; padding-top: 891px; margin-left: 666px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Roboto Mono", "mono"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
TLS Termination Proxy
|
||||||
|
</font>
|
||||||
|
<br/>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="805" y="895" fill="light-dark(#000000, #ffffff)" font-family=""Roboto Mono", "mono"" font-size="12px" text-anchor="middle">
|
||||||
|
TLS Termination Proxy
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 1030 1081 L 1000.1 1081" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
<path d="M 993.35 1081 L 1002.35 1076.5 L 1000.1 1081 L 1002.35 1085.5 Z" fill="#000000" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="1035" y="1191" width="300" height="100" fill="#dae8fc" stroke="#6c8ebf" stroke-width="4" pointer-events="all" style="fill: light-dark(rgb(218, 232, 252), rgb(29, 41, 59)); stroke: light-dark(rgb(108, 142, 191), rgb(92, 121, 163));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 298px; height: 1px; padding-top: 1241px; margin-left: 1036px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
<font style="font-size: 24px;" data-font-src="https://fonts.googleapis.com/css?family=Roboto">
|
||||||
|
FastAPI
|
||||||
|
</font>
|
||||||
|
<font style="font-size: 24px; font-weight: normal;" data-font-src="https://fonts.googleapis.com/css?family=Roboto">
|
||||||
|
app for: someapp.example.com
|
||||||
|
</font>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="1185" y="1245" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle" font-weight="bold">
|
||||||
|
FastAPI app for: someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 1050 1041 L 1320 1041 L 1340 1081 L 1320 1121 L 1050 1121 L 1030 1081 Z" fill="#e1d5e7" stroke="#9673a6" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(225, 213, 231), rgb(57, 47, 63)); stroke: light-dark(rgb(150, 115, 166), rgb(149, 119, 163));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 308px; height: 1px; padding-top: 1081px; margin-left: 1031px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
Plain response from: someapp.example.com
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="1185" y="1085" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
Plain response from: someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 1185 1191 L 1185 1121" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 990 930.86 L 1379.86 930.86 L 1379.86 1240.86 L 1345.1 1240.86" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
<path d="M 1338.35 1240.86 L 1347.35 1236.36 L 1345.1 1240.86 L 1347.35 1245.36 Z" fill="#000000" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 1050 891 L 1320 891 L 1340 931 L 1320 971 L 1050 971 L 1030 931 Z" fill="#d5e8d4" stroke="#82b366" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 308px; height: 1px; padding-top: 931px; margin-left: 1031px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
Decrypted request for: someapp.example.com
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="1185" y="935" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
Decrypted request for: someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 185 331 L 185 296 L 245 296 L 245 271.1" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
<path d="M 245 264.35 L 249.5 273.35 L 245 271.1 L 240.5 273.35 Z" fill="#000000" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 135 466 L 135 450.86 L 135 411" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 408.01 110.86 L 529.86 110.86 L 529.86 251" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 479.86 1041 L 479.86 1020.86 L 479.86 826.1" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
<path d="M 479.86 819.35 L 484.36 828.35 L 479.86 826.1 L 475.36 828.35 Z" fill="#000000" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<ellipse cx="555" cy="1281" rx="85" ry="60.00000000000001" fill="#ffffff" stroke="#000000" stroke-width="3" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 168px; height: 1px; padding-top: 1281px; margin-left: 471px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px" face="Roboto, sans-serif">
|
||||||
|
Port 443 (HTTPS)
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="555" y="1285" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
Port 443 (HTTPS)
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 190.14 1021 L 190.14 1280.86 L 459.9 1280.86" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
<path d="M 466.65 1280.86 L 457.65 1285.36 L 459.9 1280.86 L 457.65 1276.36 Z" fill="#000000" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 300.14 816 L 300.14 880.86 L 300.14 941" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 150 941 L 420 941 L 440 981 L 420 1021 L 150 1021 L 130 981 Z" fill="#d5e8d4" stroke="#82b366" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 308px; height: 1px; padding-top: 981px; margin-left: 131px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
Encrypted request for: someapp.example.com
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="285" y="985" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
Encrypted request for: someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 50 331 L 320 331 L 340 371 L 320 411 L 50 411 L 30 371 Z" fill="#ffffff" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 308px; height: 1px; padding-top: 371px; margin-left: 31px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
Who is: someapp.example.com
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="185" y="375" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
Who is: someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 430 251 L 630 251 L 650 291 L 630 331 L 430 331 L 410 291 Z" fill="#ffffff" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 238px; height: 1px; padding-top: 291px; margin-left: 411px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
IP:
|
||||||
|
</span>
|
||||||
|
<br style=""/>
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
123.124.125.126
|
||||||
|
</span>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="530" y="295" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
IP:...
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 100.14 921 L 100.14 1310.86 L 481.27 1310.86" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 50 841 L 240 841 L 260 881 L 240 921 L 50 921 L 30 881 Z" fill="#ffffff" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 228px; height: 1px; padding-top: 881px; margin-left: 31px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
TLS Handshake
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="145" y="885" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
TLS Handshake
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 100.14 816 L 100.14 830.86 L 100.14 841" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 250 1041 L 520 1041 L 540 1081 L 520 1121 L 250 1121 L 230 1081 Z" fill="#e1d5e7" stroke="#9673a6" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(225, 213, 231), rgb(57, 47, 63)); stroke: light-dark(rgb(150, 115, 166), rgb(149, 119, 163));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 308px; height: 1px; padding-top: 1081px; margin-left: 231px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
Encrypted response from: someapp.example.com
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="385" y="1085" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
Encrypted response from: someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 481.51 1250.86 L 385 1250.86 L 385 1121" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="650" y="941" width="310" height="320" fill="#fff2cc" stroke="#d6b656" stroke-width="4" pointer-events="all" style="fill: light-dark(rgb(255, 242, 204), rgb(40, 29, 0)); stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="690.9" y="951" width="228.21" height="40" fill="none" stroke="none" pointer-events="all"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 226px; height: 1px; padding-top: 971px; margin-left: 692px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Roboto Mono", "mono"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
HTTPS certificates
|
||||||
|
</font>
|
||||||
|
<br/>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="805" y="975" fill="light-dark(#000000, #ffffff)" font-family=""Roboto Mono", "mono"" font-size="12px" text-anchor="middle">
|
||||||
|
HTTPS certificates
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="670" y="1006" width="270" height="70" fill="#ffffff" stroke="#000000" stroke-width="3" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 268px; height: 1px; padding-top: 1041px; margin-left: 671px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font data-font-src="https://fonts.googleapis.com/css?family=Roboto">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
someapp.example.com
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
<br/>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="805" y="1045" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="670" y="1086" width="270" height="70" fill="#f5f5f5" stroke="#666666" stroke-width="3" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 268px; height: 1px; padding-top: 1121px; margin-left: 671px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #333333; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#333333, #c1c1c1); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font data-font-src="https://fonts.googleapis.com/css?family=Roboto">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
another.example.net
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
<br/>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="805" y="1125" fill="#333333" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
another.example.net
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="670" y="1166" width="270" height="70" fill="#f5f5f5" stroke="#666666" stroke-width="3" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 268px; height: 1px; padding-top: 1201px; margin-left: 671px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #333333; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#333333, #c1c1c1); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font data-font-src="https://fonts.googleapis.com/css?family=Roboto">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
onemore.example.org
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
<br/>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="805" y="1205" fill="#333333" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
onemore.example.org
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="430" y="1141" width="220" height="70" fill="#ffffff" stroke="#000000" stroke-width="3" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 218px; height: 1px; padding-top: 1176px; margin-left: 431px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font data-font-src="https://fonts.googleapis.com/css?family=Roboto">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
IP:
|
||||||
|
</span>
|
||||||
|
<br/>
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
123.124.125.126
|
||||||
|
</span>
|
||||||
|
</font>
|
||||||
|
<br/>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="540" y="1180" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
IP:...
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="60" y="493" width="380" height="250" fill="#ffffff" stroke="#000000" stroke-width="4" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 378px; height: 1px; padding-top: 618px; margin-left: 61px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px" face="Roboto, sans-serif">
|
||||||
|
https://someapp.example.com
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="250" y="622" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle" font-weight="bold">
|
||||||
|
https://someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<switch>
|
||||||
|
<g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>
|
||||||
|
<a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank">
|
||||||
|
<text text-anchor="middle" font-size="10px" x="50%" y="100%">
|
||||||
|
Text is not SVG - cannot display
|
||||||
|
</text>
|
||||||
|
</a>
|
||||||
|
</switch>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
|
@ -1,217 +0,0 @@
|
||||||
<mxfile host="65bd71144e">
|
|
||||||
<diagram id="jyERGzDynktFHFRGN0ph" name="Page-1">
|
|
||||||
<mxGraphModel dx="3321" dy="2867" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1200" math="0" shadow="0">
|
|
||||||
<root>
|
|
||||||
<mxCell id="0"/>
|
|
||||||
<mxCell id="1" parent="0"/>
|
|
||||||
<mxCell id="2" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="450" y="-50" width="820" height="970" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="3" value="<font face="Roboto"><span style="font-size: 24px">Server(s)</span></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="710" y="-50" width="300" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;exitX=0.092;exitY=1.01;exitDx=0;exitDy=0;dashed=1;exitPerimeter=0;" parent="1" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="800" y="521"/>
|
|
||||||
<mxPoint x="800" y="560"/>
|
|
||||||
</Array>
|
|
||||||
<mxPoint x="803" y="521" as="sourcePoint"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=3;dashed=1;" parent="1" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="800" y="520" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="800" y="680"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="33" value="" style="group" parent="1" vertex="1" connectable="0">
|
|
||||||
<mxGeometry x="-140" y="-75" width="500" height="350" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="29" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">https://someapp.example.com</font>" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;" parent="33" vertex="1">
|
|
||||||
<mxGeometry x="60" y="27" width="380" height="250" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="32" value="" style="pointerEvents=1;shadow=0;dashed=0;html=1;fillColor=#505050;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.laptop;strokeColor=none;" parent="33" vertex="1">
|
|
||||||
<mxGeometry width="500" height="350" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="90" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" parent="1" source="101" target="32" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="390" y="-190" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="390" y="-132"/>
|
|
||||||
<mxPoint x="280" y="-132"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="34" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">DNS Servers</font>" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-60" y="-540" width="330" height="260" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="6" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="495" y="320" width="355" height="440" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="7" value="<font style="font-size: 24px" face="Roboto">TLS Termination Proxy<br></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="525" y="330" width="280" height="40" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="73" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" parent="1" source="85" target="6" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="82" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;entryX=0.073;entryY=0.01;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.075;exitY=0.998;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="62" target="78" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="917" y="754" as="sourcePoint"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="62" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">FastAPI</font><font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px ; font-weight: normal"> app for: someapp.example.com</font>" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="895" y="650" width="300" height="100" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="65" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px ; font-weight: normal">Another app</font><font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px ; font-weight: normal">: another.example.com</font>" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="895" y="50" width="300" height="100" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="66" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px ; font-weight: normal">One more app</font><font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px ; font-weight: normal">: onemore.example.com</font>" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="895" y="180" width="300" height="100" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="78" value="<font face="Roboto"><span style="font-size: 24px ; font-weight: 400">A Database</span></font>" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="895" y="780" width="300" height="100" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="85" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Plain response from: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeColor=#9673a6;strokeWidth=3;fillColor=#e1d5e7;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="890" y="500" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="86" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="62" target="85" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="1030.0000000000005" y="649.9999999999995" as="sourcePoint"/>
|
|
||||||
<mxPoint x="850" y="540.0000000000005" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="1030" y="540"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="87" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" parent="1" source="6" target="62" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="1240" y="390"/>
|
|
||||||
<mxPoint x="1240" y="700"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="84" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Decrypted request for: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeColor=#82b366;strokeWidth=3;fillColor=#d5e8d4;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="890" y="350" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="88" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;dashed=1;" parent="1" source="100" target="34" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="65.05882352941171" y="-220" as="sourcePoint"/>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="89" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;dashed=1;" parent="1" source="32" target="100" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="110" y="-75" as="sourcePoint"/>
|
|
||||||
<mxPoint x="-4.941176470588289" y="-139.99999999999955" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-5" y="-90"/>
|
|
||||||
<mxPoint x="-5" y="-90"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="91" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="34" target="101" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="105" y="-280" as="sourcePoint"/>
|
|
||||||
<mxPoint x="390" y="-260" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="390" y="-430"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="109" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" parent="1" source="97" target="32" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="340" y="480"/>
|
|
||||||
<mxPoint x="340" y="480"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="36" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto" style="font-size: 24px">Port 443 (HTTPS)</font>" style="ellipse;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="330" y="680" width="170" height="120" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="92" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=classic;endFill=1;strokeWidth=3;" parent="1" source="96" target="36" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="50" y="500" as="sourcePoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="50" y="740"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="93" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="32" target="96" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="300" y="350" as="sourcePoint"/>
|
|
||||||
<mxPoint x="55" y="330" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="160" y="340"/>
|
|
||||||
<mxPoint x="160" y="340"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="96" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Encrypted request for: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeColor=#82b366;strokeWidth=3;fillColor=#d5e8d4;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-10" y="400" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="100" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Who is: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-110" y="-210" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="101" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">IP:</span><br style="font-family: &#34;roboto&#34;"><span style="font-family: &#34;roboto&#34; ; font-size: 24px">123.124.125.126</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="270" y="-290" width="240" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="106" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=0;strokeWidth=3;" parent="1" source="104" target="36" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-40" y="770"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="104" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">TLS Handshake</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="-110" y="300" width="230" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="107" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="32" target="104" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="-40" y="275" as="sourcePoint"/>
|
|
||||||
<mxPoint x="341.38784067832285" y="770" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="-40" y="290"/>
|
|
||||||
<mxPoint x="-40" y="290"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="97" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Encrypted response from: someapp.example.com</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeColor=#9673a6;strokeWidth=3;fillColor=#e1d5e7;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="90" y="500" width="310" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="110" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;startArrow=none;startFill=0;endArrow=none;endFill=1;strokeWidth=3;" parent="1" source="36" target="97" edge="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="415" y="680" as="sourcePoint"/>
|
|
||||||
<mxPoint x="110" y="275" as="targetPoint"/>
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="245" y="710"/>
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="49" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="510" y="400" width="310" height="320" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="50" value="<font style="font-size: 24px" face="Roboto">HTTPS certificates<br></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="550.9" y="410" width="228.21" height="40" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="51" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">someapp.example.com</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="530" y="465" width="270" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="52" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">another.example.net</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#666666;strokeWidth=3;fillColor=#f5f5f5;fontColor=#333333;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="530" y="545" width="270" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="53" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">onemore.example.org</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#666666;strokeWidth=3;fillColor=#f5f5f5;fontColor=#333333;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="530" y="625" width="270" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="42" value="<font face="Roboto" data-font-src="https://fonts.googleapis.com/css?family=Roboto"><span style="font-size: 24px">IP:</span><br><span style="font-size: 24px">123.124.125.126</span><br></font>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="290" y="600" width="220" height="70" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
</root>
|
|
||||||
</mxGraphModel>
|
|
||||||
</diagram>
|
|
||||||
</mxfile>
|
|
||||||
|
|
@ -0,0 +1,625 @@
|
||||||
|
<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1412px" height="1464px" viewBox="-0.5 -0.5 1412 1464" content="<mxfile><diagram id="jyERGzDynktFHFRGN0ph" name="Page-1">7V1bc6s2EP41mWkfzADi+piTS09nTltPk5m2jwrINi1GLsiJ3V9fCQQGIWxsC19y7EwmZhES2v12tbtayB14mK9+SuFi9gsOUXxn6uHqDjzemaZtWID+YZR1QQGmrxeUaRqFBc3YEF6i/xAnls2WUYiyRkOCcUyiRZMY4CRBAWnQYJrij2azCY6boy7gFLUILwGM29Q/opDMONU39c2JryiazsqhTZ2fmcOyNSdkMxjijxoJPN2BhxRjUnybrx5QzNhXMqa47rnjbHVnKUpInwuAWVzxDuMlnx2/MbIup7vAUUJQ+vRO+2ScM+7Al+q+dXoQwmyGQn4wI/OYN5pEcfyAY5zm/QBbZz+UHsM3FI9xFpEIJ/RcgFj/9MQ7SklE+fxNaPCGCcHzWoP7OJqyEwQvKBUvSRwl6KESNxsE8iZV5/SWF2xG89WU4VLDk0kUIC1E7/RPpsVwUfSWkRT/g8r7TnBCL/rS5itnNbsjtKqROJ9/QniOSLqmTfjZkWFxoXPcj1y7OP7YgMgukTKr4YdyjoOXA3dadb4RLf3CpSuXdA9Bp3iZhJUgP2YRQS8LGLCzH5RlgnBxQl74tUbFtlIfLDU8s2yBZeVxjWWeKWGZ7ypgGZCwzIkJm+wCJg3eOf8umcrmXBllucW6pw1Ma7HKOVGep9+m/G9ctmcmqODypt3vmGIe35kPbBSYZKMMpdGk3c8LSik3f8h+LDukcyr6bI5DycU9l2RB9FQepClfqRrUNZqTWnom6ug8CkM2jBRQTcg1MQQ4f57hPIoZAEqm6L/ghPNmzr6BL8+v61y3p2pg5xq7YQdkmuopQJ3XEg4K6fLDD3FKZniKExg/bagCGzdtvmFm0nJ5/o0IWfO1FC4Jlkm7znm0isifrENN901+/BdrrekGP3xc8QHzg7W4GpTNxhS6lAsMHHmDTgGxeW4VT4piSKL35jIs43V+6X2awnWtQb6OZbWex4ywkbqnN6Vu8xGe+7Z3dEHOxR10XQ2ko1W3m+FlGiB+lQCfiie9EOVfBqIawDgVCHpIWe/F92PR5Hhb0HGIUPVzSLUhw4zAlNwzh3qzHOS054jddmEakrBsEcQwy6KgIPImcqR0gqOQDSfppe8P0ykqXSXzNCgCvrBCGP4wMGoPxKfYZZWqNajjgqOBB6xOt+hwb6anK9Xyfx5/faHnCi8o6/SBRD2JYxoqolpMEMR4Ge72eZs+0R3zAdhnPwzvETE4ohtiSfwQIPFDTEeBI+JI5DxsxCAEjCFE3iSQ8d0JPPQ2URRj+HaDy8CUMNm220y2LAVMdncp04GKoSrAeP3GFOwVpfMogXk4burjFK/WOwKOt1QSgmzVylsIUkelbQqoBG1UVqa+gUoVoATn8RjP6U54dtubcAZxJrpdgCN8fK9tnK9ZZFRS6ZqHn25F+KsgGOXxJgDNj9b1IzHqrMWzrl2LZ3XN972tAe1eMWwdUo7ZhpTrncZB9Q23YT9c2+rlnx4AvXKaSh1C6SoWQgJHxfKXBo0OZ4Sw5P89m0exzmTaFONpjOAiyrQAzyk5yGiT54loy/f2QmUJvWeYkfvxzztWxcubh56f+OALCDuV4HQOY+kkGXwWi/yitGicUaBQkoZWcL6IUXGDuzKRW92Az+BSeoJL6fTNHxq6Cr/d/g71cS8c3yeYzKgt53D+1CqbN4DFhG9qulVNT6ulsvD6pqW1afxG3UkWXqXo+1FU6kKzCd8UdauiGt4pNbV02VXsA7chYel6h6+lxhiwMR6pTrzBDB25SfwZoeSeFEpet2t2MSUF4xhGSR6AZgucMNDok5RV3xzs728FVZmCn9Eup6za58uiFmtzahV+mz2AF61QWTQmTdr7jgug04IkaEMSGaGNXFXAE/YddQnwDAnwlNQU9MjlX166iLdQkt6T5WJKbRw6F2PoQNf02keIDi1f82sfu1eipr3hLNRK2ZZ00LLbghFH70+yuYnDCsg8brvRc68AqYpz0U4bqyV+z1wjY5hCEWO5P92FytYFrq4YH93b0RezpD6iIF0vCAUkk8+/S5Tl3R2VRLuwRdUz34DTa1GlS6oXWsMsqkAWwg+2qJ6pUm8gy9SvPKtZgaO3DVVZHjL0ourYmm57HhW56VuG4RoNIIzMnmVdh1gc/xM7U/ujoCy5qoOgQsbgrpVYqese6D2NLC2HkWO5OaxKIW+qqAQnbRh3atR0DUc7VtftzY+vMSwN8nmRfkzRocoYojRtTaSfqG7VEKKGUWsN6wv1Vklhq1pMEZhbA1lALT4N/SylzRdUBOu7khX4MkIFIDj+lrfdlu1of3zd6hAbLoeW540p7OhJiz0Lqf/w9fV1/NL9CI+I8Kp89bLKVYGQCXAkqVXDlTjjhuirHeKN+1e3NKk2BZKsARimgq2lu2LqScyVKyqGF4ZxFaeafNkDf9eFKaXujsSx908EKKB3BPb7Ojt2Rxmt6jSoUKoPrO2L3Y72x0O5e7G7mKzYU3LLig2SFRsJQbF1yq2mKvS/ZOj9MWM1/FF25UhT/bxRK5tSvXLjNMiRpRvUlkQdjcCfx3mDDhhsnn2RDDHgXRkm0AzTor82/XV23N+uAOM60Wu6Inj9Nnir3Sj14HWu3lfcMzJsbgVIcmMDRR9751TFHUhXdRbqCrYgi+f4vsIkpNr9z7GVYNdpIVrrG5A4RqbseVo1FkL2rOeVmwzF4WWlSkPHl6JNMA/dNwKWoQHP9SzdcT2wqSkSbI3yfSLx/ndtFG1vf3y82f0c88WYwGa8eStuVFjceM7axsqo3+xqw+tqpO3c05hVyxBKGw/doxRX6pZ9VmRHTUuw14Zau2j1qBUZtqx+MpmYgbSsPnTeHNtRYwDsQ1NOQMXejy2zAJf0Fo18g4+2CdiLKSZRAAnqflvN7QUaShBp61qzhseSJLPoEqSVfat+i4a9M5019LNqirNMqrRBgZ91qI7sZWtPvH9uC/vnltN+P6wp2z9X8a5T27yBVQpW8dHpBJHrAKuTf/pEAhOb/XBe1ejFZxhw29Ypwd39Jt/vG9zi48Y4nd7AfTy4HfOE4LYuzHJf3VbdZe3FfUbPRswPObK8u+w17ir0w5SF4Oeq+2wq3D6O8LBJAwVCHokvnrW8dgpA9sZC84B/b0APN/8ko8jLbP7ZCHj6Hw==</diagram></mxfile>">
|
||||||
|
<defs/>
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<rect x="0" y="466" width="500" height="350" fill="none" stroke="none" pointer-events="all"/>
|
||||||
|
<path d="M 289.06 793.99 C 293.87 793.99 297.23 791.75 296.28 790.03 L 286.73 773.39 C 285.53 770.86 283.81 770.35 280.97 770.35 L 219.03 770.35 C 216.02 770.35 214.47 770.96 213.01 773.49 L 204.15 789.93 C 202.43 792.57 207.59 793.99 211.29 793.99 Z M 433.76 739.91 L 433.76 496.43 L 65.98 496.43 L 65.98 739.91 Z M 25.89 816 C 16.09 815.9 7.31 812.04 3.61 806.06 C 0 800.17 1.46 794.29 4.56 790.23 L 40.18 747.52 L 40.18 495.12 C 40.18 482.43 49.81 466 65.81 466 L 433.84 466 C 446.32 466 459.57 477.77 459.57 496.74 L 459.57 747.52 L 495.53 790.64 C 498.54 794.7 500 800.07 496.39 805.86 C 491.66 813.16 482.71 815.49 474.28 816 Z" fill="#505050" stroke="none" pointer-events="all" style="fill: light-dark(rgb(80, 80, 80), rgb(168, 168, 168));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="590" y="491" width="820" height="970" fill="#ffffff" stroke="#000000" stroke-width="4" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="850" y="491" width="300" height="80" fill="none" stroke="none" pointer-events="all"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 298px; height: 1px; padding-top: 531px; margin-left: 851px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Roboto Mono", "mono"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
Server(s)
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="1000" y="535" fill="light-dark(#000000, #ffffff)" font-family=""Roboto Mono", "mono"" font-size="12px" text-anchor="middle">
|
||||||
|
Server(s)
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 530 331 L 530 409 L 420 409 L 420 455.9" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
<path d="M 420 462.65 L 415.5 453.65 L 420 455.9 L 424.5 453.65 Z" fill="#000000" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 162.5 66 C 96.5 66 80 131 132.8 144 C 80 172.6 139.4 235 182.3 209 C 212 261 311 261 344 209 C 410 209 410 157 368.75 131 C 410 79 344 27 286.25 53 C 245 14 179 14 162.5 66 Z" fill="#ffffff" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 328px; height: 1px; padding-top: 131px; margin-left: 81px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px" face="Roboto, sans-serif">
|
||||||
|
DNS Servers
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="245" y="135" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
DNS Servers
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="635" y="861" width="355" height="440" fill="#dae8fc" stroke="#6c8ebf" stroke-width="4" pointer-events="all" style="fill: light-dark(rgb(218, 232, 252), rgb(29, 41, 59)); stroke: light-dark(rgb(108, 142, 191), rgb(92, 121, 163));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="665" y="871" width="280" height="40" fill="none" stroke="none" pointer-events="all"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 278px; height: 1px; padding-top: 891px; margin-left: 666px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Roboto Mono", "mono"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
TLS Termination Proxy
|
||||||
|
</font>
|
||||||
|
<br/>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="805" y="895" fill="light-dark(#000000, #ffffff)" font-family=""Roboto Mono", "mono"" font-size="12px" text-anchor="middle">
|
||||||
|
TLS Termination Proxy
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 1030 1081 L 1000.1 1081" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
<path d="M 993.35 1081 L 1002.35 1076.5 L 1000.1 1081 L 1002.35 1085.5 Z" fill="#000000" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 1057.5 1290.8 L 1057.09 1311.9" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
<path d="M 1056.96 1318.65 L 1052.64 1309.56 L 1057.09 1311.9 L 1061.64 1309.73 Z" fill="#000000" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="1035" y="1191" width="300" height="100" fill="#dae8fc" stroke="#6c8ebf" stroke-width="4" pointer-events="all" style="fill: light-dark(rgb(218, 232, 252), rgb(29, 41, 59)); stroke: light-dark(rgb(108, 142, 191), rgb(92, 121, 163));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 298px; height: 1px; padding-top: 1241px; margin-left: 1036px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
<font style="font-size: 24px;" data-font-src="https://fonts.googleapis.com/css?family=Roboto">
|
||||||
|
FastAPI
|
||||||
|
</font>
|
||||||
|
<font style="font-size: 24px; font-weight: normal;" data-font-src="https://fonts.googleapis.com/css?family=Roboto">
|
||||||
|
app for: someapp.example.com
|
||||||
|
</font>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="1185" y="1245" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle" font-weight="bold">
|
||||||
|
FastAPI app for: someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="1035" y="591" width="300" height="100" fill="#dae8fc" stroke="#6c8ebf" stroke-width="4" pointer-events="all" style="fill: light-dark(rgb(218, 232, 252), rgb(29, 41, 59)); stroke: light-dark(rgb(108, 142, 191), rgb(92, 121, 163));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 298px; height: 1px; padding-top: 641px; margin-left: 1036px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
<font style="font-size: 24px; font-weight: normal;" data-font-src="https://fonts.googleapis.com/css?family=Roboto">
|
||||||
|
Another app
|
||||||
|
</font>
|
||||||
|
<font style="font-size: 24px; font-weight: normal;" data-font-src="https://fonts.googleapis.com/css?family=Roboto">
|
||||||
|
: another.example.com
|
||||||
|
</font>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="1185" y="645" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle" font-weight="bold">
|
||||||
|
Another app: another.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="1035" y="721" width="300" height="100" fill="#dae8fc" stroke="#6c8ebf" stroke-width="4" pointer-events="all" style="fill: light-dark(rgb(218, 232, 252), rgb(29, 41, 59)); stroke: light-dark(rgb(108, 142, 191), rgb(92, 121, 163));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 298px; height: 1px; padding-top: 771px; margin-left: 1036px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
<font style="font-size: 24px; font-weight: normal;" data-font-src="https://fonts.googleapis.com/css?family=Roboto">
|
||||||
|
One more app
|
||||||
|
</font>
|
||||||
|
<font style="font-size: 24px; font-weight: normal;" data-font-src="https://fonts.googleapis.com/css?family=Roboto">
|
||||||
|
: onemore.example.com
|
||||||
|
</font>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="1185" y="775" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle" font-weight="bold">
|
||||||
|
One more app: onemore.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="1035" y="1321" width="300" height="100" fill="#dae8fc" stroke="#6c8ebf" stroke-width="4" pointer-events="all" style="fill: light-dark(rgb(218, 232, 252), rgb(29, 41, 59)); stroke: light-dark(rgb(108, 142, 191), rgb(92, 121, 163));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 298px; height: 1px; padding-top: 1371px; margin-left: 1036px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px; font-weight: 400;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
A Database
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="1185" y="1375" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle" font-weight="bold">
|
||||||
|
A Database
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 1050 1041 L 1320 1041 L 1340 1081 L 1320 1121 L 1050 1121 L 1030 1081 Z" fill="#e1d5e7" stroke="#9673a6" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(225, 213, 231), rgb(57, 47, 63)); stroke: light-dark(rgb(150, 115, 166), rgb(149, 119, 163));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 308px; height: 1px; padding-top: 1081px; margin-left: 1031px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
Plain response from: someapp.example.com
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="1185" y="1085" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
Plain response from: someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 1185 1191 L 1185 1121" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 990 931 L 1380 931 L 1380 1241 L 1345.1 1241" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
<path d="M 1338.35 1241 L 1347.35 1236.5 L 1345.1 1241 L 1347.35 1245.5 Z" fill="#000000" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 1050 891 L 1320 891 L 1340 931 L 1320 971 L 1050 971 L 1030 931 Z" fill="#d5e8d4" stroke="#82b366" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 308px; height: 1px; padding-top: 931px; margin-left: 1031px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
Decrypted request for: someapp.example.com
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="1185" y="935" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
Decrypted request for: someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 185 331 L 185 296 L 245 296 L 245 271.1" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
<path d="M 245 264.35 L 249.5 273.35 L 245 271.1 L 240.5 273.35 Z" fill="#000000" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 135 466 L 135 451 L 135 411" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 408.04 111 L 530 111 L 530 251" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 480 1041 L 480 1021 L 480 826.1" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
<path d="M 480 819.35 L 484.5 828.35 L 480 826.1 L 475.5 828.35 Z" fill="#000000" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<ellipse cx="555" cy="1281" rx="85" ry="60" fill="#ffffff" stroke="#000000" stroke-width="3" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 168px; height: 1px; padding-top: 1281px; margin-left: 471px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px" face="Roboto, sans-serif">
|
||||||
|
Port 443 (HTTPS)
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="555" y="1285" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
Port 443 (HTTPS)
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 190 1021 L 190 1281 L 459.9 1281" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
<path d="M 466.65 1281 L 457.65 1285.5 L 459.9 1281 L 457.65 1276.5 Z" fill="#000000" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 300 816 L 300 881 L 300 941" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 150 941 L 420 941 L 440 981 L 420 1021 L 150 1021 L 130 981 Z" fill="#d5e8d4" stroke="#82b366" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 308px; height: 1px; padding-top: 981px; margin-left: 131px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
Encrypted request for: someapp.example.com
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="285" y="985" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
Encrypted request for: someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 50 331 L 320 331 L 340 371 L 320 411 L 50 411 L 30 371 Z" fill="#ffffff" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 308px; height: 1px; padding-top: 371px; margin-left: 31px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
Who is: someapp.example.com
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="185" y="375" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
Who is: someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 430 251 L 630 251 L 650 291 L 630 331 L 430 331 L 410 291 Z" fill="#ffffff" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 238px; height: 1px; padding-top: 291px; margin-left: 411px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
IP:
|
||||||
|
</span>
|
||||||
|
<br style=""/>
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
123.124.125.126
|
||||||
|
</span>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="530" y="295" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
IP:...
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 100 921 L 100 1311 L 481.39 1311" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 50 841 L 240 841 L 260 881 L 240 921 L 50 921 L 30 881 Z" fill="#ffffff" stroke="#000000" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 228px; height: 1px; padding-top: 881px; margin-left: 31px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
TLS Handshake
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="145" y="885" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
TLS Handshake
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 100 816 L 100 831 L 100 841" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 250 1041 L 520 1041 L 540 1081 L 520 1121 L 250 1121 L 230 1081 Z" fill="#e1d5e7" stroke="#9673a6" stroke-width="3" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(225, 213, 231), rgb(57, 47, 63)); stroke: light-dark(rgb(150, 115, 166), rgb(149, 119, 163));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 308px; height: 1px; padding-top: 1081px; margin-left: 231px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
Encrypted response from: someapp.example.com
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="385" y="1085" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
Encrypted response from: someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path d="M 481.39 1251 L 385 1251 L 385 1121" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="650" y="941" width="310" height="320" fill="#fff2cc" stroke="#d6b656" stroke-width="4" pointer-events="all" style="fill: light-dark(rgb(255, 242, 204), rgb(40, 29, 0)); stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="690.9" y="951" width="228.21" height="40" fill="none" stroke="none" pointer-events="all"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 226px; height: 1px; padding-top: 971px; margin-left: 692px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Roboto Mono", "mono"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
HTTPS certificates
|
||||||
|
</font>
|
||||||
|
<br/>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="805" y="975" fill="light-dark(#000000, #ffffff)" font-family=""Roboto Mono", "mono"" font-size="12px" text-anchor="middle">
|
||||||
|
HTTPS certificates
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="670" y="1006" width="270" height="70" fill="#ffffff" stroke="#000000" stroke-width="3" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 268px; height: 1px; padding-top: 1041px; margin-left: 671px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font data-font-src="https://fonts.googleapis.com/css?family=Roboto">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
someapp.example.com
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
<br/>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="805" y="1045" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="670" y="1086" width="270" height="70" fill="#f5f5f5" stroke="#666666" stroke-width="3" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 268px; height: 1px; padding-top: 1121px; margin-left: 671px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #333333; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#333333, #c1c1c1); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font data-font-src="https://fonts.googleapis.com/css?family=Roboto">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
another.example.net
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
<br/>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="805" y="1125" fill="#333333" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
another.example.net
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="670" y="1166" width="270" height="70" fill="#f5f5f5" stroke="#666666" stroke-width="3" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 268px; height: 1px; padding-top: 1201px; margin-left: 671px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #333333; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#333333, #c1c1c1); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font data-font-src="https://fonts.googleapis.com/css?family=Roboto">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
onemore.example.org
|
||||||
|
</font>
|
||||||
|
</span>
|
||||||
|
<br/>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="805" y="1205" fill="#333333" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
onemore.example.org
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="430" y="1141" width="220" height="70" fill="#ffffff" stroke="#000000" stroke-width="3" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 218px; height: 1px; padding-top: 1176px; margin-left: 431px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font data-font-src="https://fonts.googleapis.com/css?family=Roboto">
|
||||||
|
<font face="Roboto, sans-serif">
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
IP:
|
||||||
|
</span>
|
||||||
|
<br/>
|
||||||
|
<span style="font-size: 24px;">
|
||||||
|
123.124.125.126
|
||||||
|
</span>
|
||||||
|
</font>
|
||||||
|
<br/>
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="540" y="1180" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">
|
||||||
|
IP:...
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<rect x="60" y="493" width="380" height="250" fill="#ffffff" stroke="#000000" stroke-width="4" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g transform="translate(-0.5 -0.5)">
|
||||||
|
<switch>
|
||||||
|
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 378px; height: 1px; padding-top: 618px; margin-left: 61px;">
|
||||||
|
<div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; ">
|
||||||
|
<div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">
|
||||||
|
<font style="font-size: 24px" face="Roboto, sans-serif">
|
||||||
|
https://someapp.example.com
|
||||||
|
</font>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
<text x="250" y="622" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle" font-weight="bold">
|
||||||
|
https://someapp.example.com
|
||||||
|
</text>
|
||||||
|
</switch>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<switch>
|
||||||
|
<g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>
|
||||||
|
<a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank">
|
||||||
|
<text text-anchor="middle" font-size="10px" x="50%" y="100%">
|
||||||
|
Text is not SVG - cannot display
|
||||||
|
</text>
|
||||||
|
</a>
|
||||||
|
</switch>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
|
@ -0,0 +1,31 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="240px" height="100px" viewBox="0 0 240 100" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<title>sponsorship-badge</title>
|
||||||
|
<g id="sponsorship-badge" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<rect fill="#21002A" x="0" y="0" width="240" height="100"></rect>
|
||||||
|
<g id="Logo-Color-White" transform="translate(25.3346, 37.0438)" fill-rule="nonzero">
|
||||||
|
<g id="subtotal-white" transform="translate(-0, 0)">
|
||||||
|
<path d="M35.4635593,9.25233359 L35.4547458,22.6797912 C35.4547458,22.6797912 28.9172881,15.7964014 23.7327119,13.7252149 L23.7327119,20.903859 C23.7283051,24.4006387 20.7845763,26.1236895 17.7328814,26.0972488 C11.6030508,26.0972488 2.38186441,19.5553844 -3.13120528e-15,16.8474183 L0.00661016949,3.4221641 C0.00661016949,3.4221641 6.5440678,10.3011472 11.7286441,12.3723336 L11.7330508,5.19368953 C11.7330508,1.69690986 14.6767797,-0.026140983 17.7328814,0.00029969496 C23.8583051,0.00029969496 33.0794915,6.5421641 35.4613559,9.2501302" id="Path" fill="#DE4AE4"></path>
|
||||||
|
<path d="M49.5233898,23.034537 L49.5233898,17.6164014 C51.5857627,19.1257234 53.9301695,20.0797912 55.9947458,20.0797912 C58.059322,20.0797912 59.1081356,19.1257234 59.1081356,17.9557234 C59.1081356,14.7233505 49.1223729,16.0475878 49.1223729,8.44148614 C49.1223729,4.13165563 52.1740678,1.60657088 56.8849153,1.60657088 C59.1323729,1.60657088 61.6001695,2.22131664 63.3232203,3.29877427 L63.3232203,8.62436749 C61.7522034,7.3001302 59.5311864,6.50029969 57.5613559,6.50029969 C55.8052542,6.50029969 54.4457627,7.20979122 54.4457627,8.34674037 C54.4457627,11.5791133 64.4315254,10.254876 64.4315254,17.8609777 C64.4315254,22.1708082 61.2255932,25.0043675 56.329661,25.0043675 C53.8354237,25.0043675 51.2133898,24.3279268 49.5211864,23.034537" id="Path" fill="#FFFFFF"></path>
|
||||||
|
<path d="M66.8045763,2.09792681 L72.1015254,2.09792681 L72.1015254,16.0013166 C72.1015254,18.8018251 73.399322,20.0797912 75.2457627,20.0797912 C77.0922034,20.0797912 78.3591525,18.7599607 78.3591525,16.0013166 L78.3591525,2.09792681 L83.6538983,2.09792681 L83.6538983,15.9175878 C83.6538983,22.0980963 80.0469492,25.0043675 75.1818644,25.0043675 C70.3167797,25.0043675 66.8023729,22.0364014 66.8023729,15.9175878 L66.8023729,2.09792681 L66.8045763,2.09792681 Z" id="Path" fill="#FFFFFF"></path>
|
||||||
|
<path d="M86.919322,2.1001302 L94.2037288,2.1001302 C100.320339,2.1001302 102.45322,4.55911325 102.466441,8.04046919 C102.473051,10.124876 101.571864,11.4579268 100.287288,12.3304692 C102.444407,13.6789438 103.98678,15.5892827 103.98678,18.3413166 C103.98678,22.0364014 101.759153,24.5130116 96.2440678,24.5130116 L86.9215254,24.5130116 L86.9215254,2.1001302 L86.919322,2.1001302 Z M95.0961017,6.62368953 L92.2140678,6.62368953 L92.2140678,11.8236895 C92.2140678,11.8236895 97.5727119,10.9070794 97.5727119,8.48114715 C97.5727119,7.18114715 96.5789831,6.62368953 95.0961017,6.62368953 Z M96.8433898,14.4589438 C96.8433898,14.4589438 94.1045763,15.5297912 92.2118644,15.9991133 L92.2118644,19.9872488 L95.4288136,19.9872488 C97.7005085,19.9872488 98.7581356,19.0750455 98.7581356,17.5018251 C98.7581356,16.0608082 97.8811864,15.1530116 96.8411864,14.4589438 L96.8433898,14.4589438 Z" id="Shape" fill="#FFFFFF"></path>
|
||||||
|
<polygon id="Path" fill="#FFFFFF" points="109.312373 6.62589292 104.171864 6.62589292 104.171864 2.1001302 119.657288 2.1001302 119.657288 6.62589292 114.607119 6.62589292 114.607119 24.5130116 109.312373 24.5130116"></polygon>
|
||||||
|
<path d="M120.452712,13.3065709 C120.452712,5.91640139 124.055254,1.60657088 130.182881,1.60657088 C136.310508,1.60657088 139.910847,5.91640139 139.910847,13.3065709 C139.910847,20.6967404 136.308305,25.0065709 130.182881,25.0065709 C124.057458,25.0065709 120.452712,20.6967404 120.452712,13.3065709 M134.552203,13.3065709 C134.552203,8.96589292 133.042881,6.53335054 130.180678,6.53335054 C127.318475,6.53335054 125.809153,8.96589292 125.809153,13.3065709 C125.809153,17.6472488 127.318475,20.0797912 130.180678,20.0797912 C133.042881,20.0797912 134.552203,17.6472488 134.552203,13.3065709" id="Shape" fill="#FFFFFF"></path>
|
||||||
|
<polygon id="Path" fill="#FFFFFF" points="145.84678 6.62589292 140.706271 6.62589292 140.706271 2.1001302 156.191695 2.1001302 156.191695 6.62589292 151.141525 6.62589292 151.141525 24.5130116 145.84678 24.5130116"></polygon>
|
||||||
|
<polygon id="Path" fill="#FFFFFF" points="176.211695 2.1001302 181.506441 2.1001302 181.506441 19.9872488 188.62339 19.9872488 188.62339 24.5130116 176.211695 24.5130116"></polygon>
|
||||||
|
<path d="M168.312542,24.5130116 L173.609492,24.5130116 C173.609492,15.6928421 171.194576,7.33758783 167.605254,2.09792681 L161.955763,2.09792681 C158.366441,7.33538444 155.951525,15.6928421 155.951525,24.5130116 L161.248475,24.5130116 C161.248475,22.9243675 161.318983,21.3467404 161.457797,19.784537 L168.10322,19.784537 C168.242034,21.3489438 168.312542,22.9265709 168.312542,24.5130116 Z M162.039492,15.4130116 C162.61678,12.1982658 163.517966,9.07385902 164.780508,6.09046919 C166.043051,9.07385902 166.944237,12.1982658 167.521525,15.4130116 L162.041695,15.4130116 L162.039492,15.4130116 Z" id="Shape" fill="#FFFFFF"></path>
|
||||||
|
</g>
|
||||||
|
<g id="subtotal-white" transform="translate(-0, 0)">
|
||||||
|
<path d="M35.4635593,9.25233359 L35.4547458,22.6797912 C35.4547458,22.6797912 28.9172881,15.7964014 23.7327119,13.7252149 L23.7327119,20.903859 C23.7283051,24.4006387 20.7845763,26.1236895 17.7328814,26.0972488 C11.6030508,26.0972488 2.38186441,19.5553844 -3.13120528e-15,16.8474183 L0.00661016949,3.4221641 C0.00661016949,3.4221641 6.5440678,10.3011472 11.7286441,12.3723336 L11.7330508,5.19368953 C11.7330508,1.69690986 14.6767797,-0.026140983 17.7328814,0.00029969496 C23.8583051,0.00029969496 33.0794915,6.5421641 35.4613559,9.2501302" id="Path" fill="#DE4AE4"></path>
|
||||||
|
<path d="M49.5233898,23.034537 L49.5233898,17.6164014 C51.5857627,19.1257234 53.9301695,20.0797912 55.9947458,20.0797912 C58.059322,20.0797912 59.1081356,19.1257234 59.1081356,17.9557234 C59.1081356,14.7233505 49.1223729,16.0475878 49.1223729,8.44148614 C49.1223729,4.13165563 52.1740678,1.60657088 56.8849153,1.60657088 C59.1323729,1.60657088 61.6001695,2.22131664 63.3232203,3.29877427 L63.3232203,8.62436749 C61.7522034,7.3001302 59.5311864,6.50029969 57.5613559,6.50029969 C55.8052542,6.50029969 54.4457627,7.20979122 54.4457627,8.34674037 C54.4457627,11.5791133 64.4315254,10.254876 64.4315254,17.8609777 C64.4315254,22.1708082 61.2255932,25.0043675 56.329661,25.0043675 C53.8354237,25.0043675 51.2133898,24.3279268 49.5211864,23.034537" id="Path" fill="#FFFFFF"></path>
|
||||||
|
<path d="M66.8045763,2.09792681 L72.1015254,2.09792681 L72.1015254,16.0013166 C72.1015254,18.8018251 73.399322,20.0797912 75.2457627,20.0797912 C77.0922034,20.0797912 78.3591525,18.7599607 78.3591525,16.0013166 L78.3591525,2.09792681 L83.6538983,2.09792681 L83.6538983,15.9175878 C83.6538983,22.0980963 80.0469492,25.0043675 75.1818644,25.0043675 C70.3167797,25.0043675 66.8023729,22.0364014 66.8023729,15.9175878 L66.8023729,2.09792681 L66.8045763,2.09792681 Z" id="Path" fill="#FFFFFF"></path>
|
||||||
|
<path d="M86.919322,2.1001302 L94.2037288,2.1001302 C100.320339,2.1001302 102.45322,4.55911325 102.466441,8.04046919 C102.473051,10.124876 101.571864,11.4579268 100.287288,12.3304692 C102.444407,13.6789438 103.98678,15.5892827 103.98678,18.3413166 C103.98678,22.0364014 101.759153,24.5130116 96.2440678,24.5130116 L86.9215254,24.5130116 L86.9215254,2.1001302 L86.919322,2.1001302 Z M95.0961017,6.62368953 L92.2140678,6.62368953 L92.2140678,11.8236895 C92.2140678,11.8236895 97.5727119,10.9070794 97.5727119,8.48114715 C97.5727119,7.18114715 96.5789831,6.62368953 95.0961017,6.62368953 Z M96.8433898,14.4589438 C96.8433898,14.4589438 94.1045763,15.5297912 92.2118644,15.9991133 L92.2118644,19.9872488 L95.4288136,19.9872488 C97.7005085,19.9872488 98.7581356,19.0750455 98.7581356,17.5018251 C98.7581356,16.0608082 97.8811864,15.1530116 96.8411864,14.4589438 L96.8433898,14.4589438 Z" id="Shape" fill="#FFFFFF"></path>
|
||||||
|
<polygon id="Path" fill="#FFFFFF" points="109.312373 6.62589292 104.171864 6.62589292 104.171864 2.1001302 119.657288 2.1001302 119.657288 6.62589292 114.607119 6.62589292 114.607119 24.5130116 109.312373 24.5130116"></polygon>
|
||||||
|
<path d="M120.452712,13.3065709 C120.452712,5.91640139 124.055254,1.60657088 130.182881,1.60657088 C136.310508,1.60657088 139.910847,5.91640139 139.910847,13.3065709 C139.910847,20.6967404 136.308305,25.0065709 130.182881,25.0065709 C124.057458,25.0065709 120.452712,20.6967404 120.452712,13.3065709 M134.552203,13.3065709 C134.552203,8.96589292 133.042881,6.53335054 130.180678,6.53335054 C127.318475,6.53335054 125.809153,8.96589292 125.809153,13.3065709 C125.809153,17.6472488 127.318475,20.0797912 130.180678,20.0797912 C133.042881,20.0797912 134.552203,17.6472488 134.552203,13.3065709" id="Shape" fill="#FFFFFF"></path>
|
||||||
|
<polygon id="Path" fill="#FFFFFF" points="145.84678 6.62589292 140.706271 6.62589292 140.706271 2.1001302 156.191695 2.1001302 156.191695 6.62589292 151.141525 6.62589292 151.141525 24.5130116 145.84678 24.5130116"></polygon>
|
||||||
|
<polygon id="Path" fill="#FFFFFF" points="176.211695 2.1001302 181.506441 2.1001302 181.506441 19.9872488 188.62339 19.9872488 188.62339 24.5130116 176.211695 24.5130116"></polygon>
|
||||||
|
<path d="M168.312542,24.5130116 L173.609492,24.5130116 C173.609492,15.6928421 171.194576,7.33758783 167.605254,2.09792681 L161.955763,2.09792681 C158.366441,7.33538444 155.951525,15.6928421 155.951525,24.5130116 L161.248475,24.5130116 C161.248475,22.9243675 161.318983,21.3467404 161.457797,19.784537 L168.10322,19.784537 C168.242034,21.3489438 168.312542,22.9265709 168.312542,24.5130116 Z M162.039492,15.4130116 C162.61678,12.1982658 163.517966,9.07385902 164.780508,6.09046919 C166.043051,9.07385902 166.944237,12.1982658 167.521525,15.4130116 L162.041695,15.4130116 L162.039492,15.4130116 Z" id="Shape" fill="#FFFFFF"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 10 KiB |
|
|
@ -1,43 +0,0 @@
|
||||||
<mxfile host="65bd71144e" modified="2020-11-28T18:13:19.199Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Code/1.51.1 Chrome/83.0.4103.122 Electron/9.3.3 Safari/537.36" etag="KPHuXUeExV3PdWouu_3U" version="13.6.5">
|
|
||||||
<diagram id="zB4-QXJZ7ScUzHSLnJ1i" name="Page-1">
|
|
||||||
<mxGraphModel dx="1154" dy="780" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1200" math="0" shadow="0" extFonts="Roboto^https://fonts.googleapis.com/css?family=Roboto|Roboto Mono, mono^https://fonts.googleapis.com/css?family=Roboto+Mono%2C+mono">
|
|
||||||
<root>
|
|
||||||
<mxCell id="0"/>
|
|
||||||
<mxCell id="1" parent="0"/>
|
|
||||||
<mxCell id="2" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="110" y="280" width="1350" height="620" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="3" value="<font style="font-size: 24px" face="Roboto">Package app<br>app/__init__.py</font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="635" y="310" width="300" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="15" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Module app.main</span><br style="font-family: &#34;roboto&#34; ; font-size: 24px"><span style="font-family: &#34;roboto&#34; ; font-size: 24px">app/main.py</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="140" y="430" width="360" height="100" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="16" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Module app.dependencies</span><br style="font-family: &#34;roboto&#34; ; font-size: 24px"><span style="font-family: &#34;roboto&#34; ; font-size: 24px">app/dependencies.py</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="130" y="565" width="370" height="100" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="5" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="1030" y="430" width="400" height="260" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="8" value="<font style="font-size: 24px" face="Roboto">Subpackage app.internal<br></font><span style="font-family: &#34;roboto&#34; ; font-size: 24px">app/internal/__init__.py</span><font style="font-size: 24px" face="Roboto"><br></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="1083.8438461538462" y="460" width="292.3076923076923" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="19" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Module app.internal.admin</span><br style="font-family: &#34;roboto&#34; ; font-size: 24px"><span style="font-family: &#34;roboto&#34; ; font-size: 24px">app/internal/admin.py</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="1050" y="570" width="360" height="100" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="4" value="" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;strokeWidth=4;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="540" y="430" width="440" height="410" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="7" value="<font style="font-size: 24px" face="Roboto">Subpackage app.routers<br>app/routers/__init__.py<br></font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;strokeWidth=3;fontFamily=Roboto Mono, mono;FType=g;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="599.2307692307693" y="460" width="321.53846153846155" height="80" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="17" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Module app.routers.items</span><br style="font-family: &#34;roboto&#34; ; font-size: 24px"><span style="font-family: &#34;roboto&#34; ; font-size: 24px">app/routers/items.py</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="580" y="570" width="360" height="100" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="18" value="<span style="font-family: &#34;roboto&#34; ; font-size: 24px">Module app.routers.users</span><br style="font-family: &#34;roboto&#34; ; font-size: 24px"><span style="font-family: &#34;roboto&#34; ; font-size: 24px">app/routers/users.py</span>" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;strokeWidth=3;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="580" y="700" width="360" height="100" as="geometry"/>
|
|
||||||
</mxCell>
|
|
||||||
</root>
|
|
||||||
</mxGraphModel>
|
|
||||||
</diagram>
|
|
||||||
</mxfile>
|
|
||||||
|
After Width: | Height: | Size: 604 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
|
@ -7,12 +7,71 @@ hide:
|
||||||
|
|
||||||
## Latest Changes
|
## Latest Changes
|
||||||
|
|
||||||
|
### Translations
|
||||||
|
|
||||||
|
* 🌐 Add Russian translation for `docs/ru/docs/advanced/response-directly.md`. PR [#13801](https://github.com/fastapi/fastapi/pull/13801) by [@NavesSapnis](https://github.com/NavesSapnis).
|
||||||
|
* 🌐 Add Russian translation for `docs/ru/docs/advanced/additional-status-codes.md`. PR [#13799](https://github.com/fastapi/fastapi/pull/13799) by [@NavesSapnis](https://github.com/NavesSapnis).
|
||||||
|
* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/body-updates.md`. PR [#13804](https://github.com/fastapi/fastapi/pull/13804) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
|
||||||
|
|
||||||
|
### Internal
|
||||||
|
|
||||||
|
* ⬆ Bump pillow from 11.1.0 to 11.3.0. PR [#13852](https://github.com/fastapi/fastapi/pull/13852) by [@dependabot[bot]](https://github.com/apps/dependabot).
|
||||||
|
* 👥 Update FastAPI People - Sponsors. PR [#13846](https://github.com/fastapi/fastapi/pull/13846) by [@tiangolo](https://github.com/tiangolo).
|
||||||
|
* 👥 Update FastAPI GitHub topic repositories. PR [#13848](https://github.com/fastapi/fastapi/pull/13848) by [@tiangolo](https://github.com/tiangolo).
|
||||||
|
* ⬆ Bump mkdocs-material from 9.6.1 to 9.6.15. PR [#13849](https://github.com/fastapi/fastapi/pull/13849) by [@dependabot[bot]](https://github.com/apps/dependabot).
|
||||||
|
* ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13843](https://github.com/fastapi/fastapi/pull/13843) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
|
||||||
|
* 👥 Update FastAPI People - Contributors and Translators. PR [#13845](https://github.com/fastapi/fastapi/pull/13845) by [@tiangolo](https://github.com/tiangolo).
|
||||||
|
|
||||||
|
## 0.115.14
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* 🐛 Fix support for unions when using `Form`. PR [#13827](https://github.com/fastapi/fastapi/pull/13827) by [@patrick91](https://github.com/patrick91).
|
||||||
|
|
||||||
|
### Docs
|
||||||
|
|
||||||
|
* ✏️ Fix grammar mistake in `docs/en/docs/advanced/response-directly.md`. PR [#13800](https://github.com/fastapi/fastapi/pull/13800) by [@NavesSapnis](https://github.com/NavesSapnis).
|
||||||
|
* 📝 Update Speakeasy URL to Speakeasy Sandbox. PR [#13697](https://github.com/fastapi/fastapi/pull/13697) by [@ndimares](https://github.com/ndimares).
|
||||||
|
|
||||||
|
### Translations
|
||||||
|
|
||||||
|
* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/response-model.md`. PR [#13792](https://github.com/fastapi/fastapi/pull/13792) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
|
||||||
|
* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/security/index.md`. PR [#13805](https://github.com/fastapi/fastapi/pull/13805) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
|
||||||
|
* ✏️ Fix typo in `docs/ja/docs/tutorial/encoder.md`. PR [#13815](https://github.com/fastapi/fastapi/pull/13815) by [@ruzia](https://github.com/ruzia).
|
||||||
|
* ✏️ Fix typo in `docs/ja/docs/tutorial/handling-errors.md`. PR [#13814](https://github.com/fastapi/fastapi/pull/13814) by [@ruzia](https://github.com/ruzia).
|
||||||
|
* ✏️ Fix typo in `docs/ja/docs/tutorial/body-fields.md`. PR [#13802](https://github.com/fastapi/fastapi/pull/13802) by [@ruzia](https://github.com/ruzia).
|
||||||
|
* 🌐 Add Russian translation for `docs/ru/docs/advanced/index.md`. PR [#13797](https://github.com/fastapi/fastapi/pull/13797) by [@NavesSapnis](https://github.com/NavesSapnis).
|
||||||
|
|
||||||
|
### Internal
|
||||||
|
|
||||||
|
* ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13823](https://github.com/fastapi/fastapi/pull/13823) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
|
||||||
|
|
||||||
|
## 0.115.13
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* 🐛 Fix truncating the model's description with form feed (`\f`) character for Pydantic V2. PR [#13698](https://github.com/fastapi/fastapi/pull/13698) by [@YuriiMotov](https://github.com/YuriiMotov).
|
||||||
|
|
||||||
|
### Refactors
|
||||||
|
|
||||||
|
* ✨ Add `refreshUrl` parameter in `OAuth2PasswordBearer`. PR [#11460](https://github.com/fastapi/fastapi/pull/11460) by [@snosratiershad](https://github.com/snosratiershad).
|
||||||
|
* 🚸 Set format to password for fields `password` and `client_secret` in `OAuth2PasswordRequestForm`, make docs show password fields for passwords. PR [#11032](https://github.com/fastapi/fastapi/pull/11032) by [@Thodoris1999](https://github.com/Thodoris1999).
|
||||||
|
* ✅ Simplify tests for `settings`. PR [#13505](https://github.com/fastapi/fastapi/pull/13505) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
|
||||||
|
* ✅ Simplify tests for `validate_response_recursive`. PR [#13507](https://github.com/fastapi/fastapi/pull/13507) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
|
||||||
|
|
||||||
### Upgrades
|
### Upgrades
|
||||||
|
|
||||||
* ⬆️ Update ReDoc to version 2.x. PR [#9700](https://github.com/fastapi/fastapi/pull/9700) by [@joakimnordling](https://github.com/joakimnordling).
|
* ⬆️ Update ReDoc to version 2.x. PR [#9700](https://github.com/fastapi/fastapi/pull/9700) by [@joakimnordling](https://github.com/joakimnordling).
|
||||||
|
|
||||||
### Docs
|
### Docs
|
||||||
|
|
||||||
|
* 📝 Add annotations to HTTP middleware example. PR [#11530](https://github.com/fastapi/fastapi/pull/11530) by [@Kilo59](https://github.com/Kilo59).
|
||||||
|
* 📝 Clarify in CORS docs that wildcards and credentials are mutually exclusive. PR [#9829](https://github.com/fastapi/fastapi/pull/9829) by [@dfioravanti](https://github.com/dfioravanti).
|
||||||
|
* ✏️ Fix typo in docstring. PR [#13532](https://github.com/fastapi/fastapi/pull/13532) by [@comp64](https://github.com/comp64).
|
||||||
|
* 📝 Clarify guidance on using `async def` without `await`. PR [#13642](https://github.com/fastapi/fastapi/pull/13642) by [@swastikpradhan1999](https://github.com/swastikpradhan1999).
|
||||||
|
* 📝 Update exclude-parameters-from-openapi documentation links. PR [#13600](https://github.com/fastapi/fastapi/pull/13600) by [@timonrieger](https://github.com/timonrieger).
|
||||||
|
* 📝 Clarify the middleware execution order in docs. PR [#13699](https://github.com/fastapi/fastapi/pull/13699) by [@YuriiMotov](https://github.com/YuriiMotov).
|
||||||
|
* 🍱 Update Drawio diagrams SVGs, single file per diagram, sans-serif font. PR [#13706](https://github.com/fastapi/fastapi/pull/13706) by [@tiangolo](https://github.com/tiangolo).
|
||||||
* 📝 Update docs for "Help FastAPI", simplify and reduce "sponsor" section. PR [#13670](https://github.com/fastapi/fastapi/pull/13670) by [@tiangolo](https://github.com/tiangolo).
|
* 📝 Update docs for "Help FastAPI", simplify and reduce "sponsor" section. PR [#13670](https://github.com/fastapi/fastapi/pull/13670) by [@tiangolo](https://github.com/tiangolo).
|
||||||
* 📝 Remove unnecessary bullet from docs. PR [#13641](https://github.com/fastapi/fastapi/pull/13641) by [@Adamowoc](https://github.com/Adamowoc).
|
* 📝 Remove unnecessary bullet from docs. PR [#13641](https://github.com/fastapi/fastapi/pull/13641) by [@Adamowoc](https://github.com/Adamowoc).
|
||||||
* ✏️ Fix syntax error in `docs/en/docs/tutorial/handling-errors.md`. PR [#13623](https://github.com/fastapi/fastapi/pull/13623) by [@gsheni](https://github.com/gsheni).
|
* ✏️ Fix syntax error in `docs/en/docs/tutorial/handling-errors.md`. PR [#13623](https://github.com/fastapi/fastapi/pull/13623) by [@gsheni](https://github.com/gsheni).
|
||||||
|
|
@ -23,6 +82,25 @@ hide:
|
||||||
|
|
||||||
### Translations
|
### Translations
|
||||||
|
|
||||||
|
* 🌐 Add Russian Translation for `docs/ru/docs/advanced/response-change-status-code.md`. PR [#13791](https://github.com/fastapi/fastapi/pull/13791) by [@NavesSapnis](https://github.com/NavesSapnis).
|
||||||
|
* 🌐 Add Persian translation for `docs/fa/docs/learn/index.md`. PR [#13518](https://github.com/fastapi/fastapi/pull/13518) by [@Mohammad222PR](https://github.com/Mohammad222PR).
|
||||||
|
* 🌐 Add Korean translation for `docs/ko/docs/advanced/sub-applications.md`. PR [#4543](https://github.com/fastapi/fastapi/pull/4543) by [@NinaHwang](https://github.com/NinaHwang).
|
||||||
|
* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/schema-extra-example.md`. PR [#13769](https://github.com/fastapi/fastapi/pull/13769) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
|
||||||
|
* ✏️ Remove redundant words in docs/zh/docs/python-types.md. PR [#13774](https://github.com/fastapi/fastapi/pull/13774) by [@CharleeWa](https://github.com/CharleeWa).
|
||||||
|
* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/query-param-models.md`. PR [#13748](https://github.com/fastapi/fastapi/pull/13748) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
|
||||||
|
* 🌐 Add Bengali translation for `docs/bn/docs/environment-variables.md`. PR [#13629](https://github.com/fastapi/fastapi/pull/13629) by [@SakibSibly](https://github.com/SakibSibly).
|
||||||
|
* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/query-params-str-validations.md` page. PR [#13546](https://github.com/fastapi/fastapi/pull/13546) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
|
||||||
|
* 🌐 Add Russian translation for `docs/ru/docs/tutorial/cookie-param-models.md`. PR [#13616](https://github.com/fastapi/fastapi/pull/13616) by [@EgorOnishchuk](https://github.com/EgorOnishchuk).
|
||||||
|
* 🌐 Add Korean translation for `docs/ko/docs/tutorial/extra-models.md`. PR [#13063](https://github.com/fastapi/fastapi/pull/13063) by [@timothy-jeong](https://github.com/timothy-jeong).
|
||||||
|
* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/path-params-numeric-validations.md` page. PR [#13548](https://github.com/fastapi/fastapi/pull/13548) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
|
||||||
|
* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/middleware.md` page. PR [#13520](https://github.com/fastapi/fastapi/pull/13520) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
|
||||||
|
* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/background-tasks.md` page. PR [#13502](https://github.com/fastapi/fastapi/pull/13502) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
|
||||||
|
* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/cors.md` page. PR [#13519](https://github.com/fastapi/fastapi/pull/13519) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
|
||||||
|
* 🌐 Update Korean translation for `docs/ko/docs/advanced/events.md`. PR [#13487](https://github.com/fastapi/fastapi/pull/13487) by [@bom1215](https://github.com/bom1215).
|
||||||
|
* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/handling-errors.md` page. PR [#13420](https://github.com/fastapi/fastapi/pull/13420) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).
|
||||||
|
* 🌐 Add Russian translation for `docs/ru/docs/tutorial/request-form-models.md`. PR [#13552](https://github.com/fastapi/fastapi/pull/13552) by [@EgorOnishchuk](https://github.com/EgorOnishchuk).
|
||||||
|
* 📝 Fix internal anchor link in Spanish deployment docs. PR [#13737](https://github.com/fastapi/fastapi/pull/13737) by [@fabianfalon](https://github.com/fabianfalon).
|
||||||
|
* 🌐 Update Korean translation for `docs/ko/docs/virtual-environments.md`. PR [#13630](https://github.com/fastapi/fastapi/pull/13630) by [@sungchan1](https://github.com/sungchan1).
|
||||||
* 🌐 Add Russian translation for `docs/ru/docs/tutorial/header-param-models.md`. PR [#13526](https://github.com/fastapi/fastapi/pull/13526) by [@minaton-ru](https://github.com/minaton-ru).
|
* 🌐 Add Russian translation for `docs/ru/docs/tutorial/header-param-models.md`. PR [#13526](https://github.com/fastapi/fastapi/pull/13526) by [@minaton-ru](https://github.com/minaton-ru).
|
||||||
* 🌐 Update Chinese translation for `docs/zh/docs/tutorial/index.md`. PR [#13374](https://github.com/fastapi/fastapi/pull/13374) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng).
|
* 🌐 Update Chinese translation for `docs/zh/docs/tutorial/index.md`. PR [#13374](https://github.com/fastapi/fastapi/pull/13374) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng).
|
||||||
* 🌐 Update Chinese translation for `docs/zh/docs/deployment/manually.md`. PR [#13324](https://github.com/fastapi/fastapi/pull/13324) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng).
|
* 🌐 Update Chinese translation for `docs/zh/docs/deployment/manually.md`. PR [#13324](https://github.com/fastapi/fastapi/pull/13324) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng).
|
||||||
|
|
@ -31,6 +109,25 @@ hide:
|
||||||
|
|
||||||
### Internal
|
### Internal
|
||||||
|
|
||||||
|
* 🔨 Resolve Pydantic deprecation warnings in internal script. PR [#13696](https://github.com/fastapi/fastapi/pull/13696) by [@emmanuel-ferdman](https://github.com/emmanuel-ferdman).
|
||||||
|
* 🔧 Update sponsors: remove Porter. PR [#13783](https://github.com/fastapi/fastapi/pull/13783) by [@tiangolo](https://github.com/tiangolo).
|
||||||
|
* ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13781](https://github.com/fastapi/fastapi/pull/13781) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
|
||||||
|
* ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13757](https://github.com/fastapi/fastapi/pull/13757) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
|
||||||
|
* ⬆ Bump griffe-typingdoc from 0.2.7 to 0.2.8. PR [#13751](https://github.com/fastapi/fastapi/pull/13751) by [@dependabot[bot]](https://github.com/apps/dependabot).
|
||||||
|
* 🍱 Update sponsors: Dribia badge size. PR [#13773](https://github.com/fastapi/fastapi/pull/13773) by [@tiangolo](https://github.com/tiangolo).
|
||||||
|
* 🔧 Update sponsors: add Dribia. PR [#13771](https://github.com/fastapi/fastapi/pull/13771) by [@tiangolo](https://github.com/tiangolo).
|
||||||
|
* ⬆ Bump typer from 0.15.3 to 0.16.0. PR [#13752](https://github.com/fastapi/fastapi/pull/13752) by [@dependabot[bot]](https://github.com/apps/dependabot).
|
||||||
|
* 👥 Update FastAPI GitHub topic repositories. PR [#13754](https://github.com/fastapi/fastapi/pull/13754) by [@tiangolo](https://github.com/tiangolo).
|
||||||
|
* 👥 Update FastAPI People - Sponsors. PR [#13750](https://github.com/fastapi/fastapi/pull/13750) by [@tiangolo](https://github.com/tiangolo).
|
||||||
|
* 👥 Update FastAPI People - Contributors and Translators. PR [#13749](https://github.com/fastapi/fastapi/pull/13749) by [@tiangolo](https://github.com/tiangolo).
|
||||||
|
* ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13736](https://github.com/fastapi/fastapi/pull/13736) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
|
||||||
|
* 🔧 Update sponsors: Add InterviewPal. PR [#13728](https://github.com/fastapi/fastapi/pull/13728) by [@tiangolo](https://github.com/tiangolo).
|
||||||
|
* 🔧 Remove Google Analytics. PR [#13727](https://github.com/fastapi/fastapi/pull/13727) by [@tiangolo](https://github.com/tiangolo).
|
||||||
|
* 🔧 Update sponsors: remove MongoDB. PR [#13725](https://github.com/fastapi/fastapi/pull/13725) by [@tiangolo](https://github.com/tiangolo).
|
||||||
|
* ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13711](https://github.com/fastapi/fastapi/pull/13711) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
|
||||||
|
* 🔧 Update sponsors: add Subtotal. PR [#13701](https://github.com/fastapi/fastapi/pull/13701) by [@tiangolo](https://github.com/tiangolo).
|
||||||
|
* 🔧 Update sponsors: remove deepset / Haystack. PR [#13700](https://github.com/fastapi/fastapi/pull/13700) by [@tiangolo](https://github.com/tiangolo).
|
||||||
|
* ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13688](https://github.com/fastapi/fastapi/pull/13688) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
|
||||||
* 👥 Update FastAPI People - Experts. PR [#13671](https://github.com/fastapi/fastapi/pull/13671) by [@tiangolo](https://github.com/tiangolo).
|
* 👥 Update FastAPI People - Experts. PR [#13671](https://github.com/fastapi/fastapi/pull/13671) by [@tiangolo](https://github.com/tiangolo).
|
||||||
* ⬆ Bump typer from 0.12.5 to 0.15.3. PR [#13666](https://github.com/fastapi/fastapi/pull/13666) by [@dependabot[bot]](https://github.com/apps/dependabot).
|
* ⬆ Bump typer from 0.12.5 to 0.15.3. PR [#13666](https://github.com/fastapi/fastapi/pull/13666) by [@dependabot[bot]](https://github.com/apps/dependabot).
|
||||||
* ⬆ Bump sqlmodel from 0.0.23 to 0.0.24. PR [#13665](https://github.com/fastapi/fastapi/pull/13665) by [@dependabot[bot]](https://github.com/apps/dependabot).
|
* ⬆ Bump sqlmodel from 0.0.23 to 0.0.24. PR [#13665](https://github.com/fastapi/fastapi/pull/13665) by [@dependabot[bot]](https://github.com/apps/dependabot).
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ from app.routers import items
|
||||||
* There's also a subdirectory `app/internal/` with another file `__init__.py`, so it's another "Python subpackage": `app.internal`.
|
* There's also a subdirectory `app/internal/` with another file `__init__.py`, so it's another "Python subpackage": `app.internal`.
|
||||||
* And the file `app/internal/admin.py` is another submodule: `app.internal.admin`.
|
* And the file `app/internal/admin.py` is another submodule: `app.internal.admin`.
|
||||||
|
|
||||||
<img src="/img/tutorial/bigger-applications/package.svg">
|
<img src="/img/tutorial/bigger-applications/package.drawio.svg">
|
||||||
|
|
||||||
The same file structure with comments:
|
The same file structure with comments:
|
||||||
|
|
||||||
|
|
@ -270,7 +270,7 @@ But that file doesn't exist, our dependencies are in a file at `app/dependencies
|
||||||
|
|
||||||
Remember how our app/file structure looks like:
|
Remember how our app/file structure looks like:
|
||||||
|
|
||||||
<img src="/img/tutorial/bigger-applications/package.svg">
|
<img src="/img/tutorial/bigger-applications/package.drawio.svg">
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,10 @@ The following arguments are supported:
|
||||||
* `allow_origin_regex` - A regex string to match against origins that should be permitted to make cross-origin requests. e.g. `'https://.*\.example\.org'`.
|
* `allow_origin_regex` - A regex string to match against origins that should be permitted to make cross-origin requests. e.g. `'https://.*\.example\.org'`.
|
||||||
* `allow_methods` - A list of HTTP methods that should be allowed for cross-origin requests. Defaults to `['GET']`. You can use `['*']` to allow all standard methods.
|
* `allow_methods` - A list of HTTP methods that should be allowed for cross-origin requests. Defaults to `['GET']`. You can use `['*']` to allow all standard methods.
|
||||||
* `allow_headers` - A list of HTTP request headers that should be supported for cross-origin requests. Defaults to `[]`. You can use `['*']` to allow all headers. The `Accept`, `Accept-Language`, `Content-Language` and `Content-Type` headers are always allowed for <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests" class="external-link" rel="noopener" target="_blank">simple CORS requests</a>.
|
* `allow_headers` - A list of HTTP request headers that should be supported for cross-origin requests. Defaults to `[]`. You can use `['*']` to allow all headers. The `Accept`, `Accept-Language`, `Content-Language` and `Content-Type` headers are always allowed for <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests" class="external-link" rel="noopener" target="_blank">simple CORS requests</a>.
|
||||||
* `allow_credentials` - Indicate that cookies should be supported for cross-origin requests. Defaults to `False`. Also, `allow_origins` cannot be set to `['*']` for credentials to be allowed, origins must be specified.
|
* `allow_credentials` - Indicate that cookies should be supported for cross-origin requests. Defaults to `False`.
|
||||||
|
|
||||||
|
None of `allow_origins`, `allow_methods` and `allow_headers` can be set to `['*']` if `allow_credentials` is set to `True`. All of them must be <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards" class="external-link" rel="noopener" target="_blank">explicitly specified</a>.
|
||||||
|
|
||||||
* `expose_headers` - Indicate any response headers that should be made accessible to the browser. Defaults to `[]`.
|
* `expose_headers` - Indicate any response headers that should be made accessible to the browser. Defaults to `[]`.
|
||||||
* `max_age` - Sets a maximum time in seconds for browsers to cache CORS responses. Defaults to `600`.
|
* `max_age` - Sets a maximum time in seconds for browsers to cache CORS responses. Defaults to `600`.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,29 @@ Here we use <a href="https://docs.python.org/3/library/time.html#time.perf_count
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
|
## Multiple middleware execution order
|
||||||
|
|
||||||
|
When you add multiple middlewares using either `@app.middleware()` decorator or `app.add_middleware()` method, each new middleware wraps the application, forming a stack. The last middleware added is the *outermost*, and the first is the *innermost*.
|
||||||
|
|
||||||
|
On the request path, the *outermost* middleware runs first.
|
||||||
|
|
||||||
|
On the response path, it runs last.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
```Python
|
||||||
|
app.add_middleware(MiddlewareA)
|
||||||
|
app.add_middleware(MiddlewareB)
|
||||||
|
```
|
||||||
|
|
||||||
|
This results in the following execution order:
|
||||||
|
|
||||||
|
* **Request**: MiddlewareB → MiddlewareA → route
|
||||||
|
|
||||||
|
* **Response**: route → MiddlewareA → MiddlewareB
|
||||||
|
|
||||||
|
This stacking behavior ensures that middlewares are executed in a predictable and controllable order.
|
||||||
|
|
||||||
## Other middlewares
|
## Other middlewares
|
||||||
|
|
||||||
You can later read more about other middlewares in the [Advanced User Guide: Advanced Middleware](../advanced/middleware.md){.internal-link target=_blank}.
|
You can later read more about other middlewares in the [Advanced User Guide: Advanced Middleware](../advanced/middleware.md){.internal-link target=_blank}.
|
||||||
|
|
|
||||||
|
|
@ -289,20 +289,6 @@ markdown_extensions:
|
||||||
mdx_include: null
|
mdx_include: null
|
||||||
markdown_include_variants: null
|
markdown_include_variants: null
|
||||||
extra:
|
extra:
|
||||||
analytics:
|
|
||||||
provider: google
|
|
||||||
property: G-YNEVN69SC3
|
|
||||||
feedback:
|
|
||||||
title: Was this page helpful?
|
|
||||||
ratings:
|
|
||||||
- icon: material/emoticon-happy-outline
|
|
||||||
name: This page was helpful
|
|
||||||
data: 1
|
|
||||||
note: Thanks for your feedback!
|
|
||||||
- icon: material/emoticon-sad-outline
|
|
||||||
name: This page could be improved
|
|
||||||
data: 0
|
|
||||||
note: Thanks for your feedback!
|
|
||||||
social:
|
social:
|
||||||
- icon: fontawesome/brands/github-alt
|
- icon: fontawesome/brands/github-alt
|
||||||
link: https://github.com/fastapi/fastapi
|
link: https://github.com/fastapi/fastapi
|
||||||
|
|
|
||||||
|
|
@ -38,12 +38,6 @@
|
||||||
<img class="sponsor-image" src="/img/sponsors/platform-sh-banner.png" />
|
<img class="sponsor-image" src="/img/sponsors/platform-sh-banner.png" />
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="item">
|
|
||||||
<a title="Deploy FastAPI on AWS with a few clicks" style="display: block; position: relative;" href="https://www.porter.run" target="_blank">
|
|
||||||
<span class="sponsor-badge">sponsor</span>
|
|
||||||
<img class="sponsor-image" src="/img/sponsors/porter-banner.png" />
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<a title="Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files" style="display: block; position: relative;" href="https://github.com/scalar/scalar/?utm_source=fastapi&utm_medium=website&utm_campaign=top-banner" target="_blank">
|
<a title="Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files" style="display: block; position: relative;" href="https://github.com/scalar/scalar/?utm_source=fastapi&utm_medium=website&utm_campaign=top-banner" target="_blank">
|
||||||
<span class="sponsor-badge">sponsor</span>
|
<span class="sponsor-badge">sponsor</span>
|
||||||
|
|
@ -56,12 +50,6 @@
|
||||||
<img class="sponsor-image" src="/img/sponsors/propelauth-banner.png" />
|
<img class="sponsor-image" src="/img/sponsors/propelauth-banner.png" />
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="item">
|
|
||||||
<a title="Build your next app with FastAPI and MongoDB" style="display: block; position: relative;" href="https://www.mongodb.com/developer/languages/python/python-quickstart-fastapi/?utm_campaign=fastapi_framework&utm_source=fastapi_sponsorship&utm_medium=web_referral" target="_blank">
|
|
||||||
<span class="sponsor-badge">sponsor</span>
|
|
||||||
<img class="sponsor-image" src="/img/sponsors/mongodb-banner.png" />
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<a title="Zuplo: Scale, Protect, Document, and Monetize your FastAPI" style="display: block; position: relative;" href="https://zuplo.link/fastapi-web" target="_blank">
|
<a title="Zuplo: Scale, Protect, Document, and Monetize your FastAPI" style="display: block; position: relative;" href="https://zuplo.link/fastapi-web" target="_blank">
|
||||||
<span class="sponsor-badge">sponsor</span>
|
<span class="sponsor-badge">sponsor</span>
|
||||||
|
|
@ -86,6 +74,12 @@
|
||||||
<img class="sponsor-image" src="/img/sponsors/coderabbit-banner.png" />
|
<img class="sponsor-image" src="/img/sponsors/coderabbit-banner.png" />
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="item">
|
||||||
|
<a title="Making Retail Purchases Actionable for Brands and Developers" style="display: block; position: relative;" href="https://subtotal.com/?utm_source=fastapi&utm_medium=sponsorship&utm_campaign=open-source" target="_blank">
|
||||||
|
<span class="sponsor-badge">sponsor</span>
|
||||||
|
<img class="sponsor-image" src="/img/sponsors/subtotal-banner.svg" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ Y muestra su verdadero compromiso con FastAPI y su **comunidad** (tú), ya que n
|
||||||
|
|
||||||
Por ejemplo, podrías querer probar:
|
Por ejemplo, podrías querer probar:
|
||||||
|
|
||||||
* <a href="https://speakeasy.com/?utm_source=fastapi+repo&utm_medium=github+sponsorship" class="external-link" target="_blank">Speakeasy</a>
|
* <a href="https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship" class="external-link" target="_blank">Speakeasy</a>
|
||||||
* <a href="https://www.stainlessapi.com/?utm_source=fastapi&utm_medium=referral" class="external-link" target="_blank">Stainless</a>
|
* <a href="https://www.stainlessapi.com/?utm_source=fastapi&utm_medium=referral" class="external-link" target="_blank">Stainless</a>
|
||||||
* <a href="https://developers.liblab.com/tutorials/sdk-for-fastapi/?utm_source=fastapi" class="external-link" target="_blank">liblab</a>
|
* <a href="https://developers.liblab.com/tutorials/sdk-for-fastapi/?utm_source=fastapi" class="external-link" target="_blank">liblab</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -216,7 +216,7 @@ Este Proceso Administrador probablemente sería el que escuche en el **puerto**
|
||||||
|
|
||||||
Esos worker processes serían los que ejecutan tu aplicación, realizarían los cálculos principales para recibir un **request** y devolver un **response**, y cargarían cualquier cosa que pongas en variables en RAM.
|
Esos worker processes serían los que ejecutan tu aplicación, realizarían los cálculos principales para recibir un **request** y devolver un **response**, y cargarían cualquier cosa que pongas en variables en RAM.
|
||||||
|
|
||||||
<img src="/img/deployment/concepts/process-ram.svg">
|
<img src="/img/deployment/concepts/process-ram.drawio.svg">
|
||||||
|
|
||||||
Y por supuesto, la misma máquina probablemente tendría **otros procesos** ejecutándose también, aparte de tu aplicación.
|
Y por supuesto, la misma máquina probablemente tendría **otros procesos** ejecutándose también, aparte de tu aplicación.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ Usar contenedores de Linux tiene varias ventajas, incluyendo **seguridad**, **re
|
||||||
|
|
||||||
/// tip | Consejo
|
/// tip | Consejo
|
||||||
|
|
||||||
¿Tienes prisa y ya conoces esto? Salta al [`Dockerfile` más abajo 👇](#build-a-docker-image-for-fastapi).
|
¿Tienes prisa y ya conoces esto? Salta al [`Dockerfile` más abajo 👇](#construir-una-imagen-de-docker-para-fastapi).
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,7 @@ Primero, el navegador consultaría con los **servidores DNS** cuál es la **IP d
|
||||||
|
|
||||||
Los servidores DNS le dirían al navegador que use una **dirección IP** específica. Esa sería la dirección IP pública utilizada por tu servidor, que configuraste en los servidores DNS.
|
Los servidores DNS le dirían al navegador que use una **dirección IP** específica. Esa sería la dirección IP pública utilizada por tu servidor, que configuraste en los servidores DNS.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https01.svg">
|
<img src="/img/deployment/https/https01.drawio.svg">
|
||||||
|
|
||||||
### Inicio del Handshake TLS
|
### Inicio del Handshake TLS
|
||||||
|
|
||||||
|
|
@ -93,7 +93,7 @@ El navegador luego se comunicaría con esa dirección IP en el **puerto 443** (e
|
||||||
|
|
||||||
La primera parte de la comunicación es solo para establecer la conexión entre el cliente y el servidor y decidir las claves criptográficas que usarán, etc.
|
La primera parte de la comunicación es solo para establecer la conexión entre el cliente y el servidor y decidir las claves criptográficas que usarán, etc.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https02.svg">
|
<img src="/img/deployment/https/https02.drawio.svg">
|
||||||
|
|
||||||
Esta interacción entre el cliente y el servidor para establecer la conexión TLS se llama **handshake TLS**.
|
Esta interacción entre el cliente y el servidor para establecer la conexión TLS se llama **handshake TLS**.
|
||||||
|
|
||||||
|
|
@ -111,7 +111,7 @@ Usando la **extensión SNI** discutida anteriormente, el TLS Termination Proxy v
|
||||||
|
|
||||||
En este caso, usaría el certificado para `someapp.example.com`.
|
En este caso, usaría el certificado para `someapp.example.com`.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https03.svg">
|
<img src="/img/deployment/https/https03.drawio.svg">
|
||||||
|
|
||||||
El cliente ya **confía** en la entidad que generó ese certificado TLS (en este caso Let's Encrypt, pero lo veremos más adelante), por lo que puede **verificar** que el certificado sea válido.
|
El cliente ya **confía** en la entidad que generó ese certificado TLS (en este caso Let's Encrypt, pero lo veremos más adelante), por lo que puede **verificar** que el certificado sea válido.
|
||||||
|
|
||||||
|
|
@ -133,19 +133,19 @@ Ahora que el cliente y el servidor (específicamente el navegador y el TLS Termi
|
||||||
|
|
||||||
Así que, el cliente envía un **request HTTPS**. Esto es simplemente un request HTTP a través de una conexión TLS encriptada.
|
Así que, el cliente envía un **request HTTPS**. Esto es simplemente un request HTTP a través de una conexión TLS encriptada.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https04.svg">
|
<img src="/img/deployment/https/https04.drawio.svg">
|
||||||
|
|
||||||
### Desencriptar el Request
|
### Desencriptar el Request
|
||||||
|
|
||||||
El TLS Termination Proxy usaría la encriptación acordada para **desencriptar el request**, y transmitiría el **request HTTP simple (desencriptado)** al proceso que ejecuta la aplicación (por ejemplo, un proceso con Uvicorn ejecutando la aplicación FastAPI).
|
El TLS Termination Proxy usaría la encriptación acordada para **desencriptar el request**, y transmitiría el **request HTTP simple (desencriptado)** al proceso que ejecuta la aplicación (por ejemplo, un proceso con Uvicorn ejecutando la aplicación FastAPI).
|
||||||
|
|
||||||
<img src="/img/deployment/https/https05.svg">
|
<img src="/img/deployment/https/https05.drawio.svg">
|
||||||
|
|
||||||
### Response HTTP
|
### Response HTTP
|
||||||
|
|
||||||
La aplicación procesaría el request y enviaría un **response HTTP simple (sin encriptar)** al TLS Termination Proxy.
|
La aplicación procesaría el request y enviaría un **response HTTP simple (sin encriptar)** al TLS Termination Proxy.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https06.svg">
|
<img src="/img/deployment/https/https06.drawio.svg">
|
||||||
|
|
||||||
### Response HTTPS
|
### Response HTTPS
|
||||||
|
|
||||||
|
|
@ -153,7 +153,7 @@ El TLS Termination Proxy entonces **encriptaría el response** usando la criptog
|
||||||
|
|
||||||
Luego, el navegador verificaría que el response sea válido y encriptado con la clave criptográfica correcta, etc. Entonces **desencriptaría el response** y lo procesaría.
|
Luego, el navegador verificaría que el response sea válido y encriptado con la clave criptográfica correcta, etc. Entonces **desencriptaría el response** y lo procesaría.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https07.svg">
|
<img src="/img/deployment/https/https07.drawio.svg">
|
||||||
|
|
||||||
El cliente (navegador) sabrá que el response proviene del servidor correcto porque está utilizando la criptografía que acordaron usando el **certificado HTTPS** anteriormente.
|
El cliente (navegador) sabrá que el response proviene del servidor correcto porque está utilizando la criptografía que acordaron usando el **certificado HTTPS** anteriormente.
|
||||||
|
|
||||||
|
|
@ -163,7 +163,7 @@ En el mismo servidor (o servidores), podrían haber **múltiples aplicaciones**,
|
||||||
|
|
||||||
Solo un proceso puede estar gestionando la IP y puerto específica (el TLS Termination Proxy en nuestro ejemplo) pero las otras aplicaciones/procesos pueden estar ejecutándose en el/los servidor(es) también, siempre y cuando no intenten usar la misma **combinación de IP pública y puerto**.
|
Solo un proceso puede estar gestionando la IP y puerto específica (el TLS Termination Proxy en nuestro ejemplo) pero las otras aplicaciones/procesos pueden estar ejecutándose en el/los servidor(es) también, siempre y cuando no intenten usar la misma **combinación de IP pública y puerto**.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https08.svg">
|
<img src="/img/deployment/https/https08.drawio.svg">
|
||||||
|
|
||||||
De esa manera, el TLS Termination Proxy podría gestionar HTTPS y certificados para **múltiples dominios**, para múltiples aplicaciones, y luego transmitir los requests a la aplicación correcta en cada caso.
|
De esa manera, el TLS Termination Proxy podría gestionar HTTPS y certificados para **múltiples dominios**, para múltiples aplicaciones, y luego transmitir los requests a la aplicación correcta en cada caso.
|
||||||
|
|
||||||
|
|
@ -173,7 +173,7 @@ En algún momento en el futuro, cada certificado **expiraría** (alrededor de 3
|
||||||
|
|
||||||
Y entonces, habría otro programa (en algunos casos es otro programa, en algunos casos podría ser el mismo TLS Termination Proxy) que hablaría con Let's Encrypt y renovaría el/los certificado(s).
|
Y entonces, habría otro programa (en algunos casos es otro programa, en algunos casos podría ser el mismo TLS Termination Proxy) que hablaría con Let's Encrypt y renovaría el/los certificado(s).
|
||||||
|
|
||||||
<img src="/img/deployment/https/https.svg">
|
<img src="/img/deployment/https/https.drawio.svg">
|
||||||
|
|
||||||
Los **certificados TLS** están **asociados con un nombre de dominio**, no con una dirección IP.
|
Los **certificados TLS** están **asociados con un nombre de dominio**, no con una dirección IP.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ from app.routers import items
|
||||||
* También hay un subdirectorio `app/internal/` con otro archivo `__init__.py`, por lo que es otro "subpaquete de Python": `app.internal`.
|
* También hay un subdirectorio `app/internal/` con otro archivo `__init__.py`, por lo que es otro "subpaquete de Python": `app.internal`.
|
||||||
* Y el archivo `app/internal/admin.py` es otro submódulo: `app.internal.admin`.
|
* Y el archivo `app/internal/admin.py` es otro submódulo: `app.internal.admin`.
|
||||||
|
|
||||||
<img src="/img/tutorial/bigger-applications/package.svg">
|
<img src="/img/tutorial/bigger-applications/package.drawio.svg">
|
||||||
|
|
||||||
La misma estructura de archivos con comentarios:
|
La misma estructura de archivos con comentarios:
|
||||||
|
|
||||||
|
|
@ -270,7 +270,7 @@ Pero ese archivo no existe, nuestras dependencias están en un archivo en `app/d
|
||||||
|
|
||||||
Recuerda cómo se ve nuestra estructura de aplicación/archivo:
|
Recuerda cómo se ve nuestra estructura de aplicación/archivo:
|
||||||
|
|
||||||
<img src="/img/tutorial/bigger-applications/package.svg">
|
<img src="/img/tutorial/bigger-applications/package.drawio.svg">
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
# یادگیری
|
||||||
|
|
||||||
|
اینجا بخشهای مقدماتی و آموزشهایی هستن که برای یادگیری **FastAPI** بهت کمک میکنن.
|
||||||
|
|
||||||
|
میتونی اینو یه **کتاب**، یه **دوره آموزشی**، یا راه **رسمی** و پیشنهادی برای یادگیری FastAPI در نظر بگیری. 😎
|
||||||
|
|
@ -219,7 +219,7 @@ FastAPI アプリケーションでは、Uvicorn のようなサーバープロ
|
||||||
|
|
||||||
これらのワーカー・プロセスは、アプリケーションを実行するものであり、**リクエスト**を受けて**レスポンス**を返すための主要な計算を行い、あなたが変数に入れたものは何でもRAMにロードします。
|
これらのワーカー・プロセスは、アプリケーションを実行するものであり、**リクエスト**を受けて**レスポンス**を返すための主要な計算を行い、あなたが変数に入れたものは何でもRAMにロードします。
|
||||||
|
|
||||||
<img src="/img/deployment/concepts/process-ram.svg">
|
<img src="/img/deployment/concepts/process-ram.drawio.svg">
|
||||||
|
|
||||||
そしてもちろん、同じマシンでは、あなたのアプリケーションとは別に、**他のプロセス**も実行されているでしょう。
|
そしてもちろん、同じマシンでは、あなたのアプリケーションとは別に、**他のプロセス**も実行されているでしょう。
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -92,7 +92,7 @@ DNSサーバーでは、**取得したドメイン**をあなたのサーバー
|
||||||
|
|
||||||
DNSサーバーは、ブラウザに特定の**IPアドレス**を使用するように指示します。このIPアドレスは、DNSサーバーで設定した、あなたのサーバーが使用するパブリックIPアドレスになります。
|
DNSサーバーは、ブラウザに特定の**IPアドレス**を使用するように指示します。このIPアドレスは、DNSサーバーで設定した、あなたのサーバーが使用するパブリックIPアドレスになります。
|
||||||
|
|
||||||
<img src="/img/deployment/https/https01.svg">
|
<img src="/img/deployment/https/https01.drawio.svg">
|
||||||
|
|
||||||
### TLS Handshake の開始
|
### TLS Handshake の開始
|
||||||
|
|
||||||
|
|
@ -100,7 +100,7 @@ DNSサーバーは、ブラウザに特定の**IPアドレス**を使用する
|
||||||
|
|
||||||
通信の最初の部分は、クライアントとサーバー間の接続を確立し、使用する暗号鍵などを決めるだけです。
|
通信の最初の部分は、クライアントとサーバー間の接続を確立し、使用する暗号鍵などを決めるだけです。
|
||||||
|
|
||||||
<img src="/img/deployment/https/https02.svg">
|
<img src="/img/deployment/https/https02.drawio.svg">
|
||||||
|
|
||||||
TLS接続を確立するためのクライアントとサーバー間のこのやりとりは、**TLSハンドシェイク**と呼ばれます。
|
TLS接続を確立するためのクライアントとサーバー間のこのやりとりは、**TLSハンドシェイク**と呼ばれます。
|
||||||
|
|
||||||
|
|
@ -120,7 +120,7 @@ TLS Termination Proxyは、1つ以上の**TLS証明書**(HTTPS証明書)に
|
||||||
|
|
||||||
今回は、`someapp.example.com`の証明書を使うことになります。
|
今回は、`someapp.example.com`の証明書を使うことになります。
|
||||||
|
|
||||||
<img src="/img/deployment/https/https03.svg">
|
<img src="/img/deployment/https/https03.drawio.svg">
|
||||||
|
|
||||||
クライアントは、そのTLS証明書を生成したエンティティ(この場合はLet's Encryptですが、これについては後述します)をすでに**信頼**しているため、その証明書が有効であることを**検証**することができます。
|
クライアントは、そのTLS証明書を生成したエンティティ(この場合はLet's Encryptですが、これについては後述します)をすでに**信頼**しているため、その証明書が有効であることを**検証**することができます。
|
||||||
|
|
||||||
|
|
@ -142,19 +142,19 @@ TLS Termination Proxyは、1つ以上の**TLS証明書**(HTTPS証明書)に
|
||||||
|
|
||||||
そこで、クライアントは**HTTPSリクエスト**を送信します。これは、暗号化されたTLSコネクションを介した単なるHTTPリクエストです。
|
そこで、クライアントは**HTTPSリクエスト**を送信します。これは、暗号化されたTLSコネクションを介した単なるHTTPリクエストです。
|
||||||
|
|
||||||
<img src="/img/deployment/https/https04.svg">
|
<img src="/img/deployment/https/https04.drawio.svg">
|
||||||
|
|
||||||
### リクエストの復号化
|
### リクエストの復号化
|
||||||
|
|
||||||
TLS Termination Proxy は、合意が取れている暗号化を使用して、**リクエストを復号化**し、**プレーン (復号化された) HTTP リクエスト** をアプリケーションを実行しているプロセス (例えば、FastAPI アプリケーションを実行している Uvicorn を持つプロセス) に送信します。
|
TLS Termination Proxy は、合意が取れている暗号化を使用して、**リクエストを復号化**し、**プレーン (復号化された) HTTP リクエスト** をアプリケーションを実行しているプロセス (例えば、FastAPI アプリケーションを実行している Uvicorn を持つプロセス) に送信します。
|
||||||
|
|
||||||
<img src="/img/deployment/https/https05.svg">
|
<img src="/img/deployment/https/https05.drawio.svg">
|
||||||
|
|
||||||
### HTTP レスポンス
|
### HTTP レスポンス
|
||||||
|
|
||||||
アプリケーションはリクエストを処理し、**プレーン(暗号化されていない)HTTPレスポンス** をTLS Termination Proxyに送信します。
|
アプリケーションはリクエストを処理し、**プレーン(暗号化されていない)HTTPレスポンス** をTLS Termination Proxyに送信します。
|
||||||
|
|
||||||
<img src="/img/deployment/https/https06.svg">
|
<img src="/img/deployment/https/https06.drawio.svg">
|
||||||
|
|
||||||
### HTTPS レスポンス
|
### HTTPS レスポンス
|
||||||
|
|
||||||
|
|
@ -162,7 +162,7 @@ TLS Termination Proxyは次に、事前に合意が取れている暗号(`someap
|
||||||
|
|
||||||
その後ブラウザでは、レスポンスが有効で正しい暗号キーで暗号化されていることなどを検証します。そして、ブラウザはレスポンスを**復号化**して処理します。
|
その後ブラウザでは、レスポンスが有効で正しい暗号キーで暗号化されていることなどを検証します。そして、ブラウザはレスポンスを**復号化**して処理します。
|
||||||
|
|
||||||
<img src="/img/deployment/https/https07.svg">
|
<img src="/img/deployment/https/https07.drawio.svg">
|
||||||
|
|
||||||
クライアント(ブラウザ)は、レスポンスが正しいサーバーから来たことを知ることができます。 なぜなら、そのサーバーは、以前に**HTTPS証明書**を使って合意した暗号を使っているからです。
|
クライアント(ブラウザ)は、レスポンスが正しいサーバーから来たことを知ることができます。 なぜなら、そのサーバーは、以前に**HTTPS証明書**を使って合意した暗号を使っているからです。
|
||||||
|
|
||||||
|
|
@ -172,7 +172,7 @@ TLS Termination Proxyは次に、事前に合意が取れている暗号(`someap
|
||||||
|
|
||||||
特定のIPとポート(この例ではTLS Termination Proxy)を扱うことができるのは1つのプロセスだけですが、他のアプリケーション/プロセスも、同じ**パブリックIPとポート**の組み合わせを使用しようとしない限り、サーバー上で実行することができます。
|
特定のIPとポート(この例ではTLS Termination Proxy)を扱うことができるのは1つのプロセスだけですが、他のアプリケーション/プロセスも、同じ**パブリックIPとポート**の組み合わせを使用しようとしない限り、サーバー上で実行することができます。
|
||||||
|
|
||||||
<img src="/img/deployment/https/https08.svg">
|
<img src="/img/deployment/https/https08.drawio.svg">
|
||||||
|
|
||||||
そうすれば、TLS Termination Proxy は、**複数のドメイン**や複数のアプリケーションのHTTPSと証明書を処理し、それぞれのケースで適切なアプリケーションにリクエストを送信することができます。
|
そうすれば、TLS Termination Proxy は、**複数のドメイン**や複数のアプリケーションのHTTPSと証明書を処理し、それぞれのケースで適切なアプリケーションにリクエストを送信することができます。
|
||||||
|
|
||||||
|
|
@ -182,7 +182,7 @@ TLS Termination Proxyは次に、事前に合意が取れている暗号(`someap
|
||||||
|
|
||||||
その後、Let's Encryptと通信する別のプログラム(別のプログラムである場合もあれば、同じTLS Termination Proxyである場合もある)によって、証明書を更新します。
|
その後、Let's Encryptと通信する別のプログラム(別のプログラムである場合もあれば、同じTLS Termination Proxyである場合もある)によって、証明書を更新します。
|
||||||
|
|
||||||
<img src="/img/deployment/https/https.svg">
|
<img src="/img/deployment/https/https.drawio.svg">
|
||||||
|
|
||||||
**TLS証明書**は、IPアドレスではなく、**ドメイン名に関連付けられて**います。
|
**TLS証明書**は、IPアドレスではなく、**ドメイン名に関連付けられて**います。
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@
|
||||||
|
|
||||||
追加情報は`Field`や`Query`、`Body`などで宣言することができます。そしてそれは生成されたJSONスキーマに含まれます。
|
追加情報は`Field`や`Query`、`Body`などで宣言することができます。そしてそれは生成されたJSONスキーマに含まれます。
|
||||||
|
|
||||||
後に例を用いて宣言を学ぶ際に、追加情報を句悪方法を学べます。
|
後に例を用いて宣言を学ぶ際に、追加情報を追加する方法を学べます。
|
||||||
|
|
||||||
## まとめ
|
## まとめ
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
## `jsonable_encoder`の使用
|
## `jsonable_encoder`の使用
|
||||||
|
|
||||||
JSON互換のデータのみを受信するデータベース`fase_db`があるとしましょう。
|
JSON互換のデータのみを受信するデータベース`fake_db`があるとしましょう。
|
||||||
|
|
||||||
例えば、`datetime`オブジェクトはJSONと互換性がないので、このデーターベースには受け取られません。
|
例えば、`datetime`オブジェクトはJSONと互換性がないので、このデーターベースには受け取られません。
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,7 @@ Pythonの例外なので、`return`ではなく、`raise`です。
|
||||||
|
|
||||||
`HTTPException`を発生させる際には、`str`だけでなく、JSONに変換できる任意の値を`detail`パラメータとして渡すことができます。
|
`HTTPException`を発生させる際には、`str`だけでなく、JSONに変換できる任意の値を`detail`パラメータとして渡すことができます。
|
||||||
|
|
||||||
`dist`や`list`などを渡すことができます。
|
`dict`や`list`などを渡すことができます。
|
||||||
|
|
||||||
これらは **FastAPI** によって自動的に処理され、JSONに変換されます。
|
これらは **FastAPI** によって自動的に処理され、JSONに変換されます。
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,53 +1,165 @@
|
||||||
# 이벤트: startup과 shutdown
|
# Lifespan 이벤트
|
||||||
|
|
||||||
필요에 따라 응용 프로그램이 시작되기 전이나 종료될 때 실행되는 이벤트 핸들러(함수)를 정의할 수 있습니다.
|
애플리케이션 **시작 전**에 실행되어야 하는 로직(코드)을 정의할 수 있습니다. 이는 이 코드가 **한 번**만 실행되며, **애플리케이션이 요청을 받기 시작하기 전**에 실행된다는 의미입니다.
|
||||||
|
|
||||||
이 함수들은 `async def` 또는 평범하게 `def`으로 선언할 수 있습니다.
|
마찬가지로, 애플리케이션이 **종료될 때** 실행되어야 하는 로직(코드)을 정의할 수 있습니다. 이 경우, 이 코드는 **한 번**만 실행되며, **여러 요청을 처리한 후**에 실행됩니다.
|
||||||
|
|
||||||
/// warning | 경고
|
이 코드가 애플리케이션이 **요청을 받기 시작하기 전에** 실행되고, 요청 처리가 끝난 후 **종료 직전에** 실행되기 때문에 전체 애플리케이션의 **수명(Lifespan)**을 다룹니다. (잠시 후 "수명"이라는 단어가 중요해집니다 😉)
|
||||||
|
|
||||||
이벤트 핸들러는 주 응용 프로그램에서만 작동합니다. [하위 응용 프로그램 - 마운트](./sub-applications.md){.internal-link target=_blank}에서는 작동하지 않습니다.
|
이 방법은 전체 애플리케이션에서 사용해야 하는 **자원**을 설정하거나 요청 간에 **공유되는** 자원을 설정하고, 또는 그 후에 **정리**하는 데 매우 유용할 수 있습니다. 예를 들어, 데이터베이스 연결 풀 또는 공유되는 머신러닝 모델을 로드하는 경우입니다.
|
||||||
|
|
||||||
|
|
||||||
|
## 사용 사례
|
||||||
|
|
||||||
|
먼저 **사용 사례**를 예로 들어보고, 이를 어떻게 해결할 수 있는지 살펴보겠습니다.
|
||||||
|
|
||||||
|
우리가 요청을 처리하기 위해 사용하고 싶은 **머신러닝 모델**이 있다고 상상해 봅시다. 🤖
|
||||||
|
|
||||||
|
이 모델들은 요청 간에 공유되므로, 요청마다 모델이 하나씩 있는 것이 아니라, 여러 요청에서 동일한 모델을 사용합니다.
|
||||||
|
|
||||||
|
모델을 로드하는 데 **상당한 시간이 걸린다고 상상해 봅시다**, 왜냐하면 모델이 **디스크에서 많은 데이터를 읽어야** 하기 때문입니다. 따라서 모든 요청에 대해 모델을 매번 로드하고 싶지 않습니다.
|
||||||
|
|
||||||
|
모듈/파일의 최상위에서 모델을 로드할 수도 있지만, 그러면 **모델을 로드하는데** 시간이 걸리기 때문에, 단순한 자동화된 테스트를 실행할 때도 모델이 로드될 때까지 기다려야 해서 **테스트 속도가 느려집니다**.
|
||||||
|
|
||||||
|
이 문제를 해결하려고 하는 것입니다. 요청을 처리하기 전에 모델을 로드하되, 애플리케이션이 요청을 받기 시작하기 직전에만 로드하고, 코드가 로드되는 동안은 로드하지 않도록 하겠습니다.
|
||||||
|
|
||||||
|
## Lifespan
|
||||||
|
|
||||||
|
`FastAPI` 애플리케이션의 `lifespan` 매개변수와 "컨텍스트 매니저"를 사용하여 *시작*과 *종료* 로직을 정의할 수 있습니다. (컨텍스트 매니저가 무엇인지 잠시 후에 설명드리겠습니다.)
|
||||||
|
|
||||||
|
예제를 통해 시작하고, 그 후에 자세히 살펴보겠습니다.
|
||||||
|
|
||||||
|
우리는 `yield`를 사용하여 비동기 함수 `lifespan()`을 다음과 같이 생성합니다:
|
||||||
|
|
||||||
|
{* ../../docs_src/events/tutorial003.py hl[16,19] *}
|
||||||
|
|
||||||
|
여기서 우리는 모델을 로드하는 비싼 *시작* 작업을 시뮬레이션하고 있습니다. `yield` 앞에서 (가짜) 모델 함수를 머신러닝 모델이 담긴 딕셔너리에 넣습니다. 이 코드는 **애플리케이션이 요청을 받기 시작하기 전**, *시작* 동안에 실행됩니다.
|
||||||
|
|
||||||
|
그리고 `yield` 직후에는 모델을 언로드합니다. 이 코드는 **애플리케이션이 요청 처리 완료 후**, *종료* 직전에 실행됩니다. 예를 들어, 메모리나 GPU와 같은 자원을 해제하는 작업을 할 수 있습니다.
|
||||||
|
|
||||||
|
/// tip | 팁
|
||||||
|
|
||||||
|
`shutdown`은 애플리케이션을 **종료**할 때 발생합니다.
|
||||||
|
|
||||||
|
새로운 버전을 시작해야 하거나, 그냥 실행을 멈추고 싶을 수도 있습니다. 🤷
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
## `startup` 이벤트
|
### Lifespan 함수
|
||||||
|
|
||||||
응용 프로그램을 시작하기 전에 실행하려는 함수를 "startup" 이벤트로 선언합니다:
|
먼저 주목할 점은, `yield`를 사용하여 비동기 함수(async function)를 정의하고 있다는 것입니다. 이는 `yield`를 사용한 의존성과 매우 유사합니다.
|
||||||
|
|
||||||
|
{* ../../docs_src/events/tutorial003.py hl[14:19] *}
|
||||||
|
|
||||||
|
함수의 첫 번째 부분, 즉 `yield` 이전의 코드는 애플리케이션이 시작되기 **전에** 실행됩니다.
|
||||||
|
|
||||||
|
그리고 `yield` 이후의 부분은 애플리케이션이 완료된 후 **나중에** 실행됩니다.
|
||||||
|
|
||||||
|
### 비동기 컨텍스트 매니저
|
||||||
|
|
||||||
|
함수를 확인해보면, `@asynccontextmanager`로 장식되어 있습니다.
|
||||||
|
|
||||||
|
이것은 함수를 "**비동기 컨텍스트 매니저**"라고 불리는 것으로 변환시킵니다.
|
||||||
|
|
||||||
|
{* ../../docs_src/events/tutorial003.py hl[1,13] *}
|
||||||
|
|
||||||
|
파이썬에서 **컨텍스트 매니저**는 `with` 문에서 사용할 수 있는 것입니다. 예를 들어, `open()`은 컨텍스트 매니저로 사용할 수 있습니다:
|
||||||
|
|
||||||
|
```Python
|
||||||
|
with open("file.txt") as file:
|
||||||
|
file.read()
|
||||||
|
```
|
||||||
|
최근 버전의 파이썬에서는 **비동기 컨텍스트 매니저**도 있습니다. 이를 `async with`와 함께 사용합니다:
|
||||||
|
|
||||||
|
```Python
|
||||||
|
async with lifespan(app):
|
||||||
|
await do_stuff()
|
||||||
|
```
|
||||||
|
|
||||||
|
컨텍스트 매니저나 위와 같은 비동기 컨텍스트 매니저를 만들면, `with` 블록에 들어가기 전에 `yield` 이전의 코드가 실행되고, `with` 블록을 벗어난 후에는 `yield` 이후의 코드가 실행됩니다.
|
||||||
|
|
||||||
|
위의 코드 예제에서는 직접 사용하지 않고, FastAPI에 전달하여 사용하도록 합니다.
|
||||||
|
|
||||||
|
`FastAPI` 애플리케이션의 `lifespan` 매개변수는 **비동기 컨텍스트 매니저**를 받기 때문에, 새로운 `lifespan` 비동기 컨텍스트 매니저를 FastAPI에 전달할 수 있습니다.
|
||||||
|
|
||||||
|
{* ../../docs_src/events/tutorial003.py hl[22] *}
|
||||||
|
|
||||||
|
## 대체 이벤트 (사용 중단)
|
||||||
|
|
||||||
|
/// warning | 경고
|
||||||
|
|
||||||
|
*시작*과 *종료*를 처리하는 권장 방법은 위에서 설명한 대로 `FastAPI` 애플리케이션의 `lifespan` 매개변수를 사용하는 것입니다. `lifespan` 매개변수를 제공하면 `startup`과 `shutdown` 이벤트 핸들러는 더 이상 호출되지 않습니다. `lifespan`을 사용할지, 모든 이벤트를 사용할지 선택해야 하며 둘 다 사용할 수는 없습니다.
|
||||||
|
|
||||||
|
이 부분은 건너뛰셔도 좋습니다.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
*시작*과 *종료* 동안 실행될 이 로직을 정의하는 대체 방법이 있습니다.
|
||||||
|
|
||||||
|
애플리케이션이 시작되기 전에 또는 종료될 때 실행해야 하는 이벤트 핸들러(함수)를 정의할 수 있습니다.
|
||||||
|
|
||||||
|
이 함수들은 `async def` 또는 일반 `def`로 선언할 수 있습니다.
|
||||||
|
|
||||||
|
### `startup` 이벤트
|
||||||
|
|
||||||
|
애플리케이션이 시작되기 전에 실행되어야 하는 함수를 추가하려면, `"startup"` 이벤트로 선언합니다:
|
||||||
|
|
||||||
{* ../../docs_src/events/tutorial001.py hl[8] *}
|
{* ../../docs_src/events/tutorial001.py hl[8] *}
|
||||||
|
|
||||||
이 경우 `startup` 이벤트 핸들러 함수는 단순히 몇 가지 값으로 구성된 `dict` 형식의 "데이터베이스"를 초기화합니다.
|
이 경우, `startup` 이벤트 핸들러 함수는 "database"라는 항목(단지 `dict`)을 일부 값으로 초기화합니다.
|
||||||
|
|
||||||
하나 이상의 이벤트 핸들러 함수를 추가할 수도 있습니다.
|
여러 개의 이벤트 핸들러 함수를 추가할 수 있습니다.
|
||||||
|
|
||||||
그리고 응용 프로그램은 모든 `startup` 이벤트 핸들러가 완료될 때까지 요청을 받지 않습니다.
|
애플리케이션은 모든 `startup` 이벤트 핸들러가 완료될 때까지 요청을 받기 시작하지 않습니다.
|
||||||
|
|
||||||
## `shutdown` 이벤트
|
### `shutdown` 이벤트
|
||||||
|
|
||||||
응용 프로그램이 종료될 때 실행하려는 함수를 추가하려면 `"shutdown"` 이벤트로 선언합니다:
|
애플리케이션이 종료될 때 실행되어야 하는 함수를 추가하려면, `"shutdown"` 이벤트로 선언합니다:
|
||||||
|
|
||||||
{* ../../docs_src/events/tutorial002.py hl[6] *}
|
{* ../../docs_src/events/tutorial002.py hl[6] *}
|
||||||
|
|
||||||
이 예제에서 `shutdown` 이벤트 핸들러 함수는 `"Application shutdown"`이라는 텍스트가 적힌 `log.txt` 파일을 추가할 것입니다.
|
여기서, `shutdown` 이벤트 핸들러 함수는 `"Application shutdown"`이라는 텍스트를 `log.txt` 파일에 기록합니다.
|
||||||
|
|
||||||
/// info | 정보
|
/// info | 정보
|
||||||
|
|
||||||
`open()` 함수에서 `mode="a"`는 "추가"를 의미합니다. 따라서 이미 존재하는 파일의 내용을 덮어쓰지 않고 새로운 줄을 추가합니다.
|
`open()` 함수에서 `mode="a"`는 "추가"를 의미하므로, 파일에 있는 기존 내용은 덮어쓰지 않고 새로운 줄이 추가됩니다.
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
/// tip | 팁
|
/// tip | 팁
|
||||||
|
|
||||||
이 예제에서는 파일과 상호작용 하기 위해 파이썬 표준 함수인 `open()`을 사용하고 있습니다.
|
이 경우, 우리는 표준 파이썬 `open()` 함수를 사용하여 파일과 상호작용하고 있습니다.
|
||||||
|
|
||||||
따라서 디스크에 데이터를 쓰기 위해 "대기"가 필요한 I/O (입력/출력) 작업을 수행합니다.
|
따라서 I/O(입출력) 작업이 포함되어 있어 디스크에 기록되는 것을 "기다리는" 과정이 필요합니다.
|
||||||
|
|
||||||
그러나 `open()`은 `async`와 `await`을 사용하지 않기 때문에 이벤트 핸들러 함수는 `async def`가 아닌 표준 `def`로 선언하고 있습니다.
|
하지만 `open()`은 `async`와 `await`를 사용하지 않습니다.
|
||||||
|
|
||||||
|
그래서 우리는 이벤트 핸들러 함수를 `async def` 대신 일반 `def`로 선언합니다.
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
|
### `startup`과 `shutdown`을 함께 사용
|
||||||
|
|
||||||
|
*시작*과 *종료* 로직이 연결될 가능성이 높습니다. 예를 들어, 무언가를 시작한 후 끝내거나, 자원을 획득한 후 해제하는 등의 작업을 할 수 있습니다.
|
||||||
|
|
||||||
|
이러한 작업을 별도의 함수로 처리하면 서로 로직이나 변수를 공유하지 않기 때문에 더 어려워집니다. 값들을 전역 변수에 저장하거나 비슷한 트릭을 사용해야 할 수 있습니다.
|
||||||
|
|
||||||
|
그렇기 때문에 위에서 설명한 대로 `lifespan`을 사용하는 것이 권장됩니다.
|
||||||
|
|
||||||
|
## 기술적 세부사항
|
||||||
|
|
||||||
|
호기심 많은 분들을 위한 기술적인 세부사항입니다. 🤓
|
||||||
|
|
||||||
|
ASGI 기술 사양에 따르면, 이는 <a href="https://asgi.readthedocs.io/en/latest/specs/lifespan.html" class="external-link" target="_blank">Lifespan Protocol</a>의 일부이며, `startup`과 `shutdown`이라는 이벤트를 정의합니다.
|
||||||
|
|
||||||
/// info | 정보
|
/// info | 정보
|
||||||
|
|
||||||
이벤트 핸들러에 관한 내용은 <a href="https://www.starlette.io/events/" class="external-link" target="_blank">Starlette 이벤트 문서</a>에서 추가로 확인할 수 있습니다.
|
Starlette의 `lifespan` 핸들러에 대해 더 읽고 싶다면 <a href="https://www.starlette.io/lifespan/" class="external-link" target="_blank">Starlette의 Lifespan 문서</a>에서 확인할 수 있습니다.
|
||||||
|
|
||||||
|
이 문서에는 코드의 다른 영역에서 사용할 수 있는 lifespan 상태를 처리하는 방법도 포함되어 있습니다.
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
|
## 서브 애플리케이션
|
||||||
|
|
||||||
|
🚨 이 lifespan 이벤트(`startup`과 `shutdown`)는 메인 애플리케이션에 대해서만 실행되며, [서브 애플리케이션 - Mounts](sub-applications.md){.internal-link target=_blank}에는 실행되지 않음을 유의하세요.
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,67 @@
|
||||||
|
# 하위 응용프로그램 - 마운트
|
||||||
|
|
||||||
|
만약 각각의 독립적인 OpenAPI와 문서 UI를 갖는 두 개의 독립적인 FastAPI 응용프로그램이 필요하다면, 메인 어플리케이션에 하나 (또는 그 이상의) 하위-응용프로그램(들)을 “마운트"해서 사용할 수 있습니다.
|
||||||
|
|
||||||
|
## **FastAPI** 응용프로그램 마운트
|
||||||
|
|
||||||
|
“마운트"이란 완전히 “독립적인" 응용프로그램을 특정 경로에 추가하여 해당 하위 응용프로그램에서 선언된 *경로 동작*을 통해 해당 경로 아래에 있는 모든 작업들을 처리할 수 있도록 하는 것을 의미합니다.
|
||||||
|
|
||||||
|
### 최상단 응용프로그램
|
||||||
|
|
||||||
|
먼저, 메인, 최상단의 **FastAPI** 응용프로그램과 이것의 *경로 동작*을 생성합니다:
|
||||||
|
|
||||||
|
{* ../../docs_src/sub_applications/tutorial001.py hl[3, 6:8] *}
|
||||||
|
|
||||||
|
### 하위 응용프로그램
|
||||||
|
|
||||||
|
다음으로, 하위 응용프로그램과 이것의 *경로 동작*을 생성합니다:
|
||||||
|
|
||||||
|
이 하위 응용프로그램은 또 다른 표준 FastAPI 응용프로그램입니다. 다만 이것은 “마운트”될 것입니다:
|
||||||
|
|
||||||
|
{* ../../docs_src/sub_applications/tutorial001.py hl[11, 14:16] *}
|
||||||
|
|
||||||
|
### 하위 응용프로그램 마운트
|
||||||
|
|
||||||
|
최상단 응용프로그램, `app`에 하위 응용프로그램, `subapi`를 마운트합니다.
|
||||||
|
|
||||||
|
이 예시에서, 하위 응용프로그램션은 `/subapi` 경로에 마운트 될 것입니다:
|
||||||
|
|
||||||
|
{* ../../docs_src/sub_applications/tutorial001.py hl[11, 19] *}
|
||||||
|
|
||||||
|
### 자동으로 생성된 API 문서 확인
|
||||||
|
|
||||||
|
이제, `uvicorn`으로 메인 응용프로그램을 실행하십시오. 당신의 파일이 `main.py`라면, 이렇게 실행합니다:
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ uvicorn main:app --reload
|
||||||
|
|
||||||
|
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
그리고 <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>에서 문서를 여십시오.
|
||||||
|
|
||||||
|
메인 응용프로그램의 *경로 동작*만을 포함하는, 메인 응용프로그램에 대한 자동 API 문서를 확인할 수 있습니다:
|
||||||
|
|
||||||
|
<img src="https://fastapi.tiangolo.com//img/tutorial/sub-applications/image01.png">
|
||||||
|
|
||||||
|
다음으로, <a href="http://127.0.0.1:8000/subapi/docs" class="external-link" target="_blank">http://127.0.0.1:8000/subapi/docs</a>에서 하위 응용프로그램의 문서를 여십시오.
|
||||||
|
|
||||||
|
하위 경로 접두사 `/subapi` 아래에 선언된 *경로 동작* 을 포함하는, 하위 응용프로그램에 대한 자동 API 문서를 확인할 수 있습니다:
|
||||||
|
|
||||||
|
<img src="https://fastapi.tiangolo.com//img/tutorial/sub-applications/image02.png">
|
||||||
|
|
||||||
|
두 사용자 인터페이스 중 어느 하나를 사용해야하는 경우, 브라우저는 특정 응용프로그램 또는 하위 응용프로그램과 각각 통신할 수 있기 때문에 올바르게 동작할 것입니다.
|
||||||
|
|
||||||
|
### 기술적 세부사항: `root_path`
|
||||||
|
|
||||||
|
위에 설명된 것과 같이 하위 응용프로그램을 마운트하는 경우, FastAPI는 `root_path`라고 하는 ASGI 명세의 매커니즘을 사용하여 하위 응용프로그램에 대한 마운트 경로 통신을 처리합니다.
|
||||||
|
|
||||||
|
이를 통해, 하위 응용프로그램은 문서 UI를 위해 경로 접두사를 사용해야 한다는 사실을 인지합니다.
|
||||||
|
|
||||||
|
하위 응용프로그램에도 역시 다른 하위 응용프로그램을 마운트하는 것이 가능하며 FastAPI가 모든 `root_path` 들을 자동적으로 처리하기 때문에 모든 것은 올바르게 동작할 것입니다.
|
||||||
|
|
||||||
|
`root_path`와 이것을 사용하는 방법에 대해서는 [프록시의 뒷단](./behind-a-proxy.md){.internal-link target=_blank} 섹션에서 배울 수 있습니다.
|
||||||
|
|
@ -0,0 +1,223 @@
|
||||||
|
# 추가 모델
|
||||||
|
|
||||||
|
지난 예제에 이어서, 연관된 모델을 여러개 갖는 것은 흔한 일입니다.
|
||||||
|
|
||||||
|
특히 사용자 모델의 경우에 그러한데, 왜냐하면:
|
||||||
|
|
||||||
|
* **입력 모델** 은 비밀번호를 가져야 합니다.
|
||||||
|
* **출력 모델** 은 비밀번호를 가지면 안됩니다.
|
||||||
|
* **데이터베이스 모델** 은 해시처리된 비밀번호를 가질 것입니다.
|
||||||
|
|
||||||
|
/// danger | 위험
|
||||||
|
|
||||||
|
절대 사용자의 비밀번호를 평문으로 저장하지 마세요. 항상 이후에 검증 가능한 "안전한 해시(secure hash)"로 저장하세요.
|
||||||
|
|
||||||
|
만약 이게 무엇인지 모르겠다면, [security chapters](security/simple-oauth2.md#password-hashing){.internal-link target=_blank}.에서 비밀번호 해시에 대해 배울 수 있습니다.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## 다중 모델
|
||||||
|
|
||||||
|
아래는 비밀번호 필드와 해당 필드가 사용되는 위치를 포함하여, 각 모델들이 어떤 형태를 가질 수 있는지 전반적인 예시입니다:
|
||||||
|
|
||||||
|
{* ../../docs_src/extra_models/tutorial001_py310.py hl[7,9,14,20,22,27:28,31:33,38:39] *}
|
||||||
|
|
||||||
|
|
||||||
|
/// info | 정보
|
||||||
|
|
||||||
|
Pydantic v1에서는 해당 메서드가 `.dict()`로 불렸으며, Pydantic v2에서는 `.model_dump()`로 이름이 변경되었습니다. `.dict()`는 여전히 지원되지만 더 이상 권장되지 않습니다.
|
||||||
|
|
||||||
|
여기에서 사용하는 예제는 Pydantic v1과의 호환성을 위해 `.dict()`를 사용하지만, Pydantic v2를 사용할 수 있다면 `.model_dump()`를 사용하는 것이 좋습니다.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
### `**user_in.dict()` 에 대하여
|
||||||
|
|
||||||
|
#### Pydantic의 `.dict()`
|
||||||
|
|
||||||
|
`user_in`은 Pydantic 모델 클래스인 `UserIn`입니다.
|
||||||
|
|
||||||
|
Pydantic 모델은 모델 데이터를 포함한 `dict`를 반환하는 `.dict()` 메서드를 제공합니다.
|
||||||
|
|
||||||
|
따라서, 다음과 같이 Pydantic 객체 `user_in`을 생성할 수 있습니다:
|
||||||
|
|
||||||
|
```Python
|
||||||
|
user_in = UserIn(username="john", password="secret", email="john.doe@example.com")
|
||||||
|
```
|
||||||
|
|
||||||
|
그 다음, 다음과 같이 호출합니다:
|
||||||
|
|
||||||
|
```Python
|
||||||
|
user_dict = user_in.dict()
|
||||||
|
```
|
||||||
|
|
||||||
|
이제 변수 `user_dict`에 데이터가 포함된 `dict`를 가지게 됩니다(이는 Pydantic 모델 객체가 아닌 `dict`입니다).
|
||||||
|
|
||||||
|
그리고 다음과 같이 호출하면:
|
||||||
|
|
||||||
|
```Python
|
||||||
|
print(user_dict)
|
||||||
|
```
|
||||||
|
|
||||||
|
Python의 `dict`가 다음과 같이 출력됩니다:
|
||||||
|
|
||||||
|
```Python
|
||||||
|
{
|
||||||
|
'username': 'john',
|
||||||
|
'password': 'secret',
|
||||||
|
'email': 'john.doe@example.com',
|
||||||
|
'full_name': None,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `dict` 언패킹(Unpacking)
|
||||||
|
|
||||||
|
`user_dict`와 같은 `dict`를 함수(또는 클래스)에 `**user_dict`로 전달하면, Python은 이를 "언팩(unpack)"합니다. 이 과정에서 `user_dict`의 키와 값을 각각 키-값 인자로 직접 전달합니다.
|
||||||
|
|
||||||
|
따라서, 위에서 생성한 `user_dict`를 사용하여 다음과 같이 작성하면:
|
||||||
|
|
||||||
|
```Python
|
||||||
|
UserInDB(**user_dict)
|
||||||
|
```
|
||||||
|
|
||||||
|
다음과 같은 결과를 생성합니다:
|
||||||
|
|
||||||
|
```Python
|
||||||
|
UserInDB(
|
||||||
|
username="john",
|
||||||
|
password="secret",
|
||||||
|
email="john.doe@example.com",
|
||||||
|
full_name=None,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
혹은 더 정확히 말하자면, `user_dict`를 직접 사용하는 것은, 나중에 어떤 값이 추가되더라도 아래와 동일한 효과를 냅니다:
|
||||||
|
|
||||||
|
```Python
|
||||||
|
UserInDB(
|
||||||
|
username = user_dict["username"],
|
||||||
|
password = user_dict["password"],
|
||||||
|
email = user_dict["email"],
|
||||||
|
full_name = user_dict["full_name"],
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 다른 모델 데이터로 새 Pydantic 모델 생성
|
||||||
|
|
||||||
|
위의 예제에서 `user_in.dict()`로부터 `user_dict`를 생성한 것처럼, 아래 코드는:
|
||||||
|
|
||||||
|
```Python
|
||||||
|
user_dict = user_in.dict()
|
||||||
|
UserInDB(**user_dict)
|
||||||
|
```
|
||||||
|
|
||||||
|
다음과 동일합니다:
|
||||||
|
|
||||||
|
```Python
|
||||||
|
UserInDB(**user_in.dict())
|
||||||
|
```
|
||||||
|
|
||||||
|
...왜냐하면 `user_in.dict()`는 `dict`이며, 이를 `**`로 Python이 "언팩(unpack)"하도록 하여 `UserInDB`에 전달하기 때문입니다.
|
||||||
|
|
||||||
|
따라서, 다른 Pydantic 모델의 데이터를 사용하여 새로운 Pydantic 모델을 생성할 수 있습니다.
|
||||||
|
|
||||||
|
#### `dict` 언패킹(Unpacking)과 추가 키워드
|
||||||
|
|
||||||
|
그리고 다음과 같이 추가 키워드 인자 `hashed_password=hashed_password`를 추가하면:
|
||||||
|
|
||||||
|
```Python
|
||||||
|
UserInDB(**user_in.dict(), hashed_password=hashed_password)
|
||||||
|
```
|
||||||
|
|
||||||
|
다음과 같은 결과를 생성합니다:
|
||||||
|
|
||||||
|
```Python
|
||||||
|
UserInDB(
|
||||||
|
username = user_dict["username"],
|
||||||
|
password = user_dict["password"],
|
||||||
|
email = user_dict["email"],
|
||||||
|
full_name = user_dict["full_name"],
|
||||||
|
hashed_password = hashed_password,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
/// warning | 경고
|
||||||
|
|
||||||
|
추가적으로 제공된 함수 `fake_password_hasher`와 `fake_save_user`는 데이터 흐름을 시연하기 위한 예제일 뿐이며, 실제 보안을 제공하지 않습니다.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## 중복 줄이기
|
||||||
|
|
||||||
|
코드 중복을 줄이는 것은 **FastAPI**의 핵심 아이디어 중 하나입니다.
|
||||||
|
|
||||||
|
코드 중복은 버그, 보안 문제, 코드 비동기화 문제(한 곳은 업데이트되었지만 다른 곳은 업데이트되지 않는 문제) 등의 가능성을 증가시킵니다.
|
||||||
|
|
||||||
|
그리고 이 모델들은 많은 데이터를 공유하면서 속성 이름과 타입을 중복하고 있습니다.
|
||||||
|
|
||||||
|
더 나은 방법이 있습니다.
|
||||||
|
|
||||||
|
`UserBase` 모델을 선언하여 다른 모델들의 기본(base)으로 사용할 수 있습니다. 그런 다음 이 모델을 상속받아 속성과 타입 선언(유형 선언, 검증 등)을 상속하는 서브클래스를 만들 수 있습니다.
|
||||||
|
|
||||||
|
모든 데이터 변환, 검증, 문서화 등은 정상적으로 작동할 것입니다.
|
||||||
|
|
||||||
|
이렇게 하면 각 모델 간의 차이점만 선언할 수 있습니다(평문 `password`가 있는 경우, `hashed_password`만 있는 경우, 혹은 비밀번호가 없는 경우):
|
||||||
|
|
||||||
|
{* ../../docs_src/extra_models/tutorial002_py310.py hl[7,13:14,17:18,21:22] *}
|
||||||
|
|
||||||
|
## `Union` 또는 `anyOf`
|
||||||
|
|
||||||
|
두 가지 이상의 타입을 포함하는 `Union`으로 응답을 선언할 수 있습니다. 이는 응답이 그 중 하나의 타입일 수 있음을 의미합니다.
|
||||||
|
|
||||||
|
OpenAPI에서는 이를 `anyOf`로 정의합니다.
|
||||||
|
|
||||||
|
이를 위해 표준 Python 타입 힌트인 <a href="https://docs.python.org/3/library/typing.html#typing.Union" class="external-link" target="_blank">`typing.Union`</a>을 사용할 수 있습니다:
|
||||||
|
|
||||||
|
/// note | 참고
|
||||||
|
|
||||||
|
<a href="https://docs.pydantic.dev/latest/concepts/types/#unions" class="external-link" target="_blank">`Union`</a>을 정의할때는 더 구체적인 타입을 먼저 포함하고, 덜 구체적인 타입을 그 뒤에 나열해야합니다. 아래 예제에서는 `Union[PlaneItem, CarItem]` 를 보면, 더 구체적인 `PlaneItem`이 `CarItem`보다 앞에 위치합니다.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
{* ../../docs_src/extra_models/tutorial003_py310.py hl[1,14:15,18:20,33] *}
|
||||||
|
|
||||||
|
|
||||||
|
### Python 3.10에서 `Union`
|
||||||
|
|
||||||
|
위의 예제에서는 `response_model` 인자 값으로 `Union[PlaneItem, CarItem]`을 전달합니다.
|
||||||
|
|
||||||
|
이 경우, 이를 **타입 어노테이션(type annotation)** 이 아닌 **인자 값(argument value)** 으로 전달하고 있기 때문에 Python 3.10에서도 `Union`을 사용해야 합니다.
|
||||||
|
|
||||||
|
만약 타입 어노테이션에 사용한다면, 다음과 같이 수직 막대(|)를 사용할 수 있습니다:
|
||||||
|
|
||||||
|
```Python
|
||||||
|
some_variable: PlaneItem | CarItem
|
||||||
|
```
|
||||||
|
|
||||||
|
하지만 이를 `response_model=PlaneItem | CarItem`과 같이 할당하면 에러가 발생합니다. 이는 Python이 이를 타입 어노테이션으로 해석하지 않고, `PlaneItem`과 `CarItem` 사이의 **잘못된 연산(invalid operation)**을 시도하기 때문입니다
|
||||||
|
|
||||||
|
## 모델 리스트
|
||||||
|
|
||||||
|
마찬가지로, 객체 리스트 형태의 응답을 선언할 수도 있습니다.
|
||||||
|
|
||||||
|
이를 위해 표준 Python의 `typing.List`를 사용하세요(또는 Python 3.9 이상에서는 단순히 `list`를 사용할 수 있습니다):
|
||||||
|
|
||||||
|
{* ../../docs_src/extra_models/tutorial004_py39.py hl[18] *}
|
||||||
|
|
||||||
|
|
||||||
|
## 임의의 `dict` 응답
|
||||||
|
|
||||||
|
Pydantic 모델을 사용하지 않고, 키와 값의 타입만 선언하여 평범한 임의의 `dict`로 응답을 선언할 수도 있습니다.
|
||||||
|
|
||||||
|
이는 Pydantic 모델에 필요한 유효한 필드/속성 이름을 사전에 알 수 없는 경우에 유용합니다.
|
||||||
|
|
||||||
|
이 경우, `typing.Dict`를 사용할 수 있습니다(또는 Python 3.9 이상에서는 단순히 `dict`를 사용할 수 있습니다):
|
||||||
|
|
||||||
|
{* ../../docs_src/extra_models/tutorial005_py39.py hl[6] *}
|
||||||
|
|
||||||
|
|
||||||
|
## 요약
|
||||||
|
|
||||||
|
여러 Pydantic 모델을 사용하고, 각 경우에 맞게 자유롭게 상속하세요.
|
||||||
|
|
||||||
|
엔터티가 서로 다른 "상태"를 가져야 하는 경우, 엔터티당 단일 데이터 모델을 사용할 필요는 없습니다. 예를 들어, 사용자 "엔터티"가 `password`, `password_hash`, 또는 비밀번호가 없는 상태를 포함할 수 있는 경우처럼 말입니다.
|
||||||
|
|
@ -0,0 +1,846 @@
|
||||||
|
# 가상 환경
|
||||||
|
|
||||||
|
Python 프로젝트를 작업할 때는 **가상 환경** (또는 이와 유사한 도구)을 사용하는 것이 좋습니다. 각 프로젝트 마다 설치하는 패키지를 분리하여 관리할 수 있습니다.
|
||||||
|
|
||||||
|
/// info | 정보
|
||||||
|
|
||||||
|
이미 가상 환경에 대해 잘 알고 있다면, 이 섹션은 건너 뛰어도 괜찮습니다. 🤓
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
/// tip | 팁
|
||||||
|
|
||||||
|
**가상 환경(Virtual Environment)** 은 **환경 변수(Environment Variable)** 와 다릅니다.
|
||||||
|
|
||||||
|
**환경 변수**는 시스템에 존재하며, 프로그램이 사용할 수 있는 변수입니다.
|
||||||
|
|
||||||
|
**가상 환경**은 몇몇 파일로 구성된 하나의 디렉터리입니다.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
/// info | 정보
|
||||||
|
|
||||||
|
이 페이지에서는 **가상 환경**의 사용 방법과 작동 방식을 설명합니다.
|
||||||
|
|
||||||
|
만약 **모든 것을 관리해주는 도구** (Python 설치까지 포함)를 사용하고 싶다면 <a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">uv</a>를 사용해보세요.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## 프로젝트 생성
|
||||||
|
|
||||||
|
먼저, 프로젝트를 위한 디렉터리를 하나 생성합니다.
|
||||||
|
|
||||||
|
보통 사용자 홈 디렉터리 안에 `code`라는 디렉터리를 만들고, 그 안에 프로젝트마다 하나씩 디렉터리를 만들어 관리합니다.
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
// 홈 디렉터리로 이동
|
||||||
|
$ cd
|
||||||
|
// 모든 코드 프로젝트를 위한 디렉터리 생성
|
||||||
|
$ mkdir code
|
||||||
|
// code 디렉터리로 이동
|
||||||
|
$ cd code
|
||||||
|
// 이번 프로젝트를 위한 디렉터리 생성
|
||||||
|
$ mkdir awesome-project
|
||||||
|
// 해당 프로젝트 디렉터리로 이동
|
||||||
|
$ cd awesome-project
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## 가상 환경 생성
|
||||||
|
|
||||||
|
Python 프로젝트를 **처음 시작할 때**, 가상 환경을 **<abbr title="다른 방법들도 있지만, 이건 간단한 가이드라인입니다">프로젝트 내부</abbr>**에 생성합니다.
|
||||||
|
|
||||||
|
/// tip | 팁
|
||||||
|
|
||||||
|
이 작업은 **프로젝트를 처음 설정할 때 한번만** 해주면 됩니다. 이후 작업할 때 반복할 필요는 없습니다.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
//// tab | `venv`
|
||||||
|
|
||||||
|
Python 표준 라이브러리에 포함된 venv 모듈을 사용해 가상 환경을 생성할 수 있습니다.
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ python -m venv .venv
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
/// details | 명령어 상세 설명
|
||||||
|
|
||||||
|
* `python`: `python` 프로그램을 실행합니다.
|
||||||
|
* `-m`: 특정 모듈을 스크립트처럼 실행합니다. 대상 모듈을 바로 뒤에 지정합니다.
|
||||||
|
* `venv`: Python 표준 라이브러리에 포함된 `venv` 모듈을 실행합니다.
|
||||||
|
* `.venv`: 가상 환경을 `.venv` 디렉터리에 생성합니다.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
//// tab | `uv`
|
||||||
|
|
||||||
|
<a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a>가 설치되어 있다면, uv를 통해 가상 환경을 생성할 수 있습니다.
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ uv venv
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
/// tip | 팁
|
||||||
|
|
||||||
|
`uv`는 기본적으로 `.venv` 디렉터리에 가상 환경을 생성합니다.
|
||||||
|
|
||||||
|
별도로 디렉터리 이름을 추가 인자로 넘겨 주면 경로를 지정 할 수 있습니다.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
해당 명령어는 `.venv` 디렉터리에 새로운 가상 환경을 생성합니다.
|
||||||
|
|
||||||
|
/// details | `.venv` 또는 다른 이름
|
||||||
|
|
||||||
|
가상 환경을 다른 디렉터리에 생성할 수도 있지만, 관례적으로 `.venv` 디렉터리 이름을 사용합니다.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## 가상 환경 활성화
|
||||||
|
|
||||||
|
이후 실행하는 Python 명령어와 패키지 설치가 가상 환경을 따르도록, 가상 환경을 활성화하세요.
|
||||||
|
|
||||||
|
/// tip | 팁
|
||||||
|
|
||||||
|
**터미널을 새로 열고** 프로젝트 작업을 시작할 때는, **항상 이 작업을** 해주세요.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
//// tab | Linux, macOS
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ source .venv/bin/activate
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
//// tab | Windows PowerShell
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ .venv\Scripts\Activate.ps1
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
//// tab | Windows Bash
|
||||||
|
|
||||||
|
Windows에서 Bash(예: <a href="https://gitforwindows.org/" class="external-link" target="_blank">Git Bash</a>)를 사용하는 경우:
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ source .venv/Scripts/activate
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
/// tip | 팁
|
||||||
|
|
||||||
|
가상 환경에 새로운 패키지를 설치할 때마다, 해당 환경을 다시 활성화하세요.
|
||||||
|
|
||||||
|
이렇게 하면 해당 패키지로 설치된 **터미널(<abbr title="command line interface">CLI</abbr>) 프로그램**을 사용할 때, 전역에 설치된 다른 버전이 아니라, 가상 환경 안에 설치된 정확한 버전을 사용합니다.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## 가상 환경이 활성화 여부 확인
|
||||||
|
|
||||||
|
가상 환경이 활성화되었는지 확인합니다. (이전 명령어가 제대로 작동했는지 확인합니다).
|
||||||
|
|
||||||
|
/// tip | 팁
|
||||||
|
|
||||||
|
이 단계는 **선택 사항**이지만, 모든 것이 예상대로 작동하고 있는지, 그리고 의도한 가상 환경이 활성화 되었는 지 **확인**하는 좋은 방법입니다.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
//// tab | Linux, macOS, Windows Bash
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ which python
|
||||||
|
|
||||||
|
/home/user/code/awesome-project/.venv/bin/python
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
`python` 위치가 프로젝트 내부(이 예시에서는 `awesome-project`)의 `.venv/bin/python` 경로로 표시된다면 성공입니다. 🎉
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
//// tab | Windows PowerShell
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ Get-Command python
|
||||||
|
|
||||||
|
C:\Users\user\code\awesome-project\.venv\Scripts\python
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
`python` 위치가 프로젝트 내부(이 예시에서는 `awesome-project`)의 `.venv\bin\python` 경로로 표시된다면 성공입니다. 🎉
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
## pip 업그레이드
|
||||||
|
|
||||||
|
/// tip | 팁
|
||||||
|
|
||||||
|
<a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a>를 사용한다면, `pip` 대신 `uv`로 패키지를 설치하게 되므로 `pip`을 업그레이드할 필요가 없습니다. 😎
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
`pip`을 사용하여 패키지를 설치하는 경우 (Python 표준 라이브러리에 포함되어 있습니다), **최신 버전으로 업그레이드**하는 것이 좋습니다.
|
||||||
|
|
||||||
|
패키지 설치 중 발생하는 다양하고 특이한 에러들은 `pip` 업그레이드로 쉽게 해결되는 경우가 많습니다.
|
||||||
|
|
||||||
|
/// tip | 팁
|
||||||
|
|
||||||
|
이 작업은 보통 가상 환경을 생성한 **직후 한 번만** 하면 됩니다.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
가상 환경이 활성화된 상태인지 확인한 후(앞서 설명한 명령어 사용), 아래 명령어를 실행하세요:
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ python -m pip install --upgrade pip
|
||||||
|
|
||||||
|
---> 100%
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## `.gitignore` 추가하기
|
||||||
|
|
||||||
|
**Git**을 사용하고 있다면 (사용하는 것이 좋습니다), `.gitignore` 파일을 추가해서 `.venv` 디렉터리 전체를 Git에서 제외하세요.
|
||||||
|
|
||||||
|
/// tip | 팁
|
||||||
|
|
||||||
|
<a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a>를 사용해 가상 환경을 생성했다면, 이미 이 작업이 자동으로 처리되어 있으므로 이 단계는 건너뛰어도 됩니다. 😎
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
/// tip | 팁
|
||||||
|
|
||||||
|
이 작업도 마찬가지로, 가상 환경을 생성한 **직후 한 번만** 하면 됩니다.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ echo "*" > .venv/.gitignore
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
/// details | 명령어 상세 설명
|
||||||
|
|
||||||
|
* `echo "*"`: 터미널에 `*` 텍스트를 "출력"합니다 (다음 설명에서 조금 바뀝니다)
|
||||||
|
* `>`: 왼쪽 명령어의 출력 내용을 터미널에 출력하지 않고, 오른쪽에 지정된 파일로 **기록(write)** 하라는 의미입니다.
|
||||||
|
* `.gitignore`: 출력된 텍스트가 기록될 파일 이름입니다.
|
||||||
|
|
||||||
|
그리고 Git에서 `*`는 "모든 것"을 의미합니다. 따라서 `.venv` 디렉터리 안의 모든 것을 무시하게 됩니다.
|
||||||
|
|
||||||
|
이 명령어는 다음과 같은 내용을 가진 `.gitignore` 파일을 생성합니다:
|
||||||
|
|
||||||
|
|
||||||
|
```gitignore
|
||||||
|
*
|
||||||
|
```
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## 패키지 설치
|
||||||
|
|
||||||
|
가상 환경을 활성화한 후, 그 안에 필요한 패키지들을 설치할 수 있습니다.
|
||||||
|
|
||||||
|
/// tip | 팁
|
||||||
|
|
||||||
|
프로젝트에서 필요한 패키지를 설치하거나 업그레이드할 때는 이 작업을 **한 번만** 하면 됩니다.
|
||||||
|
|
||||||
|
만약 특정 패키지의 버전을 업그레이드하거나, 새로운 패키지를 추가할 필요가 생기면 **다시 이 작업을 반복**하면 됩니다.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
### 패키지 직접 설치
|
||||||
|
|
||||||
|
급하게 작업하거나, 프로젝트에 필요한 패키지 목록을 따로 파일로 관리하고 싶지 않은 경우, 패키지를 직접 설치할 수도 있습니다.
|
||||||
|
|
||||||
|
/// tip | 팁
|
||||||
|
|
||||||
|
패키지 이름과 버전 정보를 파일에 정리해두는 것(예: `requirements.txt` 또는 `pyproject.toml`)은 (매우) 좋은 생각입니다.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
//// tab | `pip`
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ pip install "fastapi[standard]"
|
||||||
|
|
||||||
|
---> 100%
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
//// tab | `uv`
|
||||||
|
|
||||||
|
<a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a>를 사용하는 경우:
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ uv pip install "fastapi[standard]"
|
||||||
|
---> 100%
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
### `requirements.txt`에서 설치
|
||||||
|
|
||||||
|
`requirements.txt` 파일이 있다면, 그 안에 명시된 패키지들을 한 번에 설치할 수 있습니다.
|
||||||
|
|
||||||
|
//// tab | `pip`
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ pip install -r requirements.txt
|
||||||
|
---> 100%
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
//// tab | `uv`
|
||||||
|
|
||||||
|
<a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a>를 사용하는 경우:
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ uv pip install -r requirements.txt
|
||||||
|
---> 100%
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
/// details | `requirements.txt`
|
||||||
|
|
||||||
|
다음은 몇 가지 패키지를 포함한 `requirements.txt`의 예시입니다:
|
||||||
|
|
||||||
|
```requirements.txt
|
||||||
|
fastapi[standard]==0.113.0
|
||||||
|
pydantic==2.8.0
|
||||||
|
```
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## 프로그램 실행
|
||||||
|
|
||||||
|
가상 환경을 활성화한 후에는 프로그램을 실행할 수 있습니다. 이때 해당 가상 환경에 설치된 Python과 패키지들이 사용됩니다.
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ python main.py
|
||||||
|
|
||||||
|
Hello World
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## 에디터 설정
|
||||||
|
|
||||||
|
에디터를 사용할 경우, 앞서 만든 가상 환경을 사용하도록 설정하는 것이 좋습니다. (대부분의 에디터는 자동으로 감지하기도 합니다.)
|
||||||
|
이렇게 하면 자동 완성 기능이나 코드 내 오류 표시 기능을 제대로 사용할 수 있습니다.
|
||||||
|
|
||||||
|
예시:
|
||||||
|
|
||||||
|
* <a href="https://code.visualstudio.com/docs/python/environments#_select-and-activate-an-environment" class="external-link" target="_blank">VS Code</a>
|
||||||
|
* <a href="https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html" class="external-link" target="_blank">PyCharm</a>
|
||||||
|
|
||||||
|
/// tip | 팁
|
||||||
|
|
||||||
|
이 설정은 보통 가상 환경을 **처음 만들었을 때 한 번만** 해주면 됩니다.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## 가상 환경 비활성화
|
||||||
|
|
||||||
|
프로젝트 작업이 끝났다면, 가상 환경을 **비활성화**할 수 있습니다.
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ deactivate
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
이렇게 하면 이후에 `python` 명령어를 실행했을 때, 가상 환경의 Python이나 그 안에 설치된 패키지들을 사용하지 않게 됩니다.
|
||||||
|
|
||||||
|
## 이제 작업할 준비가 되었습니다
|
||||||
|
|
||||||
|
이제 프로젝트 작업을 시작할 준비가 완료되었습니다.
|
||||||
|
|
||||||
|
|
||||||
|
/// tip | 팁
|
||||||
|
|
||||||
|
위 내용을 더 깊이 이해하고 싶으신가요?
|
||||||
|
|
||||||
|
그렇다면 계속 읽어 주세요. 👇🤓
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## 가상 환경을 왜 사용하는가
|
||||||
|
|
||||||
|
FastAPI를 사용하려면 먼저 <a href="https://www.python.org/" class="external-link" target="_blank">Python</a>을 설치해야 합니다.
|
||||||
|
|
||||||
|
그 후에는 FastAPI와 함께 사용할 **기타 패키지들**을 **설치**해야 합니다.
|
||||||
|
|
||||||
|
패키지를 설치할 때 보통 Python에 기본 포함된 `pip` 명령어(또는 유사한 도구)를 사용합니다.
|
||||||
|
|
||||||
|
하지만 `pip`을 그냥 직접 사용하면, 해당 패키지들은 **전역 Python 환경**(시스템 전체에 설치된 Python)에 설치됩니다.
|
||||||
|
|
||||||
|
### 문제점
|
||||||
|
|
||||||
|
그렇다면, 전역 Python 환경에 패키지를 설치하면 어떤 문제가 발생할까요?
|
||||||
|
|
||||||
|
어느 시점이 되면, **서로 다른 패키지들**에 의존하는 여러 개의 프로그램을 작성하게 될 것입니다. 그리고 이들 중 일부는 **같은 패키지의 서로 다른 버전**을 필요로 할 수 있습니다. 😱
|
||||||
|
|
||||||
|
예를 들어, `마법사의 돌(philosophers-stone)` 프로젝트를 만들었다고 가정해봅시다. 이 프로그램은 `해리 포터(harry)`라는 패키지의 `v1` 버전을 **의존**합니다. 따라서 `harry`를 설치해야 합니다.
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart LR
|
||||||
|
stone(philosophers-stone) -->|requires| harry-1[harry v1]
|
||||||
|
```
|
||||||
|
|
||||||
|
그런데 나중에 `아즈카반의 죄수(prisoner-of-azkaban)`이라는 또 다른 프로젝트를 만들게 되었고, 이 프로젝트도 역시 `harry` 패키지를 사용합니다. 그런데 이 프로젝트는 `harry`의 `v3` 버전이 필요합니다.
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart LR
|
||||||
|
azkaban(prisoner-of-azkaban) --> |requires| harry-3[harry v3]
|
||||||
|
```
|
||||||
|
|
||||||
|
하지만 이제 문제가 생깁니다. 로컬 가상 환경 대신에 전역 환경에 패키지를 설치하게 되면, 어떤 버전의 `harry`를 설치할지를 선택해야 하기 때문입니다.
|
||||||
|
|
||||||
|
예를 들어, `마법사의 돌(philosophers-stone)`을 실행하고 싶다면 먼저 `harry` `v1` 버전을 다음과 같이 설치 해야 합니다:
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ pip install "harry==1"
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
그러면 결국 전역 Python 환경에는 `harry` `v1`버전이 설치된 상태가 됩니다.
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart LR
|
||||||
|
subgraph global[global env]
|
||||||
|
harry-1[harry v1]
|
||||||
|
end
|
||||||
|
subgraph stone-project[philosophers-stone project]
|
||||||
|
stone(philosophers-stone) -->|requires| harry-1
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
하지만 이제 `아즈카반의 죄수(prisoner-of-azkaban)`을 실행하고 싶다면, `harry` `v1`버전을 제거하고 `harry` `v3`버전을 설치해야 합니다. (또는 단순히 `v3`버전을 설치하는 것만으로도 기존의 `v1`버전이 자동으로 제거됩니다.)
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ pip install "harry==3"
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
그렇게 하면 이제 전역 Python 환경에는 `harry` `v3`버전이 설치된 상태가 됩니다.
|
||||||
|
|
||||||
|
그리고 다시 `마법사의 돌(philosophers-stone)`을 실행하려고 하면, **작동하지** 않을 수 있습니다. 왜냐하면 이 프로그램은 `harry` `v1`버전을 필요로 하기 때문입니다.
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart LR
|
||||||
|
subgraph global[global env]
|
||||||
|
harry-1[<strike>harry v1</strike>]
|
||||||
|
style harry-1 fill:#ccc,stroke-dasharray: 5 5
|
||||||
|
harry-3[harry v3]
|
||||||
|
end
|
||||||
|
subgraph stone-project[philosophers-stone project]
|
||||||
|
stone(philosophers-stone) -.-x|⛔️| harry-1
|
||||||
|
end
|
||||||
|
subgraph azkaban-project[prisoner-of-azkaban project]
|
||||||
|
azkaban(prisoner-of-azkaban) --> |requires| harry-3
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
/// tip | 팁
|
||||||
|
|
||||||
|
Python 패키지들은 **새 버전**에서 **호환성 문제(breaking changes)**가 발생하지 않도록 최대한 노력하는 것이 일반적입니다. 하지만 그래도 안전하게 작업하려면, 테스트를 실행해보면서 새 버전을 의도적으로 설치하는 것이 좋습니다.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
이제, 이런 일이 여러분의 **모든 프로젝트**가 사용하는 **수많은 패키지들**에서 동시에 발생한다고 상상해보세요. 이는 매우 관리하기 어려우며, 결국 **서로 호환되지 않는 버전**의 패키지로 프로젝트를 실행하게 될 가능성이 높고, 그로 인해 어떤 문제가 왜 발생하는지 알 수 없게 될 수 있습니다.
|
||||||
|
|
||||||
|
또한 사용하는 운영체제(Linux, Windows, macOS 등)에 따라 Python이 **미리 설치되어 있을 수도** 있습니다. 이런 경우에는 운영체제의 동작에 필요한 특정 버전의 패키지들이 함께 설치되어 있을 수 있습니다. 이 상태에서 전역 Python 환경에 임의의 패키지를 설치하면, 운영체제에 포함된 프로그램 일부가 **깨질 위험**도 있습니다.
|
||||||
|
|
||||||
|
## 패키지들은 어디에 설치되는가
|
||||||
|
|
||||||
|
Python을 설치하면, 컴퓨터에 여러 디렉터리와 파일들이 생성됩니다.
|
||||||
|
|
||||||
|
이 중 일부 디렉터리는 사용자가 설치한 패키지들을 보관하는 역할을 합니다.
|
||||||
|
|
||||||
|
예를 들어, 아래 명령어를 실행하면:
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
// 지금 실행하지 않아도 됩니다, 그냥 예제일 뿐이에요 🤓
|
||||||
|
$ pip install "fastapi[standard]"
|
||||||
|
---> 100%
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
해당 명령어는 FastAPI 코드를 포함한 압축 파일을 다운로드합니다. 이 파일은 보통 <a href="https://pypi.org/project/fastapi/" class="external-link" target="_blank">PyPI</a>에서 받아옵니다.
|
||||||
|
|
||||||
|
또한 FastAPI가 의존하는 다른 패키지들도 함께 **다운로드**됩니다.
|
||||||
|
|
||||||
|
그리고 그 모든 파일들을 **압축 해제**한 뒤, 컴퓨터의 특정 디렉터리에 저장합니다.
|
||||||
|
|
||||||
|
기본적으로 이 파일들은 Python이 설치된 디렉터리 안, 즉 **전역 환경**에 내의 디렉터리에 저장됩니다.
|
||||||
|
|
||||||
|
## 가상 환경이란
|
||||||
|
|
||||||
|
전역 환경에 모든 패키지를 설치하면서 발생하는 문제에 대한 해결책은, 작업하는 **각 프로젝트마다 가상 환경**을 사용하는 것입니다.
|
||||||
|
|
||||||
|
가상 환경은 전역 환경과 매우 유사한 하나의 **디렉터리**이며, 그 안에 해당 프로젝트를 위한 패키지들을 설치할 수 있습니다.
|
||||||
|
|
||||||
|
이렇게 하면 각 프로젝트는 자체적인 가상 환경(`.venv` 디렉터리)을 가지게 되며, 그 안에 해당 프로젝트 전용 패키지들을 보유하게 됩니다.
|
||||||
|
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TB
|
||||||
|
subgraph stone-project[philosophers-stone project]
|
||||||
|
stone(philosophers-stone) --->|requires| harry-1
|
||||||
|
subgraph venv1[.venv]
|
||||||
|
harry-1[harry v1]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
subgraph azkaban-project[prisoner-of-azkaban project]
|
||||||
|
azkaban(prisoner-of-azkaban) --->|requires| harry-3
|
||||||
|
subgraph venv2[.venv]
|
||||||
|
harry-3[harry v3]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
stone-project ~~~ azkaban-project
|
||||||
|
```
|
||||||
|
|
||||||
|
## 가상 환경 활성화 의미
|
||||||
|
|
||||||
|
가상 환경을 활성화한다는 것은, 예를 들어 다음과 같은 명령어를 실행하는 것을 의미합니다:
|
||||||
|
|
||||||
|
//// tab | Linux, macOS
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ source .venv/bin/activate
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
//// tab | Windows PowerShell
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ .venv\Scripts\Activate.ps1
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
//// tab | Windows Bash
|
||||||
|
|
||||||
|
Windows에서 Bash(예: <a href="https://gitforwindows.org/" class="external-link" target="_blank">Git Bash</a>)를 사용하는 경우:
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ source .venv/Scripts/activate
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
이 명령어는 이후에 실행될 명령어에서 사용될 [환경 변수](environment-variables.md){.internal-link target=_blank} 몇 개를 생성하거나 수정합니다.
|
||||||
|
|
||||||
|
이 변수들 중 하나가 바로 `PATH` 변수입니다.
|
||||||
|
|
||||||
|
/// tip | 팁
|
||||||
|
|
||||||
|
`PATH` 환경 변수에 대해 더 알고 싶다면 [환경 변수 문서의 PATH 환경 변수 섹션](environment-variables.md#path-environment-variable){.internal-link target=_blank}을 참고하세요.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
가상 환경을 활성화하면, 가상 환경의 경로인 `.venv/bin` (Linux와 macOS) 또는 `.venv\Scripts`(Windows)를 `PATH` 환경 변수에 추가됩니다.
|
||||||
|
|
||||||
|
예를 들어, 가상 환경을 활성화하기 전의 `PATH` 변수는 다음과 같았다고 가정해봅시다:
|
||||||
|
|
||||||
|
//// tab | Linux, macOS
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
```
|
||||||
|
|
||||||
|
시스템은 다음 경로들에서 프로그램을 찾게 됩니다:
|
||||||
|
|
||||||
|
* `/usr/bin`
|
||||||
|
* `/bin`
|
||||||
|
* `/usr/sbin`
|
||||||
|
* `/sbin`
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
//// tab | Windows
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
C:\Windows\System32
|
||||||
|
```
|
||||||
|
|
||||||
|
시스템은 다음 경로들에서 프로그램을 찾게 됩니다:
|
||||||
|
|
||||||
|
* `C:\Windows\System32`
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
가상 환경을 활성화한 후에는, `PATH` 변수는 다음과 같은 형태가 됩니다:
|
||||||
|
|
||||||
|
//// tab | Linux, macOS
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
/home/user/code/awesome-project/.venv/bin:/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
```
|
||||||
|
|
||||||
|
시스템은 가장 먼저 다음 경로에서 프로그램을 찾기 시작합니다:
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
/home/user/code/awesome-project/.venv/bin
|
||||||
|
```
|
||||||
|
|
||||||
|
그 후에 다른 디렉터리들을 탐색합니다.
|
||||||
|
|
||||||
|
따라서 터미널에 `python`을 입력하면, 시스템은 다음 위치에 있는 Python 프로그램을 찾게 됩니다:
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
/home/user/code/awesome-project/.venv/bin/python
|
||||||
|
```
|
||||||
|
|
||||||
|
그리고 해당 Python을 사용하게 됩니다.
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
//// tab | Windows
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
C:\Users\user\code\awesome-project\.venv\Scripts;C:\Windows\System32
|
||||||
|
```
|
||||||
|
|
||||||
|
시스템은 가장 먼저 다음 경로에서 프로그램을 찾기 시작합니다:
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
C:\Users\user\code\awesome-project\.venv\Scripts
|
||||||
|
```
|
||||||
|
|
||||||
|
그 후에 다른 디렉터리들을 탐색합니다.
|
||||||
|
|
||||||
|
따라서 터미널에 `python`을 입력하면, 시스템은 다음 경로에 있는 Python 프로그램을 찾게 됩니다:
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
C:\Users\user\code\awesome-project\.venv\Scripts\python
|
||||||
|
```
|
||||||
|
|
||||||
|
그리고 해당 Python을 사용하게 됩니다.
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
중요한 세부 사항 중 하나는, 가상 환경의 경로가 `PATH` 변수의 가장 **앞**에 추가된다는 점입니다. 시스템은 사용 가능한 다른 Python들보다 **먼저** 이 경로를 찾습니다. 그래서 터미널에서 `python`을 실행하면, 전역 환경의 Python이 아닌 **가상 환경에 있는** Python이 사용됩니다. (예: 전역 환경에 설치된 `python`이 있더라도 그보다 우선합니다.)
|
||||||
|
|
||||||
|
가상 환경을 활성화하면 이 외에도 몇 가지 다른 것들이 변경되지만, 이는 그중에서도 가장 중요한 변화 중 하나입니다.
|
||||||
|
|
||||||
|
## 가상 환경 확인하기
|
||||||
|
|
||||||
|
가상 환경이 활성화 되었는지 확인하려면, 아래 명령어를 사용할 수 있습니다:
|
||||||
|
|
||||||
|
//// tab | Linux, macOS, Windows Bash
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ which python
|
||||||
|
|
||||||
|
/home/user/code/awesome-project/.venv/bin/python
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
//// tab | Windows PowerShell
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ Get-Command python
|
||||||
|
|
||||||
|
C:\Users\user\code\awesome-project\.venv\Scripts\python
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
즉, 현재 사용되는 `python` 프로그램은 **가상 환경 내부에 있는 것**입니다.
|
||||||
|
|
||||||
|
Linux와 macOS에서는 `which`, Windows PowerShell에서는 `Get-Command` 명령어를 사용합니다.
|
||||||
|
|
||||||
|
이 명령어는 `PATH` 환경 변수에 지정된 경로들을 **순서대로 탐색**하면서 `python`이라는 이름의 프로그램을 찾습니다.
|
||||||
|
찾는 즉시, 해당 프로그램의 **경로를 출력**합니다.
|
||||||
|
|
||||||
|
중요한 점은 터미널에서 `python`을 실행했을 때, 실제로 실행되는 "`python`"이 어떤 것인지 정확히 알 수 있다는 것입니다.
|
||||||
|
|
||||||
|
따라서 현재 올바른 가상 환경에 있는지 확인할 수 있습니다.
|
||||||
|
|
||||||
|
/// tip | 팁
|
||||||
|
|
||||||
|
하나의 가상 환경을 활성화한 뒤, 해당 Python을 가진 상태에서 **또 다른 프로젝트**로 이동하는 것은 흔히 발생합니다.
|
||||||
|
|
||||||
|
하지만 이때 이전 프로젝트의 가상 환경에 있는 **잘못된 Python 실행 파일**을 사용하게 되어 새 프로젝트가 **정상 작동하지 않을 수 있습니다.**
|
||||||
|
|
||||||
|
그래서 현재 어떤 `python`이 사용되고 있는지 확인할 수 있는 능력은 매우 유용합니다. 🤓
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## 가상 환경을 비활성화하는 이유
|
||||||
|
|
||||||
|
예를 들어 `마법사의 돌(philosophers-stone)`이라는 프로젝트에서 작업 중이라고 해보겠습니다. 이때 해당 **가상 환경을 활성화**하고, 필요한 패키지를 설치하며 작업을 진행합니다.
|
||||||
|
|
||||||
|
그런데 이제는 **다른 프로젝트**인 `아즈카반의 죄수(prisoner-of-azkaban)`을 작업하고 싶어졌습니다.
|
||||||
|
|
||||||
|
그래서 그 프로젝트 디렉터리로 이동합니다:
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ cd ~/code/prisoner-of-azkaban
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
만약 `마법사의 돌(philosophers-stone)`의 가상 환경을 비활성화하지 않았다면, 터미널에서 `python`을 실행할 때 여전히 `마법사의 돌(philosophers-stone)` 가상 환경의 Python을 사용하게 됩니다.
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ cd ~/code/prisoner-of-azkaban
|
||||||
|
|
||||||
|
$ python main.py
|
||||||
|
|
||||||
|
// sirius를 임포트하는 데 실패했습니다. 설치되어 있지 않아요 😱
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "main.py", line 1, in <module>
|
||||||
|
import sirius
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
하지만 `마법사의 돌(philosophers-stone)`의 가상 환경을 비활성화한 다음, `아즈카반의 죄수(prisoner-of-azkaban)` 프로젝트의 가상 환경을 활성화하면, 이제 `python` 명령어는 `아즈카반의 죄수(prisoner-of-azkaban)` 가상 환경의 Python을 사용하게 됩니다.
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ cd ~/code/prisoner-of-azkaban
|
||||||
|
|
||||||
|
// 이전 디렉터리에 있을 필요 없이, 어디서든 가상 환경을 비활성화할 수 있습니다. 다른 프로젝트 디렉터리로 이동한 후에도 괜찮아요 😎
|
||||||
|
$ deactivate
|
||||||
|
|
||||||
|
// prisoner-of-azkaban/.venv 가상 환경을 활성화합니다 🚀
|
||||||
|
$ source .venv/bin/activate
|
||||||
|
|
||||||
|
// 이제 python을 실행하면, 이 가상 환경에 설치된 sirius 패키지를 찾게 됩니다 ✨
|
||||||
|
$ python main.py
|
||||||
|
|
||||||
|
못된 짓을 꾸미고 있음을 엄숙히 맹세합니다.🧙
|
||||||
|
ImportError는 이제 없습니다. 🐺
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## 대안들
|
||||||
|
|
||||||
|
이 문서는 여러분이 Python 프로젝트를 시작하고, **그 내부에서** 어떻게 돌아가는지 알려주는 간단한 가이드입니다.
|
||||||
|
|
||||||
|
가상 환경, 패키지 의존성(Requirements), 프로젝트를 관리하는 방법에는 이 외에도 다양한 **대안**들이 존재합니다.
|
||||||
|
|
||||||
|
만약 준비가 되었다면, **프로젝트 전체**, 패키지 의존성, 가상 환경 등을 통합적으로 **관리**할 수 있는 도구를 써보는 것도 좋습니다. 그럴 때 추천하는 도구가 바로 <a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">uv</a>입니다.
|
||||||
|
|
||||||
|
`uv`는 다양한 기능을 지원합니다:
|
||||||
|
|
||||||
|
* 다양한 버전의 **Python 설치**
|
||||||
|
* 각 프로젝트 별 **가상 환경 관리**
|
||||||
|
* **패키지 설치**
|
||||||
|
* 프로젝트의 **의존성과 버전** 관리
|
||||||
|
* 설치된 패키지들과 그 버전을 **정확히 고정(lock)**해서,개발 환경과 운영 환경이 완전히 동일하게 작동할 수 있도록 보장
|
||||||
|
* 이 외에도 다양한 기능을 지원
|
||||||
|
|
||||||
|
## 결론
|
||||||
|
|
||||||
|
여기까지 모두 읽고 이해했다면, 이제 많은 개발자들보다 가상 환경을 **훨씬 더 깊이 있게 이해**하게 되셨습니다. 🤓
|
||||||
|
|
||||||
|
이런 세부적인 내용을 알고 있으면, 언젠가 복잡해 보이는 문제를 디버깅할 때 분명히 큰 도움이 될 것입니다. 이제는 **이 모든 것들이 내부에서 어떻게 작동하는지** 알고 있기 때문입니다. 😎
|
||||||
|
|
@ -22,7 +22,7 @@ E isso mostra o verdadeiro compromisso deles com o FastAPI e sua **comunidade**
|
||||||
|
|
||||||
Por exemplo, você pode querer experimentar:
|
Por exemplo, você pode querer experimentar:
|
||||||
|
|
||||||
* <a href="https://speakeasy.com/?utm_source=fastapi+repo&utm_medium=github+sponsorship" class="external-link" target="_blank">Speakeasy</a>
|
* <a href="https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship" class="external-link" target="_blank">Speakeasy</a>
|
||||||
* <a href="https://www.stainlessapi.com/?utm_source=fastapi&utm_medium=referral" class="external-link" target="_blank">Stainless</a>
|
* <a href="https://www.stainlessapi.com/?utm_source=fastapi&utm_medium=referral" class="external-link" target="_blank">Stainless</a>
|
||||||
* <a href="https://developers.liblab.com/tutorials/sdk-for-fastapi/?utm_source=fastapi" class="external-link" target="_blank">liblab</a>
|
* <a href="https://developers.liblab.com/tutorials/sdk-for-fastapi/?utm_source=fastapi" class="external-link" target="_blank">liblab</a>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -216,7 +216,7 @@ Este Processo de Gerenciador provavelmente seria o que escutaria na **porta** no
|
||||||
|
|
||||||
Esses processos de trabalho seriam aqueles que executariam seu aplicativo, eles executariam os cálculos principais para receber uma **solicitação** e retornar uma **resposta**, e carregariam qualquer coisa que você colocasse em variáveis na RAM.
|
Esses processos de trabalho seriam aqueles que executariam seu aplicativo, eles executariam os cálculos principais para receber uma **solicitação** e retornar uma **resposta**, e carregariam qualquer coisa que você colocasse em variáveis na RAM.
|
||||||
|
|
||||||
<img src="/img/deployment/concepts/process-ram.svg">
|
<img src="/img/deployment/concepts/process-ram.drawio.svg">
|
||||||
|
|
||||||
E, claro, a mesma máquina provavelmente teria **outros processos** em execução, além do seu aplicativo.
|
E, claro, a mesma máquina provavelmente teria **outros processos** em execução, além do seu aplicativo.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,7 @@ Primeiro, o navegador iria verificar com os **servidores DNS** qual o **IP do do
|
||||||
|
|
||||||
Os servidores DNS iriam informar o navegador para utilizar algum **endereço IP** específico. Esse seria o endereço IP público em uso no seu servidor, que você configurou nos servidores DNS.
|
Os servidores DNS iriam informar o navegador para utilizar algum **endereço IP** específico. Esse seria o endereço IP público em uso no seu servidor, que você configurou nos servidores DNS.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https01.svg">
|
<img src="/img/deployment/https/https01.drawio.svg">
|
||||||
|
|
||||||
### Início do Handshake TLS
|
### Início do Handshake TLS
|
||||||
|
|
||||||
|
|
@ -93,7 +93,7 @@ O navegador então irá comunicar-se com esse endereço IP na **porta 443** (a p
|
||||||
|
|
||||||
A primeira parte dessa comunicação é apenas para estabelecer a conexão entre o cliente e o servidor e para decidir as chaves criptográficas a serem utilizadas, etc.
|
A primeira parte dessa comunicação é apenas para estabelecer a conexão entre o cliente e o servidor e para decidir as chaves criptográficas a serem utilizadas, etc.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https02.svg">
|
<img src="/img/deployment/https/https02.drawio.svg">
|
||||||
|
|
||||||
Esse interação entre o cliente e o servidor para estabelecer uma conexão TLS é chamada de **Handshake TLS**.
|
Esse interação entre o cliente e o servidor para estabelecer uma conexão TLS é chamada de **Handshake TLS**.
|
||||||
|
|
||||||
|
|
@ -111,7 +111,7 @@ Utilizando a **extensão SNI** discutida acima, o Proxy de Terminação TLS iria
|
||||||
|
|
||||||
Nesse caso, ele usaria o certificado para `someapp.example.com`.
|
Nesse caso, ele usaria o certificado para `someapp.example.com`.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https03.svg">
|
<img src="/img/deployment/https/https03.drawio.svg">
|
||||||
|
|
||||||
O cliente já **confia** na entidade que gerou o certificado TLS (nesse caso, o Let's Encrypt, mas veremos sobre isso mais tarde), então ele pode **verificar** que o certificado é válido.
|
O cliente já **confia** na entidade que gerou o certificado TLS (nesse caso, o Let's Encrypt, mas veremos sobre isso mais tarde), então ele pode **verificar** que o certificado é válido.
|
||||||
|
|
||||||
|
|
@ -133,19 +133,19 @@ Agora que o cliente e servidor (especialmente o navegador e o Proxy de Terminaç
|
||||||
|
|
||||||
Então, o cliente envia uma **solicitação HTTPS**. Que é apenas uma solicitação HTTP sobre uma conexão TLS encriptada.
|
Então, o cliente envia uma **solicitação HTTPS**. Que é apenas uma solicitação HTTP sobre uma conexão TLS encriptada.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https04.svg">
|
<img src="/img/deployment/https/https04.drawio.svg">
|
||||||
|
|
||||||
### Desencriptando a Solicitação
|
### Desencriptando a Solicitação
|
||||||
|
|
||||||
O Proxy de Terminação TLS então usaria a encriptação combinada para **desencriptar a solicitação**, e transmitiria a **solicitação básica (desencriptada)** para o processo executando a aplicação (por exemplo, um processo com Uvicorn executando a aplicação FastAPI).
|
O Proxy de Terminação TLS então usaria a encriptação combinada para **desencriptar a solicitação**, e transmitiria a **solicitação básica (desencriptada)** para o processo executando a aplicação (por exemplo, um processo com Uvicorn executando a aplicação FastAPI).
|
||||||
|
|
||||||
<img src="/img/deployment/https/https05.svg">
|
<img src="/img/deployment/https/https05.drawio.svg">
|
||||||
|
|
||||||
### Resposta HTTP
|
### Resposta HTTP
|
||||||
|
|
||||||
A aplicação processaria a solicitação e retornaria uma **resposta HTTP básica (não encriptada)** para o Proxy de Terminação TLS.
|
A aplicação processaria a solicitação e retornaria uma **resposta HTTP básica (não encriptada)** para o Proxy de Terminação TLS.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https06.svg">
|
<img src="/img/deployment/https/https06.drawio.svg">
|
||||||
|
|
||||||
### Resposta HTTPS
|
### Resposta HTTPS
|
||||||
|
|
||||||
|
|
@ -153,7 +153,7 @@ O Proxy de Terminação TLS iria **encriptar a resposta** utilizando a criptogra
|
||||||
|
|
||||||
No próximo passo, o navegador verifica que a resposta é válida e encriptada com a chave criptográfica correta, etc. E depois **desencripta a resposta** e a processa.
|
No próximo passo, o navegador verifica que a resposta é válida e encriptada com a chave criptográfica correta, etc. E depois **desencripta a resposta** e a processa.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https07.svg">
|
<img src="/img/deployment/https/https07.drawio.svg">
|
||||||
|
|
||||||
O cliente (navegador) saberá que a resposta vem do servidor correto por que ela usa a criptografia que foi combinada entre eles usando o **certificado HTTPS** anterior.
|
O cliente (navegador) saberá que a resposta vem do servidor correto por que ela usa a criptografia que foi combinada entre eles usando o **certificado HTTPS** anterior.
|
||||||
|
|
||||||
|
|
@ -163,7 +163,7 @@ Podem existir **múltiplas aplicações** em execução no mesmo servidor (ou se
|
||||||
|
|
||||||
Apenas um processo pode estar vinculado a um IP e porta (o Proxy de Terminação TLS, por exemplo), mas outras aplicações/processos também podem estar em execução no(s) servidor(es), desde que não tentem usar a mesma **combinação de IP público e porta**.
|
Apenas um processo pode estar vinculado a um IP e porta (o Proxy de Terminação TLS, por exemplo), mas outras aplicações/processos também podem estar em execução no(s) servidor(es), desde que não tentem usar a mesma **combinação de IP público e porta**.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https08.svg">
|
<img src="/img/deployment/https/https08.drawio.svg">
|
||||||
|
|
||||||
Dessa forma, o Proxy de Terminação TLS pode gerenciar o HTTPS e os certificados de **múltiplos domínios**, para múltiplas aplicações, e então transmitir as requisições para a aplicação correta em cada caso.
|
Dessa forma, o Proxy de Terminação TLS pode gerenciar o HTTPS e os certificados de **múltiplos domínios**, para múltiplas aplicações, e então transmitir as requisições para a aplicação correta em cada caso.
|
||||||
|
|
||||||
|
|
@ -173,7 +173,7 @@ Em algum momento futuro, cada certificado irá **expirar** (aproximadamente 3 me
|
||||||
|
|
||||||
E então, haverá outro programa (em alguns casos pode ser o próprio Proxy de Terminação TLS) que irá interagir com o Let's Encrypt e renovar o(s) certificado(s).
|
E então, haverá outro programa (em alguns casos pode ser o próprio Proxy de Terminação TLS) que irá interagir com o Let's Encrypt e renovar o(s) certificado(s).
|
||||||
|
|
||||||
<img src="/img/deployment/https/https.svg">
|
<img src="/img/deployment/https/https.drawio.svg">
|
||||||
|
|
||||||
Os **certificados TLS** são **associados com um nome de domínio**, e não a um endereço IP.
|
Os **certificados TLS** são **associados com um nome de domínio**, e não a um endereço IP.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ from app.routers import items
|
||||||
* Há também um subdiretório `app/internal/` com outro arquivo `__init__.py`, então ele é outro "subpacote Python":`app.internal`.
|
* Há também um subdiretório `app/internal/` com outro arquivo `__init__.py`, então ele é outro "subpacote Python":`app.internal`.
|
||||||
* E o arquivo `app/internal/admin.py` é outro submódulo: `app.internal.admin`.
|
* E o arquivo `app/internal/admin.py` é outro submódulo: `app.internal.admin`.
|
||||||
|
|
||||||
<img src="/img/tutorial/bigger-applications/package.svg">
|
<img src="/img/tutorial/bigger-applications/package.drawio.svg">
|
||||||
|
|
||||||
A mesma estrutura de arquivos com comentários:
|
A mesma estrutura de arquivos com comentários:
|
||||||
|
|
||||||
|
|
@ -270,7 +270,7 @@ Mas esse arquivo não existe, nossas dependências estão em um arquivo em `app/
|
||||||
|
|
||||||
Lembre-se de como nossa estrutura app/file se parece:
|
Lembre-se de como nossa estrutura app/file se parece:
|
||||||
|
|
||||||
<img src="/img/tutorial/bigger-applications/package.svg">
|
<img src="/img/tutorial/bigger-applications/package.drawio.svg">
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
# Дополнительные статус коды
|
||||||
|
|
||||||
|
По умолчанию **FastAPI** возвращает ответы, используя `JSONResponse`, помещая содержимое, которое вы возвращаете из вашей *операции пути*, внутрь этого `JSONResponse`.
|
||||||
|
|
||||||
|
Он будет использовать код статуса по умолчанию или тот, который вы укажете в вашей *операции пути*.
|
||||||
|
|
||||||
|
## Дополнительные статус коды
|
||||||
|
|
||||||
|
Если вы хотите возвращать дополнительный статус код помимо основного, вы можете сделать это, возвращая объект `Response` напрямую, как `JSONResponse`, и устанавливая нужный статус код напрямую.
|
||||||
|
|
||||||
|
Например, скажем, вы хотите создать *операцию пути*, которая позволяет обновлять элементы и возвращает HTTP-код 200 "OK" при успешном выполнении.
|
||||||
|
|
||||||
|
Но вы также хотите, чтобы она принимала новые элементы. И если элемент ранее не существовал, он создаётся, и возвращался HTTP-код 201 "Created".
|
||||||
|
|
||||||
|
Чтобы реализовать это, импортируйте `JSONResponse` и возвращайте ваш контент напрямую, устанавливая нужный `status_code`:
|
||||||
|
|
||||||
|
{* ../../docs_src/additional_status_codes/tutorial001_an_py310.py hl[4,25] *}
|
||||||
|
|
||||||
|
/// warning | Внимание
|
||||||
|
|
||||||
|
Когда вы возвращаете объект `Response` напрямую, как в примере выше, он будет возвращён как есть.
|
||||||
|
|
||||||
|
Он не будет сериализован при помощи модели и т.д.
|
||||||
|
|
||||||
|
Убедитесь, что в нём содержатся именно те данные, которые вы хотите, и что значения являются валидным JSON (если вы используете `JSONResponse`).
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
/// note | Технические детали
|
||||||
|
|
||||||
|
Вы также можете использовать `from starlette.responses import JSONResponse`.
|
||||||
|
|
||||||
|
**FastAPI** предоставляет тот же `starlette.responses` через `fastapi.responses` просто для вашего удобства, как разработчика. Но большинство доступных Response-классов поступают напрямую из Starlette. То же самое касается и `status`.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## OpenAPI и документация API
|
||||||
|
|
||||||
|
Если вы возвращаете дополнительные коды статусов и ответы напрямую, они не будут включены в схему OpenAPI (документацию API), потому что FastAPI не может заранее знать, что вы собираетесь вернуть.
|
||||||
|
|
||||||
|
Но вы можете задокументировать это в вашем коде, используя: [Дополнительные ответы в OpenAPI](additional-responses.md){.internal-link target=_blank}.
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
# Расширенное руководство пользователя
|
||||||
|
|
||||||
|
## Дополнительные возможности
|
||||||
|
|
||||||
|
Основное [Учебник - Руководство пользователя](../tutorial/index.md){.internal-link target=_blank} должно быть достаточно, чтобы познакомить вас со всеми основными функциями **FastAPI**.
|
||||||
|
|
||||||
|
В следующих разделах вы увидите другие варианты, конфигурации и дополнительные возможности.
|
||||||
|
|
||||||
|
/// tip
|
||||||
|
|
||||||
|
Следующие разделы **не обязательно являются "продвинутыми"**.
|
||||||
|
|
||||||
|
И вполне возможно, что для вашего случая использования решение находится в одном из них.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## Сначала прочитайте Учебник - Руководство пользователя
|
||||||
|
|
||||||
|
Вы все еще можете использовать большинство функций **FastAPI** со знаниями из [Учебник - Руководство пользователя](../tutorial/index.md){.internal-link target=_blank}.
|
||||||
|
|
||||||
|
И следующие разделы предполагают, что вы уже прочитали его, и предполагают, что вы знаете эти основные идеи.
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
# Response - Изменение cтатус кода
|
||||||
|
|
||||||
|
Вы, вероятно, уже читали о том, что можно установить [Состояние ответа по умолчанию](../tutorial/response-status-code.md){.internal-link target=_blank}.
|
||||||
|
|
||||||
|
Но в некоторых случаях вам нужно вернуть код состояния, отличный от установленного по умолчанию.
|
||||||
|
|
||||||
|
## Пример использования
|
||||||
|
|
||||||
|
Например, представьте, что вы хотите возвращать HTTP код состояния "OK" `200` по умолчанию.
|
||||||
|
|
||||||
|
Но если данные не существовали, вы хотите создать их и вернуть HTTP код состояния "CREATED" `201`.
|
||||||
|
|
||||||
|
При этом вы всё ещё хотите иметь возможность фильтровать и преобразовывать возвращаемые данные с помощью `response_model`.
|
||||||
|
|
||||||
|
Для таких случаев вы можете использовать параметр `Response`.
|
||||||
|
|
||||||
|
## Использование параметра `Response`
|
||||||
|
|
||||||
|
Вы можете объявить параметр типа `Response` в вашей *функции обработки пути* (так же как для cookies и headers).
|
||||||
|
|
||||||
|
И затем вы можете установить `status_code` в этом *временном* объекте ответа.
|
||||||
|
|
||||||
|
{* ../../docs_src/response_change_status_code/tutorial001.py hl[1,9,12] *}
|
||||||
|
|
||||||
|
После этого вы можете вернуть любой объект, который вам нужен, как обычно (`dict`, модель базы данных и т.д.).
|
||||||
|
|
||||||
|
И если вы объявили `response_model`, он всё равно будет использоваться для фильтрации и преобразования возвращаемого объекта.
|
||||||
|
|
||||||
|
**FastAPI** будет использовать этот *временный* ответ для извлечения кода состояния (а также cookies и headers) и поместит их в финальный ответ, который содержит возвращаемое вами значение, отфильтрованное любым `response_model`.
|
||||||
|
|
||||||
|
Вы также можете объявить параметр `Response` в зависимостях и установить код состояния в них. Но помните, что последнее установленное значение будет иметь приоритет.
|
||||||
|
|
@ -0,0 +1,65 @@
|
||||||
|
# Возврат ответа напрямую
|
||||||
|
|
||||||
|
Когда вы создаёте **FastAPI** *операцию пути*, вы можете возвращать из неё любые данные: `dict`, `list`, Pydantic-модель, модель базы данных и т.д.
|
||||||
|
|
||||||
|
По умолчанию **FastAPI** автоматически преобразует возвращаемое значение в JSON с помощью `jsonable_encoder`, как описано в [JSON кодировщик](../tutorial/encoder.md){.internal-link target=_blank}.
|
||||||
|
|
||||||
|
Затем "под капотом" эти данные, совместимые с JSON (например `dict`), помещаются в `JSONResponse`, который используется для отправки ответа клиенту.
|
||||||
|
|
||||||
|
Но вы можете возвращать `JSONResponse` напрямую из ваших *операций пути*.
|
||||||
|
|
||||||
|
Это может быть полезно, например, если нужно вернуть пользовательские заголовки или куки.
|
||||||
|
|
||||||
|
## Возврат `Response`
|
||||||
|
|
||||||
|
На самом деле, вы можете возвращать любой объект `Response` или его подкласс.
|
||||||
|
|
||||||
|
/// tip | Подсказка
|
||||||
|
|
||||||
|
`JSONResponse` сам по себе является подклассом `Response`.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
И когда вы возвращаете `Response`, **FastAPI** передаст его напрямую.
|
||||||
|
|
||||||
|
Это не приведет к преобразованию данных с помощью Pydantic-моделей, содержимое не будет преобразовано в какой-либо тип и т.д.
|
||||||
|
|
||||||
|
Это даёт вам большую гибкость. Вы можете возвращать любые типы данных, переопределять любые объявления или валидацию данных и т.д.
|
||||||
|
|
||||||
|
## Использование `jsonable_encoder` в `Response`
|
||||||
|
|
||||||
|
Поскольку **FastAPI** не изменяет объект `Response`, который вы возвращаете, вы должны убедиться, что его содержимое готово к отправке.
|
||||||
|
|
||||||
|
Например, вы не можете поместить Pydantic-модель в `JSONResponse`, не преобразовав её сначала в `dict` с помощью преобразования всех типов данных (таких как `datetime`, `UUID` и т.д.) в совместимые с JSON типы.
|
||||||
|
|
||||||
|
В таких случаях вы можете использовать `jsonable_encoder` для преобразования данных перед передачей их в ответ:
|
||||||
|
|
||||||
|
{* ../../docs_src/response_directly/tutorial001.py hl[6:7,21:22] *}
|
||||||
|
|
||||||
|
/// note | Технические детали
|
||||||
|
|
||||||
|
Вы также можете использовать `from starlette.responses import JSONResponse`.
|
||||||
|
|
||||||
|
**FastAPI** предоставляет `starlette.responses` через `fastapi.responses` просто для вашего удобства, как разработчика. Но большинство доступных Response-классов поступают напрямую из Starlette.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## Возврат пользовательского `Response`
|
||||||
|
|
||||||
|
Пример выше показывает все необходимые части, но он пока не очень полезен, так как вы могли бы просто вернуть `item` напрямую, и **FastAPI** поместил бы его в `JSONResponse`, преобразовав в `dict` и т.д. Всё это происходит по умолчанию.
|
||||||
|
|
||||||
|
Теперь давайте посмотрим, как можно использовать это для возврата пользовательского ответа.
|
||||||
|
|
||||||
|
Допустим, вы хотите вернуть ответ в формате <a href="https://en.wikipedia.org/wiki/XML" class="external-link" target="_blank">XML</a>.
|
||||||
|
|
||||||
|
Вы можете поместить ваш XML-контент в строку, поместить её в `Response` и вернуть:
|
||||||
|
|
||||||
|
{* ../../docs_src/response_directly/tutorial002.py hl[1,18] *}
|
||||||
|
|
||||||
|
## Примечания
|
||||||
|
|
||||||
|
Когда вы возвращаете объект `Response` напрямую, его данные не валидируются, не преобразуются (не сериализуются) и не документируются автоматически.
|
||||||
|
|
||||||
|
Но вы всё равно можете задокументировать это, как описано в [Дополнительные ответы в OpenAPI](additional-responses.md){.internal-link target=_blank}.
|
||||||
|
|
||||||
|
В следующих разделах вы увидите, как использовать/объявлять такие кастомные `Response`, при этом сохраняя автоматическое преобразование данных, документацию и т.д.
|
||||||
|
|
@ -216,7 +216,7 @@
|
||||||
|
|
||||||
Каждый из этих процессов будет запускать ваше приложение для обработки полученного **запроса** и возвращения вычисленного **ответа** и они будут использовать оперативную память.
|
Каждый из этих процессов будет запускать ваше приложение для обработки полученного **запроса** и возвращения вычисленного **ответа** и они будут использовать оперативную память.
|
||||||
|
|
||||||
<img src="/img/deployment/concepts/process-ram.svg">
|
<img src="/img/deployment/concepts/process-ram.drawio.svg">
|
||||||
|
|
||||||
Безусловно, на этом же сервере будут работать и **другие процессы**, которые не относятся к вашему приложению.
|
Безусловно, на этом же сервере будут работать и **другие процессы**, которые не относятся к вашему приложению.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -92,7 +92,7 @@
|
||||||
|
|
||||||
DNS-сервера присылают браузеру определённый **IP-адрес**, тот самый публичный IP-адрес вашего сервера, который вы указали в ресурсной "записи А" при настройке.
|
DNS-сервера присылают браузеру определённый **IP-адрес**, тот самый публичный IP-адрес вашего сервера, который вы указали в ресурсной "записи А" при настройке.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https01.svg">
|
<img src="/img/deployment/https/https01.drawio.svg">
|
||||||
|
|
||||||
### Рукопожатие TLS
|
### Рукопожатие TLS
|
||||||
|
|
||||||
|
|
@ -100,7 +100,7 @@ DNS-сервера присылают браузеру определённый
|
||||||
|
|
||||||
Первым шагом будет установление соединения между клиентом (браузером) и сервером и выбор криптографического ключа (для шифрования).
|
Первым шагом будет установление соединения между клиентом (браузером) и сервером и выбор криптографического ключа (для шифрования).
|
||||||
|
|
||||||
<img src="/img/deployment/https/https02.svg">
|
<img src="/img/deployment/https/https02.drawio.svg">
|
||||||
|
|
||||||
Эта часть клиент-серверного взаимодействия устанавливает TLS-соединение и называется **TLS-рукопожатием**.
|
Эта часть клиент-серверного взаимодействия устанавливает TLS-соединение и называется **TLS-рукопожатием**.
|
||||||
|
|
||||||
|
|
@ -118,7 +118,7 @@ DNS-сервера присылают браузеру определённый
|
||||||
|
|
||||||
То есть будет выбран сертификат для домена `someapp.example.com`.
|
То есть будет выбран сертификат для домена `someapp.example.com`.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https03.svg">
|
<img src="/img/deployment/https/https03.drawio.svg">
|
||||||
|
|
||||||
Клиент уже **доверяет** тому, кто выдал этот TLS-сертификат (в нашем случае - Let's Encrypt, но мы ещё обсудим это), потому может **проверить**, действителен ли полученный от сервера сертификат.
|
Клиент уже **доверяет** тому, кто выдал этот TLS-сертификат (в нашем случае - Let's Encrypt, но мы ещё обсудим это), потому может **проверить**, действителен ли полученный от сервера сертификат.
|
||||||
|
|
||||||
|
|
@ -140,19 +140,19 @@ DNS-сервера присылают браузеру определённый
|
||||||
|
|
||||||
Так клиент отправляет **HTTPS-запрос**. То есть обычный HTTP-запрос, но через зашифрованное TLS-содинение.
|
Так клиент отправляет **HTTPS-запрос**. То есть обычный HTTP-запрос, но через зашифрованное TLS-содинение.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https04.svg">
|
<img src="/img/deployment/https/https04.drawio.svg">
|
||||||
|
|
||||||
### Расшифровка запроса
|
### Расшифровка запроса
|
||||||
|
|
||||||
Прокси-сервер, используя согласованный с клиентом ключ, расшифрует полученный **зашифрованный запрос** и передаст **обычный (незашифрованный) HTTP-запрос** процессу, запускающему приложение (например, процессу Uvicorn запускающему приложение FastAPI).
|
Прокси-сервер, используя согласованный с клиентом ключ, расшифрует полученный **зашифрованный запрос** и передаст **обычный (незашифрованный) HTTP-запрос** процессу, запускающему приложение (например, процессу Uvicorn запускающему приложение FastAPI).
|
||||||
|
|
||||||
<img src="/img/deployment/https/https05.svg">
|
<img src="/img/deployment/https/https05.drawio.svg">
|
||||||
|
|
||||||
### HTTP-ответ
|
### HTTP-ответ
|
||||||
|
|
||||||
Приложение обработает запрос и вернёт **обычный (незашифрованный) HTTP-ответ** прокси-серверу.
|
Приложение обработает запрос и вернёт **обычный (незашифрованный) HTTP-ответ** прокси-серверу.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https06.svg">
|
<img src="/img/deployment/https/https06.drawio.svg">
|
||||||
|
|
||||||
### HTTPS-ответ
|
### HTTPS-ответ
|
||||||
|
|
||||||
|
|
@ -160,7 +160,7 @@ DNS-сервера присылают браузеру определённый
|
||||||
|
|
||||||
Наконец, браузер проверит ответ, в том числе, что тот зашифрован с нужным ключом, **расшифрует его** и обработает.
|
Наконец, браузер проверит ответ, в том числе, что тот зашифрован с нужным ключом, **расшифрует его** и обработает.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https07.svg">
|
<img src="/img/deployment/https/https07.drawio.svg">
|
||||||
|
|
||||||
Клиент (браузер) знает, что ответ пришёл от правильного сервера, так как использует методы шифрования, согласованные ими раннее через **HTTPS-сертификат**.
|
Клиент (браузер) знает, что ответ пришёл от правильного сервера, так как использует методы шифрования, согласованные ими раннее через **HTTPS-сертификат**.
|
||||||
|
|
||||||
|
|
@ -171,7 +171,7 @@ DNS-сервера присылают браузеру определённый
|
||||||
Напомню, что только один процесс (например, прокси-сервер) может прослушивать определённый порт определённого IP-адреса.
|
Напомню, что только один процесс (например, прокси-сервер) может прослушивать определённый порт определённого IP-адреса.
|
||||||
Но другие процессы и приложения тоже могут работать на этом же сервере (серверах), если они не пытаются использовать уже занятую **комбинацию IP-адреса и порта** (сокет).
|
Но другие процессы и приложения тоже могут работать на этом же сервере (серверах), если они не пытаются использовать уже занятую **комбинацию IP-адреса и порта** (сокет).
|
||||||
|
|
||||||
<img src="/img/deployment/https/https08.svg">
|
<img src="/img/deployment/https/https08.drawio.svg">
|
||||||
|
|
||||||
Таким образом, сервер завершения TLS может обрабатывать HTTPS-запросы и использовать сертификаты для **множества доменов** или приложений и передавать запросы правильным адресатам (другим приложениям).
|
Таким образом, сервер завершения TLS может обрабатывать HTTPS-запросы и использовать сертификаты для **множества доменов** или приложений и передавать запросы правильным адресатам (другим приложениям).
|
||||||
|
|
||||||
|
|
@ -181,7 +181,7 @@ DNS-сервера присылают браузеру определённый
|
||||||
|
|
||||||
Когда это произойдёт, можно запустить другую программу, которая подключится к Let's Encrypt и обновит сертификат(ы). Существуют прокси-серверы, которые могут сделать это действие самостоятельно.
|
Когда это произойдёт, можно запустить другую программу, которая подключится к Let's Encrypt и обновит сертификат(ы). Существуют прокси-серверы, которые могут сделать это действие самостоятельно.
|
||||||
|
|
||||||
<img src="/img/deployment/https/https.svg">
|
<img src="/img/deployment/https/https.drawio.svg">
|
||||||
|
|
||||||
**TLS-сертификаты** не привязаны к IP-адресу, но **связаны с именем домена**.
|
**TLS-сертификаты** не привязаны к IP-адресу, но **связаны с именем домена**.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ from app.routers import items
|
||||||
* Подкаталог `app/internal/`, содержащий файл `__init__.py`, является ещё одним суб-пакетом: `app.internal`.
|
* Подкаталог `app/internal/`, содержащий файл `__init__.py`, является ещё одним суб-пакетом: `app.internal`.
|
||||||
* А файл `app/internal/admin.py` является ещё одним суб-модулем: `app.internal.admin`.
|
* А файл `app/internal/admin.py` является ещё одним суб-модулем: `app.internal.admin`.
|
||||||
|
|
||||||
<img src="/img/tutorial/bigger-applications/package.svg">
|
<img src="/img/tutorial/bigger-applications/package.drawio.svg">
|
||||||
|
|
||||||
Та же самая файловая структура приложения, но с комментариями:
|
Та же самая файловая структура приложения, но с комментариями:
|
||||||
|
|
||||||
|
|
@ -269,7 +269,7 @@ from .dependencies import get_token_header
|
||||||
|
|
||||||
Вспомните, как выглядит файловая структура нашего приложения:
|
Вспомните, как выглядит файловая структура нашего приложения:
|
||||||
|
|
||||||
<img src="/img/tutorial/bigger-applications/package.svg">
|
<img src="/img/tutorial/bigger-applications/package.drawio.svg">
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,76 @@
|
||||||
|
# Модели параметров cookie
|
||||||
|
|
||||||
|
Если у вас есть группа **cookies**, которые связаны между собой, вы можете создать **Pydantic-модель** для их объявления. 🍪
|
||||||
|
|
||||||
|
Это позволит вам **переиспользовать модель** в **разных местах**, а также объявить проверки и метаданные сразу для всех параметров. 😎
|
||||||
|
|
||||||
|
/// note | Заметка
|
||||||
|
|
||||||
|
Этот функционал доступен с версии `0.115.0`. 🤓
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
/// tip | Совет
|
||||||
|
|
||||||
|
Такой же подход применяется для `Query`, `Cookie`, и `Header`. 😎
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## Pydantic-модель для cookies
|
||||||
|
|
||||||
|
Объявите параметры **cookie**, которые вам нужны, в **Pydantic-модели**, а затем объявите параметр как `Cookie`:
|
||||||
|
|
||||||
|
{* ../../docs_src/cookie_param_models/tutorial001_an_py310.py hl[9:12,16] *}
|
||||||
|
|
||||||
|
**FastAPI** **извлечёт** данные для **каждого поля** из **cookies**, полученных в запросе, и выдаст вам объявленную Pydantic-модель.
|
||||||
|
|
||||||
|
## Проверка сгенерированной документации
|
||||||
|
|
||||||
|
Вы можете посмотреть объявленные cookies в графическом интерфейсе Документации по пути `/docs`:
|
||||||
|
|
||||||
|
<div class="screenshot">
|
||||||
|
<img src="/img/tutorial/cookie-param-models/image01.png">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
/// info | Дополнительная информация
|
||||||
|
|
||||||
|
Имейте в виду, что, поскольку **браузеры обрабатывают cookies** особым образом и под капотом, они **не** позволят **JavaScript** легко получить доступ к ним.
|
||||||
|
|
||||||
|
Если вы перейдёте к **графическому интерфейсу документации API** по пути `/docs`, то сможете увидеть **документацию** по cookies для ваших *операций путей*.
|
||||||
|
|
||||||
|
Но даже если вы **заполните данные** и нажмёте "Execute", поскольку графический интерфейс Документации работает с **JavaScript**, cookies не будут отправлены, и вы увидите сообщение об **ошибке** как будто не указывали никаких значений.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## Запрет дополнительных cookies
|
||||||
|
|
||||||
|
В некоторых случаях (не особо часто встречающихся) вам может понадобиться **ограничить** cookies, которые вы хотите получать.
|
||||||
|
|
||||||
|
Теперь ваш API сам решает, <abbr title="Это шутка, на всякий случай. Это не имеет никакого отношения к согласию на использование cookie, но забавно, что даже API теперь может отклонять несчастные cookies. Съешьте печеньку. 🍪">принимать ли cookies</abbr>. 🤪🍪
|
||||||
|
|
||||||
|
Вы можете сконфигурировать Pydantic-модель так, чтобы запретить (`forbid`) любые дополнительные (`extra`) поля:
|
||||||
|
|
||||||
|
{* ../../docs_src/cookie_param_models/tutorial002_an_py39.py hl[10] *}
|
||||||
|
|
||||||
|
Если клиент попробует отправить **дополнительные cookies**, то в ответ он получит **ошибку**.
|
||||||
|
|
||||||
|
Бедные баннеры cookies, они всеми силами пытаются получить ваше согласие — и всё ради того, чтобы <abbr title="Это ещё одна шутка. Не обращайте на меня внимания. Выпейте кофе со своей печенькой. ☕">API его отклонил</abbr>. 🍪
|
||||||
|
|
||||||
|
Например, если клиент попытается отправить cookie `santa_tracker` со значением `good-list-please`, то в ответ он получит **ошибку**, сообщающую ему, что cookie `santa_tracker` <abbr title="Санта не одобряет пропажу печенья. 🎅 Ладно, больше никаких шуток про печенье.">не разрешён</abbr>:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"detail": [
|
||||||
|
{
|
||||||
|
"type": "extra_forbidden",
|
||||||
|
"loc": ["cookie", "santa_tracker"],
|
||||||
|
"msg": "Extra inputs are not permitted",
|
||||||
|
"input": "good-list-please"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Заключение
|
||||||
|
|
||||||
|
Вы можете использовать **Pydantic-модели** для объявления <abbr title="Съешьте последнюю печеньку, прежде чем уйти. 🍪">**cookies**</abbr> в **FastAPI**. 😎
|
||||||
|
|
@ -0,0 +1,78 @@
|
||||||
|
# Модели форм
|
||||||
|
|
||||||
|
Вы можете использовать **Pydantic-модели** для объявления **полей форм** в FastAPI.
|
||||||
|
|
||||||
|
/// info | Дополнительная информация
|
||||||
|
|
||||||
|
Чтобы использовать формы, сначала установите <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a>.
|
||||||
|
|
||||||
|
Убедитесь, что вы создали и активировали [виртуальное окружение](../virtual-environments.md){.internal-link target=_blank}, а затем установите пакет, например:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ pip install python-multipart
|
||||||
|
```
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
/// note | Заметка
|
||||||
|
|
||||||
|
Этот функционал доступен с версии `0.113.0`. 🤓
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## Pydantic-модель для формы
|
||||||
|
|
||||||
|
Вам просто нужно объявить **Pydantic-модель** с полями, которые вы хотите получить как **поля формы**, а затем объявить параметр как `Form`:
|
||||||
|
|
||||||
|
{* ../../docs_src/request_form_models/tutorial001_an_py39.py hl[9:11,15] *}
|
||||||
|
|
||||||
|
**FastAPI** **извлечёт** данные для **каждого поля** из **данных формы** в запросе и выдаст вам объявленную Pydantic-модель.
|
||||||
|
|
||||||
|
## Проверка сгенерированной документации
|
||||||
|
|
||||||
|
Вы можете посмотреть поля формы в графическом интерфейсе Документации по пути `/docs`:
|
||||||
|
|
||||||
|
<div class="screenshot">
|
||||||
|
<img src="/img/tutorial/request-form-models/image01.png">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## Запрет дополнительных полей формы
|
||||||
|
|
||||||
|
В некоторых случаях (не особо часто встречающихся) вам может понадобиться **ограничить** поля формы только теми, которые объявлены в Pydantic-модели. И **запретить** любые **дополнительные** поля.
|
||||||
|
|
||||||
|
/// note | Заметка
|
||||||
|
|
||||||
|
Этот функционал доступен с версии `0.114.0`. 🤓
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
Вы можете сконфигурировать Pydantic-модель так, чтобы запретить (`forbid`) все дополнительные (`extra`) поля:
|
||||||
|
|
||||||
|
{* ../../docs_src/request_form_models/tutorial002_an_py39.py hl[12] *}
|
||||||
|
|
||||||
|
Если клиент попробует отправить дополнительные данные, то в ответ он получит **ошибку**.
|
||||||
|
|
||||||
|
Например, если клиент попытается отправить поля формы:
|
||||||
|
|
||||||
|
* `username`: `Rick`
|
||||||
|
* `password`: `Portal Gun`
|
||||||
|
* `extra`: `Mr. Poopybutthole`
|
||||||
|
|
||||||
|
То в ответ он получит **ошибку**, сообщающую ему, что поле `extra` не разрешено:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"detail": [
|
||||||
|
{
|
||||||
|
"type": "extra_forbidden",
|
||||||
|
"loc": ["body", "extra"],
|
||||||
|
"msg": "Extra inputs are not permitted",
|
||||||
|
"input": "Mr. Poopybutthole"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Заключение
|
||||||
|
|
||||||
|
Вы можете использовать Pydantic-модели для объявления полей форм в FastAPI. 😎
|
||||||
|
|
@ -0,0 +1,85 @@
|
||||||
|
# Фонові задачі
|
||||||
|
|
||||||
|
Ви можете створювати фонові задачі, які будуть виконуватися *після* повернення відповіді.
|
||||||
|
|
||||||
|
Це корисно для операцій, які потрібно виконати після обробки запиту, але клієнту не обов’язково чекати завершення цієї операції перед отриманням відповіді.
|
||||||
|
|
||||||
|
Приклади використання:
|
||||||
|
|
||||||
|
* Надсилання email-сповіщень після виконання певної дії:
|
||||||
|
* Підключення до поштового сервера та надсилання листа може займати кілька секунд. Ви можете відразу повернути відповідь, а email відправити у фоні.
|
||||||
|
* Обробка даних:
|
||||||
|
* Наприклад, якщо отримано файл, який потрібно обробити довготривалим процесом, можна повернути відповідь "Accepted" ("Прийнято", HTTP 202) і виконати обробку файлу у фоні.
|
||||||
|
|
||||||
|
## Використання `BackgroundTasks`
|
||||||
|
|
||||||
|
Спочатку імпортуйте `BackgroundTasks` і додайте його як параметр у Вашу *функцію операції шляху* (path operation function) до `BackgroundTasks`:
|
||||||
|
|
||||||
|
{* ../../docs_src/background_tasks/tutorial001.py hl[1,13] *}
|
||||||
|
|
||||||
|
**FastAPI** автоматично створить об'єкт `BackgroundTasks` і передасть його у цей параметр.
|
||||||
|
|
||||||
|
|
||||||
|
## Створення функції задачі
|
||||||
|
|
||||||
|
Створіть функцію, яка буде виконувати фонову задачу.
|
||||||
|
|
||||||
|
Це звичайна функція, яка може отримувати параметри.
|
||||||
|
|
||||||
|
Вона може бути асинхронною `async def` або звичайною `def` функцією – **FastAPI** обробить її правильно.
|
||||||
|
|
||||||
|
У нашому випадку функція записує у файл (імітуючи надсилання email).
|
||||||
|
|
||||||
|
І оскільки операція запису не використовує `async` та `await`, ми визначаємо функцію як звичайну `def`:
|
||||||
|
|
||||||
|
{* ../../docs_src/background_tasks/tutorial001.py hl[6:9] *}
|
||||||
|
|
||||||
|
## Додавання фонової задачі
|
||||||
|
|
||||||
|
Усередині Вашої *функції обробки шляху*, передайте функцію задачі в об'єкт *background tasks*, використовуючи метод `.add_task()`:
|
||||||
|
|
||||||
|
{* ../../docs_src/background_tasks/tutorial001.py hl[14] *}
|
||||||
|
|
||||||
|
`.add_task()` приймає аргументи:
|
||||||
|
|
||||||
|
* Функція задача, яка буде виконуватися у фоновому режимі (`write_notification`). Зверніть увагу, що передається обʼєкт без дужок.
|
||||||
|
* Будь-яка послідовність аргументів, які потрібно передати у функцію завдання у відповідному порядку (`email`).
|
||||||
|
* Будь-які іменовані аргументи, які потрібно передати у функцію задачу (`message="some notification"`).
|
||||||
|
|
||||||
|
## Впровадження залежностей
|
||||||
|
|
||||||
|
Використання `BackgroundTasks` також працює з системою впровадження залежностей. Ви можете оголосити параметр типу `BackgroundTasks` на різних рівнях: у *функції операції шляху*, у залежності (dependable), у під залежності тощо.
|
||||||
|
|
||||||
|
**FastAPI** знає, як діяти в кожному випадку і як повторно використовувати один і той самий об'єкт, щоб усі фонові задачі були об’єднані та виконувалися у фоновому режимі після завершення основного запиту.
|
||||||
|
|
||||||
|
{* ../../docs_src/background_tasks/tutorial002_an_py310.py hl[13,15,22,25] *}
|
||||||
|
|
||||||
|
У цьому прикладі повідомлення будуть записані у файл `log.txt` *після* того, як відповідь буде надіслана.
|
||||||
|
|
||||||
|
Якщо у запиті був переданий query-параметр, він буде записаний у лог у фоновій задачі.
|
||||||
|
|
||||||
|
А потім інша фонова задача, яка створюється у *функції операції шляху*, запише повідомлення з використанням path параметра `email`.
|
||||||
|
|
||||||
|
## Технічні деталі
|
||||||
|
|
||||||
|
Клас `BackgroundTasks` походить безпосередньо з <a href="https://www.starlette.io/background/" class="external-link" target="_blank">`starlette.background`</a>.
|
||||||
|
|
||||||
|
Він імпортується безпосередньо у FastAPI, щоб Ви могли використовувати його з `fastapi` і випадково не імпортували `BackgroundTask` (без s в кінці) з `starlette.background`.
|
||||||
|
|
||||||
|
Якщо використовувати лише `BackgroundTasks` (а не `BackgroundTask`), то його можна передавати як параметр у *функції операції шляху*, і **FastAPI** подбає про все інше, так само як і про використання об'єкта `Request`.
|
||||||
|
|
||||||
|
Також можна використовувати `BackgroundTask` окремо в FastAPI, але для цього Вам доведеться створити об'єкт у коді та повернути Starlette `Response`, включаючи його.
|
||||||
|
|
||||||
|
Детальніше можна почитати в <a href="https://www.starlette.io/background/" class="external-link" target="_blank">офіційній документації Starlette про фонові задачі </a>.
|
||||||
|
|
||||||
|
## Застереження
|
||||||
|
|
||||||
|
Якщо Вам потрібно виконувати складні фонові обчислення, і при цьому нема потреби запускати їх у тому ж процесі (наприклад, не потрібно спільного доступу до пам’яті чи змінних), можливо, варто скористатися більш потужними інструментами, такими як <a href="https://docs.celeryq.dev" class="external-link" target="_blank">Celery</a>.
|
||||||
|
|
||||||
|
Такі інструменти зазвичай потребують складнішої конфігурації та менеджера черги повідомлень/завдань, наприклад, RabbitMQ або Redis. Однак вони дозволяють виконувати фонові задачі в кількох процесах і навіть на кількох серверах.
|
||||||
|
|
||||||
|
Якщо ж Вам потрібно отримати доступ до змінних і об’єктів із тієї ж **FastAPI** - програми або виконувати невеликі фонові завдання (наприклад, надсилати сповіщення електронною поштою), достатньо просто використовувати `BackgroundTasks`.
|
||||||
|
|
||||||
|
## Підсумок
|
||||||
|
|
||||||
|
Імпортуйте та використовуйте `BackgroundTasks` як параметр у *функціях операції шляху* та залежностях, щоб додавати фонові задачі.
|
||||||
|
|
@ -0,0 +1,116 @@
|
||||||
|
# Тіло – Оновлення
|
||||||
|
|
||||||
|
## Оновлення з використанням `PUT`
|
||||||
|
|
||||||
|
Щоб оновити елемент, Ви можете використати <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT" class="external-link" target="_blank">HTTP `PUT`</a> операцію.
|
||||||
|
|
||||||
|
Ви можете використати `jsonable_encoder`, щоб перетворити вхідні дані на такі, які можна зберігати як JSON (наприклад, у NoSQL базі даних). Наприклад, перетворюючи `datetime` у `str`.
|
||||||
|
|
||||||
|
{* ../../docs_src/body_updates/tutorial001_py310.py hl[28:33] *}
|
||||||
|
|
||||||
|
`PUT` використовується для отримання даних, які мають замінити чинні дані.
|
||||||
|
|
||||||
|
### Попередження про заміну
|
||||||
|
|
||||||
|
Це означає, що якщо Ви хочете оновити елемент `bar`, використовуючи `PUT` з тілом:
|
||||||
|
|
||||||
|
```Python
|
||||||
|
{
|
||||||
|
"name": "Barz",
|
||||||
|
"price": 3,
|
||||||
|
"description": None,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
оскільки він не містить вже збереженого атрибута `"tax": 20.2`, модель введення прийме значення за замовчуванням `"tax": 10.5`.
|
||||||
|
|
||||||
|
І дані будуть збережені з цим "новим" значенням `tax` = `10.5`.
|
||||||
|
|
||||||
|
## Часткові оновлення з `PATCH`
|
||||||
|
|
||||||
|
Ви також можете використовувати операцію <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH" class="external-link" target="_blank">HTTP `PATCH`</a> для *часткового* оновлення даних.
|
||||||
|
|
||||||
|
Це означає, що Ви можете надіслати лише ті дані, які хочете оновити, залишаючи інші без змін.
|
||||||
|
|
||||||
|
/// note | Примітка
|
||||||
|
|
||||||
|
`PATCH` менш відомий і рідше використовується, ніж `PUT`.
|
||||||
|
|
||||||
|
І багато команд використовують лише `PUT`, навіть для часткових оновлень.
|
||||||
|
|
||||||
|
Ви **вільні** використовувати їх так, як хочете, **FastAPI** не накладає обмежень.
|
||||||
|
|
||||||
|
Але цей посібник показує Вам більш-менш як їх задумано використовувати.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
### Використання параметра `exclude_unset` у Pydantic
|
||||||
|
|
||||||
|
Якщо Ви хочете отримати часткові оновлення, дуже зручно використовувати параметр `exclude_unset` у методі `.model_dump()` моделі Pydantic.
|
||||||
|
|
||||||
|
Наприклад: `item.model_dump(exclude_unset=True)`.
|
||||||
|
|
||||||
|
/// info | Інформація
|
||||||
|
|
||||||
|
У Pydantic v1 цей метод називався `.dict()`, він був застарілий (але все ще підтримується) у Pydantic v2, і був перейменований у `.model_dump()`.
|
||||||
|
|
||||||
|
Приклади тут використовують `.dict()` для сумісності з Pydantic v1, але Вам слід використовувати `.model_dump()`, якщо можете використовувати Pydantic v2.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
Це створить `dict` лише з тими даними, які були явно встановлені під час створення моделі `item`, виключаючи значення за замовчуванням.
|
||||||
|
|
||||||
|
Тоді Ви можете використовувати це, щоб створити `dict` лише з даними, які були встановлені (надіслані у запиті), пропускаючи значення за замовчуванням:
|
||||||
|
|
||||||
|
{* ../../docs_src/body_updates/tutorial002_py310.py hl[32] *}
|
||||||
|
|
||||||
|
### Використання параметра `update` у Pydantic
|
||||||
|
|
||||||
|
Тепер Ви можете створити копію наявної моделі за допомогою `.model_copy()`, і передати параметр `update` з `dict` , який містить дані для оновлення.
|
||||||
|
|
||||||
|
/// info | Інформація
|
||||||
|
|
||||||
|
У Pydantic v1 метод називався `.copy()`, він був застарілий (але все ще підтримується) у Pydantic v2, і був перейменований у `.model_copy()`.
|
||||||
|
|
||||||
|
Приклади тут використовують `.copy()` для сумісності з Pydantic v1, але якщо Ви можете використовувати Pydantic v2 — Вам слід використовувати `.model_copy()` замість цього.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
Наприклад: `stored_item_model.model_copy(update=update_data)`:
|
||||||
|
|
||||||
|
{* ../../docs_src/body_updates/tutorial002_py310.py hl[33] *}
|
||||||
|
|
||||||
|
### Підсумок часткових оновлень
|
||||||
|
|
||||||
|
У підсумку, щоб застосувати часткові оновлення, Ви:
|
||||||
|
|
||||||
|
* (Опціонально) використовуєте `PATCH` замість `PUT`.
|
||||||
|
* Отримуєте збережені дані.
|
||||||
|
* Поміщаєте ці дані в модель Pydantic.
|
||||||
|
* Генеруєте `dict` без значень за замовчуванням з моделі введення (використовуючи `exclude_unset`).
|
||||||
|
* Таким чином Ви оновите лише ті значення, які були явно задані користувачем, замість того, щоб перезаписувати вже збережені значення значеннями за замовчуванням з вашої моделі.
|
||||||
|
* Створюєте копію збереженої моделі, оновлюючи її атрибути отриманими частковими оновленнями (використовуючи параметр `update`).
|
||||||
|
* Перетворюєте скопійовану модель на щось, що можна зберегти у вашу БД (наприклад, використовуючи `jsonable_encoder`).
|
||||||
|
* Це можна порівняти з повторним використанням методу `.model_dump()` моделі, але це гарантує (і перетворює) значення у типи даних, які можна перетворити на JSON, наприклад, `datetime` на `str`.
|
||||||
|
* Зберігаєте дані у вашу БД.
|
||||||
|
* Повертаєте оновлену модель.
|
||||||
|
|
||||||
|
{* ../../docs_src/body_updates/tutorial002_py310.py hl[28:35] *}
|
||||||
|
|
||||||
|
/// tip | Порада
|
||||||
|
|
||||||
|
Насправді Ви можете використовувати цю саму техніку і з операцією HTTP `PUT`.
|
||||||
|
|
||||||
|
Але приклад тут використовує `PATCH`, тому що він був створений саме для таких випадків.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
/// note | Примітка
|
||||||
|
|
||||||
|
Зверніть увагу, що модель запиту все ще проходить валідацію.
|
||||||
|
|
||||||
|
Тож, якщо Ви хочете отримувати часткові оновлення, які можуть не містити жодного атрибута, Вам потрібно мати модель, де всі атрибути позначені як необов’язкові (зі значеннями за замовчуванням або `None`).
|
||||||
|
|
||||||
|
Щоб розрізняти моделі з усіма необов’язковими значеннями для **оновлення** і моделі з обов’язковими значеннями для **створення**, Ви можете скористатись ідеями, описаними у [Додаткові моделі](extra-models.md){.internal-link target=_blank}.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
# CORS (Обмін ресурсами між різними джерелами)
|
||||||
|
|
||||||
|
<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">CORS або "Обмін ресурсами між різними джерелами"</a> є ситуація, коли фронтенд, що працює в браузері, містить JavaScript-код, який взаємодіє з бекендом, розташованим в іншому "джерелі" (origin).
|
||||||
|
|
||||||
|
## Джерело (Origin)
|
||||||
|
|
||||||
|
Джерело визначається комбінацією протоколу (`http`, `https`), домену (`myapp.com`, `localhost`, `localhost.tiangolo.com`), порту (`80`, `443`, `8080`).
|
||||||
|
|
||||||
|
|
||||||
|
Наприклад, такі адреси вважаються різними джерелами:
|
||||||
|
|
||||||
|
* `http://localhost`
|
||||||
|
* `https://localhost`
|
||||||
|
* `http://localhost:8080`
|
||||||
|
|
||||||
|
Навіть якщо вони всі містять `localhost`, вони мають різні протоколи або порти, що робить їх окремими "джерелами".
|
||||||
|
|
||||||
|
## Кроки
|
||||||
|
|
||||||
|
Припустимо, що Ваш фронтенд працює в браузері на `http://localhost:8080`, а його JavaScript намагається відправити запит до бекенду, який працює на `http://localhost` (Оскільки ми не вказуємо порт, браузер за замовчуванням припускає порт `80`).
|
||||||
|
|
||||||
|
Потім браузер надішле HTTP-запит `OPTIONS` до бекенду на порту `:80`, і якщо бекенд надішле відповідні заголовки, що дозволяють комунікацію з цього іншого джерела (`http://localhost:8080`), тоді браузер на порту `:8080` дозволить JavaScript у фронтенді надіслати свій запит до бекенду на порту `:80`.
|
||||||
|
|
||||||
|
Щоб досягти цього, бекенд на порту `:80` повинен мати список "дозволених джерел".
|
||||||
|
|
||||||
|
У цьому випадку список має містити `http://localhost:8080`, щоб фронтенд на порту `:8080` працював коректно.
|
||||||
|
|
||||||
|
## Символьне підставляння
|
||||||
|
|
||||||
|
Можна також оголосити список як `"*"` ("символьне підставляння"), що означає дозвіл для всіх джерел.
|
||||||
|
|
||||||
|
Однак це дозволить лише певні типи комунікації, виключаючи все, що пов'язане з обліковими даними: Cookies, заголовки авторизації, такі як ті, що використовуються з Bearer токенами тощо.
|
||||||
|
|
||||||
|
Тому для коректної роботи краще явно вказувати дозволені джерела.
|
||||||
|
|
||||||
|
## Використання `CORSMiddleware`
|
||||||
|
|
||||||
|
Ви можете налаштувати це у Вашому додатку **FastAPI** за допомогою `CORSMiddleware`.
|
||||||
|
|
||||||
|
* Імпортуйте `CORSMiddleware`.
|
||||||
|
* Створіть список дозволених джерел (у вигляді рядків).
|
||||||
|
* Додайте його як "middleware" у Ваш додаток **FastAPI**.
|
||||||
|
|
||||||
|
|
||||||
|
Також можна вказати, чи дозволяє Ваш бекенд:
|
||||||
|
|
||||||
|
* Облікові дані (заголовки авторизації, сookies, тощо).
|
||||||
|
* Конкретні HTTP-методи (`POST`, `PUT`) або всі за допомогою `"*"`
|
||||||
|
* Конкретні HTTP-заголовки або всі за допомогою `"*"`.
|
||||||
|
|
||||||
|
|
||||||
|
{* ../../docs_src/cors/tutorial001.py hl[2,6:11,13:19] *}
|
||||||
|
|
||||||
|
Параметри за замовчуванням у `CORSMiddleware` є досить обмеженими, тому Вам потрібно явно вказати конкретні джерела, методи або заголовки, щоб браузери могли використовувати їх у контексті запитів між різними доменами.
|
||||||
|
|
||||||
|
|
||||||
|
Підтримуються такі аргументи:
|
||||||
|
|
||||||
|
* `allow_origins` - Список джерел, яким дозволено здійснювати міждоменні запити. Наприклад `['https://example.org', 'https://www.example.org']`. Ви можете використовувати ['*'], щоб дозволити всі джерела.
|
||||||
|
* `allow_origin_regex` - Рядок регулярного виразу для відповідності джерелам, яким дозволено здійснювати міждоменні запити. Наприклад, `'https://.*\.example\.org'`.
|
||||||
|
* `allow_methods` - Список HTTP-методів, дозволених для міждоменних запитів. За замовчуванням `['GET']`. Ви можете використовувати `['*']`, щоб дозволити всі стандартні методи.
|
||||||
|
* `allow_headers` - Список HTTP-заголовків, які підтримуються для міждоменних запитів. За замовчуванням `[]`. Ви можете використовувати `['*']`, щоб дозволити всі заголовки. Заголовки `Accept`, `Accept-Language`, `Content-Language` і `Content-Type` завжди дозволені для <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests" class="external-link" rel="noopener" target="_blank">простих CORS-запитів</a>.
|
||||||
|
* `allow_credentials` - Визначає, чи підтримуються файли cookie для міждоменних запитів. За замовчуванням `False`. Також, якщо потрібно дозволити обмін обліковими даними (`allow_credentials = True`), параметр `allow_origins` не може бути встановлений як `['*']`, необхідно вказати конкретні джерела.
|
||||||
|
* `expose_headers` - Вказує, які заголовки відповіді повинні бути доступні для браузера. За замовчуванням `[]`.
|
||||||
|
* `max_age` - Встановлює максимальний час (у секундах) для кешування CORS-відповідей у браузерах. За замовчуванням `600`.
|
||||||
|
|
||||||
|
Цей middleware обробляє два типи HTTP-запитів...
|
||||||
|
|
||||||
|
### Попередні CORS-запити (preflight requests)
|
||||||
|
|
||||||
|
Це будь-які `OPTIONS` - запити, що містять заголовки `Origin` та `Access-Control-Request-Method`.
|
||||||
|
|
||||||
|
У такому випадку middleware перехопить вхідний запит і відповість відповідними CORS-заголовками, повертаючи або `200`, або `400` для інформаційних цілей.
|
||||||
|
|
||||||
|
### Прості запити
|
||||||
|
|
||||||
|
Будь-які запити із заголовком `Origin`. У цьому випадку middleware пропустить запит як звичайний, але додасть відповідні CORS-заголовки у відповідь.
|
||||||
|
|
||||||
|
## Додаткова інформація
|
||||||
|
|
||||||
|
Більше про <abbr title="Cross-Origin Resource Sharing">CORS</abbr> можна дізнатися в <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">документації Mozilla</a>.
|
||||||
|
|
||||||
|
/// note | Технічні деталі
|
||||||
|
|
||||||
|
Також можна використовувати `from starlette.middleware.cors import CORSMiddleware`.
|
||||||
|
|
||||||
|
**FastAPI** надає кілька middleware у `fastapi.middleware` для зручності розробників. Але більшість доступних middleware походять безпосередньо зі Starlette.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
@ -0,0 +1,255 @@
|
||||||
|
# Обробка Помилок
|
||||||
|
|
||||||
|
Є багато ситуацій, коли потрібно повідомити клієнта, який використовує Ваш API, про помилку.
|
||||||
|
|
||||||
|
Цим клієнтом може бути браузер із фронтендом, код іншого розробника, IoT-пристрій тощо.
|
||||||
|
|
||||||
|
Можливо, Вам потрібно повідомити клієнта, що:
|
||||||
|
|
||||||
|
* У нього недостатньо прав для виконання цієї операції.
|
||||||
|
* Він не має доступу до цього ресурсу.
|
||||||
|
* Елемент, до якого він намагається отримати доступ, не існує.
|
||||||
|
* тощо.
|
||||||
|
|
||||||
|
У таких випадках зазвичай повертається **HTTP статус-код** в діапазоні **400** (від 400 до 499).
|
||||||
|
|
||||||
|
Це схоже на HTTP статус-коди 200 (від 200 до 299). Ці "200" статус-коди означають, що запит пройшов успішно.
|
||||||
|
|
||||||
|
Статус-коди в діапазоні 400 означають, що сталася помилка з боку клієнта.
|
||||||
|
|
||||||
|
Пам'ятаєте всі ці помилки **404 Not Found** (і жарти про них)?
|
||||||
|
|
||||||
|
## Використання `HTTPException`
|
||||||
|
|
||||||
|
Щоб повернути HTTP-відповіді з помилками клієнту, використовуйте `HTTPException`.
|
||||||
|
|
||||||
|
### Імпорт `HTTPException`
|
||||||
|
|
||||||
|
{* ../../docs_src/handling_errors/tutorial001.py hl[1] *}
|
||||||
|
|
||||||
|
### Використання `HTTPException` у коді
|
||||||
|
|
||||||
|
`HTTPException` — це звичайна помилка Python із додатковими даними, які стосуються API.
|
||||||
|
|
||||||
|
Оскільки це помилка Python, Ви не `повертаєте` його, а `генеруєте` (генеруєте помилку).
|
||||||
|
|
||||||
|
Це також означає, що якщо Ви перебуваєте всередині допоміжної функції, яку викликаєте всередині своєї *функції операції шляху*, і там генеруєте `HTTPException`, всередині цієї допоміжної функції, то решта коду в *функції операції шляху* не буде виконана. Запит одразу завершиться, і HTTP-помилка з `HTTPException` буде надіслана клієнту.
|
||||||
|
|
||||||
|
Перевага використання `генерації` (raise) помилки замість `повернення` значення (return) стане більш очевидним в розділі про Залежності та Безпеку.
|
||||||
|
|
||||||
|
У цьому прикладі, якщо клієнт запитує елемент за ID, якого не існує, буде згенеровано помилку зі статус-кодом `404`:
|
||||||
|
|
||||||
|
{* ../../docs_src/handling_errors/tutorial001.py hl[11] *}
|
||||||
|
|
||||||
|
### Отримана відповідь
|
||||||
|
|
||||||
|
Якщо клієнт робить запит за шляхом `http://example.com/items/foo` (де `item_id` `"foo"`), він отримає статус-код 200 і JSON відповідь:
|
||||||
|
|
||||||
|
```JSON
|
||||||
|
{
|
||||||
|
"item": "The Foo Wrestlers"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Але якщо клієнт робить запит на `http://example.com/items/bar` (де `item_id` має не існуюче значення `"bar"`), то отримає статус-код 404 (помилка "не знайдено") та відповідь:
|
||||||
|
|
||||||
|
```JSON
|
||||||
|
{
|
||||||
|
"detail": "Item not found"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
/// tip | Порада
|
||||||
|
|
||||||
|
Під час виклику `HTTPException` Ви можете передати будь-яке значення, яке може бути перетворене в JSON, як параметр `detail`, а не лише рядок (`str`).
|
||||||
|
|
||||||
|
Ви можете передати `dict`, `list` тощо.
|
||||||
|
|
||||||
|
Вони обробляються автоматично за допомогою **FastAPI** та перетворюються в JSON.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## Додавання власних заголовків
|
||||||
|
|
||||||
|
Іноді потрібно додати власні заголовки до HTTP-помилки, наприклад, для певних типів безпеки.
|
||||||
|
|
||||||
|
Ймовірно, Вам не доведеться використовувати це безпосередньо у своєму коді.
|
||||||
|
|
||||||
|
Але якщо Вам знадобиться це для складного сценарію, Ви можете додати власні заголовки:
|
||||||
|
|
||||||
|
{* ../../docs_src/handling_errors/tutorial002.py hl[14] *}
|
||||||
|
|
||||||
|
## Встановлення власних обробників помилок
|
||||||
|
|
||||||
|
Ви можете додати власні обробники помилок за допомогою <a href="https://www.starlette.io/exceptions/" class="external-link" target="_blank">тих самих утиліт обробки помилок зі Starlette</a>.
|
||||||
|
|
||||||
|
Припустимо, у Вас є власний обʼєкт помилки `UnicornException`, яке Ви (або бібліотека, яку Ви використовуєте) може `згенерувати` (`raise`).
|
||||||
|
|
||||||
|
І Ви хочете обробляти це виключення глобально за допомогою FastAPI.
|
||||||
|
|
||||||
|
Ви можете додати власний обробник виключень за допомогою `@app.exception_handler()`:
|
||||||
|
|
||||||
|
{* ../../docs_src/handling_errors/tutorial003.py hl[5:7,13:18,24] *}
|
||||||
|
|
||||||
|
Тут, якщо Ви звернетеся до `/unicorns/yolo`, то згенерується помилка `UnicornException`.
|
||||||
|
|
||||||
|
Але вона буде оброблена функцією-обробником `unicorn_exception_handler`.
|
||||||
|
|
||||||
|
Отже, Ви отримаєте зрозумілу помилку зі HTTP-статусом `418` і JSON-відповіддю:
|
||||||
|
|
||||||
|
```JSON
|
||||||
|
{"message": "Oops! yolo did something. There goes a rainbow..."}
|
||||||
|
```
|
||||||
|
|
||||||
|
/// note | Технічні деталі
|
||||||
|
|
||||||
|
Ви також можете використовувати `from starlette.requests import Request` і `from starlette.responses import JSONResponse`.
|
||||||
|
|
||||||
|
**FastAPI** надає ті самі `starlette.responses`, що й `fastapi.responses`, просто для зручності розробника. Але більшість доступних відповідей надходять безпосередньо зі Starlette. Те ж саме стосується і `Request`.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## Перевизначення обробників помилок за замовчуванням
|
||||||
|
|
||||||
|
**FastAPI** має кілька обробників помилок за замовчуванням.
|
||||||
|
|
||||||
|
Ці обробники відповідають за повернення стандартних JSON-відповідей, коли Ви `генеруєте` (`raise`) `HTTPException`, а також коли запит містить некоректні дані.
|
||||||
|
|
||||||
|
Ви можете перевизначити ці обробники, створивши власні.
|
||||||
|
|
||||||
|
### Перевизначення помилок валідації запиту
|
||||||
|
|
||||||
|
Коли запит містить некоректні дані, **FastAPI** генерує `RequestValidationError`.
|
||||||
|
|
||||||
|
І також включає обробник помилок за замовчуванням для нього.
|
||||||
|
|
||||||
|
Щоб перевизначити його, імпортуйте `RequestValidationError` і використовуйте його з `@app.exception_handler(RequestValidationError)` для декорування обробника помилок.
|
||||||
|
|
||||||
|
Обробник помилок отримує `Request` і саму помилку.
|
||||||
|
|
||||||
|
{* ../../docs_src/handling_errors/tutorial004.py hl[2,14:16] *}
|
||||||
|
|
||||||
|
Тепер, якщо Ви перейдете за посиланням `/items/foo`, замість того, щоб отримати стандартну JSON-помилку:
|
||||||
|
|
||||||
|
```JSON
|
||||||
|
{
|
||||||
|
"detail": [
|
||||||
|
{
|
||||||
|
"loc": [
|
||||||
|
"path",
|
||||||
|
"item_id"
|
||||||
|
],
|
||||||
|
"msg": "value is not a valid integer",
|
||||||
|
"type": "type_error.integer"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Ви отримаєте текстову версію:
|
||||||
|
|
||||||
|
```
|
||||||
|
1 validation error
|
||||||
|
path -> item_id
|
||||||
|
value is not a valid integer (type=type_error.integer)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `RequestValidationError` проти `ValidationError`
|
||||||
|
|
||||||
|
/// warning | Увага
|
||||||
|
|
||||||
|
Це технічні деталі, які Ви можете пропустити, якщо вони зараз не важливі для Вас.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
`RequestValidationError` є підкласом Pydantic <a href="https://docs.pydantic.dev/latest/concepts/models/#error-handling" class="external-link" target="_blank">`ValidationError`</a>.
|
||||||
|
|
||||||
|
**FastAPI** використовує його для того, якщо Ви використовуєте модель Pydantic у `response_model` і у ваших даних є помилка, Ви побачили помилку у своєму журналі.
|
||||||
|
|
||||||
|
Але клієнт/користувач не побачить її. Натомість клієнт отримає "Internal Server Error" зі статусом HTTP `500`.
|
||||||
|
|
||||||
|
Так має бути, якщо у Вас виникла `ValidationError` Pydantic у *відповіді* або деінде у вашому коді (не у *запиті* клієнта), це насправді є помилкою у Вашому коді.
|
||||||
|
|
||||||
|
І поки Ви її виправляєте, клієнти/користувачі не повинні мати доступу до внутрішньої інформації про помилку, оскільки це може призвести до вразливості безпеки.
|
||||||
|
|
||||||
|
### Перевизначення обробника помилок `HTTPException`
|
||||||
|
|
||||||
|
Аналогічно, Ви можете перевизначити обробник `HTTPException`.
|
||||||
|
|
||||||
|
Наприклад, Ви можете захотіти повернути текстову відповідь замість JSON для цих помилок:
|
||||||
|
|
||||||
|
{* ../../docs_src/handling_errors/tutorial004.py hl[3:4,9:11,22] *}
|
||||||
|
|
||||||
|
/// note | Технічні деталі
|
||||||
|
|
||||||
|
Ви також можете використовувати `from starlette.responses import PlainTextResponse`.
|
||||||
|
|
||||||
|
**FastAPI** надає ті самі `starlette.responses`, що й `fastapi.responses`, просто для зручності розробника. Але більшість доступних відповідей надходять безпосередньо зі Starlette.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
### Використання тіла `RequestValidationError`
|
||||||
|
|
||||||
|
`RequestValidationError` містить `body`, який він отримав із некоректними даними.
|
||||||
|
|
||||||
|
Ви можете використовувати це під час розробки свого додатка, щоб логувати тіло запиту та налагоджувати його, повертати користувачеві тощо.
|
||||||
|
|
||||||
|
{* ../../docs_src/handling_errors/tutorial005.py hl[14] *}
|
||||||
|
|
||||||
|
Тепер спробуйте надіслати некоректний елемент, наприклад:
|
||||||
|
|
||||||
|
```JSON
|
||||||
|
{
|
||||||
|
"title": "towel",
|
||||||
|
"size": "XL"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Ви отримаєте відповідь, яка повідомить Вам, які саме дані є некоректні у вашому тілі запиту:
|
||||||
|
|
||||||
|
|
||||||
|
```JSON hl_lines="12-15"
|
||||||
|
{
|
||||||
|
"detail": [
|
||||||
|
{
|
||||||
|
"loc": [
|
||||||
|
"body",
|
||||||
|
"size"
|
||||||
|
],
|
||||||
|
"msg": "value is not a valid integer",
|
||||||
|
"type": "type_error.integer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"title": "towel",
|
||||||
|
"size": "XL"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `HTTPException` FastAPI проти `HTTPException` Starlette
|
||||||
|
|
||||||
|
**FastAPI** має власний `HTTPException`.
|
||||||
|
|
||||||
|
І клас помилки `HTTPException` в **FastAPI** успадковується від класу помилки `HTTPException` в Starlette.
|
||||||
|
|
||||||
|
Єдина різниця полягає в тому, що `HTTPException` в **FastAPI** приймає будь-які дані, які можна перетворити на JSON, для поля `detail`, тоді як `HTTPException` у Starlette приймає тільки рядки.
|
||||||
|
|
||||||
|
Отже, Ви можете продовжувати використовувати `HTTPException` в **FastAPI** як зазвичай у своєму коді.
|
||||||
|
|
||||||
|
Але коли Ви реєструєте обробник виключень, слід реєструвати його для `HTTPException` зі Starlette.
|
||||||
|
|
||||||
|
Таким чином, якщо будь-яка частина внутрішнього коду Starlette або розширення чи плагін Starlette згенерує (raise) `HTTPException`, Ваш обробник зможе перехопити та обробити її.
|
||||||
|
|
||||||
|
У цьому прикладі, щоб мати можливість використовувати обидва `HTTPException` в одному коді, помилка Starlette перейменовується на `StarletteHTTPException`:
|
||||||
|
|
||||||
|
```Python
|
||||||
|
from starlette.exceptions import HTTPException as StarletteHTTPException
|
||||||
|
```
|
||||||
|
|
||||||
|
### Повторне використання обробників помилок **FastAPI**
|
||||||
|
|
||||||
|
Якщо Ви хочете використовувати помилки разом із такими ж обробниками помилок за замовчуванням, як у **FastAPI**, Ви можете імпортувати та повторно використовувати їх із `fastapi.exception_handlers`:
|
||||||
|
|
||||||
|
{* ../../docs_src/handling_errors/tutorial006.py hl[2:5,15,21] *}
|
||||||
|
|
||||||
|
У цьому прикладі Ви просто використовуєте `print` для виведення дуже інформативного повідомлення, але Ви зрозуміли основну ідею. Ви можете обробити помилку та повторно використовувати обробники помилок за замовчуванням.
|
||||||
|
|
@ -0,0 +1,75 @@
|
||||||
|
# Middleware (Проміжний шар)
|
||||||
|
|
||||||
|
У **FastAPI** можна додавати middleware (проміжний шар).
|
||||||
|
|
||||||
|
"Middleware" — це функція, яка працює з кожним **запитом** перед його обробкою будь-якою конкретною *операцією шляху* (*path operation*), а також з кожною **відповіддю** перед її поверненням.
|
||||||
|
|
||||||
|
* Middleware отримує кожен **запит**, що надходить до Вашого застосунку.
|
||||||
|
* Може виконати певні дії із цим **запитом** або запустити необхідний код.
|
||||||
|
* Далі передає **запит** для обробки основним застосунком (*операцією шляху*).
|
||||||
|
* Отримує **відповідь**, сформовану застосунком (*операцією шляху*).
|
||||||
|
* Може змінити цю **відповідь** або виконати додатковий код.
|
||||||
|
* Повертає **відповідь** клієнту.
|
||||||
|
|
||||||
|
/// note | Технічні деталі
|
||||||
|
|
||||||
|
Якщо у Вас є залежності з `yield`, код виходу виконається *після* middleware.
|
||||||
|
|
||||||
|
Якщо були заплановані фонові задачі (background tasks - розглянуто далі), вони виконаються *після* всіх middleware.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## Створення middleware
|
||||||
|
|
||||||
|
Щоб створити middleware, Ви використовуєте декоратор `@app.middleware("http")` на функції.
|
||||||
|
|
||||||
|
Функція middleware отримує:
|
||||||
|
|
||||||
|
* `Запит`.
|
||||||
|
* Функцію `call_next`, яка приймає `запит` як параметр.
|
||||||
|
* Ця функція передає `запит` відповідній *операції шляху*.
|
||||||
|
* Потім вона повертає `відповідь`, згенеровану цією *операцією шляху*.
|
||||||
|
|
||||||
|
* Ви можете ще змінити `відповідь` перед тим, як повернути її.
|
||||||
|
|
||||||
|
|
||||||
|
{* ../../docs_src/middleware/tutorial001.py hl[8:9,11,14] *}
|
||||||
|
|
||||||
|
/// tip | Порада
|
||||||
|
|
||||||
|
Не забувайте, що власні заголовки можна додавати, використовуючи <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">префікс 'X-'</a>.
|
||||||
|
|
||||||
|
Але якщо у Вас є власні заголовки, які Ви хочете, щоб браузерний клієнт міг побачити, потрібно додати їх до Вашої конфігурації CORS (див. [CORS (Обмін ресурсами між різними джерелами)](cors.md){.internal-link target=_blank} за допомогою параметра `expose_headers`, описаного в <a href="https://www.starlette.io/middleware/#corsmiddleware" class="external-link" target="_blank">документації Starlette по CORS</a>.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
/// note | Технічні деталі
|
||||||
|
|
||||||
|
Ви також можете використати `from starlette.requests import Request`.
|
||||||
|
|
||||||
|
**FastAPI** надає це для Вашої зручності як розробника. Але він походить безпосередньо зі Starlette.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
### До і після `response`(`відповіді`)
|
||||||
|
|
||||||
|
Ви можете додати код, який буде виконуватися з `запитом` (`request`), до того, як його обробить будь-яка *операція шляху* (*path operation*).
|
||||||
|
|
||||||
|
Також Ви можете додати код, який буде виконуватися після того, як `відповідь` (`response`) буде згенеровано, перед тим як його повернути.
|
||||||
|
|
||||||
|
Наприклад, Ви можете додати власний заголовок `X-Process-Time`, який міститиме час у секундах, який витратився на обробку запиту та генерацію відповіді:
|
||||||
|
|
||||||
|
{* ../../docs_src/middleware/tutorial001.py hl[10,12:13] *}
|
||||||
|
|
||||||
|
|
||||||
|
/// tip | Підказка
|
||||||
|
|
||||||
|
Тут ми використовуємо <a href="https://docs.python.org/3/library/time.html#time.perf_counter" class="external-link" target="_blank">`time.perf_counter()`</a> замість `time.time()` оскільки він може бути більш точним для таких випадків. 🤓
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## Інші middlewares
|
||||||
|
|
||||||
|
Ви можете пізніше прочитати більше про інші middlewares в [Advanced User Guide: Advanced Middleware](../advanced/middleware.md){.internal-link target=_blank}.
|
||||||
|
|
||||||
|
Ви дізнаєтесь, як обробляти <abbr title="Cross-Origin Resource Sharing">CORS</abbr> за допомогою middleware в наступному розділі.
|
||||||
|
|
@ -0,0 +1,165 @@
|
||||||
|
# Path Параметри та валідація числових даних
|
||||||
|
|
||||||
|
Так само як Ви можете оголошувати додаткові перевірки та метадані для query параметрів за допомогою `Query`, Ви можете оголошувати той самий тип перевірок і метаданих для параметрів шляху за допомогою `Path`.
|
||||||
|
|
||||||
|
## Імпорт Path
|
||||||
|
|
||||||
|
Спочатку імпортуйте `Path` з `fastapi` і імпортуйте `Annotated`:
|
||||||
|
|
||||||
|
{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *}
|
||||||
|
|
||||||
|
/// info | Інформація
|
||||||
|
|
||||||
|
FastAPI додав підтримку `Annotated` (і почав рекомендувати його використання) у версії 0.95.0.
|
||||||
|
|
||||||
|
Якщо у Вас стара версія, при спробі використати `Annotated` можуть виникати помилки.
|
||||||
|
|
||||||
|
Переконайтеся, що Ви [оновили версію FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} принаймні до версії 0.95.1 перед використанням `Annotated`.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## Оголошення метаданих
|
||||||
|
|
||||||
|
Ви можете оголошувати всі ті ж параметри, що і для `Query`.
|
||||||
|
|
||||||
|
Наприклад, щоб оголосити значення метаданих `title` для параметра шляху `item_id`, Ви можете написати:
|
||||||
|
|
||||||
|
{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[10] *}
|
||||||
|
|
||||||
|
/// note | Примітка
|
||||||
|
|
||||||
|
Параметр шляху завжди є обов’язковим, оскільки він має бути частиною шляху. Навіть якщо Ви оголосите його зі значенням `None` або встановите значення за замовчуванням — він все одно залишатиметься обов’язковим.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## Упорядковуйте параметри, як Вам потрібно
|
||||||
|
|
||||||
|
/// tip | Підказка
|
||||||
|
|
||||||
|
Це, мабуть, не настільки важливо або необхідно, якщо Ви використовуєте `Annotated`.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
Припустимо, Ви хочете оголосити параметр запиту `q` як обов’язковий `str`.
|
||||||
|
|
||||||
|
І Вам не потрібно оголошувати нічого іншого для цього параметра, тому немає потреби використовувати `Query`.
|
||||||
|
|
||||||
|
Але Вам все одно потрібно використовувати `Path` для параметра шляху `item_id`. І з певних причин Ви не хочете використовувати `Annotated`.
|
||||||
|
|
||||||
|
Python видасть помилку, якщо розмістити значення з "default" перед значенням, яке не має "default".
|
||||||
|
|
||||||
|
Але Ви можете змінити порядок і розмістити значення без значення за замовчуванням (параметр запиту `q`) першим.
|
||||||
|
|
||||||
|
|
||||||
|
Для **FastAPI** порядок не має значення. Він визначає параметри за їх іменами, типами та значеннями за замовчуванням (`Query`, `Path` тощо) і не звертає уваги на порядок.
|
||||||
|
|
||||||
|
Тому Ви можете оголосити Вашу функцію так:
|
||||||
|
|
||||||
|
//// tab | Python 3.8 non-Annotated
|
||||||
|
|
||||||
|
/// tip | Підказка
|
||||||
|
|
||||||
|
За можливості віддавайте перевагу версії з використанням `Annotated`.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
{* ../../docs_src/path_params_numeric_validations/tutorial002.py hl[7] *}
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
Але майте на увазі, що якщо Ви використовуєте `Annotated`, ця проблема не виникне, оскільки Ви не використовуєте значення за замовчуванням для параметрів `Query()` або `Path()`.
|
||||||
|
|
||||||
|
{* ../../docs_src/path_params_numeric_validations/tutorial002_an_py39.py *}
|
||||||
|
|
||||||
|
## Упорядковуйте параметри за потребою, хитрощі
|
||||||
|
|
||||||
|
/// tip | Підказка
|
||||||
|
|
||||||
|
Це, мабуть, не настільки важливо або необхідно, якщо Ви використовуєте `Annotated`.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
Ось **невелика хитрість**, яка може стати в пригоді, хоча вона рідко знадобиться.
|
||||||
|
|
||||||
|
Якщо Ви хочете:
|
||||||
|
|
||||||
|
* оголосити параметр запиту `q` без використання `Query` або значення за замовчуванням
|
||||||
|
* оголосити параметр шляху `item_id`, використовуючи `Path`
|
||||||
|
* розмістити їх у різному порядку
|
||||||
|
* не використовувати `Annotated`
|
||||||
|
|
||||||
|
...у Python є спеціальний синтаксис для цього.
|
||||||
|
|
||||||
|
Передайте `*` як перший параметр функції.
|
||||||
|
|
||||||
|
Python нічого не зробить із цією `*`, але розпізнає, що всі наступні параметри слід викликати як аргументи за ключовим словом (пари ключ-значення), також відомі як <abbr title="From: K-ey W-ord Arg-uments"><code>kwargs</code></abbr>. Навіть якщо вони не мають значення за замовчуванням.
|
||||||
|
|
||||||
|
{* ../../docs_src/path_params_numeric_validations/tutorial003.py hl[7] *}
|
||||||
|
|
||||||
|
### Краще з `Annotated`
|
||||||
|
|
||||||
|
Майте на увазі, якщо Ви використовуєте `Annotated`, оскільки Ви не використовуєте значення за замовчуванням для параметрів функції, цієї проблеми не виникне, і, швидше за все, Вам не потрібно буде використовувати `*`.
|
||||||
|
|
||||||
|
{* ../../docs_src/path_params_numeric_validations/tutorial003_an_py39.py hl[10] *}
|
||||||
|
|
||||||
|
## Валідація числових даних: більше або дорівнює
|
||||||
|
|
||||||
|
За допомогою `Query` і `Path` (та інших, які Ви побачите пізніше) можна оголошувати числові обмеження.
|
||||||
|
|
||||||
|
Тут, завдяки `ge=1`, `item_id` має бути цілим числом, яке "`g`reater than or `e`qual" (більше або дорівнює) `1`.
|
||||||
|
|
||||||
|
{* ../../docs_src/path_params_numeric_validations/tutorial004_an_py39.py hl[10] *}
|
||||||
|
|
||||||
|
## Валідація числових даних: більше ніж і менше або дорівнює
|
||||||
|
|
||||||
|
Те саме застосовується до:
|
||||||
|
|
||||||
|
* `gt`: `g`reater `t`han (більше ніж)
|
||||||
|
* `le`: `l`ess than or `e`qual (менше або дорівнює)
|
||||||
|
|
||||||
|
{* ../../docs_src/path_params_numeric_validations/tutorial005_an_py39.py hl[10] *}
|
||||||
|
|
||||||
|
## Валідація числових даних: float, більше ніж і менше ніж
|
||||||
|
|
||||||
|
Валідація чисел також працює для значень типу `float`.
|
||||||
|
|
||||||
|
Ось де стає важливо мати можливість оголошувати <abbr title="greater than (більше ніж)"><code>gt</code></abbr>, а не тільки <abbr title="greater than or equal (більше або дорівнює)"><code>ge</code></abbr>. Це дозволяє, наприклад, вимагати, щоб значення було більше `0`, навіть якщо воно менше `1`.
|
||||||
|
|
||||||
|
Таким чином, значення `0.5` буде допустимим. Але `0.0` або `0` — ні.
|
||||||
|
|
||||||
|
Те саме стосується <abbr title="less than (менше ніж)"><code>lt</code></abbr>.
|
||||||
|
|
||||||
|
{* ../../docs_src/path_params_numeric_validations/tutorial006_an_py39.py hl[13] *}
|
||||||
|
|
||||||
|
## Підсумок
|
||||||
|
|
||||||
|
За допомогою `Query`, `Path` (і інших параметрів, які Ви ще не бачили) можна оголошувати метадані та перевірки рядків, так само як у [Query параметри та валідація рядків](query-params-str-validations.md){.internal-link target=_blank}.
|
||||||
|
|
||||||
|
Також можна оголошувати числові перевірки:
|
||||||
|
|
||||||
|
* `gt`: `g`reater `t`han (більше ніж)
|
||||||
|
* `ge`: `g`reater than or `e`qual (більше або дорівнює)
|
||||||
|
* `lt`: `l`ess `t`han (менше ніж)
|
||||||
|
* `le`: `l`ess than or `e`qual (менше або дорівнює)
|
||||||
|
|
||||||
|
/// info | Інформація
|
||||||
|
|
||||||
|
`Query`, `Path` та інші класи, які Ви побачите пізніше, є підкласами спільного класу `Param`.
|
||||||
|
|
||||||
|
Всі вони мають однакові параметри для додаткових перевірок і метаданих, які Ви вже бачили.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
/// note | Технічні деталі
|
||||||
|
|
||||||
|
Коли Ви імпортуєте `Query`, `Path` та інші з `fastapi`, насправді це функції.
|
||||||
|
|
||||||
|
При виклику вони повертають екземпляри класів з такими ж іменами.
|
||||||
|
|
||||||
|
Тобто Ви імпортуєте `Query`, яка є функцією. А коли Ви її викликаєте, вона повертає екземпляр класу, який теж називається `Query`.
|
||||||
|
|
||||||
|
Ці функції створені таким чином (замість використання класів напряму), щоб Ваш редактор не відзначав їхні типи як помилки.
|
||||||
|
|
||||||
|
Таким чином, Ви можете користуватися своїм звичайним редактором і інструментами для програмування без додаткових налаштувань для ігнорування таких помилок.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
@ -0,0 +1,68 @@
|
||||||
|
# Моделі Query параметрів
|
||||||
|
|
||||||
|
Якщо у Вас є група **query параметрів**, які пов’язані між собою, Ви можете створити **Pydantic-модель** для їх оголошення.
|
||||||
|
|
||||||
|
Це дозволить Вам **повторно використовувати модель** у **різних місцях**, а також оголошувати перевірки та метадані для всіх параметрів одночасно. 😎
|
||||||
|
|
||||||
|
/// note | Примітка
|
||||||
|
|
||||||
|
Ця можливість підтримується, починаючи з версії FastAPI `0.115.0`. 🤓
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
## Query параметри з Pydantic-моделлю
|
||||||
|
|
||||||
|
Оголосіть **query параметри**, які Вам потрібні, у **Pydantic-моделі**, а потім оголосіть цей параметр як `Query`:
|
||||||
|
|
||||||
|
{* ../../docs_src/query_param_models/tutorial001_an_py310.py hl[9:13,17] *}
|
||||||
|
|
||||||
|
**FastAPI** буде **витягувати** дані для **кожного поля** з **query параметрів** у запиті та передавати їх у визначену вами Pydantic-модель.
|
||||||
|
|
||||||
|
## Перевірте документацію
|
||||||
|
|
||||||
|
Ви можете побачити параметри запиту в UI документації за `/docs`:
|
||||||
|
|
||||||
|
<div class="screenshot">
|
||||||
|
<img src="/img/tutorial/query-param-models/image01.png">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## Заборона зайвих Query параметрів
|
||||||
|
|
||||||
|
У деяких особливих випадках (ймовірно, не дуже поширених) Ви можете захотіти **обмежити** query параметри, які дозволено отримувати.
|
||||||
|
|
||||||
|
Ви можете використати конфігурацію моделі Pydantic, щоб заборонити (`forbid`) будь-які зайві (`extra`) поля:
|
||||||
|
|
||||||
|
{* ../../docs_src/query_param_models/tutorial002_an_py310.py hl[10] *}
|
||||||
|
|
||||||
|
Якщо клієнт спробує надіслати **зайві** дані у **query параметрах**, він отримає **помилку**.
|
||||||
|
|
||||||
|
Наприклад, якщо клієнт спробує надіслати query параметр `tool` зі значенням `plumbus`, як у цьому запиті:
|
||||||
|
|
||||||
|
```http
|
||||||
|
https://example.com/items/?limit=10&tool=plumbus
|
||||||
|
```
|
||||||
|
|
||||||
|
Він отримає відповідь з **помилкою**, яка повідомить, що query параметр `tool ` не дозволено:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"detail": [
|
||||||
|
{
|
||||||
|
"type": "extra_forbidden",
|
||||||
|
"loc": ["query", "tool"],
|
||||||
|
"msg": "Extra inputs are not permitted",
|
||||||
|
"input": "plumbus"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Підсумок
|
||||||
|
|
||||||
|
Ви можете використовувати **Pydantic-моделі** для оголошення **query параметрів** у **FastAPI**. 😎
|
||||||
|
|
||||||
|
/// tip | Підказка
|
||||||
|
|
||||||
|
Спойлер: Ви також можете використовувати Pydantic-моделі для оголошення cookie та заголовків, але про це Ви дізнаєтеся пізніше в цьому посібнику. 🤫
|
||||||
|
|
||||||
|
///
|
||||||