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

Сервисы или процессы
Под вступлением вкладка напоминает: «Сервисы 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, 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", DjangoCreateExtension("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)

Тесты проекта 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 и когда создаёте его.