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]
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

View File

@ -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

View File

@ -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__)

View File

@ -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)

View File

@ -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

View File

@ -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()