{"id":23784826,"url":"https://github.com/dimedrolity/devops-final","last_synced_at":"2026-05-07T09:31:27.024Z","repository":{"id":115086442,"uuid":"503658834","full_name":"Dimedrolity/devops-final","owner":"Dimedrolity","description":"Итоговое задание по дисциплине Программная инженерия","archived":false,"fork":false,"pushed_at":"2022-06-17T08:43:58.000Z","size":674,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-11-11T09:03:32.608Z","etag":null,"topics":["cadvisor","docker","docker-compose","golang","makefile","prometheus"],"latest_commit_sha":null,"homepage":"","language":"Dockerfile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Dimedrolity.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-06-15T07:22:15.000Z","updated_at":"2022-06-17T16:17:06.000Z","dependencies_parsed_at":null,"dependency_job_id":"d3b1d457-81ee-4ded-82db-e9d03fd25b58","html_url":"https://github.com/Dimedrolity/devops-final","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Dimedrolity/devops-final","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dimedrolity%2Fdevops-final","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dimedrolity%2Fdevops-final/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dimedrolity%2Fdevops-final/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dimedrolity%2Fdevops-final/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Dimedrolity","download_url":"https://codeload.github.com/Dimedrolity/devops-final/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dimedrolity%2Fdevops-final/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32731205,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-07T02:14:30.463Z","status":"ssl_error","status_checked_at":"2026-05-07T02:14:29.405Z","response_time":62,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cadvisor","docker","docker-compose","golang","makefile","prometheus"],"created_at":"2025-01-01T13:11:35.237Z","updated_at":"2026-05-07T09:31:27.000Z","avatar_url":"https://github.com/Dimedrolity.png","language":"Dockerfile","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Итоговое задание по дисциплине \"Программная инженерия\"\n\nЭтот файл является отчетом, в нем описаны цели проекта, используемые подходы и технологии.\n[Презентация](https://docs.google.com/presentation/d/1yU2u_vwVCvVOnOgUh-Q1wnvth5qnvQP0YyoCf-sPF74/edit?usp=sharing)\n\nЦель семестрового проекта – закрепить знания по контейнеризации приложений, непрерывной интеграции и метрикам.\n\n## Go-приложение go-chartographer💎\n\nПроект является тестовым заданием на стажировку. Целью создания были практика нового языка и устройство на стажировку. Задачи были следующие:\n- написать сервис по работе с изображениями формата BMP, предоставляющий HTTP API\n- покрыть проект модульными тестами\n\n[Постановка задачи сервиса (документация API)](https://github.com/Dimedrolity/go-chartographer/blob/master/README_task.md)\n\n[Описание решения](https://github.com/Dimedrolity/go-chartographer/blob/master/README.md) \n\nПодключен в текущий репозиторий как *git submodule*, так как является самостоятельным проектом, не зависит от текущего репозитория с инфраструктурой.\n\nДополнительно:\n\n### Зависимости\nИспользуется подход *вендоринг* - зависимости хранятся в репозитории (в папке vendor).\n\n### .run\nИспользуется для конфигурации запуска тестов и приложения с помощью IDE Goland. При наличии xml конфигов, IDE добавляет конфигурации автоматически\n![./screenshots/.run.png](./screenshots/.run.png)\n\n### Makefile\nИспользуется для фиксации команд для запуска тестов, сборки и запуска.\n\n### Docker🐳\nИспользуется для контейнеризации Go-приложения.\n\n#### multi-stage build\nСобирается в контейнере *golang:1.17-alpine*, исполняемый файл перекладывается в контейнер *alpine*. Таким образом вес итогового образа **13 Mb**.\n\n#### docker-compose\nИспользуется для:\n- конфигурации порта (чтобы не писать вручную при запуске через `docker run`)\n- связанных директорий (*volumes* a.k.a. *bind mount*)\n- установки переменных окружения в контейнере (по умолчанию используется файл .env)\n\nИспользуется версия 2 файла docker-compose.yml, так как она позволяет указать ограничение по оперативной памяти контейнера (по условию тестового задания проверка сервиса будет в контейнере с 2 Гб памяти).\nВерсия 3 не позволяет указать ограничение, так как она создана для работы в связке с *docker swarm* - [ответ от авторов](https://github.com/docker/compose/issues/4513)\n\n### Github Actions 🤖\n\nИспользуется для реализации подхода Continuous Integration. \n\nПри пуше на Github на билд сервере происходит:\n\n- запуск авто-тестов\n- сборка под Windows и Linux\n- создается Release на Github с *git тегом* latest\n- в раздел assets релиза добавляются файлы сборки\n\n![release](./screenshots/release.png)\n\n\n\n## СAdvisor🦉\n\nИспользуется для сбора метрик с Docker-контейнера Go-приложения.\n\n\n\n## AlertManager⚠️\n\nИспользуется для оповещений о памяти на Gmail.\n\n\n\n## Prometheus🔥\n\nИспользуется для получения метрик с cAdvisor.\n\nВажно отметить, что контейнеры запускаются в одной сети благодаря docker-compose, поэтому можно обращаться к контейнеру не по ip, а по названию сервиса в docker-compose.yml. Так делается в prometheus.yml для cAdvisor и AlertManager. \n\n# Запуск\n\nДолжны быть установлены Git, Docker и docker-compose.\n\n```bash\ngit clone --recurse-submodules git@github.com:Dimedrolity/devops-final.git\n\ncd devops-final\n\ndocker-compose up --build\n```\n\n# Результат\n\nС помощью docker-compose создаются docker образы и запускаются контейнеры. \n\nНа **8080** порту будет **REST API Go-приложения**.\n![./screenshots/go_api.png](./screenshots/go_api.png)\n\nНа **8081** порту **cAdvisor** Web UI с метриками контейнера Go-приложения.\n![./screenshots/c_advisor.png](./screenshots/c_advisor.png)\n\nНа **9090** порту **Prometheus** Web UI с метриками контейнера Go-приложения\n![./screenshots/prometheus.png](./screenshots/prometheus.png)\n\nПри отправке запроса в Go-приложение расход памяти увеличивается до 20+ Mb, и приходит оповещение на почту ![./screenshots/gmail.png](./screenshots/gmail.png)\n\n# Проблема 🤔\n\nНе работает метрика container_memory_usage_bytes{name=\"devops-final_go-chartographer_1\"}. Сначала подумал, что это из-за WSL (так как создаваемые сервисом изображения лежат на диске основной системы и связаны с контейнером, а внутри WSL их нет). Однако, при запуске в виртуалке тоже не работает.\n\nПоказывает килобайты данных, хотя контейнер должен весит как минимум 20 мегабайт.![./screenshots/fs_metric_fail.png](./screenshots/fs_metric_fail.png)\n\nВ cAdvisor показывается только /dev/sda5![./screenshots/cadvisor_fs.png](./screenshots/cadvisor_fs.png)\n\nХотя в конфиге docker-compose.yml связывается вся директория /dev\n\n```\n    volumes:\n      ...\n      - /dev:/dev:ro\n```\n\n# Итоги\n\nЗа семестр были изучены и применены следующие технологии:\n\n- Контейнеризация (Docker и Docker compose)\n- Continuous Integration (Github Actions)\n- Метрики и оповещений (Prometheus, Alertmanager, cAdvisor) \n\nТакже за семестр были изучены Grafana и Ansible, но не применены в итоговом задании.\n\nВ итоге я освоил новые инструменты, закрепил и систематизировал имеющиеся знания.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdimedrolity%2Fdevops-final","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdimedrolity%2Fdevops-final","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdimedrolity%2Fdevops-final/lists"}