Работа в CLI
Обзор
С помощью консольного клиента tuna можно получать секреты, автоматически конфигурировать текущую среду или передавать конфигурацию в env нужного приложения.
Для получения секретов через консольное приложение tuna или API необходим API-ключ пользователя или Сервисный ключ конфигурации. При локальной разработке удобнее использовать глобальные API-ключи пользователя, но для работы в CI/CD, Production и других общих средах мы настоятельно рекомендуем использовать Сервисный ключ конфигурации.
Почему tuna secrets лучше direnv при локальной разработке?
direnv - прекрасная утилита для локальной конфигурации, но она всё т аки заставляет следить за локальным файлом .env
и если на Production появились новые переменные, вы можете не сразу узнать об этом и потратить часы на бессмысленную отладку. В tuna secrets предусмотрена автоматическая синхронизация секретов, что значительно упрощает этот процесс.
Почему tuna secrets лучше Gitlab/Github/Bitbucket Variables?
На самом деле причина тут та же, что и с direnv. Например, у вас есть специальный проект предназначенный для сборки и публикации приложения с помощью goreleaser и он может требовать множество ключей и токенов для разных внешних интеграций, при этом для разных окружений и использовать для этого Gitlab/Github/Bitbucket Variables неудобно, а ещё неудобнее следить за этим, плюс сложность в разграничении пра в. В tuna secrets доступ к окружениям регулируется RBAC и вы можете точечно распределять доступ только нужным людям/роботам/скриптам. А обновив секрет или добавив новый, он сразу начнёт работать в CI.
Download
Чтобы получить секреты нужно выполнить команду:
tuna secrets download
Через дополнительные флаги или переменные окружения можно определить настройки, вроде проекта и конфигурации.
Передача проекта и конфигурации
Флаги --project
и --config
принимают на вход имя (алиас) проекта и конфигурации.
По умолчанию конфигурация сохранится в файл tuna.json
в текущем каталоге.
$ tuna secrets download --project api-php --config stage
INFO[13:57:46] Downloaded secrets to tuna.json
$ cat tuna.json
{
"API_DB": "postgres://postgres:postgres@localhost:5432/postgres",
"API_TOKEN": "PwZayIp9NpNntNYd2jkAAQgViM6dXdIm"
}
Передача формата
Можно указать в каком формате вам нужен файл json, yaml или env.
- json
- yaml
- env
$ tuna secrets download --project api-php --config stage --format json
INFO[14:01:50] Downloaded secrets to tuna.json
$ cat tuna.json
{
"API_DB": "postgres://postgres:postgres@localhost:5432/postgres",
"API_TOKEN": "PwZayIp9NpNntNYd2jkAAQgViM6dXdIm"
}
$ tuna secrets download --project api-php --config stage --format yaml
INFO[14:01:52] Downloaded secrets to tuna.yaml
$ cat tuna.yaml
API_DB: postgres://postgres:postgres@localhost:5432/postgres
API_TOKEN: PwZayIp9NpNntNYd2jkAAQgViM6dXdIm
$ tuna secrets download --project api-php --config stage --format env
INFO[14:01:43] Downloaded secrets to tuna.env
$ cat tuna.env
API_DB="postgres://postgres:postgres@localhost:5432/postgres"
API_TOKEN="PwZayIp9NpNntNYd2jkAAQgViM6dXdIm"
Свой файл
В команде можно передать путь и определить свой файл.
$ tuna secrets download --project api-php --config stage foo-bar.json
INFO[14:11:57] Downloaded secrets to foo-bar.json
Вывод в stdout
Флаг --no-file
отключает запись в файл и печатает конфигурацию на стандартный вывод.
$ tuna secrets download --project api-php --config stage --no-file --format env
API_TOKEN="PwZayIp9NpNntNYd2jkAAQgViM6dXdIm"
API_DB="postgres://postgres:postgres@localhost:5432/postgres"
Каталог для конфигурации области действия
Флаг --scope
определяет какую область действия использовать, если она определена в конфиг файле с помощью tuna secrets setup
(подробнее об этой команде описано ниже). По умолчанию .
т.е. текущий каталог.
Например у вас в конфигурации есть такое описание:
cat ~/.config/tuna/tuna.yml
secrets:
scoped:
/home/user/src/api:
project: api-php
config: stage
Это значит, что когда вы находитесь в каталоге /home/user/src/api
вам не нужно передавать --project
и --config
, так как они определяются автоматически относительно --scope=.
текущего каталога, и можно просто вызвать tuna secrets download
.
Но если вы находитесь в директории для которой область действия не определена, то вы получите ошибку:
$ pwd
/home/user/src/worker
$ tuna secrets download --format env --no-file
{"code":"BadRequest","error":"Validation failed: Incorrect value [fields=project,config]","request_id":"2wlgOjxclsn1yxVulEjPg2jKiQ5"}
Но можно передать --scope
нужного каталога, например:
$ tuna secrets download --format env --no-file --scope /home/user/src/api
API_TOKEN="PwZayIp9NpNntNYd2jkAAQgViM6dXdIm"
API_DB="postgres://postgres:postgres@localhost:5432/postgres"
Setup
Настройка каталога для конфигурации области действия. Чтобы сконфигурировать текущий каталог через меню, выполните:
tuna secrets setup
Настройка scope без меню
Как и в случае с download, в setup можно передать --project
и --config
и настроить окружение без псевдографического меню.
tuna secrets setup --project api-php --config stage
Настройка scope для не текущего каталога
Если вы хотите настроить не текущий каталог, то передайте нужный путь в флаг --scope
.
tuna secrets setup --project api-php --config stage --scope /home/user/src/api
Run
Автоматическая конфигурация приложения с передачей переменных окружения непосредственно процессу.
tuna secrets run
В этом случае tuna выступает обёрткой и запускает ваше приложение с передачей ему нужной конфигурации. Например:
tuna secrets run -- yarn start
С явной передачей конфигурации
tuna secrets run --project api-php --config stage -- yarn start
С указанием scope
tuna secrets run --scope /home/user/src/api -- yarn start
Автоматический перезапуск приложения при изменении секрета (watch)
Если передать флаг --watch
, то клиент начинает следить на изменениями секрета в API и если он меняется, то tuna перезапустит процесс с новой конфигурацией.
tuna secrets run --watch -- yarn start
Лучше всего работу продемонстрирует данное видео:
- VK Видео
- YouTube
В видео мы запускаем вот такую команду:
tuna secrets run --watch -- bash -c 'while true; do echo -n "$(date -Is) [pid: $$] ==> " ; echo ${API_TOKEN} ; sleep 1; done'