Кэш, почта, поиск и 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, ссылок, заголовков).

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 под проектом.

- Проект: все, проект вместе с его 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 и под защитой секрета сервера.