جف بزوس برای حل مشکلات وب سرورهایی که در آمازون استفاده میشود، نیازمند این است که بتواند لاگ هر وب سرور را بصورت مرتب بررسی نماید. برای حل این مشکل او میخواهد سیستمی پیاده کند که خروجی لاگ وب سرور مورد نظر او، داخل سیستم `Elasticsearch` ذخیره شود که هم به راحتی آنها را بخواند و هم سیستم لاگ عملکرد بهینهای داشته باشد. برای این منظور شما باید پاسخ سوالهای [سوال دوم مسابقه](https://quera.ir/contest/assignments/35250/problems/128198) و [سوال پنجم مسابقه](https://quera.ir/contest/assignments/35250/problems/128202) را خود را به این صورت با هم ترکیب کنید که هم `api` خود در آن اجرا شود و هم اینکه درخواست ها توسط `nginx` به سرور `api` پروکسی شود. سپس کانتینر `Filebeat` مسئولیت خواندن لاگهای وب سرور مورد نظر (`nginx`) را بر عهده داشته باشد و در صورت اضافه شدن هر لاگ جدید آنرا برای کانتینر `Elasticsearch` ارسال نماید.
برای دانلود پروژهی اولیه روی [این لینک](/problemset/assignments/4367/download_problem_initial_project/129777/) کلیک کنید.
## کانتینرهای **Elasticsearch**
در ابتدای کار، برای پیاده سازی این سیستم، نیاز است که فایل `docker-compose.yml` را تکمیل کنید. توجه داشته باشید که شما اجازهی *build* کردن یک *Image* جدید **خواهید داشت**. برای این سوال شما میتوانید از لیست زیر استفاده نمایید:
```
registry.gitlab.com/qio/standard/elasticsearch:7.16.1
registry.gitlab.com/qio/standard/filebeat:7.16.1
registry.gitlab.com/qio/standard/nginx:1.21-alpine
```
توجه داشته باشید که باید فایل `docker-compose.yml` را به شکلی تکمیل کنید که پس از `up` کردن آن، هر ۴ کانتینر (*Elasticsearc*, *Filebeat* , *Nginx*, *Api*) به درستی اجرا شوند. سپس با توجه به درخواستهایی که از سمت سیستم داوری برای وب سرور `nginx` ارسال میشود، تعدادی لاگ در فایل مربوطه ذخیره میشود که در نهایت انتظار میرود با تنظیماتی که شما انجام دادهاید، این لاگهای جدید، به سیستم Elasticsearch منتقل شود.
### شرایط *containerها*
۱. نام containerها باید حتماً به شکل زیر باشد:
```
elasticsearch
filebeat
nginx
api
```
۲. هریک از این containerها باید روی پورت مشخصی که مربوط به آنها میباشد قرار گیرند. دقیقاً به شکل زیر:
```
port of elasticsearch = 9200
port of nginx = 80
```
دقت کنید که تنظیمات پورتها به گونهای انجام شود که وقتی سیستم داوری دستور `docker-compose up` را اجرا کرد، بتواند به هر دو پورت ۹۲۰۰ و ۸۰ دسترسی داشته باشد.
۳. نام ایندکس (`index`) که لاگها باید در آن ذخیره شود `log-index` میباشد.
۴. آدرسی که لاگهای `nginx` باید در آن ذخیره شود، آدرس `/var/log/nginx/access.log` میباشد.
۵. توجه کنید تمامی مواردی که برای `ratelimit` در سوال ۵ پیاده کرده بودید باید حذف کنید و محدودیتی از بابت ارسال درخواست به سیستم وجود نداشته باشد.
۶. محتویات فایل `docker-compose.yml` شما باید به گونهای باشد که در کمترین زمان ممکن کانتینرها آماده باشند و کار خود را انجام بدهند. برای این منظور حداکثر ۹۰ ثانیه در نظر گرفته شده است و در صورتی که زمان بیشتری طول بکشد، نمره کامل را نخواهید گرفت.
### ایجاد *Volume*
در صورتیکه نیاز دارید فایل یا مسیری را به درون هریک از *containerها Volume* کنید، میتوانید از پوشههای `api` و `data` استفاده کنید.
```
services:
sample_container:
image: "registry.gitlab.com/qio/standard/filebeat:7.16.1"
volumes:
- ./api/somefile:/somefile
- ./data/somefile2:/somefile2
```
فراموش نکنید که فایل `somefile` را درون پوشهی `api` و فایل `somefile2` را درون پوشهی `data` قرارداده و آن را برای داوری ارسال نمایید. برای مثال، پوشهی ارسالی شما برای داوری کوئرا به شکل زیر میتواند باشد:
```
.
├── api
│ └── somefile
├── data
│ └── somefile2
├── docker-compose.yml
└── requirements.txt
```
\**توجه:** سیستم داوری کوئرا بهصورت خودکار فایل `docker-compose.yml` را با کامند `up` اجرا میکند. شما نیازی به کد یا اسکریپتی برای اجرای این کار ندارید.
## شرایط نمرهدهی
نمرهای که شما دریافت میکنید، مربوط به اجرای درست و دقیق کلاستر خواهد بود. به این صورت که هر ۴ کانتینر مورد نظر باید با نامی که در بالا توضیح داده شده باید بدون مشکل اجرا شوند و همچنین لاگی که توسط وب سرور `nginx` ایجاد میشود، باید در ایندکس `log-index` کانتینر `Elasticsearch` ثبت شده باشد.
## نحوه ارسال پاسخ
شما فقط میتوانید مسیرهای هایلایت شده را تغییر دهید:
```
.
├── <mark class="yellow" title="این پوشه را میتوانید تغییر دهید"> data </mark>
│ └── ...
├── <mark class="yellow" title="این پوشه را میتوانید تغییر دهید"> api </mark>
│ └── ...
├── <mark class="yellow" title="این فایل را میتوانید تغییر دهید"> docker-compose.yml </mark>
└── requirements.txt
```
در نهایت این پوشه را *zip* کرده و ارسال کنید. توجه کنید که پس از *extract* کردن فایل *zip* شما، باید فایل `docker-compose.yml` را ببینیم.