Laravel Sail: полный гайд по локальному стеку
Laravel Sail — это обёртка над Docker Compose для типичного приложения Laravel: PHP-FPM (сервис laravel.test), СУБД, Redis, Meilisearch, Selenium и опции по желанию. Цель — локальная разработка (и CI с Compose), а не готовая продакшен-платформа. Ниже — типовые доработки и граница, где Sail заканчивается и начинается настоящий деплой.
Серия: Базы данных и Docker-сервисы · Очереди и воркеры · Окружения и деплой · Диагностика · Все инструменты
Содержание
- Что такое Sail (и чем не является)
- Требования и модель
- Алиас и ежедневные команды
- Сменить версию PHP
- Сервисы по умолчанию и
sail:install - Добавить Redis, если его нет
- RabbitMQ и очереди
- С MySQL на PostgreSQL
- MongoDB (контейнер + Laravel)
- Очереди: драйверы, воркеры, Sail
- Почта и Mailpit
- Тома и производительность (WSL2 / macOS)
- Xdebug
- Кастомизация
docker-compose.yml - Файлы окружения
- Локально vs dev/staging/production
- Чеклист неполадок
Что такое Sail (и чем не является)
- Это: опубликованный
docker-compose.yml+ Dockerfile’ы изvendor/laravel/sail/runtimes/…и скрипт./vendor/bin/sail. В репозиторий попадает послеphp artisan sail:install(или при создании проекта с Sail). - Не это: хостинг. На сервере часто тоже Docker/K8s, но скрипт Sail в production обычно не крутят — там образы, оркестрация, health check’и, секреты и supervisor для очередей.
Sail — воспроизводимая dev-среда, частично похожая на прод (те же расширения PHP, тот же движок БД), но не копия сети и масштаба.
Требования и модель
- Установлены Docker и Compose v2.
- WSL2: проект лучше держать в файловой системе Linux (
~/projects/...), не наC:\— иначе bind mount тормозит. - Команды выполняются внутри контейнеров:
./vendor/bin/sail artisan …,sail composer ….
Алиас и ежедневные команды
alias sail='[ -f sail ] && sh sail || sh vendor/bin/sail'
Дальше: sail up -d, sail artisan migrate, sail npm run dev, sail shell, sail down.
Сменить версию PHP
- При необходимости опубликуйте файлы Sail:
sail artisan sail:publish. - В
docker-compose.ymlу сервисаlaravel.testвbuild.argsзадайтеPHP_VERSION(например8.4) — смотрите, какие версии поддерживает ваш релиз Sail. - Пересоберите:
sail build --no-cache, затемsail up -d. - Проверка:
sail php -v.
Если свой Dockerfile, поменяйте FROM на актуальный образ laravel/sail-php/... из репозитория Sail.
Сервисы по умолчанию и sail:install
Пример:
php artisan sail:install --with=mysql,redis,meilisearch,mailpit,selenium
Если Redis не ставили, а в .env всё ещё REDIS_HOST=redis, либо добавьте сервис (следующий раздел), либо укажите хост Redis на машине (для паритета лучше контейнер).
Добавить Redis, если его нет
- В
docker-compose.ymlдобавьте сервисredis(образredis:alpine, порт, томsail-redis, сетьsail, при желанииhealthcheck). - Пропишите том в секции
volumes:. - У
laravel.testпри необходимости добавьтеdepends_on: redis. - В
.env:REDIS_HOST=redis,REDIS_PORT=6379и т.д. sail up -d, проверка:sail exec redis redis-cli ping.
RabbitMQ и очереди
В ядре Laravel нет драйвера «rabbitmq из коробки» — нужен пакет с AMQP и контейнер RabbitMQ.
- Сервис в compose, например
rabbitmq:3-management-alpine, порты 5672 и 15672 (UI), переменныеRABBITMQ_DEFAULT_USER/PASS, том данных. - В
.envхостrabbitmq, учётные данные,QUEUE_CONNECTION=rabbitmq(или как требует пакет). - Установите пакет, опубликуйте конфиг,
sail artisan config:clear. - Воркер:
sail artisan queue:work rabbitmq.
Через 15672 удобно смотреть очереди и dead letter в разработке.
С MySQL на PostgreSQL
- Замените сервис БД в
docker-compose.ymlна шаблон pgsql из документации Sail / свежегоsail:install --with=pgsql. depends_onуlaravel.test— наpgsql..env:DB_CONNECTION=pgsql,DB_HOST=pgsql, порт 5432, логин/пароль как в compose.sail down -v(удалит данные) или миграция данных вручную; затемsail up -d,sail artisan migrate:freshдля чистой dev-БД.- Расширение
pdo_pgsqlуже в образах Sail с PostgreSQL; в кастомных Dockerfile проверьте вручную.
MongoDB (контейнер + Laravel)
- Добавьте сервис mongo в compose, том, при необходимости проброс порта для Compass.
- Обычно используют
mongodb/laravel-mongodb(или актуальный аналог) — следуйте их инструкции: часто нуженpecl install mongodbв Dockerfile Sail и пересборка. - В
.envстрока подключения или переменные пакета; хост из контейнера приложения — имя сервиса (mongo). - Учитывайте отличия от SQL: миграции, транзакции, тесты — по документации пакета.
Очереди: драйверы, воркеры, Sail
sync— всё синхронно, для отладки сценариев «без фона».database/redis:sail artisan queue:work, для нескольких очередей:--queue=high,default.- Horizon:
sail artisan horizonлокально; на проде — supervisor или облачный воркер. - После правок кода воркеры держат старый код —
queue:restartили ограничение--max-jobs. - RabbitMQ: другая семантика повторов и DLX — тестируйте явно.
Почта и Mailpit
Настройте MAIL_HOST / MAIL_PORT на сервис mailpit (или аналог из compose). Веб-интерфейс на проброшенном порту — просмотр писем без реальной отправки.
Тома и производительность (WSL2 / macOS)
Bind mount всего репозитория на macOS и с диска Windows в WSL2 часто медленный; держите код в Linux FS. Именованные тома для MySQL/Redis сохраняют данные при sail down; sail down -v их сотрёт.
Xdebug
Включение через переменные окружения Sail (см. README вашей версии), например SAIL_XDEBUG_MODE=debug,develop. В IDE — маппинг путей контейнера ↔ хоста. Для очередей подключайтесь к контейнеру, где крутится queue:work.
Кастомизация docker-compose.yml
Стабильные имена сервисов = хосты в .env. Секреты — через ${VAR} из .env. Дополнительные сервисы (Adminer и т.д.) — в той же сети sail. После правок: sail build && sail up -d.
Файлы окружения
.env— локально, не в git;.env.example— шаблон без секретов.- Отдельный
env_fileв compose для docker-специфичных значений — по желанию команды. - CI: переменные в pipeline; тесты с
APP_ENV=testingи.env.testing. - Порты:
FORWARD_DB_PORT,FORWARD_REDIS_PORTи т.д., чтобы несколько проектов не конфликтовали.
Локально vs dev/staging/production
| Тема | Sail (локально) | Типичный сервер |
|------|-----------------|-----------------|
| Процессы | sail up, ручной artisan | php-fpm + nginx / Octane |
| Очереди | Терминал / Horizon локально | Supervisor, systemd, cloud worker |
| TLS | HTTP на localhost | Реальные сертификаты |
| Секреты | Файл .env | Vault, облачные параметры |
| Масштаб | Один контейнер на сервис | Реплики, LB, managed DB/Redis |
«Заработало в Sail» ≠ прод настроен: отдельно проверяйте воркеры, cron scheduler, OPcache, S3 и т.д.
Чеклист неполадок
- Права на
storage/,bootstrap/cache/—sail root-shell,chownпользователюsail. - Connection refused к БД/Redis: с контейнера приложения хост — имя сервиса, не
127.0.0.1. - После Dockerfile:
sail build --no-cache. - Занят порт — поменять
FORWARD_*в.env. - Зависимости ставить
sail composer install, чтобы совпала платформа с контейнером.
Итог
Sail выгоден, когда у команды один compose-файл и понятный .env.example. Продакшен (мониторинг, бэкапы, супервизор очередей, секреты) проектируйте отдельно и переносите в Sail только то, что нужно для реалистичной локальной работы.