Наконец-то у меня дошли руки разобраться с Docker и написать свою конфигурацию для работы с Vesp.
Теперь не нужно заморачиваться настройкой локального окружения через Valet, а можно просто запустить разработку в контейнере.
Вам будет доступна и база данных, и hot reload при разработке фронтенда, и даже Xdebug.
Для работы у вам уже должен быть установлен Docker на компьютере.
Скачиваем исходники из https://github.com/bezumkin/vesp.git, и переходим в директорию vesp/docker/
. Затем переименовываем .env.dist
в .env
и запускаем docker-compose up
.
Всё то же самое, только для любителей консоли:
git clone https://github.com/bezumkin/vesp.git
cd vesp/docker/
cp .env.dist .env
docker-compose up
В файле docker/.env
находятся настройки и для контейнеров, и для запущенного внутри них Vesp.
При первом запуске придётся подождать минут 5-10, пока всё скачается и соберётся, но это только в первый раз, затем всё быстро.
Пока контейнеры запущены, вы будете видеть лог сообщений из них. Прервать работу можно обычным Ctrl+c
,
После запуска вам доступны:
127.0.0.1:8080/
- Nginx сервер, который открывает собранные версии сайта и админки + отвечает на API запросы.127.0.0.1:4000/admin/
- это админка в режиме разработки127.0.0.1:4100/
- веб-сайт в режиме разработки127.0.0.1:3333
- внешний порт MySQL, база vesp
, юзер и пароль такие жеТеперь нужно зайти в контейнер с PHP и запустить наши миграции. Вход делается командой docker exec -it idконтейнера
, и чтобы не узнавать каждый раз этот id
, делаем вот так:
docker exec -it $(docker ps --filter name="vesp-php-fpm" -q) bash
Вы окажетесь в обычной консоли сервера, сразу в рабочей директории, где можно запускать composer:
composer install
composer db:migrate
composer db:seed
Если вдруг эта команда не сработает, то попробуйте зайти в консоль из десктопного приложения, там заходить в контейнеры можно прямо через интерфейс.
Статичные страницы для Nginx собираются в том случае, если при запуске контейнеров не было обнаружено директории frontend/dist
. Так что если хотите пересобрать статику, то просто удалите эту директорию и перезапустите контейнеры.
В контейнере с PHP встроен Xdebug, и вы можете легко использовать его для отладки в PhpStorm.
Первым делом создаём новый сервер с обязательным именем VespDocker, прописываем адрес и порт контейнера Nginx и задаём соответствие 2х директорий: core
и www
:
Ну и настраиваем сам Xdebug примерно так:
Дальше указываем точку остановки где-нибудь в проекте, например в api.php
и жмём на трубку в правом верхнем углу, чтобы она стала зелёной:
Теперь при каждом запросе в API ваш PhpStorm будет тормозить в указанном месте и ждать, пока вы там всё посмотрите.
Выражаю благодарность Евгению Терину за его конфиги docker-compose, которыми я вдохновлялся, пока писал свои.
Надеюсь теперь познакомиться и начать работу с Vesp будет проще!
Как оказалось, из-за особенностей работы MacOS с файловой системой, Docker в ней работает не очень быстро.
Почитал о проблеме и добавил работу через Mutagen Compose, который меняет логику синхронизации файлов между хостом и доком, ускоряя её разы.
Установить его можно через Homebrew:
brew install mutagen-io/mutagen/mutagen mutagen-io/mutagen/mutagen-compose
А затем запускать mutagen-compose
вместо docker-compose
:
mutagen-compose -f ./mutagen-compose.yml up --build
То есть, теперь у Vesp есть стандартный docker-compose.yml
, и расширенный mutagen-compose.yml
, которые запускаются разными командами.
И чтобы вам не заморачиваться их запоминанием, я добавил скрипт run.sh
, который пытается запустить контейнеры через mutagen
, а если его нет, то стандартным способом.
Разница между ними очень серьёзная. Установка зависимостей Node.js на моём Mac Mini M1 занимает:
Таким образом, если вы хотите работать с Docker на MacOS, обязательно установите Mutagen, это даст вам производительность сопоставимую с нативной работой с файлами.
Мутаген больше не нужен - https://bezumkin.ru/sections/servers/3100
Что-то установка падает на этапе установки xdebug.
Step 6/12 : RUN pecl install xdebug
---> Running in 00684a0e23b5
Package "xdebug" Version "3.1.5" does not have REST xml available install failed
ERROR: Service 'php-fpm' failed to build: The command '/bin/sh -c pecl install xdebug' returned a non-zero code: 1
Это на Ubuntu 22.04 такая ошибка, а на Маке всё поднялось.
У меня в последнее время бывают подобные ошибки из-за плохой связи. Исправляется повторной попыткой, или включением VPN.
Думаю это потому, что основные репозитории Docker находятся за рубежом, и соединение не всегда стабильное.
Сейчас проверил на Ubuntu 22.04.1 LTS - нет проблем, всё сразу завелось.
Понял, буду пробовать ещё. С Днём Рождения! )
Спасибо!
Тоже Ubuntu 22.04. Все собралось успешно. Но почему-то запросы к api вылетают с 500 ошибкой. В консоли браузера показывает ошибку CORS, хотя в файле настроек CORS=1.
Это ошибка бэкенда - смотри логи.
Ничего подозрительного в логах не нашел.
Но вот когда меняешь урл с http://localhost:8080 на http://127.0.0.1:8080 то в админке авторизует без ошибки и все работает. Для портов 4000 и 4100 такой фокус не проходит.
Ну тогда дело и правда в CORS.
Но я только что по своей инструкции всё повторил с нуля и ошибок нет.
Спасибо. Попробую тоже с нуля переставить
При попытке войти под юзером admin/admin через эту версию админки, выдаёт "Ошибка 500: Ошибка сервера". Это проблема с CORS или с чем-то ещё? Vesp в докере запущен не на локалке, а на сервере с Ubuntu 16.
При этом без ошибок входит в админку на порту 8080.
Да, кстати, пишет CORS error http://joxi.ru/zANqX6NUwJyZ82
В .env, конечно же, прописал корректные и SITE_URL, и API_URL. Корректные – это значит, с портом 8080.
А корректные - это какие?
Проверил у себя сейчас: запустил на компе с Mac, прописал в
.env
внешний локальный IPТеперь все API запросы админки, неважно по какому адресу её открываешь (localhost или внешний), уходят на этот адрес. Понятное дело, он должен быть всем доступен по сети.
Проверил с другой машины - всё работает.
Пробовал и API_URL=http://domain.ru/api/, естественно предварительно настроив на NGINX сервера проксирование для данного домена:
Также пробовал и просто IP сервера прописать с портом 8080 API_URL=http://IP_сервера:8080/api/.
И в том, и в другом случае, главная страница и страница админки открываются (в первом случае по домену, во втором – по IP:8080) и запросы в API проходят корректно. Также открывается и админка в режиме разработки на порте 4000. Но вот запросы в API оттуда уже не проходят – пишет ошибку связанную с CORS.
Там принцип работы простой - фронт грузится в браузер и делает запросы на API_URL.
Тот фронт, который открывается на
8080
- это production build, изменения.env
его не трогают никак, пока не пересоберёшь. А вот порты4000
и4100
- это режим разработки, они читают.env
при каждом запуске.Ты, кстати, какой
.env
редактируешь? Который в docker лежит? Нужно именно его, если запускаешь в Docker.В любом случае проверяй в браузере вкладку сети и смотри на какой IP идут запросы. Твой API должен открываться и по прямому запросу, например вот так:
Если фронтенд отправляет запросы не на нужный адрес, значит не видит твои настройки, или они неправильные.
Это то понятно.
Он вроде и открывается, только что-то криво. http://joxi.ru/eAOgxWJuGwDnYA
Тем не менее, через порт 8080 API корректно отрабатывает, не смотря на эту ошибку. А через порт 4000 запросы не принимает, из-за CORS. А как можно этот CORS отключить? В .env CORS=0?
Так создай директорию tmp в корне проекта -)
Про CORS почитай в инете, его отключить нельзя, это браузер делает.
Она была, конечно же) Но ты натолкнул меня на мысль, что может в правах дело. Дал права 777 на tmp и решилась проблема, о которой я даже не подозревал – в билд админки начал входить корректно. Ранее он входил под любыми данные доступа, как оказалось, а сейчас начал выдавать ошибку при неправильном логин-пароле и при входе в admin/admin теперь появились разделы "Пользователи" и "Группы".
Видимо из-за того, что я делаю всё от рута... Сейчас попробую настроить корректные права доступа и запущу контейнеры из под юзера.
Прикольно!
Рад, что заработало!
Оно не заработало. Проблема с CORS в админке в режиме разработки как была, так и осталась))
Я тогда уже не знаю что предложить и посоветовать.
Копай, разбирайся, потом расскажешь в чем было дело.
Ну тогда вот ещё:
ERROR [stage-0 5/10] RUN pecl install xdebug
в контейнере php-fpm. Решилось установкой дополнительных модулей перед установкой xdebug (наверняка есть лишние, но я не стал разбираться, какой ему именно нужен):composer db:migrate
, выдавал такую ошибку:[ERROR] [Entrypoint]: mariadbd failed while attempting to check config Can't initialize timers
. Решилось уточнением версии MariaDB в.env
:php-fpm/Dockerinfo
, просто указал версию xdebug 3.1.0Удивительно. После того, как запустил контейнеры не через рута, а юзером-владельцем, то проблема с CORS пропала... Не понимаю связи.
Смотри, когда браузер ругается на CORS - это общая ошибка, которая говорит, что он не получил ответ с нужными заголовками. Значит, этот запрос не безопасный и его данные не надо принимать.
Но, если на сервере какая-то ошибка и запрос сам по себе не выполнен правильно - заголовков тоже не будет. И браузер об этом напишет.
Ты думаешь, что проблема в заголовках, а на самом деле просто не работает API. Смотри сырой ответ от сервера и логи, которые контейнер пишет в свою консоль.
То есть, при запросах на другие домены вместо ошибки 500 или подобной, ты можешь видеть ошибку CORS - но суть та же, это ошибка сервера. Что в случае запусков из под рута или проблем прав доступа самое обычно дело.
Теперь понял. Благодарю!
Приветствую Василий! Начал не с курса а с запуска в Докере. Фронтенд и Админка загрузились. Но после команды "composer db:migrate" в консоли вылезают ошибки. Если я правильно понял:
Так-то всё верно, но ошибка странная. Первая миграция прошла, а вот на второй отказ БД, как будто контейнер отключился.
Попробуй пересоздать контейнер с пустой базой, мне кажется это какой-то глюк докера.
Т.е. имеется в виду просто удалить проект и создать его заново?
Не весь проект, а просто директорию с базой.
Если этой директории нет, то контейнер maridb сам всё создаст при запуске и будет чистая база, готовая для миграций.
И еще по поводу "контейнер отключился". Возможно я что-то сделал неправильно просто. Хронологически это выглядит так:
Может здесь просто делаю что-то не то?
docker-compose up --build -d
У них сейчас это очень удобно сделано:
Да, так и сделал. Тоже самое выдает теперь в консоли Докера.
Ну окей, первая миграция проходит и глючит вторая.
Что происходит при повторном запуске миграций? Должна стартовать сразу миграция таблицы юзеров.
при повторном запуске "composer db:migrate" выдает практически тоже самое.
затем, если запустить "composer db:seed" то получается такое...
Какое "такое"? Засеивание прошло успешно, ошибок нет, можно пробовать логиниться в админку.
Хоть на второй миграции БД почему-то отваливается, но таблицы создаёт и работать, наверное, можно.
Почему у тебя так происходит на второй миграции - не знаю, в этом тебе придётся разбираться самостоятельно. Я бы залез и посмотрел структуру созданных таблиц, ключи и связи - возможно что-то из них не получается создать.
Почему - без понятия. Я такой ошибки не видел и другие пользователи не сообщали.
Как понимаю логиниться нужно с данными из .env. Т.е. user - vesp и password - vesp. Если так - то войти не могу. Пишет ошибку "wrong username or password".
А как можно в Докере посмотреть стуктуру таблиц? Если открыть в браузере http://localhost:3333/ выдаются какие-то кракозябры.
работаю в Винде
Нужно же какой-то MySQL клиент использовать, например встроенный в PhpStorm.
Его можно и отдельно скачать - DataGrip назвается.
блин, я думал все серверное окружение Докер воссоздает.
Не совсем понял только. У меня ошибки возникали из-за того, что Docker не работал нормально с Hyper-V, и нужно на WSL 2 переключить. Или же вся проблема была в том, что MySQL клиент не был установлен?
Судя по вопросам, ты в разработке совсем новичок.
Docker запускает контенеры с разными службами:
Внутри Docker все эти контейнеры прекрасно общаются между собой. А вот чтобы подключиться к ним снаружи нужен или браузер для веб-сайта, или какая-то спец-программа для базы данных.
DataGrip и подобный софт предоставляет понятный интерфес для работы с БД, к Docker он не имеет никакого отношения. Ровно так же для подключения к БД можно использовать и консольные утилиты mysql, или установить и настроить внутри Docker веб-интерфейс, типа PhpMyadmin или Adminer.
Если ты сейчас такие вопросы задаёшь, дальше можно курс про Vesp и не читать, мне проще тебе деньги вернуть, чем с нуля всему учить.
Да, ты прав конечно. Я и не разработчик по сути, только сейчас собрался подучиться, PHP поучить и посмотреть твой курс. С Docker немного уже имел дело. Запускал в нем Directus (CMS на TS). Там все как-то просто делается, и на моем десктопе без проблем все запускается, и на сервере потом.
По ошибкам я по сути уже понял, что нужно попробовать Docker на WSL перенастроить, но тут твое сообщение здесь увидел про DataGrip и подумал, что это тоже про ошибки. Мне, конечно, не хочется тебя излишне напрягать. Я думал, что преодолев сложности с установкой, можно просто смотреть твой код в уроках, делать подобным образом и учиться. Ну типа как в MODX, когда ты выкладывал инструкции по созданию своих плагинов и т.д. Кое-что я повторял и работало. Здесь, конечно, уровень входа другой.
В общем если считаешь, что это бесперспективно - тогда давай закончим.
Молодец!
Ну раз докера победил - начинай уже курс читать, там и правильный логин с паролем узнаешь =)
На берег не списали - уже хорошо=) Дальше поди разберусь!
Василий, по поводу входа в админку, т.е. получения логина и пароля, ты видимо имеешь в виду Урок "Создание нового проекта" . Там как раз нужно перед входом в админку создать базу -
Здесь же я уже выполнил миграцию, и в файле
есть же все данные:
с ними я и пытаюсь войти. Но при входе получаю ошибку - "Error 500: Server error". В консоли тоже выдается ошибка - "has been blocked by CORS policy".
P.S. Ни в коем разе не пытаюсь спорить с тобой или дискутировать.) Реально не догоняю пока.
Тут в комментах я уже видел, некоторые пытались менять порты. Я тоже попробовал зайти в админку по адресу http://127.0.0.1:8080/admin/ . И зашел и обрадовался)) Но, оказалось, что таким образом можно войти с любой комбинацией логина и пароля. Т.е. реального входа не происходит.
Подскажи пожалуйста куда копать?!
Миграции создают таблицы. Сиды засеивают их данными, то есть создают записи в таблицах.
Логин и пароль нужно вводить для юзеров, созданных сидами, а не для базы данных.
Судя по скриншоту, у тебя проблема с отправкой запроса на сервер по адресу
http://127.0.0.1:8080/api/
. При запущенном докере по адресу http://127.0.0.1:8080/api/user/profile должно быть вот так:Если этого нет - разбирайся с Docker дальше.
При открытии http://127.0.0.1:8080/api/user/profile - выдает
Это из-за Докера?
Создай директорию
tmp
в корне проекта и перезапусти контейнеры.Была папка tmp, и удалял и переустанавливал ее - все без толку. Выше товарищ правильно написал, что нужно tmp расчмодить 777 - после этого попал в админку)) Праздник первой борозды!
!!!Внимание виндузятники и виндузятницы!!! (пользователи у кого основаная система виндовс.
если у вас никак не получается сделать по этому гайду, то делайте следующее.
1ое надо убедиться что в докере, в настройках, в ресурсах, в wsl integration у вас стоят все галочки.
2ое ставить всё надо не куда вы привыкли (скажем в специальную папку "sites", а прямо внутри wsl придётся разворачиваться, лучше всего прямо в корне. для этого, кликаете пуск, и кликаете там свою убунту.
3ье наберите в консоли "pwd" и увидите что находитесь в "/home/ВашЛогин", это домашняя папка под системы убунту в виндовс (домашняя папка wsl). Вот туда и придётся ставить vesp, от этого всё работает быстро. (почему так? написано вот здесь https://learn.microsoft.com/ru-ru/windows/wsl/filesystems#file-storage-and-performance-across-file-systems)
4ое следуюете инструкциям в этом гайде.
5ое после первичных миграций и сидов, вы не сможете попасть в админку (будет ошибка CORS запроса), так как папка для временной БД недоступна по каким-то непонятным причинам, находясь в корне сайта, сделайте слудующее
chmod 777 tmp
Но даже после этого у вас оно не заработает, потому что просто так у вас прав нет, тогда пишите так sudo chmod 777 tmp (оно попросит пароль, введите пароль) и на всякий случай sudo chmod 777 tmp/*
вот после этого, спокойно попадёте в админку.