install: dbus-x11, проверка firefox после копирования, без фикс. GID/UID; конфиг/код: правки под f7cloud, signaling по префиксу

This commit is contained in:
root 2026-03-16 05:30:45 +00:00
parent fd8cbb8c8d
commit cf5ce849cb
6 changed files with 53 additions and 15 deletions

View File

@ -1,7 +1,7 @@
[logs] [logs]
level = 20 level = 20
[https] [http]
listen = 127.0.0.1:8000 listen = 127.0.0.1:8000
@ -10,7 +10,7 @@ trustedproxies = 127.0.0.1
[backend] [backend]
allowall = false allowall = false
backends = nextcloud backends = f7cloud
skipverify = false skipverify = false
maxmessagesize = 10240 maxmessagesize = 10240
videowidth = 1920 videowidth = 1920
@ -18,7 +18,7 @@ videoheight = 1080
directory = /var/lib/f7cloud-recordings directory = /var/lib/f7cloud-recordings
secret = F7CLOUD_SECRET secret = F7CLOUD_SECRET
[nextcloud] [f7cloud]
url = F7CLOUD_NEXTCLOUD_URL url = F7CLOUD_NEXTCLOUD_URL
secret = F7CLOUD_SECRET secret = F7CLOUD_SECRET
@ -26,7 +26,7 @@ secret = F7CLOUD_SECRET
signalings = talk signalings = talk
[talk] [talk]
# URL signaling-сервера (HPB) # URL signaling-сервера (HPB). Для HPB указывайте полный URL с путём, например https://hpb.example.com/standalone-signaling
url = F7CLOUD_TALK_URL url = F7CLOUD_TALK_URL
internalsecret = F7CLOUD_TALK_INTERNALSECRET internalsecret = F7CLOUD_TALK_INTERNALSECRET

View File

@ -22,6 +22,8 @@ echo "=== 1. Зависимости (Python 3.12, xvfb, ffmpeg через apt) =
NEED_PYTHON=0 NEED_PYTHON=0
NEED_XVFB=0 NEED_XVFB=0
NEED_FFMPEG=0 NEED_FFMPEG=0
NEED_PULSEAUDIO=0
NEED_DBUS=0
if ! command -v python3.12 >/dev/null 2>&1; then if ! command -v python3.12 >/dev/null 2>&1; then
NEED_PYTHON=1 NEED_PYTHON=1
@ -32,9 +34,15 @@ fi
if ! command -v ffmpeg >/dev/null 2>&1; then if ! command -v ffmpeg >/dev/null 2>&1; then
NEED_FFMPEG=1 NEED_FFMPEG=1
fi 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, если их нет # Пытаемся доустановить 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." echo "Не все зависимости найдены. Попытка установки через apt-get."
apt-get update -qq || echo "Предупреждение: apt-get update завершился с ошибкой, продолжаю попытку установки пакетов." >&2 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 apt-get install -y ffmpeg || echo "Не удалось установить ffmpeg через apt-get." >&2
fi 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 # Перепроверяем наличие после apt-get
NEED_PYTHON=0 NEED_PYTHON=0
NEED_XVFB=0 NEED_XVFB=0
NEED_FFMPEG=0 NEED_FFMPEG=0
NEED_PULSEAUDIO=0
NEED_DBUS=0
if ! command -v python3.12 >/dev/null 2>&1; then if ! command -v python3.12 >/dev/null 2>&1; then
NEED_PYTHON=1 NEED_PYTHON=1
fi 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 if ! command -v ffmpeg >/dev/null 2>&1; then
NEED_FFMPEG=1 NEED_FFMPEG=1
fi 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 fi
if [ "$NEED_PYTHON" -eq 0 ] && [ "$NEED_XVFB" -eq 0 ] && [ "$NEED_FFMPEG" -eq 0 ]; then 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 уже установлены — продолжаем установку." echo "Python 3.12, Xvfb, ffmpeg, pulseaudio и dbus уже установлены — продолжаем установку."
else else
echo "Не найдены обязательные системные зависимости:" echo "Не найдены обязательные системные зависимости:"
[ "$NEED_PYTHON" -eq 1 ] && echo " - python3.12 (и python3.12-venv)" [ "$NEED_PYTHON" -eq 1 ] && echo " - python3.12 (и python3.12-venv)"
[ "$NEED_XVFB" -eq 1 ] && echo " - Xvfb (или xvfb-run)" [ "$NEED_XVFB" -eq 1 ] && echo " - Xvfb (или xvfb-run)"
[ "$NEED_FFMPEG" -eq 1 ] && echo " - ffmpeg" [ "$NEED_FFMPEG" -eq 1 ] && echo " - ffmpeg"
[ "$NEED_PULSEAUDIO" -eq 1 ] && echo " - pulseaudio"
[ "$NEED_DBUS" -eq 1 ] && echo " - dbus-x11 (dbus-launch для PulseAudio)"
echo "" echo ""
echo "Установите их любым доступным способом (apt, локальное зеркало, deb-пакеты и т.п.)," echo "Установите их любым доступным способом (apt, локальное зеркало, deb-пакеты и т.п.),"
echo "затем перезапустите ./install.sh." echo "затем перезапустите ./install.sh."
@ -96,6 +124,10 @@ if [ ! -x "$REPO_ROOT/vendor/geckodriver/geckodriver" ]; then
fi fi
rm -rf /opt/firefox-esr rm -rf /opt/firefox-esr
cp -r "$REPO_ROOT/vendor/firefox-esr" /opt/ 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 ln -sf /opt/firefox-esr/firefox /usr/local/bin/firefox-esr
echo "Firefox ESR скопирован из vendor/ в /opt/firefox-esr." echo "Firefox ESR скопирован из vendor/ в /opt/firefox-esr."
@ -106,10 +138,10 @@ echo "GeckoDriver скопирован из vendor/ в /usr/local/bin/geckodrive
echo "" echo ""
echo "=== 3. Пользователь и каталоги ===" echo "=== 3. Пользователь и каталоги ==="
if ! getent group f7cloud-talk-recording >/dev/null 2>&1; then if ! getent group f7cloud-talk-recording >/dev/null 2>&1; then
groupadd --system -g 989 f7cloud-talk-recording groupadd --system f7cloud-talk-recording
fi fi
if ! id f7cloud-talk-recording >/dev/null 2>&1; then 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 fi
mkdir -p /var/lib/f7cloud-talk-recording /var/lib/f7cloud-recordings 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 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 "Конфиг скопирован как шаблон. Заполните вручную секреты и URL в /etc/f7cloud-talk-recording/server.conf"
echo " (F7CLOUD_NEXTCLOUD_URL, F7CLOUD_SECRET, F7CLOUD_TALK_URL, F7CLOUD_TALK_INTERNALSECRET)" echo " (F7CLOUD_NEXTCLOUD_URL, F7CLOUD_SECRET, F7CLOUD_TALK_URL, F7CLOUD_TALK_INTERNALSECRET)"
fi 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 chmod 640 /etc/f7cloud-talk-recording/server.conf
else else
echo "Не найден шаблон $TEMPLATE" >&2 echo "Не найден шаблон $TEMPLATE" >&2

View File

@ -17,7 +17,7 @@ from secrets import token_urlsafe
from requests import Request, Session from requests import Request, Session
from requests_toolbelt import MultipartEncoder from requests_toolbelt import MultipartEncoder
from nextcloud.talk import recording from f7cloud.talk import recording
from .Config import config from .Config import config
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View File

@ -255,9 +255,14 @@ class Config:
signalingUrl = signalingUrl.rstrip('/') signalingUrl = signalingUrl.rstrip('/')
if signalingUrl in self._signalingIdsBySignalingUrl: if signalingUrl in self._signalingIdsBySignalingUrl:
signalingId = self._signalingIdsBySignalingUrl[signalingUrl] signalingId = self._signalingIdsBySignalingUrl[signalingUrl]
if self._configParser.get(signalingId, 'internalsecret', fallback=None): if self._configParser.get(signalingId, 'internalsecret', fallback=None):
return self._configParser.get(signalingId, 'internalsecret') 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) return self._configParser.get('signaling', 'internalsecret', fallback=None)

View File

@ -21,7 +21,7 @@ from prometheus_client import Counter, Gauge, make_wsgi_app
from werkzeug.exceptions import BadRequest, Forbidden, NotFound from werkzeug.exceptions import BadRequest, Forbidden, NotFound
from werkzeug.middleware.dispatcher import DispatcherMiddleware 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 f7cloud.talk.recording import RECORDING_STATUS_AUDIO_AND_VIDEO
from .Config import config from .Config import config
from .Service import Service from .Service import Service

View File

@ -14,7 +14,7 @@ Module to provide the command line interface for the recorder.
import argparse import argparse
import logging import logging
from nextcloud.talk import recording from f7cloud.talk import recording
from .Config import config from .Config import config
from .Server import app from .Server import app
@ -39,8 +39,9 @@ def main():
listen = config.getListen() listen = config.getListen()
host, port = listen.split(':') 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__': if __name__ == '__main__':
main() main()