113 lines
4.7 KiB
Python
113 lines
4.7 KiB
Python
|
|
# 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()
|