#!/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 </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 "$@"