8.1 KiB
8.1 KiB
🚀 Docker Compose ile Celery Kullanımı
Bu döküman, Docker Compose üzerinde Celery worker ve beat'in nasıl çalıştırılacağını açıklar.
📋 Genel Bakış
Projede iki Docker Compose yapılandırması bulunmaktadır:
- docker-compose.yml - Development (Geliştirme) ortamı
- docker-compose.prod.yml - Production (Canlı) ortamı
Her iki ortamda da Celery worker ve beat aynı container içinde çalışır:
celery -A core worker --beat --scheduler django --loglevel=info
🏗️ Servis Yapısı
Development (docker-compose.yml)
services:
web: # Django uygulaması
celery: # Celery worker + beat
Production (docker-compose.prod.yml)
services:
web-atahan: # Django uygulaması (Gunicorn)
celery-atahan: # Celery worker + beat
nginx: # Reverse proxy
🚀 Başlatma
Development Ortamı
# Tüm servisleri başlat (web + celery)
docker-compose up
# Arka planda çalıştır
docker-compose up -d
# Sadece Celery'yi başlat
docker-compose up celery
# Rebuild ile başlat
docker-compose up --build
Production Ortamı
# Tüm servisleri başlat
docker-compose -f docker-compose.prod.yml up -d
# Sadece Celery'yi başlat
docker-compose -f docker-compose.prod.yml up -d celery-atahan
# Rebuild ile başlat
docker-compose -f docker-compose.prod.yml up --build -d
📊 Log İzleme
Development
# Tüm servislerin logları
docker-compose logs -f
# Sadece Celery logları
docker-compose logs -f celery
# Son 100 satır
docker-compose logs --tail=100 celery
# Belirli bir tarihten sonraki loglar
docker-compose logs --since 2026-01-15T10:00:00 celery
Production
# Celery logları
docker-compose -f docker-compose.prod.yml logs -f celery-atahan
# Tüm servisler
docker-compose -f docker-compose.prod.yml logs -f
🔄 Yeniden Başlatma
Development
# Celery'yi yeniden başlat
docker-compose restart celery
# Tüm servisleri yeniden başlat
docker-compose restart
Production
# Celery'yi yeniden başlat
docker-compose -f docker-compose.prod.yml restart celery-atahan
# Tüm servisleri yeniden başlat
docker-compose -f docker-compose.prod.yml restart
🛑 Durdurma
Development
# Servisleri durdur (container'ları kaldır)
docker-compose down
# Sadece Celery'yi durdur
docker-compose stop celery
# Volume'leri de sil
docker-compose down -v
Production
# Servisleri durdur
docker-compose -f docker-compose.prod.yml down
# Sadece Celery'yi durdur
docker-compose -f docker-compose.prod.yml stop celery-atahan
🔧 Container'a Bağlanma
Development
# Celery container'a bash ile bağlan
docker-compose exec celery bash
# Celery container'da komut çalıştır
docker-compose exec celery ls -la
docker-compose exec celery python manage.py shell
Production
# Celery container'a bash ile bağlan
docker-compose -f docker-compose.prod.yml exec celery-atahan bash
# Komut çalıştır
docker-compose -f docker-compose.prod.yml exec celery-atahan python manage.py shell
📝 Celery Task Yönetimi
Task Sonuçlarını Görüntüleme
# Django shell aç
docker-compose exec web python manage.py shell
# Shell içinde:
from django_celery_results.models import TaskResult
# Tüm task sonuçları
TaskResult.objects.all()
# Başarılı task'lar
TaskResult.objects.filter(status='SUCCESS')
# Başarısız task'lar
TaskResult.objects.filter(status='FAILURE')
# En son 10 task
TaskResult.objects.order_by('-date_done')[:10]
Django Admin'den Task İzleme
-
Tarayıcıda admin panele girin:
- Development: http://localhost:8000/admin/
- Production: http://your-domain.com/admin/
-
Şu bölümlere gidin:
- Django Celery Results → Task results - Task sonuçları
- Django Celery Beat → Periodic tasks - Zamanlanmış task'lar
- Django Celery Beat → Intervals - Periyodik aralıklar
Manuel Task Çalıştırma
# Django shell aç
docker-compose exec web python manage.py shell
# Shell içinde bir task çalıştır:
from contact.tasks import send_contact_email
# Hemen çalıştır (test için)
result = send_contact_email(
name='Test',
email='test@example.com',
subject='Test Subject',
message='Test message',
ip='127.0.0.1'
)
print(result)
# Celery queue'ya ekle (asenkron)
task = send_contact_email.delay(
name='Test',
email='test@example.com',
subject='Test Subject',
message='Test message',
ip='127.0.0.1'
)
print(f"Task ID: {task.id}")
print(f"Task Status: {task.status}")
⚙️ Environment Variables
Development (.env veya docker-compose.yml)
CELERY_BROKER_URL=redis://default:password@host:6379/5
CELERY_RESULT_BACKEND=django-db
Production (.env)
CELERY_BROKER_URL=redis://default:password@host:6379/5
CELERY_RESULT_BACKEND=django-db
🐛 Sorun Giderme
Celery Başlamıyor
# Logları kontrol et
docker-compose logs celery
# Container durumunu kontrol et
docker-compose ps
# Container'ı yeniden başlat
docker-compose restart celery
# Container'ı rebuild et
docker-compose up --build celery
Redis Bağlantı Hatası
# Redis bağlantısını test et
docker-compose exec celery python -c "
from celery import Celery
app = Celery('core')
app.config_from_object('django.conf:settings', namespace='CELERY')
print('Connection OK')
"
# Environment variable'ları kontrol et
docker-compose exec celery env | grep CELERY
Task Çalışmıyor
# Celery worker'ın çalıştığını doğrula
docker-compose logs -f celery
# Task'ın queue'ya eklendiğini kontrol et
docker-compose exec web python manage.py shell
>>> from django_celery_results.models import TaskResult
>>> TaskResult.objects.latest('date_created')
# Task'ı manuel çalıştır
>>> from contact.tasks import send_contact_email
>>> send_contact_email.delay('Test', 'test@test.com', 'Subject', 'Message')
Email Gönderilmiyor
# Email backend ayarlarını kontrol et
docker-compose exec web python manage.py shell
>>> from django.conf import settings
>>> print(settings.EMAIL_BACKEND)
>>> print(settings.EMAIL_HOST)
>>> print(settings.EMAIL_PORT)
# MailPit kontrol et (development)
# http://localhost:8025
📈 Performans İzleme
Container Kaynak Kullanımı
# Tüm container'ların kaynak kullanımı
docker stats
# Sadece Celery
docker stats django_celery_worker
# Production
docker stats django_celery_prod_atahan
Celery Worker İstatistikleri
# Celery inspect komutu
docker-compose exec celery celery -A core inspect active
docker-compose exec celery celery -A core inspect stats
docker-compose exec celery celery -A core inspect registered
🔐 Production Best Practices
1. Log Rotation
Production'da log dosyaları büyüyebilir. Docker log rotation kullanın:
# docker-compose.prod.yml
celery-atahan:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
2. Resource Limits
Container'lara kaynak limiti koyun:
celery-atahan:
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
reservations:
cpus: '0.5'
memory: 256M
3. Health Checks
Celery health check ekleyin:
celery-atahan:
healthcheck:
test: ["CMD-SHELL", "celery -A core inspect ping"]
interval: 30s
timeout: 10s
retries: 3
4. Restart Policy
Otomatik yeniden başlatma:
celery-atahan:
restart: unless-stopped
📚 Ek Kaynaklar
🆘 Yardım
Sorun yaşıyorsanız:
- Logları kontrol edin:
docker-compose logs -f celery - Container durumunu kontrol edin:
docker-compose ps - Environment variable'ları kontrol edin:
docker-compose exec celery env - Redis bağlantısını test edin
- Task'ları manuel çalıştırın ve sonucu gözlemleyin