151 lines
6.9 KiB
Python
Executable File
151 lines
6.9 KiB
Python
Executable File
#!/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)
|