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_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_ENDPOINT: str | None = None

URL du service BBB.

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

field BIGBLUEBUTTON_SECRET: str | None = None

Mot de passe du service BBB.

field CLIPBOARD: bool = False

Semble inutilisé.

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 EMAIL_WHITELIST: Any = None
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.

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

field MAIL_MEETING: bool = False

Active l’organisation de réunion par envoi de liens par email.

field MAIL_MODERATOR_WELCOME_MESSAGE: Any = None

Formulation du message d’accueil aux modérateurs dans BBB, dont le lien à été envoyé par mail.

Par défaut s’adapte à WORDING_THIS_MEETING.

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 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_KEY_WORDING: str = 'reunion'

Nommage des réunions.

Peut-être reunion, cours ou séminaire.

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 = None

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

Par défaut s’adapte à MEETING_KEY_WORDING.

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_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: list[str] | 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_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_INFO_REQUESTED_FIELDS: list[str] = ['email', 'given_name', 'family_name']

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 http://localhost:5000/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: list[str] = ['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

Constraints:
  • func = <function split_comma_separated_strings at 0x7fc3dba68b80>

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 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 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: str | None = None

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

Par défaut prend la valeur de WORDING_IMPROVISED_MEETING.

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 = None

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

Par défaut s’adapte à WORDING_THIS_MEETING.

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 REDIS_URL: str | None = None

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

Par exemple localhost:6379.

field RIE_NETWORK_IPS: list[str] | 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 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 http://localhost:5000/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.

field WELCOME_PAGE_SUBTITLE: Any = None

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

Par défaut s’adapte à MEETING_KEY_WORDING.

field WORDING_AN_IMPROVISED_MEETING: Any = None

Formulation de « une réunion improvisée », par exemple un cours improvisé ou un séminaire improvisé.

Par défaut s’adapte à MEETING_KEY_WORDING.

field WORDING_A_MEETING: Any = None

Formulation de « une réunion », par exemple un cours ou un séminaire.

Par défaut s’adapte à MEETING_KEY_WORDING.

field WORDING_A_MEETING_TO_WHICH: Any = None

Formulation de « une réunion à laquelle », par exemple un cours auquel ou un séminaire auquel.

Par défaut s’adapte à MEETING_KEY_WORDING.

field WORDING_A_QUICK_MEETING: Any = None

Formulation de « une réunion immédiate », par exemple un cours immédiat ou un séminaire immédiat.

Par défaut s’adapte à MEETING_KEY_WORDING.

field WORDING_GOOD_MEETING: Any = None

Formulation de « bonne réunion », par exemple bon cours ou bon séminaire.

Par défaut s’adapte à MEETING_KEY_WORDING.

field WORDING_IMPROVISED_MEETING: Any = None

Formulation de « réunion improvisée », par exemple cours improvisé ou séminaire improvisé.

Par défaut s’adapte à MEETING_KEY_WORDING.

field WORDING_MEETING: Any = None

Formulation de « réunion », par exemple cours ou séminaire.

Par défaut s’adapte à MEETING_KEY_WORDING.

field WORDING_MEETINGS: Any = None

Formulation de « réunions », par exemple cours ou séminaires.

Par défaut s’adapte à MEETING_KEY_WORDING.

field WORDING_MEETING_PRESENTATION: str = 'présentation'

Formulation de « présentation » qui désigne les fichiers accompagnant les réunions.

field WORDING_MEETING_UNDEFINED_ARTICLE: Any = None

Formulation de l’article indéterminé de « réunion » comme « une », par exemple un.

Par défaut s’adapte à MEETING_KEY_WORDING.

field WORDING_MY_MEETING: Any = None

Formulation de « ma réunion », par exemple mon cours ou mon séminaire.

Par défaut s’adapte à MEETING_KEY_WORDING.

field WORDING_OF_THE_MEETING: Any = None

Formulation de « de la réunion », par exemple du cours ou du séminaire.

Par défaut s’adapte à MEETING_KEY_WORDING.

field WORDING_PRIVATE_MEETINGS: Any = None

Formulation de « réunions privées », par exemple cours privés ou séminaires privés.

Par défaut s’adapte à MEETING_KEY_WORDING.

field WORDING_THE_MEETING: Any = None

Formulation de « la réunion », par exemple le cours ou le séminaire.

Par défaut s’adapte à MEETING_KEY_WORDING.

field WORDING_THIS_MEETING: Any = None

Formulation de « cette réunion », par exemple ce cours ou ce séminaires.

Par défaut s’adapte à MEETING_KEY_WORDING.

field WORDING_TO_THE_MEETING: Any = None

Formulation de « à la réunion », par exemple au cours ou au séminaires.

Par défaut s’adapte à MEETING_KEY_WORDING.

field WORDING_UPLOAD_FILE: str = 'envoyer'

Semble inutilisé.

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/

property WORDINGS: dict[str, Any]

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> flask get-apps-id <email@example.com>

En remplaçant <CONTAINER_ID> par l’identifiant du conteneur b3desk_web, 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 »