wl·solution
Гайды · Безопасность
5 мин чтенияобновлено 2026-06-30

Шифрование секретов: SECRETS_KEY, AES-GCM, recovery

Как устроен Vault: AES-GCM на 256-битном мастер-ключе, как добавлять секреты, что делать если ключ потерян.

Все токены провайдеров (Hetzner/OVH/Vultr/DO), API-ключи (Stripe, Resend, Twilio), SSH-ключи и Cloudflare-токен хранятся в одной таблице platform_settings, зашифрованные ключом из переменной окружения SECRETS_KEY.

Шифрование — AES-256-GCM (см. api/internal/secrets/secrets.go). Без правильного SECRETS_KEY содержимое таблицы — мусор; именно поэтому потеря ключа = операторская катастрофа.

Откуда брать SECRETS_KEY

Сгенерируйте 32 байта случайных данных и закодируйте в base64. На macOS/Linux: openssl rand -base64 32

Положите значение в файл .env рядом с docker-compose.yml: SECRETS_KEY=<полученная_строка>. НИКОГДА не коммитьте этот файл — у нас в /Users/user/Desktop/storage-p лежит для этого vault.

Что считается секретом

В settings.go явно перечислен whitelist plaintext-ключей — туда попадают только не-секретные значения: endpoint, zone_id, apex_domain, выбор активного провайдера и т.п. Всё остальное (токены, пароли) шифруется по дефолту.

Если оператор добавляет новый ключ — сначала он попадает в Editable, а потом, если значение не секрет, в plaintext.

Если SECRETS_KEY потерян

Зашифрованные строки нельзя восстановить. Единственный путь — удалить все зашифрованные строки из platform_settings (plaintext-строки можно оставить) и попросить оператора ввести токены заново через /admin/settings.

После этого сгенерируйте новый SECRETS_KEY и перезапустите api + worker. Старые plaintext-настройки (apex_domain, endpoint и т.п.) сохранятся без правок.

Ротация ключа

Ротация требует re-encrypt'а всех записей: расшифровать старым ключом, зашифровать новым, обновить строку. Сейчас сделано вручную SQL'ом; пол-флага планируем превратить в эндпоинт POST /admin/secrets/rotate с старым+новым ключами.

Связанные гайды

Хотите развернуть свой тенант на wl-installer?

Аренда: 5 минут от заказа до боевого URL. Покупка с исходниками: 1–5 рабочих дней.