Этот документ — «человеческое» описание iobackup: что
система делает, как она работает в реальной жизни, где ее сильные
стороны и как безопасно использовать ее в production.
Если README.md — это технический вход и быстрые команды,
то этот гайд — про смысл, сценарии и практику эксплуатации.
iobackup — это локальный агент резервного копирования с
API и CLI.
Вы описываете задачу backup в YAML (job), отправляете ее в агент и запускаете вручную. Агент:
source);destination);Главная идея: streaming-first. Данные идут потоком, без лишних временных файлов, где это возможно.
iobackup-agent — основной процесс (daemon + HTTP API),
который реально выполняет backup.iobackupctl — CLI-клиент для оператора, работает поверх
API.bbolt (agent.db) — встроенная база
метаданных:
Важно: iobackup хранит в bbolt состояние и
историю, а сами backup-артефакты — в destination (local, S3, SSH и
т.д.).
В iobackup есть не только “запустить backup и получить
файл”. Внутри продукт хранит несколько базовых сущностей —
foundation-моделей. Они нужны не ради сложности, а чтобы backup-ы можно
было потом проверять, восстанавливать, переносить, шифровать, запускать
по расписанию и управлять ими с центрального сервера.
Проще говоря: foundation-модели — это скелет продукта.
Каждый агент имеет стабильную identity:
agent_id — постоянный ID агента;hostname — имя сервера;instance_id — ID конкретного запуска процесса
агента;labels — метки вроде env=prod,
role=mysql.Это нужно, чтобы понимать:
agent_id живёт долго, а instance_id
меняется после restart агента.
В YAML оператор пишет человекочитаемый job_id:
metadata:
job_id: mysql-prodСистема внутри создаёт неизменяемый job_uid:
job_uid: job_01J...
Разница важна:
job_id можно переименовать;job_uid остаётся прежним и связывает всю историю
job-а.Если job переименовали из mysql-prod в
mysql-production, старые backup-ы всё равно относятся к
тому же job_uid.
Каждое изменение job создаёт новую revision. Run хранит, по какой именно revision он был запущен: YAML может измениться уже после выполнения backup-а, а история должна оставаться точной.
У job есть три состояния:
submitted — что прислал пользователь;resolved — что получилось после defaults, overlay
секретов, validation и нормализации;executed — что реально использовал конкретный run.Run хранит executed_job_snapshot. Поэтому даже если job
потом изменили, старый run остаётся воспроизводимым и понятным.
Run — это один запуск job-а. TaskRun —
выполнение одной task внутри run.
Если job содержит несколько tasks, возможен статус
partial_success: например основной backup успешен, а
optional task (с required: false) упала.
Для диагностики у запуска есть:
request_id — конкретный API/CLI-запрос;correlation_id — вся цепочка действий: request → run →
task → manifest → webhook.Это помогает искать связанные логи, webhooks и ошибки.
Если клиент не понял, дошёл ли запрос на запуск backup-а, он может
повторить запрос с тем же Idempotency-Key. Для того же
job_uid система вернёт тот же run_id, а не
запустит второй backup. Тот же ключ для другого job_uid
вернёт IDEMPOTENCY_KEY_CONFLICT.
Некоторые backup нельзя запускать одновременно (например два тяжёлых dump одной базы). Для этого есть:
spec:
concurrency:
policy: forbid
lock_key: mysql-prodЕсли run уже идёт, второй запуск получит
CONCURRENCY_LOCKED.
Если агент перезапустился во время run, старые running /
pending run помечаются как interrupted. Это
значит: run не завершился корректно, artifacts нужно проверять вручную
(или через verify), а stale locks будут очищены startup recovery.
Manifest — это JSON-паспорт backup-а. Он отвечает на вопросы: какой агент и какой job/revision сделали backup, какой run/task создали artifact, где лежит artifact, какой checksum, какая lineage/repository, и как этот backup проверить.
Manifest пишется рядом с data artifact как sidecar. Если
agent.db потерян, sidecar manifest помогает понять, что
лежит в хранилище.
backup_id — логический результат backup и ключ
API;manifest_id — идентификатор документа manifest;artifact_id — идентификатор конкретного data/manifest
artifact внутри artifacts[].Сейчас обычный backup — это single_artifact. Future
incremental backup должен работать через repository, snapshots, chunks и
indexes. Поэтому manifest уже содержит repository и
lineage как подготовку к будущим сценариям.
checksums[] — фактические хэши, а checks —
статусы проверок (artifact verify, decrypt/format verify, restore
smoke). Часть проверок пока reserved/placeholder, потому что
encryption/restore smoke ещё не реализованы.
Секреты не должны попадать в API, webhook, manifest, metadata export или snapshots. Поэтому sensitive fields маскируются, а полные пути/object keys по умолчанию не раскрываются наружу.
Агент хранит историю в agent.db. Для обслуживания
есть:
iobackupctl metadata check
iobackupctl metadata backup
iobackupctl metadata exportПеред upgrade и будущими migrations metadata DB нужно бэкапить
отдельно. Также важно сохранять identity/agent.identity,
чтобы не потерять continuity agent_id.
Агент может рассказать, что он умеет: какие feature gates включены,
какие provider-ы доступны, какие tools найдены на хосте, и какой
health/readiness. Для этого есть GET /api/v1/capabilities и
GET /api/v1/agent/facts.
Foundation-модели нужны, чтобы текущий локальный backup-agent мог вырасти в полноценную backup-платформу. Важно: не все эти функции уже реализованы, но foundation-модель нужна заранее, чтобы потом не переписывать job YAML, manifest, metadata DB и API.
Подробнее:
Рабочие provider-ы:
filesystem, postgres,
mysql, clickhouse, openldap,
vault (KV export), docker_composelocal, s3,
sshretentionwebhookСводная «зрелость» возможностей: status-matrix.md. Модель сущностей в БД: data-model.md.
source: filesystem;
подробнее
docs/providers/sources/filesystem-source.md);verify) вручную и
автоматически.Упрощенный жизненный цикл:
job_uid и создаёт/обновляет
JobRevision.run со статусом
running, сохраняются
request_id/correlation_id и
executed_job_snapshot.task:
success,
partial_success, failed);Дополнительно:
Idempotency-Key, повторный запрос для того
же job_uid вернёт существующий run_id;spec.concurrency.policy=forbid, агент берёт lock
по lock_key;warnings_count /
last_warning_code);interrupted.Статусы и история можно смотреть через API/CLI в любой момент.
Потоковый режим дает практические плюсы:
Когда нужны внешние утилиты (pg_dump,
mysqldump, aws CLI), их можно запускать либо
локально, либо в Docker fallback.
У iobackup есть два режима для tool-based частей:
runner.mode: local — используем утилиты хоста;runner.mode: docker — запускаем утилиты внутри
контейнера.Это особенно полезно когда:
pg_dump/mysqldump/aws;При этом можно использовать свои образы, а не только дефолтные.
run.status=success говорит, что запись прошла успешно,
но не гарантирует долгосрочную читаемость.
Для этого есть verify:
Есть два режима:
backup_id;Также можно включить авто-политику:
spec:
policies:
verify:
after_run: true
limit_per_task: 1Тогда после успешного run запускается verify-run автоматически.
Retention в проекте — это не только «убрать запись из metadata», но и удаление физических объектов destination (hard-delete) с audit-событиями.
Практически это значит:
Минимальный production baseline:
--auth-enabled (Bearer token);--tls-cert-file,
--tls-key-file);--tls-client-ca-file);--rate-limit-enabled,
--rate-limit-rps, --rate-limit-burst);*_env, файл
*_path или KV ref *_vault (конфиг Vault у
iobackup-agent: -vault-addr, токен и т.д.); не
кладите значения секретов в Git-friendly YAML основного job — при
необходимости локальный overlay -job-secrets-file.Подробнее и с готовыми профилями:
docs/features/encryption/security.md.
У агента есть:
/metrics.Что особенно полезно в эксплуатации:
Для авто-verify есть отдельная метрика:
iobackup_verify_after_run_total{status}Подробнее:
docs/features/observability/prometheus.md.
endpoint/region и env;job_id можно переименовать, но история связывается
через job_uid.success не равно “проверено восстановление”: для этого
нужен verify, а restore smoke пока future.interrupted — terminal status; такой backup нужно
проверять вручную.README.mddocs/reference/job-format-v1.mddocs/operator/runbook.mddocs/reference/curl-and-ctl.mddocs/features/verification/verify.mddocs/features/observability/prometheus.mddocs/features/encryption/security.md