From cf5ce849cbeccef6041f85bedad13fb60bf3eb61 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 16 Mar 2026 05:30:45 +0000 Subject: [PATCH] =?UTF-8?q?install:=20dbus-x11,=20=D0=BF=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=BA=D0=B0=20firefox=20=D0=BF=D0=BE=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=20=D0=BA=D0=BE=D0=BF=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F,=20=D0=B1=D0=B5=D0=B7=20=D1=84=D0=B8=D0=BA=D1=81.?= =?UTF-8?q?=20GID/UID;=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3/=D0=BA=D0=BE?= =?UTF-8?q?=D0=B4:=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=20f7cloud,=20signaling=20=D0=BF=D0=BE=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B5=D1=84=D0=B8=D0=BA=D1=81=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server.conf.template | 8 ++-- install.sh | 44 ++++++++++++++++--- .../f7cloud/talk/recording/BackendNotifier.py | 2 +- .../src/f7cloud/talk/recording/Config.py | 7 ++- .../src/f7cloud/talk/recording/Server.py | 2 +- .../src/f7cloud/talk/recording/__main__.py | 5 ++- 6 files changed, 53 insertions(+), 15 deletions(-) diff --git a/etc/f7cloud-talk-recording/server.conf.template b/etc/f7cloud-talk-recording/server.conf.template index 9e4c65e..3627bc7 100644 --- a/etc/f7cloud-talk-recording/server.conf.template +++ b/etc/f7cloud-talk-recording/server.conf.template @@ -1,7 +1,7 @@ [logs] level = 20 -[https] +[http] listen = 127.0.0.1:8000 @@ -10,7 +10,7 @@ trustedproxies = 127.0.0.1 [backend] allowall = false -backends = nextcloud +backends = f7cloud skipverify = false maxmessagesize = 10240 videowidth = 1920 @@ -18,7 +18,7 @@ videoheight = 1080 directory = /var/lib/f7cloud-recordings secret = F7CLOUD_SECRET -[nextcloud] +[f7cloud] url = F7CLOUD_NEXTCLOUD_URL secret = F7CLOUD_SECRET @@ -26,7 +26,7 @@ secret = F7CLOUD_SECRET signalings = talk [talk] -# URL signaling-сервера (HPB) +# URL signaling-сервера (HPB). Для HPB указывайте полный URL с путём, например https://hpb.example.com/standalone-signaling url = F7CLOUD_TALK_URL internalsecret = F7CLOUD_TALK_INTERNALSECRET diff --git a/install.sh b/install.sh index b68eb88..b568e47 100755 --- a/install.sh +++ b/install.sh @@ -22,6 +22,8 @@ echo "=== 1. Зависимости (Python 3.12, xvfb, ffmpeg через apt) = NEED_PYTHON=0 NEED_XVFB=0 NEED_FFMPEG=0 +NEED_PULSEAUDIO=0 +NEED_DBUS=0 if ! command -v python3.12 >/dev/null 2>&1; then NEED_PYTHON=1 @@ -32,9 +34,15 @@ fi if ! command -v ffmpeg >/dev/null 2>&1; then NEED_FFMPEG=1 fi +if ! command -v pulseaudio >/dev/null 2>&1; then + NEED_PULSEAUDIO=1 +fi +if ! command -v dbus-launch >/dev/null 2>&1; then + NEED_DBUS=1 +fi # Пытаемся доустановить Python 3.12, xvfb и ffmpeg через apt, если их нет -if [ "$NEED_PYTHON" -eq 1 ] || [ "$NEED_XVFB" -eq 1 ] || [ "$NEED_FFMPEG" -eq 1 ]; then +if [ "$NEED_PYTHON" -eq 1 ] || [ "$NEED_XVFB" -eq 1 ] || [ "$NEED_FFMPEG" -eq 1 ] || [ "$NEED_PULSEAUDIO" -eq 1 ] || [ "$NEED_DBUS" -eq 1 ]; then echo "Не все зависимости найдены. Попытка установки через apt-get." apt-get update -qq || echo "Предупреждение: apt-get update завершился с ошибкой, продолжаю попытку установки пакетов." >&2 @@ -56,10 +64,22 @@ if [ "$NEED_PYTHON" -eq 1 ] || [ "$NEED_XVFB" -eq 1 ] || [ "$NEED_FFMPEG" -eq 1 apt-get install -y ffmpeg || echo "Не удалось установить ffmpeg через apt-get." >&2 fi + if [ "$NEED_PULSEAUDIO" -eq 1 ]; then + echo "Установка pulseaudio: apt-get install -y pulseaudio" + apt-get install -y pulseaudio || echo "Не удалось установить pulseaudio через apt-get." >&2 + fi + + if [ "$NEED_DBUS" -eq 1 ]; then + echo "Установка dbus-x11 (dbus-launch для PulseAudio): apt-get install -y dbus-x11" + apt-get install -y dbus-x11 || apt-get install -y dbus || echo "Не удалось установить dbus-x11/dbus через apt-get." >&2 + fi + # Перепроверяем наличие после apt-get NEED_PYTHON=0 NEED_XVFB=0 NEED_FFMPEG=0 + NEED_PULSEAUDIO=0 + NEED_DBUS=0 if ! command -v python3.12 >/dev/null 2>&1; then NEED_PYTHON=1 fi @@ -69,15 +89,23 @@ if [ "$NEED_PYTHON" -eq 1 ] || [ "$NEED_XVFB" -eq 1 ] || [ "$NEED_FFMPEG" -eq 1 if ! command -v ffmpeg >/dev/null 2>&1; then NEED_FFMPEG=1 fi + if ! command -v pulseaudio >/dev/null 2>&1; then + NEED_PULSEAUDIO=1 + fi + if ! command -v dbus-launch >/dev/null 2>&1; then + NEED_DBUS=1 + fi fi -if [ "$NEED_PYTHON" -eq 0 ] && [ "$NEED_XVFB" -eq 0 ] && [ "$NEED_FFMPEG" -eq 0 ]; then - echo "Python 3.12, Xvfb и ffmpeg уже установлены — продолжаем установку." +if [ "$NEED_PYTHON" -eq 0 ] && [ "$NEED_XVFB" -eq 0 ] && [ "$NEED_FFMPEG" -eq 0 ] && [ "$NEED_PULSEAUDIO" -eq 0 ] && [ "$NEED_DBUS" -eq 0 ]; then + echo "Python 3.12, Xvfb, ffmpeg, pulseaudio и dbus уже установлены — продолжаем установку." else echo "Не найдены обязательные системные зависимости:" [ "$NEED_PYTHON" -eq 1 ] && echo " - python3.12 (и python3.12-venv)" [ "$NEED_XVFB" -eq 1 ] && echo " - Xvfb (или xvfb-run)" [ "$NEED_FFMPEG" -eq 1 ] && echo " - ffmpeg" + [ "$NEED_PULSEAUDIO" -eq 1 ] && echo " - pulseaudio" + [ "$NEED_DBUS" -eq 1 ] && echo " - dbus-x11 (dbus-launch для PulseAudio)" echo "" echo "Установите их любым доступным способом (apt, локальное зеркало, deb-пакеты и т.п.)," echo "затем перезапустите ./install.sh." @@ -96,6 +124,10 @@ if [ ! -x "$REPO_ROOT/vendor/geckodriver/geckodriver" ]; then fi rm -rf /opt/firefox-esr cp -r "$REPO_ROOT/vendor/firefox-esr" /opt/ +if [ ! -x /opt/firefox-esr/firefox ]; then + echo "Ошибка: после копирования не найден /opt/firefox-esr/firefox. Проверьте наличие vendor/firefox-esr/ в репо." >&2 + exit 1 +fi ln -sf /opt/firefox-esr/firefox /usr/local/bin/firefox-esr echo "Firefox ESR скопирован из vendor/ в /opt/firefox-esr." @@ -106,10 +138,10 @@ echo "GeckoDriver скопирован из vendor/ в /usr/local/bin/geckodrive echo "" echo "=== 3. Пользователь и каталоги ===" if ! getent group f7cloud-talk-recording >/dev/null 2>&1; then - groupadd --system -g 989 f7cloud-talk-recording + groupadd --system f7cloud-talk-recording fi if ! id f7cloud-talk-recording >/dev/null 2>&1; then - useradd --system -u 999 -g f7cloud-talk-recording -d /var/lib/f7cloud-talk-recording -s /usr/sbin/nologin f7cloud-talk-recording + useradd --system -g f7cloud-talk-recording -d /var/lib/f7cloud-talk-recording -s /usr/sbin/nologin f7cloud-talk-recording fi mkdir -p /var/lib/f7cloud-talk-recording /var/lib/f7cloud-recordings chown -R f7cloud-talk-recording:f7cloud-talk-recording /var/lib/f7cloud-talk-recording /var/lib/f7cloud-recordings @@ -136,7 +168,7 @@ if [ -f "$TEMPLATE" ]; then echo "Конфиг скопирован как шаблон. Заполните вручную секреты и URL в /etc/f7cloud-talk-recording/server.conf" echo " (F7CLOUD_NEXTCLOUD_URL, F7CLOUD_SECRET, F7CLOUD_TALK_URL, F7CLOUD_TALK_INTERNALSECRET)" fi - chown root:root /etc/f7cloud-talk-recording/server.conf + chown root:f7cloud-talk-recording /etc/f7cloud-talk-recording/server.conf chmod 640 /etc/f7cloud-talk-recording/server.conf else echo "Не найден шаблон $TEMPLATE" >&2 diff --git a/opt/f7cloud-talk-recording-src/src/f7cloud/talk/recording/BackendNotifier.py b/opt/f7cloud-talk-recording-src/src/f7cloud/talk/recording/BackendNotifier.py index ac59ba8..e5d2fde 100644 --- a/opt/f7cloud-talk-recording-src/src/f7cloud/talk/recording/BackendNotifier.py +++ b/opt/f7cloud-talk-recording-src/src/f7cloud/talk/recording/BackendNotifier.py @@ -17,7 +17,7 @@ from secrets import token_urlsafe from requests import Request, Session from requests_toolbelt import MultipartEncoder -from nextcloud.talk import recording +from f7cloud.talk import recording from .Config import config logger = logging.getLogger(__name__) diff --git a/opt/f7cloud-talk-recording-src/src/f7cloud/talk/recording/Config.py b/opt/f7cloud-talk-recording-src/src/f7cloud/talk/recording/Config.py index 9f82914..ab3b622 100644 --- a/opt/f7cloud-talk-recording-src/src/f7cloud/talk/recording/Config.py +++ b/opt/f7cloud-talk-recording-src/src/f7cloud/talk/recording/Config.py @@ -255,9 +255,14 @@ class Config: signalingUrl = signalingUrl.rstrip('/') if signalingUrl in self._signalingIdsBySignalingUrl: signalingId = self._signalingIdsBySignalingUrl[signalingUrl] - if self._configParser.get(signalingId, 'internalsecret', fallback=None): return self._configParser.get(signalingId, 'internalsecret') + # Match by prefix: e.g. request https://host/standalone-signaling vs config https://host + for configuredUrl, signalingId in self._signalingIdsBySignalingUrl.items(): + if signalingUrl == configuredUrl or signalingUrl.startswith(configuredUrl.rstrip('/') + '/'): + if self._configParser.get(signalingId, 'internalsecret', fallback=None): + return self._configParser.get(signalingId, 'internalsecret') + break return self._configParser.get('signaling', 'internalsecret', fallback=None) diff --git a/opt/f7cloud-talk-recording-src/src/f7cloud/talk/recording/Server.py b/opt/f7cloud-talk-recording-src/src/f7cloud/talk/recording/Server.py index 0344150..135d817 100644 --- a/opt/f7cloud-talk-recording-src/src/f7cloud/talk/recording/Server.py +++ b/opt/f7cloud-talk-recording-src/src/f7cloud/talk/recording/Server.py @@ -21,7 +21,7 @@ from prometheus_client import Counter, Gauge, make_wsgi_app from werkzeug.exceptions import BadRequest, Forbidden, NotFound from werkzeug.middleware.dispatcher import DispatcherMiddleware -from nextcloud.talk import recording +from f7cloud.talk import recording from f7cloud.talk.recording import RECORDING_STATUS_AUDIO_AND_VIDEO from .Config import config from .Service import Service diff --git a/opt/f7cloud-talk-recording-src/src/f7cloud/talk/recording/__main__.py b/opt/f7cloud-talk-recording-src/src/f7cloud/talk/recording/__main__.py index 2a8171f..2046f18 100644 --- a/opt/f7cloud-talk-recording-src/src/f7cloud/talk/recording/__main__.py +++ b/opt/f7cloud-talk-recording-src/src/f7cloud/talk/recording/__main__.py @@ -14,7 +14,7 @@ Module to provide the command line interface for the recorder. import argparse import logging -from nextcloud.talk import recording +from f7cloud.talk import recording from .Config import config from .Server import app @@ -39,8 +39,9 @@ def main(): listen = config.getListen() host, port = listen.split(':') + port = int(port, 10) - app.run(host, port, threaded=True) + app.run(host=host, port=port, threaded=True) if __name__ == '__main__': main()