Проекты

Сервисы

Подключение общих сервисов Joppa (PostgreSQL, Redis, Mailpit…) к проекту: переменные .env записываются после diff, тестовая база данных Laravel.

Вкладка Сервисы (V) подключает к проекту сервисы Joppa: PostgreSQL, MySQL, Redis, Mailpit, Meilisearch… Счётчик на вкладке показывает, сколько сервисов связано с проектом. Достаточно одного клика: переменные сервиса попадают в .env после diff и следуют за его портом.

Вкладка «Сервисы»: PostgreSQL, MySQL, Redis и Mailpit, по строке на сервис, с кнопкой «Включить»

Сервисы или процессы

Под вступлением вкладка напоминает: «Сервисы Joppa общие для всех ваших проектов (база данных, кеш, почта). То, что проект запускает сам, — в разделе «Процессы».» (Перейти к процессам).

  • Сервис Joppa работает в одном экземпляре для всех ваших проектов; у каждого проекта в нём своя база данных. Он создаётся на странице Сервисы и подключается здесь.
  • Процесс принадлежит проекту: его серверы разработки, воркеры, контейнеры Docker Compose. Он управляется на вкладке Процессы.

По «Запустить всё» связанные сервисы запускаются первыми, раньше процессов проекта.

Подключить сервис

Блок сервисов перечисляет сервисы Joppa, по одному в строке. Включить открывает diff с двумя вариантами:

  • Связать и записать в .env: переменные сервиса записываются и обновляются, если его порт меняется.
  • Связать без записи: Joppa запоминает связь, не трогая файл.

Подключённый сервис сразу запускается, если был остановлен, в том числе когда вы принимаете распознанные сервисы при добавлении проекта. Если базы данных проекта ещё нет, Joppa её создаёт: строка сервиса сообщает «Создаёт базу данных {name} и добавляет её в .env», а после подключения селектор позволяет переключиться на другую базу этого сервиса; если выбранной базы в сервисе нет, Создать её создаёт. Списки баз данных (страница сервиса, тестовая база) обновляются, как только база создана. Проект использует только один сервис каждого типа: подключение MySQL заменяет PostgreSQL.

Перестать использовать… делает обратное: Отвязать и очистить .env возвращает значение из .env.example (или удаляет переменную), Отвязать, не трогая .env оставляет файл как есть. Переменные, которые вы изменили вручную, сохраняются.

Подключение записывает в .env: если в редакторе .env (вкладка Окружение) есть несохранённые изменения, кнопки Включить и Выключить недоступны («Сначала сохраните или отмените изменения в .env»).

Миграции, тестовые данные и индексы

Когда к проекту подключена база данных (PostgreSQL, MySQL, MariaDB) или поисковый движок (Meilisearch, Typesense) — на этой вкладке или на странице сервиса, — Joppa ищет в проекте, как он их заполняет, и предлагает это запустить: «Подготовить базу данных PostgreSQL?» или «Заполнить индексы Typesense?». Каждый шаг показывает свою команду, инструмент, который её выполняет, и причину, по которой он предложен (database/migrations (14), package.json · db:migrate). Миграции и Поисковые индексы отмечены; Тестовые данные ждут, пока вы их отметите, потому что они могут заменить уже имеющиеся данные. Запустить выполняет отмеченные шаги по порядку на вкладке «scripts» терминала и останавливается на первом неудачном; со страницы сервиса Запустить к тому же открывает проект с терминалом на вкладке «scripts». Не сейчас закрывает окно, ничего не запуская. Если в проекте нечего запускать, ничего не появляется. Redis, Valkey, Mailpit и Reverb этого не требуют.

Сначала идут скрипты самого проекта: скрипт из package.json (каждого пакета монорепозитория), composer.json, deno.json, Makefile или justfile, имя которого говорит, что он делает (migrate, db:migrate, db-migrate, db:push, migration:run, db:setup, seed, db:seed, fixtures…; для поиска — search:index, reindex, typesense:sync, meili:index, scout:import…). Скрипты, которые стирают данные (db:reset, migrate:fresh, db:drop), никогда не предлагаются. Если в папке такого скрипта нет, Joppa предлагает команду инструмента:

Инструмент Миграции Тестовые данные
Laravel, Lumen php artisan migrate --no-interaction (если в database/migrations есть файлы) php artisan db:seed --no-interaction (если есть DatabaseSeeder.php)
Symfony (Doctrine) doctrine:migrations:migrate (если есть migrations/), иначе doctrine:schema:update --force doctrine:fixtures:load
CakePHP, Phinx bin/cake migrations migrate, vendor/bin/phinx migrate migrations seed, phinx seed:run
Yii 2, CodeIgniter 4, Craft CMS php yii migrate, php spark migrate --all, php craft up php spark db:seed DatabaseSeeder
Prisma prisma migrate deploy (если есть миграции), иначе prisma db push prisma db seed (если есть prisma.seed)
Drizzle drizzle-kit migrate (если в out есть .sql), иначе drizzle-kit push
TypeORM, Sequelize, Knex typeorm migration:run -d <data-source>, sequelize-cli db:migrate, knex migrate:latest typeorm-extension seed:run, sequelize-cli db:seed:all, knex seed:run
MikroORM, Kysely, AdonisJS mikro-orm migration:up, kysely migrate:latest, node ace migration:run mikro-orm seeder:run, kysely seed:run, node ace db:seed
node-pg-migrate, db-migrate, Payload, Medusa node-pg-migrate up, db-migrate up, payload migrate, medusa db:migrate
Django, Alembic, Flask-Migrate, Aerich manage.py migrate, alembic upgrade head, flask db upgrade, aerich upgrade
Rails, Ecto bin/rails db:migrate, mix ecto.migrate bin/rails db:seed, priv/repo/seeds.exs
sqlx, Diesel, SeaORM sqlx migrate run, diesel migration run, sea-orm-cli migrate up
Entity Framework, Flyway, Liquibase, Atlas dotnet ef database update, flywayMigrate / flyway:migrate, update / liquibase:update, atlas migrate apply --env local

Команды Node запускаются через менеджер пакетов проекта (bunx, pnpm exec, yarn, npx), команды Python — через uv, Poetry, Pipenv, PDM или virtualenv проекта. Для поискового движка: Laravel Scout (scout:sync-index-settings, если config/scout.php настраивает индексы, затем scout:import для каждой модели с Searchable), бандлы Symfony для Meilisearch (meilisearch:import) и Typesense (typesense:create, typesense:import), а также meilisearch-rails (reindex! каждой модели).

Под какими именами

Joppa записывает переменные под именами, которые проект уже читает: сначала из .env, затем из .env.example (даже закомментированные). Он распознаёт множество псевдонимов (DATABASE_URL, DIRECT_URL, POSTGRES_PRISMA_URL, POSTGRES_*, PG*, MYSQL_*…) и сохраняет схему и параметры ваших существующих URL.

Если проект ничего не объявляет, Joppa использует привычные имена его фреймворка:

Сервис Laravel Другие
База данных DB_CONNECTION, DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD DATABASE_URL (Symfony: с ?serverVersion=…&charset=utf8)
Redis, Valkey REDIS_HOST, REDIS_PASSWORD, REDIS_PORT REDIS_URL
Mailpit MAIL_MAILER=smtp, MAIL_HOST, MAIL_PORT… Symfony MAILER_DSN · Rails SMTP_ADDRESS, SMTP_PORT · Django EMAIL_HOST, EMAIL_PORT · Node SMTP_HOST, SMTP_PORT
Meilisearch MEILISEARCH_HOST, MEILISEARCH_KEY, SCOUT_DRIVER Symfony MEILISEARCH_URL, MEILISEARCH_API_KEY
Typesense TYPESENSE_*, SCOUT_DRIVER TYPESENSE_HOST, TYPESENSE_PORT, TYPESENSE_PROTOCOL, TYPESENSE_API_KEY
Reverb BROADCAST_CONNECTION=reverb, REVERB_APP_ID, REVERB_APP_KEY, REVERB_APP_SECRET, REVERB_HOST, REVERB_PORT, REVERB_SCHEME, VITE_REVERB_* PUSHER_APP_ID, PUSHER_APP_KEY, PUSHER_APP_SECRET, PUSHER_HOST, PUSHER_PORT, PUSHER_SCHEME

Фреймворк определяется по его файлам: Laravel (artisan), Symfony, Django (manage.py), Rails, Node (package.json).

Распознанные сервисы

Joppa читает файлы проекта, чтобы угадать, какие сервисы ему нужны, даже без Docker Compose. Это лишь подсказка: без вас ничего не добавляется и не подключается.

Блок «Похоже, этот проект использует»: PostgreSQL с pgvector и pg_trgm, Redis, Meilisearch

Сервис По чему он распознаётся
PostgreSQL, MySQL, MariaDB DB_CONNECTION (pgsql, mysql, mariadb), схема DATABASE_URL, DB_URL, POSTGRES_URL или MYSQL_URL, provider в Prisma, dialect в Drizzle, пакеты pg, postgres, mysql2, mariadb…
Redis, Valkey драйвер Laravel со значением redis (CACHE_STORE, SESSION_DRIVER, QUEUE_CONNECTION, BROADCAST_CONNECTION), REDIS_URL, VALKEY_URL, пакеты predis/predis, laravel/horizon, ioredis, redis, bullmq, iovalkey
Meilisearch, Typesense SCOUT_DRIVER, MEILISEARCH_HOST, TYPESENSE_HOST…, пакеты meilisearch/meilisearch-php, typesense/typesense-php, meilisearch, typesense
Reverb BROADCAST_CONNECTION=reverb, пакет laravel/reverb, контейнер Docker Compose, который запускает reverb:start, или Soketi
Mailpit локальный SMTP на порту 1025 (MAIL_MAILER=smtp с MAIL_PORT=1025 или SMTP_PORT=1025)

Joppa читает .env, затем .env.example для ключей, которых нет в .env, composer.json, package.json в корне и в apps/*, packages/* и services/*, prisma/schema.prisma и drizzle.config.*. Для базы данных и кеша он оставляет только один движок: названный в .env важнее схемы, а схема важнее пакета. SQLite не требует никакого сервиса. Один лишь REDIS_HOST не учитывается: он есть в каждом .env.example Laravel.

Результат появляется в двух местах:

  • на странице проекта — строка «Похоже, этот проект использует PostgreSQL, Redis и Meilisearch.» с кнопкой Показать в сервисах;
  • вверху этой вкладки, над блоком сервисов, — блок «Похоже, этот проект использует», который для каждого сервиса показывает, где он был найден (.env.example · DB_CONNECTION=pgsql), и движки, которые тоже подойдут (Redis «или Valkey», MySQL «или MariaDB»). Подключить и включить PostgreSQL 18 открывает обычный diff, если у Joppa уже есть сервис с этим движком; иначе Добавить Meilisearch открывает создание сервиса, а затем его подключение.

Расширения PostgreSQL

Для PostgreSQL Joppa ищет ещё и расширения, которые использует проект:

  • CREATE EXTENSION в файлах .sql (миграции Prisma, Drizzle, Supabase, database/, db/…) и в миграциях;
  • в миграциях Laravel — Schema::ensureVectorExtensionExists() и ->vector( (pgvector), uuid_generate_v4() (uuid-ossp), gin_trgm_ops (pg_trgm);
  • Rails enable_extension "hstore", Django CreateExtension("citext"), TrigramExtension(), VectorExtension()…;
  • Prisma extensions = [pg_trgm, uuid_ossp(map: "uuid-ossp")] и типы Unsupported("vector(…)") (pgvector) или Unsupported("geometry(…)") (PostGIS);
  • образ в Compose: pgvector/pgvector, postgis/postgis.

Учитываются только расширения, которые Joppa умеет предоставить: pgvector, PostGIS, pg_trgm, uuid-ossp, pgcrypto, citext, hstore, unaccent… Строка PostgreSQL перечисляет их («Расширения: pgvector, pg_trgm»); кстати, одного CREATE EXTENSION достаточно, чтобы распознать PostgreSQL. Добавить PostgreSQL открывает его создание с уже отмеченными расширениями — на сервере и для каждой новой базы данных. Если на выбранном сервере ещё не включено расширение, которое включается на уровне сервера (pgvector, PostGIS…), Включить pgvector открывает его настройки с отмеченным расширением — остаётся сохранить. Строка остаётся, пока у PostgreSQL, подключённого к проекту, нет всех нужных расширений.

Сервис исчезает из списка, как только проект использует сервис того же типа. Крестик в строке игнорирует этот сервис для проекта; крестик на баннере или вверху блока игнорирует их все. То, что уже запускает Docker Compose проекта, оставлено для импорта из Docker Compose.

Тестовая база данных (Laravel)

Блок «Тестовая база данных»: тесты на SQLite предлагается перевести на PostgreSQL, с diff файла .env.testing

Тесты проекта Laravel берут базу данных из phpunit.xml и .env.testing. Если в проекте есть один из этих файлов, на вкладке появляется блок Тестовая база данных, который показывает, что им нужно:

  • тесты требуют конкретную базу (например, phpunit.xml задаёт DB_CONNECTION=pgsql и DB_DATABASE=shop_testing, часто под другой инструмент): Joppa предлагает эту базу под тем же именем в одном из своих сервисов с тем же движком;
  • тесты работают на SQLite, а приложение использует PostgreSQL, MySQL или MariaDB: Joppa предлагает запускать их на том же движке, в базе <база приложения>_test;
  • для тестов ничего не задано: они работали бы на базе приложения, которую очищает RefreshDatabase. Joppa предлагает отдельную базу <база приложения>_test.

Если и приложение, и тесты работают на SQLite, предлагать нечего, и блок не появляется.

Сервис — тот, который проект уже использует (иначе первый с нужным движком), а имя базы можно изменить. Создать и связать при необходимости запускает сервис, создаёт базу, если её нет, и записывает DB_CONNECTION, DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME и DB_PASSWORD. У каждого файла свой diff (Показать изменения); заполненный DB_URL очищается, иначе он был бы важнее этих значений.

Если файлы уже указывают на базу, которой нет в сервисе, блок сообщает об этом («Базы данных … пока нет в …»), а Создать базу данных создаёт её, при необходимости запустив сервис.

В проекте есть Joppa записывает в
.env.testing и phpunit.xml .env.testing, а phpunit.xml — только если отметить Также обновить phpunit.xml
только .env.testing .env.testing
только phpunit.xml phpunit.xml (или phpunit.xml.dist, если есть только он)

В phpunit.xml Joppa трогает только теги <env name="DB_…">: меняет их value, раскомментирует те, что Laravel поставляет закомментированными, и добавляет недостающие в конец <php> с тем же отступом. Остальной файл не меняется. Перед первой записью каждый файл копируется рядом (phpunit.xml.joppa-backup, .env.testing.joppa-backup), а файл, изменённый на диске после предпросмотра, не перезаписывается.

Тот же выбор предлагается, когда вы добавляете проект Laravel и когда создаёте его.

getjoppa.com › support

Загрузка

Не отправляется? Напишите на [email protected]. Просто вопрос: [email protected].