Skip to content

Реальный пример: в чем польза 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

sh
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-alpine

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

3. Запустить бэкенд - в отдельном терминале, задав переменные окружения:

sh
cd backend
DATABASE_URL=postgresql://user:secret@localhost:5432/appdb \
REDIS_URL=redis://localhost:6379 \
PORT=3001 \
npm run dev

4. Запустить фронтенд - ещё в одном терминале:

sh
cd frontend
VITE_API_URL=http://localhost:3001 \
npm run dev

Переменные окружения

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

Итог: несколько шагов, несколько терминалов, переменные окружения разбросаны по командной строке (разным файлам), правильный порядок запуска нужно держать в голове, для завершения всех запущенных процессов также необходимо выполнение нескольких действий.

Такая ситуация требует документации и внимательности при подключении новых разработчиков.

С Runium

Чтобы поднять окружение для разработки, нужно:

1. Создать файл проекта

То же самое окружение описывается в одном файле, например, project.json. Запускаемые элементы, переменные окружения, зависимости и порядок запуска - всё в одном месте:

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. Запустить проект - всего одной командой:

sh
runium project start -f project.json

Runium самостоятельно поднимет PostgreSQL и Redis, дождётся их готовности, запустит бэкенд, а затем - фронтенд. Именно в таком порядке, именно с теми переменными, которые указаны в конфигурации.

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

Фактически, конфигурация запуска Runium сама является документацией и описанием процесса запуска.

Расположение всех элементов в одном месте позволяет легко и прозрачно конфигурировать и поддерживать запускаемое окружение.

Что дальше?