From 98af938509f26c34eb8b3fa11257c54c9e638ae3 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Sat, 22 Nov 2025 23:22:44 +0300 Subject: [PATCH] deploy --- .forgejo/workflows/deploy.yaml | 14 +- tools/deploy/check-disk-space.sh | 432 +++++++++++++++++++ tools/deploy/disk-cleanup-recommendations.md | 252 +++++++++++ tools/deploy/fix-vscode-rate-limit.sh | 81 ++++ 4 files changed, 767 insertions(+), 12 deletions(-) create mode 100755 tools/deploy/check-disk-space.sh create mode 100644 tools/deploy/disk-cleanup-recommendations.md create mode 100755 tools/deploy/fix-vscode-rate-limit.sh diff --git a/.forgejo/workflows/deploy.yaml b/.forgejo/workflows/deploy.yaml index 2d7b5c2..4c016fd 100644 --- a/.forgejo/workflows/deploy.yaml +++ b/.forgejo/workflows/deploy.yaml @@ -57,16 +57,6 @@ jobs: needs: deploy-backend if: always() steps: - - name: Install Node.js - run: | - if ! command -v node &> /dev/null; then - if [ "$(id -u)" -eq 0 ]; then - apt-get update && apt-get install -y nodejs npm - else - sudo apt-get update && sudo apt-get install -y nodejs npm - fi - fi - - name: Checkout code uses: actions/checkout@v3 with: @@ -75,8 +65,8 @@ jobs: - name: Configure Git run: | - git config --global http.postBuffer 524288000 - git config --global http.maxRequestBuffer 1000M + git config --global http.postBuffer 52428800 + git config --global http.maxRequestBuffer 100M git config --global core.compression 0 - name: Install Dependencies diff --git a/tools/deploy/check-disk-space.sh b/tools/deploy/check-disk-space.sh new file mode 100755 index 0000000..ca624df --- /dev/null +++ b/tools/deploy/check-disk-space.sh @@ -0,0 +1,432 @@ +#!/bin/bash + +# Script to check disk space usage on the server +# Usage: ./check-disk-space.sh + +set -e + +# Configuration +SERVER_IP="147.45.152.129" +SERVER_USER="root" + +# Colors +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +NC='\033[0m' # No Color + +# Helper functions +print_header() { + echo "" + echo -e "${CYAN}========================================${NC}" + echo -e "${CYAN}$1${NC}" + echo -e "${CYAN}========================================${NC}" +} + +print_section() { + echo "" + echo -e "${BLUE}--- $1 ---${NC}" +} + +print_info() { + echo -e "${GREEN}[INFO]${NC} $1" +} + +print_warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" +} + +print_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +# Function to format size in human readable format +format_size() { + local size=$1 + if [ -z "$size" ]; then + echo "0B" + else + echo "$size" + fi +} + +echo "🔍 Starting disk space diagnostics on ${SERVER_USER}@${SERVER_IP}..." +echo "" + +ssh "$SERVER_USER@$SERVER_IP" << 'ENDSSH' + set -e + + # Colors for remote output + RED='\033[0;31m' + GREEN='\033[0;32m' + YELLOW='\033[1;33m' + BLUE='\033[0;34m' + CYAN='\033[0;36m' + NC='\033[0m' + + print_header() { + echo "" + echo -e "${CYAN}========================================${NC}" + echo -e "${CYAN}$1${NC}" + echo -e "${CYAN}========================================${NC}" + } + + print_section() { + echo "" + echo -e "${BLUE}--- $1 ---${NC}" + } + + print_info() { + echo -e "${GREEN}[INFO]${NC} $1" + } + + print_warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" + } + + # 1. General disk information + print_header "1. GENERAL DISK INFORMATION" + + print_section "Disk Usage by Filesystem" + df -h + + print_section "Inode Usage" + df -i + + print_section "Root Filesystem Details" + ROOT_USAGE=$(df -h / | tail -1 | awk '{print $5}' | sed 's/%//') + ROOT_AVAILABLE=$(df -h / | tail -1 | awk '{print $4}') + ROOT_USED=$(df -h / | tail -1 | awk '{print $3}') + ROOT_TOTAL=$(df -h / | tail -1 | awk '{print $2}') + + echo "Root (/) filesystem:" + echo " Total: $ROOT_TOTAL" + echo " Used: $ROOT_USED" + echo " Available: $ROOT_AVAILABLE" + echo " Usage: ${ROOT_USAGE}%" + + if [ "$ROOT_USAGE" -gt 90 ]; then + print_warning "Root filesystem usage is above 90%!" + elif [ "$ROOT_USAGE" -gt 80 ]; then + print_warning "Root filesystem usage is above 80%" + fi + + # 2. Large directories analysis + print_header "2. LARGE DIRECTORIES ANALYSIS" + + print_section "Top 20 Largest Directories in Root (/)" + if [ -d "/" ]; then + du -h --max-depth=1 / 2>/dev/null | sort -hr | head -20 || echo "Could not analyze root directory" + fi + + print_section "Top 20 Largest Directories in Home (~)" + if [ -d ~ ]; then + du -h --max-depth=1 ~ 2>/dev/null | sort -hr | head -20 || echo "Could not analyze home directory" + fi + + # 3. Project-specific directories + print_header "3. PROJECT DIRECTORIES" + + print_section "Backend Project (~/mnemo_cards_backend)" + if [ -d ~/mnemo_cards_backend ]; then + BACKEND_SIZE=$(du -sh ~/mnemo_cards_backend 2>/dev/null | awk '{print $1}') + echo "Total size: $BACKEND_SIZE" + echo "" + echo "Subdirectories:" + du -h --max-depth=1 ~/mnemo_cards_backend 2>/dev/null | sort -hr | head -10 || true + + # Check build directory specifically + if [ -d ~/mnemo_cards_backend/build ]; then + BUILD_SIZE=$(du -sh ~/mnemo_cards_backend/build 2>/dev/null | awk '{print $1}') + echo "" + echo "Build directory size: $BUILD_SIZE" + fi + + # Check .dart_tool + if [ -d ~/mnemo_cards_backend/.dart_tool ]; then + DART_TOOL_SIZE=$(du -sh ~/mnemo_cards_backend/.dart_tool 2>/dev/null | awk '{print $1}') + echo ".dart_tool size: $DART_TOOL_SIZE" + fi + else + print_warning "Backend directory not found" + fi + + print_section "Common Packages" + if [ -d ~/mnemo_cards_common ]; then + COMMON_SIZE=$(du -sh ~/mnemo_cards_common 2>/dev/null | awk '{print $1}') + echo "mnemo_cards_common: $COMMON_SIZE" + du -h --max-depth=1 ~/mnemo_cards_common 2>/dev/null | sort -hr | head -5 || true + fi + + if [ -d ~/mnemo_cards_common_backend ]; then + COMMON_BACKEND_SIZE=$(du -sh ~/mnemo_cards_common_backend 2>/dev/null | awk '{print $1}') + echo "mnemo_cards_common_backend: $COMMON_BACKEND_SIZE" + du -h --max-depth=1 ~/mnemo_cards_common_backend 2>/dev/null | sort -hr | head -5 || true + fi + + print_section "Web Application (/var/www/mnemo_cards)" + if [ -d /var/www/mnemo_cards ]; then + WEB_SIZE=$(du -sh /var/www/mnemo_cards 2>/dev/null | awk '{print $1}') + echo "Total size: $WEB_SIZE" + du -h --max-depth=1 /var/www/mnemo_cards 2>/dev/null | sort -hr | head -10 || true + else + print_warning "Web app directory not found" + fi + + print_section "Backup Directories" + BACKUP_COUNT=0 + BACKUP_TOTAL=0 + + for backup_dir in /var/www/mnemo_cards.backup.*; do + if [ -d "$backup_dir" ]; then + BACKUP_COUNT=$((BACKUP_COUNT + 1)) + BACKUP_SIZE=$(du -sm "$backup_dir" 2>/dev/null | awk '{print $1}') + BACKUP_TOTAL=$((BACKUP_TOTAL + BACKUP_SIZE)) + BACKUP_SIZE_HR=$(du -sh "$backup_dir" 2>/dev/null | awk '{print $1}') + BACKUP_NAME=$(basename "$backup_dir") + BACKUP_DATE=$(echo "$BACKUP_NAME" | grep -oE '[0-9]{8}_[0-9]{6}' || echo "unknown") + echo "$BACKUP_NAME: $BACKUP_SIZE_HR (date: $BACKUP_DATE)" + fi + done + + if [ $BACKUP_COUNT -eq 0 ]; then + echo "No backup directories found" + else + BACKUP_TOTAL_HR=$(numfmt --to=iec-i --suffix=B $((BACKUP_TOTAL * 1024 * 1024)) 2>/dev/null || echo "${BACKUP_TOTAL}MB") + echo "" + echo "Total backups: $BACKUP_COUNT" + echo "Total backup size: ~$BACKUP_TOTAL_HR" + if [ $BACKUP_TOTAL -gt 1024 ]; then + print_warning "Backups are taking more than 1GB of space" + fi + fi + + # 4. System directories + print_header "4. SYSTEM DIRECTORIES" + + print_section "Log Files (/var/log)" + if [ -d /var/log ]; then + LOG_SIZE=$(du -sh /var/log 2>/dev/null | awk '{print $1}') + echo "Total log size: $LOG_SIZE" + echo "" + echo "Largest log directories:" + du -h --max-depth=1 /var/log 2>/dev/null | sort -hr | head -10 || true + + # Check specific log directories + for log_dir in nginx systemd journal; do + if [ -d "/var/log/$log_dir" ]; then + LOG_DIR_SIZE=$(du -sh "/var/log/$log_dir" 2>/dev/null | awk '{print $1}') + echo "/var/log/$log_dir: $LOG_DIR_SIZE" + fi + done + fi + + print_section "SSL Certificates (/etc/letsencrypt)" + if [ -d /etc/letsencrypt ]; then + SSL_SIZE=$(du -sh /etc/letsencrypt 2>/dev/null | awk '{print $1}') + echo "Total SSL certificates size: $SSL_SIZE" + du -h --max-depth=2 /etc/letsencrypt 2>/dev/null | sort -hr | head -10 || true + else + echo "Let's Encrypt directory not found" + fi + + print_section "Temporary Files (/tmp)" + if [ -d /tmp ]; then + TMP_SIZE=$(du -sh /tmp 2>/dev/null | awk '{print $1}') + TMP_COUNT=$(find /tmp -type f 2>/dev/null | wc -l) + echo "Total /tmp size: $TMP_SIZE" + echo "Number of files: $TMP_COUNT" + if [ "$TMP_SIZE" != "0" ] && [ "$TMP_SIZE" != "" ]; then + echo "Largest files in /tmp:" + find /tmp -type f -exec du -h {} + 2>/dev/null | sort -hr | head -10 || true + fi + fi + + print_section "Cache Directories" + if [ -d /var/cache ]; then + CACHE_SIZE=$(du -sh /var/cache 2>/dev/null | awk '{print $1}') + echo "/var/cache: $CACHE_SIZE" + du -h --max-depth=1 /var/cache 2>/dev/null | sort -hr | head -10 || true + fi + + if [ -d ~/.cache ]; then + ROOT_CACHE_SIZE=$(du -sh ~/.cache 2>/dev/null | awk '{print $1}') + echo "~/.cache: $ROOT_CACHE_SIZE" + du -h --max-depth=1 ~/.cache 2>/dev/null | sort -hr | head -10 || true + fi + + # 5. Docker check + print_header "5. DOCKER (if installed)" + + if command -v docker &> /dev/null; then + print_info "Docker is installed" + + print_section "Docker Images" + docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" 2>/dev/null || echo "Could not list Docker images" + DOCKER_IMAGES_SIZE=$(docker system df --format "{{.Size}}" 2>/dev/null | head -1 || echo "unknown") + echo "Total Docker images size: $DOCKER_IMAGES_SIZE" + + print_section "Docker Containers" + docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Size}}" 2>/dev/null || echo "Could not list Docker containers" + + print_section "Docker System Disk Usage" + docker system df 2>/dev/null || echo "Could not get Docker disk usage" + + print_section "Docker Volumes" + docker volume ls 2>/dev/null || echo "Could not list Docker volumes" + if [ "$(docker volume ls -q 2>/dev/null | wc -l)" -gt 0 ]; then + for volume in $(docker volume ls -q 2>/dev/null); do + VOLUME_SIZE=$(docker system df -v 2>/dev/null | grep "$volume" | awk '{print $3}' || echo "unknown") + echo "$volume: $VOLUME_SIZE" + done + fi + else + echo "Docker is not installed" + fi + + # 6. Old files check + print_header "6. OLD FILES CHECK" + + print_section "Old Log Files (older than 30 days)" + OLD_LOG_COUNT=0 + OLD_LOG_SIZE=0 + + if [ -d /var/log ]; then + while IFS= read -r file; do + if [ -f "$file" ]; then + OLD_LOG_COUNT=$((OLD_LOG_COUNT + 1)) + FILE_SIZE=$(stat -f%z "$file" 2>/dev/null || stat -c%s "$file" 2>/dev/null || echo 0) + OLD_LOG_SIZE=$((OLD_LOG_SIZE + FILE_SIZE)) + fi + done < <(find /var/log -type f -mtime +30 2>/dev/null | head -20) + + if [ $OLD_LOG_COUNT -gt 0 ]; then + OLD_LOG_SIZE_HR=$(numfmt --to=iec-i --suffix=B $OLD_LOG_SIZE 2>/dev/null || echo "${OLD_LOG_SIZE}B") + echo "Found $OLD_LOG_COUNT old log files (sample of first 20)" + echo "Total size: ~$OLD_LOG_SIZE_HR" + echo "" + echo "Sample old log files:" + find /var/log -type f -mtime +30 -exec ls -lh {} \; 2>/dev/null | head -10 | awk '{print $9, "(" $5 ")"}' || true + else + echo "No old log files found (older than 30 days)" + fi + fi + + print_section "Old Backup Files" + OLD_BACKUP_COUNT=0 + for backup_dir in /var/www/mnemo_cards.backup.*; do + if [ -d "$backup_dir" ]; then + BACKUP_NAME=$(basename "$backup_dir") + BACKUP_DATE=$(echo "$BACKUP_NAME" | grep -oE '[0-9]{8}_[0-9]{6}' || echo "") + if [ -n "$BACKUP_DATE" ]; then + BACKUP_TIMESTAMP=$(date -d "${BACKUP_DATE:0:4}-${BACKUP_DATE:4:2}-${BACKUP_DATE:6:2} ${BACKUP_DATE:9:2}:${BACKUP_DATE:11:2}:${BACKUP_DATE:13:2}" +%s 2>/dev/null || echo 0) + CURRENT_TIMESTAMP=$(date +%s) + DAYS_OLD=$(( (CURRENT_TIMESTAMP - BACKUP_TIMESTAMP) / 86400 )) + if [ $DAYS_OLD -gt 30 ]; then + OLD_BACKUP_COUNT=$((OLD_BACKUP_COUNT + 1)) + BACKUP_SIZE=$(du -sh "$backup_dir" 2>/dev/null | awk '{print $1}') + echo "$BACKUP_NAME: $BACKUP_SIZE (${DAYS_OLD} days old)" + fi + fi + fi + done + + if [ $OLD_BACKUP_COUNT -eq 0 ]; then + echo "No old backup directories found (older than 30 days)" + else + print_warning "Found $OLD_BACKUP_COUNT old backup directories (older than 30 days)" + fi + + print_section "Build Artifacts in Projects" + BUILD_ARTIFACTS_SIZE=0 + + # Check for build directories + for build_dir in ~/mnemo_cards_backend/build ~/mnemo_cards_common/build ~/mnemo_cards_common_backend/build; do + if [ -d "$build_dir" ]; then + BUILD_SIZE=$(du -sm "$build_dir" 2>/dev/null | awk '{print $1}') + BUILD_ARTIFACTS_SIZE=$((BUILD_ARTIFACTS_SIZE + BUILD_SIZE)) + BUILD_SIZE_HR=$(du -sh "$build_dir" 2>/dev/null | awk '{print $1}') + echo "$build_dir: $BUILD_SIZE_HR" + fi + done + + if [ $BUILD_ARTIFACTS_SIZE -gt 0 ]; then + BUILD_ARTIFACTS_SIZE_HR=$(numfmt --to=iec-i --suffix=B $((BUILD_ARTIFACTS_SIZE * 1024 * 1024)) 2>/dev/null || echo "${BUILD_ARTIFACTS_SIZE}MB") + echo "Total build artifacts: ~$BUILD_ARTIFACTS_SIZE_HR" + else + echo "No build artifacts found" + fi + + # Check for .dart_tool directories + print_section ".dart_tool Directories" + DART_TOOL_TOTAL=0 + for dart_tool_dir in ~/mnemo_cards_backend/.dart_tool ~/mnemo_cards_common/.dart_tool ~/mnemo_cards_common_backend/.dart_tool; do + if [ -d "$dart_tool_dir" ]; then + DART_TOOL_SIZE=$(du -sm "$dart_tool_dir" 2>/dev/null | awk '{print $1}') + DART_TOOL_TOTAL=$((DART_TOOL_TOTAL + DART_TOOL_SIZE)) + DART_TOOL_SIZE_HR=$(du -sh "$dart_tool_dir" 2>/dev/null | awk '{print $1}') + echo "$dart_tool_dir: $DART_TOOL_SIZE_HR" + fi + done + + if [ $DART_TOOL_TOTAL -gt 0 ]; then + DART_TOOL_TOTAL_HR=$(numfmt --to=iec-i --suffix=B $((DART_TOOL_TOTAL * 1024 * 1024)) 2>/dev/null || echo "${DART_TOOL_TOTAL}MB") + echo "Total .dart_tool size: ~$DART_TOOL_TOTAL_HR" + else + echo "No .dart_tool directories found" + fi + + # Summary + print_header "SUMMARY" + + echo "Key findings:" + echo "" + + # Root filesystem usage + ROOT_USAGE=$(df -h / | tail -1 | awk '{print $5}' | sed 's/%//') + if [ "$ROOT_USAGE" -gt 90 ]; then + print_warning "⚠️ Root filesystem usage is CRITICAL: ${ROOT_USAGE}%" + elif [ "$ROOT_USAGE" -gt 80 ]; then + print_warning "⚠️ Root filesystem usage is HIGH: ${ROOT_USAGE}%" + else + print_info "✓ Root filesystem usage: ${ROOT_USAGE}%" + fi + + # Check for large directories + echo "" + echo "Recommendations:" + + if [ $BACKUP_COUNT -gt 5 ]; then + print_warning "Consider cleaning old backups (found $BACKUP_COUNT backup directories)" + fi + + if [ $OLD_LOG_COUNT -gt 0 ]; then + print_warning "Consider rotating or cleaning old log files (found $OLD_LOG_COUNT files older than 30 days)" + fi + + if [ $BUILD_ARTIFACTS_SIZE -gt 500 ]; then + print_warning "Consider cleaning build artifacts (taking ~${BUILD_ARTIFACTS_SIZE}MB)" + fi + + if [ $DART_TOOL_TOTAL -gt 500 ]; then + print_warning "Consider cleaning .dart_tool directories (taking ~${DART_TOOL_TOTAL}MB)" + fi + + if command -v docker &> /dev/null; then + DOCKER_UNUSED=$(docker system df 2>/dev/null | grep -i "unused" | awk '{print $4}' || echo "") + if [ -n "$DOCKER_UNUSED" ] && [ "$DOCKER_UNUSED" != "0B" ]; then + print_warning "Consider running 'docker system prune' to free up unused Docker resources" + fi + fi + + echo "" + print_info "Diagnostics completed!" + +ENDSSH + +echo "" +echo -e "${GREEN}✅ Disk space diagnostics completed!${NC}" +echo "" + diff --git a/tools/deploy/disk-cleanup-recommendations.md b/tools/deploy/disk-cleanup-recommendations.md new file mode 100644 index 0000000..a2be9e8 --- /dev/null +++ b/tools/deploy/disk-cleanup-recommendations.md @@ -0,0 +1,252 @@ +# Рекомендации по очистке дискового пространства на сервере + +**Дата анализа:** $(date) +**Текущее использование диска:** 36GB из 40GB (90%) +**Доступно:** 4.2GB + +## Критичные находки (можно освободить ~18-20GB) + +### 1. Docker неиспользуемые ресурсы ⚠️ **~12.2GB** + +**Неиспользуемые Docker образы:** 6.24GB (81% от всех образов) +- `code.mnemo-cards.online/cinnabarflower/cards/agent:latest` - 4.29GB (не используется) +- `moby/buildkit:buildx-stable-1` - 227MB (не используется) +- `dart:stable` - 787MB (не используется) +- `ghcr.io/cirruslabs/flutter:3.35.5` - 3.56GB (используется как базовый, но можно очистить старые версии) +- `node:16-bullseye` - 940MB (не используется) + +**Неиспользуемые Docker volumes:** 5.948GB (91% от всех volumes) +- `GITEA-ACTIONS-TASK-278_WORKFLOW-Build-Agent-Image_JOB-build-and-push` - 1.103GB (старые CI/CD задачи) +- `GITEA-ACTIONS-TASK-278_WORKFLOW-Build-Agent-Image_JOB-build-and-push-env` - 15.88MB +- `GITEA-ACTIONS-TASK-284_WORKFLOW-Build-Agent-Image_JOB-build-and-push` - 1.103GB (старые CI/CD задачи) +- `GITEA-ACTIONS-TASK-284_WORKFLOW-Build-Agent-Image_JOB-build-and-push-env` - 16.92MB +- `act-toolcache` - 3.708GB (кэш инструментов для act) + +**Команды для очистки:** +```bash +# Просмотр неиспользуемых ресурсов +docker system df + +# Удаление неиспользуемых образов, контейнеров, сетей и volumes +docker system prune -a --volumes + +# Или более безопасно - только неиспользуемые volumes +docker volume prune + +# Удаление только неиспользуемых образов +docker image prune -a +``` + +**⚠️ Внимание:** Команда `docker system prune -a --volumes` удалит ВСЕ неиспользуемые ресурсы. Убедитесь, что не нужны старые образы для rollback. + +--- + +### 2. Telegram Bot Backups ⚠️ **5.2GB** + +**Расположение:** `/root/mnemo_cards_telegram_bot/backups` + +**Рекомендация:** Проверить содержимое и удалить старые backups, оставив только последние несколько. + +**Команда для проверки:** +```bash +ls -lh /root/mnemo_cards_telegram_bot/backups +du -h /root/mnemo_cards_telegram_bot/backups/* | sort -hr +``` + +**Команда для удаления (после проверки):** +```bash +# Удалить backups старше 30 дней (пример) +find /root/mnemo_cards_telegram_bot/backups -type f -mtime +30 -delete +``` + +--- + +### 3. Docker Overlay2 ⚠️ **9.1GB** + +**Расположение:** `/var/lib/docker/overlay2` + +Это хранилище Docker для слоев образов. После очистки неиспользуемых образов (пункт 1) размер должен уменьшиться. + +**Команда для очистки:** +```bash +# Очистка произойдет автоматически после docker system prune +# Или вручную (осторожно!): +docker system prune -a --volumes +``` + +--- + +## Средние находки (можно освободить ~1-2GB) + +### 4. Кэш директории **~1GB** + +**Root cache:** `/root/.cache` - 751MB +- `act` - 635MB (кэш для GitHub Actions локального запуска) +- `code-server` - 117MB (кэш VSCode Server) + +**Pub cache:** `/root/.pub-cache` - 663MB (кэш Dart пакетов) + +**System cache:** `/var/cache` - 275MB +- `apt` - 257MB (кэш пакетов apt) + +**Команды для очистки:** +```bash +# Очистка apt кэша +apt-get clean +apt-get autoclean + +# Очистка pub cache (можно пересобрать при необходимости) +rm -rf ~/.pub-cache/hosted/* + +# Очистка act cache (если не используется) +rm -rf ~/.cache/act + +# Очистка code-server cache (можно пересобрать) +rm -rf ~/.cache/code-server +``` + +**⚠️ Внимание:** После очистки кэша, при следующем использовании пакеты/инструменты будут загружены заново. + +--- + +### 5. Старые Backup директории **~248MB** + +**Расположение:** `/var/www/mnemo_cards.backup.*` + +**Найдено:** 8 backup директорий по ~31MB каждая (все от 25-26 октября 2025) + +**Список:** +- `mnemo_cards.backup.20251025_141822` - 31MB +- `mnemo_cards.backup.20251025_141931` - 31MB +- `mnemo_cards.backup.20251025_154819` - 31MB +- `mnemo_cards.backup.20251025_211926` - 31MB +- `mnemo_cards.backup.20251025_234756` - 31MB +- `mnemo_cards.backup.20251026_000205` - 31MB +- `mnemo_cards.backup.20251026_003152` - 31MB +- `mnemo_cards.backup.20251026_014752` - 31MB + +**Рекомендация:** Оставить только последний backup, остальные удалить. + +**Команда для удаления:** +```bash +# Просмотр всех backups +ls -lh /var/www/mnemo_cards.backup.* + +# Удалить все кроме последнего (самого нового) +cd /var/www +ls -t mnemo_cards.backup.* | tail -n +2 | xargs rm -rf +``` + +--- + +### 6. Логи **~760MB** + +**Общий размер:** `/var/log` - 760MB + +**Nginx логи:** 39MB +- `access.log.1` - 23MB +- `access.log` - 11MB (текущий) +- `error.log.1` - 2.3MB +- `error.log` - 2.0MB (текущий) + +**Старые логи (30+ дней):** 34 файла + +**Команды для очистки:** +```bash +# Ротация nginx логов (оставить только последние 7 дней) +find /var/log/nginx -type f -name "*.log.*" -mtime +7 -delete + +# Очистка старых логов (30+ дней) +find /var/log -type f -mtime +30 -delete + +# Очистка старых сжатых логов +find /var/log -type f -name "*.gz" -mtime +30 -delete + +# Настройка logrotate для автоматической ротации +# (проверить /etc/logrotate.d/nginx) +``` + +--- + +## Малые находки (можно освободить ~50-100MB) + +### 7. Старые системные логи + +**Команда для просмотра:** +```bash +find /var/log -type f -mtime +30 -ls +``` + +**Команда для удаления:** +```bash +find /var/log -type f -mtime +30 -delete +``` + +--- + +## Итоговая таблица рекомендаций + +| Категория | Размер | Приоритет | Безопасность | Команда | +|-----------|--------|-----------|--------------|---------| +| Docker неиспользуемые ресурсы | ~12.2GB | 🔴 Высокий | ✅ Безопасно | `docker system prune -a --volumes` | +| Telegram Bot Backups | 5.2GB | 🔴 Высокий | ⚠️ Проверить | `find /root/mnemo_cards_telegram_bot/backups -mtime +30 -delete` | +| Docker Overlay2 | 9.1GB | 🟡 Средний | ✅ После очистки Docker | Автоматически после prune | +| Кэш (pub, apt, act) | ~1GB | 🟡 Средний | ✅ Безопасно | `apt-get clean && rm -rf ~/.pub-cache/hosted/*` | +| Старые backups | ~248MB | 🟡 Средний | ✅ Безопасно | Удалить все кроме последнего | +| Логи | ~760MB | 🟢 Низкий | ✅ Безопасно | `find /var/log -mtime +30 -delete` | + +## Общий потенциал освобождения: ~18-20GB + +## Рекомендуемый порядок действий + +1. **Сначала Docker** (самый большой эффект): + ```bash + docker system df # Проверить + docker system prune -a --volumes # Очистить + ``` + +2. **Проверить Telegram Bot backups**: + ```bash + ls -lh /root/mnemo_cards_telegram_bot/backups + # Решить, какие удалить + ``` + +3. **Очистить кэш**: + ```bash + apt-get clean + apt-get autoclean + ``` + +4. **Удалить старые backups веб-приложения**: + ```bash + cd /var/www + ls -t mnemo_cards.backup.* | tail -n +2 | xargs rm -rf + ``` + +5. **Очистить старые логи**: + ```bash + find /var/log -type f -mtime +30 -delete + ``` + +## ⚠️ ВАЖНЫЕ ПРЕДУПРЕЖДЕНИЯ + +1. **НЕ удаляйте** директории проекта: + - `/root/mnemo_cards_backend` (464MB) - рабочий проект + - `/root/mnemo_cards_common` (672KB) - рабочий проект + - `/root/mnemo_cards_common_backend` (1.5MB) - рабочий проект + - `/var/www/mnemo_cards` - текущее веб-приложение + +2. **НЕ удаляйте** данные проекта: + - `/root/mnemo_cards_backend/isar` (236MB) - база данных + - `/root/mnemo_cards_backend/data` (213MB) - данные приложения + +3. **Перед удалением Docker ресурсов** убедитесь, что не нужны старые образы для rollback. + +4. **Перед удалением backups** проверьте их содержимое и убедитесь, что текущая версия работает. + +## После очистки + +После выполнения рекомендаций ожидаемое использование диска: **~16-18GB из 40GB (40-45%)** + +Это освободит **~18-20GB** дискового пространства. + diff --git a/tools/deploy/fix-vscode-rate-limit.sh b/tools/deploy/fix-vscode-rate-limit.sh new file mode 100755 index 0000000..bd1ff42 --- /dev/null +++ b/tools/deploy/fix-vscode-rate-limit.sh @@ -0,0 +1,81 @@ +#!/bin/bash + +# Script to fix VSCode rate limiting issue (429 Too Many Requests) +# Updates nginx.conf to increase rate limits for VSCode + +set -e + +SERVER_IP="147.45.152.129" +SERVER_USER="root" + +echo "🔧 Fixing VSCode rate limiting configuration..." +echo "Server: $SERVER_IP" +echo "" + +ssh "$SERVER_USER@$SERVER_IP" << 'ENDSSH' + set -e + + echo "📋 Backing up current nginx.conf..." + cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup.$(date +%Y%m%d_%H%M%S) + + echo "" + echo "🔍 Checking current rate limit configuration..." + if grep -q "limit_req_zone.*vscode_general" /etc/nginx/nginx.conf; then + echo "Current vscode_general rate limit:" + grep "limit_req_zone.*vscode_general" /etc/nginx/nginx.conf + echo "" + + echo "📝 Updating rate limit from 30r/m to 200r/m..." + # Update vscode_general rate limit + sed -i 's/limit_req_zone $binary_remote_addr zone=vscode_general:10m rate=30r\/m;/limit_req_zone $binary_remote_addr zone=vscode_general:10m rate=200r\/m;/' /etc/nginx/nginx.conf + + echo "✅ Rate limit updated" + echo "" + echo "New vscode_general rate limit:" + grep "limit_req_zone.*vscode_general" /etc/nginx/nginx.conf + else + echo "⚠️ vscode_general rate limit zone not found" + echo "Adding rate limiting zones..." + + # Find http block and add rate limiting zones + if grep -q "^http {" /etc/nginx/nginx.conf; then + sed -i '/^http {/a\ # Rate limiting zones for VSCode Server\n limit_req_zone $binary_remote_addr zone=vscode_general:10m rate=200r/m;\n limit_req_zone $binary_remote_addr zone=vscode_login:10m rate=5r/m;' /etc/nginx/nginx.conf + echo "✅ Rate limiting zones added" + else + echo "❌ Could not find http block in nginx.conf" + exit 1 + fi + fi + + echo "" + echo "📊 Testing nginx configuration syntax..." + /usr/sbin/nginx -t + + if [ $? -eq 0 ]; then + echo "" + echo "🔄 Reloading nginx..." + systemctl reload nginx + echo "✅ nginx reloaded successfully" + else + echo "❌ nginx configuration test failed" + echo "Restoring backup..." + cp /etc/nginx/nginx.conf.backup.* /etc/nginx/nginx.conf + exit 1 + fi + + echo "" + echo "📊 Final rate limit configuration:" + grep "limit_req_zone.*vscode" /etc/nginx/nginx.conf + +ENDSSH + +echo "" +echo "✅ Done!" +echo "" +echo "📝 Changes made:" +echo " - vscode_general rate limit: 30r/m → 200r/m" +echo " - Static files are excluded from rate limiting (in vscode-nginx.conf)" +echo "" +echo "🌐 Test VSCode Server at:" +echo " https://vscode.mnemo-cards.online/" +