This commit is contained in:
Dmitry 2025-11-22 23:22:44 +03:00
parent 2969ee9ef5
commit 98af938509
4 changed files with 767 additions and 12 deletions

View file

@ -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

432
tools/deploy/check-disk-space.sh Executable file
View file

@ -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 ""

View file

@ -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** дискового пространства.

View file

@ -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/"