Capstone: production maintenance script для Airflow
Поздравляю — ты добрался до финального проекта курса. В предыдущих 18 модулях ты освоил Linux от первого ls до production-grade bash с set/trap/getopts/shellcheck/tmux/jq. Теперь — собрать всё вместе на реальной DE-задаче, какая встречается в первую неделю работы.
В этом capstone — четыре урока: обзор задачи и сценария (этот), архитектура скрипта (02), implementation walkthrough (03), и деплой через systemd (04). В сопровождающей лабе LAB-04 — пошаговый туториал, mock environment, reference solution и verify.sh для самопроверки.
Сценарий: Day-1 на новой работе
Ты вышел на работу как Junior Data Engineer. Понедельник, утро. Tech lead Alice пишет в Slack:
Hey, добро пожаловать! Первый ticket: AIRFLOW-1247.
Production Airflow worker падает примерно раз в 3 часа — disk full на
/var/log/airflow. Каждый DAG run пишет logs (~50 MB), они не чистятся, на server только 500 GB. Через неделю — boom.Напиши maintenance bash-script, который:
- Находит старые log-файлы (старше 7 дней по mtime) в
/var/log/airflow/.- Сжимает их через gzip (compression ratio для текстов ~10x — выиграем место).
- Опционально (через flag) переносит сжатые в S3-архив
s3://acme-airflow-archive/.- Удаляет оригиналы после успешного сжатия / upload.
- Шлёт Slack-нотификацию в
#airflow-alertsс stats: сколько файлов обработано, сколько MB освобождено.- Запускается daily через systemd timer в 03:00 (минимум traffic).
Production-grade:
set -euo pipefail, trap cleanup, logging в journalctl/file, idempotent (можно запустить дважды без harm),--dry-runдля preview.До конца недели. Если что — пинг меня. Тестовое окружение есть в
dev-airflow-01, на нём поиграйся сначала.
Это реалистичный ticket. Не игрушечная задача, а то, что регулярно появляется на production. Решение даст production-ready bash-deployment skills, которые junior может сразу применять на работе.
Что мы построим
Полный flow от cron-trigger до S3 upload и Slack notification.
Полный workflow:
- 03:00 — systemd timer срабатывает.
- Запускается service unit, который вызывает
/opt/airflow/bin/cleanup.sh. - Скрипт находит файлы старше 7 дней, gzip’ит, опционально кладёт в S3.
- Слэк-нотификация с метриками.
- Логи всего пути — в journald, видны через
journalctl -u airflow-log-cleanup.
Требования к скрипту (acceptance criteria)
Tech lead Alice не сказала это explicitly, но опытный Junior понимает, что production-grade значит:
Robustness
#!/bin/bashshebang +set -euo pipefail+IFS=$'\n\t'preamble.trap cleanup EXITдля гарантированного cleanup tmpdir/lockfile.flockили подобный механизм против overlapping runs.- Atomic operations (write-then-rename для output, не partial).
- Graceful handling сигналов (SIGTERM от systemd, SIGINT от Ctrl-C).
Observability
- Structured logging: timestamp + level + message.
- Лог в
/var/log/airflow-log-cleanup.logИЛИ via journald (для systemd). - Slack-нотификация с метриками (success/failure, files processed, bytes freed).
- Exit codes имеют смысл: 0 success, 1 generic error, 2 lock held by another instance.
Usability
--help/-h— usage message.--dry-run/-d— preview без actual changes.--retention-days N/-r N— настраиваемый retention (default 7).--log-dir DIR— настраиваемый путь к логам Airflow.--slack-webhook URLили ENV varSLACK_WEBHOOK.--s3-bucket BUCKET— опциональный S3 archive.
Maintainability
shellcheckclean (no warnings).- Idempotent: run два раза подряд = единственный effect первого.
- Тесты через
batsдля unit-функций. - Документация в комментариях скрипта или README.md.
Deployment
- systemd service unit (oneshot).
- systemd timer unit (OnCalendar=daily 03:00, RandomizedDelaySec=10m, Persistent=true).
- Установлено в
/etc/systemd/system/, enabled черезsystemctl enable --now. - Verification:
systemctl list-timers,journalctl -u ... -f.
DE-skills, которые ты применишь
Этот capstone tests знание из всех модулей:
Что получит junior в результате
После завершения capstone и LAB-04:
- Production-ready bash skill — умеешь писать скрипты, которые не падают silent, имеют CLI, тесты, и нормально деплоятся.
- Понимание systemd — service + timer, journalctl, status checks.
- DE pattern repertoire —
set -euo pipefail,trap cleanup EXIT,flock,find -mtime,gzip + atomic rename,slack webhook curl. - CI-разрешённый код — shellcheck PASS, bats тесты есть, README.md документирует use.
- Что-то в портфолио — реальный production-script с правильной архитектурой. Можно показать на интервью.
Структура capstone
Этот capstone разбит на 4 урока (с lab отдельно):
- Урок 01 (этот) — обзор, scenario, acceptance criteria.
- Урок 02 — design: architecture, файл структуры, helper functions, idempotency.
- Урок 03 — implementation walkthrough: код step-by-step, объяснение каждой строки.
- Урок 04 — deploy with systemd: service + timer units, enable, verify через journalctl.
LAB-04 — практика: пошаговый туториал на 60-90 минут с mock environment.
Airflow через Docker Compose: контейнерная альтернатива CronJob в Kubernetes: cloud-native scheduled tasks
Что не входит в scope
Чтобы capstone был выполним за разумное время, мы не охватываем:
- AWS IAM / credentials configuration (предполагается, что у AWS CLI уже есть creds).
- Slack workspace setup и incoming webhook creation (предполагается, что URL есть).
- Multi-server orchestration (это Ansible/Terraform — отдельные курсы).
- High-availability cluster setup для Airflow (zookeeper, postgres replica) — это DevOps.
- Реальный monitoring stack (Prometheus, Grafana) — продвинутый DE.
Эти темы — следующий уровень. В нашем scope: one server, one cleanup script, one timer.
Перед тем как начать
Окружение
Запасись:
-
Linux машина (Ubuntu 24.04 или Debian 13) — можно VM, WSL2, или server. На macOS bash 3.2 не подойдёт, нужен bash 4+.
-
Tools installed:
sudo apt install bash gzip tar findutils coreutils curl jq systemd shellcheck bats
# Опционально для S3:
sudo apt install awscli
-
Permissions: должен быть sudo (для systemd unit deployment).
-
Test env: создашь mock
/var/log/airflow/в lab, не нужно реального Airflow. -
Slack webhook (опционально для real testing): https://api.slack.com/messaging/webhooks. Без неё используй echo-fallback.
Подход
-
Не копируй reference solution сразу. Попробуй сам по acceptance criteria. Споткнулся — посмотри урок 02 (design), потом 03 (implementation). Reference только когда застрял.
-
Используй shellcheck с самого начала — сэкономишь часы дебага.
-
Test step-by-step. Сначала find — работает. Потом gzip. Потом S3 (с —dry-run). Потом slack. Потом интеграция. Не пиши весь скрипт и потом дебагай.
-
Test on mock data. Lab даст setup.sh который создаст реалистичную
/var/log/airflow/с старыми и новыми файлами.
Cross-links
- Урок 02 (design) — следующий: architecture деталь.
- LAB-04 —
labs/LAB-04-capstone-airflow-log-cleanup/README.md. - Модуль 17 (advanced bash) —
set -euo pipefail, trap, getopts. - Модуль 14 (systemd) — service units.
- Модуль 15 (cron) — timers vs cron.
Попробуй сам
-
Прочитай ticket несколько раз. Запиши на бумаге своё понимание acceptance criteria.
-
Открой
labs/LAB-04-capstone-airflow-log-cleanup/README.md— там детальные шаги. -
Запусти
labs/LAB-04-.../mock-environment/setup.sh— увидишь, что приготовлено. -
Создай файл
cleanup.shи начни с минимума:
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
LOG_DIR="${1:-/var/log/airflow}"
RETENTION_DAYS=7
find "$LOG_DIR" -name '*.log' -mtime +$RETENTION_DAYS -type f
Запусти. Видишь список старых файлов? Хорошо, дальше — урок 02.
- Заплани час каждый день на этой неделе. К пятнице будет рабочий деплой.