Реальный пример: в чем польза Runium
Посмотрим, как Runium применяется в реальной ситуации.
Исходная задача
Представим простой типичный web-проект:
- фронтенд - приложение на Vite + React
- бэкенд - HTTP-сервер на Node.js + Fastify
- база данных - PostgreSQL, запускается в Docker
- кеш - Redis, запускается в Docker
Структура проекта:
project/
frontend/ # Vite-приложение
backend/ # Fastify-серверФронтенд взаимодействует с бэкендом через API, используя переменную окружения VITE_API_URL.
Бэкенд использует переменные окружения для подключения к базе данных DATABASE_URL и кешу REDIS_URL.
При запуске PostgreSQL необходимы переменные окружения POSTGRES_USER, POSTGRES_PASSWORD и POSTGRES_DB.
Необходимо запустить все элементы для разработки в правильном порядке и с правильными переменными окружения.
Без Runium
Чтобы поднять окружение для разработки, нужно:
1. Запустить PostgreSQL и Redis в Docker
docker run -d \
--name dev-postgres \
-e POSTGRES_USER=user \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_DB=appdb \
-p 5432:5432 \
postgres:16-alpine
docker run -d \
--name dev-redis \
-p 6379:6379 \
redis:7-alpine2. Дождаться готовности базы данных - это важный момент. PostgreSQL стартует не мгновенно, и если запустить бэкенд раньше, это может привести к ошибкам подключения.
3. Запустить бэкенд - в отдельном терминале, задав переменные окружения:
cd backend
DATABASE_URL=postgresql://user:secret@localhost:5432/appdb \
REDIS_URL=redis://localhost:6379 \
PORT=3001 \
npm run dev4. Запустить фронтенд - ещё в одном терминале:
cd frontend
VITE_API_URL=http://localhost:3001 \
npm run devПеременные окружения
Переменные окружения могут быть заданы альтернативным способом, например, в файле .env в корне проекта.
Итог: несколько шагов, несколько терминалов, переменные окружения разбросаны по командной строке (разным файлам), правильный порядок запуска нужно держать в голове, для завершения всех запущенных процессов также необходимо выполнение нескольких действий.
Такая ситуация требует документации и внимательности при подключении новых разработчиков.
С Runium
Чтобы поднять окружение для разработки, нужно:
1. Создать файл проекта
То же самое окружение описывается в одном файле, например, project.json. Запускаемые элементы, переменные окружения, зависимости и порядок запуска - всё в одном месте:
{
"id": "my-app-dev",
"tasks": [
{
"id": "postgres",
"type": "docker",
"options": {
"image": "postgres:16-alpine",
"containerName": "dev-postgres",
"ports": ["5432:5432"],
"env": {
"POSTGRES_USER": "user",
"POSTGRES_PASSWORD": "secret",
"POSTGRES_DB": "appdb"
}
}
},
{
"id": "redis",
"type": "docker",
"options": {
"image": "redis:7-alpine",
"containerName": "dev-redis",
"ports": ["6379:6379"]
}
},
{
"id": "database-ready",
"options": {
"command": "until docker exec dev-postgres pg_isready; do sleep 1; done"
},
"dependencies": [
{
"taskId": "postgres",
"condition": "status==='started'"
}
]
},
{
"id": "backend",
"options": {
"command": "npm",
"arguments": ["run", "dev"],
"cwd": "./backend",
"env": {
"DATABASE_URL": "postgresql://user:secret@localhost:5432/appdb",
"REDIS_URL": "redis://localhost:6379",
"PORT": "3001"
}
},
"dependencies": [
{
"taskId": "database-ready",
"condition": {
"status": "completed"
}
},
{
"taskId": "redis",
"condition": {
"status": "started"
}
}
]
},
{
"id": "frontend",
"options": {
"command": "npm",
"arguments": ["run", "dev"],
"cwd": "./frontend",
"env": {
"VITE_API_URL": "http://localhost:3001"
}
},
"dependencies": [
{
"taskId": "backend",
"condition": {
"status": "started"
}
}
]
}
]
}Плагин Docker
Для запуска Docker-контейнеров необходим плагин @runium/plugin-docker.
2. Запустить проект - всего одной командой:
runium project start -f project.jsonRunium самостоятельно поднимет PostgreSQL и Redis, дождётся их готовности, запустит бэкенд, а затем - фронтенд. Именно в таком порядке, именно с теми переменными, которые указаны в конфигурации.
Итог: запуск одной командой, все запускаемые элементы, переменные окружения и зависимости указаны в одном месте, централизованное завершение работы.
Фактически, конфигурация запуска Runium сама является документацией и описанием процесса запуска.
Расположение всех элементов в одном месте позволяет легко и прозрачно конфигурировать и поддерживать запускаемое окружение.
Что дальше?
- Что такое проект? - подробнее о структуре проекта
- Задачи - все возможности настройки задач
- Зависимости - сложные сценарии зависимостей
- Обработчики - реакция на изменение состояния
- FAQ и решение проблем - ответы на часто задаваемые вопросы и решения проблем
