Files
links/scripts/test-container-connectivity.sh
Andrey K. Choi e82f0f8e6f
Some checks failed
continuous-integration/drone/push Build is failing
Fix hardcoded localhost:8000 URLs
- 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
2025-11-08 19:25:35 +09:00

221 lines
7.6 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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) - детали сети"