# 🗝️ Секреты целиком из консоли — большое обновление tuna secrets

September 24, 2026 · 4 min read

До недавнего времени [секреты](https://tuna.am/en/docs/secrets.md) в консоли умели немного: скачать конфигурацию, привязать каталог и запустить приложение с переменными окружения. Всё остальное — завести секрет, поправить значение, создать окружение — приходилось делать в личном кабинете.

В **tuna-cli 0.35** `tuna secrets` стал полноценным инструментом: секретами, проектами, окружениями и сервисными ключами теперь можно управлять целиком из терминала, а вывод команд удобно разбирать в скриптах и CI.

## Работа с отдельными секретами

Появились команды для чтения и записи секретов по одному:

```shell
tuna secrets list                               # список, значения скрыты
tuna secrets get API_TOKEN DB_URL               # значения конкретных секретов
tuna secrets set API_ENABLED=true --type boolean
openssl rand -hex 32 | tuna secrets set API_TOKEN
tuna secrets delete OLD_KEY
tuna secrets upload .env                        # дополнить конфигурацию из файла

```

`set` принимает значение аргументом, из stdin или интерактивно — так в историю шелла не попадёт ничего лишнего. Можно задать тип значения, комментарий и видимость в веб-интерфейсе. `upload` дополняет конфигурацию из `.env` или `.json`, не трогая остальные секреты.

## Сравнить окружения, не раскрывая значений

В таблицах вместо значения секрета теперь печатается его **отпечаток** — `hmac:cea41705`. Одинаковые значения дают одинаковый отпечаток, а восстановить значение из отпечатка нельзя.

Так можно ответить на вопрос «а в stage и prod точно разные пароли к базе?», ничего не раскрывая, и спокойно печатать таблицы в логи CI:

Настоящие значения показывают `list --values` и `get`.

## Новый разработчик — одна команда

Положите в корень репозитория файл `tuna.yaml`:

tuna.yaml

```yaml
setup:
  - project: api-php
    config: dev

```

Теперь новому человеку в команде достаточно выполнить `tuna secrets setup` — и `tuna secrets run -- yarn start` запустит приложение с актуальными секретами. Для монорепозитория можно описать несколько привязок, каждую со своим каталогом.

## Секреты файлом, но без файла на диске

Некоторые приложения читают конфигурацию только из файла. Раньше приходилось выгружать секреты через `download` и помнить, что файл потом надо удалить. Флаг `--mount` решает это иначе: клиент создаёт **именованный канал** (named pipe) и отдаёт через него секреты в нужном формате — `env`, `json`, `yaml` или по вашему шаблону. Значения живут только в памяти клиента, файла с секретами на диске не появляется, а после выхода процесса канал удаляется.

```shell
tuna secrets run --mount ./secrets.json --mount-format json -- ./app --config ./secrets.json

```

С `--mount-max-reads 1` канал исчезает сразу после того, как приложение прочитало его при старте.

## Работа без сети

`tuna secrets run` сохраняет последние полученные секреты в **зашифрованный** файл и использует его, если API недоступен, — приложение не встанет из-за проблем с сетью. Если же сервер ответил, что доступ отозван или конфигурации больше нет, копия удаляется: устаревшие секреты после отзыва доступа опаснее, чем остановка приложения.

С `--offline` клиент вообще не обращается к API:

## Шаблоны конфигов

`tuna secrets substitute` рендерит файл-шаблон со значениями секретов. Подходит для конфигов со своим форматом — `nginx.conf`, `application.yml`, `.ini` — и для манифестов Kubernetes:

```shell
tuna secrets substitute config.tmpl --output config.ini
tuna secrets substitute deployment.tmpl | kubectl apply -f -

```

Опечатка в имени секрета — ошибка с указанием места в шаблоне, а не молчаливая пустая строка в конфиге.

## Удобно в скриптах и CI

Вывод всех команд `tuna secrets` переделан с расчётом на автоматизацию:

* данные идут в stdout, статус и ошибки — в stderr, так что вывод можно смело перенаправлять в файл или пайп;
* `-o json` и `-o yaml` есть у каждой подкоманды, включая команды записи, а ошибки в этом режиме тоже приходят JSON'ом;
* `get --plain` печатает голое значение для подстановки: `docker login -p "$(tuna secrets get REGISTRY_PASSWORD --plain)"`;
* `tuna secrets run` возвращает код выхода дочернего процесса, поэтому обёртку можно ставить прямо в CI-джобу.

Готовые примеры для GitLab CI и GitHub Actions есть в [документации](https://tuna.am/en/docs/secrets/examples.md).

## Управление структурой

Проекты, окружения, конфигурации и сервисные ключи теперь тоже создаются из консоли:

```shell
tuna secrets projects create "API PHP" --slug api-php
tuna secrets environments create Staging --slug stage --project api-php
tuna secrets configs clone stage --name stage-feature-x --project api-php
tuna secrets configs tokens create --description ci --access read --max-age 720h --project api-php --config stage

```

`tuna secrets open` открывает текущую конфигурацию в веб-интерфейсе — когда всё-таки нужен кабинет.

## Что проверить при обновлении

* Удаление секретов, конфигураций, окружений, проектов и отзыв сервисных ключей с tuna-cli 0.36 спрашивают подтверждение. В CI и скриптах добавьте флаг `--yes`, иначе команда завершится ошибкой.
* Если вы разбирали вывод `tuna secrets` в скриптах, проверьте их: строки лога вида `INFO[...]` заменены таблицами, а для машинного разбора теперь есть `-o json`.

Полное описание команд и флагов — на странице [Работа в CLI](https://tuna.am/en/docs/secrets/cli.md). Обновить клиент можно по [инструкции](https://tuna.am/en/docs/guides/update.md).

## Leave feedback

If you enjoy using Tuna, or on the contrary you are not happy with something, please [leave feedback](https://my.tuna.am/?show_feedback=1).

![](/blog/img/2024-08-22/feedback.gif)

## Help

We value our users and carefully review every request. If you have any problems with tuna, please contact us in one of the following ways:

* [Email](mailto:info@tuna.am)
* [Telegram community](https://telegram.me/+Kgbtt0_gJwI5ZmEy)

**Tags:**

* [release](https://tuna.am/en/blog/tags/release)
* [tuna](https://tuna.am/en/blog/tags/tuna)
* [cli](https://tuna.am/en/blog/tags/cli)
* [secrets](https://tuna.am/en/blog/tags/secrets)
