Сервисы

Кэш, почта, поиск и broadcasting

Redis и Valkey для кэша и очередей, Mailpit для перехвата писем, Typesense и Meilisearch для поиска, Reverb для broadcasting.

Redis и Valkey

Кэш, сессии и очереди в памяти, сохраняемые на диск между перезапусками. Valkey — форк Redis с открытым исходным кодом, совместимый с его клиентами и протоколом.

redis://127.0.0.1:6379

Открыть в TablePlus работает и для них. При подключении к проекту Laravel Joppa записывает REDIS_HOST, REDIS_PORT, REDIS_PASSWORD и переключает на redis переменные CACHE_STORE, SESSION_DRIVER и QUEUE_CONNECTION, если проект их объявляет.

Mailpit

Mailpit перехватывает все письма, которые ваши проекты отправляют при разработке, и показывает их в веб-интерфейсе. На самом деле ничего не уходит.

Адрес
SMTP smtp://127.0.0.1:1025
Веб-интерфейс http://127.0.0.1:8025

Открыть ящик открывает веб-интерфейс. При подключении к проекту Joppa записывает настройки SMTP под именами фреймворка (MAIL_* для Laravel, MAILER_DSN для Symfony…). См. Переменные окружения.

Почтовый ящик в Joppa

Страница сервера Mailpit показывает его Входящие прямо в Joppa, без браузера. Новые письма появляются сами, каждые несколько секунд.

  • Список: отправитель, тема, начало текста и время; зелёная точка отмечает непрочитанные, скрепка — вложения.
  • Поиск: синтаксис Mailpit (from:, to:, subject:, is:unread…) или просто несколько слов.
  • Открытое письмо отмечается прочитанным. Вкладка HTML показывает его так, как его отображает Mailpit, Текст — его текстовую версию, Исходник открывает исходное сообщение. Вложения открываются одним щелчком.
  • Отметить непрочитанным, Удалить, Прочитать все и Очистить входящие (для всех проектов, после подтверждения).
  • Над HTML-отображением панель показывает письмо в размере Компьютер (на всю ширину), Планшет (768 × 1024), Телефон (375 × 667) или Свой (ширина × высота в пикселях, от 200 до 4000). Выбранный размер сохраняется от письма к письму.
  • Кнопка справа на панели разворачивает ящик на всё окно, поверх боковой панели; та же кнопка или Esc возвращает его на страницу.
  • Открыть в Mailpit открывает письмо в интерфейсе Mailpit, где есть расширенные инструменты (проверка HTML, ссылок, заголовков).

Входящие Mailpit в Joppa: список писем и открытое приветственное письмо

Typesense

Мгновенный поиск, устойчивый к опечаткам, совместимый с Laravel Scout.

http://127.0.0.1:8108   API-ключ: joppa-3f9c…

Ключ генерируется случайно при создании сервера: веб-страница, открытая в вашем браузере, не сможет его угадать, чтобы прочитать или очистить ваши индексы.

Копировать API-ключ помещает его в буфер обмена.

Meilisearch

Поисковый движок с открытым исходным кодом, с предпросмотром поиска в браузере (Открыть предпросмотр).

http://127.0.0.1:7700   мастер-ключ: joppa-8b21…

Как и у Typesense, мастер-ключ у каждого сервера свой.

Reverb

Laravel Reverb, WebSocket-сервер для broadcasting в Laravel, как общий сервис: один сервер для всех ваших проектов, без запуска php artisan reverb:start в каждом. Он работает по протоколу Pusher, поэтому Laravel Echo и pusher-js подключаются к нему и из проекта на Node, Rails или чём-то другом.

Значение
WebSocket ws://127.0.0.1:6001
App ID своё для каждого проекта, названо по проекту (myproject)
Ключ и секрет свои у каждого приложения, выводятся из ключа и секрета сервера (joppa-…, сгенерированных случайно при его создании)
Журнал событий 127.0.0.1:6002, только для Joppa

У Reverb нет официального образа Docker: это пакет Laravel. При первом запуске Joppa собирает образ localhost/joppa-reverb из официального образа PHP, пустого приложения Laravel и laravel/reverb. Это занимает несколько минут, один раз; потом сервер запускается за секунду. У каждой версии (1.12, 1.11, 1.10) свой образ, с последним исправлением серии на момент сборки: чтобы перейти на другую версию, выберите её в Версия и порт… на странице сервиса.

При подключении к проекту Laravel Joppa записывает BROADCAST_CONNECTION=reverb, переменные REVERB_APP_ID, REVERB_APP_KEY, REVERB_APP_SECRET, REVERB_HOST, REVERB_PORT, REVERB_SCHEME, которые читает Laravel, и VITE_REVERB_*, которые читает Echo в браузере. Другие фреймворки получают PUSHER_*. После подключения выполните npm run build (или перезапустите Vite), чтобы Echo подхватил новый ключ.

Отдельное приложение для каждого проекта

У каждого проекта, подключённого к Reverb, своё приложение: REVERB_APP_ID носит имя проекта (то же, что получила бы его база данных: my-app → my_app), с собственными ключом и секретом. Его каналы принадлежат только ему: канал orders одного проекта — не тот же, что у другого, а журнал событий знает, из какого проекта пришла каждая строка. Сервер распознаёт любое приложение, которое Joppa записывает в .env, без перезапуска.

Worktree тоже получает своё приложение, названное по приложению проекта (myproject_feature_login): его страницы не слышат события проекта, и наоборот.

Проекты, подключённые раньше, используют общее приложение joppa с ключом и секретом сервера. Они продолжают работать; на странице Reverb в списке Проекты они отмечены как «общее приложение». Выделить отдельное приложение показывает, что изменится в .env (приложение, ключ и секрет), и записывает это. Затем перезапустите Vite или npm run build, а также php artisan config:clear, если конфигурация закэширована.

Журнал событий

Страница Reverb показывает в реальном времени то, что видит сервер: подключения и отключения, подписки (и те, в которых он отказал), клиентские события (client-…, whispers в Echo) и broadcast-сообщения бэкенда, включая те, которые никто не получил. В каждой строке указан её проект или её worktree под проектом.

Журнал событий Reverb: broadcast-сообщения, подписки и подключения двух проектов и одного worktree, открыто сообщение, которое никто не получил

  • Проект: все, проект вместе с его worktree, проект без них или один worktree.
  • Тип: сообщения (broadcast-сообщения и клиентские события), подписки, подключения или Проблемы: отклонённые подписки, ошибки и сообщения, которые никто не получил.
  • Поиск идёт по каналу, имени события и данным.

Открытая строка показывает свой канал, событие, данные в JSON и число подключений, которые её получили. Broadcast, который никого не достиг, так и сообщает об этом: проверьте имя канала с обеих сторон и то, что страница подписалась (строка «подписка»). Отклонённая подписка на приватный канал или канал присутствия обычно связана с /broadcasting/auth: неверная подпись или отсутствие ответа. toOthers() отображается как исключённое подключение. Только этот канал фильтрует по каналу строки.

Когда ни одна строка не открыта, на правой панели перечислены Каналы сейчас и их подписчики.

Отправить событие делает broadcast через приложение проекта, как это сделал бы его бэкенд: выберите проект, канал так, как его называет Echo (orders.42, private-orders.42, presence-room.1), имя события и его данные в JSON. Удобно, чтобы проверить страницу, не запуская код, который делает broadcast. Отправить снова на broadcast-сообщении открывает эту форму заново с его значениями.

Reverb хранит в памяти последние 1 000 событий, данные обрезаются до 16 КБ, до своего перезапуска: на диск ничего не записывается. Пауза замораживает список, Очистить стирает его. Журнал слушает второй порт (по умолчанию 6002, меняется в Версия и порт…), на 127.0.0.1 и под защитой секрета сервера.

getjoppa.com › support

Загрузка

Не отправляется? Напишите на [email protected]. Просто вопрос: [email protected].