fa
Feedback
DevOps | Вопросы собесов

DevOps | Вопросы собесов

رفتن به کانال در Telegram

Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv

نمایش بیشتر
5 546
مشترکین
اطلاعاتی وجود ندارد24 ساعت
+107 روز
+4530 روز
آرشیو پست ها
🤔 Как организовать метод хранения ролей, чтобы они были доступны плейбуку, когда он вызывается? Роли должны находиться в директории roles, либо можно задать путь к ним через параметр roles_path в файле ansible.cfg. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Куда идет деплой из релизных веток? Касается подходов к управлению релизами в системах контроля версий, таких как Git, и их интеграции с процессами CI/CD. Ответ зависит от структуры разработки и процесса релиза в конкретной команде или компании. Однако, в общем, деплой из релизных веток обычно идет на тестовые, стейджинговые или продакшн-окружения. Давайте разберем этот процесс подробнее. 🚩Что такое релизные ветки? Это ветки, которые создаются на этапе, когда функционал и исправления, готовые к выпуску, отделяются от основной ветки разработки (например, main или develop). Они позволяют: Заморозить текущий набор изменений для подготовки к релизу. Отделить доработки и исправления релиза от активной разработки. Упростить процесс тестирования и последующего деплоя. 🚩Куда обычно идет деплой из релизных веток? 🟠Тестовое окружение (QA environment) На тестовое окружение деплой из релизной ветки осуществляется для прохождения проверок качества: Автоматизированное и ручное тестирование. Проверка производительности, безопасности и других аспектов.
stages:
  - test
deploy:
  stage: test
  script:
    - echo "Deploying release branch to QA"
    - ./deploy.sh qa
  only:
    - release/*
🟠Стейджинговое окружение (Staging) После успешного прохождения тестов релизную ветку деплоят в стейджинг. Это окружение максимально похоже на продакшн и используется для финального тестирования: Проверка совместимости с продакшн-системами. Демонстрация функционала заказчикам или заинтересованным сторонам.
stages:
  - staging
deploy:
  stage: staging
  script:
    - echo "Deploying release branch to Staging"
    - ./deploy.sh staging
  only:
    - release/*
🟠Продакшн (Production) После прохождения всех этапов тестирования изменения из релизной ветки деплоятся в продакшн: Обычно это делается автоматически после финального подтверждения. В некоторых командах финальный мерж релизной ветки в main инициирует деплой.
stages:
  - production
deploy:
  stage: production
  script:
    - echo "Deploying release branch to Production"
    - ./deploy.sh production
  only:
    - release/*
🚩Зачем это нужно? 🟠Изоляция релиза Релизные ветки позволяют избежать включения новых, неподготовленных изменений в текущий релиз. 🟠Гибкость Если в процессе тестирования или релиза найдены баги, их можно исправить прямо в релизной ветке без влияния на разработку. 🟠Управление рисками Релизные ветки упрощают управление разными стадиями разработки и релиза. 🚩Пример использования 1⃣Разработчик создает ветку release/1.0.0 от develop. 2⃣Выполняются тесты на QA окружении. 3⃣Исправляются баги в release/1.0.0, и изменения деплоятся на стейджинг. 4⃣После успешного тестирования ветка мержится в main, и начинается деплой в продакшн. Ставь 👍 и забирай 📚 Базу знаний

🤔 Как задать права на всё? Если ты хочешь дать максимальные права всем (rwx): - Числовая форма: chmod 777 файл - 7 = 4 (r) + 2 (w) + 1 (x) - Символьная форма: chmod a+rwx файл - a = all Осторожно: такие права дают полный доступ всем, включая анонимных пользователей. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие коды ответа мы получаем от веб-сервера? Коды ответа (HTTP status codes) от веб-сервера представляют собой числовые коды, которые отправляются клиенту (обычно веб-браузеру) в ответ на его запрос. Эти коды помогают клиенту понять, что произошло с его запросом: был ли он успешен, произошла ли ошибка, требуется ли дополнительное действие и т.д. 🚩HTTP-коды ответа разделены на пять основных категорий: 🟠1xx (Информационные): Запрос принят, продолжается обработка. 100 Continue: Сервер получил начальную часть запроса, и клиент должен продолжать. 101 Switching Protocols: Сервер принимает запрос на изменение протокола. 🟠2xx (Успех): Запрос успешно обработан. 200 OK: Запрос успешно обработан, и сервер возвращает запрошенные данные. 201 Created: Запрос успешно выполнен, и в результате создан новый ресурс. 202 Accepted: Запрос принят для обработки, но обработка еще не завершена. 204 No Content: Запрос успешно выполнен, но сервер не возвращает никакого содержимого. 🟠3xx (Перенаправление): Для завершения обработки запроса требуется дальнейшее действие со стороны клиента. 301 Moved Permanently: Запрашиваемый ресурс был перемещен на новый постоянный URL. 302 Found: Запрашиваемый ресурс временно доступен по другому URL. 304 Not Modified: Запрашиваемый ресурс не изменился со времени последнего доступа (кэширование). 307 Temporary Redirect: Запрашиваемый ресурс временно доступен по другому URL. Клиент должен использовать исходный метод для нового запроса. 🟠4xx (Ошибка клиента): Ошибка в запросе клиента. 400 Bad Request: Сервер не может обработать запрос из-за неверного синтаксиса. 401 Unauthorized: Запрос требует аутентификации. 403 Forbidden: Сервер понял запрос, но отказывается его выполнять. 404 Not Found: Запрашиваемый ресурс не найден на сервере. 405 Method Not Allowed: Метод, указанный в запросе, не разрешен для запрашиваемого ресурса. 409 Conflict: Запрос не может быть выполнен из-за конфликта с текущим состоянием ресурса. 🟠5xx (Ошибка сервера): Ошибка на стороне сервера при попытке обработки запроса. 500 Internal Server Error: Общая ошибка сервера. Сервер не может выполнить запрос. 501 Not Implemented: Сервер не поддерживает функциональность, необходимую для выполнения запроса. 502 Bad Gateway: Сервер, действуя как шлюз или прокси, получил неверный ответ от вышестоящего сервера. 503 Service Unavailable: Сервер временно недоступен, обычно из-за перегрузки или технического обслуживания. 504 Gateway Timeout: Сервер, действуя как шлюз или прокси, не дождался ответа от вышестоящего сервера. Ставь 👍 и забирай 📚 Базу знаний

🤔 Чем бы вы заменили Logstash на Windows? На Windows Logstash часто заменяют на Filebeat, поскольку он легче, проще настраивается и эффективно выполняет задачи по пересылке логов, особенно если преобразование логов минимально. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое PaaS? Это облачная модель, предоставляющая готовую среду для разработки, тестирования и развертывания приложений без необходимости управлять инфраструктурой (серверы, сети, ОС). 🚩Примеры PaaS-платформ Heroku → Легкий деплой веб-приложений. Google App Engine → Запуск приложений в облаке Google. AWS Elastic Beanstalk → Автоматическое управление инфраструктурой. Microsoft Azure App Services → Запуск приложений в Azure без управления серверами. 🚩Когда использовать PaaS? Если хотите быстро развернуть приложение без настройки серверов. Когда важна автоматическая масштабируемость.* Если не хотите заниматься управлением ОС и базами данных. 🚩Пример работы с PaaS (Heroku) 1⃣Устанавливаем Heroku CLI
curl https://cli-assets.heroku.com/install.sh | sh
2⃣Авторизуемся
heroku login
3⃣Разворачиваем приложение
git push heroku main
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что означает "сделать rebase на main branch"? Это значит взять свои коммиты из текущей ветки и "переместить" их так, как будто они были созданы после последних коммитов main. Так достигается линейная история, устраняются лишние слияния и конфликты фиксируются заранее. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 На каких принципах работает докер? Это платформа для автоматизации развертывания, масштабирования и управления приложениями в контейнерах. Контейнеры позволяют изолировать приложения и их зависимости, обеспечивая легкую переносимость и консистентность окружения. Основные принципы работы Docker включают в себя контейнеризацию, использование образов, контейнеров, оркестрацию и сетевую инфраструктуру. 🚩Основные принципы 🟠Контейнеризация Контейнеризация позволяет запускать приложения и их зависимости в изолированных окружениях. Контейнеры предоставляют легкие и эффективные среды, которые включают все необходимое для запуска приложений. Контейнеры: Легковесные, изолированные окружения, которые работают поверх ядра хостовой операционной системы. Namespace: Механизм ядра Linux, обеспечивающий изоляцию процессов, сети, PID, пользовательских идентификаторов и монтирования файловых систем. Cgroups: Контрольные группы в Linux, которые ограничивают и отслеживают использование ресурсов контейнерами, включая процессорное время, память и I/O. 🟠Использование образов Образы Docker являются шаблонами для создания контейнеров. Образ включает в себя все необходимые компоненты, такие как код приложения, библиотеки, зависимости и конфигурационные файлы. Dockerfile: Скрипт, содержащий инструкции по созданию образа. Используется для автоматизации создания образов. Слойность: Каждый образ состоит из нескольких слоев, которые кэшируются и могут использоваться повторно, что ускоряет процесс сборки и уменьшает использование ресурсов. 🟠Изоляция и безопасность Docker обеспечивает изоляцию приложений, что позволяет запускать несколько контейнеров на одном хосте без взаимного влияния. Изоляция процессов: Каждый контейнер имеет свой собственный процессорный контекст, что исключает конфликты между приложениями. Изоляция файловой системы: Контейнеры имеют свои собственные файловые системы, изолированные от файловой системы хостовой операционной системы. Безопасность: Docker использует механизмы, такие как AppArmor, SELinux и seccomp, для обеспечения безопасности контейнеров. 🟠Управление сетями Docker предоставляет гибкие возможности управления сетями для контейнеров, включая создание изолированных сетей и подключение контейнеров к различным сетям. Bridge Network: Создает изолированную сеть для контейнеров на одном хосте. Host Network: Контейнер использует сетевые интерфейсы хостовой операционной системы. Overlay Network: Позволяет контейнерам на разных хостах взаимодействовать друг с другом. Macvlan Network: Контейнеры получают собственные MAC-адреса и ведут себя как физические устройства в сети. 🟠Хранение данных Docker поддерживает различные механизмы хранения данных для обеспечения сохранности и доступности данных контейнеров. Volumes: Независимые от контейнеров хранилища данных, которые могут быть подключены к одному или нескольким контейнерам. Bind Mounts: Позволяют монтировать директории хостовой файловой системы в контейнеры. Tmpfs: Использует память хоста для хранения данных контейнера, что полезно для временных данных. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое Prometheus? Prometheus — это система мониторинга и оповещения с открытым исходным кодом, которая собирает метрики с различных источников, храня их в виде временных рядов данных. Он поддерживает гибкий язык запросов PromQL для анализа собранных метрик и построения графиков. Prometheus активно используется для мониторинга инфраструктуры и приложений, а также интегрируется с системами алертинга, такими как Alertmanager. Он особенно полезен для мониторинга микросервисов и облачных приложений. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В чём преимущество Kubernetes как платформы? Это платформа для оркестрации контейнеров, которая упрощает развертывание, управление и масштабирование приложений. Она имеет ряд ключевых преимуществ, которые делают её популярной в DevOps и облачных решениях. 🚩Основные плюсыАвтоматизация управления приложениями Kubernetes автоматически запускает, останавливает и перезапускает контейнеры при сбоях. Поддерживает заданное число экземпляров (реплик) приложений, перезапуская или создавая их при необходимости. ➕Масштабирование (горизонтальное и вертикальное) Ручное: Легко увеличить или уменьшить количество контейнеров (поды) для приложения. Автоматическое: Используя Horizontal Pod Autoscaler (HPA), Kubernetes добавляет ресурсы при увеличении нагрузки. ➕Высокая доступность (HA) Kubernetes поддерживает отказоустойчивость: Если один узел (node) выходит из строя, поды перемещаются на другие узлы. Внутренний балансировщик нагрузки распределяет трафик между подами. ➕Платформонезависимость Kubernetes работает в любых средах: Локальных (например, Minikube). В публичных облаках (AWS, Google Cloud, Azure). В гибридных и on-premise инфраструктурах. ➕Управление конфигурацией и секретами Kubernetes упрощает работу с настройками: ConfigMaps: Для управления конфигурационными данными. Secrets: Для безопасного хранения конфиденциальной информации, например, ключей API или паролей. ➕Эффективное использование ресурсов Kubernetes помогает оптимизировать потребление CPU и памяти: Устанавливая минимальные и максимальные лимиты ресурсов для каждого приложения. Перераспределяя ресурсы между приложениями. ➕Расширяемость Kubernetes поддерживает плагины и кастомизацию: Сетевые плагины (Calico, Flannel) для настройки сети. Системы мониторинга (Prometheus, Grafana). Операторы для автоматизации сложных задач. ➕Сообщество и экосистема Kubernetes поддерживается большинством крупных облачных провайдеров. Обширная экосистема инструментов: Helm для управления шаблонами, ArgoCD для GitOps, Istio для сетевых взаимодействий. 🚩Когда особенно полезен? Разработка микросервисных архитектур. Частые релизы и автоматизация CI/CD. Работа с масштабируемыми приложениями. Использование гибридных или мультиоблачных решений. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что произойдёт с контейнером, если будет превышен лимит по памяти? Контейнер будет немедленно остановлен, и статус пода отразит ошибку OOMKilled. Это защита от выхода за пределы выделенных ресурсов. Такой лимит жёсткий, и превышение приводит к завершению процесса. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Может ли быть несколько контейнеров в поде? Да, в Kubernetes Pod можно запускать несколько контейнеров, и это обычная практика. Pod — это минимальная единица развертывания в Kubernetes которая может содержать один или несколько контейнеров. 🚩Зачем запускать несколько контейнеров в одном Pod? 🟠Sidecar-контейнеры вспомогательные контейнеры, дополняющие основное приложение (логирование, прокси, безопасность). 🟠Init-контейнеры выполняют задачи перед запуском основного контейнера (например, подготовка базы данных). 🟠Общий файловый кэш контейнеры могут использовать общие тома (volumes) для хранения данных. 🟠Общий сетевой стек контейнеры в одном Pod разделяют IP-адрес и порты. 🚩Пример: два контейнера в одном Pod (Nginx + логирование) Допустим, у нас есть Nginx и отдельный контейнер, который собирает его логи.
yaml  
apiVersion: v1  
kind: Pod  
metadata:  
  name: nginx-pod  
spec:  
  containers:  
  - name: nginx  
    image: nginx  
    volumeMounts:  
    - name: log-volume  
      mountPath: /var/log/nginx  

  - name: log-collector  
    image: busybox  
    command: ["sh", "-c", "tail -f /var/log/nginx/access.log"]  
    volumeMounts:  
    - name: log-volume  
      mountPath: /var/log/nginx  

  volumes:  
  - name: log-volume  
    emptyDir: {}  
🚩Как работают контейнеры внутри Pod? Все контейнеры внутри Pod имеют один IP-адрес и могут взаимодействовать через localhost. Например, если в одном контейнере работает Node.js на порту 3000, другой контейнер внутри Pod может обращаться к нему через localhost:3000. Контейнеры могут делиться файлами через volumes, как в примере выше. Если нужно выполнить команду перед запуском основного контейнера, используют initContainers.
yaml  
apiVersion: v1  
kind: Pod  
metadata:  
  name: app-pod  
spec:  
  initContainers:  
  - name: wait-for-db  
    image: busybox  
    command: ["sh", "-c", "until nc -z db-service 5432; do sleep 1; done"]  

  containers:  
  - name: app  
    image: my-app
Ставь 👍 и забирай 📚 Базу знаний

🤔Как запустишь приложение в Kubernetes? Чтобы запустить приложение в Kubernetes: 1. Подготовь манифест YAML с описанием (обычно это Deployment или StatefulSet). 2. Убедись, что есть нужный Service, чтобы обеспечить доступ к приложению. 3. Применяешь манифест командой: 4. kubectl apply -f <файл>.yaml Приложение развернётся в виде подов, которые будут управляться контроллером. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое SLA, SLO, SLI? Эти три термина относятся к управлению надежностью и качеством IT-сервисов. Они помогают определить, измерить и гарантировать уровень обслуживания пользователей. 🚩SLI (Service Level Indicator) – Показатель уровня сервиса SLI – это метрика, которая показывает, насколько хорошо работает сервис. - Доступность (например, uptime 99.9%) - Время ответа API (например, менее 200 мс) - Ошибки запросов (например, не более 1% 5xx ошибок) 🚩SLO (Service Level Objective) – Целевой уровень сервиса SLO – это цель, которую компания ставит для SLI. Доступность 99.9% сервиса в месяц. Среднее время ответа API ≤ 200 мс. 🚩SLA (Service Level Agreement) – Соглашение об уровне сервиса SLA – это официальное соглашение между клиентом и провайдером сервиса, которое описывает обязательства и штрафы за их невыполнение. - Если доступность меньше 99.9%, клиент получает возврат денег. - Если среднее время ответа API больше 500 мс, клиент получает скидку. 🚩Как они связаны? SLI (метрика) → измеряет, насколько хорош сервис. SLO (цель) → устанавливает, каким должен быть сервис. SLA (договор) → фиксирует обязательства и штрафы. Ставь 👍 и забирай 📚 Базу знаний

Бесплатный курс по дизайну: веб, графический и UX/UI Получи востребованные навыки: - создание дизайна сайтов и приложений - с
Бесплатный курс по дизайну: веб, графический и UX/UI Получи востребованные навыки: - создание дизайна сайтов и приложений - создание инфографики и карточек для маркетплейсов - работа в графическом редакторе Figma и др. Студенты курса в среднем зарабатывают от 68 000 ₽ уже во время обучения💰 Зарегистрироваться #реклама 16+ ydaev.ru О рекламодателе

🤔 Что должно находиться внутри пода? Внутри пода размещаются один или несколько контейнеров, выполняющих взаимосвязанные задачи. Также могут быть volume для хранения данных и sidecar-контейнеры для дополнительных функций, таких как логирование. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое config map в кубере? ConfigMap в Kubernetes – это механизм хранения конфигурационных данных. Он позволяет разделять код приложения и настройки, храня конфигурацию в виде ключ-значение. ConfigMap удобен для передачи переменных окружения, файлов конфигурации, командных аргументов без изменения образа контейнера. 🚩Основные способы использования ConfigMap 🟠Переменные окружения передача настроек через ENV. 🟠Файлы конфигурации монтирование в контейнер как файл. 🟠Параметры командной строки передача аргументов в command. 🚩Как создать ConfigMap? 1⃣Создание из манифеста
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  APP_ENV: "production"
  LOG_LEVEL: "debug"
  CONFIG_FILE: |
    [settings]
    mode = "production"
    debug = true
2⃣Создание из командной строки
kubectl create configmap my-config --from-literal=APP_ENV=production --from-literal=LOG_LEVEL=debug
3⃣Создание из файла
kubectl create configmap my-config --from-file=config.ini
🚩Как использовать ConfigMap в подах? 1⃣Как переменные окружения
apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: app
    image: my-app
    env:
    - name: APP_ENV
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: APP_ENV
2⃣Как монтируемый файл
apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: app
    image: my-app
    volumeMounts:
    - name: config-volume
      mountPath: "/etc/config"
  volumes:
  - name: config-volume
    configMap:
      name: my-config
Ставь 👍 и забирай 📚 Базу знаний

Стажировки и вакансии для DevOps - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в Telegram 👉 @jobs_d
Стажировки и вакансии для DevOps - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в Telegram 👉 @jobs_devops 🤖 ML & DS 👩‍💻 DevOps 👨‍✈️ ИБ & OSINT 👣 Go 👩‍💻 Mobile 👩‍💻 C# 👩‍💻 Node.js 👩‍💻 Python 🔎 QA 👩‍💻 Java 👩‍💻 UX/UI 👩‍💻 Frontend 🖼️ PHP 📋 Analyst 💼 1C 🖥 SQL 👩‍💻 IT HR Пока другие листают джоб-сайты — ты уже пишешь HR в Telegram.

🤔 Как сделать свой провайдер в Terraform? Для этого нужно: - Написать провайдер на Go; - Описать ресурсы, методы CRUD; - Зарегистрировать и протестировать его через Terraform Plugin SDK; - Опубликовать или использовать локально. Это позволяет управлять неподдерживаемыми или внутренними ресурсами. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое Web Sockets (веб сокет)? WebSockets (веб-сокеты) — это коммуникационный протокол, предоставляющий возможность устанавливать постоянное, двустороннее соединение между клиентом (обычно веб-браузером) и сервером через один TCP-соединение. Это позволяет обмениваться данными в реальном времени с минимальной задержкой и без необходимости повторного открытия соединения для каждого обмена сообщениями, как это происходит в традиционных HTTP-соединениях. 🚩Основные характеристики WebSockets: 🟠Двусторонняя коммуникация: WebSockets поддерживают полноценную двустороннюю (или full-duplex) коммуникацию, что позволяет как клиенту, так и серверу отправлять данные в любое время без необходимости инициирования запроса. 🟠Постоянное соединение: После установления WebSocket-соединение остается открытым, что значительно уменьшает задержки, связанные с установлением новых соединений, характерных для HTTP-запросов. 🟠Меньший накладной расход: WebSockets используют меньше заголовков по сравнению с HTTP-запросами, что делает передачу данных более эффективной и менее затратной по времени и ресурсам. 🟠Протокол: WebSocket протокол стандартизирован в RFC 6455 и поддерживается большинством современных веб-браузеров. Соединение начинается с обычного HTTP-запроса, который затем "обновляется" до WebSocket-соединения через HTTP-заголовок Upgrade. 🚩Как работает WebSocket: 🟠Установление соединения: Клиент отправляет HTTP-запрос с заголовком Upgrade: websocket на сервер, указывая на желание перейти к протоколу WebSocket. Сервер отвечает подтверждением, если поддерживает WebSockets, и соединение устанавливается. 🟠Передача данных: После установления соединения клиент и сервер могут обмениваться данными в обе стороны по мере необходимости. Сообщения передаются как фреймы (frames), которые могут содержать текстовые или бинарные данные. 🟠Закрытие соединения: Соединение может быть закрыто любой стороной в любой момент времени с отправкой соответствующего фрейма закрытия. 🚩Применения WebSocket: 🟠Реальное время: Приложения, требующие обновлений в реальном времени, такие как чаты, системы обмена сообщениями, онлайн-игры, торги на биржах. 🟠Потоковая передача данных: Веб-сокеты идеально подходят для приложений, передающих данные в реальном времени, таких как спортивные трансляции или финансовые данные. 🟠Уведомления и оповещения: Приложения, отправляющие мгновенные уведомления пользователям, например, социальные сети или системы мониторинга. 🟠Коллаборативные инструменты: Инструменты для совместной работы, такие как совместное редактирование документов или доски с заметками. Преимущества WebSocket: 🟠Эффективность: Меньший накладной расход и постоянное соединение делают WebSockets более эффективными для приложений, требующих частого обмена данными. 🟠Скорость: WebSockets обеспечивают более низкую задержку, что делает их идеальными для приложений, работающих в реальном времени. 🟠Простота использования: WebSockets имеют простой API, который легко интегрируется с современными веб-приложениями. Ставь 👍 и забирай 📚 Базу знаний