diff --git a/vmix.zip b/vmix.zip new file mode 100644 index 0000000..478df8b Binary files /dev/null and b/vmix.zip differ diff --git a/vmix/vmix_service.py b/vmix/vmix_service.py index 6dc4067..46a993c 100644 --- a/vmix/vmix_service.py +++ b/vmix/vmix_service.py @@ -4,16 +4,40 @@ import xml.etree.ElementTree as ET import io import platform import os +from pathlib import Path from urllib.parse import urlparse from dotenv import load_dotenv -load_dotenv(override=True) +PROJECT_ROOT = Path(__file__).resolve().parent.parent + + +def get_env_path() -> Path: + """Возвращает тот же .env, который использует systemd на сервере. + + На production deploy.sh подключает /mnt/wfl/.env через EnvironmentFile. + Для локальной разработки остаётся /.env. Путь можно явно + переопределить переменной WFL_ENV_FILE. + """ + configured = str(os.getenv("WFL_ENV_FILE") or "").strip() + if configured: + return Path(configured) + + production_env = Path("/mnt/wfl/.env") + if production_env.exists(): + return production_env + + return PROJECT_ROOT / ".env" def _refresh_env() -> None: - # Читаем .env заново перед скачиванием, чтобы изменение SYNO_PATH_VMIX_2 - # применялось без пересборки кода. - load_dotenv(override=True) + # ВАЖНО: не используем load_dotenv() без пути. Иначе /root/WFL/.env + # может перезаписать значения из systemd EnvironmentFile=/mnt/wfl/.env. + env_path = get_env_path() + if env_path.exists(): + load_dotenv(env_path, override=True) + + +_refresh_env() def get_syno_settings() -> tuple[str | None, str | None, str | None]: @@ -203,12 +227,30 @@ def build_vmix_project_bytes( ) syno_url, syno_username, syno_password = get_syno_settings() - print(f"[vmix] source_key={source_key or '-'} preset_path={vmix_preset_path}") + env_path = get_env_path() + + if not syno_url: + raise RuntimeError(f"Не задан SYNO_URL (env: {env_path})") + if not syno_username: + raise RuntimeError(f"Не задан SYNO_USERNAME (env: {env_path})") + if not syno_password: + raise RuntimeError(f"Не задан SYNO_PASSWORD (env: {env_path})") + + # nasio ожидает имя хоста/IP отдельно от порта, поэтому убираем случайно + # добавленную схему https:// и завершающий slash. + normalized_syno_url = str(syno_url).strip().rstrip("/") + if normalized_syno_url.startswith(("http://", "https://")): + normalized_syno_url = urlparse(normalized_syno_url).hostname or normalized_syno_url + + print( + f"[vmix] source_key={source_key or '-'} preset_path={vmix_preset_path} " + f"nas={normalized_syno_url}:443 env={env_path}" + ) vmix_bio = nasio.load_bio( user=syno_username, password=syno_password, - nas_ip=syno_url, + nas_ip=normalized_syno_url, nas_port="443", path=vmix_preset_path, )