env-master
ENСоздать аккаунт
Разделы документации

Быстрый старт

От пустой установки до сервиса, который сам читает пароль от базы. Каждый шаг — рабочая команда; переменные, появившиеся на одном шаге, используются на следующих.

1. Заведите аккаунт

Сервис работает на https://env.aistastudio.ru — ставить и обслуживать нечего. Зарегистрируйтесь и подтвердите почту по ссылке из письма. Регистрация создаёт персональную организацию — она станет владельцем проектов, участников и тарифа.

Адрес API — тот же домен с префиксом /api/v1:

export ENVMASTER_URL=https://env.aistastudio.ru
BASE=$ENVMASTER_URL/api/v1

2. Войдите и найдите организацию

TOKEN=$(curl -s $BASE/auth/login -H 'content-type: application/json' \
  -d '{"email":"вы@example.com","password":"..."}' | jq -r .accessToken)

ORG=$(curl -s $BASE/orgs -H "authorization: Bearer $TOKEN" | jq -r .items[0].id)

Access-токен пользователя живёт 15 минут — протухнет прямо посреди инструкции, просто войдите заново.

3. Заведите проект и окружение

PROJECT=$(curl -s $BASE/projects -H "authorization: Bearer $TOKEN" \
  -H 'content-type: application/json' \
  -d "{\"orgId\":\"$ORG\",\"name\":\"Billing API\",\"slug\":\"billing-api\"}" | jq -r .id)

ENV=$(curl -s $BASE/projects/$PROJECT/environments -H "authorization: Bearer $TOKEN" \
  -H 'content-type: application/json' \
  -d '{"slug":"production"}' | jq -r .id)

Окружения по умолчанию не создаются: dev, staging, production — это ваш выбор, а не предустановка. Создатель проекта автоматически получает в нём роль admin, поэтому следующие шаги отдельных прав не требуют.

4. Положите секрет

curl -s "$BASE/projects/$PROJECT/entries?env=production" \
  -X PUT -H "authorization: Bearer $TOKEN" -H 'content-type: application/json' \
  -d '{"key":"DB_PASSWORD","kind":"secret","visibility":"masked","value":"s3cret"}'

Секрет обязан быть masked или restricted, переменная — только plain. Имя ключа — заглавные буквы, цифры и подчёркивания, начиная с буквы.

5. Заведите сервис

Сервис — это то, что вы деплоите; без него некуда выдать учётные данные:

SERVICE=$(curl -s $BASE/projects/$PROJECT/services -H "authorization: Bearer $TOKEN" \
  -H 'content-type: application/json' \
  -d '{"name":"Billing worker","slug":"billing-worker"}' | jq -r .id)

6. Выдайте сервису identity

Identity — учётные данные одного сервиса в одном окружении. Здесь — режим universal с постоянным client secret:

curl -s $BASE/services/$SERVICE/identities -H "authorization: Bearer $TOKEN" \
  -H 'content-type: application/json' \
  -d "{\"name\":\"prod worker\",\"environmentId\":\"$ENV\",\"mode\":\"universal\",\"allowedKeys\":[\"DB_*\"]}"

Ответ содержит clientId и clientSecret — секрет показывается ровно один раз. Сохраните оба: дальше они поедут в переменные окружения сервиса. Потерянный секрет не восстанавливают, а выпускают новую identity.

Если выдача идёт через CI и client secret по дороге светится в логах или образе, используйте вместо этого режим enrollment — одноразовый токен, который сервис при первом старте меняет на постоянные учётные данные: Сервисы и identity.

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

npm i @env-master/sdk    # или bun add @env-master/sdk
import { EnvMasterClient } from "@env-master/sdk";

const em = new EnvMasterClient({
  baseUrl: process.env.ENVMASTER_URL!,
  project: "billing-api",
  environment: "production",
});

await em.loginMachine({
  clientId: process.env.ENVMASTER_CLIENT_ID!,
  clientSecret: process.env.ENVMASTER_CLIENT_SECRET!,
});

const password = await em.get("DB_PASSWORD");

Всё. Дальше значение можно менять в кабинете — сервис возьмёт актуальное при следующем старте, а с ротацией и вовсе без перезапуска.

Перенести существующий .env

ENVMASTER_TOKEN=... envmaster import .env \
  --project billing-api --env production --dry-run

Команда сама решит, что похоже на секрет, и покажет план до записи. Подробнее — в CLI.