HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: devops, проектная работа, devops-практики, devops-инструменты, search engine infra, ssh-ключ</p>
1 <p>Теги: devops, проектная работа, devops-практики, devops-инструменты, search engine infra, ssh-ключ</p>
2 <p>Заключительный модуль обучения на курсе<a>"DevOps: практики и инструменты"</a>посвящён выполнению<strong>проектной работы</strong>. Он помогает закрепить полученные знания и отработать навыки. А ещё становится отличным кейсом в портфолио и помогает при трудоустройстве в том случае, если практического опыта немного.</p>
2 <p>Заключительный модуль обучения на курсе<a>"DevOps: практики и инструменты"</a>посвящён выполнению<strong>проектной работы</strong>. Он помогает закрепить полученные знания и отработать навыки. А ещё становится отличным кейсом в портфолио и помогает при трудоустройстве в том случае, если практического опыта немного.</p>
3 <p>Один из последних проектов курса, который был выполнен выпускником, называется<strong>Search Engine Infra</strong>. Он представляет собой<strong>инфраструктурный репозиторий</strong>для проектов компании<a>Экспресс 42</a>:</p>
3 <p>Один из последних проектов курса, который был выполнен выпускником, называется<strong>Search Engine Infra</strong>. Он представляет собой<strong>инфраструктурный репозиторий</strong>для проектов компании<a>Экспресс 42</a>:</p>
4 <ol><li><a>Search Engine Crawler</a>-<strong>поисковый бот</strong>для сбора текстовой информации с веб-страниц и ссылок. Бот помещает в очередь url, переданный ему при запуске. Затем он начинает обрабатывать все url в очереди. Для каждого url бот загружает содержимое страницы, записывая в БД связи между сайтами и словами. Все url, найденные на странице, он помещает обратно в очередь.</li>
4 <ol><li><a>Search Engine Crawler</a>-<strong>поисковый бот</strong>для сбора текстовой информации с веб-страниц и ссылок. Бот помещает в очередь url, переданный ему при запуске. Затем он начинает обрабатывать все url в очереди. Для каждого url бот загружает содержимое страницы, записывая в БД связи между сайтами и словами. Все url, найденные на странице, он помещает обратно в очередь.</li>
5 <li><a>Search Engine UI</a>-<strong>веб-интерфейс поиска</strong>слов и фраз на проиндексированных ботом сайтах. Веб-интерфейс минимален: предоставляет пользователю строку для запроса и результаты. Поиск происходит только по индексированным сайтам. Результат содержит только те страницы, на которых были найдены все слова из запроса. Рядом с каждой записью результата отображается оценка полезности ссылки (чем больше, тем лучше).</li>
5 <li><a>Search Engine UI</a>-<strong>веб-интерфейс поиска</strong>слов и фраз на проиндексированных ботом сайтах. Веб-интерфейс минимален: предоставляет пользователю строку для запроса и результаты. Поиск происходит только по индексированным сайтам. Результат содержит только те страницы, на которых были найдены все слова из запроса. Рядом с каждой записью результата отображается оценка полезности ссылки (чем больше, тем лучше).</li>
6 </ol><h2>Особенности запуска Search Engine Infra на локальной машине</h2>
6 </ol><h2>Особенности запуска Search Engine Infra на локальной машине</h2>
7 <p>Необходимые компоненты - docker engine, make. Для запуска необходимо:</p>
7 <p>Необходимые компоненты - docker engine, make. Для запуска необходимо:</p>
8 <h6>1. Клонировать подмодули:</h6>
8 <h6>1. Клонировать подмодули:</h6>
9 git submodule init git submodule update<h6>2. Настроить docker/.env, monitoring/alertmanager/alertmanager.secrets.</h6>
9 git submodule init git submodule update<h6>2. Настроить docker/.env, monitoring/alertmanager/alertmanager.secrets.</h6>
10 <h6>3. Запустить проект:</h6>
10 <h6>3. Запустить проект:</h6>
11 <p>После запуска будут доступны следующие<strong>веб-интерфейсы</strong>: - crawler_ui; - grafana; - prometheus; - kibana.</p>
11 <p>После запуска будут доступны следующие<strong>веб-интерфейсы</strong>: - crawler_ui; - grafana; - prometheus; - kibana.</p>
12 <h2>Особенности запуска в GCP</h2>
12 <h2>Особенности запуска в GCP</h2>
13 <h6>1. Первоначальная настройка управляющего хоста.</h6>
13 <h6>1. Первоначальная настройка управляющего хоста.</h6>
14 <p>Предполагается, что в GCP уже создан проект docker-12345, и приложение нужно установить на stage. Для работы надо сгенерировать пару<strong>ssh-ключей</strong>и загрузить открытый ключ в список метаданных проекта (подробнее см.<a>здесь</a>).</p>
14 <p>Предполагается, что в GCP уже создан проект docker-12345, и приложение нужно установить на stage. Для работы надо сгенерировать пару<strong>ssh-ключей</strong>и загрузить открытый ключ в список метаданных проекта (подробнее см.<a>здесь</a>).</p>
15 ssh-keygen -b 2048 -t rsa -f ~/.ssh/docker-user -q -N ""<p>Далее запускаем<strong>scripts/bootstrap.sh</strong>из корня проекта. Скрипт установит и настроит нужные приложения (gcloud, ansible, packer, terraform), создаст из шаблонов конфигурационные файлы, настроит динамический inventory и т. д.</p>
15 ssh-keygen -b 2048 -t rsa -f ~/.ssh/docker-user -q -N ""<p>Далее запускаем<strong>scripts/bootstrap.sh</strong>из корня проекта. Скрипт установит и настроит нужные приложения (gcloud, ansible, packer, terraform), создаст из шаблонов конфигурационные файлы, настроит динамический inventory и т. д.</p>
16 export GCP_PROJECT=docker-12345 bash scripts/bootstrap.sh -p $GCP_PROJECT<p>Следующий шаг - настройка конфигурационных файлов (частично они уже настроены с помощью скриптов бутстрапа):</p>
16 export GCP_PROJECT=docker-12345 bash scripts/bootstrap.sh -p $GCP_PROJECT<p>Следующий шаг - настройка конфигурационных файлов (частично они уже настроены с помощью скриптов бутстрапа):</p>
17 ~/.docker/search_engine/docker/.env ~/.docker/search_engine/monitoring/alertmanager/alertmanager.secrets infra/terraform/stage/terraform.tfvars infra/terraform/prod/terraform.tfvars<h6>2. Установка без использования<strong>kubernetes</strong>.</h6>
17 ~/.docker/search_engine/docker/.env ~/.docker/search_engine/monitoring/alertmanager/alertmanager.secrets infra/terraform/stage/terraform.tfvars infra/terraform/prod/terraform.tfvars<h6>2. Установка без использования<strong>kubernetes</strong>.</h6>
18 <p>Приложение разворачивается с помощью<strong>терраформа</strong>:</p>
18 <p>Приложение разворачивается с помощью<strong>терраформа</strong>:</p>
19 source infra/ansible/.venv/bin/activate cd infra/terraform terraform init terraform apply -auto-approve cd stage/ terraform init terraform apply -auto-approve<p>Адрес приложения можно получить<strong>командой</strong>:</p>
19 source infra/ansible/.venv/bin/activate cd infra/terraform terraform init terraform apply -auto-approve cd stage/ terraform init terraform apply -auto-approve<p>Адрес приложения можно получить<strong>командой</strong>:</p>
20 <p>По этому адресу будут доступны: - веб-интерфейс crawler_ui (порт 8000); - веб-интерфес grafana (порт 3000); - веб-интерфейс prometheus (порт 9090); - веб-интерфейс kibana (порт 5601).</p>
20 <p>По этому адресу будут доступны: - веб-интерфейс crawler_ui (порт 8000); - веб-интерфес grafana (порт 3000); - веб-интерфейс prometheus (порт 9090); - веб-интерфейс kibana (порт 5601).</p>
21 <h6>3. Установка с использованием<strong>kubernetes</strong>(предпочтительно).</h6>
21 <h6>3. Установка с использованием<strong>kubernetes</strong>(предпочтительно).</h6>
22 <p>Развернуть kubernetes с помощью терраформа:</p>
22 <p>Развернуть kubernetes с помощью терраформа:</p>
23 source infra/ansible/.venv/bin/activate cd kubernetes/terraform terraform init terraform apply -auto-approve cd gke/ terraform init terraform apply -auto-approve<p>Просмотреть информацию о созданном кластере можно командой:</p>
23 source infra/ansible/.venv/bin/activate cd kubernetes/terraform terraform init terraform apply -auto-approve cd gke/ terraform init terraform apply -auto-approve<p>Просмотреть информацию о созданном кластере можно командой:</p>
24 gcloud container clusters list NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS cluster-1 europe-west1-b 1.9.7-gke.6 xx.xx.xx.xx g1-small 1.9.7-gke.6 4 RUNNING<p>После этого будут доступны следующие<strong>ресурсы</strong>: - gitlab; - grafana; - kibana.</p>
24 gcloud container clusters list NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS cluster-1 europe-west1-b 1.9.7-gke.6 xx.xx.xx.xx g1-small 1.9.7-gke.6 4 RUNNING<p>После этого будут доступны следующие<strong>ресурсы</strong>: - gitlab; - grafana; - kibana.</p>
25 <h2>Настройка Gitlab и запуск проекта Search Engine Infra</h2>
25 <h2>Настройка Gitlab и запуск проекта Search Engine Infra</h2>
26 <p>Для этого необходимо выполнить следующие шаги: - создать группу search-engine; - в группе search-engine создать проекты crawler, ui, charts, infra и загрузить соответствующие репозитории; - для проекта charts в Settings-&gt;CI/CD создать Pipeline triggers; - в группе search-engine в Settings-&gt;CI/CD-&gt;Variables добавить переменные:</p>
26 <p>Для этого необходимо выполнить следующие шаги: - создать группу search-engine; - в группе search-engine создать проекты crawler, ui, charts, infra и загрузить соответствующие репозитории; - для проекта charts в Settings-&gt;CI/CD создать Pipeline triggers; - в группе search-engine в Settings-&gt;CI/CD-&gt;Variables добавить переменные:</p>
27 CI_REGISTRY_PASSWORD CI_REGISTRY_USER SEARCH_ENGINE_DEPLOY_TOKEN<p>- собрать docker-образы и развернуть приложение. Для проектов crawler, ui в CI/CD-&gt;Pipelines выполнить Run Pipeline для ветки master.</p>
27 CI_REGISTRY_PASSWORD CI_REGISTRY_USER SEARCH_ENGINE_DEPLOY_TOKEN<p>- собрать docker-образы и развернуть приложение. Для проектов crawler, ui в CI/CD-&gt;Pipelines выполнить Run Pipeline для ветки master.</p>
28 <p>После этого будет развернут<strong>staging</strong>:</p>
28 <p>После этого будет развернут<strong>staging</strong>:</p>
29 <p>Чтобы развернуть приложение в производственную среду, нужно вручную подтвердить развёртывание в search-engine-&gt;CI/CD-&gt;Pipelines-&gt;production:</p>
29 <p>Чтобы развернуть приложение в производственную среду, нужно вручную подтвердить развёртывание в search-engine-&gt;CI/CD-&gt;Pipelines-&gt;production:</p>
30 <p>После пуша коммита в ветку микросервиса будут выполнены: - тестирование кода; - сборка образа докер контейнера:</p>
30 <p>После пуша коммита в ветку микросервиса будут выполнены: - тестирование кода; - сборка образа докер контейнера:</p>
31 loktionovam/search_engine_crawler:feature-xxx-feature-name loktionovam/search_engine_ui:feature-xxx-feature-name<p>- пуш образа в dockerhub; - запуск review приложения через gitlab environments с ручным удалением.</p>
31 loktionovam/search_engine_crawler:feature-xxx-feature-name loktionovam/search_engine_ui:feature-xxx-feature-name<p>- пуш образа в dockerhub; - запуск review приложения через gitlab environments с ручным удалением.</p>
32 <p>При изменениях в<strong>мастер ветке микросервиса</strong>будут выполнены: - тестирование кода; - сборка образа докер-контейнера; - пуш образа в dockerhub; - запуск приложения на stage из master ветки charts репозитория с ручным подтверждением развёртывания в производственную среду.</p>
32 <p>При изменениях в<strong>мастер ветке микросервиса</strong>будут выполнены: - тестирование кода; - сборка образа докер-контейнера; - пуш образа в dockerhub; - запуск приложения на stage из master ветки charts репозитория с ручным подтверждением развёртывания в производственную среду.</p>
33 <p><strong>Примечание</strong>: проект создавался с использованием DNS. Чтобы он заработал где-то ещё, нужно<strong>исправить доменную зону</strong>loktionovam.com, причём эти исправления нужно внести по всему проекту (возможно, стоит использовать шаблонизацию при<strong>бутстрапе</strong>).</p>
33 <p><strong>Примечание</strong>: проект создавался с использованием DNS. Чтобы он заработал где-то ещё, нужно<strong>исправить доменную зону</strong>loktionovam.com, причём эти исправления нужно внести по всему проекту (возможно, стоит использовать шаблонизацию при<strong>бутстрапе</strong>).</p>
34 <p><em>С более подробной информацией можно ознакомиться, перейдя по ссылке на соответствующий<a>репозиторий</a>. И, как всегда, ждём ваших комментариев!</em></p>
34 <p><em>С более подробной информацией можно ознакомиться, перейдя по ссылке на соответствующий<a>репозиторий</a>. И, как всегда, ждём ваших комментариев!</em></p>
35  
35