Record API

Le rôle reemo-infra peut déployer Record API, le service qui enregistre les sessions de conteneur (images de l’écran et journaux) et les restitue dans la Zone d’administration. Ce service n’est pas déployé par défaut.

Voir aussi

Enregistrements de session — Rejouez les sessions enregistrées depuis la Zone d’administration.

Ce que Record API déploie

Quand Record API est activé, le rôle déploie sur le Swarm :

  • recorddb : la base de données des sessions, de l’index des images et des journaux, basée sur YugabyteDB (compatible PostgreSQL).

  • recordapi : le service qui reçoit les images de l’agent, les chiffre sur disque et permet de rejouer les sessions.

  • recordportal : la passerelle (nginx) par laquelle les agents des conteneurs envoient leurs images, en TLS mutuel, sur le port 8447.

  • recordapidb : une tâche ponctuelle qui crée et met à jour le schéma de la base.

Seul le port 8447 de la passerelle est exposé aux agents. recordapi et la base restent internes au Swarm.

Activation

RECORDAPI_ENABLED: true
RECORDDB_EAR_KEY_B64: "{{ vault_recorddb_ear_key_b64 }}"
  • RECORDAPI_ENABLED : active Record API (false par défaut). Cette seule variable déploie la base, recordapi et la passerelle, ouvre le port 8447 de Traefik et configure l’API.

  • RECORDDB_EAR_KEY_B64 : clé de chiffrement de la base au repos, en base64 (32 octets). Elle n’est jamais générée : sans elle, le premier déploiement s’arrête.

Pour générer la clé :

openssl rand 32 | base64 -w0

Rangez-la dans votre coffre (vault) et conservez-en une copie hors du cluster : sans elle, la base est illisible.

Au premier déploiement, renseignez aussi PORTAL_URL. Passez INIT_DB=true en extra-var, jamais dans l’inventaire. Cette option enregistre la passerelle RECORD dans l’API :

ansible-playbook -i inventory.yml playbooks/reemo-infra.yml -e INIT_DB=true

Placez les variables de Record API dans all ou dans le groupe qui porte l’API : infra_manager (tout-en-un) ou api_manager (architecture séparée). Une variable placée sous portal_manager n’a aucun effet sur Record API.

Une fois Record API déployé, réglez l’enregistrement (vidéo et texte) dans les modèles et les profils de conteneur.

Avertissement

Quand Record API est activé, l’enregistrement est obligatoire : si l’agent d’un conteneur ne peut pas joindre le service (passerelle injoignable, stockage plein ou non inscriptible), la session est coupée. Vérifiez la passerelle et le stockage avant d’activer Record API en production.

Chiffrement et secrets

recordapi chiffre chaque image avant de l’écrire, et la base est chiffrée au repos. Laissez RECORDDB_SSL_REQUIRE et RECORDDB_EAR_ENABLED à true (valeurs par défaut).

  • RECORDAPI_MASTERKEY : clé de chiffrement des images, en base64 (32 octets). Fournissez-la depuis votre coffre dès la mise en production. Laissée vide, elle est générée et n’existe alors que dans le Swarm : si le Swarm est perdu, les images deviennent illisibles.

  • RECORDDB_APP_PASSWORD : mot de passe applicatif de la base. Fournissez-le pour pouvoir le retrouver hors du Swarm (généré s’il est vide).

  • SECUREGATEWAY_HMAC : secret HMAC de signature de la passerelle (généré s’il est vide). Renseignez-le lorsque plusieurs Swarms doivent partager la même valeur.

Note

Un secret Swarm n’est créé qu’une fois, au premier déploiement. Modifier ensuite la variable d’inventaire n’a aucun effet : les rotations se font manuellement.

Stockage des enregistrements

Par défaut, les images sont écrites sur l’hôte, dans /opt/<INSTANCE_NAME>/records (/opt/reemo/records avec le nom d’instance par défaut). Pour un volume plus important, utilisez un disque dédié ou un partage monté par le rôle :

RECORDAPI_STORAGE_MODE: "nfs"
RECORDAPI_STORAGE_REMOTE_HOST: "nfs.example.local"
RECORDAPI_STORAGE_REMOTE_EXPORT: "/export/reemo-records"
  • RECORDAPI_STORAGE_MODE : local (par défaut), nfs ou smb. Toute autre valeur arrête le déploiement.

  • RECORDAPI_STORAGE_LOCALPATH : dossier de l’hôte (point de montage en mode externe).

  • RECORDAPI_STORAGE_REMOTE_HOST et RECORDAPI_STORAGE_REMOTE_EXPORT : serveur et chemin exporté (NFS) ou nom du partage (SMB).

  • RECORDAPI_STORAGE_SMB_USER, RECORDAPI_STORAGE_SMB_PASSWORD et RECORDAPI_STORAGE_SMB_DOMAIN : identifiants SMB. Fournissez le mot de passe depuis votre coffre.

Le rôle protège les enregistrements : il s’arrête si le partage n’est pas monté, ou si l’utilisateur du service (uid 100) ne peut pas y écrire. Côté serveur de stockage, exportez en NFS avec all_squash,anonuid=100,anongid=0, et donnez au compte de service le droit de modification en SMB.

Important

Le rôle ne déplace pas les données existantes. Passer du mode local à un partage masque les sessions déjà enregistrées : recopiez-les avant de basculer.

Rétention et purge

  • RECORDAPI_RETENTION_DAYS : durée de conservation des enregistrements, en jours (90 par défaut, 0 pour une conservation illimitée).

La purge des sessions expirées est assurée par le service recordapicron, déployé avec Record API :

  • RECORDAPICRON_ENABLED : déploie le service de purge. Par défaut, il suit RECORDAPI_ENABLED : il n’y a rien à renseigner. Passez-le à false pour désactiver la purge.

  • RECORDAPICRON_STORAGE_WARNING_THRESHOLD : seuil d’alerte d’occupation du stockage, en pourcentage (80 par défaut).

Sur une installation déjà déployée, passer RECORDAPICRON_ENABLED à false ne supprime pas le service. Pour arrêter la purge, ramenez le service à zéro réplica :

docker service scale reemo_recordapicron=0

Important

Si vous désactivez recordapicron, aucune session n’est purgée : le stockage grossit sans limite. Surveillez l’espace disponible dans l’onglet Stockage & état (voir Stockage & état).

Restreindre l’accès à la passerelle

RECORD_PORTAL_RESTRICT_IP:
  - name: provisions
    ip: "10.0.30.0/24"
  • RECORD_PORTAL_RESTRICT_IP : liste des adresses autorisées à joindre la passerelle. Chaque entrée porte un name et un ip. Limitez la liste aux nœuds provision.

  • RECORD_PORTAL_PORT : port public de la passerelle (8447 par défaut). Ouvrez-le dans votre pare-feu. Sur une installation existante, mettez aussi à jour le port de la passerelle dans les Passerelles sécurisées après toute modification.

Architecture séparée

En architecture séparée, Record API et sa passerelle tournent sur le Swarm API (groupe api_manager), et le service de signalisation reste sur le Swarm du portail. Renseignez PROVISION_SIGNAL_IP avec l’adresse du portail, même si la variable est lue côté API :

all:
    vars:
        RECORDAPI_ENABLED: true
        PROVISION_SIGNAL_IP:
            - ip: "10.0.10.25"

Si vous indiquez l’adresse de l’API à la place, les conteneurs échouent avec des erreurs « Connection refused » vers le signal.

Commandes dans le lecteur

Les commandes et les URL affichées dans les journaux du lecteur proviennent des journaux de session de l’agent. Elles exigent un service de signalisation en version 2.14.0 ou supérieure (DOCKER_VERSION_SIGNAL) et le réglage Enregistrement textuel sur Portail ou Portail et sortie standard, dans le modèle de conteneur ou le profil de conteneur (étape Enregistrement de session). Avec Sortie standard seule, les lignes restent dans les journaux du conteneur et ne remontent pas dans le lecteur. Sinon, les compteurs Commandes et les journaux du lecteur restent vides.

Exemples d’inventaire

Tout-en-un, avec stockage NFS et accès restreint :

infra_manager:
    vars:
        PORTAL_URL: "url.domain.tld"
        RECORDAPI_ENABLED: true
        RECORDDB_EAR_KEY_B64: "{{ vault_recorddb_ear_key_b64 }}"
        RECORDAPI_MASTERKEY: "{{ vault_recordapi_masterkey }}"
        RECORDAPI_STORAGE_MODE: "nfs"
        RECORDAPI_STORAGE_REMOTE_HOST: "nfs.example.local"
        RECORDAPI_STORAGE_REMOTE_EXPORT: "/export/reemo-records"
        RECORDAPI_RETENTION_DAYS: "90"
        RECORD_PORTAL_RESTRICT_IP:
          - name: provisions
            ip: "10.0.30.0/24"

Architecture séparée :

all:
    vars:
        RECORDAPI_ENABLED: true
        PROVISION_SIGNAL_IP:
            - ip: "10.0.10.25"
api_manager:
    vars:
        RECORDDB_EAR_KEY_B64: "{{ vault_recorddb_ear_key_b64 }}"
        RECORDAPI_MASTERKEY: "{{ vault_recordapi_masterkey }}"

Vérifier le déploiement

Sur le nœud qui porte l’API, listez les services Record :

docker service ls | grep -E 'recordapi|recorddb|recordportal'

Les services reemo_recordapi, reemo_recorddb et reemo_recordportal doivent être à 1/1. reemo_recordapidb à 0/1 (tâche terminée) est normal.

Ouvrez ensuite l’onglet Stockage & état des Enregistrements de session : le Service d’enregistrement doit être Joignable et le Montage doit être Présent.

Points d’attention

  • Utilisez la même version pour recordapi et recordapidb.

  • N’exposez jamais le port interne de recordapi : laissez RECORDAPI_TRAEFIK_ENABLED à false.

  • Pour changer la version d’une image, modifiez DOCKER_VERSION_RECORD*, pas *_DOCKER_IMAGE, que le rôle recalcule.

  • Passez INIT_DB en extra-var, au premier déploiement seulement.