Celery - Zadania w tle
======================
Ten dokument opisuje infrastrukturę Celery wdrożoną w projekcie Poradnia w ramach Fazy 1 migracji zadań w tle (Issue #1828).
Przegląd
--------
Celery to system kolejek rozproszonych umożliwiający asynchroniczne wykonywanie zadań w tle. Ta infrastruktura zastępuje starszy system oparty na cron bardziej solidnym i skalowalnym rozwiązaniem.
Architektura
------------
Konfiguracja Celery składa się z trzech głównych komponentów:
1. **RabbitMQ** - Broker wiadomości, który kolejkuje zadania
2. **Celery Worker** - Przetwarza zadania z kolejki
3. **Celery Beat** - Planuje zadania okresowe (zastępuje cron)
Usługi Docker
-------------
RabbitMQ Message Broker
~~~~~~~~~~~~~~~~~~~~~~~~
- **Obraz**: ``rabbitmq:3.12-management-alpine``
- **Porty**:
- 5672 (protokół AMQP)
- 15672 (interfejs webowy zarządzania)
- **Dane logowania**: ``poradnia:password`` (tylko dla developmentu)
- **Panel zarządzania**: http://localhost:15672
Celery Worker
~~~~~~~~~~~~~
- Przetwarza zadania w tle asynchronicznie
- Używa tego samego obrazu Docker co usługa web
- Łączy się z RabbitMQ do obsługi kolejki zadań
- Przechowuje wyniki w bazie danych Django
Celery Beat
~~~~~~~~~~~
- Planuje zadania okresowe używając backendu bazodanowego
- Zastępuje stary system cron
- Zadania konfigurowane przez panel administracyjny Django
- Używa ``django-celery-beat`` dla planowania opartego na bazie danych
Konfiguracja
------------
Zależności
~~~~~~~~~~
.. code-block:: text
celery[rabbitmq]
django-celery-beat
django-celery-results
Ustawienia Django
~~~~~~~~~~~~~~~~~~
Ustawienia podstawowe (``config/settings/common.py``)
Podstawowa konfiguracja Celery współdzielona między środowiskami
Ustawienia deweloperskie (``config/settings/local.py``)
Połączenie z brokerem localhost, synchroniczne wykonywanie podczas testów
Ustawienia produkcyjne (``config/settings/production.py``)
Logika ponawiania połączeń, monitorowanie zdarzeń zadań
Zmienne środowiskowe
~~~~~~~~~~~~~~~~~~~~
- ``CELERY_BROKER_URL``: String połączenia z RabbitMQ
- ``CELERY_RESULT_BACKEND``: Backend przechowywania wyników
Polecenia deweloperskie
----------------------
Uruchamianie usług
~~~~~~~~~~~~~~~~~~
.. code-block:: bash
# Uruchom wszystkie usługi Celery
make celery-all
# Uruchom tylko worker
make celery-worker
# Uruchom tylko scheduler beat
make celery-beat
Monitorowanie i zarządzanie
~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: bash
# Sprawdź status workerów
make celery-status
# Wyczyść wszystkie kolejki (używaj ostrożnie)
make celery-purge
Workflow deweloperski
~~~~~~~~~~~~~~~~~~~~~
1. **Uruchomienie pełnego stosu** (zawiera usługi Celery):
.. code-block:: bash
make start
2. **Uruchomienie usług Celery osobno**:
.. code-block:: bash
make celery-all
3. **Monitorowanie zadań** przez interfejs zarządzania RabbitMQ: http://localhost:15672
Tworzenie zadań
---------------
Zadania testowe
~~~~~~~~~~~~~~~
Infrastruktura zawiera dwa zadanie testowe do weryfikacji:
.. code-block:: python
from config.celery import test_task
# Wykonaj zadania testowe
test_task.delay("Witaj z Celery!")
Tworzenie nowych zadań
~~~~~~~~~~~~~~~~~~~~~~
Zadania powinny być tworzone w poszczególnych aplikacjach Django używając dekoratora ``@shared_task``:
.. code-block:: python
# Przykład: poradnia/events/tasks.py
from celery import shared_task
from django.core.mail import send_mail
@shared_task
def send_event_reminder(event_id):
# Implementacja zadania
pass
Integracja z bazą danych
------------------------
Aplikacje Django
~~~~~~~~~~~~~~~~~
Następujące aplikacje są dodane do ``INSTALLED_APPS``:
- ``django_celery_beat`` - Planowanie zadań okresowych
- ``django_celery_results`` - Przechowywanie wyników zadań
Migracje
~~~~~~~~
Uruchom migracje aby utworzyć tabele Celery w bazie danych:
.. code-block:: bash
docker compose run web python manage.py migrate
Panel administracyjny Django
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Zadania okresowe można konfigurować przez panel administracyjny Django
- Wyniki zadań są widoczne w interfejsie admina
- Zarządzanie harmonogramem Beat przez interfejs webowy
- **Automatyczna synchronizacja**: Wpisy z ``CELERY_BEAT_SCHEDULE`` automatycznie tworzą rekordy w modelu ``PeriodicTask``
Planowanie zadań okresowych
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Istnieją dwa sposoby konfiguracji zadań okresowych:
1. **CELERY_BEAT_SCHEDULE w ustawieniach** (preferowane dla produkcji):
.. code-block:: python
CELERY_BEAT_SCHEDULE = {
'nazwa-zadania': {
'task': 'ścieżka.do.zadania',
'schedule': 30.0, # co 30 sekund
'args': ('arg1', 'arg2'),
'kwargs': {'kwarg1': 'value1'},
},
'zadanie-cron': {
'task': 'ścieżka.do.zadania',
'schedule': crontab(hour=12, minute=0), # codziennie o 12:00
},
}
**Automatyczne tworzenie w bazie danych**: Każdy wpis w ``CELERY_BEAT_SCHEDULE`` automatycznie tworzy odpowiedni rekord ``PeriodicTask`` w bazie danych przy pierwszym uruchomieniu beat scheduler.
2. **Panel administracyjny Django** (dla zmian ad-hoc, tymczasowych, konserwacyjnych):
- Przejdź do ``/admin/django_celery_beat/``
- Widzisz wszystkie zadania (z kodu + ręcznie dodane)
- Możesz modyfikować harmonogramy zadań z ``CELERY_BEAT_SCHEDULE``
- Dodaj tymczasowe zadania okresowe przez interfejs web
- Użyj dla jednorazowych zadań konserwacyjnych lub testów
**Uwaga**: Zmiany zadań z ``CELERY_BEAT_SCHEDULE`` w adminie mogą być nadpisane przy restarcie beat scheduler.
Testowanie
----------
Testowanie deweloperskie
~~~~~~~~~~~~~~~~~~~~~~~~
- Zadania wykonywane natychmiastowo (synchronicznie) gdy ``TESTING=True``
- Używa backendu pamięciowego dla brokera i wyników
- Brak zewnętrznych zależności podczas testów
Testowanie infrastruktury
~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: bash
# Zweryfikuj konfigurację Django
docker compose run web python manage.py check
# Testuj import aplikacji Celery
docker compose run web python -c "from config.celery import app; print('OK')"
# Testuj wykonanie zadania
docker compose run web python -c "from config.celery import test_task; print(test_task.delay('test'))"
Monitorowanie
-------------
Interfejs zarządzania RabbitMQ
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Dostęp: http://localhost:15672
- Użytkownik: ``poradnia``
- Hasło: ``password``
- Wyświetlanie kolejek, połączeń i wskaźników wiadomości
Panel administracyjny Django
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Wyniki zadań: ``/admin/django_celery_results/``
- Zadania okresowe: ``/admin/django_celery_beat/``
Logi
~~~~
.. code-block:: bash
# Logi workerów
docker compose logs celery-worker
# Logi beat
docker compose logs celery-beat
# Logi RabbitMQ
docker compose logs rabbitmq
Rozwiązywanie problemów
-----------------------
Częste problemy
~~~~~~~~~~~~~~~
**Worker nie łączy się z brokerem:**
.. code-block:: bash
# Sprawdź czy RabbitMQ działa
docker compose ps rabbitmq
# Sprawdź logi workera
docker compose logs celery-worker
**Zadania się nie wykonują:**
.. code-block:: bash
# Sprawdź status workera
make celery-status
# Sprawdź kolejki RabbitMQ
# Odwiedź http://localhost:15672
**Scheduler beat nie działa:**
.. code-block:: bash
# Sprawdź logi beat
docker compose logs celery-beat
# Zweryfikuj istnienie tabel scheduler w bazie danych
docker compose run web python manage.py dbshell
Kontrole zdrowia
~~~~~~~~~~~~~~~~
.. code-block:: bash
# Testuj połączenie z brokerem
docker compose exec celery-worker celery -A config inspect ping
# Wylistuj aktywne zadania
docker compose exec celery-worker celery -A config inspect active
# Sprawdź zarejestrowane zadania
docker compose exec celery-worker celery -A config inspect registered
Synchronizacja między kodem a bazą danych
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Celery automatycznie synchronizuje wpisy z ``CELERY_BEAT_SCHEDULE`` do modelu ``PeriodicTask``:
- **Przy starcie beat scheduler**: Tworzy rekordy ``PeriodicTask`` dla wszystkich zadań z ``CELERY_BEAT_SCHEDULE``
- **Widoczność w adminie**: Wszystkie zadania (z kodu + ręcznie dodane) widoczne w ``/admin/django_celery_beat/``
- **Modyfikacje w adminie**: Można zmieniać harmonogramy bez edycji kodu
- **Restart scheduler**: Przywraca ustawienia z ``CELERY_BEAT_SCHEDULE`` (nadpisuje zmiany z admina)
Zarządzanie zadaniami w różnych środowiskach
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Development:**
- Przykładowe zadania testowe są włączone w ``CELERY_BEAT_SCHEDULE``
- Automatycznie widoczne w Django admin po uruchomieniu beat
- Zadania wykonywane co 30 sekund i co minutę do testowania infrastruktury
**Production:**
- Zadania produkcyjne zdefiniowane w ``CELERY_BEAT_SCHEDULE``
- Automatycznie synchronizowane do bazy danych
- Widoczne i modyfikowalne przez Django admin
**Dodawanie nowych zadań okresowych:**
1. **Przez kod** (preferowane dla zadań stałych):
- Dodaj do ``CELERY_BEAT_SCHEDULE`` w ``common.py`` lub ``production.py``
- Wersjonowane w kodzie, konsystentne między wdrożeniami
- Automatycznie pojawią się w Django admin po restarcie beat
2. **Przez admin** (dla zadań tymczasowych):
- Przejdź do ``/admin/django_celery_beat/periodictask/``
- Kliknij "Add periodic task"
- Użyj dla zadań konserwacyjnych, testów, jednorazowych operacji
- Zmiany obowiązują natychmiastowo bez restartu
Migracja z cron
---------------
Ta konfiguracja infrastruktury przygotowuje do migracji istniejących zadań cron:
1. **Aktualne zadania cron** (do migracji w Fazie 2):
- ``send_event_reminders`` - Codziennie o 12:00
- ``send_old_cases_reminder`` - Miesięcznie 2. dnia o 06:00
- ``run_court_session_parser`` - Codziennie o 23:10
- ``clearsessions`` - Codziennie
2. **Podejście do migracji**:
- Konwersja poleceń zarządzania na zadania Celery
- Konfiguracja harmonogramów okresowych w panelu administracyjnym Django
- Równoległe uruchamianie obu systemów podczas przejścia
- Usunięcie systemu cron po weryfikacji
Bezpieczeństwo
--------------
Development
~~~~~~~~~~~
- Domyślne dane logowania są zakodowane na stałe dla wygody deweloperskiej
- Interfejs zarządzania RabbitMQ udostępniony tylko na localhost
Produkcja
~~~~~~~~~
- Użyj zmiennych środowiskowych dla wszystkich danych logowania
- Ogranicz dostęp do RabbitMQ do sieci aplikacji
- Rozważ szyfrowanie TLS dla połączeń z brokerem
- Wdróż właściwą autentykację dla interfejsów monitorowania
Następne kroki
--------------
Ta infrastruktura Fazy 1 umożliwia:
1. **Faza 2: Migracja zadań** (Issues #1829-1833)
- Konwersja istniejących poleceń zarządzania na zadania Celery
- Konfiguracja harmonogramów okresowych
- Testowanie równoległego wykonywania z systemem cron
2. **Faza 3: Czyszczenie starego kodu** (Issue #1834)
- Usunięcie systemu opartego na cron
- Czyszczenie starych skryptów
- Finalizacja wdrożenia produkcyjnego
Zobacz także
------------
- `Dokumentacja Celery `_
- `django-celery-beat `_
- `django-celery-results `_
- `Zarządzanie RabbitMQ `_