Быстрый старт
От пустой установки до сервиса, который сам читает пароль от базы. Каждый шаг — рабочая команда; переменные, появившиеся на одном шаге, используются на следующих.
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.