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

Тесты t.me/+2P7cpjeyfDVlZjcy
Вакансии t.me/+i5KFWEWJ21hhYWEy
Download Telegram
🤔 Какая может быть проблема если вы подключаетесь к серверу через ssh а вам приходят тикеты, что другие пользователи не могут подключиться по ssh по одной и той же учётной записи

Если вы можете подключиться к серверу по SSH, но другие пользователи, использующие ту же учетную запись, не могут, возможны следующие причины:

🟠Проблема с ограничением количества подключений
В файле конфигурации SSH (/etc/ssh/sshd_config) могут быть ограничения на число одновременных подключений.
Открываем конфигурацию SSH
sudo nano /etc/ssh/sshd_config


Проверяем параметры
MaxSessions 1
MaxStartups 10:30:60


Решение
Увеличьте MaxSessions, например:
MaxSessions 10


Перезапустите SSH:
sudo systemctl restart sshd


🟠Файл .ssh/authorized_keys имеет неверные права
Если у вас ключевая авторизация, возможно, права на файлы .ssh/authorized_keys нарушены.
На сервере выполните:
ls -l ~/.ssh/authorized_keys


Если права не 600, исправьте
chmod 600 ~/.ssh/authorized_keys


🟠Ограничение по IP (DenyUsers, AllowUsers, TCP Wrappers)
Конфигурация SSH может блокировать подключения для определенных IP или пользователей.
Откройте /etc/ssh/sshd_config и проверьте параметры
DenyUsers user1
AllowUsers admin


Проверьте /etc/hosts.deny и /etc/hosts.allow
cat /etc/hosts.deny
cat /etc/hosts.allow


🟠Закончились доступные PTY (псевдотерминалы)
Если исчерпан лимит доступных PTY, новые сессии не смогут открываться.
Запустите
ls /dev/pts


Если там слишком много открытых сессий, попробуйте очистить:
pkill -u user


или увеличьте лимит в /etc/security/limits.conf
* hard nproc 1024
* soft nproc 1024


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
🤔 Места нет, находим большой файл (5 Гб), удаляем его, но места всё равно нет. В чём причина?

Файл может быть открыт процессом, и пока он используется, его место на диске не освобождается.
Решение:
1. Проверить открытые файлы: lsof | grep deleted.
2. Найти процессы, держащие файл: fuser -v /путь/к/файлу.
3. Перезапустить процесс: systemctl restart <service> или kill -9 <PID>.
4. Альтернатива – очистить файл без удаления: > /путь/к/файлу.


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

Версионирование инфраструктурного кода (Infrastructure as Code, IaC) позволяет отслеживать изменения, управлять конфигурациями и обеспечивать повторяемость развертываний. Основные инструменты: Git, Terraform, Ansible, Pulumi и другие.

🚩Версионирование в Terraform
Terraform — один из ключевых инструментов IaC, позволяет управлять инфраструктурой декларативно.
В versions.tf указываем конкретную версию Terraform и провайдеров:
terraform {
required_version = ">= 1.3.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.0"
}
}
}


Хранение состояния в S3 или Terraform Cloud
Чтобы избежать конфликтов при одновременной работе, храните состояние в общем месте:
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "prod/terraform.tfstate"
region = "us-east-1"
encrypt = true
dynamodb_table = "terraform-lock"
}
}


🟠Версионирование с Ansible
В requirements.yml фиксируем версии ролей:
roles:
- name: geerlingguy.nginx
version: "3.1.0"


Применяем роли
ansible-galaxy install -r requirements.yml


🟠Автоматизация версионирования через CI/CD
Подключаем GitHub Actions, GitLab CI, Jenkins или Terraform Cloud.
name: Terraform CI
on:
push:
branches:
- main
jobs:
terraform:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3

- name: Setup Terraform
uses: hashicorp/setup-terraform@v1
with:
terraform_version: 1.3.0

- name: Terraform Init
run: terraform init

- name: Terraform Plan
run: terraform plan


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3
🤔 На одном сервере top показывает LA=20, на другом LA=2. Где ситуация лучше?

LA (Load Average) – среднее число процессов в очереди на выполнение.
- LA=20 – значит, что 20 процессов ждут CPU, что указывает на перегрузку.
- LA=2 – более нормальная нагрузка.
- Оптимальный LA ≈ числу ядер CPU (nproc). Если LA существенно выше количества ядер, сервер перегружен.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥31🤯1
🤔 В каких случаях используется multi stage?

Multi-stage (многоэтапная сборка) — это метод создания Docker-образов, позволяющий уменьшить их размер и повысить безопасность.

🚩Когда используется?

🟠Оптимизация размера образа
удаляем ненужные зависимости из финального образа.
🟠Безопасность
не включаем инструменты сборки в рабочий контейнер.
🟠Скорость деплоя
меньший образ быстрее скачивается и запускается.
🟠Кросс-компиляция
собираем приложение в одном окружении, а запускаем в другом.

🚩Пример использования Multi-stage в Docker

Допустим, у нас есть приложение на Go. Мы сначала компилируем его в одном контейнере, а затем создаем минимальный образ для запуска.
# Этап 1: сборка
FROM golang:1.20 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# Этап 2: минимальный образ для запуска
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]


🚩Использование в React / Angular / Vue

При сборке фронтенда мы можем сначала установить зависимости и собрать проект, а затем развернуть его на nginx.
# Этап 1: сборка приложения
FROM node:18 AS builder
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . .
RUN npm run build

# Этап 2: деплой на nginx
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]


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

Это ограничение времени жизни данных:
- В кэше – указывает, сколько времени кэшированные данные остаются актуальными.
- В DNS – время перед обновлением записи.
- В пакетах сети – ограничивает время существования пакета, после чего он удаляется (ping -t).
- В базах данных – регулирует автоматическое удаление данных (например, в Redis).


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

В Astra Linux (как и в Debian/Ubuntu) системный Python используется для работы ОС, и его обновление может привести к проблемам. Поэтому лучше устанавливать другую версию Python отдельно**, не заменяя системную.

🟠Установка Python через deadsnakes PPA (для Astra на основе Debian 9/10)
Если Astra Linux основана на Debian 9/10 (например, Astra Smolensk или Orlov), можно использовать PPA
sudo apt update
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa -y
sudo apt update
sudo apt install -y python3.10 # Устанавливаем нужную версию


После установки можно проверить
python3.10 --version


🟠Компиляция Python из исходников (универсальный способ)
Если нужная версия недоступна в репозитории, компилируем Python вручную.
Устанавливаем зависимости
sudo apt update
sudo apt install -y build-essential libssl-dev \
libreadline-dev libsqlite3-dev \
zlib1g-dev libbz2-dev libffi-dev


Скачиваем исходники Python
cd /usr/src
sudo wget https://www.python.org/ftp/python/3.11.6/Python-3.11.6.tgz
sudo tar xvf Python-3.11.6.tgz


Компилируем Python
cd Python-3.11.6
sudo ./configure --enable-optimizations
sudo make -j$(nproc)
sudo make altinstall # НЕ make install, чтобы не затереть системный Python


Проверяем
python3.11 --version


🟠Использование pyenv (изолированные версии Python)
Если нужно переключаться между разными версиями Python, лучше использовать pyenv.
curl https://pyenv.run | bash


Добавляем в ~/.bashrc или ~/.profile
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv virtualenv-init -)"


Активируем изменения
source ~/.bashrc


Устанавливаем новую версию Python
pyenv install 3.10.12
pyenv global 3.10.12 # Делаем версию по умолчанию


Проверяем:
python --version


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 В чем основные пойнты Git Flow?

Это стратегия управления ветками в Git, предназначенная для удобной командной разработки. Основные ветки:
- master – стабильная версия кода, которая всегда готова к релизу.
- develop – основная ветка для разработки, в которую вливаются новые фичи.
- feature/* – ветки для отдельных функций, которые создаются от develop и сливаются обратно после завершения.
- release/* – ветки для подготовки к релизу, после чего код попадает в master.
- hotfix/* – срочные исправления для master, минуя develop.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥5
🤔 В каких случаях удобно использовать kubernetes, а в каких docker-compose?

Оба инструмента управляют контейнерами, но предназначены для разных сценариев.

🚩Когда использовать Docker Compose?

Docker Compose удобен для локальной разработки и небольших проектов.
Разворачиваете приложение на одном сервере.
Нужно быстро поднять несколько сервисов (БД, кэш, бекенд, фронт).
Разработка ведется в команде, и среда должна быть одинаковой.
Нет необходимости в сложном оркестрационном механизме (авто-масштабирование, балансировка нагрузки).
Файл docker-compose.yml для запуска бэкенда и базы данных локально:
version: '3'
services:
app:
image: my-backend:latest
ports:
- "5000:5000"
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password


Команда запуска:
docker-compose up -d


🚩Когда использовать Kubernetes?

Kubernetes удобен для продакшн-окружений, облаков и сложных приложений.
Нужно масштабирование (автоматическое увеличение/уменьшение количества контейнеров).
Требуется автоисправление (если контейнер падает, он перезапускается).
Используется балансировка нагрузки (Kubernetes распределяет трафик между подами).
Нужна развертка в кластере (несколько машин, облако).
Требуется обновление без простоя (rolling updates).
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-backend:latest
ports:
- containerPort: 5000


Разворачиваем в Kubernetes:
kubectl apply -f my-app.yaml


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

Это механизм расширенного управления правами доступа к файлам и директориям. В отличие от стандартных POSIX-разрешений (rwx), ACL позволяет задавать индивидуальные права для каждого пользователя или группы. Используется для более гибкого контроля доступа.


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

При работе с CI/CD (GitHub Actions, GitLab CI, Jenkins) часто нужно запускать пайплайн только при изменении определенных файлов. Это помогает оптимизировать сборку, экономить ресурсы и время.

🚩В GitHub Actions (on: push, paths)

В GitHub Actions можно указать файлы, изменения в которых запустят пайплайн.
name: Infra Pipeline
on:
push:
paths:
- 'infra/**'
- 'k8s/**'
pull_request:
paths:
- 'infra/**'
- 'k8s/**'
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Deploy Infrastructure
run: ./deploy.sh


🚩В GitLab CI/CD (only: changes)

В GitLab можно настроить запуск пайплайна по изменению файлов с помощью only: changes.
stages:
- deploy

terraform:
stage: deploy
script:
- terraform apply -auto-approve
only:
changes:
- terraform/**


🚩В Jenkins (when { changes })

В Jenkins Declarative Pipeline можно использовать when { changes } для проверки измененных файлов.
pipeline {
agent any
stages {
stage('Deploy Ansible') {
when { changes path: 'ansible/**' }
steps {
sh './deploy_ansible.sh'
}
}
stage('Deploy Helm') {
when { changes path: 'helm/**' }
steps {
sh './deploy_helm.sh'
}
}
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥4
🤔 Что такое VPC?

Это изолированная виртуальная сеть в облаке, позволяющая управлять подсетями, маршрутами и подключениями к интернету или локальным ресурсам. Обеспечивает безопасность и гибкость развертывания облачных сервисов.


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

Файл terraform.tfstate содержит текущее состояние инфраструктуры. Если его неправильно хранить, возможны конфликты и повреждение данных.

🚩Плохие решения

Локально (terraform.tfstate в репозитории)
Потеря данных, если разработчик сменит машину.
Конфликты, если несколько человек применяют terraform apply.
Невозможно откатиться к старому состоянию.
Не поддерживает блокировки (terraform lock).
Возможны проблемы с одновременным доступом.

🚩Лучшие решения для хранения `tfstate`

🟠S3 + DynamoDB (AWS) → Самый популярный способ
S3 хранит tfstate, а DynamoDB предотвращает конфликты.
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "prod/terraform.tfstate"
region = "us-east-1"
encrypt = true
dynamodb_table = "terraform-lock"
}
}


🟠Terraform Cloud/Enterprise → Официальное SaaS-решение
Terraform Cloud хранит tfstate в облаке HashiCorp.
terraform {
backend "remote" {
hostname = "app.terraform.io"
organization = "my-org"
workspaces {
name = "my-workspace"
}
}
}


🟠Google Cloud Storage (GCS) + Firestore (GCP)
Для GCP аналог AWS S3 — это Google Cloud Storage (GCS), а DynamoDB заменяется Firestore.
terraform {
backend "gcs" {
bucket = "my-tfstate-bucket"
prefix = "terraform/state"
}
}


🟠Azure Storage + Azure CosmosDB (Azure)
Для Azure можно использовать Azure Storage и блокировки через Azure CosmosDB.
terraform {
backend "azurerm" {
resource_group_name = "my-rg"
storage_account_name = "myterraformstate"
container_name = "tfstate"
key = "prod.terraform.tfstate"
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Как осуществляется процесс тестирования кода в pipeline? Делегируете или делаете сами?

Процесс тестирования в CI/CD pipeline может включать:
- Юнит-тесты – проверка отдельных модулей кода.
- Интеграционные тесты – проверка взаимодействия компонентов.
- Линтеры и статический анализ – контроль качества кода.
- Нагрузочные тесты – проверка работы под нагрузкой.
Обычно разработчики пишут тесты, QA проверяют интеграцию, а DevOps настраивают автоматическое тестирование.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 Какие процессы убивает long killer?

Это системный механизм в Astra Linux (и некоторых других дистрибутивах на базе Debian), который убивает "долгоиграющие" процессы, потребляющие слишком много ресурсов. Он предотвращает зависания системы и защищает от неэффективного использования вычислительных мощностей.

🚩Какие процессы убивает Long Killer?

Long Killer анализирует процессы и завершает те, которые:
Запущены от обычного пользователя (не root).
Работают слишком долго (по умолчанию >10 минут).
Потребляют много CPU (по умолчанию >90% CPU).
Используют много памяти (если система близка к OOM – Out of Memory).
Не имеют активности (зависли, например, ожидание ввода).

Он не убивает root-процессы.
Системные службы (например, sshd, systemd) остаются нетронутыми.
Если процесс выполняется интерактивно (например, работа в vim или nano), он обычно не трогает его.

🚩Как проверить, что процесс убит Long Killer?

Если подозреваете, что ваш процесс завершился из-за Long Killer, посмотрите логи
journalctl -u long-killer.service --no-pager | tail -n 20


Также можно проверить dmesg
dmesg | grep "killed by Long Killer"


🚩Как отключить или настроить Long Killer?

Файл конфигурации находится здесь
/etc/long-killer.conf


Пример настроек
MAX_CPU_USAGE=90     # Максимальная загрузка CPU (%)
MAX_EXEC_TIME=600 # Максимальное время выполнения (секунды)
EXCLUDE_USERS=root # Не убивать процессы от root


После изменения перезапустите сервис
systemctl restart long-killer.service


Чтобы полностью отключить Long Killer
systemctl stop long-killer.service
systemctl disable long-killer.service


🚩Как избежать убийства процессов?

Запуск от root (если это безопасно):
sudo my_long_process

Снижение приоритета процесса (nice/renice)
nice -n 10 my_process
renice -n 10 -p <PID>

Использование nohup или screen для фоновых задач
nohup my_script.sh &


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Что известно про процесс, каким образом фича доходит до релиза?

1. Разработчик создает feature-ветку от develop, реализует функциональность.
2. Код проходит код-ревью и тестирование (CI/CD pipeline).
3. После успешного тестирования фича вливается в develop.
4. Когда накоплено достаточно изменений, создается release-ветка.
5. Финальное тестирование, исправление багов, деплой на staging.
6. Если все в порядке, release вливается в master, и обновление выкатывается в продакшен.


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

Донастройка контейнера может понадобиться, если:
Нужно изменить файлы конфигурации.
Установить дополнительные пакеты.
Задать переменные среды.
Подключить тома или сети.

Варианты донастройки: через Dockerfile, docker-compose, exec, тома и Entrypoint/CMD.

🟠Донастройка через Dockerfile (Лучший способ)
Если контейнер нужно модифицировать перед запуском, создаем свой Dockerfile на основе существующего образа.
FROM nginx:latest
COPY my-nginx.conf /etc/nginx/nginx.conf
CMD ["nginx", "-g", "daemon off;"]


Собираем новый образ
docker build -t my-nginx .
docker run -d -p 80:80 my-nginx


🟠Донастройка через `docker-compose` (Гибкость)
Можно задать окружение, тома, команды.
version: '3'
services:
db:
image: postgres:15
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: secret
POSTGRES_DB: mydb
volumes:
- ./custom-postgres.conf:/etc/postgresql/postgresql.conf
command: postgres -c config_file=/etc/postgresql/postgresql.conf


Запуск
docker-compose up -d


🟠Донастройка запущенного контейнера (`docker exec`)
Если контейнер уже работает, можно внести изменения прямо в него.
docker exec -it my-container bash
apt update && apt install -y vim


🟠Донастройка через тома (Volumes)
Если нужно изменять файлы без пересборки образа, подключаем тома.
docker run -d -p 80:80 -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf nginx


🟠Использование `ENTRYPOINT` или `CMD`
Можно задать скрипт донастройки, который выполнится при старте контейнера.
FROM postgres:15
COPY setup.sh /docker-entrypoint-initdb.d/setup.sh
RUN chmod +x /docker-entrypoint-initdb.d/setup.sh


В setup.sh:
#!/bin/bash
psql -U postgres -d mydb -c "CREATE TABLE test (id SERIAL PRIMARY KEY);"


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 Есть Virtual Shared Hosting, и в рамках него часть клиентов получают контент не из своего ServerName, а из общего ServerName. Почему?

Это может происходить из-за неправильной конфигурации виртуальных хостов в веб-сервере (Apache, Nginx). Возможные причины:
- Отсутствует или некорректно указан ServerName в конфигурации.
- Конфигурация по умолчанию (default_server) используется для всех клиентов.
- DNS-записи не настроены или кешируются неправильно.


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

В 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
👍3
🤔 Каким образом сделать так, чтобы при старте сервиса Docker-Compose контейнер не принимал пользовательский трафик до тех пор, пока контейнер не будет готов обрабатывать запросы?

Можно использовать несколько механизмов:
1. healthcheck – добавить в docker-compose.yml проверку состояния контейнера:
Контейнер не будет считаться "здоровым", пока тест не пройдет успешно.
2. depends_on с condition: service_healthy (в Docker Compose v3.4+):
Гарантирует, что контейнер запустится только после успешного старта зависимого сервиса.
3. EntryPoint скрипт – добавить задержку перед стартом сервиса:
Это гарантирует, что контейнер ждет готовности БД или другого сервиса перед запуском.


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