Создание нового проекта

Первым делом нам нужно разобраться с вашей рабочей средой. Я использую одни из самых популярных инструментов:

  • Операционную систему MacOS с менеджером пакетов Homebrew
  • Laravel Valet для локальной разработки
  • Интегрированную среду PhpStorm
  • Веб-сервер Nginx
  • База данных MySQL 8.0
  • Php 7.4 и NodeJS 17

Здесь нет ничего особенного, обычный набор веб-разработчика.

Если вы используете такой же сетап, то поздравляю, вам будет максимально легко следовать моим инструкциям - нужно только установить специальный драйвер для Valet из репозитория vesp-valet-driver, что делается простым копированием файла VespValetDriver.php в ~/.config/valet/Drivers.

Структурно Vesp состоит из 2х больших частей: фронтенда на VueJS и бэкенда на PHP. Обе части разрабатываются (и могут быть использованы) независимо друг от друга и хранятся в разных репозиториях:

Объединяются они в 1 общем пакете, который называется просто Vesp и ставится из Packagist при помощи composer. Давайте создадим наш новый проект VespShop.

composer create-project vesp/vesp ./VespShop

Команда create-project у composer не просто скачивает пакеты, но и запускает скрипты, прописанные в composer.json. В нашем случае они устанавливают зависимости Node.js.

Далее заходим в директорию VespShop и делаем valet link vesp-shop, что создаёт в нашем Valet новый сайт vesp-shop.test.

В нём пока ничего нет, поэтому делаем в той же директории composer node:generate и переходим по локальному адресу http://vesp-shop.test - теперь вы должны увидеть такую картинку:

Давайте разберёмся как это всё работает.

Структура проекта

В корне проекта лежат следующие файлы и директории:

  • .env.dist пример конфигурации проекта
  • .env рабочая конфигурация, которая исопользуется в проекте
  • composer.json наши PHP зависимости и команды управления проектом
  • composer.lock служебный файл Composer с установленными версиями зависимостей
  • core это наш бэкенд со всем PHP кодом: модели, контроллеры, маршруты, консольные скрипты - в общем, вся серверная часть.
  • frontend а это, понятное дело, фронтенд. Причём внутри сразу 2 независимых веб-приложения: админка и публичный веб-сайт
  • www публично доступная директория с одним единственным коннектором для запросов в API и примером правил для .htaccess.

Запущенная нами команда composer node:generate создала в frontend/dist статичные HTML и JS файлы нашего фронтенда. Причём там собрано 2 приложения: admin и site.

Когда вы открываете vesp-shop.test, ваш запрос принимает локальный Nginx, отправляет в Valet, тот смотрим доступные драйвера, запускает драйвер для Vesp, а тот говорит ему, откуда нужно грузить файлы - именно из frontend/dist.

Статичные файл загружаются в браузер и дальше отправляют запросы на сервер через API. Таким образом и происходит всё взаимодействие фронтеда с бэкендом, через разные запросы в API и ответы в формате JSON.

Важно понимать, что в отличие от MODX сервер здесь не генерирует никакой HTML код в момент запроса, весь нужный код уже заранее сгенерирован и загружен пользователем. Теперь он просто выводится в соотвеcтвии со своей логикой и ответами бэкенда.

Публичный сайт по умолчанию никаких запросов пока не делает, просто выводит логотип системы на чёрном фоне. Поэтому давайте посмотрим на админку по адресу http://vesp-shop.test/admin/.

Что бы вы здесь не указывали, получите ошибку. Потому что у нас еще нет никаких данных, мы даже таблицы еще не создали.

Работа с базой данных

Первым делом нам нужно создать базу для нашего проекта.

mysql -e "create database VespShop" -uroot -proot

Как видно, у меня локальный root MySQL с паролем root. Дальше смотрим наш .env файл и меняем настройки:

# имя проекта, будет использовать на фронтенде
APP_NAME="Vesp Shop"

# базовый url сайта 
SITE_URL=http://vesp-shop.test/

# url для API запросов, может отличаться от базового
API_URL=http://vesp-shop.test/api/

# Разрешение для кроссдоменных запросов, на локалке обязательно включаем
CORS=1

# Настройки доступа в MySQL
DB_DRIVER=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_PREFIX=app_
DB_DATABASE=VespShop
DB_USERNAME=root
DB_PASSWORD=root
DB_CHARSET=utf8mb4
DB_COLLATION=utf8mb4_general_ci
DB_FOREIGN_KEYS=1

# Настройки для генерации JWT, пока можно не трогать
JWT_SECRET=secret
JWT_EXPIRE=2592000
JWT_MAX=3

# Абсолютные пути к директориям 
UPLOAD_DIR=/Users/bezumkin/Projects/VespShop/upload/
CACHE_DIR=/Users/bezumkin/Projects/VespShop/tmp/

Вы должны указать собственные пути к директориям, их можно узнать командой pwd в MacOS.

После изменения файла .env нам нужно пересобрать фронтенд, потому что изменился адрес отправки API запросов - composer node:generate.

А дальше запускаем новые команды:

composer db:migrate
composer db:seed

Первая команда создаёт таблицы, вторая "засеивает" их начальными данными.

После этого можно заходить в админку с логином и паролем admin.

Заключение

Сегодня мы создали и настроили новый проект на Vesp. Он уже работает, но все страницы и данные пока по-умолчанию. На следующих уроках мы научимся их менять под свои нужды.

Часть с настройкой проекта на локальной машине обычно вызывает самое больше число вопросов, поэтому я жду их в комментариях. Как только разберёмся с этим, дальше всё пойдёт гораздо проще и быстрее.

← Предыдущая заметка
Начинаем новый курс!
Следующая заметка →
Разбираемся с миграциями
Комментарии (63)
bezumkinВасилий Наумкин
31.05.2022 13:10

Нужно установить драйвер Valet для Vesp

wget https://raw.githubusercontent.com/bezumkin/vesp-valet-driver/main/VespValetDriver.php \
-O ~/.config/valet/Drivers/VespValetDriver.php

А потом перейти в директорию проекта и проверить, что её обслуживает именно он командой valet which, в ответ должно быть

This site is served by [VespValetDriver]
bezumkinВасилий Наумкин
31.05.2022 13:41

Видимо =)

bezumkinВасилий Наумкин
02.06.2022 13:46

This site is served by [BasicValetDriver].

Значит драйвер Vesp не установлен. Проверь директорию, может тоже нужно в ~/.valet/Drivers скопировать.

[BABEL] Note: The code generator has deoptimised the styling of

Это просто замечание, не ошибка - можно смело игнорировать.

bezumkinВасилий Наумкин
04.06.2022 12:51

Скорее всего это баг стилей fontawesome, после их перехода на 6ю версию.

Пока можно не обращать внимания, я проверю и добавлю исправление в Vesp.

bezumkinВасилий Наумкин
04.06.2022 16:55

Да, именно так это и решается - просто мне надо прописать импорт в Vesp по умолчанию.

bezumkinВасилий Наумкин
05.06.2022 05:32

Обновил пакет в репозитории, теперь все новые установки будут с этими стилями.

bezumkinВасилий Наумкин
04.06.2022 17:24

А что говорит valet links?

Эта команда должна показать домены всех обслуживаемых сайтов.

bezumkinВасилий Наумкин
05.06.2022 04:44

Слушай, а ты не забыл сделать composer node:generate случайно? А то, может, сайт-то работает - просто открывать нечего?

bezumkinВасилий Наумкин
06.06.2022 04:14

Это не ошибка, а note - заметка, можно смело игнорировать.

Но спасибо за наводку, добавил в nuxt.config.js по умолчанию:

Config.build = {
  babel: {
    compact: true,
  },
}
bezumkinВасилий Наумкин
06.06.2022 11:01

Отлично!

bezumkinВасилий Наумкин
04.06.2022 17:46

Показывает, что типа все ок.

Похоже проблема в DnsMasq

bezumkinВасилий Наумкин
04.06.2022 17:55

Попробуй сам пока разобраться, если никак - спишемся завтра в Телеграмм и настрою тебе всё через AnyDesk удаленно.

bezumkinВасилий Наумкин
05.06.2022 05:23

Это моя ошибка в composer.json, я там указал npm generate, а нужно npm run generate

Пожалуйста, скопируй новый файл себе из репозитория.

bezumkinВасилий Наумкин
05.06.2022 09:42

Ха-ха, вот я криворукий!

Короче, сделай npm install --global yarn, чтобы глобально установить пакетный менеджер yarn и дальше все должно быть ок

bezumkinВасилий Наумкин
05.06.2022 10:14

Да просто я сам не пользуюсь npm, поэтому команды не проверил.

На неделе починю их как положено, спасибо за баг-репорт.

bezumkinВасилий Наумкин
08.06.2022 15:56

node_modules должно быть внутри frontend, а не в корне.

Попробуй запустить еще раз composer node:install, а потом проверить права на файл frontend/node_modules/.bin/concurrently - возможно в Ubuntu он не делается исполняемым при установке.

Если так, то chmod +x frontend/node_modules/.bin/concurrently должно помочь.

bezumkinВасилий Наумкин
09.06.2022 05:56

Я думаю, что проблема в Nginx - там нужно прописать отдельный location для запросов API. Вот мой рабочий конфиг для продакшн-сервера на Ubuntu:

server {
    listen                  80;
    server_name             vesp.pro;
    root                    /home/vesp/www;
    access_log              /var/log/vesp/vesp-access.log;
    error_log               /var/log/vesp/vesp-error.log;
    index                   200.html;
    client_max_body_size    0;
    rewrite_log             on;

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass backend-vesp;
    }

    location ~ ^/(api|__clockwork)/ {
        rewrite ^/(api|__clockwork)/(.*)$ /api.php;
    }

    location ~ ^/(favicons|images)/(.*) {
        access_log off;
        alias /home/vesp/frontend/dist/site/$1/$2;
    }

    location / {
        root /home/vesp/frontend/dist/site/;
        access_log off;
        gzip on;
        gzip_types text/css application/javascript application/x-javascript text/javascript image/svg+xml;
        expires 1y;
        try_files $uri /200.html;
    }
}

Тебе нужно поменять пути и указать свой fastcgi_pass - он создаётся в php-fpm.

bezumkinВасилий Наумкин
09.06.2022 12:31

Да, всё верно - я скопировал правила из проекта без админки =)

Очень рад, что ты справился!

bezumkinВасилий Наумкин
09.06.2022 06:01

Посмотри в консоли браузера, куда улетают запросы - возможно ты забыл обновить фронтенд после редактирования .env, тогда будет неправильный адрес для API запросов. Нужно запустить composer node:generate еще раз.

Если адрес верный, то попробуй открыть http://vesp-shop.test/api/user/profile, в отает должно быть "Authentication required". Если увидишь тот же Not Found от сервера, значит он неправильно настроен и запросы в API не работают.

bezumkinВасилий Наумкин
09.06.2022 14:36

Что-то в консоли адрес совсем неверный - там много непонятного между /api/ и /security/login/

Думаю комментарии из .env нужно убрать, они явно попадают в значения.

SITE_URL=http://vesp-shop.test/ # базовый url сайта 
API_URL=http://vesp-shop.test/api/ # url для API запросов, может отличаться от базового
CORS=1 # Разрешение для кроссдоменных запросов, на локалке обязательно включаем

переделать в

SITE_URL=http://vesp-shop.test/
API_URL=http://vesp-shop.test/api/
CORS=1

И пересобрать фронтенд

bezumkinВасилий Наумкин
09.06.2022 15:12

Поправил заметку, чтобы такого не было у других!

bezumkinВасилий Наумкин
10.06.2022 04:43

Честно говоря, я не подумал, что кто-то будет заменять оригинальные файлы примерами из заметки =)

bezumkinВасилий Наумкин
25.06.2022 14:56

Поправил, спасибо!

bezumkinВасилий Наумкин
26.04.2023 10:54

ошибка gin.vue:32

Это что за файл такой, откуда взялся?

Ошибка говорит, что в нём вызывается команда decodeURIComponent с неправильными параметрами. Надо найти и поправить.

Идти макбук покупать? Может посоветуете для винды чего-нибудь помимо докера

Могу посоветовать обычную виртуалку с GNU/Linux.

bezumkinВасилий Наумкин
26.04.2023 14:02

Нет никакой проблемы с CORS, эти заголовки разрешаются или запрещаются в файле .env соответствующей переменной.

Судя по ошибке в login.vue у тебя как раз с этим файлом проблемы, видимо там указан неправильный адрес для запросов в API, поэтому его и не получается обработать.

bezumkinВасилий Наумкин
27.04.2023 07:47

У тебя указан домен первого уровня, без домена второго уровня.

Попробуй просто открыть из браузера http://vespshop/api/ и посмотреть, что получится. Я думаю, что твой браузер просто не надёт такого сайта.

yuranYuran
05.04.2024 08:22

Далее заходим в директорию VespShop и делаем valet link vesp-shop, что создаёт в нашем Valet новый сайт vesp-shop.test.

Я пытаюсь поставить проект на windows 10 под Openserver. Есть ли какое то действие, чтобы сделать подобное.... Или это не обязательно и для windows использовать просто домен http://vespshop/ ? И еще такой вопрос - где находится корень сайта в этом приложении? C:\OSPanel\domains\VespShop или C:\OSPanel\domains\VespShop\www Я записал в .env так SITE_URL=http://vespshop/ API_URL=http://vespshop/api/ Но где эта папка api? В корне сайта ее нет...

bezumkinВасилий Наумкин
05.04.2024 09:46

Увы, не могу ничем помочь - ни разу в жизни не пользовался OpenServer.

Но где эта папка api? В корне сайта ее нет...

Её и не должно быть - это виртуальный адрес. Все запросы должны перенапрвляться на www/api.php, а там уже сработает роутинг.

yuranYuran
05.04.2024 08:58
# composer db:migrate
Composer could not detect the root package (vesp/vesp) version, defaulting to '1.0.0'. See https://getcomposer.org/root-version
> cd core && vendor/bin/phinx migrate
'vendor' is not recognized as an internal or external command,
operable program or batch file.
Script cd core && vendor/bin/phinx migrate handling the db:migrate event returned with error code 1

Подскажите пожалуйста почему не срабатывает миграция? База данных создана, пользователь и пароль в .env прописаны правильные.... Что ему нужно?

bezumkinВасилий Наумкин
05.04.2024 09:49

Полагаю, что на Windows такие пути и команды просто не работают.

yuranYuran
05.04.2024 11:50

Я понял, спасибо за ответы. Попробую на VPS собрать и запустить.

yuranYuran
08.04.2024 21:06

Блин... не получается:( Создаю проект командой composer create-project vesp/vesp site.ru Все отрабатывается нормально. Захожу в директорию site.ru там выполняю composer node:generate Тоже все отрабатывается нормально. Прописываю в .env SITE_URL=http://site.ru/ API_URL=http://site.ru/api/ и данные для базы данных. Выполняю в консоли composer db:migrate и composer db:seed - все отрабатывает нормально. Главная страница открылась, при попытке войти в админку выдает Ошибка 500: Ошибка сервера.

Я подозреваю, что неправильно составил конфиг Nginx. Вот мой конфиг.

server {
    listen @@@@@@@: 80;
    server_name             site.ru;   
    ssl_certificate "/@@@@@@@/site.ru_le2.crtca";
    ssl_certificate_key "/@@@@@@@@/site.ru_le2.key";
    ssl_ciphers @@@@@@@:!NULL:!RC4;
    ssl_prefer_server_ciphers on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    root                    /@@@@@@/site.ru/www;
    access_log              /var/log/vesp/vesp-access.log;
    error_log               /var/log/vesp/vesp-error.log;
    index                   200.html;
    client_max_body_size    0;
    rewrite_log             on;
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         fastcgi_pass 127.0.0.1:9000;
    }
    location ~ ^/(api|__clockwork)/ {
        rewrite ^/(api|__clockwork)/(.*)$ /api.php;
    }
    location ~ ^/(favicons|images)/(.*) {
        access_log off;
        alias /@@@@@@/site.ru/frontend/dist/site/$1/$2;
    }
 
   location ~ ^/admin$ {
        return 302 $uri/;
    }
    location ~ ^/admin/ {
        root /@@@@@@@/site.ru/frontend/dist/;
        try_files $uri /admin/200.html;
    }

    location / {
        root /@@@@@@@/site.ru/frontend/dist/site/;
        access_log off;
        gzip on;
        gzip_types text/css application/javascript application/x-javascript text/javascript image/svg+xml;
        expires 1y;
        try_files $uri /200.html;
    }
}

Вообще VPS сконфигурирован как связка apache+nginx. Может что то нужно в apache добавить? Или этот валет нужен? Я так понял он только для локальной на макбуке.... Кто хорошо разбирается - помогите пожалуйста настрить нормально конфиг.

bezumkinВасилий Наумкин
09.04.2024 01:45

Ошибка 500

Это не похоже на ошибку Nginx, это скорее всего ошибка PHP - надо смотреть его логи.

Вообще VPS сконфигурирован как связка apache+nginx

Тогда непонятно, почему в конфиге Nginx указан php-fpm:

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         fastcgi_pass 127.0.0.1:9000;
    }

В общем, нужно смотреть логи Nginx, PHP и Apache2 в поисках конкретной проблемы, чтобы её решать.

bezumkin
Василий Наумкин
09.04.2024 01:45
Ошибка 500 Это не похоже на ошибку Nginx, это скорее всего ошибка PHP - надо смотреть его логи. Во...
futuris
Futuris
04.04.2024 05:56
Я просто немного запутался. Когда в абзаце "Vesp/Core" ты пишешь про "новый trait Fil...
bezumkin
Василий Наумкин
20.03.2024 18:21
Volledig!
Андрей
14.03.2024 10:47
Василий! Как всегда очень круто! Моё почтение!
russelgal
russel gal
09.03.2024 17:17
А этот стоило написать хотя бы затем, чтобы получить комментарий от юзера, который ничего не писал ...
inetlover
Александр Наумов
27.01.2024 00:06
Василий, спасибо! Извини, тупанул.
bezumkin
Василий Наумкин
22.01.2024 04:43
Давай-давай!
bezumkin
Василий Наумкин
24.12.2023 11:26
Спасибо!
bezumkin
Василий Наумкин
27.11.2023 02:43
Ура!
bezumkin
Василий Наумкин
25.11.2023 08:30
Vesp тянет 2 зависимости: vesp-frontent для фронта и vesp-core для бэкенда. Их можно обновлять, но э...