Some checks failed
continuous-integration/drone/push Build is failing
- Add backend/utils.py for URL management - Update serializers to use normalize_file_url() - Update views to use URL utils from env vars - Fix frontend components to use NEXT_PUBLIC_API_URL - Add new env vars: DJANGO_BACKEND_URL, DJANGO_MEDIA_BASE_URL - Replace all hardcoded localhost:8000 with configurable URLs
221 lines
7.6 KiB
Bash
Executable File
221 lines
7.6 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
echo "🔍 Тестирование доступа контейнеров к API и БД"
|
||
echo "==============================================="
|
||
|
||
echo ""
|
||
echo "🐳 Статус контейнеров:"
|
||
echo "----------------------"
|
||
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
|
||
|
||
echo ""
|
||
echo "🌐 Тестирование сетевых соединений между контейнерами:"
|
||
echo "======================================================"
|
||
|
||
echo ""
|
||
echo "1. 📡 Frontend → Backend API"
|
||
echo "----------------------------"
|
||
echo "Проверяем доступ frontend к backend через внутреннюю сеть Docker..."
|
||
|
||
# Тестируем подключение frontend к backend
|
||
docker exec links-frontend-1 sh -c "
|
||
echo 'Тест ping к web контейнеру:'
|
||
if ping -c 1 links-web-1 >/dev/null 2>&1; then
|
||
echo '✅ Ping успешен'
|
||
else
|
||
echo '❌ Ping неудачен'
|
||
fi
|
||
|
||
echo ''
|
||
echo 'Тест HTTP запроса к API:'
|
||
if command -v curl >/dev/null 2>&1; then
|
||
echo 'Используем curl...'
|
||
response=\$(curl -s -w '%{http_code}' -o /dev/null http://links-web-1:8000/api/ 2>/dev/null || echo 'ERROR')
|
||
if [ \"\$response\" = 'ERROR' ]; then
|
||
echo '❌ Ошибка подключения к API'
|
||
else
|
||
echo \"✅ API отвечает (HTTP \$response)\"
|
||
fi
|
||
else
|
||
echo 'curl не найден, используем wget...'
|
||
if wget -q --spider http://links-web-1:8000/api/ 2>/dev/null; then
|
||
echo '✅ API доступен через wget'
|
||
else
|
||
echo '❌ API недоступен'
|
||
fi
|
||
fi
|
||
"
|
||
|
||
echo ""
|
||
echo "2. 🗄️ Backend → Database"
|
||
echo "------------------------"
|
||
echo "Проверяем доступ backend к базе данных..."
|
||
|
||
# Тестируем подключение backend к базе данных
|
||
docker exec links-web-1 sh -c "
|
||
echo 'Тест ping к БД контейнеру:'
|
||
if ping -c 1 links-db-1 >/dev/null 2>&1; then
|
||
echo '✅ Ping к БД успешен'
|
||
else
|
||
echo '❌ Ping к БД неудачен'
|
||
fi
|
||
|
||
echo ''
|
||
echo 'Тест подключения к PostgreSQL:'
|
||
if command -v pg_isready >/dev/null 2>&1; then
|
||
if pg_isready -h links-db-1 -p 5432 >/dev/null 2>&1; then
|
||
echo '✅ PostgreSQL доступен'
|
||
else
|
||
echo '❌ PostgreSQL недоступен'
|
||
fi
|
||
else
|
||
echo 'pg_isready не найден, пробуем через Python...'
|
||
fi
|
||
|
||
echo ''
|
||
echo 'Тест Django ORM подключения:'
|
||
cd /app
|
||
python manage.py shell -c \"
|
||
try:
|
||
from django.db import connection
|
||
cursor = connection.cursor()
|
||
cursor.execute('SELECT 1')
|
||
print('✅ Django ORM: подключение к БД успешно')
|
||
except Exception as e:
|
||
print(f'❌ Django ORM ошибка: {e}')
|
||
\"
|
||
"
|
||
|
||
echo ""
|
||
echo "3. 🔄 Frontend → Backend (через внешний API)"
|
||
echo "--------------------------------------------"
|
||
echo "Проверяем, как frontend обращается к backend через nginx..."
|
||
|
||
# Проверяем переменные окружения frontend
|
||
docker exec links-frontend-1 sh -c "
|
||
echo 'Переменные окружения API:'
|
||
env | grep -E 'API|NEXT' | sort
|
||
|
||
echo ''
|
||
echo 'Тест внешнего API через nginx:'
|
||
if command -v curl >/dev/null 2>&1; then
|
||
# Проверяем внешний доступ к API
|
||
response=\$(curl -s -w '%{http_code}' -o /dev/null https://links.shareon.kr/api/ 2>/dev/null || echo 'ERROR')
|
||
if [ \"\$response\" = 'ERROR' ]; then
|
||
echo '❌ Внешний API недоступен'
|
||
else
|
||
echo \"✅ Внешний API доступен (HTTP \$response)\"
|
||
fi
|
||
else
|
||
echo 'curl недоступен для внешних запросов'
|
||
fi
|
||
"
|
||
|
||
echo ""
|
||
echo "4. 📊 Проверка внутренней Docker сети"
|
||
echo "-------------------------------------"
|
||
echo "Информация о Docker сети:"
|
||
|
||
# Получаем информацию о сети
|
||
network_name=$(docker network ls --format "{{.Name}}" | grep catlink || echo "bridge")
|
||
echo "Используемая сеть: $network_name"
|
||
|
||
echo ""
|
||
echo "IP адреса контейнеров в сети:"
|
||
for container in links-web-1 links-db-1 links-frontend-1; do
|
||
if docker ps --format "{{.Names}}" | grep -q "^$container$"; then
|
||
ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$container" 2>/dev/null || echo "N/A")
|
||
echo " • $container: $ip"
|
||
else
|
||
echo " • $container: не найден"
|
||
fi
|
||
done
|
||
|
||
echo ""
|
||
echo "5. 🔍 Проверка портов внутри контейнеров"
|
||
echo "----------------------------------------"
|
||
|
||
echo "Порты в web контейнере:"
|
||
docker exec links-web-1 sh -c "netstat -tlnp 2>/dev/null | grep -E ':8000|:5432' || ss -tlnp | grep -E ':8000|:5432'" || echo "netstat/ss недоступен"
|
||
|
||
echo ""
|
||
echo "Порты в frontend контейнере:"
|
||
docker exec links-frontend-1 sh -c "netstat -tlnp 2>/dev/null | grep :3000 || ss -tlnp | grep :3000" || echo "netstat/ss недоступен"
|
||
|
||
echo ""
|
||
echo "6. 📋 Тест Django команд"
|
||
echo "------------------------"
|
||
echo "Проверяем Django команды и миграции..."
|
||
|
||
docker exec links-web-1 sh -c "
|
||
cd /app
|
||
echo 'Проверка миграций:'
|
||
python manage.py showmigrations --verbosity=0 2>/dev/null | head -10 || echo 'Ошибка showmigrations'
|
||
|
||
echo ''
|
||
echo 'Проверка пользователей в БД:'
|
||
python manage.py shell -c \"
|
||
try:
|
||
from django.contrib.auth import get_user_model
|
||
User = get_user_model()
|
||
count = User.objects.count()
|
||
print(f'Пользователей в БД: {count}')
|
||
if count > 0:
|
||
print('✅ БД содержит данные')
|
||
else:
|
||
print('⚠️ БД пустая (это нормально для новой установки)')
|
||
except Exception as e:
|
||
print(f'❌ Ошибка запроса к БД: {e}')
|
||
\"
|
||
"
|
||
|
||
echo ""
|
||
echo "7. 🔐 Тест API авторизации"
|
||
echo "--------------------------"
|
||
echo "Проверяем доступность API endpoints..."
|
||
|
||
# Тестируем основные API endpoints
|
||
endpoints=(
|
||
"/api/"
|
||
"/api/auth/login/"
|
||
"/api/auth/register/"
|
||
"/api/swagger/"
|
||
)
|
||
|
||
for endpoint in "${endpoints[@]}"; do
|
||
echo -n "Тест $endpoint: "
|
||
response=$(docker exec links-web-1 curl -s -w '%{http_code}' -o /dev/null "http://localhost:8000$endpoint" 2>/dev/null || echo "ERROR")
|
||
|
||
case $response in
|
||
200)
|
||
echo "✅ OK ($response)"
|
||
;;
|
||
301|302)
|
||
echo "🔄 Redirect ($response)"
|
||
;;
|
||
405)
|
||
echo "✅ Method not allowed ($response) - endpoint существует"
|
||
;;
|
||
404)
|
||
echo "❌ Not found ($response)"
|
||
;;
|
||
ERROR)
|
||
echo "❌ Connection error"
|
||
;;
|
||
*)
|
||
echo "⚠️ Status: $response"
|
||
;;
|
||
esac
|
||
done
|
||
|
||
echo ""
|
||
echo "🎯 РЕЗЮМЕ ТЕСТИРОВАНИЯ:"
|
||
echo "======================"
|
||
echo "✅ Тестирование доступа контейнеров завершено"
|
||
echo ""
|
||
echo "Для дополнительной диагностики используйте:"
|
||
echo " • docker logs links-web-1 - логи Django"
|
||
echo " • docker logs links-db-1 - логи PostgreSQL"
|
||
echo " • docker logs links-frontend-1 - логи Next.js"
|
||
echo " • docker exec -it links-web-1 bash - войти в контейнер"
|
||
echo " • docker network inspect \$(docker network ls --format '{{.Name}}' | grep catlink) - детали сети" |