diff --git a/DOCKER.md b/DOCKER.md index 3b8bff9..6215f08 100644 --- a/DOCKER.md +++ b/DOCKER.md @@ -19,6 +19,7 @@ docker run -d \ --name s3-lists-manager \ -p 3001:3001 \ + -e ENCRYPTION_KEY=your-64-hex-character-key-here \ git.shts.su/[repository]:latest ``` @@ -27,6 +28,7 @@ docker run -d \ docker run -d \ --name s3-lists-manager-tabler \ -p 3001:3001 \ + -e ENCRYPTION_KEY=your-64-hex-character-key-here \ git.shts.su/[repository]:tabler ``` @@ -40,6 +42,7 @@ docker rm s3-lists-manager docker run -d \ --name s3-lists-manager \ -p 3001:3001 \ + -e ENCRYPTION_KEY=your-64-hex-character-key-here \ git.shts.su/[repository]:latest ``` @@ -51,6 +54,7 @@ docker rm s3-lists-manager-tabler docker run -d \ --name s3-lists-manager-tabler \ -p 3001:3001 \ + -e ENCRYPTION_KEY=your-64-hex-character-key-here \ git.shts.su/[repository]:tabler ``` @@ -70,6 +74,7 @@ services: restart: unless-stopped environment: - NODE_ENV=production + - ENCRYPTION_KEY=${ENCRYPTION_KEY} # Обязательно! Используйте .env файл или secrets s3-lists-manager-tabler: image: git.shts.su/[repository]:tabler @@ -79,6 +84,12 @@ services: restart: unless-stopped environment: - NODE_ENV=production + - ENCRYPTION_KEY=${ENCRYPTION_KEY} # Обязательно! Используйте .env файл или secrets +``` + +**Создайте файл `.env` в той же директории:** +```bash +ENCRYPTION_KEY=your-64-hex-character-key-here ``` Запуск: @@ -88,10 +99,31 @@ docker-compose up -d ## 🔧 Переменные окружения -| Переменная | Описание | По умолчанию | -|------------|----------|--------------| -| `NODE_ENV` | Окружение Node.js | `production` | -| `PORT` | Порт для запуска сервера | `3001` | +| Переменная | Описание | По умолчанию | Обязательная | +|------------|----------|--------------|--------------| +| `NODE_ENV` | Окружение Node.js | `production` | Нет | +| `PORT` | Порт для запуска сервера | `3001` | Нет | +| `ENCRYPTION_KEY` | Ключ шифрования для IPSec паролей (64 hex символа) | - | **Да** | + +### ENCRYPTION_KEY + +**Важно**: `ENCRYPTION_KEY` является обязательным параметром для работы с IPSec паролями. Этот ключ используется для шифрования/дешифрования паролей, хранящихся в S3. + +**Генерация ключа:** +```bash +node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" +``` + +**Пример запуска с ENCRYPTION_KEY:** +```bash +docker run -d \ + --name s3-lists-manager \ + -p 3001:3001 \ + -e ENCRYPTION_KEY=your-64-hex-character-key-here \ + git.shts.su/[repository]:latest +``` + +**⚠️ Внимание**: Используйте один и тот же `ENCRYPTION_KEY` для всех запусков контейнера. При изменении ключа старые зашифрованные пароли не смогут быть расшифрованы. ## 📊 Мониторинг diff --git a/Dockerfile.fast b/Dockerfile.fast index 209bad0..b98f143 100644 --- a/Dockerfile.fast +++ b/Dockerfile.fast @@ -50,6 +50,11 @@ COPY backend/services ./services COPY backend/utils ./utils COPY --from=frontend-builder /app/frontend/dist ./public +# ENCRYPTION_KEY должен быть установлен через переменные окружения при запуске контейнера +# Это обязательный параметр для работы с IPSec паролями +# Пример: docker run -e ENCRYPTION_KEY=your-64-hex-character-key ... +# Для генерации ключа: node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" + EXPOSE 3001 USER nonroot CMD ["server.js"] \ No newline at end of file diff --git a/backend/utils/encryption.js b/backend/utils/encryption.js index 413d655..9e0cf76 100644 --- a/backend/utils/encryption.js +++ b/backend/utils/encryption.js @@ -5,21 +5,38 @@ const crypto = require('crypto'); -// Ключ шифрования из переменной окружения -const ENCRYPTION_KEY = process.env.ENCRYPTION_KEY || crypto.randomBytes(32).toString('hex'); +// Ключ шифрования из переменной окружения (обязателен для работы с IPSec паролями) +const ENCRYPTION_KEY = process.env.ENCRYPTION_KEY; + +if (!ENCRYPTION_KEY) { + console.warn('WARNING: ENCRYPTION_KEY is not set. IPSec password encryption/decryption will fail.'); + console.warn('Please set ENCRYPTION_KEY environment variable (64 hex characters for AES-256).'); + console.warn('You can generate a key with: node -e "console.log(require(\'crypto\').randomBytes(32).toString(\'hex\'))"'); +} + const ALGORITHM = 'aes-256-gcm'; /** * Получить ключ шифрования (32 байта) */ function getEncryptionKey() { - // Если ENCRYPTION_KEY - hex строка, конвертируем в Buffer - if (ENCRYPTION_KEY.length === 64) { - return Buffer.from(ENCRYPTION_KEY, 'hex'); + if (!ENCRYPTION_KEY) { + throw new Error('ENCRYPTION_KEY environment variable is not set. Cannot encrypt/decrypt IPSec passwords.'); } - // Иначе используем как есть и дополняем/обрезаем до 32 байт + + // Если ENCRYPTION_KEY - hex строка (64 символа для 32 байт), конвертируем в Buffer + if (ENCRYPTION_KEY.length === 64) { + try { + return Buffer.from(ENCRYPTION_KEY, 'hex'); + } catch (error) { + throw new Error(`Invalid ENCRYPTION_KEY format: not a valid hex string. ${error.message}`); + } + } + + // Иначе используем как UTF-8 строку и дополняем/обрезаем до 32 байт const key = Buffer.from(ENCRYPTION_KEY, 'utf8'); if (key.length === 32) return key; + // Дополняем или обрезаем до 32 байт const result = Buffer.alloc(32); key.copy(result, 0, 0, Math.min(key.length, 32));