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