docker fix

This commit is contained in:
2025-09-18 16:47:07 +09:00
parent 29d6255f22
commit fdd0580554
8 changed files with 546 additions and 1 deletions

55
bin/apply_migrations.sh Normal file
View File

@@ -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

100
bin/fix_docker.bat Normal file
View File

@@ -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

117
bin/fix_docker.sh Normal file
View File

@@ -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"

15
bin/fix_line_endings.sh Normal file
View File

@@ -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!"

59
build-fix.bat Normal file
View File

@@ -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

70
build-fix.sh Normal file
View File

@@ -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}"

80
docs/docker_fix.md Normal file
View File

@@ -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"
```

View File

@@ -27,7 +27,56 @@ sleep 5
# Run database migrations # Run database migrations
echo "🔄 Running 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 "<22> 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 # Start the bot
echo "✅ Starting the bot..." echo "✅ Starting the bot..."