Fix hardcoded localhost:8000 URLs
Some checks failed
continuous-integration/drone/push Build is failing
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
This commit is contained in:
221
scripts/test-container-connectivity.sh
Executable file
221
scripts/test-container-connectivity.sh
Executable file
@@ -0,0 +1,221 @@
|
||||
#!/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) - детали сети"
|
||||
Reference in New Issue
Block a user