Files
opendoor-base-install/cleanup_system.sh

195 lines
8.4 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 "$@"