# Переменные и секреты

> Как хранить ключи, пароли и настройки для функций проекта и как функции их читают.

> Оглавление всей документации: https://docs.getxflow.com/llms.txt

Переменная окружения это пара «имя и значение» для облачных функций проекта: пароль от почты,
ключ чужого API, адрес сервиса. Значения хранятся на платформе, а не в коде. Приложения
переменных не получают.

## Команды

| Команда | Что делает |
|---|---|
| `xflow env` | список переменных: имя и для кого она |
| `xflow env set ИМЯ=значение` | записать переменную или заменить значение |
| `xflow env rm ИМЯ` | удалить переменную |
| `xflow env check` | сверить код функций с тем, что записано на платформе |

```bash
xflow env set SMTP_PASSWORD=секрет --scope project
xflow env check
xflow deploy functions
```

`env set` и `env check` запускают в папке проекта, `env` и `env rm` работают и с
`--project <id>`. Записывать и удалять может уровень «Редактирование», с «Просмотром» видны
только имена.

Новое значение получат функции, выложенные после записи: нужен `xflow deploy functions`. До
этого функции держат прежнее значение, удалённую переменную тоже видят до новой выкладки.
После `env set` CLI подсказывает, какие функции читают переменную.

## Для кого переменная

| Флаг | Кто получает |
|---|---|
| `--scope organization` | функции всех проектов организации (по умолчанию) |
| `--scope project` | функции только этого проекта |

Другое слово после `--scope` отклоняется. Для одного проекта выбирайте `--scope project`.
Переменную на организацию записывает только тот, кому открыты на правку все проекты, иначе
ответ `organization_scope_denied`: запишите на проект или попросите Админа.

Имя уникально в организации. Команды видят только переменные, доступные проекту, поэтому
`env rm` назовёт переменную чужого проекта отсутствующей. `DATABASE_URL` и всё, что начинается с
`XFLOW`, заполняет платформа, записать их нельзя.

## Как читать в коде

Только буквальным именем:

```ts
const password = process.env.SMTP_PASSWORD
const token = process.env['WB_TOKEN']
```

Платформа передаёт функции только переменные, имена которых написаны в её коде целиком. Такие
формы значение не получат, и сборка функций с ними отклоняется:

```ts
const { SMTP_PASSWORD } = process.env      // деструктуризация
const value = process.env[name]            // имя из выражения
const value = process.env?.SMTP_PASSWORD   // через ?.
const all = { ...process.env }             // разворот целиком
```

`xflow env check` находит их заранее с файлом и строкой, а ещё переменные, которых нет на
платформе (до записи функция получает `undefined`).

## Хранение и ключи в коде

Значения хранятся зашифрованными и не возвращаются: ни в `xflow env`, ни в API, ни в логах.
Забытое значение не прочитать, запишите новое.

Ключи, токены и пароли не пишут в исходники: код видят участники проекта, а ключ в коде
приложения уезжает в браузер каждому посетителю. Сборка останавливается, если находит ключ
знакомого вида: ключи xflow, Stripe, AWS, OpenAI, GitHub, OAuth-токены Яндекса и похожие.
Незнакомый сборке ключ тоже не должен попадать в код.

Ключи привязанных интеграций появляются среди переменных сами, только для чтения:
[Интеграции](https://docs.getxflow.com/platform/integrations.md).
