Добавить скрипты первичной инициализации, очистки и автозапуска (BBox)
This commit is contained in:
194
cleanup_system.sh
Executable file
194
cleanup_system.sh
Executable file
@@ -0,0 +1,194 @@
|
||||
#!/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 "$@"
|
||||
Reference in New Issue
Block a user