From f7b202ad7fd145b3402a02c1a92011cc3dbee8a9 Mon Sep 17 00:00:00 2001 From: dave Date: Fri, 11 Nov 2022 15:59:53 +0300 Subject: [PATCH] feat: add readme --- README.md | 131 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..bc1dbc7 --- /dev/null +++ b/README.md @@ -0,0 +1,131 @@ +# Тестовое для ТрейдСофт + +## Пререквизиты +- ВМ или контейнер с Debian 11, который будет работать в качестве Docker-хоста (Docker ставить не нужно) +- настроено SSH-подключение под учеткой root (для Ansible) +- Python 3 (для Ansible) +- две записи в файле hosts: + 1. `apache1.local 10.90.0.2` + 2. `apache2.local 10.90.0.2` + +## Настройки сети по умолчанию +- "внешний" IP хостовой ВМ: `10.61.1.1/16` +- IP хостовой ВМ в бридже с контейнерами: `10.90.0.1/16` +- IP range для контейнеров: `10.90.0.0/16` + +Для изменения настроек требуется: +1. переопределить IP ВМ/контейнеров в файле `hosts` +2. указать настройки подсети Docker в виде параметров хоста `hv`: +``` +docker_network_subnet: 10.90.0.0/16 +docker_network_gateway: 10.90.0.1 +docker_network_iprange: 10.90.0.0/16 +``` + +Контейнеры будут находиться в одном бридже с хостовой ВМ. + +## Деплой + +`ansible-playbook -vv all.yml` + +## Что сделано (группировка по контейнерам): +- [x] nginx +- [x] apache1 +- [x] apache2 +- [x] node_exporter +- [x] nginx_exporter +- [ ] mysql_exporter +- [x] cadvisor +- [ ] prometheus +- [ ] grafana +- [ ] fluentd +- [ ] mysql + +## Исходные данные + +### Часть №1 + +Создать виртуальную машину на базе Linux Debian 11 (minimal) + +Подготовить ansible playbook для настройки этой машины, который установит docker и развернет стек приложений, +запущенных в разных docker-контейнерах: +- nginx (нужен с поддержкой GeoIP модуля) +- 2 apache с mod_php (или php-fpm) +- node exporter +- nginx exporter +- mysql exporter +- cadvisor +- prometheus +- grafana +- fluentd +- mysql + +Nginx образ собрать с поддержкой модуля GeoIP. Для nginx создать кастомный формат логов, который будет содержать +- timestamp +- request_time +- upstream_time +- remote_addr +- remote_use +- time_local +- request +- status +- body_bytes_sent +- http_referer +- http_user_agent +- geoip_country_code + +Ansible должен создать необходимую структуру папок (допустим в /opt или /srv), с необходимыми конфигами и логами. +Сеть докера для всех контейнеров должна быть одна, т.е. все контейнеры должны видеть друг друга. + +Сервисы должно быть в разных контейнерах. +Контейнеры можно взять из docker hub, или создать свои (через Dockerfile). + +Контейнеры должны быть в частной сети, каждому назначить отдельный IP. +Nginx должен использоваться в качестве реверс прокси к apache. + + +Все конфиги храним в родительской системе, например: +/srv/nginx/conf +/srv/nginx/logs +/srv/apache/conf +/srv/apache/logs +/srv/mysql/conf +/srv/mysql/logs + +папка для контента: +/srv/www/html + +Необходимо создать 2 доменных имени направленные на IP данной виртуальной машины. + +Написать пару простых скриптов на php, по одному в каждый из apache или php-fpm. Создать виртуальные хосты в nginx, +которые будут смотреть на разные apache (php-fpm). Скрипт должен имитировать нагрузку, можно через рандомный +sleep в 1-4 секунды (так в логах nginx можно посмотреть upstream_time), выводить имя виртуального хоста, а также время работы. +Скрипты расположить в папке для контента. + +Логи apache и nginx также вывести наружу контейнеров. + +### Часть №2 + +Установить связку prometheus+grafana +На виртуалку поставить node-exporter и настроить сбор метрик с нее, чтобы они отправлялись в prometheus и отображались в grafana + +Метрики хоста (виртуальной машины), docker, nginx и mysql должны собираться через prometheus. +В графане сделать настроить дашборды (можно взять готовые), которые выводят данные метрики. +Grafana и prometheus должны проксироваться через nginx. + +Fluentd настроить на сбор логов от nginx. в mysql создать базу с таблицей, куда эти логи будут выводиться, поля таблицы +должны соответствовать формату логов nginx. Fluentd должен аггрегировать логи и отправлять в mysql. +Также в grafana нужно создать отдельный дашборд, который будет выводить последние 100 записей из созданной таблицы и должен быть график количества запросов к nginx по виртуальным хостам. + + +Ожидаемое поведение после настройки всего: +Допустим будет 2 виртуальных хоста first.tst и second.tst, каждый смотрит на свой бэкенд. По заходу на каждый из них будет выводиться имя виртуального хоста и время работы скрипта. Доменные имена для проверки можно поместить в hosts на компьютере, откуда будет идти проверка, скажем: + +grafana.tst +prometheus.tst +first.tst +second.tst + +Они должны указывать на IP созданной виртуальной машины. + +Ansible плейбук должен отработать, и ожидается что после настройки доменов в hosts можно будет зайти на соответствующие сайты, в grafana будет отображение метрик хоста, nginx, mysql, логи nginx и статистика запросов к нему по виртуальным хостам.