# Тестовое для ТрейдСофт ## Пререквизиты - ВМ или контейнер с 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 и статистика запросов к нему по виртуальным хостам.