diff --git a/bin/apply_migrations.sh b/bin/apply_migrations.sh new file mode 100644 index 0000000..849a1bd --- /dev/null +++ b/bin/apply_migrations.sh @@ -0,0 +1,55 @@ +#!/bin/bash +# apply_migrations.sh - Скрипт для ручного применения миграций + +echo "🔄 Ручное применение миграций базы данных..." + +# Загрузка переменных окружения из .env +if [ -f .env ]; then + echo "📝 Загрузка переменных окружения из .env..." + export $(grep -v '^#' .env | xargs) +else + echo "⚠️ Файл .env не найден, используем значения по умолчанию" + export DB_HOST="localhost" + export DB_PORT="5432" + export DB_NAME="telegram_tinder_bot" + export DB_USERNAME="postgres" + export DB_PASSWORD="postgres" +fi + +# Проверка на существование директории миграций +if [ ! -d "migrations" ] && [ ! -d "src/database/migrations" ]; then + echo "❌ Не найдены директории с миграциями!" + exit 1 +fi + +# Вывод информации о подключении +echo "🔍 Используемые параметры подключения:" +echo "DB_HOST: $DB_HOST" +echo "DB_PORT: $DB_PORT" +echo "DB_NAME: $DB_NAME" +echo "DB_USERNAME: $DB_USERNAME" +echo "DB_PASSWORD: ********" + +# Проверка подключения к базе данных +echo "🔍 Проверка подключения к базе данных..." +if command -v pg_isready >/dev/null; then + pg_isready -h $DB_HOST -p $DB_PORT -U $DB_USERNAME + if [ $? -ne 0 ]; then + echo "❌ Не удалось подключиться к базе данных!" + exit 1 + fi +else + echo "⚠️ Утилита pg_isready не найдена, пропускаем проверку" +fi + +# Применение миграций +echo "🔄 Применение миграций с помощью node-pg-migrate..." +DATABASE_URL="postgres://$DB_USERNAME:$DB_PASSWORD@$DB_HOST:$DB_PORT/$DB_NAME" npx node-pg-migrate up + +# Проверка результата +if [ $? -eq 0 ]; then + echo "✅ Миграции успешно применены!" +else + echo "❌ Ошибка при применении миграций!" + exit 1 +fi diff --git a/bin/fix_docker.bat b/bin/fix_docker.bat new file mode 100644 index 0000000..369e494 --- /dev/null +++ b/bin/fix_docker.bat @@ -0,0 +1,100 @@ +@echo off +REM fix_docker.bat - Скрипт для устранения проблемы ContainerConfig в Windows + +echo 🔧 Устранение проблемы с Docker контейнерами... + +REM Остановка всех контейнеров проекта +echo 📥 Остановка всех контейнеров проекта... +docker-compose down -v + +REM Принудительное удаление контейнеров по имени +echo 🗑️ Принудительное удаление оставшихся контейнеров... +docker rm -f postgres-tinder adminer-tinder telegram-tinder-bot 2>NUL + +REM Очистка неиспользуемых томов и сетей +echo 🧹 Очистка неиспользуемых томов и сетей... +docker system prune -f --volumes + +REM Очистка кеша Docker +echo 🧼 Очистка кеша Docker... +docker builder prune -f + +REM Исправление docker-compose.yml +echo 📝 Создание обновленного docker-compose.yml... + +REM Создаем обновленный docker-compose.yml с использованием PowerShell +powershell -Command "& { + $content = @' +version: '3.8' + +services: + bot: + build: . + container_name: telegram-tinder-bot + restart: unless-stopped + env_file: .env + environment: + - NODE_ENV=production + - DB_HOST=${DB_HOST:-db} + - DB_PORT=${DB_PORT:-5432} + - DB_NAME=${DB_NAME:-telegram_tinder_bot} + - DB_USERNAME=${DB_USERNAME:-postgres} + - DB_PASSWORD=${DB_PASSWORD:-postgres} + volumes: + - ./uploads:/app/uploads:rw + - ./logs:/app/logs:rw + networks: + - bot-network + healthcheck: + test: [\"CMD\", \"wget\", \"--no-verbose\", \"--tries=1\", \"--spider\", \"http://localhost:3000/health\"] + interval: 30s + timeout: 5s + retries: 3 + start_period: 10s + + db: + image: postgres:15-alpine + container_name: postgres-tinder + restart: unless-stopped + environment: + - POSTGRES_DB=${DB_NAME:-telegram_tinder_bot} + - POSTGRES_USER=${DB_USERNAME:-postgres} + - POSTGRES_PASSWORD=${DB_PASSWORD:-postgres} + volumes: + - postgres_data:/var/lib/postgresql/data + ports: + - \"5433:5432\" + networks: + - bot-network + healthcheck: + test: [\"CMD-SHELL\", \"pg_isready -U ${DB_USERNAME:-postgres} -d ${DB_NAME:-telegram_tinder_bot}\"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 10s + + adminer: + image: adminer:latest + container_name: adminer-tinder + restart: unless-stopped + ports: + - \"8080:8080\" + networks: + - bot-network + +volumes: + postgres_data: + +networks: + bot-network: + driver: bridge +'@ + Set-Content -Path 'docker-compose.yml' -Value $content +}" + +echo ✅ docker-compose.yml обновлен! + +echo 🚀 Готово! Теперь вы можете запустить контейнеры снова с помощью команды: +echo docker-compose up -d + +pause diff --git a/bin/fix_docker.sh b/bin/fix_docker.sh new file mode 100644 index 0000000..8e81e22 --- /dev/null +++ b/bin/fix_docker.sh @@ -0,0 +1,117 @@ +#!/bin/bash +# fix_docker.sh - Скрипт для устранения проблемы ContainerConfig + +echo "🔧 Устранение проблемы с Docker контейнерами..." + +# Остановка всех контейнеров проекта +echo "📥 Остановка всех контейнеров проекта..." +docker-compose down -v + +# Принудительное удаление контейнеров по имени +echo "🗑️ Принудительное удаление оставшихся контейнеров..." +docker rm -f postgres-tinder adminer-tinder telegram-tinder-bot 2>/dev/null || true + +# Очистка неиспользуемых томов и сетей +echo "🧹 Очистка неиспользуемых томов и сетей..." +docker system prune -f --volumes + +# Очистка кеша Docker +echo "🧼 Очистка кеша Docker..." +docker builder prune -f + +# Исправление docker-compose.yml +echo "📝 Создание обновленного docker-compose.yml..." + +cat > docker-compose.yml << EOL +version: '3.8' + +services: + bot: + build: . + container_name: telegram-tinder-bot + restart: unless-stopped + env_file: .env + environment: + - NODE_ENV=production + - DB_HOST=${DB_HOST:-db} + - DB_PORT=${DB_PORT:-5432} + - DB_NAME=${DB_NAME:-telegram_tinder_bot} + - DB_USERNAME=${DB_USERNAME:-postgres} + - DB_PASSWORD=${DB_PASSWORD:-postgres} + volumes: + - ./uploads:/app/uploads:rw + - ./logs:/app/logs:rw + networks: + - bot-network + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/health"] + interval: 30s + timeout: 5s + retries: 3 + start_period: 10s +EOL + +# Если используем внешнюю базу данных, добавляем только adminer +if [ "${DB_HOST:-db}" != "db" ]; then + cat >> docker-compose.yml << EOL + + adminer: + image: adminer:latest + container_name: adminer-tinder + restart: unless-stopped + ports: + - "8080:8080" + networks: + - bot-network +EOL +else + # Если используем локальную базу данных, добавляем PostgreSQL и adminer + cat >> docker-compose.yml << EOL + + db: + image: postgres:15-alpine + container_name: postgres-tinder + restart: unless-stopped + environment: + - POSTGRES_DB=\${DB_NAME:-telegram_tinder_bot} + - POSTGRES_USER=\${DB_USERNAME:-postgres} + - POSTGRES_PASSWORD=\${DB_PASSWORD:-postgres} + volumes: + - postgres_data:/var/lib/postgresql/data + ports: + - "5433:5432" + networks: + - bot-network + healthcheck: + test: ["CMD-SHELL", "pg_isready -U \${DB_USERNAME:-postgres} -d \${DB_NAME:-telegram_tinder_bot}"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 10s + + adminer: + image: adminer:latest + container_name: adminer-tinder + restart: unless-stopped + ports: + - "8080:8080" + networks: + - bot-network +EOL +fi + +# Завершаем файл docker-compose.yml +cat >> docker-compose.yml << EOL + +volumes: + postgres_data: + +networks: + bot-network: + driver: bridge +EOL + +echo "✅ docker-compose.yml обновлен!" + +echo "🚀 Готово! Теперь вы можете запустить контейнеры снова с помощью команды:" +echo "docker-compose up -d" diff --git a/bin/fix_line_endings.sh b/bin/fix_line_endings.sh new file mode 100644 index 0000000..c6982c9 --- /dev/null +++ b/bin/fix_line_endings.sh @@ -0,0 +1,15 @@ +#!/bin/bash +# fix_line_endings.sh - Script to fix line endings in shell scripts + +echo "🔧 Fixing line endings in shell scripts..." + +# Fix shell scripts +for file in $(find . -name "*.sh"); do + echo "📄 Processing $file..." + tr -d '\r' < "$file" > "$file.fixed" + mv "$file.fixed" "$file" + chmod +x "$file" + echo "✅ Fixed $file" +done + +echo "🚀 All shell scripts fixed!" diff --git a/build-fix.bat b/build-fix.bat new file mode 100644 index 0000000..77e94dd --- /dev/null +++ b/build-fix.bat @@ -0,0 +1,59 @@ +@echo off +REM build-fix.bat - Скрипт для исправления проблем сборки в Docker для Windows + +echo ================================================== +echo Проверка и исправление проблем сборки +echo ================================================== + +REM Проверяем наличие Dockerfile +if not exist Dockerfile ( + echo ОШИБКА: Dockerfile не найден в текущей директории! + exit /b 1 +) + +REM Проверяем команду сборки в Dockerfile +echo Проверка конфигурации Dockerfile... + +findstr /c:"RUN npm run build" Dockerfile > nul +if %errorlevel% equ 0 ( + findstr /c:"RUN npm run build:linux" Dockerfile > nul + if %errorlevel% neq 0 ( + echo Найдена проблема: Dockerfile использует 'npm run build', что не работает в контейнере Linux + echo Исправление: заменяем на 'npm run build:linux'... + + REM Создаем резервную копию + copy Dockerfile Dockerfile.bak + + REM Заменяем команду + powershell -Command "(Get-Content Dockerfile) -replace 'RUN npm run build', 'RUN npm run build:linux' | Set-Content Dockerfile" + + echo ✅ Dockerfile обновлен. Резервная копия сохранена как Dockerfile.bak + ) else ( + echo ✅ Dockerfile уже использует корректную команду сборки + ) +) else ( + echo ✅ Команда сборки не найдена в Dockerfile +) + +REM Проверка команды сборки в package.json +if exist package.json ( + findstr /c:"\"build:linux\":" package.json > nul + if %errorlevel% equ 0 ( + echo ✅ В package.json уже определена команда build:linux + ) else ( + echo В package.json отсутствует команда build:linux + echo Рекомендуем добавить команду build:linux вручную: + echo Найдите строку с "build": "tsc && xcopy /E /I src\\locales dist\\locales" + echo И добавьте после нее: + echo "build:linux": "tsc && cp -R src/locales dist/", + ) +) else ( + echo ПРЕДУПРЕЖДЕНИЕ: package.json не найден в текущей директории! +) + +echo ================================================== +echo Проверка и исправление завершены! +echo ================================================== +echo Для применения изменений выполните: docker-compose build + +pause diff --git a/build-fix.sh b/build-fix.sh new file mode 100644 index 0000000..71f6c62 --- /dev/null +++ b/build-fix.sh @@ -0,0 +1,70 @@ +#!/bin/bash +# build-fix.sh - Скрипт для исправления проблем сборки в Docker + +# Цвета для вывода +GREEN='\033[0;32m' +YELLOW='\033[0;33m' +RED='\033[0;31m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +echo -e "${BLUE}==================================================${NC}" +echo -e "${BLUE} Проверка и исправление проблем сборки ${NC}" +echo -e "${BLUE}==================================================${NC}" + +# Проверяем наличие Dockerfile +if [ ! -f Dockerfile ]; then + echo -e "${RED}ОШИБКА: Dockerfile не найден в текущей директории!${NC}" + exit 1 +fi + +# Проверяем команду сборки в package.json и Dockerfile +echo -e "${YELLOW}Проверка конфигурации сборки...${NC}" + +# Проверка команды сборки в Dockerfile +if grep -q "RUN npm run build" Dockerfile && ! grep -q "RUN npm run build:linux" Dockerfile; then + echo -e "${YELLOW}Найдена проблема: Dockerfile использует 'npm run build', что не работает в контейнере Linux${NC}" + echo -e "${BLUE}Исправление: заменяем на 'npm run build:linux'...${NC}" + + # Создаем резервную копию + cp Dockerfile Dockerfile.bak + + # Заменяем команду + sed -i "s/RUN npm run build/RUN npm run build:linux/g" Dockerfile + + echo -e "${GREEN}✅ Dockerfile обновлен. Резервная копия сохранена как Dockerfile.bak${NC}" +else + echo -e "${GREEN}✅ Dockerfile уже использует корректную команду сборки${NC}" +fi + +# Проверка команды сборки в package.json +if [ -f package.json ]; then + if grep -q "\"build:linux\":" package.json; then + echo -e "${GREEN}✅ В package.json уже определена команда build:linux${NC}" + else + echo -e "${YELLOW}В package.json отсутствует команда build:linux${NC}" + echo -e "${BLUE}Добавляем команду build:linux...${NC}" + + # Создаем резервную копию + cp package.json package.json.bak + + # Получаем текущую команду build + build_cmd=$(grep -o '"build": "[^"]*"' package.json | sed 's/"build": "\(.*\)"/\1/') + + # Создаем версию для Linux, заменяя xcopy на cp -R + linux_build_cmd=$(echo "$build_cmd" | sed 's/xcopy \/E \/I/cp -R/g' | sed 's/\\\\/\//g') + + # Добавляем команду build:linux, если она не существует + if [[ "$linux_build_cmd" != "$build_cmd" ]]; then + sed -i "/\"build\":/a \ \"build:linux\": \"${linux_build_cmd}\"," package.json + echo -e "${GREEN}✅ Команда build:linux добавлена в package.json${NC}" + fi + fi +else + echo -e "${RED}ПРЕДУПРЕЖДЕНИЕ: package.json не найден в текущей директории!${NC}" +fi + +echo -e "${BLUE}==================================================${NC}" +echo -e "${GREEN}Проверка и исправление завершены!${NC}" +echo -e "${BLUE}==================================================${NC}" +echo -e "${YELLOW}Для применения изменений выполните: docker-compose build${NC}" diff --git a/docs/docker_fix.md b/docs/docker_fix.md new file mode 100644 index 0000000..6dd374b --- /dev/null +++ b/docs/docker_fix.md @@ -0,0 +1,80 @@ +# Решение проблемы с Docker-контейнерами + +## Проблема +При запуске контейнеров через Docker Compose возникает ошибка `KeyError: 'ContainerConfig'`. Эта ошибка появляется из-за несовместимости между версиями Docker, Docker Compose и структурой docker-compose.yml. + +## Решение + +### 1. Очистка окружения Docker + +На сервере выполните следующие команды, чтобы полностью очистить окружение Docker: + +```bash +# Остановка и удаление контейнеров +docker-compose down -v + +# Принудительное удаление контейнеров по имени +docker rm -f postgres-tinder adminer-tinder telegram-tinder-bot + +# Очистка неиспользуемых томов и сетей +docker system prune -f --volumes + +# Очистка кеша Docker +docker builder prune -f +``` + +### 2. Исправление проблем с переносами строк + +Файлы, созданные в Windows и перенесенные в Linux, могут содержать неправильные символы переноса строки. + +```bash +# Исправление переносов строк в shell-скриптах +find . -name "*.sh" -type f -exec sh -c 'tr -d "\r" < "$1" > "$1.fixed" && mv "$1.fixed" "$1" && chmod +x "$1"' -- {} \; +``` + +### 3. Обновление docker-compose.yml + +Создайте новый docker-compose.yml с исправленной структурой: + +```bash +# Запустите скрипт для исправления проблем с Docker +./bin/fix_docker.sh +``` + +### 4. Запуск с полностью чистым окружением + +После выполнения всех исправлений запустите контейнеры заново: + +```bash +docker-compose up -d +``` + +## Альтернативное решение + +Если проблема сохраняется, можно попробовать запустить контейнеры по отдельности: + +```bash +# Сначала запустить базу данных (если она нужна) +docker-compose up -d db + +# Дождаться запуска базы данных +sleep 10 + +# Запустить бота +docker-compose up -d bot + +# Запустить adminer +docker-compose up -d adminer +``` + +## Проверка работы миграций + +После запуска контейнеров проверьте, что миграции базы данных применяются правильно: + +```bash +# Просмотр логов контейнера бота +docker logs telegram-tinder-bot + +# Если миграции не применяются, можно запустить их вручную внутри контейнера +docker exec -it telegram-tinder-bot sh -c "DATABASE_URL=postgres://$DB_USERNAME:$DB_PASSWORD@$DB_HOST:$DB_PORT/$DB_NAME npx node-pg-migrate up" +``` diff --git a/scripts/startup.sh b/scripts/startup.sh index 91baee3..0353073 100644 --- a/scripts/startup.sh +++ b/scripts/startup.sh @@ -27,7 +27,56 @@ sleep 5 # Run database migrations echo "🔄 Running database migrations..." -node dist/database/migrateOnStartup.js + +# Create migrations directory structure +mkdir -p dist/database/migrations + +# Copy any available migrations +if [ -d "src/database/migrations" ]; then + echo "� Found SQL migrations. Copying..." + cp -R src/database/migrations/* dist/database/migrations/ 2>/dev/null || echo "No SQL migrations to copy" +fi + +# Copy JS migrations if available +if [ -d "migrations" ]; then + echo "📂 Found JS migrations. Copying..." + mkdir -p migrations-temp + cp migrations/*.js migrations-temp/ 2>/dev/null || echo "No JS migrations to copy" + # Move JS migrations to dist/database/migrations + cp migrations-temp/*.js dist/database/migrations/ 2>/dev/null || echo "No JS migrations to copy to dist" +fi + +# Display environment variables for debugging (without passwords) +echo "🔍 Environment variables for database connection:" +echo "DB_HOST: $DB_HOST" +echo "DB_PORT: $DB_PORT" +echo "DB_NAME: $DB_NAME" +echo "DB_USERNAME: $DB_USERNAME" + +# Run migrations using node-pg-migrate +echo "🔄 Running migrations with node-pg-migrate..." +DATABASE_URL="postgres://$DB_USERNAME:$DB_PASSWORD@$DB_HOST:$DB_PORT/$DB_NAME" npx node-pg-migrate up + +# Verify connection to database +echo "🔍 Verifying database connection..." +node -e " +const { Pool } = require('pg'); +const pool = new Pool({ + host: process.env.DB_HOST, + port: process.env.DB_PORT, + database: process.env.DB_NAME, + user: process.env.DB_USERNAME, + password: process.env.DB_PASSWORD +}); +pool.query('SELECT NOW()', (err, res) => { + if (err) { + console.error('❌ Database connection failed:', err.message); + process.exit(1); + } else { + console.log('✅ Database connection successful:', res.rows[0].now); + pool.end(); + } +});" || echo "❌ Failed to verify database connection" # Start the bot echo "✅ Starting the bot..."