Наконец-то у меня дошли руки разобраться с 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

← Предыдущая заметка
Быстрый личный VPN через Wireguard
Следующая заметка →
Тестируем VirtioFS в Docker
Комментарии (58)
NightRider
23.10.2022 12:30

Что-то установка падает на этапе установки 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

NightRider
23.10.2022 17:44

Это на Ubuntu 22.04 такая ошибка, а на Маке всё поднялось.

bezumkinВасилий Наумкин
24.10.2022 03:12

У меня в последнее время бывают подобные ошибки из-за плохой связи. Исправляется повторной попыткой, или включением VPN.

Думаю это потому, что основные репозитории Docker находятся за рубежом, и соединение не всегда стабильное.

Сейчас проверил на Ubuntu 22.04.1 LTS - нет проблем, всё сразу завелось.

NightRider
24.10.2022 08:17

Понял, буду пробовать ещё. С Днём Рождения! )

bezumkinВасилий Наумкин
24.10.2022 12:10

Спасибо!

ni.kolokol@mail.ruНиколай Каленников
03.11.2022 11:49

Тоже Ubuntu 22.04. Все собралось успешно. Но почему-то запросы к api вылетают с 500 ошибкой. В консоли браузера показывает ошибку CORS, хотя в файле настроек CORS=1.

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

Это ошибка бэкенда - смотри логи.

ni.kolokol@mail.ruНиколай Каленников
03.11.2022 16:17

Ничего подозрительного в логах не нашел. Но вот когда меняешь урл с http://localhost:8080 на http://127.0.0.1:8080 то в админке авторизует без ошибки и все работает. Для портов 4000 и 4100 такой фокус не проходит.

bezumkinВасилий Наумкин
03.11.2022 16:36

Но вот когда меняешь урл с http://localhost:8080 на http://127.0.0.1:8080 то в админке авторизует без ошибки

Ну тогда дело и правда в CORS.

Но я только что по своей инструкции всё повторил с нуля и ошибок нет.

ni.kolokol@mail.ruНиколай Каленников
03.11.2022 16:43

Спасибо. Попробую тоже с нуля переставить

gvozdbПавел Гвоздь
14.01.2023 20:05

127.0.0.1:4000/admin/ - это админка в режиме разработки

При попытке войти под юзером admin/admin через эту версию админки, выдаёт "Ошибка 500: Ошибка сервера". Это проблема с CORS или с чем-то ещё? Vesp в докере запущен не на локалке, а на сервере с Ubuntu 16.

При этом без ошибок входит в админку на порту 8080.

gvozdbПавел Гвоздь
15.01.2023 05:57

Да, кстати, пишет CORS error http://joxi.ru/zANqX6NUwJyZ82

В .env, конечно же, прописал корректные и SITE_URL, и API_URL. Корректные – это значит, с портом 8080.

bezumkinВасилий Наумкин
15.01.2023 06:42

А корректные - это какие?

Проверил у себя сейчас: запустил на компе с Mac, прописал в .env внешний локальный IP

API_URL=http://192.168.0.254:8080/api/

Теперь все API запросы админки, неважно по какому адресу её открываешь (localhost или внешний), уходят на этот адрес. Понятное дело, он должен быть всем доступен по сети.

Проверил с другой машины - всё работает.

gvozdbПавел Гвоздь
15.01.2023 07:34

А корректные - это какие?

Пробовал и 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.

bezumkinВасилий Наумкин
15.01.2023 07:48

Там принцип работы простой - фронт грузится в браузер и делает запросы на API_URL.

и запросы в API проходят корректно

Тот фронт, который открывается на 8080 - это production build, изменения .env его не трогают никак, пока не пересоберёшь. А вот порты 4000 и 4100 - это режим разработки, они читают .env при каждом запуске.

Ты, кстати, какой .env редактируешь? Который в docker лежит? Нужно именно его, если запускаешь в Docker.

В любом случае проверяй в браузере вкладку сети и смотри на какой IP идут запросы. Твой API должен открываться и по прямому запросу, например вот так:

Если фронтенд отправляет запросы не на нужный адрес, значит не видит твои настройки, или они неправильные.

gvozdbПавел Гвоздь
15.01.2023 08:02

пока не пересоберёшь

какой .env редактируешь? Который в docker лежит? Нужно именно его

Это то понятно.

Твой API должен открываться и по прямому запросу

Он вроде и открывается, только что-то криво. http://joxi.ru/eAOgxWJuGwDnYA

Тем не менее, через порт 8080 API корректно отрабатывает, не смотря на эту ошибку. А через порт 4000 запросы не принимает, из-за CORS. А как можно этот CORS отключить? В .env CORS=0?

bezumkinВасилий Наумкин
15.01.2023 08:13

Так создай директорию tmp в корне проекта -)

Про CORS почитай в инете, его отключить нельзя, это браузер делает.

gvozdbПавел Гвоздь
15.01.2023 08:21

Так создай директорию tmp в корне

Она была, конечно же) Но ты натолкнул меня на мысль, что может в правах дело. Дал права 777 на tmp и решилась проблема, о которой я даже не подозревал – в билд админки начал входить корректно. Ранее он входил под любыми данные доступа, как оказалось, а сейчас начал выдавать ошибку при неправильном логин-пароле и при входе в admin/admin теперь появились разделы "Пользователи" и "Группы".

Видимо из-за того, что я делаю всё от рута... Сейчас попробую настроить корректные права доступа и запущу контейнеры из под юзера.

bezumkinВасилий Наумкин
15.01.2023 08:23

Прикольно!

Рад, что заработало!

gvozdbПавел Гвоздь
15.01.2023 08:24

Оно не заработало. Проблема с CORS в админке в режиме разработки как была, так и осталась))

bezumkinВасилий Наумкин
15.01.2023 08:26

Я тогда уже не знаю что предложить и посоветовать.

Копай, разбирайся, потом расскажешь в чем было дело.

gvozdbПавел Гвоздь
15.01.2023 08:32

Ну тогда вот ещё:

  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
  1. Дальше возникала проблема с 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
bezumkinВасилий Наумкин
15.01.2023 08:35
  1. Уже пофиксил в репо, файл php-fpm/Dockerinfo, просто указал версию xdebug 3.1.0
  2. Не встречал, но спасибо за инфу. Видимо как-то связано с хвостовой машиной
gvozdbПавел Гвоздь
15.01.2023 09:57

Удивительно. После того, как запустил контейнеры не через рута, а юзером-владельцем, то проблема с CORS пропала... Не понимаю связи.

bezumkinВасилий Наумкин
15.01.2023 10:36

Смотри, когда браузер ругается на CORS - это общая ошибка, которая говорит, что он не получил ответ с нужными заголовками. Значит, этот запрос не безопасный и его данные не надо принимать.

Но, если на сервере какая-то ошибка и запрос сам по себе не выполнен правильно - заголовков тоже не будет. И браузер об этом напишет.

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

То есть, при запросах на другие домены вместо ошибки 500 или подобной, ты можешь видеть ошибку CORS - но суть та же, это ошибка сервера. Что в случае запусков из под рута или проблем прав доступа самое обычно дело.

gvozdbПавел Гвоздь
15.01.2023 10:47

Теперь понял. Благодарю!

futurisFuturis
10.03.2023 07:45

Приветствую Василий! Начал не с курса а с запуска в Докере. Фронтенд и Админка загрузились. Но после команды "composer db:migrate" в консоли вылезают ошибки. Если я правильно понял:

  1. Все должно запускаться без какого-то специфического окружения, серверов, PHP, MySQL и т.д. В этом вроде и суть Докера).
  2. Тестовая база уже находится в контейнере Докера и специально перед "composer db:migrate" ее не нужно ее создавать и прописывать в .env.

bezumkinВасилий Наумкин
10.03.2023 08:09

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

Попробуй пересоздать контейнер с пустой базой, мне кажется это какой-то глюк докера.

futurisFuturis
10.03.2023 08:26

Т.е. имеется в виду просто удалить проект и создать его заново?

bezumkinВасилий Наумкин
10.03.2023 08:59

Не весь проект, а просто директорию с базой.

Если этой директории нет, то контейнер maridb сам всё создаст при запуске и будет чистая база, готовая для миграций.

futurisFuturis
10.03.2023 08:31

И еще по поводу "контейнер отключился". Возможно я что-то сделал неправильно просто. Хронологически это выглядит так:

  1. После запуска инсталляции в Докере (команда "docker-compose up") проект загружается и консоль "занята".
  2. Чтобы "освободить" консоль я выхожу из запуска - т.е. Ctrl+C.
  3. Мне нужно ввести консольную команду "docker exec -it $(docker ps --filter name="vesp-php-fpm" -q) bash", но для этого, как понимаю, нужен запущенный Докер и я запускаю его просто в десктопном приложении.

Может здесь просто делаю что-то не то?

bezumkinВасилий Наумкин
10.03.2023 08:57
  1. лучше запускать в фоновом режиме вот так docker-compose up --build -d
  2. Тогда и выходить не придётся
  3. Дальше или эта команда, или зайти через интерфейс в Docker контейнер и в его консоле работать

У них сейчас это очень удобно сделано:

futurisFuturis
10.03.2023 09:13

Да, так и сделал. Тоже самое выдает теперь в консоли Докера.

bezumkinВасилий Наумкин
10.03.2023 10:31

Ну окей, первая миграция проходит и глючит вторая.

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

futurisFuturis
10.03.2023 11:22

при повторном запуске "composer db:migrate" выдает практически тоже самое.

futurisFuturis
10.03.2023 11:22

затем, если запустить "composer db:seed" то получается такое...

bezumkinВасилий Наумкин
10.03.2023 12:01

Какое "такое"? Засеивание прошло успешно, ошибок нет, можно пробовать логиниться в админку.

Хоть на второй миграции БД почему-то отваливается, но таблицы создаёт и работать, наверное, можно.

Почему у тебя так происходит на второй миграции - не знаю, в этом тебе придётся разбираться самостоятельно. Я бы залез и посмотрел структуру созданных таблиц, ключи и связи - возможно что-то из них не получается создать.

Почему - без понятия. Я такой ошибки не видел и другие пользователи не сообщали.

futurisFuturis
10.03.2023 12:17

Как понимаю логиниться нужно с данными из .env. Т.е. user - vesp и password - vesp. Если так - то войти не могу. Пишет ошибку "wrong username or password".

А как можно в Докере посмотреть стуктуру таблиц? Если открыть в браузере http://localhost:3333/ выдаются какие-то кракозябры.

futurisFuturis
10.03.2023 12:17

работаю в Винде

bezumkinВасилий Наумкин
11.03.2023 09:00

Нужно же какой-то MySQL клиент использовать, например встроенный в PhpStorm.

Его можно и отдельно скачать - DataGrip назвается.

futurisFuturis
11.03.2023 11:04

блин, я думал все серверное окружение Докер воссоздает.

futurisFuturis
11.03.2023 12:23

Не совсем понял только. У меня ошибки возникали из-за того, что Docker не работал нормально с Hyper-V, и нужно на WSL 2 переключить. Или же вся проблема была в том, что MySQL клиент не был установлен?

bezumkinВасилий Наумкин
11.03.2023 13:01

Судя по вопросам, ты в разработке совсем новичок.

Docker запускает контенеры с разными службами:

  • node для фронтенда
  • php для бэкенда
  • mariadb для базы данных
  • nginx веб-сервер для обращения к фронтенду

Внутри Docker все эти контейнеры прекрасно общаются между собой. А вот чтобы подключиться к ним снаружи нужен или браузер для веб-сайта, или какая-то спец-программа для базы данных.

DataGrip и подобный софт предоставляет понятный интерфес для работы с БД, к Docker он не имеет никакого отношения. Ровно так же для подключения к БД можно использовать и консольные утилиты mysql, или установить и настроить внутри Docker веб-интерфейс, типа PhpMyadmin или Adminer.

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

futurisFuturis
11.03.2023 13:48

Да, ты прав конечно. Я и не разработчик по сути, только сейчас собрался подучиться, PHP поучить и посмотреть твой курс. С Docker немного уже имел дело. Запускал в нем Directus (CMS на TS). Там все как-то просто делается, и на моем десктопе без проблем все запускается, и на сервере потом.

По ошибкам я по сути уже понял, что нужно попробовать Docker на WSL перенастроить, но тут твое сообщение здесь увидел про DataGrip и подумал, что это тоже про ошибки. Мне, конечно, не хочется тебя излишне напрягать. Я думал, что преодолев сложности с установкой, можно просто смотреть твой код в уроках, делать подобным образом и учиться. Ну типа как в MODX, когда ты выкладывал инструкции по созданию своих плагинов и т.д. Кое-что я повторял и работало. Здесь, конечно, уровень входа другой.

В общем если считаешь, что это бесперспективно - тогда давай закончим.

futurisFuturis
12.03.2023 07:48

Запустил Докер c WSL. Загрузил проект в виртуальную Ubuntu. Нормально теперь миграция прошла - без ошибок. А в админку не могу попасть с логином и паролем vesp ((. Выдает: "Error 500: Server error".

bezumkinВасилий Наумкин
12.03.2023 08:38

Молодец!

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

futurisFuturis
12.03.2023 09:33

На берег не списали - уже хорошо=) Дальше поди разберусь!

futurisFuturis
14.03.2023 08:45

Василий, по поводу входа в админку, т.е. получения логина и пароля, ты видимо имеешь в виду Урок "Создание нового проекта" . Там как раз нужно перед входом в админку создать базу -

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. Ни в коем разе не пытаюсь спорить с тобой или дискутировать.) Реально не догоняю пока.

futurisFuturis
14.03.2023 08:49

Тут в комментах я уже видел, некоторые пытались менять порты. Я тоже попробовал зайти в админку по адресу http://127.0.0.1:8080/admin/ . И зашел и обрадовался)) Но, оказалось, что таким образом можно войти с любой комбинацией логина и пароля. Т.е. реального входа не происходит.

Подскажи пожалуйста куда копать?!

bezumkinВасилий Наумкин
14.03.2023 09:56

Миграции создают таблицы. Сиды засеивают их данными, то есть создают записи в таблицах.

Логин и пароль нужно вводить для юзеров, созданных сидами, а не для базы данных.

Судя по скриншоту, у тебя проблема с отправкой запроса на сервер по адресу http://127.0.0.1:8080/api/. При запущенном докере по адресу http://127.0.0.1:8080/api/user/profile должно быть вот так:

Если этого нет - разбирайся с Docker дальше.

futurisFuturis
14.03.2023 11:35

При открытии http://127.0.0.1:8080/api/user/profile - выдает

"Directory \"\/vesp\/tmp\/clockwork\" does not exist."

Это из-за Докера?

bezumkinВасилий Наумкин
14.03.2023 12:09

Создай директорию tmp в корне проекта и перезапусти контейнеры.

futurisFuturis
14.03.2023 13:04

Была папка tmp, и удалял и переустанавливал ее - все без толку. Выше товарищ правильно написал, что нужно tmp расчмодить 777 - после этого попал в админку)) Праздник первой борозды!

frenkiartАртур
05.04.2023 22:40

!!!Внимание виндузятники и виндузятницы!!! (пользователи у кого основаная система виндовс.

если у вас никак не получается сделать по этому гайду, то делайте следующее.

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/*

вот после этого, спокойно попадёте в админку.

futurisFuturis
26.11.2023 06:04

У меня происходит странная штука. В Докере пытаюсь выполнить миграцию, но таблица в БД не создается. Выполняю:

  1. Создаю миграцию Posts - composer db:create Posts;
  2. Редактирую файл миграции - определяю колонки новой таблицы Posts;
  3. Выполняю миграцию и после этого в таблице app_migrations новая миграция Posts отобразилась, но таблица не создана.

На сервере (без Докера) я уже создал тестовый сайт, и там после выполнения миграции таблица создается. Код файла миграции я взял рабочий оттуда. Может быть при работе в Докере есть какие-то нюансы, которые нужно учитывать при создании миграций?

bezumkinВасилий Наумкин
26.11.2023 09:07

Может быть при работе в Докере есть какие-то нюансы, которые нужно учитывать при создании миграций?

Вообще ничего подобного и близко нет. Если миграция прошла без ошибок, значит таблица создана.

Возможно, нужно просто обновить список таблиц в HeidiSQL - у тебя там зелёная кнопочка обновления на панели. У меня такое регулярно в PhpStorm, нужно не забывать обновлять список таблиц, после миграций.

futurisFuturis
26.11.2023 09:46

Блин, оказывается из-за пермишенсов убунты PHPStorm не мог сохранить файл миграции. Я думал он сохранялся, а при открытии заново обнаружил дефолтный файл, который автоматом создается. Теперь выполнил sudo chmod -R 777 core/db/migrations и создалось таблица!

bezumkinВасилий Наумкин
27.11.2023 02:43

Ура!

bezumkin
Василий Наумкин
01.03.2024 04:30
С PWA пока не разбирался, мне кажется это не особо популярная штука. Если надо просто иконки добавит...
bezumkin
Василий Наумкин
22.02.2024 09:23
На здоровье! Держи лайк =)
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 для бэкенда. Их можно обновлять, но э...
bezumkin
Василий Наумкин
22.11.2023 08:09
Отлично, поздравляю!
bezumkin
Василий Наумкин
04.11.2023 10:31
На здоровье!
bezumkin
Василий Наумкин
30.10.2023 01:21
Спасибо!