Configuration

B3Desk

L’ensemble des paramètres décrits sur cette page peuvent être passées en variables d’environnement à l’application B3Desk.

pydantic model b3desk.settings.MainSettings[source]

Paramètres de configuration du frontal B3Desk.

field ACCEPTED_FILES_CLIENT_SIDE: str | None = 'image/*,.pdf,.doc,.docx,.htm,.html,.odp,.ods,.odt,.ppt,.pptx,.xls,.xlsx'

Liste de mime-types autorisés par le navigateur pour le téléversement des fichiers, séparés par des virgules.

Passé en paramètre acceptedFiles de Dropzone.

Plus d’infos sur https://docs.dropzone.dev/configuration/basics/configuration-options

field ALLOWED_MIME_TYPES_SERVER_SIDE: list[str] | None = ['application/pdf', 'image/vnd.dwg', 'image/x-xcf', 'image/jpeg', 'image/jpx', 'image/png', 'image/apng', 'image/gif', 'image/webp', 'image/x-canon-cr2', 'image/tiff', 'image/bmp', 'image/vnd.ms-photo', 'image/vnd.adobe.photoshop', 'image/x-icon', 'image/heic', 'image/avif', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.oasis.opendocument.text', 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.oasis.opendocument.spreadsheet', 'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/vnd.oasis.opendocument.presentation']

Liste de mime-types acceptés par le serveur pour le téléversement de fichiers.

Si non renseigné, tous les fichiers sont autorisés.

field BABEL_DEFAULT_LOCALE: str = 'fr'

La langue utilisée par défaut lorsque l’utilisateur n’en a pas choisi.

field BABEL_DEFAULT_TIMEZONE: str = 'Europe/Paris'

Le fuseau horaire utilisé pour l’affichage des dates et heures.

Plus d’infos sur https://data.iana.org/time-zones/tzdb-2021a/zone1970.tab

field BABEL_TRANSLATION_DIRECTORIES: str = '/opt/bbb-visio/translations'

Un ou plusieurs chemins vers les répertoires des catalogues de traduction, séparés par des « ; ».

Plus d’infos sur https://python-babel.github.io/flask-babel/#configuration

field BETA: bool = False

Active l’encart « Bêta » dans l’entête du service B3Desk.

field BIGBLUEBUTTON_ANALYTICS_CALLBACK_URL: str | None = None

Passé à l’API BBB via le paramètre meta_analytics-callback-url.

Plus d’informations sur https://docs.bigbluebutton.org/development/api/#create

field BIGBLUEBUTTON_API_CACHE_DURATION: int = 5

Le temps de mise en cache (en secondes) des réponses aux requêtes GET à l’API BBB.

field BIGBLUEBUTTON_DIALNUMBER: str | None = None

The dial access number that participants can call in using regular phone.

Required if pin management is enabled.

field BIGBLUEBUTTON_ENDPOINT: str | None = None

URL du service BBB.

Par exemple https://bbb30.test/bigbluebutton/api

field BIGBLUEBUTTON_REQUEST_TIMEOUT: int = 2

BBB request timeout

Timeout for BBB request expressed in seconds in logs

field BIGBLUEBUTTON_SECRET: str | None = None

Mot de passe du service BBB.

field CAPTCHA_NUMBER_ATTEMPTS: Annotated[int, Gt(gt=0)] | None = 5

Captcha number attemps

Number of attempts to enter the visio-code before submitting a captcha

field CAPTCHETAT_API_URL: str | None = 'https://api.piste.gouv.fr/piste/'

PISTE API url

basic url for PISTE API used to get and check captchetat

field CLIPBOARD: bool = False

Semble inutilisé.

Contact link

If entered, a “contact” button wil appear in footer

field DEBUG: bool = False

Mode debug, à ne surtout pas utiliser en production.

Plus d’informations sur https://flask.palletsprojects.com/en/3.0.x/config/#DEBUG

field DEFAULT_MEETING_DURATION: int = 280

Durée maximum en minutes des réunion passée à l’API BBB.

Plus d’informations sur https://docs.bigbluebutton.org/development/api/#create

Semble inutilisé.

Surcharge l’adresse de la page de documentation si renseigné.

field DOCUMENTATION_PAGE_SUBTITLE: str | None = None

Sous-titre de la page de documentation.

field ENABLE_AI_SUMMARY: bool | None = False

Enable AI summary

Allow AI summary generation on records

field ENABLE_LASUITENUMERIQUE: bool | None = False

Enable LaSuite numerique homepage style.

field ENABLE_PIN_MANAGEMENT: bool | None = False

Enable mangement of PIN by B3Desk.

PIN allows users joining meeting by phone. BIGBLUEBUTTON_DIALNUMBER required if PIN management enabled.

field ENABLE_SIP: bool | None = False

Enable SIPMediaGW.

SIPMediaGW url allows users connecting SIPMediaGW. FQDN_SIP_SERVER required if SIP enabled.

field EXTERNAL_UPLOAD_DESCRIPTION: str = 'Fichiers depuis votre Nextcloud'

Description dans BBB des fichiers téléversés dans Nextcloud.

field FILE_SHARING: bool = False

Active la fonctionnalité de téléversement de fichiers.

field FORCE_HTTPS_ON_EXTERNAL_URLS: bool = False

Force le protocole https pour les URLs Nextcloud.

field FQDN_SIP_SERVER: str | None = None

FQDN SIP server.

Required if SIP is enabled.

field LOG_CONFIG: Annotated[Path, PathType(path_type=file)] | None = None

Chemin vers un fichier de configuration de logs Python.

Le fichier doit être au format de fichiers de logs officiel Python. Il peut être au format INI ou à partir de Python 3.11 au format TOML (qui est recommandé):

Astuce

Par défaut les images Docker montent le répertoire web/conf dans /opt/bbb-visio/conf. On peut donc créer un fichier web/conf/logging.toml dans le projet avec la configuration voulue. On indiquera ensuite LOG_CONFIG=/opt/bbb-visio/conf/logging.toml pour que ce fichier soit chargé par l’image Docker.

Note

[root] désigne un logger par défaut qui traite tous les messages de log qui ne sont pas traités par d’autres loggers.

Exemple de fichier de configuration de logs au format toml
version = 1

[formatters.default]
format = "[%(asctime)s] %(levelname)s in %(module)s: %(message)s"

[handlers.wsgi]
class = "logging.handlers.WatchedFileHandler"
filename = "/var/log/wsgi.log"
formatter = "default"

[handlers.b3desk]
class = "logging.handlers.WatchedFileHandler"
filename = "/var/log/b3desk.log"
formatter = "default"

[loggers.b3desk]
level = "INFO"
handlers = ["b3desk"]

[root]
level = "INFO"
handlers = ["wsgi"]
Exemple de configuration avec un fichier destiné aux erreurs
version = 1

[formatters.default]
format = "[%(asctime)s] %(levelname)s in %(module)s: %(message)s"

[handlers.wsgi]
class = "logging.handlers.WatchedFileHandler"
filename = "/var/log/wsgi.log"
formatter = "default"

[handlers.b3desk]
class = "logging.handlers.WatchedFileHandler"
filename = "/var/log/b3desk.log"
formatter = "default"

[handlers.errors]
class = "logging.handlers.WatchedFileHandler"
filename = "/var/log/errors.log"
formatter = "default"
level = "WARNING"

[loggers.b3desk]
level = "INFO"
handlers = ["b3desk", "errors"]

[root]
level = "INFO"
handlers = ["wsgi"]
Exemple de configuration avec les logs BBB dans un fichier dédié, avec DEBUG sur le module BBB uniquement.
version = 1

[formatters.default]
format = "[%(asctime)s] %(levelname)s in %(module)s: %(message)s"

[handlers.wsgi]
class = "logging.handlers.WatchedFileHandler"
filename = "/var/log/wsgi.log"
formatter = "default"

[handlers.bbb]
class = "logging.handlers.WatchedFileHandler"
filename = "/var/log/bbb.log"
formatter = "default"

[loggers.bbb]
level = "DEBUG"
handlers = ["bbb"]

[loggers.b3desk]
level = "INFO"
handlers = ["wsgi"]

[root]
level = "INFO"
handlers = ["wsgi"]

Affiche des liens vers les adresses email des modérateurs et participants dans la liste des réunions.

field MATOMO_SITE_ID: str | None = None

ID de l’instance B3Desk dans Matomo.

field MATOMO_URL: str | None = None

URL de l’instance de Matomo vers laquelle envoyer des statistiques.

field MAXIMUM_MEETING_DELEGATES: int | None = 15

Maximum meeting delegates

Maximum number of delegates for one meeting

field MAX_MEETINGS_PER_USER: int = 50

Le nombre maximum de séminaires que peut créer un utilisateur.

field MAX_PARTICIPANTS: int = 200

Nombre moyen de participants indicatif sur la plateforme.

Seulement utilisé à des fins d’affichage.

field MAX_SIZE_UPLOAD: int = 20000000

Taille maximum des fichiers téléversés, en octets.

field MEETING_LOCALE_VARIANT: MeetingLocaleVariant = MeetingLocaleVariant.REUNION

Variante de locale pour le vocabulaire des réunions.

Peut être cours ou seminaire. Si vide : réunion par défaut.

field MEETING_LOGOUT_URL: str | None = None

URL vers laquelle sont redirigés les utilisateurs après un séminaire.

field MEETING_MAIL_SUBJECT: Any = l'Invitation à une réunion en ligne immédiate du Webinaire de l’Etat'

Formulation du titre du mail d’invitation à une réunion.

field NC_LOGIN_API_KEY: str | None = None

Clé d’API Nextcloud.

field NC_LOGIN_API_URL: str | None = None

URL du fournisseur d’accès utilisé par Nextcloud.

Par exemple https://auth.example.org.

field NC_LOGIN_TIMEDELTA_DAYS: int = 30

Durée en jours avant l’expiration des autorisations Nextcloud.

field OIDC_ATTENDEE_CLAIMS_MAPPING: dict[str, str] = {}

Correspondance entre les champs utilisateur de B3Desk (clés) et les claims renvoyés par le serveur d’identité des participants authentifiés (valeurs).

Si non renseigné, prend la valeur de OIDC_CLAIMS_MAPPING.

Exemple en variable d’environnement
OIDC_ATTENDEE_CLAIMS_MAPPING='{"given_name":"given_name","family_name":"usual_name"}'
field OIDC_ATTENDEE_CLIENT_AUTH_METHOD: str | None = None

Méthode de communication avec le point d’entrée token_endpoint du serveur d’identité des participants authentifiés.

Si non renseigné, prend la valeur de OIDC_CLIENT_AUTH_METHOD.

field OIDC_ATTENDEE_CLIENT_ID: str | None = None

ID du client auprès du serveur d’identité des participants authentifiés.

Si non renseigné, prend la valeur de OIDC_CLIENT_ID.

field OIDC_ATTENDEE_CLIENT_SECRET: str | None = None

Secret permettant d’identifier le client auprès du serveur d’identité des participants authentifiés.

Si non renseigné, prend la valeur de OIDC_CLIENT_ID.

field OIDC_ATTENDEE_ENABLED: bool | None = True

Indique si le serveur d’authentification des participants est activé ou non.

Si le serveur est KO, en passant cette variable à False, l’authentification ne sera plus nécessaire pour les liens d’invitation authentifiés, ce qui permet de faire en sorte que les liens restent valides.

field OIDC_ATTENDEE_INTROSPECTION_AUTH_METHOD: str = 'client_secret_basic'

Méthode de communication avec le point d’entrée d’introspection token_introspection du serveur d’identité des participants authentifiés.

Si non renseigné, prend la valeur de OIDC_INTROSPECTION_AUTH_METHOD.

field OIDC_ATTENDEE_ISSUER: str | None = None

URL du serveur d’identité des participants authentifiés.

Si non renseigné, prend la valeur de OIDC_ISSUER.

field OIDC_ATTENDEE_SCOPES: Annotated[list[str], NoDecode, BeforeValidator(func=split_comma_separated_strings, json_schema_input_type=PydanticUndefined)] | None = None

Liste des scopes OpenID Connect pour lesquels une autorisation sera demandée au serveur d’identité des participants authentifiés, séparés par des virgules.

Si non renseigné, prend la valeur de OIDC_SCOPES.

Passé en paramètre auth_request_params de flask-pyoidc. Plus d’infos sur https://flask-pyoidc.readthedocs.io/en/latest/api.html#module-flask_pyoidc.provider_configuration

field OIDC_ATTENDEE_SERVICE_NAME: str | None = None

Nom du service d’authentification des participants authentifiés. Utilisé pour l’affichage dans la modale d’invitation de participants authentifés.

Si non renseigné, prend la valeur de OIDC_SERVICE_NAME.

field OIDC_ATTENDEE_USERINFO_HTTP_METHOD: str | None = None

Méthode GET ou POST à utiliser pour les requêtes sur le point d’entrée UserInfo du serveur d’identité.

Si non renseigné, prend la valeur de OIDC_USERINFO_HTTP_METHOD.

Plus d’infos sur https://flask-pyoidc.readthedocs.io/en/latest/api.html?highlight=userinfo_http_method#flask_pyoidc.provider_configuration.ProviderConfiguration

field OIDC_AUTH_URI: str | None = None

Probablement un relicat de flask-oidc, semble inutilisé.

field OIDC_CLAIMS_MAPPING: dict[str, str] = {}

Correspondance entre les champs utilisateur de B3Desk (clés) et les claims renvoyés par le serveur d’identité (valeurs).

Permet d’adapter B3Desk à des serveurs OIDC qui n’utilisent pas les claims standards, par exemple ProConnect où le nom de famille est renvoyé dans le claim usual_name plutôt que family_name.

Les champs utilisateurs supportés sont given_name, family_name, email et preferred_username. Tout champ absent de la configuration est lu directement depuis le claim de même nom.

Si laissé vide (valeur par défaut), aucun mapping n’est appliqué et les claims sont lus tels quels.

Exemple en variable d’environnement
OIDC_CLAIMS_MAPPING='{"given_name":"given_name","family_name":"usual_name","email":"email"}'
field OIDC_CLIENT_AUTH_METHOD: str | None = 'client_secret_post'

Méthode de communication avec le point d’entrée token_endpoint du serveur d’identité des organisateurs.

field OIDC_CLIENT_ID: str | None = None

ID du client auprès du serveur d’identité des organisateurs.

field OIDC_CLIENT_SECRET: str | None = None

Secret permettant d’identifier le client auprès du serveur d’identité des organisateurs.

Probablement un relicat de flask-oidc, semble inutilisé.

field OIDC_INTROSPECTION_AUTH_METHOD: str = 'client_secret_basic'

Méthode de communication avec le point d’entrée d’introspection token_introspection du serveur d’identité des organisateurs.

field OIDC_ISSUER: str | None = None

URL du serveur d’identité des organisateurs de réunion.

Par exemple : https://auth.example.com

field OIDC_OPENID_REALM: str = 'apps'

Probablement un relicat de flask-oidc, semble inutilisé.

field OIDC_REDIRECT_URI: str | None = None

URL de B3Desk vers laquelle le serveur d’identité redirige les utilisateurs après authentification.

Par exemple https://visio-test.education.fr/oidc_callback

Plus d’infos sur https://flask-pyoidc.readthedocs.io/en/latest/configuration.html?highlight=OIDC_REDIRECT_URI#static-client-registration

field OIDC_REQUIRE_VERIFIED_EMAIL: bool = False

Probablement un relicat de flask-oidc, semble inutilisé.

field OIDC_SCOPES: Annotated[list[str], NoDecode, BeforeValidator(func=split_comma_separated_strings, json_schema_input_type=PydanticUndefined)] = ['openid', 'email', 'profile']

Liste des scopes OpenID Connect pour lesquels une autorisation sera demandée au serveur d’identité, séparés par des virgules.

Passé en paramètre auth_request_params de flask-pyoidc. Plus d’infos sur https://flask-pyoidc.readthedocs.io/en/latest/api.html#module-flask_pyoidc.provider_configuration

Exemple dans un fichier de configuration TOML
OIDC_SCOPES = "openid, email, profile, siret, usual_name"
Exemple en variable d’environnement
OIDC_SCOPES="openid,email,profile,siret,usual_name"
Constraints:
  • __module__ = pydantic_settings.sources.types

  • __firstlineno__ = 22

  • __doc__ = Annotation to prevent decoding of a field value.

  • __static_attributes__ = ()

  • __dict__ = {“__module__”: “pydantic_settings.sources.types”, “__firstlineno__”: 22, “__doc__”: “Annotation to prevent decoding of a field value.”, “__static_attributes__”: (), “__dict__”: <attribute “__dict__” of “NoDecode” objects>, “__weakref__”: <attribute “__weakref__” of “NoDecode” objects>}

  • __weakref__ = <attribute “__weakref__” of “NoDecode” objects>

  • func = <function split_comma_separated_strings at 0x794225b3b270>

  • json_schema_input_type = PydanticUndefined

field OIDC_SERVICE_NAME: str | None = None

Probablement un relicat de flask-oidc, semble inutilisé à part en valeur par défaut de OIDC_ATTENDEE_SERVICE_NAME.

field OIDC_TOKEN_URI: str | None = None

Probablement un relicat de flask-oidc, semble inutilisé.

field OIDC_USERINFO_HTTP_METHOD: str = 'POST'

Méthode GET ou POST à utiliser pour les requêtes sur le point d’entrée UserInfo du serveur d’identité.

Plus d’infos sur https://flask-pyoidc.readthedocs.io/en/latest/api.html?highlight=userinfo_http_method#flask_pyoidc.provider_configuration.ProviderConfiguration

field OIDC_USERINFO_URI: str | None = None

Probablement un relicat de flask-oidc, semble inutilisé.

field OIDC_USER_INFO_ENABLED: bool = True

Probablement un relicat de flask-oidc, semble inutilisé.

field PISTE_OAUTH_API_URL: str | None = 'https://oauth.piste.gouv.fr/api'

PISTE OAUTH APU url

basic url for PISTE OAUTH API used to get access token to captchetat API

field PISTE_OAUTH_CLIENT_ID: str | None = None

Piste Oauth client_id

Oauth client id can be retrieved from the PISTE site under APPLICATION on the following line: Identifiants Oauth

field PISTE_OAUTH_CLIENT_SECRET: str | None = None

Piste Oauth client_secret

Oauth client secret can be retrieved from the PISTE site under APPLICATION on the following line: Identifiants Oauth under the following column: Secret Key

field PREFERRED_URL_SCHEME: str = 'https'

La méthode préférée utilisée pour générer des URL. Peut être http ou https.

Plus d’infos sur https://flask.palletsprojects.com/en/3.0.x/config/#PREFERRED_URL_SCHEME.

field PRIVATE_KEY: str | None = None

Private key generated by joserfc, double quotes are mandatory.

It will be used to generate a token for SIPMediaGW connection security. Changing the private-key makes all tokens invalid. Required if SIP is enabled.

field QUICK_MEETING: bool = True

Affiche le lien de création de réunions improvisées.

Formulation de « Lien Participant » dans les liens BBB.

field QUICK_MEETING_DEFAULT_NAME: Any = l'Réunion improvisée'

Nom par défaut des réunions improvisées.

field QUICK_MEETING_LOGOUT_URL: str | None = None

Lien vers lequel sont redirigés les participants à la fin d’une réunion improvisée.

Par défaut, c’est la page d’accueil du service B3Desk.

Formulation de « Lien Modérateur » dans les liens BBB.

field QUICK_MEETING_MODERATOR_WELCOME_MESSAGE: Any = l'Bienvenue aux modérateurs. Pour inviter quelqu'un à cette réunion, envoyez-lui l'un de ces liens :'

Formulation du message d’accueil aux modérateurs dans BBB.

field RECORDING: bool = False

Active la fonctionnalité d’enregistrement des réunions.

field RECORDING_DURATION: timedelta | None = datetime.timedelta(days=365)

Durée par défaut de conservation des enregistrements.

Utilisé à des fins d’affichage seulement.

field RECORDING_EXPECTED_FORMATS: Annotated[list[str], NoDecode, BeforeValidator(func=split_comma_separated_strings, json_schema_input_type=PydanticUndefined)] = ['presentation', 'video']

Formats de lecture attendus pour un enregistrement BBB.

La notification n’est émise qu’une fois tous ces formats disponibles, auxquels s’ajoute ai-summary lorsque le compte-rendu IA est activé pour le séminaire. Le format ai-summary ne doit pas figurer dans cette liste : il est ajouté automatiquement selon la configuration de chaque séminaire.

Une instance qui ne produit pas le format video doit le retirer de cette liste, sans quoi la complétude ne sera jamais atteinte et chaque mail attendra l’expiration de RECORDING_NOTIFICATION_MAX_DELAY.

Constraints:
  • __module__ = pydantic_settings.sources.types

  • __firstlineno__ = 22

  • __doc__ = Annotation to prevent decoding of a field value.

  • __static_attributes__ = ()

  • __dict__ = {“__module__”: “pydantic_settings.sources.types”, “__firstlineno__”: 22, “__doc__”: “Annotation to prevent decoding of a field value.”, “__static_attributes__”: (), “__dict__”: <attribute “__dict__” of “NoDecode” objects>, “__weakref__”: <attribute “__weakref__” of “NoDecode” objects>}

  • __weakref__ = <attribute “__weakref__” of “NoDecode” objects>

  • func = <function split_comma_separated_strings at 0x794225b3b270>

  • json_schema_input_type = PydanticUndefined

field RECORDING_NOTIFICATION_MAX_DELAY: int = 3600

Délai maximum (en secondes) avant l’envoi du mail notifiant la disponibilité d’un enregistrement.

En fonctionnement nominal, le mail est envoyé dès que tous les formats attendus sont disponibles (et que le délai minimum est écoulé). Passé ce délai maximum, décompté depuis le premier callback, le mail est envoyé avec les formats disponibles à cet instant, même si tous les formats attendus ne sont pas encore prêts — par exemple un compte-rendu IA qui tarde ou échoue.

field RECORDING_NOTIFICATION_MIN_DELAY: int = 60

Délai minimum (en secondes) avant l’envoi du mail notifiant la disponibilité d’un enregistrement.

BBB envoie un callback par format de rendu publié (presentation, video…). Aucune notification n’est envoyée avant l’expiration de ce délai, décompté depuis le premier callback reçu pour un enregistrement, même si tous les formats attendus sont déjà disponibles. Il laisse à BBB le temps de publier les formats rapides avant l’envoi.

field REDIS_URL: str | None = None

L’URL du serveur redis utilisé pour les tâches asynchrones.

Par exemple localhost:6379.

field RIE_NETWORK_IPS: Annotated[list[str], NoDecode, BeforeValidator(func=split_comma_separated_strings, json_schema_input_type=PydanticUndefined)] | None = None

Plages d’adresses IP du réseau interministériel de l’État.

Affiche un encart particulier pour les utilisateurs se connectant depuis ce réseau.

field SATISFACTION_POLL_URL: str | None = None

URL de l’iframe du formulaire de satisfaction.

field SECONDARY_IDENTITY_PROVIDER_CLIENT_ID: str | None = None

ID du client B3desk dans ce serveur d’identité.

field SECONDARY_IDENTITY_PROVIDER_CLIENT_SECRET: str | None = None

Secret du client B3desk dans ce serveur d’identité.

field SECONDARY_IDENTITY_PROVIDER_ENABLED: bool | None = False

Indique si un second serveur d’identité pour la connection a un Nextcloud est activée.

S’il y a bien besoin de ce second serveur d’identité pour connecter un utilisateur sur un Nextcloud, l’identifiant Nextcloud de l’utilisateur sera recherché à partir de son mail.

field SECONDARY_IDENTITY_PROVIDER_REALM: str | None = None

Groupe sous lequel est enregistré l’utilisateur.

field SECONDARY_IDENTITY_PROVIDER_URI: str | None = None

Url du serveur d’identité permettant de retrouver un id utilisateur à partir de son email.

field SECRET_KEY: str [Required]

Clé secrète utilisée notamment pour la signature des cookies. Cette clé DOIT être différente pour TOUTES les instances de B3Desk, et être tenue secrète. Peut être générée avec python -c 'import secrets; print(secrets.token_hex())'

Plus d’infos sur https://flask.palletsprojects.com/en/3.0.x/config/#SECRET_KEY

field SENTRY_DSN: str | None = None

Sentry DSN to catch exceptions.

field SERVER_NAME: str [Required]

Le nom de domaine sur lequel est déployé l’instance B3Desk.

Par exemple b3desk.example.org, sans https://.

Plus d’infos sur https://flask.palletsprojects.com/en/3.0.x/config/#SERVER_NAME.

field SERVICE_TAGLINE: str = 'Le service de webinaire pour les agents de l’État'

Slogan du service B3Desk.

field SERVICE_TITLE: str = 'Webinaire'

Nom du service B3Desk.

field SHORTY: bool = False

Affichage court des listes de réunions.

field SMTP_FROM: str | None = None

Adresse email d’expéditeur pour les mails d’invitation.

field SMTP_HOST: str | None = None

Addresse du serveur SMTP.

field SMTP_PASSWORD: str | None = None

Mot de passe du serveur SMTP.

field SMTP_PORT: int | None = None

Port du serveur SMTP.

field SMTP_SSL: bool | None = False

Connexion SSL au serveur SMTP.

field SMTP_STARTTLS: bool | None = False

Connexion StartTLS au serveur SMTP.

field SMTP_USERNAME: str | None = None

Identifiant auprès du serveur SMTP.

field SQLALCHEMY_DATABASE_URI: str [Required]

URI de configuration de la base de données.

Par exemple postgresql://user:password@localhost:5432/bbb_visio

field SQLALCHEMY_TRACK_MODIFICATIONS: bool = False

Traçage des évènements de modification des modèles dans SQLAlchemy.

Plus d’informations sur https://flask-sqlalchemy.palletsprojects.com/en/3.1.x/track-modifications/

field STATS_CACHE_DURATION: int = 1800

Durée de rétention du cache des statistiques des réunions.

field STATS_INDEX: int = 2

Numéro de ligne des statistiques de réunion dans le fichier CSV.

field STATS_URL: str | None = None

URL du fichier de statistiques des réunions.

Par exemple https://visio-test.education.fr/static/local/stats.csv

field TESTING: bool = False

Mode tests unitaires, à ne surtout pas utiliser en production.

Plus d’informations sur https://flask.palletsprojects.com/en/3.0.x/config/#TESTING

field TIME_FORMAT: str = '%Y-%m-%d'

Format des dates utilisées lors des échanges avec l’API de Nextcloud.

Plus d’informations sur https://docs.python.org/fr/3/library/datetime.html#strftime-and-strptime-format-codes

field TITLE: str = 'BBB-Visio'

Titre HTML par défaut pour les pages HTML.

field TMP_DOWNLOAD_DIR: str [Required]

Chemin vers un dossier qui servira de stockage temporaire de fichiers entre Nextcloud et BBB.

field UPLOAD_DIR: str [Required]

Chemin vers le dossier dans lequel seront stockés les fichiers téléversés par les utilisateurs.

List of streaming service for video sharing.

field WELCOME_PAGE_SUBTITLE: Any = l'Mes salles de réunion'

Formulation du sous-titre de la page de création de réunion.

field WTF_CSRF_TIME_LIMIT: int = 86400

Indique en secondes la durée de validité des jetons CSRF.

Il est nécessaire de mettre une valeur plus élevée que le délai de mise en cache des pages par le serveur web. Sans quoi les navigateurs des utilisateurs serviront des pages en caches contenant des jetons CSRF expirés.

Plus d’infos sur https://flask-wtf.readthedocs.io/en/1.2.x/config/

Return documentation link metadata including URL and external flag.

Nginx

B3Desk fournit des pages d’erreurs statiques qui peuvent être affichées en cas de problème. Pour utiliser ces pages statiques, on peut utiliser le paramètre error_page de Nginx:

error_page 500 502 503 504 /static/errors/custom_50x.html;

Avec cette configuration, dès que le service est indisponible, Nginx servira cette page d’erreur:

../_images/b3desk-500.png

Jumelage avec Apps

Configuration de B3Desk

Afin que les utilisateurs de b3desk puissent accéder à leurs fichiers Nextcloud d’Apps, il faut que l’application puisse récupérer l’identifiant attendu par Nextcloud. Pour ce faire une requête est faite sur l’API Users de Keycloak.

Il est donc nécessaire de configurer les paramètres de configuration suivants :

On peut ensuite tester que la configuration est correcte grâce à la commande suivante :

docker exec -it <CONTAINER_ID/NAME> flask get-apps-id <email@example.com>

En remplaçant <CONTAINER_ID/NAME> par l’identifiant du conteneur b3desk_web ou simplement son nom, et <email@example.com> par l’email d’un utilisateur, cette commande tente une connexion à l’API keycloak d’apps, afin de récupérer l’identifiant dont l’email a été passé en paramètre.

Si la connexion à l’API de keycloak échoue, cette commande indiquera à quelle étape, et quelles sont les pistes de résolution.

Configuration de Keycloak

Pour que la connexion de B3Desk à Apps fonctionne correctement, il est nécessaire que keycloak autorise les connexion par identifiants client.

Vérifier que la configuration de Keycloak est correcte

  • Se rendre la console d’administration Keycloak, dans le realm apps. Par exemple https://auth.eole3.dev/auth/admin/master/console/#/apps

  • Se rendre dans la section « Clients » et sélectionner « b3desk »

  • Sélectionner l’onglet « Service account roles »

  • À cet endroit on doit voir deux lignes avec les droits real-management view-users et realm-management query-users.

../_images/keycloak-service-account-roles.png

Configuration de Keycloak est correcte

Si les droits real-management view-users et realm-management query-users ne sont pas présents, il faut les ajouter :

  • Cliquer sur le bouton « Assign roles », une fenêtre modale doit s’ouvrir

  • Cliquer sur le menu déroulant des filtres en haut à gauche, et sélectionner « Filter by clients » plutôt que « Filter by realm roles »

  • Dans le champ de recherche, entrer « users » et valider

  • Cocher « view-users » et « query-users » puis sur le bouton « Assign »

Utilisation d’un materiel visio SIPMediaGW

Configuration de la SIP dans B3Desk

Afin de permettre au matériel visio SIPMediaGW de rejoindre une visio via B3Desk, il faut lui communiquer un token qui sécurisera la connexion à B3Desk.

Dans un premier temps, il faut générer une clé privée :

docker exec -it <CONTAINER_ID/NAME> flask generate-private-key

En remplaçant <CONTAINER_ID/NAME> par l’identifiant du conteneur b3desk_web ou simplement son nom, cette commande va générer une clé privée qui sera affectée à l’instance B3Desk. Afin de permettre que les tokens générés avec cette clé privée soient reconnus par tous les serveurs, il convient d’utiliser la même clé privée sur tous les serveurs d’une même instance B3Desk.

On peut ensuite configurer les paramètres suivants de manière identique pour tous les serveurs d’une même instance B3Desk :

web.env
ENABLE_SIP=on
FQDN_SIP_SERVER=example.serveur.com
PRIVATE_KEY="-----BEGIN PRIVATE KEY-----
ThereIsAWonderfulPrivateKey
-----END PRIVATE KEY-----"

Avertissement

Pour les données s’étalant sur plusieurs lignes, pensez à les entourer de guillements doubles ".

Il est maintenant nécessaire de redémarrer le conteneur de chaque serveur :

docker compose -f docker-compose.yml -f docker-compose.prod.yml web -d

Il est possible de vérfier que le paramétrage a été correctement effectué :

docker exec -it <CONTAINER_ID/NAME> flask check-sip-setttings

Générer un sip-token

Une fois que B3Desk est correctement paramétré, la généreration de sip-token est active :

docker exec -it <CONTAINER_ID/NAME> flask generate-sip-token

Ce token est valide sans limite de temps, tant que la clé privée reste la même. Un même token pourra servir pour plusieurs services différents de visio SIPMediaGW tant qu’ils requêtent la même instance possèdant la bonne clé privée.

Vous pouvez vérifier que le token est valide avec la commande :

docker exec -it <CONTAINER_ID/NAME> flask check-sip-token "<token>"

Il suffira de transmettre ce token au matériel SIP qui devra le joindre dans le header {"Authorization": <token>} lors de ses requêtes sur la route suivante : https://<instance_b3desk>/sip-connect/<visio_code>

Gestion des administrateurs

Donner les droits admin

docker exec -it <CONTAINER_ID/NAME> flask user-to-admin <email>

Retirer les droits admin

docker exec -it <CONTAINER_ID/NAME> flask admin-to-user <email>