195 lines
8.4 KiB
Bash
Executable File
195 lines
8.4 KiB
Bash
Executable File
#!/bin/bash
|
||
# ============================================================================
|
||
# cleanup_system.sh — очистка и оптимизация системы (BBox / OpenDoor base)
|
||
# ----------------------------------------------------------------------------
|
||
# Безопасная очистка от мусора и подготовка устройства к клонированию образа:
|
||
# * apt-кэш и списки пакетов
|
||
# * логи (journald, /var/log, /var/log.hdd)
|
||
# * tmp-директории и кэши пользователей
|
||
# * orphaned-пакеты (autoremove)
|
||
# * тестовые Docker-образы/контейнеры
|
||
# * удаление следов Matrix/coturn/nginx (если были установлены)
|
||
# * освобождение места в /boot
|
||
# ============================================================================
|
||
|
||
set -uo pipefail
|
||
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
NC='\033[0m'
|
||
|
||
DRY_RUN=0
|
||
LOG_FILE="/var/log/bbox-cleanup.log"
|
||
|
||
log() { echo -e "${GREEN}[cleanup]${NC} $*" | tee -a "$LOG_FILE"; }
|
||
warn() { echo -e "${YELLOW}[cleanup][warn]${NC} $*" | tee -a "$LOG_FILE"; }
|
||
fail() { echo -e "${RED}[cleanup][error]${NC} $*" | tee -a "$LOG_FILE"; exit 1; }
|
||
|
||
usage() {
|
||
cat <<EOF
|
||
Использование: $0 [--dry-run] [--full]
|
||
|
||
--dry-run только показать, что будет очищено (ничего не удалять)
|
||
--full полная очистка (включая удаление Matrix/nginx, сброс идентификаторов)
|
||
-h, --help показать справку
|
||
EOF
|
||
}
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# Сбор данных о занимаемом месте
|
||
# ---------------------------------------------------------------------------
|
||
size_of() {
|
||
du -sh "$1" 2>/dev/null | awk '{print $1}' || echo "0"
|
||
}
|
||
|
||
report() {
|
||
echo
|
||
echo "=== Текущее состояние ==="
|
||
echo " Диск: $(df -h / | tail -1 | awk '{print $3" занято из "$2", свободно "$4}')"
|
||
echo " apt-кэш: $(size_of /var/cache/apt)"
|
||
echo " apt-lists: $(size_of /var/lib/apt/lists)"
|
||
echo " /var/log: $(size_of /var/log)"
|
||
echo " journald: $(journalctl --disk-usage 2>/dev/null | tail -1)"
|
||
echo " /tmp: $(size_of /tmp)"
|
||
}
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# 1. Apt-кэш и списки
|
||
# ---------------------------------------------------------------------------
|
||
clean_apt() {
|
||
log "Очистка apt-кэша..."
|
||
[ $DRY_RUN -eq 1 ] && { warn "dry-run: apt-get clean/autoclean"; return; }
|
||
apt-get clean
|
||
apt-get autoclean -y
|
||
|
||
log "Удаление кэшей индексов apt (пересоздадутся автоматически)..."
|
||
rm -f /var/cache/apt/pkgcache.bin /var/cache/apt/srcpkgcache.bin
|
||
rm -rf /var/lib/apt/lists/*
|
||
}
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# 2. Логи
|
||
# ---------------------------------------------------------------------------
|
||
clean_logs() {
|
||
log "Очистка journald (ограничение до 20M)..."
|
||
[ $DRY_RUN -eq 1 ] && { warn "dry-run: journalctl --vacuum-size"; return; }
|
||
journalctl --vacuum-size=20M 2>/dev/null || warn "journalctl недоступен"
|
||
|
||
log "Удаление старых ротированных логов..."
|
||
[ $DRY_RUN -eq 1 ] && { warn "dry-run: удаление *.gz/*.old/*.1 в /var/log"; return; }
|
||
find /var/log -type f \( -name "*.gz" -o -name "*.1" -o -name "*.old" \) -delete 2>/dev/null
|
||
find /var/log.hdd -type f \( -name "*.gz" -o -name "*.1" -o -name "*.old" \) -delete 2>/dev/null
|
||
|
||
# Логи sysstat (если пакет удалён — остаются файлы)
|
||
rm -rf /var/log/sysstat /var/log.hdd/sysstat
|
||
}
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# 3. TMP и кэши
|
||
# ---------------------------------------------------------------------------
|
||
clean_tmp() {
|
||
log "Очистка временных директорий и кэшей..."
|
||
[ $DRY_RUN -eq 1 ] && { warn "dry-run: очистка /tmp, /var/tmp, /root/.cache"; return; }
|
||
rm -rf /tmp/* /var/tmp/* 2>/dev/null
|
||
find /root/.cache /root/.npm /root/.cargo /root/.local/share/Trash -mindepth 1 -delete 2>/dev/null
|
||
find /home -maxdepth 3 -type d -name ".cache" -exec rm -rf {} + 2>/dev/null
|
||
}
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# 4. Orphaned-пакеты
|
||
# ---------------------------------------------------------------------------
|
||
clean_autoremove() {
|
||
log "Удаление неиспользуемых (orphaned) пакетов..."
|
||
[ $DRY_RUN -eq 1 ] && { warn "dry-run: apt-get autoremove"; return; }
|
||
apt-get autoremove -y --purge 2>/dev/null || warn "autoremove завершился с ошибкой"
|
||
}
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# 5. Docker-мусор (образы/контейнеры/тома, не используемые)
|
||
# ---------------------------------------------------------------------------
|
||
clean_docker() {
|
||
if ! command -v docker &> /dev/null; then
|
||
log "Docker не установлен, пропуск."
|
||
return
|
||
fi
|
||
log "Очистка Docker (dangling-образы, остановленные контейнеры, неиспользуемые сети)..."
|
||
[ $DRY_RUN -eq 1 ] && { warn "dry-run: docker system prune -f"; return; }
|
||
docker system prune -f 2>/dev/null || warn "docker prune завершился с ошибкой"
|
||
}
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# 6. Удаление следов Matrix/coturn/nginx (для чистого образа)
|
||
# ---------------------------------------------------------------------------
|
||
clean_matrix() {
|
||
local pkgs=()
|
||
for p in coturn nginx nginx-core nginx-common certbot; do
|
||
if dpkg -l "$p" &>/dev/null; then pkgs+=("$p"); fi
|
||
done
|
||
if [ ${#pkgs[@]} -eq 0 ]; then
|
||
log "Следов Matrix/coturn/nginx нет, пропуск."
|
||
return
|
||
fi
|
||
log "Удаление пакетов Matrix/nginx: ${pkgs[*]}..."
|
||
[ $DRY_RUN -eq 1 ] && { warn "dry-run: удаление ${pkgs[*]} и их конфигов"; return; }
|
||
DEBIAN_FRONTEND=noninteractive apt-get purge -y "${pkgs[@]}"
|
||
rm -rf /etc/nginx /etc/letsencrypt /etc/turnserver.conf /etc/coturn /var/www 2>/dev/null
|
||
rm -f /etc/cron.d/certbot 2>/dev/null
|
||
log "Следы Matrix/nginx удалены."
|
||
}
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# 7. Сброс уникальных идентификаторов (перед клонированием)
|
||
# ---------------------------------------------------------------------------
|
||
reset_ids() {
|
||
log "Сброс machine-id и SSH host keys..."
|
||
[ $DRY_RUN -eq 1 ] && { warn "dry-run: сброс machine-id/ssh keys"; return; }
|
||
rm -f /etc/machine-id /var/lib/dbus/machine-id
|
||
systemd-machine-id-setup 2>/dev/null || warn "machine-id не пересоздан"
|
||
rm -f /etc/ssh/ssh_host_*
|
||
# Примечание: после этого нужно перезапустить ssh или перезагрузиться,
|
||
# чтобы sshd сгенерировал новые ключи.
|
||
}
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# MAIN
|
||
# ---------------------------------------------------------------------------
|
||
main() {
|
||
while [ $# -gt 0 ]; do
|
||
case "$1" in
|
||
--dry-run) DRY_RUN=1 ;;
|
||
--full) FULL=1 ;;
|
||
-h|--help) usage; exit 0 ;;
|
||
*) fail "Неизвестный аргумент: $1" ;;
|
||
esac
|
||
shift
|
||
done
|
||
|
||
if [ "$(id -u)" -ne 0 ]; then
|
||
fail "Запустите скрипт от root: sudo ./cleanup_system.sh"
|
||
fi
|
||
|
||
touch "$LOG_FILE"
|
||
log "=== Очистка системы начата $(date) ==="
|
||
|
||
report
|
||
clean_apt
|
||
clean_logs
|
||
clean_tmp
|
||
clean_autoremove
|
||
clean_docker
|
||
if [ "${FULL:-0}" -eq 1 ]; then
|
||
clean_matrix
|
||
reset_ids
|
||
fi
|
||
|
||
echo
|
||
report
|
||
log "Очистка завершена. Журнал: $LOG_FILE"
|
||
if [ $DRY_RUN -eq 1 ]; then
|
||
warn "Это был dry-run — ничего не удалено. Запустите без --dry-run для применения."
|
||
fi
|
||
}
|
||
|
||
main "$@"
|