deploy
This commit is contained in:
parent
2969ee9ef5
commit
98af938509
4 changed files with 767 additions and 12 deletions
|
|
@ -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
432
tools/deploy/check-disk-space.sh
Executable 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 ""
|
||||
|
||||
252
tools/deploy/disk-cleanup-recommendations.md
Normal file
252
tools/deploy/disk-cleanup-recommendations.md
Normal 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** дискового пространства.
|
||||
|
||||
81
tools/deploy/fix-vscode-rate-limit.sh
Executable file
81
tools/deploy/fix-vscode-rate-limit.sh
Executable 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/"
|
||||
|
||||
Loading…
Reference in a new issue