Files
links/scripts/test-containers-advanced.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

208 lines
6.9 KiB
Bash
Executable File
Raw Permalink 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 "🔍 Улучшенное тестирование доступа контейнеров"
echo "=============================================="
echo ""
echo "🐳 Статус контейнеров:"
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Image}}"
echo ""
echo "🌐 Сетевые подключения:"
echo "======================="
echo ""
echo "1. 📡 Frontend (Next.js) доступ к API"
echo "------------------------------------"
# Проверяем доступные команды в frontend контейнере
echo "Доступные инструменты в frontend контейнере:"
docker exec links-frontend-1 sh -c "
which wget >/dev/null 2>&1 && echo ' ✅ wget доступен'
which curl >/dev/null 2>&1 && echo ' ✅ curl доступен' || echo ' ❌ curl недоступен'
which node >/dev/null 2>&1 && echo ' ✅ node доступен'
"
echo ""
echo "Тест подключения Frontend → Backend через Docker сеть:"
docker exec links-frontend-1 sh -c "
if which wget >/dev/null 2>&1; then
echo 'Тестируем с wget...'
if wget -q --timeout=10 -O- http://links-web-1:8000/api/ 2>/dev/null | head -1; then
echo '✅ API доступен через внутреннюю сеть Docker'
else
echo '❌ API недоступен через внутреннюю сеть'
fi
elif which node >/dev/null 2>&1; then
echo 'Тестируем с Node.js...'
node -e \"
const http = require('http');
const req = http.get('http://links-web-1:8000/api/', (res) => {
console.log('✅ API доступен, статус:', res.statusCode);
});
req.on('error', () => console.log('❌ Ошибка подключения к API'));
req.setTimeout(5000, () => console.log('⏰ Timeout'));
\"
else
echo '⚠️ Нет доступных инструментов для HTTP запросов'
fi
"
echo ""
echo "2. 🗄️ Backend подключение к БД"
echo "------------------------------"
echo "Проверка БД через Django ORM:"
docker exec links-web-1 python manage.py shell -c "
from django.db import connection
from django.contrib.auth import get_user_model
try:
# Тест подключения
cursor = connection.cursor()
cursor.execute('SELECT version()')
version = cursor.fetchone()[0]
print(f'✅ PostgreSQL версия: {version[:30]}...')
# Тест данных
User = get_user_model()
users_count = User.objects.count()
print(f'✅ Пользователей в БД: {users_count}')
# Тест таблиц
cursor.execute(\"SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'\")
tables = [row[0] for row in cursor.fetchall()]
print(f'✅ Таблиц в БД: {len(tables)}')
if 'users_user' in tables:
print('✅ Таблица пользователей найдена')
if 'api_link' in tables:
print('✅ Таблица ссылок найдена')
except Exception as e:
print(f'❌ Ошибка БД: {e}')
"
echo ""
echo "3. 🔄 Проверка API endpoints изнутри Backend"
echo "-------------------------------------------"
echo "Тест API endpoints через Python requests:"
docker exec links-web-1 python -c "
import os
import sys
sys.path.append('/app')
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings')
import django
django.setup()
from django.test import Client
from django.urls import reverse
try:
client = Client()
# Тест API root
response = client.get('/api/')
print(f'API Root: {response.status_code} - {\"✅ OK\" if response.status_code == 200 else \"❌ Error\"}')
# Тест Swagger
response = client.get('/api/swagger/')
print(f'Swagger: {response.status_code} - {\"✅ OK\" if response.status_code == 200 else \"❌ Error\"}')
# Тест Auth
response = client.get('/api/auth/login/')
print(f'Auth Login: {response.status_code} - {\"✅ OK\" if response.status_code in [200, 405] else \"❌ Error\"}')
# Тест Admin
response = client.get('/admin/')
print(f'Admin: {response.status_code} - {\"✅ OK (redirect)\" if response.status_code == 302 else \"❌ Error\"}')
except Exception as e:
print(f'❌ Ошибка тестирования: {e}')
"
echo ""
echo "4. 📊 Анализ Docker сети"
echo "========================"
echo "Информация о сети:"
network_name=$(docker network ls --format "{{.Name}}" | grep catlink || echo "default")
docker network inspect "$network_name" --format "
Сеть: {{.Name}}
Подсеть: {{range .IPAM.Config}}{{.Subnet}}{{end}}
Шлюз: {{range .IPAM.Config}}{{.Gateway}}{{end}}
"
echo ""
echo "Маршруты в web контейнере:"
docker exec links-web-1 sh -c "
ip route 2>/dev/null | head -5 || route -n 2>/dev/null | head -5 || echo 'Команды маршрутизации недоступны'
"
echo ""
echo "5. 🔍 Проверка переменных окружения"
echo "==================================="
echo "Frontend environment:"
docker exec links-frontend-1 env | grep -E "NEXT|API|URL" | sort
echo ""
echo "Backend environment (Django):"
docker exec links-web-1 env | grep -E "DJANGO|DATABASE|DEBUG" | head -10
echo ""
echo "6. 📋 Логи контейнеров (последние строки)"
echo "========================================="
echo "📝 Backend логи:"
docker logs --tail=3 links-web-1 2>/dev/null | tail -3
echo ""
echo "📝 Frontend логи:"
docker logs --tail=3 links-frontend-1 2>/dev/null | tail -3
echo ""
echo "📝 Database логи:"
docker logs --tail=3 links-db-1 2>/dev/null | tail -3
echo ""
echo "🎯 ИТОГОВЫЙ СТАТУС:"
echo "==================="
# Финальная проверка доступности
echo -n "Frontend (3000): "
if docker exec links-frontend-1 sh -c "netstat -tln 2>/dev/null | grep :3000" >/dev/null; then
echo "✅ Слушает порт"
else
echo "⚠️ Порт не найден"
fi
echo -n "Backend (8000): "
if docker exec links-web-1 sh -c "netstat -tln 2>/dev/null | grep :8000" >/dev/null; then
echo "✅ Слушает порт"
else
echo "⚠️ Проверим через ss или другим способом"
if docker exec links-web-1 python -c "import socket; s=socket.socket(); s.connect(('localhost', 8000)); print('✅ Порт 8000 доступен')" 2>/dev/null; then
echo "✅ Порт доступен"
else
echo "❌ Порт недоступен"
fi
fi
echo -n "Database (5432): "
docker exec links-web-1 python -c "
import socket
try:
s = socket.socket()
s.settimeout(3)
s.connect(('links-db-1', 5432))
print('✅ БД доступна')
s.close()
except:
print('❌ БД недоступна')
"
echo ""
echo "🚀 Тестирование завершено!"