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 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 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
- field DOCUMENTATION_LINK_URL: str | None = None
Surcharge l’adresse de la page de documentation si renseigné.
- field EXTERNAL_UPLOAD_DESCRIPTION: str = 'Fichiers depuis votre Nextcloud'
Description dans BBB des fichiers téléversés dans Nextcloud.
- field MAILTO_LINKS: bool = False
Affiche des liens vers les adresses email des modérateurs et participants dans la liste des réunions.
- 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_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 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_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
ouPOST
à 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_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.
- field OIDC_ID_TOKEN_COOKIE_SECURE: bool = False
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_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_USERINFO_HTTP_METHOD: str = 'POST'
Méthode
GET
ouPOST
à 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 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_ATTENDEE_LINK_INTRODUCTION: Any = l' Lien Participant '
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.
- field QUICK_MEETING_MODERATOR_LINK_INTRODUCTION: Any = l' Lien Modérateur '
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_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 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 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_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 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 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/
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:
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/#/appsSe 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
etrealm-management query-users
.
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 »