# cert_renew_restart.py def generate_mkcert_command(): """Генерирует команду для mkcert с указанием всех доменов""" services = read_services_config() 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(): """Копирует и переименовывает сертификаты из Windows в WSL""" # Определяем пути windows_certs_path = Path("C:/store/certs") wsl_certs_path = Path.home() / "projects" / "docker" / "network" / "certs" # Создаем директорию для сертификатов в WSL wsl_certs_path.mkdir(parents=True, exist_ok=True) # Находим сгенерированные mkcert файлы cert_files = list(windows_certs_path.glob("_wildcard.local+*.pem")) if not cert_files: print("Сертификаты не найдены в C:/store/certs") return False # Предполагаем, что mkcert генерирует файлы в формате _wildcard.domain+N.pem cert_file = cert_files[0] key_file = cert_files[0].with_name(cert_file.name.replace(".pem", "-key.pem")) if not key_file.exists(): print(f"Файл ключа не найден: {key_file}") return False # Копируем и переименовываем target_cert = wsl_certs_path / "wildcard.local.pem" target_key = wsl_certs_path / "wildcard.local.key" shutil.copy2(cert_file, target_cert) shutil.copy2(key_file, target_key) # Создаем копии для default default_cert = wsl_certs_path / "default.crt" default_key = wsl_certs_path / "default.key" shutil.copy2(target_cert, default_cert) shutil.copy2(target_key, default_key) print(f"Сертификаты скопированы в {wsl_certs_path}") return True def run_docker_command(cmd): """Выполняет команду Docker и возвращает результат""" try: result = subprocess.run(cmd, shell=True, capture_output=True, text=True) if result.returncode != 0: print(f"Ошибка выполнения команды: {cmd}") print(f"Ошибка: {result.stderr}") return False return True except Exception as e: print(f"Ошибка выполнения команды: {e}") return False def main(): print("Обновление сертификатов и перезапуск сервисов...") # Получаем имя директории проекта (предполагаем, что это "network") project_name = "network" # Генерируем конфигурационный файл dnsmasq generate_dnsmasq_config() # Выводим команду для генерации сертификатов 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(): print("Не удалось скопировать сертификаты") sys.exit(1) # Переходим в директорию проекта project_path = Path.home() / "projects" / "docker" / project_name if not project_path.exists(): print(f"Директория проекта не найдена: {project_path}") sys.exit(1) os.chdir(project_path) # Перезапускаем nginx-proxy для загрузки новых сертификатов print("Перезапуск nginx-proxy...") if not run_docker_command("docker-compose restart nginx-proxy"): print("Не удалось перезапустить nginx-proxy") # Если restart не сработал, пробуем поднять контейнеры if not run_docker_command("docker-compose up -d"): print("Не удалось поднять контейнеры") sys.exit(1) print("Сертификаты обновлены и сервисы перезапущены!") if __name__ == "__main__": main()