No description
  • Go 97.5%
  • Dockerfile 2.2%
  • Shell 0.3%
Find a file
2026-03-17 05:31:53 +03:00
.githooks Dev 2026-03-14 14:55:42 +00:00
.zed Dev 2026-03-15 09:04:46 +00:00
app feat: add observability tools 2026-03-16 22:20:19 +03:00
cmd Dev 2026-03-14 14:55:42 +00:00
contracts Contract 2026-03-16 12:14:40 +03:00
internal fix: crawler push 2026-03-17 05:29:40 +03:00
mock-ml feat: add explanation and ml fallback 2026-03-17 00:12:49 +03:00
.dockerignore Dev 2026-03-14 14:55:42 +00:00
.env.example Dev 2026-03-15 09:04:46 +00:00
.gitignore Feature/base 2026-03-14 11:19:33 +00:00
.gitlab-ci.yml Fix build 2026-03-15 11:12:06 +00:00
.golangci.yml Dev 2026-03-14 14:55:42 +00:00
Dockerfile Dev 2026-03-15 09:04:46 +00:00
go.mod feat: add observability tools 2026-03-16 22:20:19 +03:00
go.sum feat: add observability tools 2026-03-16 22:20:19 +03:00
policy.yml [skip ci] Initial commit 2026-03-13 18:58:03 +00:00
README.md feat: add observability tools 2026-03-16 22:20:19 +03:00
Taskfile.yml Dev 2026-03-14 14:55:42 +00:00

Crawler

Что это?

Это отдельный сервис для получения данных из Telegram каналов и веб-сайтов

Как это работает? (Telegram)

  1. В публичном канале появляется пост.
  2. Бот проверяет, находится ли канал в списке отслеживаемых каналов
  3. Если канал отслеживается, то бот отправляет пост в NATS

Генерация Telegram session через номер телефона

Для авторизации пользовательского аккаунта и сохранения session в sqlite:

go run ./cmd/tg-session --phone "+79991234567" --session-path "crawler-tg-user.session.db"

Что нужно перед запуском:

  • задать TELEGRAM_API_ID и TELEGRAM_API_HASH.env или в переменных окружения);
  • при необходимости передать --api-id и --api-hash флагами.

Во время запуска утилита запросит OTP-код (и 2FA-пароль, если включен), затем сохранит session в указанный sqlite-файл.

Если нужен string session, добавьте флаг:

--print-string-session

Локальный dev-стек для экспорта сообщений (MinIO + NATS)

Поднять MinIO, init-контейнер для создания приватного bucket и NATS:

docker compose -f dev-compose.yml up -d

Что делает init-контейнер:

  • ждёт готовности MinIO;
  • создаёт bucket messages (если его нет);
  • выставляет bucket как private.

Нужные переменные окружения для экспортера:

  • MINIO_ENDPOINT (по умолчанию localhost:9000)
  • MINIO_ACCESS_KEY (по умолчанию minioadmin)
  • MINIO_SECRET_KEY (по умолчанию minioadmin)
  • MINIO_BUCKET (по умолчанию messages)
  • MINIO_USE_SSL (по умолчанию false)
  • NATS_URL (по умолчанию nats://localhost:4222)
  • NATS_SUBJECT (по умолчанию raw.mentions)
  • SOURCES_PROVIDER_URL (по умолчанию http://localhost:8080/sources)
  • SOURCES_PROVIDER_TIMEOUT (по умолчанию 15s)
  • OBSERVABILITY_ADDR (по умолчанию :8091)
  • OBSERVABILITY_PROBE_TIMEOUT (по умолчанию 3s)

Healthcheck и Prometheus metrics

Crawler поднимает отдельный HTTP endpoint для наблюдаемости:

  • GET /health и GET /health/live — liveness (процесс запущен).
  • GET /health/ready — readiness (пингует зависимости Backend и ML).
  • GET /metrics — Prometheus-метрики.

Порт задаётся через OBSERVABILITY_ADDR (по умолчанию :8091).

Ключевые метрики:

  • crawler_posts_total{source_type,status} — количество обработанных постов (received/exported/skipped/failed).
  • crawler_errors_total{component,kind} — счётчик ошибок по компонентам.
  • crawler_dependency_up{dependency} — статус зависимостей (1 — up, 0 — down).

Формат ответа источника:

{"telegram": [], "web": [], "web-rss": []}

QA tooling

Основные команды в Taskfile.yml:

  • task format — форматирование Go-кода;
  • task lint — проверка golangci-lint;
  • task test — запуск тестов.
  • go test -tags e2e ./... — запуск e2e-тестов (включая проверки реальных web/rss источников).

Установить pre-commit hook:

task pre-commit:install

Запустить локально тот же пайплайн, что и hook:

task pre-commit:run

Как это работает? (Web)

  1. Раз в определенный интервал бот посещяет веб-сайт
  2. Бот парсит страницу на предмет изменений в контенте
  3. Если таковые обнаружены, то бот парсит их и отправляет в NATS

TODO

  1. cd