# cert_renew_restart.py import subprocess import shutil from pathlib import Path from common import * def generate_mkcert_command(): """Генерирует команду для mkcert с указанием всех доменов""" project_path = get_project_root() services = read_services_config(project_path) domains = [f"{service['name']}.local" for service in services['services']] domains.append("*.local") # Создаем PowerShell команду domains_str = " ".join([f'"{domain}"' for domain in domains]) powershell_cmd = f'mkcert {domains_str}' return powershell_cmd def copy_and_rename_certificates(project_path): """Копирует и переименовывает сертификаты из Windows в WSL в директорию проекта.""" # Определяем пути windows_certs_path = Path("C:/store/certs") # Путь к директории certs внутри проекта local-dns wsl_certs_path = project_path / "certs" # Создаем директорию для сертификатов в WSL в корне проекта wsl_certs_path.mkdir(parents=True, exist_ok=True) # Находим сгенерированные mkcert файлы (обычно именуются как _wildcard.local+*.pem) # Предполагаем, что первый найденный файл - это сертификат cert_files = list(windows_certs_path.glob("_wildcard.local*.pem")) if not cert_files: print(f"Сертификаты не найдены в {windows_certs_path} по шаблону _wildcard.local*.pem") return False # Сортируем, чтобы упростить выбор (хотя mkcert обычно создает пару) cert_files.sort() cert_file = cert_files[0] # Пытаемся найти соответствующий ключ (обычно имя файла сертификата с -key.pem) # Например, если сертификат _wildcard.local+2.pem, ключ будет _wildcard.local+2-key.pem expected_key_name = cert_file.with_name(cert_file.name.replace('.pem', '-key.pem')) if expected_key_name.exists(): key_file = expected_key_name else: print(f"Файл ключа не найден по ожидаемому пути: {expected_key_name}") # Альтернатива: ищем файл с -key.pem в имени среди найденных key_candidates = [f for f in cert_files if '-key.pem' in f.name] if key_candidates: key_file = key_candidates[0] # Берем первый найденный ключ print(f"Найден ключ по альтернативному поиску: {key_file}") else: print(f"Файл ключа не найден в {windows_certs_path}") return False # Копируем и переименовываем в директорию проекта target_cert = wsl_certs_path / "wildcard.local.pem" target_key = wsl_certs_path / "wildcard.local.key" try: shutil.copy2(cert_file, target_cert) shutil.copy2(key_file, target_key) print(f"Сертификат скопирован в: {target_cert}") print(f"Ключ скопирован в: {target_key}") except Exception as e: print(f"Ошибка копирования сертификатов: {e}") return False # Создаем копии для default (если требуются контейнером) default_cert = wsl_certs_path / "default.crt" default_key = wsl_certs_path / "default.key" try: shutil.copy2(target_cert, default_cert) shutil.copy2(target_key, default_key) print(f"Копии сертификатов созданы как default.crt и default.key") except Exception as e: print(f"Ошибка создания копий сертификатов по умолчанию: {e}") # Это может быть не критичной ошибкой, в зависимости от настройки контейнера print(f"Сертификаты скопированы в {wsl_certs_path}") return True def main(): print("Обновление сертификатов и перезапуск сервисов...") # Получаем путь к проекту project_path = get_project_root() # Генерируем конфигурацию dnsmasq перед обновлением generate_dnsmasq_config(project_path) # Выводим команду для генерации сертификатов mkcert_cmd = generate_mkcert_command() print("\nДля генерации сертификатов выполните в PowerShell (от администратора):") print(f"cd C:\\store\\certs") print(mkcert_cmd) print() # Ждем подтверждения пользователя input("Нажмите Enter после генерации сертификатов в PowerShell...") # Копируем сертификаты if not copy_and_rename_certificates(project_path): print("Не удалось скопировать сертификаты") sys.exit(1) # Перезапускаем контейнеры Docker Compose print("Перезапуск контейнеров Docker Compose...") if not run_docker_command("docker-compose restart"): print("Команда 'docker-compose restart' не удалась.") print("Попытка поднять контейнеры с помощью 'docker-compose up -d'...") if not run_docker_command("docker-compose up -d --force-recreate"): print("Не удалось поднять контейнеры с помощью 'docker-compose up -d'.") sys.exit(1) else: print("Контейнеры подняты с помощью 'docker-compose up -d'.") else: print("Контейнеры успешно перезапущены!") print("Сертификаты обновлены и сервисы перезапущены!") if __name__ == "__main__": main()