Конфигурация Doppler
Обзор
Doppler используется для хранения глобальных секретов — переменных, общих для всех интеграций. Секреты конкретных интеграций (API ключи CRM и т.д.) хранятся в D1.
┌─────────────────────────────────────────────────────────────────────┐
│ DOPPLER (Уровень 1) │
│ Глобальные секреты │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ШИФРОВАНИЕ: │
│ ├── CRYPTO_KEY — ключ для шифрования секретов в D1 │
│ └── CRYPTO_SALT — соль для PBKDF2 key derivation │
│ │
│ ВНЕШНИЕ СЕРВИСЫ (общие для всех интеграций): │
│ ├── OPENAI_API_KEY — OpenAI API │
│ ├── CLAUDE_API_KEY — Claude API │
│ ├── GROQ_API_KEY — Groq API │
│ └── QDRANT_URL/API_KEY — Vector store │
│ │
└─────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ CLOUDFLARE D1 (Уровень 2) │
│ Per-integration секреты │
├─────────────────────────────────────────────────────────────────────┤
│ Хранятся в таблице creds, зашифрованы CRYPTO_KEY + CRYPTO_SALT │
│ ├── sofa/NETHUNT_API_KEY │
│ ├── sofa/PLATFORM_ASSISTANT_ID │
│ └── rozetka/CRM_TOKEN │
└─────────────────────────────────────────────────────────────────────┘Полный список переменных Doppler
| Переменная | Описание | local | dev | prod |
|---|---|---|---|---|
CRYPTO_KEY | Ключ шифрования (64 hex символа) | Генерировать | Генерировать | Генерировать |
CRYPTO_SALT | Соль для шифрования (16+ символов) | Генерировать | Генерировать | Генерировать |
OPENAI_API_KEY | API ключ OpenAI | Опционально | Да | Да |
GROQ_API_KEY | API ключ Groq | Опционально | Да | Да |
PLATFORM_API_URL | URL Platform API | https://api.dev.happ.tools | https://api.dev.happ.tools | https://api.happ.tools |
PLATFORM_ACCESS_TOKEN | Токен Platform API | Да | Да | Да |
💡 D1/KV ID не хранятся в Doppler. Для local — подставляются автоматически скриптом
generate:env. Для dev/prod — указываются вwrangler.toml.tplили CI/CD.
Что нужно добавить в Doppler
Для всех окружений (local, dev, prod)
# Генерация ключа шифрования
openssl rand -hex 32
# → a75a9de60aeebfc889967594f6aa94cfd745737486a441a83dc51c10928c89a1
# Добавить в Doppler
CRYPTO_KEY=<сгенерированный-ключ>
CRYPTO_SALT=integ-core # Любая строка 16+ символовКак добавить переменные в Doppler
Через веб-интерфейс
- Откройте https://dashboard.doppler.com
- Выберите проект
integ-core - Выберите конфиг (
local,devилиprod) - Нажмите "Add Secret"
- Введите имя переменной и значение
Через CLI
# Для local
doppler secrets set CRYPTO_KEY <ключ> --config local
doppler secrets set CRYPTO_SALT integ-core --config local
# Для dev
doppler secrets set CRYPTO_KEY <ключ> --config dev
doppler secrets set CRYPTO_SALT integ-core-dev --config dev
# Для prod
doppler secrets set CRYPTO_KEY <ключ> --config prod
doppler secrets set CRYPTO_SALT integ-core-prod --config prodКак это работает
Когда вы запускаете
pnpm start sofa:generate-env.script.tsзагружает все секреты из Doppler- Подставляет placeholder ID для D1/KV в
wrangler.toml.tpl - Генерирует готовый
wrangler.toml - Копирует секреты в
.dev.vars - Запускает
wrangler dev
wrangler.tomlНЕ коммитится в git (добавлен в.gitignore)- Генерируется заново каждый раз
- Для local ID = placeholder, для dev/prod — реальные ID из wrangler.toml.tpl
Полная инструкция для разработчика
# 1. Установить Doppler CLI
# https://docs.doppler.com/docs/install
# 2. Авторизоваться — один из двух путей, см. «Доступ» ниже
doppler login && doppler setup # есть место в организации
doppler configure set token dp.st.xxx --scope . # выдали service token
# 3. Запустить проект
docker compose up -d # Запустить Docker сервисы
pnpm install # Установить зависимости
pnpm start sofa # Запустить Sofa интеграцию
# Автоматически:
# - Загружаются все секреты из Doppler (local)
# - Генерируется .dev.vars файл
# - Генерируется wrangler.toml с placeholder D1/KV ID
# - Запускается wrangler devГотово! Никаких вручную вводимых секретов не требуется.
Доступ: кому что выдавать
doppler login заводит персональную авторизацию в системном keychain и подходит только тому, у кого есть место в Doppler-организации Happ. Внешнему интегратору место не заводят — ему выдают service token.
Выдать токен интегратору
doppler configs tokens create "integrator-ivan" \
--project integ-core --config local --plain --max-age 90dТокен read-only и жёстко привязан к одному конфигу. Один токен на человека — так его можно отозвать точечно:
doppler configs tokens revoke --project integ-core --config local --name "integrator-ivan"Как интегратор его подключает
doppler configure set token dp.st.xxx --scope ~/work/integ-coreПривязка живёт в ~/.doppler/.doppler.yaml для конкретной папки. Логин не нужен, переменная в профиле не нужна. Дальше pnpm generate:env -- local работает как обычно.
generate-envдополнительно тянет проектinteg-apiради.env.api. Вызов обёрнут в try/catch и напишет «skipped» — второй токен нужен, только если интегратор поднимает integ-api в Docker у себя.
Что лежит в конфиге, который вы отдаёте
Service token read-only ограничивает доступ к Doppler, но не к тому, что внутри. Секреты в local — боевые креды на запись, и сейчас 22 из них совпадают с dev, включая:
| Ключ | Что даёт держателю |
|---|---|
CLOUDFLARE_WORKERS_API_TOKEN, CLOUDFLARE_PAGES_API_TOKEN | право деплоить воркеры и страницы |
GHCR_PAT | право пушить образы в registry |
CRYPTO_KEY, CRYPTO_SALT | расшифровка креды всех тенантов в таблице creds |
DATABASE_URL | доступ к базе |
PLATFORM_ACCESS_TOKEN, LLM-ключи | вызовы от вашего имени и ваш расход |
Перед выдачей токена наружу local должен отличаться от dev: убрать GHCR_PAT и оба CLOUDFLARE_*_API_TOKEN (локально они не нужны — деплой идёт через CI со своим токеном), сгенерировать отдельную пару CRYPTO_KEY/CRYPTO_SALT, направить DATABASE_URL на локальный docker-Postgres, выдать LLM-ключи с лимитом расхода.