#!/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 "🚀 Тестирование завершено!"