Exploitation du serveur
Administration et paramètres
Page d'administration, envoi des codes d'inscription (SMS et e-mail), valeurs de configuration du serveur, sauvegardes et sécurité : la référence de l'opérateur.
Le serveur intègre une page d'administration qui s'ouvre dans un navigateur. Elle permet de consulter l'état du serveur, de choisir comment les codes d'inscription et de connexion sont remis, et de gérer les utilisateurs et les bots. Cette page réunit en un seul endroit la référence de la page d'administration et des valeurs de configuration du serveur. Si vous devez d'abord installer le serveur, consultez Installation du serveur. L'interface de la page d'administration est en coréen : les libellés coréens des onglets, boutons et réglages sont indiqués ici entre parenthèses.
Ouvrir la page d'administration
La page d'administration se trouve à l'adresse /admin/ du port HTTP d'administration (8080 dans la configuration de production) et ne s'ouvre que depuis le serveur lui-même (127.0.0.1). L'opérateur y accède par un tunnel SSH.
# Sur votre ordinateur (laissez la commande tourner)
ssh -N -L 8080:127.0.0.1:8080 <utilisateur>@<serveur>
# Navigateur : http://localhost:8080/admin/
# Le jeton (sur le serveur)
sudo cat /srv/pabal/pabal_server/data/admin-token
Saisissez le jeton, puis Ouvrir (열기). Le navigateur mémorise le jeton ; pour l'effacer, utilisez Effacer le jeton (토큰 지우기) en haut à droite. Pour choisir vous-même le jeton, définissez TELEGRAM_ADMIN_TOKEN (16 caractères minimum) : aucun fichier n'est alors écrit.
Contenu de chaque onglet
| Onglet | Contenu | Actualisation |
|---|---|---|
| Tableau de bord (대시보드) | Personnes, sessions et connexions actives en ce moment ; nombre de personnes, de bots, de groupes, de messages, de photos et de fichiers ; durée de fonctionnement, ports, base de données, JVM, contrôles de santé. Un bandeau d'avertissement s'affiche si les numéros de test sont activés | 5 s |
| Codes d'inscription (가입 코드) | Codes en attente (numéro, mode de remise, état de l'envoi, code, temps restant, nombre de saisies erronées) et historique récent. Copier ou annuler un code | 3 s |
| Utilisateurs (사용자) | Tous les comptes — numéro de téléphone, e-mail de connexion (modifiable), connecté ou non, nombre d'appareils connectés, nombre de messages. Déconnecter tous les appareils (모든 기기 로그아웃), Bloquer le numéro (번호 차단), Supprimer le compte (계정 삭제, avec une note sur la façon dont la personne a été vérifiée — un compte supprimé ne laisse que son id et la note) | 10 s |
| Bots (봇) | Bots créés avec BotFather — créateur, menu des commandes, mode de connexion (MTProto · polling HTTP · adresse du webhook et raison de l'échec), nombre de mises à jour en attente | 10 s |
| Voix (음성) | Bots vocaux — état des passerelles, du relais et de la politique de confidentialité, arrêt d'urgence, ouverture au public, autorisation des transcriptions, appels en cours et raccrochage, autorisation et suspension des bots, testeurs, limites (ci-dessous) | 5 s |
| Signalements (신고) | Ce qui arrive par « Signaler » dans l'application — une copie du contenu au moment du signalement (lisible même après sa suppression par l'expéditeur). Supprimer (des deux côtés de la conversation, et chez tous les membres pour un groupe), Suspendre le compte (déconnexion de tous les appareils, plus de connexion ni d'inscription possible), liste des comptes suspendus. Le numéro d'un compte supprimé alors qu'il était suspendu ne peut plus servir à s'inscrire pendant 1 an après la suppression (par défaut) ; à la suspension, ou plus tard avec Bloquer l'inscription (재가입 막기) dans la liste, on peut le prolonger jusqu'à une date de fin plus tardive (c'est la plus tardive de l'année et de la date qui compte ; il n'est jamais raccourci) ou pour une durée indéterminée (API d'administration : POST /admin/api/reports/<id>/suspend {"userId": …, "blockSignupUntil": "2028-01-01"} ou "blockSignupForever": true ; pour la changer ensuite, POST /admin/api/suspensions/<id>/block-signup, un corps vide rétablit la valeur par défaut). Les signalements traités restent consultables. Un signalement traité est effacé, copie comprise, 3 ans après le jour de son traitement (sa carte affiche la date) ; si un litige, une enquête ou une procédure judiciaire commence, Conserver (보존) le garde jusqu’à ce qu’on le libère (API d’administration : POST /admin/api/reports/<id>/hold, et /release pour le libérer) | 10 s |
| Assistance (고객센터) | Les conversations reçues par @PabalSupport. Choisissez une conversation et répondez : la réponse part dans cette conversation au nom du bot d'assistance | 10 s |
| Paramètres (설정) | Règles d'inscription et de connexion, comptes d'examen des stores, SMS, e-mail (SMTP), blocage de numéros de téléphone, informations sur l'opérateur publiées sur le site | Enregistrement manuel |
| Noms d'utilisateur réservés (예약 아이디) | Noms d'utilisateur bloqués pour que personne ne puisse les prendre — recherche, ajout, téléchargement de la liste (.txt), noms que le serveur bloque par défaut. Réserver un nom déjà utilisé ne le retire pas à son titulaire | Une fois, à l'ouverture |
| Stockage (저장소) | Répertoire de données et adresse de la base de données (mot de passe masqué), nombre et volume des photos et des fichiers, nombre de flux stockés par type | 10 s |
Les actions dangereuses (déconnexion, blocage, annulation d'un code) ne s'exécutent qu'après un second clic.
Codes d'inscription et de connexion
Quand une personne saisit son numéro de téléphone dans l'application, le serveur crée un code et l'envoie selon le mode choisi dans l'onglet Paramètres (설정).
| Mode de remise | Où va le code | Écrans de l'application |
|---|---|---|
| Page d'administration (관리 화면) | Onglet Codes d'inscription (가입 코드). L'opérateur le copie et le communique lui-même | Numéro → « code envoyé » → code (et nom pour un nouveau numéro) |
| SMS | SMS via Twilio, Solapi ou un webhook | Comme pour la page d'administration |
| E-mail (이메일) | E-mail via SMTP | Numéro → saisie de l'e-mail → « code envoyé par e-mail » → code |
- En mode e-mail, une nouvelle inscription peut utiliser n'importe quelle adresse, qui devient l'e-mail de connexion du compte. Un compte existant ne reçoit le code qu'à son e-mail de connexion enregistré : on empêche ainsi quelqu'un d'entrer en saisissant sa propre adresse avec le numéro d'une autre personne. Pour un compte existant sans e-mail de connexion, le code est envoyé à la place par SMS (s'il est configuré) ou via la page d'administration. Vous pouvez renseigner l'e-mail de connexion depuis l'onglet Utilisateurs (사용자).
- L'envoi se fait en arrière-plan : l'application passe aussitôt à l'écran du code. Le résultat de l'envoi (succès ou échec, avec la raison) s'affiche dans l'onglet Codes d'inscription.
- L'inscription (saisie du nom) n'est possible qu'après avoir saisi le bon code. Les codes erronés ne sont acceptés qu'un nombre limité de fois ; au-delà, même le bon code est refusé.
- Le changement de numéro d'un compte (Paramètres → numéro de téléphone dans l'application) est fermé par défaut, et l'application affiche une erreur. Avec Autoriser le changement de numéro activé, le code part vers le nouveau numéro par SMS uniquement, quelle que soit la méthode d'envoi (l'onglet Codes d'inscription ne l'affiche pas, même avec l'affichage des codes — la personne à qui on le remettrait n'est peut-être pas titulaire du numéro), avec un texte à lui, le texte de changement de numéro des paramètres SMS (번호 바꾸기 문구 ; par défaut
[파발] 번호 바꾸기 확인 코드: {code}). L'intervalle de renvoi et le maximum quotidien s'appliquent au nouveau numéro et au compte ; les numéros bloqués ou suspendus, et ceux qu'un autre compte possède, sont refusés à la demande du code et de nouveau au moment du changement. Un code ne vaut que pour ce compte et ce numéro, et ne sert qu'une fois ; le code de connexion d'une autre personne qui attend ce numéro reste tel quel. Après le changement, l'ancien numéro ne connecte plus au compte.
Paramètres — inscription et connexion
| Élément | Signification | Défaut |
|---|---|---|
| Autoriser les nouvelles inscriptions (새 가입 허용) | Désactivé : seuls les comptes existants peuvent se connecter. Les nouveaux numéros sont refusés comme « numéro invalide » | Activé |
| Mode de remise des codes (코드 전달 방식) | Page d'administration / SMS / e-mail | Page d'administration |
| Afficher les codes dans la page d'administration (관리 화면에 코드 표시) | Même en mode SMS ou e-mail, affiche le code dans l'onglet Codes d'inscription (au cas où l'envoi échoue) | Activé |
| Numéros de test (+99966…) (테스트 번호) | Selon la configuration du serveur / activer / désactiver. À désactiver en production | Selon la configuration du serveur |
| Nombre de chiffres · durée de validité du code (코드 자릿수 · 코드 유효 시간) | 5 à 6 chiffres · 1 à 60 minutes | 5 chiffres · 5 minutes |
| Intervalle entre deux demandes · maximum par jour (재요청 간격 · 번호당 하루 최대 요청) | Secondes avant qu'un même numéro puisse recevoir un nouveau code (0 à 3600) · nombre maximal de demandes sur 24 heures (1 à 1000) | 60 secondes · 10 fois |
| Saisies erronées autorisées (틀린 입력 허용 횟수) | Au-delà, le code est verrouillé (1 à 20) | 5 fois |
| Autoriser le changement de numéro (번호 바꾸기 허용) | Un compte connecté peut passer à un autre numéro avec « Changer de numéro » dans l'application. Ne s'active qu'une fois le SMS configuré | Désactivé |
Paramètres — SMS
| Fournisseur | Valeurs à saisir | Remarques |
|---|---|---|
| Webhook (웹훅) | Adresse de réception (https://…), en-tête Authorization (facultatif) | Le serveur envoie POST {"phone":"+8210…","code":"12345","text":"…"}. Une réponse 2xx vaut succès. Pour vous brancher sur votre propre serveur de SMS ou sur un autre service |
| Twilio | Account SID, Auth Token, numéro d'expéditeur ou Messaging Service SID | Partout dans le monde, numéros étrangers compris |
| Solapi (ex-CoolSMS) | API Key, API Secret, numéro d'expéditeur | SMS en Corée. Le numéro d'expéditeur doit être préalablement enregistré chez Solapi. Les numéros +82 sont envoyés au format 010… |
Le texte peut contenir {code} (le code) et {minutes} (la durée de validité). Valeur par défaut : [파발] 인증 코드: {code} (« [Pabal] Code de vérification : {code} »). Après l'enregistrement, vérifiez avec Envoi de test (테스트 발송).
Paramètres — e-mail (SMTP)
| Service | Serveur · port · sécurité | Nom d'utilisateur · mot de passe |
|---|---|---|
| Gmail | smtp.gmail.com · 587 · STARTTLS | Adresse Gmail · mot de passe d'application (Compte Google → Sécurité → Validation en deux étapes → Mots de passe des applications) |
| Naver | smtp.naver.com · 587 · STARTTLS | Identifiant · mot de passe (activez POP3/SMTP dans les réglages de Naver Mail) |
| Relais de messagerie interne | Adresse du relais · 25 · aucune | Laisser vide |
L'adresse d'expédition doit être une adresse depuis laquelle le compte SMTP a le droit d'envoyer. L'objet et le corps acceptent eux aussi {code} et {minutes}.
Gestion des utilisateurs
- Déconnecter tous les appareils (모든 기기 로그아웃) : coupe toutes les connexions (clés d'autorisation) du compte. À utiliser pour un utilisateur qui a perdu un appareil.
- Bloquer le numéro (번호 차단) : ce numéro ne peut plus recevoir de code, et le compte correspondant est aussitôt déconnecté de tous ses appareils. Revient au même que la liste de blocage des numéros de téléphone de l'onglet Paramètres (설정).
- E-mail de connexion (로그인 이메일) : nécessaire, en mode e-mail, pour qu'un compte existant puisse se connecter par e-mail.
- Supprimer le compte (계정 삭제) : pour un utilisateur qui a demandé la suppression de son compte, une fois son identité vérifiée. Supprime exactement ce que supprime la suppression de compte de l'application, sans retour possible. L'action ne s'exécute qu'après avoir saisi de nouveau l'identifiant ou le numéro de téléphone du compte et laissé une note indiquant par où la demande est arrivée et comment l'identité a été vérifiée. La note est conservée avec l'identifiant et la date (les numéros de téléphone, adresses e-mail, ainsi que le nom et le nom d'utilisateur du compte en sont retirés). Pour une demande par e-mail qui ne vient pas de l'e-mail de connexion du compte, la même fenêtre envoie un code par SMS au numéro du compte : saisissez le code que la personne renvoie par e-mail. Les bots et les comptes propres au serveur ne peuvent pas être supprimés ici.
- @BotFather est un bot intégré au serveur : il ne peut pas être déconnecté.
Gestion des bots
L'onglet Bots (봇) affiche le mode de connexion de chaque bot : s'il est connecté en MTProto, s'il a appelé getUpdates en HTTP au cours de la dernière minute, quelle est l'adresse de son webhook et si celui-ci est actuellement en échec (avec la raison). Si le nombre de mises à jour en attente ne cesse d'augmenter, le programme du bot est arrêté ou son webhook échoue. La suppression d'un bot et l'émission d'un nouveau jeton se font par le créateur du bot, auprès de @BotFather.
Onglet Voix
C'est ici que l'on exploite les bots vocaux (des bots dont les appels, passés depuis l'application, sont pris par un modèle vocal d'IA — voir Bots vocaux). L'onglet s'affiche même si la voix n'est pas activée sur le serveur, et la zone d'état indique ce qui manque. Pour l'activer, voir Installation du serveur — Bots vocaux. Actualisation toutes les 5 secondes.
| Zone | Ce qu'on y voit et ce qu'on peut y faire |
|---|---|
| Chiffres du haut | Appels en cours · temps utilisé aujourd'hui (limite quotidienne du serveur, temps réservé par les appels en cours) · passerelles connectées · bots dont la voix est activée (bots autorisés) · testeurs (ouvert au public ou non) |
| État | Liaison avec la passerelle (son adresse, ou « Désactivée — pas de secret de liaison » (꺼짐 (링크 비밀 없음))), relais d'appel (TURN ; sans lui, « Tous les appels aux bots sonnent occupé » (모든 봇 통화가 통화 중)), présence de la section bot-calls dans la politique de confidentialité (sans elle, « Aucun bot ne prend d'appel » (어떤 봇도 받지 않음)), consentements en attente, et le nombre d'appels terminés par une tonalité d'occupation, par raison (par exemple 워치가 못 거는 모드 — « mode que la montre ne peut pas appeler » : un appel depuis l'Apple Watch vers un bot qui utilise des outils, MCP, une clé propre, le mode flux ou la transcription du propriétaire, WATCH_NOT_YET) |
| Arrêt d'urgence | Arrêter tous les appels vocaux (모든 음성 통화 멈추기) : dès le clic, tous les appels aux bots en cours sur ce serveur se terminent, aucun nouvel appel n'est pris, et aucun bot n'affiche plus de bouton d'appel. Le réglage est ensuite enregistré et survit à un redémarrage du serveur (un avertissement s'affiche si l'enregistrement échoue). On lève l'arrêt avec Rouvrir les appels vocaux (음성 통화 다시 열기) |
| Ouverture au public | Avant l'ouverture, seuls les testeurs ci-dessous peuvent appeler les bots vocaux. Pour ouvrir à tous, tapez exactement 공개합니다 (« J'ouvre au public ») dans le champ, puis Ouvrir à tous (모두에게 공개) (refusé si la clé de destinataire du serveur, TELEGRAM_VOICE_RECIPIENTS, vaut …@unset, c'est-à-dire sans région de traitement — il faut d'abord publier une version de l'application qui indique la région). Revenir aux testeurs seuls (시험자만으로 되돌리기) fait marche arrière. Terminer l'examen juridique et obtenir la réponse écrite du fournisseur (Google) avant d'ouvrir au public relève du jugement de l'opérateur — le code ne l'empêche pas |
| Passerelles | Pour chaque passerelle connectée : id, appels pris/capacité, destination de l'audio (google.vertex.gemini-live@us-central1, etc.), fonctions (tools·byok·transcripts·stream …), moteur, boot |
| Transcription · clé propre | Autoriser la transcription : tapez 대화 기록을 허용합니다 (« J'autorise les transcriptions ») dans le champ, puis Autoriser la transcription (대화 기록 허용). Ne l'autorisez pas avant un examen juridique. La désactivation est immédiate et jette aussi les textes que les appels en cours et les bots n'ont pas encore récupérés. « Garder la conversation », choisi par l'appelant, ne dépend pas de cette autorisation et n'a pas d'interrupteur dans la page d'administration — c'est la section bot-calls-keep-text de la politique de confidentialité qui l'active (Installation du serveur — Garder la conversation). Clé propre : si les clés sont acceptées et sinon pourquoi, id de la clé maîtresse, nombre de bots qui ont une clé (la clé elle-même n'apparaît nulle part) |
| Appels en cours | Id de l'appel, bot, appelant (nom et id), état, écoulé/maximum, passerelle, nombre de requêtes d'outil ouvertes. Raccrocher (끊기) (exécuté au second clic) |
| Bots vocaux | Bots qui peuvent utiliser la voix : Seulement les bots autorisés (허용한 봇만) (par défaut) ou Tous les bots créés avec @BotFather (@BotFather 로 만든 모든 봇). Autoriser (허용) avec l'id ou le @nom d'utilisateur du bot. Tableau : bot, créateur, état (activé ou non, s'il peut prendre des appels et pourquoi, suspendu, adresse où part l'audio en mode flux, outils et nombre de réponses, d'erreurs et de délais dépassés), voix et langue, limites, appels du jour. Actions : Autoriser (허용)·Retirer l'autorisation (허용 취소), Vérifier et autoriser à nouveau (확인하고 다시 허용), Suspendre (멈추기) (raison obligatoire, 200 caractères, visible par le propriétaire du bot ; les appels en cours se terminent)·Rouvrir (다시 열기), Voir les réglages (설정 보기) |
| Réglages d'un bot | Texte intégral des instructions et du message d'accueil (pour relecture), définitions des outils et temps de réponse par outil (p50·p95), destination des requêtes d'outil, version des règles acceptée, contrôle d'usurpation appliqué ou exempté, modifications récentes, et par mois : appels, minutes, appels manqués et refusés |
| Testeurs | Avec l'id ou le @nom d'utilisateur d'une personne (avec ou sans @, sans tenir compte de la casse) : Ajouter comme testeur (시험자로 넣기)·Retirer (빼기) (impossible pour les bots et les comptes propres du serveur). Les personnes ajoutées par le réglage serveur TELEGRAM_VOICE_TESTERS apparaissent comme « Serveur » (서버) et ne peuvent pas être retirées ici |
| Limites | Le tableau ci-dessous + Noms à ajouter au contrôle d'usurpation (사칭 검사에 더할 이름) (un par ligne). À l'enregistrement, la page signale les bots qui ne pourront désormais plus prendre d'appels |
| Appels des bots | L'interrupteur général : tapez exactement 봇이 거는 전화를 켭니다 dans le champ et activez — uniquement après l'examen juridique (refusé tant que callme.legal_review de l'écran d'autorisation n'est pas done ; l'exception pour les serveurs de développement et de test est TELEGRAM_VOICE_CALLME_UNREVIEWED). Désactivé, les nouvelles demandes reçoivent aussitôt 503. Les pays (82 par défaut, 999 sur les serveurs de test seulement), les limites (un serveur de production ne les enregistre jamais plus souples que les planchers), le tableau des bots que leurs propriétaires ont activés (état de l'examen, gel lié au jeton, arrêt automatique, demandes du jour) et le détail d'un bot (nom, @nom d'utilisateur, photo, instructions, message d'accueil, outils, voix, langue, mode, buts, nom du propriétaire et son outboundReviewHash) avec Autoriser·Retirer, Lever pour un arrêt automatique, et le nombre de refus à chaque étape de l'examen |
Autoriser, c'est relire. En mode « Seulement les bots autorisés », autoriser un bot revient à autoriser ses instructions, son message d'accueil et ses outils actuels (en mode flux, son adresse de flux). Si le propriétaire du bot modifie l'un d'eux, le tableau des bots affiche « Instructions ou message d'accueil modifiés — vérifiez et autorisez à nouveau pour qu'il prenne des appels » (지시문·인사말이 바뀜 — 확인하고 다시 허용해야 전화를 받습니다), et ce bot ne prend plus d'appels tant que vous n'avez pas cliqué sur Vérifier et autoriser à nouveau (확인하고 다시 허용). Il en va de même pour un bot dont la langue n'est ni le coréen ni l'anglais, même en mode « Tous les bots créés avec @BotFather » — le contrôle automatique des règles effectué à l'enregistrement ne lit que le coréen et l'anglais. Le tableau affiche alors pour ce bot « Bot dans une autre langue que le coréen et l'anglais (illisible pour le contrôle automatique des règles) : lisez les instructions et le message d'accueil — vérifiez et autorisez à nouveau pour qu'il prenne des appels » (한국어·영어가 아닌 봇 (자동 규칙 검사가 읽지 못함): 지시문·인사말을 읽어 주세요 — 확인하고 다시 허용해야 전화를 받습니다) : faites lire les instructions et le message d'accueil par quelqu'un qui comprend cette langue, puis autorisez le bot.
| Limite | Par défaut | Plage |
|---|---|---|
| Durée maximale d'un appel (secondes) | 600 | 60 à 3600, jusqu'au réglage serveur TELEGRAM_VOICE_MAX_SECONDS |
| Appels simultanés d'un bot | 2 | 1 à 100, jusqu'au réglage serveur TELEGRAM_VOICE_BOT_CONCURRENCY |
| Appels par heure pour une personne | 20 | 1 à 200 |
| Minutes d'appel par jour pour une personne | 60 | 1 à 600 |
| Minutes d'appel par jour pour un bot | 60 | 1 à 6000 |
| Minutes d'appel par jour pour un propriétaire de bot | 120 | 1 à 6000 |
| Minutes d'appel par jour pour tout le serveur | 300 | 1 à 100000 |
| Appel le plus court accepté (secondes) | 60 | 30 à 300 — s'il reste moins de temps, l'appel n'est pas pris |
| Restriction des nouveaux comptes (jours) | 7 | 0 à 90 (0 = désactivée) — sauf les testeurs, et les personnes à qui le bot a envoyé un message il y a plus d'un jour |
- La journée suit le fuseau horaire du serveur (
TELEGRAM_VOICE_TIME_ZONE,Asia/Seoulpar défaut). Quand un appel est accepté, sa durée maximale est fixée dans le temps restant de la journée et réservée sur toutes les limites ; à la fin, seules les secondes réelles selon l'horloge du serveur sont décomptées. Les appels pris avec la clé propre du propriétaire d'un bot ne consomment que les limites de l'appelant. - Le propriétaire d'un bot ne peut fixer la durée d'un appel (300 secondes par défaut) et le nombre d'appels simultanés de son bot qu'à l'intérieur de ces limites.
- Toutes les actions (arrêt d'urgence, ouverture, autorisation, suspension, raccrochage, limites …) sont consignées dans le journal d'activité de l'onglet Codes d'inscription (가입 코드), préfixées par
음성: …(« Voix : … »). - Les indicateurs de qualité des appels vocaux (délai avant le premier son, délai d'arrêt lors d'une interruption, temps de réponse des outils, etc.) ne figurent pas dans cet onglet, mais seulement dans
/metricssur le port d'administration (noms commençant parvoice.en JSON, parvoice_au format Prometheus,/metrics?format=prometheus). Ils ne contiennent que des totaux : ni personnes, ni bots, ni paroles.
On peut faire la même chose par l'API d'administration (toujours avec Authorization: Bearer <jeton>) : GET /admin/api/voice, GET /admin/api/voice/bots/<id>, et en POST : voice/kill {"on": true}, voice/launch {"launched": true, "confirm": "…"}, voice/transcripts {"allowed": true, "confirm": "…"}, voice/testers·voice/testers/remove {"userId": …}, voice/gate {"botGate": "ALLOWLIST"}, voice/bots/allow·voice/bots/disallow {"botId": …}, voice/bots/<id>/suspend {"reason": "…"}·…/lift·…/name-exempt, voice/calls/<id>/end ; les limites passent par /admin/api/settings/voice. Appels des bots : voice/outbound {"on": true, "confirm": "…"}, voice/outbound/settings {"countries": […], "limits": {…}}, GET /admin/api/voice/outbound/bots/<id>, voice/outbound/bots/allow {"botId": …, "expect": "<outboundReviewHash>"}·voice/outbound/bots/disallow, voice/outbound/bots/<id>/lift.
Variables d'environnement
Le serveur lit le fichier de configuration (server-config.json), puis le surcharge avec les variables d'environnement. Le fichier compose de production définit les valeurs ci-dessous : en général, il suffit de modifier .env.
| Variable | Signification | Valeur dans le compose de production |
|---|---|---|
TELEGRAM_PORT | Port MTProto | MTPROTO_PORT (8443) |
TELEGRAM_HOST | Adresse d'écoute de MTProto | 0.0.0.0 |
TELEGRAM_PUBLIC_HOST | Adresse du serveur communiquée à l'application (help.getConfig) | PUBLIC_IP |
TELEGRAM_WEB_PORT | Port du site web, de la documentation, de la Bot API et de la page d'administration | 8080 |
TELEGRAM_WEB_HOST | Adresse d'écoute de ce port. 127.0.0.1 par défaut | 0.0.0.0 (dans le conteneur ; publié sur l'hôte uniquement sur 127.0.0.1) |
TELEGRAM_PUBLIC_URL | Adresse du site web. Liens (me_url_prefix), liens d'invitation, exemples de la documentation, images d'aperçu | https://DOMAIN/ |
TELEGRAM_DATA_DIR | Emplacement des photos, des fichiers, d'admin-token et d'operations.json | /app/data |
TELEGRAM_RSA_KEY | Chemin de la clé privée RSA du serveur (créée au premier démarrage si elle n'existe pas ; clé publique dans .pub) | /app/keys/private.pem |
TELEGRAM_DC_ID | Numéro de DC de ce serveur. Il doit être le DC que les applications utilisent comme maison (2 pour toutes les applications Telegram) — sinon le téléchargement des photos et des fichiers ne démarre jamais | DC_ID (2) |
TELEGRAM_DB_TYPE | memory · h2 · postgresql | postgresql |
TELEGRAM_DB_URL, TELEGRAM_DB_USERNAME, TELEGRAM_DB_PASSWORD | Connexion JDBC | jdbc:postgresql://pabal-postgres:5432/pabal, pabal, POSTGRES_PASSWORD |
TELEGRAM_DB_MAX_POOL_SIZE | Nombre de connexions à la base de données | 20 |
TELEGRAM_ADMIN_TOKEN | Jeton de la page d'administration (vide : créé dans data/admin-token) | ADMIN_TOKEN |
TELEGRAM_MAX_FILE_SIZE | Taille maximale d'un fichier pouvant être envoyé (2GB · 512MB · un nombre d'octets). Les morceaux sont écrits sur le disque au fur et à mesure de leur arrivée : la limite porte donc sur le disque, pas sur la mémoire | MAX_FILE_SIZE (2GB) |
TELEGRAM_TEST_NUMBERS | Numéros de test +99966…. Développement uniquement | false |
TELEGRAM_WEBHOOK_ALLOW_LOCAL | Autorise les webhooks de bots en http:// et vers des adresses internes. Développement uniquement | (non défini = false) |
TELEGRAM_FCM_CREDENTIALS | Chemin du fichier de clé de compte de service Firebase pour les notifications push Android. Vide : notifications push désactivées (Installation du serveur — étape 10) | FCM_CREDENTIALS (vide) |
TELEGRAM_FCM_PROJECT_ID | Seulement pour envoyer vers un projet Firebase autre que le project_id du fichier de clé | FCM_PROJECT_ID (vide) |
TELEGRAM_PUSH_PREVIEWS | À false, les notifications push n'affichent que l'expéditeur, sans le contenu du message | PUSH_PREVIEWS (true) |
TELEGRAM_TURN_HOST, TELEGRAM_TURN_PORT, TELEGRAM_TURN_SECRET | Relais d'appel (TURN) — là où deux applications sur des réseaux différents se rejoignent. Sans secret, les appels sont seulement directs (Installation du serveur — Relais d'appel) | TURN_HOST (vide : DOMAIN), TURN_PORT (3478), TURN_SECRET (vide) |
TELEGRAM_APNS_KEY, TELEGRAM_APNS_KEY_ID, TELEGRAM_APNS_TEAM_ID, TELEGRAM_APNS_TOPIC, TELEGRAM_APNS_MIN_BUILD, TELEGRAM_APNS_VOIP_MIN_BUILD | Push iPhone (APNs) — le chemin du fichier de clé, l'ID de la clé (vide : tiré du nom du fichier), l'équipe qui a signé l'application, le bundle ID, la plus petite version à servir, la première version qui reçoit l'écran d'appel CallKit. Sans clé, le push iPhone est désactivé (Installation du serveur — étape 11) | APNS_* (pas de clé, vide — tiré du nom du fichier, 4Z8R468M2D, me.pabal.ios, 4, vide) |
TELEGRAM_STATIC_MAPS_KEY, TELEGRAM_STATIC_MAPS_PER_DAY, TELEGRAM_STATIC_MAPS_PER_USER_HOUR | Images de carte des messages de position — la clé Google Maps Static API, les nouvelles images obtenues par jour, celles qu'une même personne peut provoquer par heure. Sans clé, les images de carte sont désactivées (Installation du serveur — Images de carte) | STATIC_MAPS_* (pas de clé, 300, 120) |
JAVA_OPTS | Options de la JVM (mémoire) | La valeur de .env |
Variables d'environnement — bots vocaux
En production, le fichier complémentaire deploy/docker-compose.voice.yml en règle une partie à partir des valeurs de .env — liaison, relais, fuseau horaire, limites, testeurs et versions minimales ; les autres s'ajoutent fonctionnalité par fonctionnalité, après leur propre examen (Installation du serveur — Bots vocaux). Les réglages VOICE_* de la passerelle (pabal-voice) sont décrits dans voice/README.md du dépôt.
| Variable | Par défaut | Signification |
|---|---|---|
TELEGRAM_VOICE_LINK_SECRET_FILE | — | Secret de liaison de 32 octets (64 caractères hexadécimaux), le même que celui de la passerelle. Absent ou erroné : voix désactivée |
TELEGRAM_VOICE_LINK_HOST, TELEGRAM_VOICE_LINK_PORT | 127.0.0.1, 8095 | Où la liaison écoute. Hors boucle locale, TELEGRAM_VOICE_LINK_ANY_ADDRESS=true est nécessaire, et une adresse publique est toujours refusée |
TELEGRAM_VOICE_LINK_ANY_ADDRESS | — | Déclaration « ce réseau n'est utilisé que par le serveur et la passerelle » |
TELEGRAM_VOICE_TURN_HOST, TELEGRAM_VOICE_TURN_PORT | — | Adresse du relais à donner à la passerelle (l'adresse LAN du serveur). Ignorée si c'est la boucle locale |
TELEGRAM_VOICE_MAX_SECONDS | 600 | L'appel le plus long qu'autorise ce serveur (60 à 3600) |
TELEGRAM_VOICE_BOT_CONCURRENCY | 2 | Plafond d'appels simultanés pour un bot (l'opérateur et le propriétaire du bot ne peuvent que l'abaisser) |
TELEGRAM_VOICE_TIME_ZONE | Asia/Seoul | Référence des limites quotidiennes et mensuelles |
TELEGRAM_VOICE_TESTERS | — | Liste d'identifiants d'utilisateurs testeurs (fusionnée avec la liste de la page d'administration). * uniquement sur un serveur de test |
TELEGRAM_VOICE_RECIPIENTS | google.vertex.gemini-live@us-central1 | Le destinataire annoncé par l'écran de confirmation de l'application. Il doit être identique à celui de la passerelle pour que l'appel passe |
TELEGRAM_VOICE_MIN_BUILD_DESKTOP, _ANDROID, _IOS, _WATCHOS | 1, 62151, 5, 1 | Première version de l'application qui contient vraiment l'écran de confirmation (pour le bureau, le nombre après la balise pabal-bc). Si le destinataire change, publiez une nouvelle version puis relevez ces valeurs. Pour le bureau, passez à 2 lors de la première validation d'un écran de confirmation dans une autre langue que le coréen ou l'anglais |
TELEGRAM_VOICE_MIN_SHEET_VERSION | 1 | Version d'écran de confirmation la plus basse acceptée |
TELEGRAM_VOICE_TOOL_RESULT_BYTES | 16384 | Taille maximale d'une réponse d'outil (1024 à 16384) |
TELEGRAM_VOICE_KEYS_MASTER_FILE, TELEGRAM_VOICE_KEYS_PREVIOUS_MASTER_FILE | — | Clé maîtresse qui chiffre les clés propres et les secrets de flux, et l'ancienne clé pendant un remplacement. Dans un dossier en 700, hors des sauvegardes |
TELEGRAM_VOICE_OWN_KEYS_APPS_READY | — | À mettre à true seulement une fois que les applications affichent l'écran de confirmation (version 2) des bots à clé propre. Avant cela, les clés propres ne sont pas acceptées |
TELEGRAM_VOICE_OWN_KEY_MIN_SHEET_VERSION, TELEGRAM_VOICE_TRANSCRIPT_MIN_SHEET_VERSION | 2, 1 | Version d'écran de confirmation exigée pour les appels à clé propre et pour l'annonce de transcription (un serveur de production n'abaisse pas la version des clés propres en dessous de 2) |
TELEGRAM_VOICE_STREAM_MIN_BUILD_DESKTOP, _ANDROID, _IOS | 0 (aucune) | Première version de l'application qui contient l'écran de confirmation du mode flux. À 0, personne ne peut appeler un bot en mode flux |
TELEGRAM_VOICE_STREAM_MIN_SHEET_VERSION | 2 | Version de l'écran de confirmation du mode flux |
TELEGRAM_VOICE_STREAM_DENY_ADDRESSES | — | Adresses de ce déploiement que les adresses de flux ne doivent pas atteindre (l'hôte public et l'hôte du site sont ajoutés d'office) |
TELEGRAM_WATCH_API_PORT, _HOST, _ANY_ADDRESS, TELEGRAM_WATCH_AUDIO_URL, TELEGRAM_WATCH_ALLOW_PLAIN, TELEGRAM_WATCH_SESSION_DAYS, TELEGRAM_WATCH_AUTH_PER_MINUTE | —, 127.0.0.1, —, —, —, 7, 30 | Adresses de l'API Apple Watch et du point d'entrée audio (Installation du serveur — point d'entrée Apple Watch). ALLOW_PLAIN est réservé au développement |
TELEGRAM_VOICE_EVIDENCE_KEY_DIR | — | Le dossier de la clé servant aux traces des autorisations d'appels des bots (preuves HMAC). 700, hors des dossiers sauvegardés. Créé et remplacé avec scripts/voice-evidence-key.py. Sans lui, personne ne peut activer d'autorisation. Avec Docker Compose, la variable placée seulement dans .env n'atteint pas le serveur — pour activer les appels des bots, ajoutez-la au pabal-server de deploy/docker-compose.voice.yml, dans environment (le chemin dans le conteneur) et volumes (le dossier sur l'hôte) |
TELEGRAM_VOICE_OUTBOUND_MIN_BUILD_DESKTOP, _ANDROID, _IOS, _WATCHOS | 0 (aucune) | La première version de l'application avec l'écran d'autorisation. Les versions plus anciennes ne peuvent pas activer d'autorisation et les appels des bots ne les font pas sonner. 0 : aucune pour cette plateforme |
TELEGRAM_VOICE_CALLME_DEVICE_AGE_SECONDS | 86400 | Délai depuis la connexion avant qu'un appareil puisse activer une autorisation (secondes). Seuls les serveurs de test peuvent le changer (un serveur de production avertit et l'ignore) |
TELEGRAM_VOICE_KEEP_TEXT_UNREVIEWED | — | Affiche sur la montre le texte non encore examiné juridiquement de la case « Garder la conversation ». Réservé aux serveurs de test internes |
TELEGRAM_MCP_*, TELEGRAM_MCP_APPS_READY | — | Composants MCP (ajoutés par deploy/docker-compose.mcp.yml). TELEGRAM_MCP_EGRESS_OWN_ADDRESSES (les adresses publiques de Pabal) sert même sans MCP : elle empêche les requêtes de webhook et d'outil d'atteindre Pabal lui-même |
TELEGRAM_VOICE_BOTS, TELEGRAM_VOICE_NOTICE_CHECK=off, TELEGRAM_VOICE_STREAM_ALLOW_PRIVATE | — | Réservées aux serveurs de test (seulement avec TELEGRAM_TEST_NUMBERS=true) : autoriser les bots listés (id ou @nom, * pour tous) · sauter la vérification des sections juridiques · autoriser des adresses privées comme adresse de flux |
TELEGRAM_VOICE_CALLME_UNREVIEWED, TELEGRAM_VOICE_DEV_ECHO_OUTBOUND, TELEGRAM_VOICE_TEST_DIAL, TELEGRAM_VOICE_TEST_DIAL_USERS | — | Serveurs de test et de développement uniquement : l'interrupteur des appels des bots peut être activé avant l'examen juridique (serveurs de développement et de test) · une passerelle d'écho passe les appels des bots (serveurs de développement, TELEGRAM_TEST_MODE) · l'appel de test de l'API d'administration et les comptes qu'il peut faire sonner (jusqu'à 20 en plus des numéros de test +99966, serveurs de test). Un serveur de production avertit et les ignore |
Fichiers de données
| Fichier | Contenu | Permissions |
|---|---|---|
keys/private.pem | Clé privée RSA du serveur. Ne la sortez jamais du serveur | 600 |
keys/private.pem.pub | Clé publique. Utilisée pour compiler l'application et pour /docs/server-key.pem | — |
keys/firebase-service-account.json | (Facultatif) Clé secrète Firebase pour les notifications push Android. En cas de fuite, la supprimer dans la console Firebase et en télécharger une nouvelle | 600 |
data/admin-token | Jeton de la page d'administration | 600 |
data/operations.json | Valeurs de l'onglet Paramètres — règles d'inscription, secrets SMS et SMTP, numéros bloqués, réglages de l'onglet Voix (arrêt d'urgence, ouverture, testeurs, bots autorisés, limites) | 600 |
keys/voice-link.secret | (Bots vocaux) Secret de liaison, le même que celui de la passerelle | 400 |
/etc/pabal/voice/voice-master.key | (Bots vocaux) Clé maîtresse qui chiffre les clés propres des propriétaires de bot et les secrets de flux. Hors du dossier de données, jamais dans les sauvegardes | 600 (dossier 700) |
data/media/ | Photos et fichiers originaux | — |
Table events de PostgreSQL | Comptes, conversations, messages, connexions, bots, configuration des webhooks — l'historique de toutes les modifications | — |
Notes de sécurité
- N'exposez pas directement le port d'administration sur Internet. Dans la configuration de production, Caddy bloque avec un 404 les chemins d'administration comme
/admin,/healthet/metrics. - Toutes les requêtes de données d'administration exigent
Authorization: Bearer <jeton>, et les pages d'autres sites ne peuvent pas les lire. - Les secrets SMS et SMTP se trouvent uniquement dans
operations.json; l'interface et l'API indiquent seulement « enregistré » (저장됨). Si vous enregistrez en laissant un champ secret vide, la valeur existante est conservée. - Jetons et secrets n'apparaissent pas dans les journaux, et les numéros de téléphone y sont masqués. Les adresses de la Bot API (qui contiennent le jeton) ne sont pas non plus journalisées.
- Les jetons d'appareil des notifications push n'apparaissent dans les journaux que sous forme d'empreinte, et ni le contenu du fichier de clé Firebase ni celui des notifications n'y figurent.
- Les clés d'autorisation étant stockées dans la base de données, quiconque y a accès peut déchiffrer le trafic des utilisateurs. Protégez la base de données et les sauvegardes aussi soigneusement que la clé RSA.
Limites
- Les codes en attente et l'historique récent sont en mémoire et disparaissent au redémarrage du serveur (il suffit de redemander un code depuis l'application).
- L'envoi réel par un fournisseur de SMS doit être vérifié avec votre propre compte chez ce fournisseur. Le serveur construit les requêtes conformément à la documentation de chaque fournisseur.
- Pas encore disponible : suppression forcée de bots, consultation des messages, affichage des journaux, graphiques, statistiques des notifications push (les notifications push se vérifient dans le journal du serveur).