Add safe monthly maintenance installer

This commit is contained in:
andrey271192
2026-07-31 12:14:48 +03:00
commit 8890a4110c
8 changed files with 904 additions and 0 deletions

82
docs/SAFETY.md Normal file
View File

@@ -0,0 +1,82 @@
# Модель безопасности
Цель проекта — выполнять повторяемое обслуживание Ubuntu/Debian с минимальным
риском. «Безопасно» не означает «невозможно сломать»: любое системное обновление
может содержать ошибку пакета, несовместимость приложения или service restart.
## Принципы
### Без удаления пакетов
Основное обновление использует `apt-get upgrade --no-remove`.
`dist-upgrade` и `full-upgrade` не используются.
`autoremove` выключен. Причина: пакет, нужный локальному приложению, иногда
ошибочно остается помеченным как автоматически установленный.
### Без автоматического reboot
Новое ядро устанавливается, но активируется только после решения администратора.
Это предотвращает незапланированный разрыв VPN, базы данных, SSH или другого
сервиса.
### Без опасной очистки файлов
Очистка временных данных делегируется `systemd-tmpfiles`, `logrotate`,
`journalctl` и APT. Проект не содержит рекурсивного удаления широких каталогов.
### Без очистки Docker по умолчанию
Stopped containers, tagged images, volumes и networks могут содержать нужное
состояние. Поэтому Docker cleanup выключен. Опция удаляет только dangling images.
### Сохранение конфигов
`Dpkg::Options::=--force-confold` сохраняет установленную локальную конфигурацию.
Новая версия файла пакета обычно остается рядом как `.dpkg-dist`; ее нужно
сравнить вручную.
### Проверки до изменения
APT upgrade не запускается при:
- поврежденном/незавершенном состоянии `dpkg`;
- критически малом свободном месте;
- ошибке `apt-get update`.
### Один процесс
`flock` предотвращает параллельные maintenance-запуски. APT-lock ожидается до
10 минут, что уменьшает конфликт с `apt-daily`.
## Рекомендуемая эксплуатация
1. Создайте snapshot VM перед первым запуском.
2. Проверьте installer и checksum.
3. Запустите на тестовой VM.
4. Проверьте journal, failed units и приложение.
5. Только потом развертывайте на остальные серверы.
6. Перезагружайте сервер в согласованное maintenance window.
## Что проверить после запуска
```bash
systemctl --failed
dpkg --audit
apt list --upgradable
journalctl -u safe-monthly-maintenance.service -n 200
test -e /var/run/reboot-required && echo "reboot required"
```
Для VPN, reverse proxy, базы данных и других сервисов добавьте собственные
health checks после системного обслуживания.
## Rollback
Проект сохраняет список пакетов, но не создает полноценный rollback.
Для надежного возврата нужны:
- snapshot гипервизора/VPS-провайдера;
- резервная копия `/etc` и данных приложений;
- отдельно проверенная процедура восстановления.

85
docs/TROUBLESHOOTING.md Normal file
View File

@@ -0,0 +1,85 @@
# Диагностика
## Service завершился с ошибкой
```bash
systemctl status safe-monthly-maintenance.service
journalctl -u safe-monthly-maintenance.service -n 300 --no-pager
```
Скрипт продолжает независимые безопасные этапы и в конце возвращает ненулевой
код, если хотя бы один этап завершился ошибкой.
## APT занят
Скрипт ожидает lock до 600 секунд. Найдите владельца lock:
```bash
ps aux | grep -E 'apt|dpkg'
systemctl status apt-daily.service apt-daily-upgrade.service
```
Не удаляйте lock-файлы вручную, пока работает APT/DPKG.
## `dpkg --audit` показывает проблему
Проверьте вывод:
```bash
sudo dpkg --audit
```
Типовой ремонт:
```bash
sudo dpkg --configure -a
sudo apt-get -f install
```
Читайте список изменений перед подтверждением.
## Недостаточно места
```bash
df -h / /boot
du -xhd1 /var | sort -h
journalctl --disk-usage
```
Не уменьшайте защитный порог без понимания причины заполнения.
## Требуется reboot
```bash
uname -r
readlink -f /vmlinuz
cat /var/run/reboot-required 2>/dev/null
```
Перезагрузите в maintenance window:
```bash
sudo systemctl reboot
```
После reboot:
```bash
uname -r
systemctl --failed
```
## Timer не запускается
```bash
systemctl is-enabled safe-monthly-maintenance.timer
systemctl is-active safe-monthly-maintenance.timer
systemctl list-timers safe-monthly-maintenance.timer --all
```
Восстановить:
```bash
sudo systemctl daemon-reload
sudo systemctl enable --now safe-monthly-maintenance.timer
```