DevOps | Вопросы собесов
5.18K subscribers
29 photos
1 video
811 links
Cайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp

Тесты t.me/+2P7cpjeyfDVlZjcy
Вакансии t.me/+i5KFWEWJ21hhYWEy
Download Telegram
🤔 Что такое наследование, зачем оно?

Наследование – это механизм ООП, который позволяет создавать новый класс на основе существующего, перенимая его свойства и методы.

🚩Главная идея

🟠Родительский (базовый) класс
содержит общие свойства и методы.
🟠Дочерний (производный) класс
наследует их и может добавлять новые или переопределять старые.

🚩Зачем нужно наследование?

Код становится повторно используемым → меньше дублирования.
Логически группируем сущности → удобная архитектура.
Можно дополнять и изменять поведение без изменения базового класса.

🚩Пример наследования в Python

Базовый (родительский) класс
class Animal:
def __init__(self, name):
self.name = name

def make_sound(self):
return "Какой-то звук"


Дочерний класс (наследует Animal)
class Dog(Animal):
def make_sound(self):
return "Гав-гав"


Использование наследования
dog = Dog("Шарик")
print(dog.name) # Шарик (унаследовано от Animal)
print(dog.make_sound()) # Гав-гав (переопределено в Dog)


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Какие типы сервисов есть в Kubernetes?

1. ClusterIP (по умолчанию) — доступ к сервису только внутри кластера.
2. NodePort — открывает порт на каждом узле, доступ извне по nodeIP:nodePort.
3. LoadBalancer — создаёт внешний IP через облачный провайдер, маршрутизирует на сервис.
4. ExternalName — переадресует DNS-имя на внешний ресурс.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2
🤔 В чём преимущество 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. Работа с масштабируемыми приложениями. Использование гибридных или мультиоблачных решений.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Какие основные вещи использовал в Ansible плейбуках?

Часто используемые элементы:
- tasks — набор действий над хостами
- handlers — триггеры, выполняемые при изменении состояния
- variables — шаблоны для конфигурации
- templates (Jinja2) — шаблонизированные конфиги
- loops/when — условия и итерации
- includes/imports — подключение других плейбуков или задач
- become — выполнение с повышенными правами (sudo)


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1💊1
🤔 Чем отличается образ от контейнера?

Образ (Image) – это шаблон, из которого создаются контейнеры.
Контейнер (Container) – это запущенный экземпляр образа.

🚩Что такое образ (Image)?

Образ – это неизменяемый шаблон с установленным ПО
Содержит все файлы, библиотеки и зависимости
Может храниться в реестре (Docker Hub, GitHub Container Registry, ECR)
docker pull nginx:latest



Пример списка образов
docker images


Пример создания образа через Dockerfile
FROM ubuntu:latest
RUN apt update && apt install -y nginx
CMD ["nginx", "-g", "daemon off;"]

docker build -t my-nginx .



🚩Что такое контейнер (Container)?

Контейнер – это запущенный экземпляр образа
Может изменять файлы и состояние, но это не сохраняется в образе
Изолирован, но использует ядро ОС хоста
docker run -d --name web -p 80:80 nginx


Пример списка контейнеров
docker ps


Пример остановки контейнера
docker stop web


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Какая есть защита на ветках, чтобы не запушили что-то не то?

Используют protected branches. В GitLab можно запретить push в main, разрешить только через merge request с код-ревью, включить required approvals, проверку пайплайнов и запретить force-push. Это повышает стабильность и безопасность.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
🤔 Какие есть метрики для измерения качества системы?

Для измерения качества системы (особенно в DevOps, SRE и разработке) используют различные метрики производительности, надежности и доступности.

🚩Основные метрики качества системы

🟠Метрики "Четырёх ключевых показателей" (DORA)
Эти метрики помогают оценить эффективность процессов DevOps:
Lead Time for Changes (Время доставки изменений) — время от написания кода до его выхода в прод.
Deployment Frequency (Частота развертываний) — как часто изменения попадают в прод.
Mean Time to Restore (MTTR) (Среднее время восстановления) — как быстро исправляются инциденты.
Change Failure Rate (Процент неудачных изменений) — доля развертываний, вызывающих сбои.

🟠Метрики надежности и доступности (SRE)
Эти метрики помогают измерять надежность системы:
SLA (Service Level Agreement) — договорное время доступности (например, 99.9%).
SLO (Service Level Objective) — целевое значение доступности (например, 99.95%).
SLI (Service Level Indicator) — фактические измеренные показатели (например, 99.93%).
Error Rate — процент ошибок в системе (HTTP 500, таймауты и т. д.).
Latency (Задержка) — время ответа системы на запросы.

🟠Метрики производительности
Они показывают, насколько быстро работает система:
CPU Utilization — загрузка процессора.
Memory Usage — использование оперативной памяти.
Disk I/O — скорость чтения/записи на диск.
Network Throughput — пропускная способность сети.
Response Time — время отклика системы.

🟠Метрики пользовательского опыта
Оценивают удобство работы пользователей с системой:
Apdex (Application Performance Index) — индекс удовлетворенности пользователей (0–1).
TTFB (Time to First Byte) — время до получения первого байта ответа от сервера.
Page Load Time — время полной загрузки страницы.
Bounce Rate — процент пользователей, покинувших сайт без взаимодействия.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
🤔 В Docker-контейнере локальной учётной записи выполнили команду docker run alpine ID: какой ID будет выведен?

Если просто указать ID, как команду в alpine, это будет попытка выполнить такую команду в контейнере. Так как ID не является встроенной в Alpine командой, скорее всего будет выведено сообщение об ошибке — команда не найдена.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥3💊2
🤔 Что используется внутри докер контейнера?

Внутри Docker-контейнера используется изолированная среда, которая позволяет запускать приложения в предсказуемом и воспроизводимом окружении. Контейнер предоставляет доступ к базовой файловой системе, процессам, сетевым интерфейсам и другим ресурсам, изолированным от хоста и других контейнеров. Давайте разберем основные компоненты, которые используются внутри Docker-контейнера.

🟠Файловая система
Каждый контейнер имеет собственную файловую систему, основанную на многослойной архитектуре. Это изолированное пространство предоставляет доступ к: Образу Docker (image): Базовый набор файлов, определенных в Docker Image. Copy-on-write (COW): Контейнеры используют copy-on-write слой для изменений. Базовый образ остается неизменным, а любые изменения записываются в слой контейнера. Точки монтирования: Возможность монтировать директории хоста или сетевые тома (volumes) для сохранения данных.
docker run -v /host/path:/container/path nginx


🟠Процессы
В контейнере запускаются процессы, как в обычной операционной системе. Главный процесс контейнера (например, команда из CMD или ENTRYPOINT) работает с PID 1 и отвечает за выполнение приложения. Процессы внутри контейнера изолированы от процессов на хосте благодаря использованию Linux namespaces.
docker exec <container_id> ps aux


🟠Сетевые интерфейсы
Docker-контейнеры используют виртуальные сетевые интерфейсы для связи:
veth-pair: Каждый контейнер имеет виртуальный интерфейс, подключенный к мосту (docker0 по умолчанию).
Типы сетей:
bridge (по умолчанию): Локальная сеть между контейнерами.
host: Контейнер использует сетевой стек хоста.
none: Полностью изолированный контейнер без сети.
overlay: Сеть для соединения контейнеров на разных хостах.
docker network create my_network
docker run --network my_network nginx


🟠Ресурсы хоста (CPU, память, диски)
Контейнеры используют ресурсы хоста, но их потребление можно ограничить:
CPU: Контейнер может использовать определенную долю процессора.
docker run --cpus="2" nginx


Память: Лимит на использование оперативной памяти.
docker run -m 512m nginx


I/O (диск): Возможность ограничения операций чтения/записи.
docker run --device-read-bps=/dev/sda:1mb nginx


🟠Изоляция (Namespaces и Control Groups)
Docker использует технологии изоляции, встроенные в ядро Linux:
Namespaces: Обеспечивают изоляцию пространства имен (PID, сети, файловой системы и т.д.). Control Groups (cgroups): Управляют использованием ресурсов (CPU, RAM, I/O).
lsns


🟠Среда выполнения (Runtime)
Docker-контейнеры работают благодаря среде выполнения, например:
runc: Легковесное средство выполнения контейнеров, совместимое со стандартом OCI. containerd: Менеджер для запуска контейнеров, который Docker использует для взаимодействия с низкоуровневыми компонентами.

🟠Настройки и переменные среды
Контейнер может быть настроен с использованием:
Переменных среды: Устанавливаются через ENV в Dockerfile или с помощью флага -e.
docker run -e ENV_VAR=value nginx


Аргументов при сборке: Используются в Dockerfile через ARG.
ARG BUILD_VERSION


🟠Приложение или служба
Главное, что работает внутри контейнера, — это само приложение: Например, веб-сервер (Nginx, Apache) или база данных (MySQL, PostgreSQL). Контейнеры упрощают запуск приложений с предсказуемыми зависимостями.

🟠Логи и мониторинг
Docker предоставляет возможность просматривать логи контейнера и собирать метрики
Логи
docker logs <container_id>


Информация о контейнере
docker inspect <container_id>


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥2
🤔 Что вообще означает eviction или evict?

Evict означает "выселить" или "удалить". В Kubernetes это означает, что pod удаляется с текущей ноды — либо временно (будет пересоздан), либо навсегда (если не управляется контроллером). Это часть механизма автоматического самовосстановления и балансировки нагрузки.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍1
🤔 Что такое 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


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
🤔 Какой командой можно показать все работающие процессы на Linux?

Для этого используется команда, которая отображает все активные процессы в системе, включая информацию о PID, пользователе, состоянии и потреблении ресурсов.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊47🤔11👍2
🤔 Какие framework знаешь?

Фреймворки — это библиотеки, упрощающие разработку. Они бывают для веба, DevOps, тестирования, машинного обучения и т. д.

🚩Веб-разработка

🟠Backend (серверная часть)
Django (Python) — мощный фреймворк для веб-приложений.
Flask (Python) — минималистичный микрофреймворк.
FastAPI (Python) — для API, быстрый на async.
Spring Boot (Java) — корпоративные приложения.
Express.js (Node.js) — популярный фреймворк для API.
NestJS (Node.js) — модульный TypeScript-фреймворк.

🟠Frontend (клиентская часть)
React (JavaScript) — компоненты, Virtual DOM.
Vue.js (JavaScript) — лёгкий и быстрый.
Angular (TypeScript) — для сложных приложений.
Svelte — новый подход к реактивному UI.

🚩DevOps и инфраструктура

Ansible — автоматизация серверов.
Terraform — управление облаками через код.
Kubernetes (K8s) — оркестрация контейнеров.
Docker Swarm — альтернатива Kubernetes.
Prometheus — сбор метрик, мониторинг.
ELK Stack (Elasticsearch, Logstash, Kibana) — логирование.

🟠Тестирование
PyTest (Python) — удобное тестирование.
Selenium — тестирование UI в браузерах.
JUnit (Java) — тесты для Java-приложений.
Postman — API-тестирование.

🟠Машинное обучение и анализ данных
TensorFlow — глубокое обучение.
PyTorch — альтернатива TensorFlow.
Scikit-learn — классическое ML.
Pandas — обработка данных.
Matplotlib, Seaborn — визуализация данных.

🟠GameDev
Unity (C#) — 2D/3D-игры.
Unreal Engine (C++) — мощный движок.
Godot — лёгкий и бесплатный.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊8
🤔 Что такое Agile и что такое Scrum?

- Agile — это подход к разработке, ориентированный на гибкость, постоянную обратную связь, быструю поставку ценности и итеративность.
- Scrum — это фреймворк внутри Agile, с чёткими ролями (Scrum Master, Product Owner, команда), спринтами, ретроспективами, ежедневными митингами.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Как и где посмотреть логи какого-нибудь сервиса?

Обычно хранятся в каталоге /var/log. Также многие современные дистрибутивы используют систему журналирования systemd для управления и просмотра логов.

🚩Способы просмотра

🟠Просмотр логов в /var/log
Каталог /var/log содержит логи большинства системных сервисов и приложений.

Логи системных сообщений
/var/log/syslog: Содержит общие системные логи. /var/log/messages: Содержит общие системные сообщения (не во всех дистрибутивах).
cat /var/log/syslog
less /var/log/syslog
tail -f /var/log/syslog


Логи конкретных сервисов
Apache: /var/log/apache2/ или /var/log/httpd/ Логи доступа: /var/log/apache2/access.log или /var/log/httpd/access_log Логи ошибок: /var/log/apache2/error.log или /var/log/httpd/error_log
tail -f /var/log/apache2/access.log
tail -f /var/log/apache2/error.log


Nginx: /var/log/nginx/ Логи доступа: /var/log/nginx/access.log Логи ошибок: /var/log/nginx/error.log
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log


MySQL: /var/log/mysql/ или /var/log/mysqld.log
tail -f /var/log/mysql/error.log 


SSH: /var/log/auth.log или /var/log/secure
tail -f /var/log/auth.log 


🟠Использование `journalctl` для системных логов
journalctl — это утилита для просмотра и управления журналами systemd. Она позволяет фильтровать логи по различным критериям, таким как время, сервис и уровень логирования.

Основные команды journalctl
Просмотр всех журналов
journalctl  



Логов конкретного сервиса
journalctl -u nginx.service  


Последних логов и продолжение просмотра в реальном времени
journalctl -f
journalctl -u nginx.service -f


Логов за определённый период
journalctl --since "2024-07-25 12:00:00" --until "2024-07-25 13:00:00" 


Логов с определённым уровнем логирования
journalctl -p err
journalctl -p warning


🚩Примеры использования

🟠Просмотр логов Apache
Логи доступа
tail -f /var/log/apache2/access.log  


Логи ошибок
tail -f /var/log/apache2/error.log 


🟠Просмотр логов Nginx
Логи доступа
tail -f /var/log/nginx/access.log


Логи ошибок
tail -f /var/log/nginx/error.log  


🟠Использование `journalctl` для просмотра логов Nginx
Все логи Nginx
journalctl -u nginx.service  


Последние логи Nginx в реальном времени
journalctl -u nginx.service -f


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🤔 Почему в микросервисной архитектуре принята практика "1 контейнер = 1 процесс"?

1. Простота и масштабируемость:
- Легче управлять и масштабировать один процесс в контейнере.
2. Изоляция:
- Каждый контейнер изолирован, что упрощает отладку и обновление.
3. Следование принципу "малые единицы":
- Каждый контейнер выполняет одну задачу, что соответствует философии микросервисов.
4. Упрощение мониторинга и логирования:
- Логи и метрики проще ассоциировать с конкретным процессом.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🤔 Где хранятся данные о группах которые существуют в системе?

В Linux информация о группах пользователей хранится в файле:
/etc/group — основной файл, содержащий список всех групп системы.

🚩Как посмотреть список групп?

Вывести содержимое файла /etc/group
cat /etc/group


Формат строк в файле
имя_группы:x:GID:пользователи


Пример
root:x:0:
sudo:x:27:alice,bob
developers:x:1001:john,mary


Найти группу по имени
grep '^sudo:' /etc/group


Выведет
sudo:x:27:alice,bob


Узнать, в каких группах состоит пользователь
groups alice


или
id -Gn alice


Выведет
alice sudo developers


🚩Где ещё хранятся группы?

🟠Файл `/etc/gshadow`
хранит пароли групп
Если у группы есть пароль (редкость), он хранится здесь.
Формат:
  имя_группы:пароль:GID:админы_группы

Пример:
sudo:!:27:
developers:!:1001:john


Посмотреть содержимое
sudo cat /etc/gshadow


🟠LDAP или Active Directory (если система подключена к домену)
Если используется корпоративный домен, данные о группах могут храниться в LDAP или Active Directory.
getent group


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое sidecar и зачем он нужен?

Sidecar — это дополнительный контейнер, запускаемый рядом с основным контейнером в одном поде. Он используется для таких задач, как сбор логов, метрик, проксирование трафика, монтирование секретов и шифрование.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍3
🤔 Когда вы создаёте файл какие права создаются по умолчанию?

Права доступа по умолчанию зависят от базовых прав доступа и значения umask. Базовые права доступа — это значения, которые система использует для определения разрешений перед применением маски umask.

🟠Файлы: 666 (rw-rw-rw-)
Это означает, что по умолчанию все пользователи могут читать и записывать в файл.

🟠Каталоги: 777 (rwxrwxrwx)
Это означает, что по умолчанию все пользователи могут читать, записывать и выполнять (заходить) в каталог.

🚩Значение umask: 022

Это маска, которая определяет, какие права будут отключены при создании нового файла или каталога. Значение umask указывается в восьмеричной системе счисления.

🟠Создание файла
Базовые права доступа: 666
Значение umask: 022
Окончательные права доступа: 666 - 022 = 644 (rw-r--r--)

🟠Создание каталога
Базовые права доступа: 777
Значение umask: 022
Окончательные права доступа: 777 - 022 = 755 (rwxr-xr-x)

🚩Создание файла с umask 0022

1⃣Установка umask
umask 0022   


2⃣Создание файла
touch myfile   


3⃣Проверка прав доступа
ls -l myfile   


Вывод
Права доступа: 644 (rw-r--r--)
-rw-r--r-- 1 user user 0 Jul 26 12:00 myfile    


🚩Создание каталога с umask 0027

1⃣Установка umask
umask 0027   


2⃣Создание каталога
mkdir mydir   


3⃣Проверка прав доступа
ls -ld mydir   


Вывод
Права доступа: 750 (rwxr-x---)
drwxr-x--- 2 user user 4096 Jul 26 12:00 mydir     


🚩Дополнительные замечания

🟠umask в скриптах
Вы можете установить umask в скрипте для задания прав доступа по умолчанию для всех создаваемых файлов и каталогов.
#!/bin/bash
umask 027
touch file1
mkdir dir1


🟠Проверка прав доступа в разных ситуациях
Для файлов: По умолчанию права доступа 666 минус umask.
Для каталогов: По умолчанию права доступа 777 минус umask.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
🤔 Что порождает init-процесс?

Init создаётся ядром ОС после загрузки, и он порождает все остальные процессы, в том числе системные службы и пользовательские сессии. Его PID всегда равен 1. В контейнерах тоже может быть свой init, чтобы обрабатывать сигналы и управлять дочерними процессами.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9