Корпоративная утилита для синхронизации переменных окружения из Infisical и автоматического перезапуска Docker-контейнеров при их изменении.
- Получение секретов из Infisical с помощью SDK
- Автоматическое сохранение в .env файлы
- Отслеживание изменений переменных окружения
- Перезапуск Docker-контейнеров при обновлении .env
- Поддержка глобальных и индивидуальных настроек для каждого сервиса
- Docker и Docker Compose
- Доступ к Docker socket (/var/run/docker.sock)
- Учетная запись Infisical с настроенными Client ID и Client Secret
- Создайте директорию проекта:
mkdir -p infisical-docker-sync/envs
cd infisical-docker-sync
- Создайте файл
docker-compose.yml
:
version: '3.8'
services:
infisical-docker-sync:
image: ghcr.io/webzaytsev/infisical-docker-sync:latest
container_name: infisical-docker-sync
volumes:
- ./config.yaml:/app/config.yaml
- ./envs:/app/envs
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Europe/Moscow
- CONFIG_PATH=/app/config.yaml
restart: unless-stopped
- Создайте файл
config.yaml
:
siteUrl: "https://app.infisical.com"
clientId: "ваш-client-id"
clientSecret: "ваш-client-secret"
syncInterval: 60 # интервал проверки в секундах
logLevel: "info" # уровень логирования: debug, info, none
defaultReloadPolicy: "compose" # политика перезагрузки по умолчанию: restart, recreate или compose
services:
- name: "сервис1"
container: "имя_контейнера_1"
envFile: "сервис1.env"
projectId: "проект-для-сервиса-1"
environment: "dev"
reloadPolicy: "restart" # можно указать индивидуальную политику
- name: "сервис2"
container: "имя_контейнера_2"
envFile: "сервис2.env"
projectId: "проект-для-сервиса-2"
environment: "prod"
reloadPolicy: "compose" # лучший вариант для контейнеров в docker-compose
overrides:
clientId: "индивидуальный-client-id" # опционально
- Запустите сервис:
docker-compose up -d
Параметр | Описание | Обязательный | По умолчанию |
---|---|---|---|
siteUrl | URL Infisical | Да | - |
clientId | Client ID для Infisical | Да | - |
clientSecret | Client Secret для Infisical | Да | - |
syncInterval | Интервал синхронизации (секунды) | Нет | 60 |
logLevel | Уровень логирования (debug, info, none) | Нет | info |
defaultReloadPolicy | Политика перезагрузки (restart, recreate, compose) | Нет | recreate |
services | Массив обслуживаемых сервисов | Да | - |
Параметр | Описание | Обязательный |
---|---|---|
name | Имя сервиса | Да |
container | Имя Docker-контейнера | Да |
envFile | Имя файла .env (будет создан в директории envs) | Да |
projectId | ID проекта в Infisical | Да |
environment | Окружение в Infisical (dev, staging, prod) | Да |
syncInterval | Индивидуальный интервал синхронизации | Нет |
reloadPolicy | Политика перезагрузки для сервиса (restart, recreate, compose) | Нет |
overrides | Переопределение глобальных параметров | Нет |
docker logs -f infisical-docker-sync
docker ps | grep infisical-docker-sync
# Остановите контейнер
docker-compose down
# Обновите образ
docker pull ghcr.io/webzaytsev/infisical-docker-sync:latest
# Запустите снова
docker-compose up -d
Infisical Docker Sync работает в фоновом режиме и выполняет следующие действия:
- Загружает конфигурацию из config.yaml
- Инициализирует подключение к Infisical для каждого сервиса
- Периодически проверяет обновления секретов
- При изменении секретов:
- Обновляет соответствующий .env файл
- Перезапускает связанный Docker-контейнер согласно указанной политике:
restart
: Простой перезапуск контейнера без пересозданияrecreate
: Полное пересоздание контейнера (удаление и создание заново)compose
: Умный режим для контейнеров, управляемых через docker-compose
- restart: Простой перезапуск контейнера. Быстрый, но не всегда подхватывает изменения окружения.
- recreate: Полное пересоздание контейнера. Надежно, но может быть медленнее.
- compose: Интеллектуальное определение, запущен ли контейнер через docker-compose. Если да, автоматически запускает
docker compose up -d
в нужной директории. Рекомендуется для контейнеров, управляемых через docker-compose.
Убедитесь, что:
- Docker socket смонтирован корректно:
/var/run/docker.sock:/var/run/docker.sock
- У пользователя есть права на доступ к Docker socket
Проверьте:
- Правильность Client ID и Client Secret
- Доступность Infisical API
- Корректность Project ID и названия окружения
- Логи контейнера для получения подробной информации
Проверьте:
- Правильность имен контейнеров в config.yaml
- Наличие доступа к Docker API
- Статус Docker демона
- Храните config.yaml в безопасном месте с ограниченным доступом
- Используйте клиентские ключи Infisical с минимально необходимыми правами
- Ограничьте доступ к директории envs с .env файлами
Для производственной среды рекомендуется:
- Использовать фиксированную версию образа вместо latest
- Настроить мониторинг состояния контейнера
- Настроить оповещения при сбоях
- Использовать Docker secrets или другие способы защиты конфиденциальных данных
MIT