/
xers1k
/
lab10
Обзор
Документация
Войти
/
xers1k
/
lab10
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
start_localstack.py
136 строк
6 KB
«xers1k»
first_commit
20 дек 2025, 10:31
20 дек 2025, 10:31
402f240
Код
Авторство
О чём код?
import subprocess import time import requests import os import shutil def start_localstack(): """Запускаем LocalStack через Docker Compose""" print("🚀 Запускаем LocalStack...") # Настраиваем PATH для Docker env = os.environ.copy() docker_path = "/Applications/Docker.app/Contents/Resources/bin" if docker_path not in env.get("PATH", ""): env["PATH"] = f"{docker_path}:{env.get('PATH', '')}" # Проверяем что Docker установлен try: subprocess.run(["docker", "--version"], check=True, capture_output=True, env=env) except: print("❌ Docker не установлен! Установите Docker Desktop") return False # Определяем команду для docker-compose (может быть docker-compose или docker compose) docker_compose_cmd = None if shutil.which("docker-compose", path=env.get("PATH", "")): docker_compose_cmd = ["docker-compose"] elif shutil.which("docker", path=env.get("PATH", "")): docker_compose_cmd = ["docker", "compose"] else: print("❌ Не найдена команда docker-compose или docker compose") return False # Запускаем LocalStack try: print("📦 Запускаем контейнеры...") process = subprocess.Popen( docker_compose_cmd + ["up", "-d"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env ) stdout, stderr = process.communicate() if process.returncode != 0: print(f"❌ Ошибка запуска: {stderr.decode()}") return False # Ждем пока LocalStack запустится (может занять до 30 секунд) print("⏳ Ожидаем запуск LocalStack...") max_attempts = 15 for attempt in range(max_attempts): time.sleep(2) try: # Проверяем правильный health endpoint response = requests.get("http://localhost:4566/_localstack/health", timeout=3) if response.status_code == 200: try: # Проверяем что S3 и SQS доступны health_data = response.json() s3_status = health_data.get("services", {}).get("s3") sqs_status = health_data.get("services", {}).get("sqs") # S3 может быть "running" или "available", SQS - "available" if (s3_status in ["running", "available"]) and \ (sqs_status in ["running", "available"]): print("✅ LocalStack успешно запущен!") return True except (ValueError, KeyError): # Если не JSON, но статус 200 - значит сервер работает print("✅ LocalStack успешно запущен!") return True except requests.exceptions.RequestException: # Пробуем простую проверку доступности try: response = requests.get("http://localhost:4566/", timeout=2) if response.status_code in [200, 404, 400, 403]: # Любой ответ означает что сервер работает print("✅ LocalStack успешно запущен!") return True except: pass if attempt < max_attempts - 1: print(f" Попытка {attempt + 1}/{max_attempts}...") else: # Проверяем статус контейнера try: result = subprocess.run( docker_compose_cmd + ["ps"], capture_output=True, text=True, env=env ) print(f"❌ LocalStack не отвечает. Статус контейнера:\n{result.stdout}") except: pass print("❌ Не удалось подключиться к LocalStack после всех попыток") return False return False except Exception as e: print(f"❌ Ошибка: {e}") return False def stop_localstack(): """Останавливаем LocalStack""" print("🛑 Останавливаем LocalStack...") # Настраиваем PATH для Docker env = os.environ.copy() docker_path = "/Applications/Docker.app/Contents/Resources/bin" if docker_path not in env.get("PATH", ""): env["PATH"] = f"{docker_path}:{env.get('PATH', '')}" # Определяем команду для docker-compose docker_compose_cmd = None if shutil.which("docker-compose", path=env.get("PATH", "")): docker_compose_cmd = ["docker-compose"] elif shutil.which("docker", path=env.get("PATH", "")): docker_compose_cmd = ["docker", "compose"] else: print("❌ Не найдена команда docker-compose или docker compose") return try: subprocess.run(docker_compose_cmd + ["down"], check=True, env=env) print("✅ LocalStack остановлен") except Exception as e: print(f"❌ Ошибка остановки: {e}") if __name__ == "__main__": start_localstack()