Vesp в Docker

Наконец-то у меня дошли руки разобраться с 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. Так что если хотите пересобрать статику, то просто удалите эту директорию и перезапустите контейнеры.

Xdebug

В контейнере с PHP встроен Xdebug, и вы можете легко использовать его для отладки в PhpStorm.
Первым делом создаём новый сервер с обязательным именем VespDocker, прописываем адрес и порт контейнера Nginx и задаём соответствие 2х директорий: core и www:
Ну и настраиваем сам Xdebug примерно так:
Дальше указываем точку остановки где-нибудь в проекте, например в api.php и жмём на трубку в правом верхнем углу, чтобы она стала зелёной:
Теперь при каждом запросе в API ваш PhpStorm будет тормозить в указанном месте и ждать, пока вы там всё посмотрите.

Заключение

Выражаю благодарность Евгению Терину за его конфиги docker-compose, которыми я вдохновлялся, пока писал свои.
Надеюсь теперь познакомиться и начать работу с Vesp будет проще!

Обновлено 25.07.2022

Как оказалось, из-за особенностей работы 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 занимает:
  • 245 секунд стандартным docker-compose
  • 90 секунд при запуске через mutagen-compose
  • 71 секунда при установке вообще без Docker, с локальным Node.js
Таким образом, если вы хотите работать с Docker на MacOS, обязательно установите Mutagen, это даст вам производительность сопоставимую с нативной работой с файлами.

Обновлено 02.12.2022

Мутаген больше не нужен - https://bezumkin.ru/sections/servers/3100

58 комментариев

Что-то установка падает на этапе установки 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 такой фокус не проходит.
Василий Наумкин
Но вот когда меняешь урл с http://localhost:8080 на http://127.0.0.1:8080 то в админке авторизует без ошибки
Ну тогда дело и правда в CORS.
Но я только что по своей инструкции всё повторил с нуля и ошибок нет.
Николай Каленников
Спасибо. Попробую тоже с нуля переставить
Павел Гвоздь
127.0.0.1:4000/admin/ - это админка в режиме разработки
При попытке войти под юзером admin/admin через эту версию админки, выдаёт "Ошибка 500: Ошибка сервера". Это проблема с CORS или с чем-то ещё? Vesp в докере запущен не на локалке, а на сервере с Ubuntu 16.
При этом без ошибок входит в админку на порту 8080.
Павел Гвоздь
Да, кстати, пишет CORS error http://joxi.ru/zANqX6NUwJyZ82
В .env, конечно же, прописал корректные и SITE_URL, и API_URL. Корректные – это значит, с портом 8080.
Василий Наумкин
А корректные - это какие?
Проверил у себя сейчас: запустил на компе с Mac, прописал в .env внешний локальный IP
API_URL=http://192.168.0.254:8080/api/
Теперь все API запросы админки, неважно по какому адресу её открываешь (localhost или внешний), уходят на этот адрес. Понятное дело, он должен быть всем доступен по сети.
Проверил с другой машины - всё работает.
Павел Гвоздь
А корректные - это какие?
Пробовал и API_URL=http://domain.ru/api/, естественно предварительно настроив на NGINX сервера проксирование для данного домена:
location / {
    proxy_pass http://localhost:8080/;
}
Также пробовал и просто IP сервера прописать с портом 8080 API_URL=http://IP_сервера:8080/api/.
И в том, и в другом случае, главная страница и страница админки открываются (в первом случае по домену, во втором – по IP:8080) и запросы в API проходят корректно. Также открывается и админка в режиме разработки на порте 4000. Но вот запросы в API оттуда уже не проходят – пишет ошибку связанную с CORS.
Василий Наумкин
Там принцип работы простой - фронт грузится в браузер и делает запросы на API_URL.
и запросы в API проходят корректно
Тот фронт, который открывается на 8080 - это production build, изменения .env его не трогают никак, пока не пересоберёшь. А вот порты 4000 и 4100 - это режим разработки, они читают .env при каждом запуске.
Ты, кстати, какой .env редактируешь? Который в docker лежит? Нужно именно его, если запускаешь в Docker.
В любом случае проверяй в браузере вкладку сети и смотри на какой IP идут запросы. Твой API должен открываться и по прямому запросу, например вот так:
Если фронтенд отправляет запросы не на нужный адрес, значит не видит твои настройки, или они неправильные.
Павел Гвоздь
пока не пересоберёшь
какой .env редактируешь? Который в docker лежит? Нужно именно его
Это то понятно.
Твой API должен открываться и по прямому запросу
Он вроде и открывается, только что-то криво. http://joxi.ru/eAOgxWJuGwDnYA
Тем не менее, через порт 8080 API корректно отрабатывает, не смотря на эту ошибку. А через порт 4000 запросы не принимает, из-за CORS. А как можно этот CORS отключить? В .env CORS=0?
Василий Наумкин
Так создай директорию tmp в корне проекта -)
Про CORS почитай в инете, его отключить нельзя, это браузер делает.
Павел Гвоздь
Так создай директорию tmp в корне
Она была, конечно же) Но ты натолкнул меня на мысль, что может в правах дело. Дал права 777 на tmp и решилась проблема, о которой я даже не подозревал – в билд админки начал входить корректно. Ранее он входил под любыми данные доступа, как оказалось, а сейчас начал выдавать ошибку при неправильном логин-пароле и при входе в admin/admin теперь появились разделы "Пользователи" и "Группы".
Видимо из-за того, что я делаю всё от рута... Сейчас попробую настроить корректные права доступа и запущу контейнеры из под юзера.
Василий Наумкин
Прикольно!
Рад, что заработало!
Павел Гвоздь
Оно не заработало. Проблема с CORS в админке в режиме разработки как была, так и осталась))
Василий Наумкин
Я тогда уже не знаю что предложить и посоветовать.
Копай, разбирайся, потом расскажешь в чем было дело.
Павел Гвоздь
Ну тогда вот ещё:
1) При установке сначала возникала ошибка ERROR [stage-0 5/10] RUN pecl install xdebug в контейнере php-fpm. Решилось установкой дополнительных модулей перед установкой xdebug (наверняка есть лишние, но я не стал разбираться, какой ему именно нужен):
RUN apk add --no-cache aspell gettext gnu-libiconv grpc icu imagemagick imap-dev libzip libbz2 librdkafka libxml2-utils libpq libmemcached libssh2 libevent libev libxslt linux-headers lua openldap openldap-back-mdb tidyhtml yaml zlib
2) Дальше возникала проблема с MariaDB. Когда из контейнера php-fpm пытаешься запустить composer db:migrate, выдавал такую ошибку: [ERROR] [Entrypoint]: mariadbd failed while attempting to check config Can't initialize timers. Решилось уточнением версии MariaDB в .env:
MARIADB_VERSION=10.8.2
Василий Наумкин
  1. Уже пофиксил в репо, файл php-fpm/Dockerinfo, просто указал версию xdebug 3.1.0
  2. Не встречал, но спасибо за инфу. Видимо как-то связано с хвостовой машиной
Павел Гвоздь
Удивительно. После того, как запустил контейнеры не через рута, а юзером-владельцем, то проблема с CORS пропала... Не понимаю связи.
Василий Наумкин
Смотри, когда браузер ругается на CORS - это общая ошибка, которая говорит, что он не получил ответ с нужными заголовками. Значит, этот запрос не безопасный и его данные не надо принимать.
Но, если на сервере какая-то ошибка и запрос сам по себе не выполнен правильно - заголовков тоже не будет. И браузер об этом напишет.
Ты думаешь, что проблема в заголовках, а на самом деле просто не работает API. Смотри сырой ответ от сервера и логи, которые контейнер пишет в свою консоль.
То есть, при запросах на другие домены вместо ошибки 500 или подобной, ты можешь видеть ошибку CORS - но суть та же, это ошибка сервера. Что в случае запусков из под рута или проблем прав доступа самое обычно дело.
Павел Гвоздь
Теперь понял. Благодарю!
Приветствую Василий! Начал не с курса а с запуска в Докере. Фронтенд и Админка загрузились. Но после команды "composer db:migrate" в консоли вылезают ошибки. Если я правильно понял:
  1. Все должно запускаться без какого-то специфического окружения, серверов, PHP, MySQL и т.д. В этом вроде и суть Докера).
  2. Тестовая база уже находится в контейнере Докера и специально перед "composer db:migrate" ее не нужно ее создавать и прописывать в .env.
Василий Наумкин
Так-то всё верно, но ошибка странная. Первая миграция прошла, а вот на второй отказ БД, как будто контейнер отключился.
Попробуй пересоздать контейнер с пустой базой, мне кажется это какой-то глюк докера.
Т.е. имеется в виду просто удалить проект и создать его заново?
Василий Наумкин
Не весь проект, а просто директорию с базой.
Если этой директории нет, то контейнер maridb сам всё создаст при запуске и будет чистая база, готовая для миграций.
И еще по поводу "контейнер отключился". Возможно я что-то сделал неправильно просто. Хронологически это выглядит так:
  1. После запуска инсталляции в Докере (команда "docker-compose up") проект загружается и консоль "занята".
  2. Чтобы "освободить" консоль я выхожу из запуска - т.е. Ctrl+C.
  3. Мне нужно ввести консольную команду "docker exec -it $(docker ps --filter name="vesp-php-fpm" -q) bash", но для этого, как понимаю, нужен запущенный Докер и я запускаю его просто в десктопном приложении.
Может здесь просто делаю что-то не то?
Василий Наумкин
  1. лучше запускать в фоновом режиме вот так docker-compose up --build -d
  2. Тогда и выходить не придётся
  3. Дальше или эта команда, или зайти через интерфейс в Docker контейнер и в его консоле работать
У них сейчас это очень удобно сделано:
Да, так и сделал. Тоже самое выдает теперь в консоли Докера.
Василий Наумкин
Ну окей, первая миграция проходит и глючит вторая.
Что происходит при повторном запуске миграций? Должна стартовать сразу миграция таблицы юзеров.
при повторном запуске "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 запускает контенеры с разными службами:
  • node для фронтенда
  • php для бэкенда
  • mariadb для базы данных
  • nginx веб-сервер для обращения к фронтенду
Внутри Docker все эти контейнеры прекрасно общаются между собой. А вот чтобы подключиться к ним снаружи нужен или браузер для веб-сайта, или какая-то спец-программа для базы данных.
DataGrip и подобный софт предоставляет понятный интерфес для работы с БД, к Docker он не имеет никакого отношения. Ровно так же для подключения к БД можно использовать и консольные утилиты mysql, или установить и настроить внутри Docker веб-интерфейс, типа PhpMyadmin или Adminer.
Если ты сейчас такие вопросы задаёшь, дальше можно курс про Vesp и не читать, мне проще тебе деньги вернуть, чем с нуля всему учить.
Да, ты прав конечно. Я и не разработчик по сути, только сейчас собрался подучиться, PHP поучить и посмотреть твой курс. С Docker немного уже имел дело. Запускал в нем Directus (CMS на TS). Там все как-то просто делается, и на моем десктопе без проблем все запускается, и на сервере потом.
По ошибкам я по сути уже понял, что нужно попробовать Docker на WSL перенастроить, но тут твое сообщение здесь увидел про DataGrip и подумал, что это тоже про ошибки. Мне, конечно, не хочется тебя излишне напрягать. Я думал, что преодолев сложности с установкой, можно просто смотреть твой код в уроках, делать подобным образом и учиться. Ну типа как в MODX, когда ты выкладывал инструкции по созданию своих плагинов и т.д. Кое-что я повторял и работало. Здесь, конечно, уровень входа другой.
В общем если считаешь, что это бесперспективно - тогда давай закончим.
Запустил Докер c WSL. Загрузил проект в виртуальную Ubuntu. Нормально теперь миграция прошла - без ошибок. А в админку не могу попасть с логином и паролем vesp ((. Выдает: "Error 500: Server error".
Василий Наумкин
Молодец!
Ну раз докера победил - начинай уже курс читать, там и правильный логин с паролем узнаешь =)
На берег не списали - уже хорошо=) Дальше поди разберусь!
Василий, по поводу входа в админку, т.е. получения логина и пароля, ты видимо имеешь в виду Урок "Создание нового проекта" . Там как раз нужно перед входом в админку создать базу -
mysql -e "create database VespShop" -uroot -proot
Здесь же я уже выполнил миграцию, и в файле
vesp/docker/.env
есть же все данные:
MARIADB_USERNAME=vesp
MARIADB_PASSWORD=vesp
MARIADB_DATABASE=vesp
с ними я и пытаюсь войти. Но при входе получаю ошибку - "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 - выдает
"Directory \"\/vesp\/tmp\/clockwork\" does not exist."
Это из-за Докера?
Василий Наумкин
Создай директорию 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/*
вот после этого, спокойно попадёте в админку.
У меня происходит странная штука. В Докере пытаюсь выполнить миграцию, но таблица в БД не создается. Выполняю:
  1. Создаю миграцию Posts - composer db:create Posts;
  2. Редактирую файл миграции - определяю колонки новой таблицы Posts;
  3. Выполняю миграцию и после этого в таблице old_migrations новая миграция Posts отобразилась, но таблица не создана.
На сервере (без Докера) я уже создал тестовый сайт, и там после выполнения миграции таблица создается. Код файла миграции я взял рабочий оттуда. Может быть при работе в Докере есть какие-то нюансы, которые нужно учитывать при создании миграций?
Василий Наумкин
Может быть при работе в Докере есть какие-то нюансы, которые нужно учитывать при создании миграций?
Вообще ничего подобного и близко нет. Если миграция прошла без ошибок, значит таблица создана.
Возможно, нужно просто обновить список таблиц в HeidiSQL - у тебя там зелёная кнопочка обновления на панели. У меня такое регулярно в PhpStorm, нужно не забывать обновлять список таблиц, после миграций.
Блин, оказывается из-за пермишенсов убунты PHPStorm не мог сохранить файл миграции. Я думал он сохранялся, а при открытии заново обнаружил дефолтный файл, который автоматом создается. Теперь выполнил sudo chmod -R 777 core/db/migrations и создалось таблица!
Василий Наумкин
Ура!
bezumkin.ru
Personal website of Vasily Naumkin
Прямой эфир
Александр Наумов
23.07.2024, 00:20:37
Василий, спасибо большое!!
Василий Наумкин
01.07.2024, 11:56:41
Да, верно, именно так. А в контроллере, скорее всего, ловить данные методом post.
Василий Наумкин
26.06.2024, 09:38:15
О, точно, вылезает если не залогинен. Спасибо, исправил!
Василий Наумкин
09.04.2024, 04:45:01
> Ошибка 500 Это не похоже на ошибку Nginx, это скорее всего ошибка PHP - надо смотреть его логи. ...
Василий Наумкин
20.03.2024, 21:21:52
Volledig!
Андрей
14.03.2024, 13:47:10
Василий! Как всегда очень круто! Моё почтение!
russel gal
09.03.2024, 20:17:18
> А этот стоило написать хотя бы затем, чтобы получить комментарий от юзера, который ничего не писал...
Александр Наумов
27.01.2024, 03:06:18
Василий, спасибо! Извини, тупанул.
Василий Наумкин
22.01.2024, 07:43:20
Давай-давай!
Василий Наумкин
24.12.2023, 14:26:13
Спасибо!