#!/usr/bin/env python3 """ Скрипт для проверки подключения к S3 хранилищу. Читает настройки из .env файла или переменных окружения. """ import asyncio import os import sys from pathlib import Path project_root = Path(__file__).resolve().parent.parent sys.path.insert(0, str(project_root)) # Загружаем .env файл from dotenv import load_dotenv env_path = os.path.join(project_root, '.env') if os.path.exists(env_path): load_dotenv(env_path) try: import aioboto3 except ImportError: print("❌ Библиотека aioboto3 не установлена.") print("Установите её командой: pip install aioboto3") sys.exit(1) # Данные для подключения из .env или переменных окружения S3_ACCESS_KEY = os.getenv('S3_ACCESS_KEY', 'j3tears100@gmail.com') S3_SECRET_KEY = os.getenv('S3_SECRET_KEY', 'wQ1-6sZEPs92sbZTSf96') S3_ENDPOINT_URL = os.getenv('S3_ENDPOINT_URL', 'https://api.s3.miran.ru:443') S3_BUCKET_NAME = os.getenv('S3_BUCKET_NAME', 'telegram-helper-bot') S3_REGION = os.getenv('S3_REGION', 'us-east-1') async def test_s3_connection(): """Тестирует подключение к S3 хранилищу.""" print("🔍 Тестирование подключения к S3 хранилищу...") print(f"Endpoint: {S3_ENDPOINT_URL}") print(f"Bucket: {S3_BUCKET_NAME}") print(f"Region: {S3_REGION}") print(f"Access Key: {S3_ACCESS_KEY}") print() session = aioboto3.Session() try: async with session.client( 's3', endpoint_url=S3_ENDPOINT_URL, aws_access_key_id=S3_ACCESS_KEY, aws_secret_access_key=S3_SECRET_KEY, region_name=S3_REGION ) as s3: # Пытаемся получить список бакетов (может не иметь прав, пропускаем если ошибка) print("📦 Получение списка бакетов...") try: response = await s3.list_buckets() buckets = response.get('Buckets', []) print(f"✅ Подключение успешно! Найдено бакетов: {len(buckets)}") if buckets: print("\n📋 Список бакетов:") for bucket in buckets: print(f" - {bucket['Name']} (создан: {bucket.get('CreationDate', 'неизвестно')})") else: print("\n⚠️ Бакеты не найдены.") except Exception as list_error: print(f"⚠️ Не удалось получить список бакетов: {list_error}") print(" Это нормально, если нет прав на list_buckets") print(" Продолжаем тестирование с указанным бакетом...") # Пытаемся создать тестовый файл в указанном бакете print("\n🧪 Тестирование записи файла...") # Используем первый найденный бакет, если указанный не найден test_bucket = S3_BUCKET_NAME if buckets: # Проверяем, есть ли указанный бакет в списке bucket_names = [b['Name'] for b in buckets] if test_bucket not in bucket_names: print(f"⚠️ Бакет '{test_bucket}' не найден в списке.") print(f" Используем первый найденный бакет: '{buckets[0]['Name']}'") test_bucket = buckets[0]['Name'] test_key = 'test-connection.txt' test_content = b'Test connection to S3 storage' try: # Проверяем существование бакета try: await s3.head_bucket(Bucket=test_bucket) print(f"✅ Бакет '{test_bucket}' существует и доступен") except Exception as head_error: print(f"❌ Бакет '{test_bucket}' недоступен: {head_error}") print(" Проверьте права доступа к бакету") return False await s3.put_object( Bucket=test_bucket, Key=test_key, Body=test_content ) print(f"✅ Файл успешно записан в бакет '{test_bucket}' с ключом '{test_key}'") # Пытаемся прочитать файл print("🧪 Тестирование чтения файла...") response = await s3.get_object(Bucket=test_bucket, Key=test_key) content = await response['Body'].read() if content == test_content: print("✅ Файл успешно прочитан, содержимое совпадает") else: print("⚠️ Файл прочитан, но содержимое не совпадает") # Удаляем тестовый файл print("🧹 Удаление тестового файла...") await s3.delete_object(Bucket=test_bucket, Key=test_key) print("✅ Тестовый файл удален") except Exception as e: print(f"❌ Ошибка при тестировании записи/чтения: {e}") print(f" Тип ошибки: {type(e).__name__}") import traceback print(f" Полный traceback:") traceback.print_exc() print("\nВозможные причины:") print(" 1. Неверное имя бакета") print(" 2. Нет прав на запись в бакет") print(" 3. Неверный endpoint URL или регион") print(" 4. Проблемы с форматом endpoint (попробуйте без :443)") return True except Exception as e: print(f"❌ Ошибка подключения к S3: {e}") print("\nВозможные причины:") print(" 1. Неверные credentials (Access Key / Secret Key)") print(" 2. Неверный endpoint URL") print(" 3. Проблемы с сетью") print(" 4. Неверный регион (попробуйте изменить region_name)") return False if __name__ == "__main__": result = asyncio.run(test_s3_connection()) sys.exit(0 if result else 1)