first commit

This commit is contained in:
Bivekich
2025-06-26 06:59:19 +03:00
commit 18e1f3ffb1
124 changed files with 52448 additions and 0 deletions

View File

@ -0,0 +1,93 @@
#!/usr/bin/env node
import { readFileSync } from 'fs'
import { join } from 'path'
// Функция для загрузки .env файла
function loadEnv() {
try {
const envPath = join(process.cwd(), '.env')
const envContent = readFileSync(envPath, 'utf8')
envContent.split('\n').forEach(line => {
line = line.trim()
if (line && !line.startsWith('#')) {
const [key, ...valueParts] = line.split('=')
const value = valueParts.join('=').replace(/^["']|["']$/g, '')
if (key && value) {
process.env[key] = value
}
}
})
} catch (error) {
console.warn('⚠️ Не удалось загрузить .env файл, используем переменные окружения')
}
}
// Загружаем переменные окружения
loadEnv()
console.log('🔍 Проверка конфигурации SMS API...')
const requiredSmsVars = [
'BEELINE_SMS_USER',
'BEELINE_SMS_PASS'
]
const optionalSmsVars = [
'BEELINE_SMS_SENDER'
]
let hasErrors = false
// Проверяем обязательные переменные
requiredSmsVars.forEach(varName => {
if (!process.env[varName]) {
console.error(`❌ Отсутствует обязательная переменная: ${varName}`)
hasErrors = true
} else {
console.log(`${varName}: настроен`)
}
})
// Проверяем опциональные переменные
optionalSmsVars.forEach(varName => {
if (!process.env[varName]) {
console.warn(`⚠️ Опциональная переменная отсутствует: ${varName} (будет использовано значение по умолчанию)`)
} else {
console.log(`${varName}: ${process.env[varName]}`)
}
})
// Проверяем формат логина (должен быть числовым)
const smsUser = process.env.BEELINE_SMS_USER
if (smsUser && !/^\d+$/.test(smsUser)) {
console.error(`❌ BEELINE_SMS_USER должен быть числовым: ${smsUser}`)
hasErrors = true
}
// Проверяем длину пароля
const smsPass = process.env.BEELINE_SMS_PASS
if (smsPass && smsPass.length < 6) {
console.error(`❌ BEELINE_SMS_PASS слишком короткий (минимум 6 символов)`)
hasErrors = true
}
// Проверяем, находимся ли мы в Docker окружении
const isDocker = process.env.DOCKER_BUILD === 'true' ||
process.env.CI === 'true' ||
!process.env.BEELINE_SMS_USER
if (hasErrors) {
if (isDocker) {
console.warn('\n⚠ SMS переменные не настроены во время сборки')
console.warn('📝 Убедитесь, что они будут доступны во время выполнения')
process.exit(0) // Не блокируем сборку
} else {
console.error('\n❌ Обнаружены ошибки в конфигурации SMS API')
process.exit(1)
}
} else {
console.log('\n✅ Конфигурация SMS API корректна')
process.exit(0)
}

84
scripts/deploy.sh Executable file
View File

@ -0,0 +1,84 @@
#!/bin/bash
# Скрипт деплоя ProtekAuto CMS с SMS интеграцией
set -e
echo "🚀 Начало деплоя ProtekAuto CMS..."
# Проверяем, что мы в правильной директории
if [ ! -f "package.json" ]; then
echo "❌ Ошибка: запустите скрипт из корневой директории проекта"
exit 1
fi
# Останавливаем старые контейнеры
echo "🛑 Остановка старых контейнеров..."
docker-compose down --remove-orphans
# Проверяем переменные окружения
echo "🔍 Проверка переменных окружения..."
if [ ! -f "stack.env" ]; then
echo "❌ Файл stack.env не найден"
exit 1
fi
# Проверяем SMS конфигурацию
echo "📱 Проверка SMS конфигурации..."
source stack.env
export $(cut -d= -f1 stack.env | grep -v '^#')
# Проверяем обязательные переменные для SMS
if [ -z "$BEELINE_SMS_USER" ] || [ -z "$BEELINE_SMS_PASS" ]; then
echo "⚠️ SMS переменные не настроены. SMS функции будут недоступны."
echo " Для настройки SMS добавьте в stack.env:"
echo " BEELINE_SMS_USER=ваш_логин"
echo " BEELINE_SMS_PASS=ваш_пароль"
echo " BEELINE_SMS_SENDER=Protekauto"
echo ""
read -p "Продолжить деплой без SMS? (y/n): " -n 1 -r
echo ""
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
else
echo "✅ SMS API настроен (пользователь: $BEELINE_SMS_USER)"
fi
# Собираем новый образ
echo "🔨 Сборка Docker образа..."
docker-compose build --no-cache
# Запускаем новые контейнеры
echo "🚀 Запуск новых контейнеров..."
docker-compose up -d
# Ждем запуска
echo "⏳ Ожидание запуска сервиса..."
sleep 30
# Проверяем статус
echo "🔍 Проверка статуса сервиса..."
if docker-compose ps | grep -q "Up"; then
echo "✅ Сервис успешно запущен!"
# Проверяем SMS API если настроен
if [ ! -z "$BEELINE_SMS_USER" ] && [ ! -z "$BEELINE_SMS_PASS" ]; then
echo "📱 Проверка SMS API..."
sleep 5
if curl -s -f "http://localhost:3000/api/sms/status" > /dev/null; then
echo "✅ SMS API работает"
else
echo "⚠️ SMS API может быть недоступен"
fi
fi
echo ""
echo "🎉 Деплой завершен успешно!"
echo "🌐 CMS доступна по адресу: http://localhost:3000"
echo "📊 Мониторинг SMS: http://localhost:3000/api/sms/status"
else
echo "❌ Ошибка при запуске сервиса"
echo "Логи:"
docker-compose logs
exit 1
fi

84
scripts/startup.mjs Normal file
View File

@ -0,0 +1,84 @@
#!/usr/bin/env node
import { spawn } from 'child_process'
console.log('🚀 Запуск ProtekAuto CMS...')
// Функция для запуска команды
function runCommand(command, args = []) {
return new Promise((resolve, reject) => {
console.log(`📋 Выполняется команда: ${command} ${args.join(' ')}`)
const process = spawn(command, args, {
stdio: 'inherit',
shell: true
})
process.on('close', (code) => {
if (code === 0) {
resolve()
} else {
reject(new Error(`Команда завершилась с кодом ${code}`))
}
})
process.on('error', (error) => {
reject(error)
})
})
}
async function startup() {
try {
console.log('🔄 Проверка переменных окружения...')
const requiredEnvVars = [
'DATABASE_URL',
'NEXTAUTH_SECRET',
'AWS_ACCESS_KEY_ID',
'AWS_SECRET_ACCESS_KEY',
'AWS_S3_BUCKET',
'S3_ENDPOINT'
]
const optionalEnvVars = [
'BEELINE_SMS_USER',
'BEELINE_SMS_PASS',
'BEELINE_SMS_SENDER'
]
const missingVars = requiredEnvVars.filter(varName => !process.env[varName])
if (missingVars.length > 0) {
console.error('❌ Отсутствуют обязательные переменные окружения:')
missingVars.forEach(varName => console.error(` - ${varName}`))
process.exit(1)
}
console.log('✅ Все обязательные переменные окружения установлены')
// Проверяем опциональные переменные SMS
const missingSmsVars = optionalEnvVars.filter(varName => !process.env[varName])
if (missingSmsVars.length > 0) {
console.warn('⚠️ Отсутствуют переменные для SMS API (SMS функции будут недоступны):')
missingSmsVars.forEach(varName => console.warn(` - ${varName}`))
} else {
console.log('✅ SMS API настроен')
}
console.log('🔄 Выполнение миграций базы данных...')
await runCommand('npx', ['prisma', 'migrate', 'deploy'])
console.log('🔄 Генерация Prisma клиента...')
await runCommand('npx', ['prisma', 'generate'])
console.log('🚀 Запуск сервера...')
await runCommand('npm', ['start'])
} catch (error) {
console.error('❌ Ошибка при запуске:', error.message)
process.exit(1)
}
}
startup()

22
scripts/update-container.sh Executable file
View File

@ -0,0 +1,22 @@
#!/bin/bash
echo "🚀 Обновление контейнера CMS с новыми переменными PartsAPI..."
# Остановка контейнера
echo "⏹️ Остановка контейнера..."
docker-compose down
# Пересборка с новыми переменными
echo "🔨 Пересборка образа..."
docker-compose build --no-cache
# Запуск с обновленными переменными
echo "▶️ Запуск обновленного контейнера..."
docker-compose up -d
# Проверка статуса
echo "📊 Проверка статуса контейнера..."
docker-compose ps
echo "✅ Обновление завершено!"
echo "📝 Проверьте логи командой: docker-compose logs -f"

90
scripts/update-env.sh Executable file
View File

@ -0,0 +1,90 @@
#!/bin/bash
# Скрипт для обновления переменных окружения без пересборки образа
set -e
echo "🔄 Обновление переменных окружения..."
# Проверяем, что мы в правильной директории
if [ ! -f "package.json" ]; then
echo "❌ Ошибка: запустите скрипт из корневой директории проекта"
exit 1
fi
# Проверяем файл stack.env
if [ ! -f "stack.env" ]; then
echo "❌ Файл stack.env не найден"
exit 1
fi
# Загружаем новые переменные
echo "📂 Загрузка переменных из stack.env..."
source stack.env
export $(cut -d= -f1 stack.env | grep -v '^#')
# Проверяем SMS конфигурацию
echo "📱 Проверка SMS конфигурации..."
if [ -z "$BEELINE_SMS_USER" ] || [ -z "$BEELINE_SMS_PASS" ]; then
echo "⚠️ SMS переменные не настроены"
else
echo "✅ SMS API настроен (пользователь: $BEELINE_SMS_USER)"
echo " Отправитель: ${BEELINE_SMS_SENDER:-Protekauto}"
fi
# Перезапускаем контейнеры с новыми переменными
echo "🔄 Перезапуск контейнеров с новой конфигурацией..."
docker-compose down
docker-compose up -d
# Ждем запуска
echo "⏳ Ожидание запуска сервиса..."
sleep 15
# Проверяем статус
echo "🔍 Проверка статуса..."
if docker-compose ps | grep -q "Up"; then
echo "✅ Сервис успешно перезапущен!"
# Проверяем SMS API если настроен
if [ ! -z "$BEELINE_SMS_USER" ] && [ ! -z "$BEELINE_SMS_PASS" ]; then
echo "📱 Проверка SMS API..."
sleep 5
if curl -s -f "http://localhost:3000/api/sms/status" > /dev/null; then
echo "✅ SMS API работает"
else
echo "⚠️ SMS API может быть недоступен"
fi
fi
echo ""
echo "🎉 Обновление завершено!"
echo "🌐 CMS: http://localhost:3000"
echo "📊 SMS статус: http://localhost:3000/api/sms/status"
else
echo "❌ Ошибка при перезапуске"
docker-compose logs --tail=50
exit 1
fi
echo "🔧 Обновление переменных окружения PartsAPI..."
# Проверяем, есть ли уже переменные PartsAPI
if docker exec protekauto-cms-protekauto-cms-1 printenv | grep -q "PARTSAPI_"; then
echo "⚠️ Переменные PartsAPI уже существуют в контейнере"
docker exec protekauto-cms-protekauto-cms-1 printenv | grep "PARTSAPI_"
else
echo "❌ Переменные PartsAPI отсутствуют в контейнере!"
echo ""
echo "🔑 Нужно добавить следующие переменные в файл переменных окружения вашего сервера:"
echo ""
echo "PARTSAPI_CATEGORIES_KEY=8260834d954cf000b9d61cc31ff0655d"
echo "PARTSAPI_ARTICLES_KEY=a516f2b87c4f98c078f5e758d6d44a91"
echo "PARTSAPI_MEDIA_KEY=230d8c7118a36cc6d36d72681b76982b"
echo ""
echo "📝 После добавления переменных, перезапустите контейнер:"
echo "docker-compose down && docker-compose up -d"
fi
echo ""
echo "🔍 Текущие переменные окружения в контейнере:"
docker exec protekauto-cms-protekauto-cms-1 printenv | grep -E "(PARTSAPI_|LAXIMO_|AUTOEURO_)" || echo "Переменные API не найдены"