{% extends "base.html" %} {% block title %}Краулеры{% endblock %} {% block content %}

🤖 Краулеры

Очередь (pending)

{{ pending }}

В обработке (processing)

{{ processing }}

Обработано сегодня

{{ done_today }}

Источники

{{ alive }}/{{ total_sources}} {% if dead %} {{ dead }} dead{% endif %}

{% if request.query_params.get('run') == 'started' %}
Воркер запущен ({{ request.query_params.get('workers') }} потоков, лимит {{ request.query_params.get('limit') }}). Следите за processing → done.
{% elif request.query_params.get('run') == 'error' %}
Ошибка запуска: {{ request.query_params.get('msg') }}
{% elif request.query_params.get('reset') %}
Сброшено {{ request.query_params.get('reset') }} source(s) в alive.
{% endif %}
Источники
{% for s in sources %} {% endfor %}
ИсточникТипСтатусПоследний сборОшибкиПриоритет
{{ s.name }}
{{ s.slug }}
{{ s.crawler }} {% if s.status == 'dead' %}dead {% elif s.enabled %}alive {% else %}off{% endif %} {{ s.last_fetch | dt if s.last_fetch else '—' }} {% if s.error_count %}{{ s.error_count }}{% else %}—{% endif %} {% if s.last_error %}
{{ s.last_error }}{% endif %}
{{ s.priority }}
Последние запуски
{% for r in runs %} {% endfor %}
ВремяИсточникСтатусПостовДлительность
{{ r.started_at | dt }}{{ r.source_name or r.source_id }} {{ r.status }}{{ r.posts_new }}/{{ r.posts_fetched }} {% if r.duration_ms %}{{ "%.1f"|format(r.duration_ms/1000) }}s{% else %}—{% endif %}
{% endblock %}