Skip to content

Sistem Temizliği ve Önbellek Yönetimi #47

Sistem Temizliği ve Önbellek Yönetimi

Sistem Temizliği ve Önbellek Yönetimi #47

Workflow file for this run

name: Sistem Temizliği ve Önbellek Yönetimi
on:
workflow_dispatch:
inputs:
cleanup_level:
type: choice
description: "Temizlik seviyesi"
options:
- light
- moderate
- full
- nuclear
default: "moderate"
required: true
clean_docker_images:
type: boolean
description: "Kullanılmayan Docker imajlarını temizle"
default: true
clean_docker_containers:
type: boolean
description: "Durmuş Docker container'larını temizle"
default: true
clean_build_cache:
type: boolean
description: "Maven/Gradle/NPM cache'lerini temizle"
default: false
clean_docker_volumes:
type: boolean
description: "⚠️ TEHLİKE: Docker volume'larını temizle (veri kaybı olabilir!)"
default: false
restart_services:
type: boolean
description: "Temizlik sonrası hizmetleri yeniden başlat"
default: false
target_service:
type: choice
description: "Hedef servis (sadece belirli bir servisi temizlemek için)"
options:
- all
- user-service
- llm-service
- subscription-service
- image-service
- notification-service
- analytics-service
- admin-service
- activity-log-service
- user-memory-service
- lighthouse-service
- lighthouse-worker
- eureka-server
- credit-service
- api-gateway
- redis
- mongodb
- kafka
- zookeeper
- redis-client-lib
default: "all"
required: false
clean_redis_cache:
type: boolean
description: "Redis önbelleğini temizle"
default: false
redis_cache_pattern:
type: choice
description: "Redis önbellek temizleme deseni"
options:
- all
- user
- preference
- notification
- subscription
- analytics
- response
- custom
default: "all"
required: false
redis_custom_pattern:
type: string
description: "Özel Redis önbellek deseni (örn: user:*, pref:*)"
required: false
default: ""
jobs:
cleanup:
runs-on: self-hosted
steps:
- name: Temizlik İşlemi Başlatılıyor
run: |
echo "=== Temizlik İşlemi Başlatılıyor ==="
echo "Seviye: ${{ github.event.inputs.cleanup_level }}"
echo "Hedef Servis: ${{ github.event.inputs.target_service }}"
echo "Tarih: $(date)"
echo "Temizlik öncesi sistem durumu:"
echo "Disk alanı:"
df -h
echo "Docker durumu:"
docker info
docker system df
- name: Sistem Hafızası Durumu
run: |
echo "=== Sistem Hafıza Durumu ==="
free -h
echo "=== Docker Konteyner Durumu ==="
docker ps -a
echo "=== Docker İmaj Durumu ==="
docker images
- name: Docker Container Temizliği
if: ${{ github.event.inputs.clean_docker_containers == 'true' }}
run: |
echo "=== Docker Container Temizliği ==="
if [ "${{ github.event.inputs.target_service }}" != "all" ]; then
echo "Sadece ${{ github.event.inputs.target_service }} için temizlik yapılıyor..."
docker ps -a | grep "${{ github.event.inputs.target_service }}" | grep "Exited" | awk '{print $1}' | xargs -r docker rm -f
echo "Temizlik tamamlandı."
else
echo "Tüm durmuş containerlar temizleniyor..."
docker container prune -f
echo "Temizlik tamamlandı."
fi
- name: Docker Image Temizliği
if: ${{ github.event.inputs.clean_docker_images == 'true' }}
run: |
echo "=== Docker Image Temizliği ==="
# İmajlar temizlenmeden önce ilgili konteynerleri durdur ve kaldır
if [ "${{ github.event.inputs.target_service }}" != "all" ]; then
echo "Önce ${{ github.event.inputs.target_service }} container'larını durduruyorum..."
docker ps -a | grep "${{ github.event.inputs.target_service }}" | awk '{print $1}' | xargs -r docker stop
docker ps -a | grep "${{ github.event.inputs.target_service }}" | awk '{print $1}' | xargs -r docker rm
echo "${{ github.event.inputs.target_service }} container'ları durduruldu ve kaldırıldı."
fi
if [ "${{ github.event.inputs.cleanup_level }}" == "light" ]; then
echo "Hafif temizlik: Sadece dangling (etiketlenmemiş) imajlar temizleniyor..."
docker image prune -f
elif [ "${{ github.event.inputs.cleanup_level }}" == "moderate" ]; then
echo "Orta seviye temizlik: Kullanılmayan tüm imajlar temizleniyor..."
docker image prune -a -f --filter "until=24h"
elif [ "${{ github.event.inputs.cleanup_level }}" == "full" ]; then
echo "Tam temizlik: Tüm kullanılmayan imajlar temizleniyor..."
docker image prune -a -f
elif [ "${{ github.event.inputs.cleanup_level }}" == "nuclear" ] && [ "${{ github.event.inputs.target_service }}" == "all" ]; then
echo "⚠️ Nuclear temizlik: Tüm konteynerleri durdurma ve kaldırma işlemi yapılıyor..."
docker ps -a -q | xargs -r docker stop
docker ps -a -q | xargs -r docker rm
echo "⚠️ Nuclear temizlik: Tüm imajlar temizleniyor (kullanılanlar dahil)..."
docker rmi -f $(docker images -q) || true
elif [ "${{ github.event.inputs.cleanup_level }}" == "nuclear" ] && [ "${{ github.event.inputs.target_service }}" != "all" ]; then
echo "⚠️ Nuclear temizlik: ${{ github.event.inputs.target_service }} imajları temizleniyor..."
# Önce image ID'lerini al
TARGET_IMAGES=$(docker images | grep "${{ github.event.inputs.target_service }}" | awk '{print $3}')
if [ ! -z "$TARGET_IMAGES" ]; then
echo "$TARGET_IMAGES" | xargs -r docker rmi -f || true
else
echo "${{ github.event.inputs.target_service }} ile ilgili imaj bulunamadı"
fi
fi
echo "Image temizliği tamamlandı."
- name: Docker Build Cache Temizliği
if: ${{ github.event.inputs.cleanup_level == 'full' || github.event.inputs.cleanup_level == 'nuclear' }}
run: |
echo "=== Docker Build Cache Temizliği ==="
docker builder prune -f -a
echo "Build cache temizliği tamamlandı."
- name: Docker Network Temizliği
if: ${{ github.event.inputs.cleanup_level != 'light' }}
run: |
echo "=== Docker Network Temizliği ==="
docker network prune -f
echo "Network temizliği tamamlandı."
- name: Docker Volume Temizliği
if: ${{ github.event.inputs.clean_docker_volumes == 'true' }}
run: |
echo "=== Docker Volume Temizliği ==="
if [ "${{ github.event.inputs.target_service }}" != "all" ]; then
echo "⚠️⚠️⚠️ DİKKAT: ${{ github.event.inputs.target_service }} ile ilgili tüm volume'lar temizlenecek! ⚠️⚠️⚠️"
docker volume ls | grep "${{ github.event.inputs.target_service }}" | awk '{print $2}' | xargs -r docker volume rm
else
if [ "${{ github.event.inputs.cleanup_level }}" == "nuclear" ]; then
echo "⚠️⚠️⚠️ UYARI: TÜM DOCKER VOLUME'LAR KALDIRILACAK! VERİ KAYBI OLACAK! ⚠️⚠️⚠️"
docker volume prune -f
else
echo "⚠️ UYARI: Kullanılmayan Docker volume'ları temizleniyor..."
docker volume prune -f
fi
fi
echo "Volume temizliği tamamlandı."
- name: Maven/Gradle Cache Temizliği
if: ${{ github.event.inputs.clean_build_cache == 'true' }}
run: |
echo "=== Build Cache Temizliği ==="
# Maven cache temizliği
if [ -d ~/.m2/repository ]; then
echo "Maven cache temizleniyor..."
if [ "${{ github.event.inputs.cleanup_level }}" == "nuclear" ]; then
rm -rf ~/.m2/repository/*
echo "Tüm Maven cache temizlendi."
elif [ "${{ github.event.inputs.cleanup_level }}" == "full" ]; then
# Maven cache'ini temizle ama local repo'yu bırak
find ~/.m2/repository -type d -name "*SNAPSHOT" | xargs -r rm -rf
echo "Maven SNAPSHOT cache temizlendi."
else
# Sadece temp/lastUpdated dosyalarını temizle
find ~/.m2 -name "*.lastUpdated" -type f -delete
find ~/.m2 -name "*.repositories" -type f -delete
find ~/.m2 -name "*_remote.repositories" -type f -delete
find ~/.m2 -name "resolver-status.properties" -type f -delete
echo "Maven geçici dosyaları temizlendi."
fi
else
echo "Maven cache bulunamadı."
fi
# Gradle cache temizliği
if [ -d ~/.gradle/caches ]; then
echo "Gradle cache temizleniyor..."
if [ "${{ github.event.inputs.cleanup_level }}" == "nuclear" ]; then
rm -rf ~/.gradle/caches/*
echo "Tüm Gradle cache temizlendi."
else
rm -rf ~/.gradle/caches/modules-2/files-2.1/*
rm -rf ~/.gradle/caches/transforms-*
rm -rf ~/.gradle/caches/*/plugin-resolution/*
echo "Gradle cache temizlendi."
fi
else
echo "Gradle cache bulunamadı."
fi
# NPM cache temizliği
if [ -d ~/.npm ]; then
echo "NPM cache temizleniyor..."
npm cache clean --force
echo "NPM cache temizlendi."
else
echo "NPM cache bulunamadı."
fi
echo "Build cache temizliği tamamlandı."
- name: Sistem Dosya Temizliği
if: ${{ github.event.inputs.cleanup_level == 'full' || github.event.inputs.cleanup_level == 'nuclear' }}
run: |
echo "=== Sistem Dosya Temizliği ==="
# /tmp klasöründeki eski dosyaları temizle (7 günden eski)
echo "Geçici dosyalar temizleniyor..."
find /tmp -type f -atime +7 -delete 2>/dev/null || true
# /var/log/ içindeki compress edilmiş eski log dosyalarını temizle
echo "Eski log dosyaları temizleniyor..."
find /var/log -type f -name "*.gz" -delete 2>/dev/null || true
# Docker log temizliği
echo "Docker log dosyaları temizleniyor..."
truncate -s 0 /var/lib/docker/containers/*/*-json.log 2>/dev/null || true
echo "Sistem dosya temizliği tamamlandı."
- name: Docker Sistem Temizliği
run: |
echo "=== Docker Sistem Temizliği ==="
docker system prune -f
if [ "${{ github.event.inputs.cleanup_level }}" == "full" ] || [ "${{ github.event.inputs.cleanup_level }}" == "nuclear" ]; then
echo "Kapsamlı Docker sistem temizliği yapılıyor..."
docker system prune -a -f --volumes
fi
echo "Docker sistem temizliği tamamlandı."
- name: Servisleri Yeniden Başlat
if: ${{ github.event.inputs.restart_services == 'true' }}
run: |
echo "=== Servisleri Yeniden Başlatma ==="
if [ "${{ github.event.inputs.target_service }}" != "all" ]; then
echo "${{ github.event.inputs.target_service }} servisini yeniden başlatıyorum..."
docker restart ${{ github.event.inputs.target_service }} || true
else
echo "Temel servisleri önce başlatıyorum..."
docker restart redis zookeeper kafka mongodb eureka-server || true
echo "Diğer servisleri başlatıyorum..."
sleep 15
docker ps -a --format "{{.Names}}" | grep -v "redis\|zookeeper\|kafka\|mongodb\|eureka-server" | xargs -r docker restart
fi
echo "Servisler başlatıldı. Servis durumları kontrol ediliyor..."
docker ps
- name: Temizlik Sonrası Durum Raporu
run: |
echo "=== Temizlik Sonrası Durum Raporu ==="
echo "Tarih: $(date)"
echo ""
echo "Disk Alanı Durumu:"
df -h
echo ""
echo "Docker Sistemi Durumu:"
docker system df
echo ""
echo "Docker Konteyner Durumu:"
docker ps -a
echo ""
echo "Docker Image Durumu:"
docker images
echo ""
echo "Ram Durumu:"
free -h
echo ""
echo "=== Temizlik İşlemi Tamamlandı ==="
- name: Redis Cache Temizliği
if: ${{ github.event.inputs.clean_redis_cache == 'true' }}
run: |
echo "=== Redis Cache Temizliği ==="
# Redis bağlantı parametreleri
REDIS_HOST="${{ env.REDIS_HOST || 'redis' }}"
REDIS_PORT="${{ env.REDIS_PORT || '6379' }}"
REDIS_PASS="${{ env.REDIS_PASSWORD || '13579ada' }}"
# Redis CLI komutu oluştur
REDIS_CLI="redis-cli -h $REDIS_HOST -p $REDIS_PORT"
if [ ! -z "$REDIS_PASS" ]; then
REDIS_CLI="$REDIS_CLI -a $REDIS_PASS"
fi
# Pattern seçimine göre temizlik yap
case "${{ github.event.inputs.redis_cache_pattern }}" in
"all")
echo "Tüm Redis önbelleği temizleniyor..."
$REDIS_CLI FLUSHALL
;;
"user")
echo "Kullanıcı önbellekleri temizleniyor..."
$REDIS_CLI EVAL "for _,k in ipairs(redis.call('keys','user:*')) do redis.call('del',k) end" 0
$REDIS_CLI EVAL "for _,k in ipairs(redis.call('keys','cache:user:*')) do redis.call('del',k) end" 0
;;
"preference")
echo "Tercih önbellekleri temizleniyor..."
$REDIS_CLI EVAL "for _,k in ipairs(redis.call('keys','preference:*')) do redis.call('del',k) end" 0
;;
"notification")
echo "Bildirim önbellekleri temizleniyor..."
$REDIS_CLI EVAL "for _,k in ipairs(redis.call('keys','notification:*')) do redis.call('del',k) end" 0
;;
"subscription")
echo "Abonelik önbellekleri temizleniyor..."
$REDIS_CLI EVAL "for _,k in ipairs(redis.call('keys','subscription:*')) do redis.call('del',k) end" 0
$REDIS_CLI EVAL "for _,k in ipairs(redis.call('keys','cache:subscription:*')) do redis.call('del',k) end" 0
;;
"analytics")
echo "Analitik önbellekleri temizleniyor..."
$REDIS_CLI EVAL "for _,k in ipairs(redis.call('keys','analytics:*')) do redis.call('del',k) end" 0
;;
"response")
echo "LLM yanıt önbellekleri temizleniyor..."
$REDIS_CLI EVAL "for _,k in ipairs(redis.call('keys','llm:response:*')) do redis.call('del',k) end" 0
;;
"custom")
if [ ! -z "${{ github.event.inputs.redis_custom_pattern }}" ]; then
echo "Özel desen ile önbellek temizleniyor: ${{ github.event.inputs.redis_custom_pattern }}"
$REDIS_CLI EVAL "for _,k in ipairs(redis.call('keys','${{ github.event.inputs.redis_custom_pattern }}')) do redis.call('del',k) end" 0
else
echo "Özel desen belirtilmedi, temizlik yapılmadı."
fi
;;
esac
echo "Redis önbellek temizliği tamamlandı."
echo "Mevcut Redis bellek kullanımı:"
$REDIS_CLI INFO memory | grep "used_memory_human"
clean-redis-lib-cache:
runs-on: self-hosted
if: ${{ github.event.inputs.target_service == 'redis-client-lib' || github.event.inputs.target_service == 'all' }}
steps:
- name: Clean Redis Client Lib Maven Cache
run: |
echo "=== Redis Client Lib Maven Cache Temizliği ==="
if [ "${{ github.event.inputs.clean_redis_cache }}" == "true" ]; then
echo "Redis client lib önbelleği temizleniyor..."
# Redis client lib'e ait Maven cache'ini temizle
rm -rf ~/.m2/repository/com/craftpilot/redis-client-lib
# LastUpdated dosyalarını temizle
find ~/.m2 -name "*.lastUpdated" -type f -delete
find ~/.m2 -name "*.repositories" -type f -delete
find ~/.m2 -name "*_remote.repositories" -type f -delete
find ~/.m2 -name "resolver-status.properties" -type f -delete
echo "Redis client lib Maven cache temizlendi"
else
echo "Redis önbellek temizliği seçilmedi, işlem atlanıyor..."
fi
- name: Verify Cache Cleanup
run: |
echo "Cache durumu kontrol ediliyor..."
ls -la ~/.m2/repository/com/craftpilot/ || echo "Craftpilot cache temizlendi"