Каталог /etc — серце вашої системи. Саме тут живуть конфіги сервісів, мережеві налаштування та політики безпеки. Одна дрібна правка — і сервер або робоча станція можуть повестися непередбачувано. Тому ми заведемо на /etc контроль версій із etckeeper та Git: отримаємо історію змін, дифи, автоматичні коміти під час оновлень, корисні hooks і надійний, безпечний відкат. Пояснюю просто і по-людськи 🙂

Що таке etckeeper і чому він з Git — мастхев

etckeeper — це тонка обгортка навколо Git (або іншого VCS), яка вміє коректно працювати з особливостями /etc. Вона:

  • інтегрується з менеджерами пакетів (на Debian/Ubuntu — APT) і робить коміти перед/після встановлення чи оновлення пакетів;
  • допомагає зберігати метадані прав і власників файлів;
  • має стандартні ігнори для тимчасових і машинних файлів;
  • дозволяє швидко подивитися, хто і коли змінив конфіги, і у разі чого — відкотитися.

Працювати ми будемо через термінал Linux, використовуючи звичні linux команди і трохи практичних bash скрипти для автоматизації.

Початкове налаштування: встановлення та ініціалізація

Почнемо з установки etckeeper і Git, ініціалізації репозиторію в /etc і першого коміту.

sudo apt update
sudo apt install -y etckeeper git

# Перевірте VCS у конфігу (повинно бути git)
sudo sed -n '1,120p' /etc/etckeeper/etckeeper.conf | sed -n '/VCS/p'

# Ініціалізація та перший коміт
sudo etckeeper init
sudo etckeeper commit "Initial commit: baseline /etc"

На Debian/Ubuntu пакет etckeeper автоматично підключає APT-хуки. Це означає, що перед/після встановлення чи оновлення пакетів зміни в /etc будуть зафіксовані автоматично (зручний аудит і захист 🛡️).

Базове щоденне використання

Перевірка статусу та історії

cd /etc
sudo git status
sudo git log --oneline --graph --decorate --stat
sudo git diff               # Поточні незакомічені відмінності
sudo git diff HEAD~1..HEAD  # Що змінилося в останньому коміті

Ручний коміт із зрозумілим повідомленням

sudo etckeeper commit "nginx: enable gzip; sshd: disable root login"

Лаконічні та конкретні повідомлення — це кращий друг під час розслідування інцидентів і резервне копіювання системи із змінами конфігів.

Безпечний відкат конфігурацій

Перед будь-яким відкатом зробіть швидкий бекап поточного стану /etc (на випадок, якщо доведеться повернутися):

sudo tar -C / -cpf /root/etc-backup-$(date +%F).tar etc

Відкат одного файлу до попереднього коміту

cd /etc
# Подивитися коміти
sudo git log --oneline -- <path/to/file>
# Відновити файл зі вказаного коміту (наприклад, HEAD~1)
sudo git restore --source=HEAD~1 -- <path/to/file>
# Перевірити різницю і зафіксувати
sudo git diff <path/to/file>
sudo etckeeper commit "revert <path/to/file> to HEAD~1"

Відкат усього /etc до відомого стану

Робіть це обережно і бажано у вікні адміністративного доступу (наприклад, локальна консоль або стійке SSH-з’єднання):

cd /etc
sudo git log --oneline | head -n 15
# Жорсткий відкат до вибраного коміту (приклад: abc1234)
sudo git reset --hard abc1234
# Перезавантажте сервіси, чиє конфіг ви змінили
sudo systemctl daemon-reload
sudo systemctl restart nginx ssh apache2 2>/dev/null || true

Hooks: автоматичні перевірки перед комітом

Щоб не закомітити зламаний конфіг, додайте Git pre-commit hook у /etc. Він перевірятиме синтаксис популярних сервісів (виконується лише якщо відповідні утиліти встановлені):

sudo tee /etc/.git/hooks/pre-commit >/dev/null <<'EOF'
#!/bin/sh
set -e
check() { command -v "$1" >/dev/null 2>&1 && "$@"; }
# Перевірки конфігів (виконуються, якщо інструменти існують)
check visudo -c
check sshd -t
check nginx -t
check apachectl configtest
# Додайте свої перевірки за потреби
EOF
sudo chmod +x /etc/.git/hooks/pre-commit

Тепер перед кожним etckeeper commit Git зупинить коміт, якщо тест конфігурації зафейлиться — менше сюрпризів у проді.

Автоматизація: щоденні коміти через systemd або cron

Через systemd timers

# Сервіс
sudo tee /etc/systemd/system/etckeeper-daily.service >/dev/null <<'EOF'
[Unit]
Description=Daily etckeeper commit of /etc

[Service]
Type=oneshot
ExecStart=/usr/bin/etckeeper commit "daily: automatic snapshot of /etc"
EOF

# Таймер
sudo tee /etc/systemd/system/etckeeper-daily.timer >/dev/null <<'EOF'
[Unit]
Description=Run etckeeper daily

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now etckeeper-daily.timer

Через cron

echo '0 3 * * * root etckeeper commit "daily: automatic snapshot of /etc"' | sudo tee /etc/cron.d/etckeeper-daily

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

GUI-спосіб: швидкий перегляд історії через gitk

Якщо вам зручний графічний огляд історії, встановіть gitk і запустіть його з /etc (права root потрібні, щоб бачити все):

sudo apt install -y gitk
cd /etc
sudo -E gitk &  # -E зберігає змінні середовища для X/Wayland

gitk покаже гілки, коміти, дифи файлів — інколи це швидше, ніж шукати все в терміналі.

Винятки, секрети та ремоут-бекап

  • Ігнори: редагуйте /etc/.gitignore, щоби не відслідковувати секретні або машинно-генеровані файли. Для локальних винятків без коміту в репо — /etc/.git/info/exclude.
  • Пуш у приватний репозиторій (для додаткової надійності):
cd /etc
sudo git remote add origin ssh://git@your-git.example.org/infra/etc.git
sudo git push -u origin HEAD:main

Пильнуйте доступи до віддаленого репозиторію, бо це конфіги вашої системи.

FAQ

Чи зберігає etckeeper права доступу та власників файлів?

Так. etckeeper інтегрується зі своїми скриптами, які під час коміту зберігають потрібні метадані, а під час відкату — відтворюють їх. Тому після відкату сервіси звичайно не ламаються через «биті» права.

Як приховати секрети (паролі, ключі)?

Додайте відповідні шляхи або маски у /etc/.gitignore або /etc/.git/info/exclude. Переконайтеся, що файл ще не відстежується (інакше спершу sudo git rm --cached <file>).

Що робити з конфліктами під час злиття або відкату?

cd /etc
sudo git status
# Відкрийте конфліктні файли, розв'яжіть вручну, потім:
sudo git add -A
sudo etckeeper commit "merge: resolve conflicts in /etc"

Як подивитися, що саме змінилось під час оновлення пакетів?

Шукайте коміти, які створилися під APT-хуками у час оновлення. Зручно: sudo git log --since=yesterday --stat або аналізуйте повідомлення комітів.

Чи можна зберігати історію /etc на іншому сервері?

Так, додайте приватний remote і періодично пуште. Рекомендовано доступ по SSH-ключу, обмеження доступу й аудит.

Чи обов’язково виконувати команди з sudo?

Так, адже /etc належить root. Без sudo Git може не бачити або не мати прав змінювати частину файлів.

Порада від Kernelka

Ведіть короткі, але змістовні коментарі до комітів: що змінено і навіщо. Додайте pre-commit перевірки для сервісів, які ви часто чіпаєте (наприклад, nginx -t, sshd -t). І не забувайте про позапланові коміти після важливих ручних правок — це сильно економить нерви, коли треба швидко відкотитися 😉

Підсумок

  • Встановіть etckeeper і ініціалізуйте Git у /etc.
  • Користуйтеся APT-хуками та ручними комітами для прозорої історії.
  • Налаштуйте pre-commit перевірки, щоб не комітити «биті» конфіги.
  • Автоматизуйте щоденні знімки через systemd timers або cron.
  • Використовуйте безпечні відкати: спершу бекап, потім selective restore або reset.
  • Ігноруйте секрети й, за потреби, пуште в приватний віддалений репозиторій.

Так ви отримаєте акуратний контроль версій для /etc, швидке відновлення після помилок і спокійний сон адміністратора.