Skills for Real Engineers: Инструменты и практика
Комплексный гайд по ключевым навыкам инженера: настройка хоста, автоматизация инфраструктуры. Практические примеры с Docker, Proxmox и системным управлением.
Основы инфраструктурного управления
Основы инфраструктурного управления
Перед тем как запускать первый контейнер или виртуальную машину, нужно решить, на каком оборудовании они будут жить и как этот хост будет конфигурироваться. Много проблем в продакшене начинаются не с кода приложения, а с того, что сервер собран «как получилось»: без плана дисковой разметки, с динамическим IP и без понимания, кто и когда будет обновлять пакеты.
Ниже разберу два этапа: проектирование хоста и его конфигурацию. Примеры из своей практики — как домашней инфраструктуры на Proxmox, так и рабочих серверов, где я отвечал за 2 000+ узлов.
Проектирование хоста
Во-первых, нужно определить роль хоста. Это будет гипервизор Proxmox, сервер приложений под Docker или узел хранения на ZFS? От роли зависит выбор железа, файловой системы и сетевой схемы. Я называю серверы в честь персонажей советских мультфильмов — Винни-Пух, Пятачок, Сова, Кролик — не из ностальгии, а потому что имя сразу говорит о назначении. Винни-Пух — основной гипервизор, Пятачок — легкий узел для тестов, Сова — хранилище бэкапов.
С практической точки зрения, проектирование хоста начинается с разметки дисков. Не ставьте всё на один раздел. Отдельно вынесите /boot, /var, /var/log и /home. Если используется ZFS, продумайте пулы и vdev заранее — переделать потом сложнее, чем собрать заново.
Пример разметки для хоста под Proxmox:
bash# parted /dev/sda mklabel gpt
# parted /dev/sda mkpart primary 1MiB 3MiB
# parted /dev/sda set 1 bios_grub on
# parted /dev/sda mkpart primary 3MiB 513MiB
# parted /dev/sda set 2 boot on
# parted /dev/sda mkpart primary 513MiB 100%
Затем настройте сеть. Динамический DHCP на сервере — это источник неопределённости. Я всегда прописываю статический адрес и отдельный интерфейс для управления (IPMI/iDRAC на Dell PowerEdge, например). Ниже пример systemd-networkd для интерфейса eno1:
ini# /etc/systemd/network/20-eno1.network
[Match]
Name=eno1
[Network]
Address=192.168.1.10/24
Gateway=192.168.1.1
DNS=1.1.1.1
DNS=8.8.8.8
После применения конфига перезапустите сетевой демон:
bash# systemctl restart systemd-networkd
Предсказуемость конфигурации — это когда через полгода вы открываете файл и точно знаете, зачем каждая строка там написана. GUI для тех, кто не знает, где лежит конфиг. Я пишу конфиги руками.
Конфигурация и настройка
Когда хост спроектирован, переходим к настройке. Начинаю с базового набора пакетов и SSH. Root-логин по паролю отключаю сразу, оставляю только ключи. Пример /etc/ssh/sshd_config:
ini# /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
X11Forwarding no
С практической точки зрения, после SSH настраиваю брандмауэр. На Debian/Ubuntu использую nftables — он современнее iptables и проще читается. Минимальный набор правил:
nft# /etc/nftables.conf flush ruleset table inet filter { chain input { type filter hook input priority 0; policy drop; iifname "lo" accept ct state established,related accept ip protocol icmp accept tcp dport 22 accept tcp dport 80 accept tcp dport 443 accept } chain forward { type filter hook forward priority 0; policy drop; } chain output { type filter hook output priority 0; policy accept; } }
Применить:
bash# nft -f /etc/nftables.conf
# systemctl enable --now nftables
Логи ведут в journald. Я делаю их постоянными, чтобы после перезагрузки не терять историю:
ini# /etc/systemd/journald.conf
Storage=persistent
Compress=yes
SystemMaxUse=1G
Затем перезапускаем journald:
bash# systemctl restart systemd-journald
Для обновлений и бэкапов использую systemd-таймеры вместо cron. Это вписывается в общую логику управления хостом через systemd. Пример таймера, который раз в неделю проверяет доступные обновления:
ini# /etc/systemd/system/apt-check.timer
[Unit]
Description=Еженедельная проверка обновлений apt
[Timer]
OnCalendar=weekly
Persistent=true
[Install]
WantedBy=timers.target
ini# /etc/systemd/system/apt-check.service
[Unit]
Description=Проверка обновлений apt
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/bin/apt-get update
Включаем:
bash# systemctl daemon-reload
# systemctl enable --now apt-check.timer
Если мы посмотрим на хост через месяц после настройки, он должен вести себя одинаково: те же сервисы, те же правила брандмауэра, те же логи. Это и есть предсказуемость, которой не хватает многим инфраструктурам, собранным «на коленке».
Автоматизация и DevOps
<function=web_search, arguments={"query": "Docker Compose best practices 2024 Kubernetes deployment manifests example"}}>
Мониторинг и безопасность
Мониторинг и безопасность
Сбор и анализ логов
Мониторинг логов — основа понимания того, что происходит внутри инфраструктуры. Без регулярного анализа логов невозможно быстро найти причину сбоев, отследить инциденты и обеспечить стабильность сервисов. В современной практике используется комбинация агентов сбора, центрального хранения и визуализации.
Логирование на уровне сервисов
Для большинства приложений на Kubernetes и Proxmox рекомендуется использовать лог-агент Nginx или ELK-стек. Например, на Raspberry Pi, который служит хостом для Plex, можно настроить сбор логов через journald и отправку в локальный Elasticsearch:
bash# Настройка journald для удобного доступа к логам
sudo systemctl enable journald
sudo systemctl start journald
# Создание конфига для централизованного логирования
cat > /etc/logrotate.d/elasticsearch << 'EOF'
/var/lib/elasticsearch/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 root adm
}
EOF
Сбор и анализ логов с Prometheus и Grafana
Для мониторинга метрик сервисов и системного состояния стандартным выбором является Prometheus в связке с Grafana. Например, настройка экспортеров для Nginx, PostgreSQL и Redis:
yaml# prometheus.yml — конфигурация Prometheus
scrape_configs:
- job_name: 'nginx'
static_configs:
- targets: ['nginx-1.2.3:90']
- job_name: 'postgresql'
static_configs:
- targets: ['postgres-1.2.3:5432']
- job_name: 'redis'
static_configs:
- targets: ['redis-1.2.3:6379']
В Grafana можно создать дашборд, который отображает:
- Трафик на веб-сервер (requests/sec, latency)
- Занятость CPU и памяти на каждой ноде Proxmox
- Статус базы данных (connections, query latency)
Контроль доступа и безопасность
Без надёжного контроля доступа инфраструктура становится мишенью для атак. На уровне Proxmox VE и Docker необходимо внедрять несколько слоёв защиты: файрволы, аутентификация, сетевой изоляция и правильное управление правами.
Аутентификация и управление доступом
Для Proxmox рекомендуется использовать LDAP или OAuth2 для централизованного управления пользователями:
bash# Включение LDAP-аутентификации в Proxmox
sudo systemctl enable proxmox-auth-ldap
# Добавление сервера LDAP в конфиг
sudo proxmox-auth-ldap --server=ldap.example.com --bind=dummy
Для Docker рекомендуется использовать docker-compose с secrets и networks для изоляции контейнеров. Пример безопасного docker-compose.yml:
yamlversion: '3.8'
services:
app:
image: myapp:latest
restart: unless-stopped
ports:
- "8080:8080"
environment:
- DB_HOST=postgres-1.2.3:5432
- REDIS_HOST=redis-1.2.3:6379
networks:
- backend
security_opt:
- "cap_disable=NET_BIND_SERVICE"
read_only: true
db:
image: postgres:15
volumes:
- pgdata:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=secure_password
Сетевой контроль и файрволы
На уровне Proxmox VE настройка файрвола позволяет ограничить доступ к управляющим портам и разрешить только необходимые трафик:
bash# Создание правил файрвола
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 6443/tcp # SSH (только с доверенных IP)
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw reload
Для дополнительной защиты можно настроить iptables с правилами, блокирующими подозрительные IP-адреса:
bash# Блокировка IP-адресов из списка черного списка
sudo iptables -A INPUT -s 192.168.100.45 -j DROP
sudo iptables -A INPUT -s 10.0.0.0/8 -j DROP
Логирование безопасности
Логи безопасности — это критически важный компонент. В Proxmox можно включить аудит событий через proxmox-audit и отправлять их в SIEM-систему:
bash# Включение аудита в Proxmox
sudo proxmox-audit --enable
# Настройка отправки логов (пример для syslog-перенаправления)
sudo mkdir -p /etc/syslog-root
echo "Proxmox audit log: $(date)" >> /var/log/audit.log
Также рекомендуется собирать системные логи через journalctl и анализировать их на предмет подозрительных действий:
bash# Поиск попыток входа с неизвестных IP
journalctl -u sshd -n 50 | grep -i "failed"
Примечание: Для настройки мониторинга и безопасности рекомендуется ознакомиться с официальной документацией Prometheus на странице Prometheus и Proxmox VE документацией администрирования.
Часто задаваемые вопросы
### Как правильно проектировать дисковую разметку на хосте?
При настройке хоста для Proxmox или Docker рекомендуется выносить системные разделы на отдельные тома: /boot, /var, /var/log и /home. Это позволяет изолировать критичные данные и упрощает восстановление после сбоев. Если используете ZFS, обязательно продумайте пулы и vdev заранее — их изменение позже требует больше времени, чем правильная изначальная конфигурация. Разделение логов и временных файлов от предотвращает их забивание с диска и сохраняет производительность системы.
### Почему нельзя использовать динамический DHCP для продакшн-сервера?
Динамический DHCP создаёт непредсказуемую сеть, когда IP-адрес может меняться в любой момент, что нарушает связность соединений и логирование. В продакшене важна стабильность адресов для корректной работы контейнеров, бэкапов и мониторинга. Я всегда прописываю статические адреса с фиксированными масками, чтобы избежать конфликтов и упростить диагностику проблем.
### Зачем называть серверы в честь советских мультфильмов?
Именование хостов в честь персонажей сразу даёт понять их назначение без лишних объяснений. Винни-Пух — гипервизор, Пятачок — тестовый узел, Сова — хранилище бэкапов, Кролик — рабочая станция. Это упрощает коммуникацию в команде и делает инфраструктуру более понятной при аварийных ситуациях. При этом название не связано с ностальгией — оно работает как интуитивный маркер роли.
### Какой порядок действий при настройке хоста под Docker?
Сначала проектируйте дисковую разметку и настройте файловую систему (ZFS или LVM), затем пропишите статические IP-адреса в сети Proxmox. После этого создайте контейнеры с правильными правами доступа и настройте логирование в /var/log. Только после успешного запуска приложений переходите к настройке сети и мониторинга. Этот порядок минимизирует риск конфликтов и упрощает отладку.