حتماً با اپلیکیشن مزخرفی بهنام واتساپ کار کردهاید. واتساپ در تیم مزخرف خود، به همکار خوبی مثل شما نیاز دارد تا بهعنوان یک مهندس، بتوانید این اپلیکیشن را بهبود دهید. یکی از مهمترین کارهایی که برای نگهداری و کارایی واتساپ نیاز است، ایجاد چندین سرور و پخش نمودن درخواستهای کاربران میان آنهاست.
برای دانلود پروژهی اولیه روی [این لینک](/problemset/assignments/4367/download_problem_initial_project/129771/) کلیک کنید.
## سیستم *apiها*
واتساپ، از قبل ۴ کانتینر برای *apiهای* خود تدارک دیده که شما از جزئیات *apiها* کاملاً بیخبر هستید و محتویات این *apiها* **کاملاً محرمانه** میباشد. این *apiها،* در فایل `docker-compose.yml` وجود دارند و تنها کاری که شما باید انجام دهید، اضافه کردن یک سیستم لودبالانس بر روی پورت `80` این سیستم، در کنار بقیهی کانتینرها میباشد.
## لودبالانس
اضافه کردن یک *container* در فایل `docker-compose.yml` که بر روی پورت `80` سرور فعال باشد و میان ۴ سرویس موجود، عملیات لودبالانس را بهصورت **کاملاً مساوی** انجام دهد. به این نکته توجه داشته باشید که این لودبالانس میان سرویسها باید کاملاً مساوی اتفاق بیوفتد و تمامی ریکوئستها دقیقاً میان سرویسها بهطور برابر پخش شوند.
فراموش نکنید که **تنها** میتوانید از ایمیجهای *[Standard](https://gitlab.com/qio/standard/container_registry)* در رجیستری کوئرا استفاده نمایید. فرقی نمیکند با چه ایمیج یا تکنولوژیای این کار را انجام دهید. حتی میتوانید خودتان برنامهای بنویسید که لودبالانس انجام دهد. تنها نکتهی مهم این است که بر روی پورت `80` آن برنامه را اجرا نمایید.
همچنین توجه داشته باشید ممکن است برچسب ایمیج موردنظر شما لزوما `:latest` **نباشد**، برای مثال ایمیج `HAProxy` تنها به دو صورت `registry.gitlab.com/qio/standard/haproxy:2.5` و `registry.gitlab.com/qio/standard/haproxy:2.5-alpine` وجود دارند.
### نکتهی مهم
شما اجازهی *build* کردن ایمیج جدید **نخواهید داشت** و در صورتی که میخواهید خودتان برنامهای بنویسید که کار لودبالانس را انجام دهد، باید از پوشهی `data` که برای ایجاد *volume* در نظر گرفتیم استفاده کنید و برنامهی خود را به درون کانتینرهای موجود *volume* کنید. مثلاً برنامهای پایتونی نوشتهاید که در ایمیج پایتون استاندارد کوئرا *volume* میشود و در *entrypoint* آن را اجرا میکنید.
## ایجاد *Volume*
در صورتیکه نیاز دارید فایل یا مسیری را به درون هریک از *containerها Volume* کنید، میتوانید از پوشهای بهنام `data` استفاده کنید. و برای ایجاد *Volume* از *Relative Path* استفاده کنید. برای مثال:
```
services:
sample_container:
image: "registry.gitlab.com/qio/standard/someimage:latest"
volumes:
- ./data/somefile:/somefile
```
فراموش نکنید که فایل `somefile` را درون پوشهی `data` قرار داده و آن را برای داوری ارسال نمایید. برای مثال، پوشهی ارسالی شما برای داوری کوئرا به شکل زیر میتواند باشد:
```
.
├── data
│ └── somefile
└── docker-compose.yml
```
اگر محتوای پوشه `data`تان خالی است، میتوانید این پوشه را ارسال نکنید.
**توجه:** سیستم داوری کوئرا بهصورت خودکار فایل `docker-compose.yml` را با کامند `up` اجرا میکند. شما نیازی به کد یا اسکریپتی برای اجرای این کار ندارید.
## نحوه ارسال پاسخ
شما فقط میتوانید مسیرهای هایلایت شده را تغییر دهید:
```
.
├── <mark class="yellow" title="این پوشه را میتوانید تغییر دهید"> data </mark>
│ └── ...
├── <mark class="yellow" title="این فایل را میتوانید تغییر دهید"> docker-compose.yml </mark>
└── requirements.txt
```
در نهایت این پوشه را *zip* کرده و ارسال کنید. توجه کنید که پس از *extract* کردن فایل *zip* شما، باید فایل `docker-compose.yml` را ببینیم.