Универсальная Docker‑среда для разработки сразу нескольких PHP/Laravel проектов с единым MySQL и удобными шорткатами для artisan
, vite
, composer
, npm
. Работает на Linux/macOS/WSL.
— services: workspace83
, workspace74
(PHP + Node + Composer + Xdebug) и mysql
— монтируется корневая папка с вашими проектами (по умолчанию ../
)
— автоподбор свободных портов для artisan serve
и Vite
- Docker и Docker Compose
- Папка с проектами, расположенная рядом с devbox (по умолчанию монтируется
../
)
-
Поднимите окружение из папки devbox:
docker compose up -d --build
-
Зайдите в любой проект (из смонтированной папки
../
, в контейнере он будет как/var/www/<project>
):workon my-project
Внутри контейнера выполните типовую инициализацию Laravel:
composer install
cp .env.example .env
php artisan key:generate
- (опционально) настройте
.env
проекта на MySQL из devbox:DB_HOST=mysql
,DB_PORT=3306
,DB_USERNAME=laravel
,DB_PASSWORD=secret
,DB_DATABASE=<имя_бд>
-
Запустите Laravel и Vite одной командой:
dev my-project
Или по отдельности:
serve my-project 8001
vite my-project 5175
Ссылки будут в выводе: http://localhost:<порт>
.
- workspace83: PHP
${PHP83_TAG:-8.3-cli}
, Node${NODE_MAJOR:-22}
, Composer, Xdebug; рабочая директория/var/www
- workspace74: PHP
${PHP74_TAG:-7.4-cli}
, Node${NODE_MAJOR:-22}
, Composer, Xdebug; рабочая директория/var/www
- mysql: образ
mysql:8.4
, проброшен порт${MYSQL_PORT:-3306}
- volumes:
mysql_data
,composer_cache
,node_cache
- порты публикуются диапазонами, отдельно для каждого workspace:
- PHP 8.3:
${APP_PORT_RANGE_83}
(Laravel/php -S),${VITE_PORT_RANGE_83}
(Vite) - PHP 7.4:
${APP_PORT_RANGE_74}
(Laravel/php -S),${VITE_PORT_RANGE_74}
(Vite)
- PHP 8.3:
Файлы:
docker-compose.yml
— описание сервисовworkspace/Dockerfile
— PHP/Node/Composer/Xdebugworkspace/xdebug.ini
— конфиг Xdebug.env.example
— пример настроек devboxbin/*
— утилиты для повседневной работы
HOST_PROJECTS_DIR
— что монтировать в/var/www
(по умолчанию../
)DEFAULT_PHP
— какой workspace использовать по умолчанию (83
или74
); разово можноDEVBOX_PHP=74 <cmd>
PHP83_TAG
/PHP74_TAG
— теги базовых php‑образов для workspace (опционально)NODE_MAJOR
— мажорная версия Node (например,18
,20
,22
)MYSQL_PORT
— внешний порт MySQLAPP_PORT_RANGE_83
/VITE_PORT_RANGE_83
— диапазоны портов для PHP 8.3APP_PORT_RANGE_74
/VITE_PORT_RANGE_74
— диапазоны портов для PHP 7.4APP_PORT_83
/VITE_PORT_83
/APP_PORT_74
/VITE_PORT_74
— фиксированные порты внутри соответствующих диапазонов (опционально)XDEBUG_MODE
— режим Xdebug (debug
,off
, …)
Все значения имеют дефолты; можно не создавать .env
, но рекомендуется скопировать .env.example
и при необходимости подредактировать.
- Хост/порт для проектов:
DB_HOST=mysql
,DB_PORT=3306
- Пользователь/пароль по умолчанию:
laravel
/secret
(меняется через.env
devbox) - Рут‑доступ для утилит:
root
/$DB_ROOT_PASSWORD
(по умолчаниюroot
)
Создать БД для проекта:
db-ensure my-project [имя_бд] [db_user] [db_password]
Если имя БД не передано, используется безопасное имя на основе имени папки проекта. По умолчанию логин/пароль берутся из devbox/.env (DB_USERNAME
/DB_PASSWORD
) или laravel
/secret
. Можно явно указать пользователя и пароль третьим и четвертым аргументами. Команда создаст БД, пользователя (если нет) и выдаст права.
Примеры:
db-ensure my-app
— БДmy_app
, пользователь из.env
илиlaravel/secret
db-ensure my-app shop_db
— БДshop_db
, пользователь по умолчаниюdb-ensure my-app shop_db shop_user s3cr3t
— БДshop_db
, пользовательshop_user
с паролемs3cr3t
Открыть консоль MySQL:
dbsh
Можно управлять логином/паролем и базой через переменные DB_USERNAME
, DB_PASSWORD
, DB_DATABASE
в devbox/.env.
workon <project> [83|74]
: интерактивная оболочка в/var/www/<project>
выбранного workspace; второй параметр разово выбираетworkspace83
илиworkspace74
dev <project> [83|74]
: запустить сразуartisan serve
иvite
на свободных портахserve <project> [83|74] [port]
: только Laravel (php artisan serve --host=0.0.0.0 --port=<port>
)vite <project> [83|74] [port]
: только Vite (npm run dev -- --host --strictPort --port <port>
)stop <project> [83|74]
: остановить процессыserve
иvite
проекта, очистить логиps <project> [83|74]
: показать процессыserve
/vite
внутри выбранного workspacelogs <project> [83|74] [all|serve|vite]
: вывести хвосты логов проектаcomposer <project> [83|74] …
: выполнитьcomposer …
в папке проектаnpm <project> [83|74] …
: выполнитьnpm …
в папке проектаuse-php <83|74>
: выбрать workspace по умолчанию для скриптов (разово можноDEVBOX_PHP=74 <cmd> …
)use-node <18|20|22>
: сменить мажорную версию Node для текущего выбранного workspace
Под капотом все команды используют docker compose exec
с рабочей директорией проекта и UID/GID текущего пользователя, чтобы не ломать права на файлах.
- Конфиг в
workspace/xdebug.ini
; по умолчанию включёнxdebug.mode=${XDEBUG_MODE:-debug}
- Клиент:
host.docker.internal:9003
(добавленextra_hosts
для Linux) - Для IDE (PhpStorm/VSC): настройте путь‑маппинг проекта на
/var/www/<project>
;PHP_IDE_CONFIG=serverName=php-devbox
Чтобы временно отключить Xdebug: установите XDEBUG_MODE=off
в devbox/.env и перезапустите workspace (docker compose up -d workspace83
или workspace74
).
— Новый проект Laravel в папке ../my-api
:
docker compose up -d --build
workon my-api
composer create-project laravel/laravel .
db-ensure my-api my_api
- Настройте
.env
проекта:DB_HOST=mysql
,DB_PORT=3306
,DB_DATABASE=my_api
,DB_USERNAME=laravel
,DB_PASSWORD=secret
dev my-api
— Существующий проект:
docker compose up -d --build
workon existing-app
composer install && php artisan key:generate
db-ensure existing-app
(или укажите своё имя БД)dev existing-app
- Построить/обновить workspace:
docker compose build workspace83
(илиworkspace74
) - Перезапустить сервисы:
docker compose up -d
- Остановить всё:
docker compose down
(данные БД сохранятся вmysql_data
)
- Порты: если в диапазоне не осталось свободных, команды сообщат об ошибке — расширьте соответствующие
APP_PORT_RANGE_83/74
иVITE_PORT_RANGE_83/74
в devbox/.env - Порты: Docker может «занимать» опубликованные порты через
docker-proxy
. Скрипты учитывают это и считают такие порты пригодными. Если реально порт занят сторонним процессом — измените соответствующий диапазонAPP_PORT_RANGE_83/74
илиVITE_PORT_RANGE_83/74
или освободите порт. - Порты: если
ss -p
/lsof
не показывают имена процессов без sudo и кажется, что порты заняты, но devbox уже поднят — скрипты всё равно выберут порт из опубликованного диапазона, т.к. его слушаетdocker-proxy
и он пригоден для проксирования в контейнер. - Права на файлы: контейнер запускается под вашим UID/GID (
user: "${UID:-1000}:${GID:-1000}"
), чтобы избежатьroot
‑файлов - Права npm‑кэша: если видите
npm ERR! EACCES
про/home/dev/.npm
, скриптыnpm
/vite
автоматически чинят права (chown
кэш‑тома). При крайней необходимости можно вручную:docker compose exec -u 0 workspace83 chown -R 1000:1000 /home/dev/.npm
(илиworkspace74
) - Несколько проектов: devbox поддерживает параллельный запуск, у каждого — свой порт из диапазона
- Бэкенд без Vite: используйте только
serve
, либо запускайте свой сервер самостоятельно вworkon
- «Сначала подними devbox…»: выполните в корне devbox
docker compose up -d --build
- Порты заняты: расширьте диапазоны или укажите порт вручную:
serve app 8010
,vite app 5178
- Нет доступа к БД: проверьте
.env
проекта (DB_HOST=mysql
, порт 3306) и чтоdb-ensure
создавал пользователя/права - Xdebug не подключается: проверьте, что IDE слушает 9003, а
host.docker.internal
доступен; на Linux это настроено черезextra_hosts
- Node/PHP версия: используйте
use-node
/use-php
, затем перезапустите соответствующий workspace - Laravel не открывается на
artisan serve
:- Проверьте путь проекта:
bin/workon <project>
должен открыть оболочку в/var/www/<project>
. - Убедитесь, что есть
artisan
в корне проекта и установлены зависимости:composer install
, затемphp artisan key:generate
. - Если команда
artisan serve
отсутствует в вашем проекте, devbox автоматически запускает fallbackphp -S 0.0.0.0:<port> -t public public/index.php
. - Логи:
bin/logs <project> serve
. Перезапуск:bin/stop <project> && bin/dev <project>
.
- Проверьте путь проекта:
- Проекты:
/var/www/<project>
(монтируется изHOST_PROJECTS_DIR
) - Кэш Composer:
/tmp/composer
- Кэш npm:
/home/dev/.npm
- Логи локальных процессов:
/tmp/serve-*.log
,/tmp/vite-*.log
- Логи локальных процессов: на хосте в
./logs
, в контейнере —/var/log/devbox
(serve-*.log
,vite-*.log
)
Приятной разработки! 🚀