ES
apps/caramail-server / README.md · commit 070afda
# CaraChat ServeurLe serveur de chat Caramail de 2002 (protocole texte TCP de l'applet `net.spray.chat`), réécrit en PHP 8 à partirdes sources PHP de 2012 (`proxyServer.php`, `servercaramail.php`) — **sans MySQL** : connectés, salons etdernières phrases sont en mémoire, les salons permanents et leur historique dans `rooms.json`.Le client est l'application JumPHP **caramail-chat**.## En production sur jumphp.netLe serveur tourne sur la machine de jumphp.net (`$DIR` ci-dessous, redémarrage automatique) :- `wss://caramail.jumphp.net/ws` : WebSocket sur le port 443 (Traefik + Cloudflare), le serveur par défaut du client ;- `178.33.157.221:4500` : le TCP brut de l'applet d'origine.```bash# HOST : la machine (ssh), DIR : le dossier du serveur sur elle ; le .env (clés, CARAMAIL_OWNER_IPS) reste là-basrsync -az --exclude vendor --exclude var --exclude .env --exclude tests ./ "$HOST:$DIR/"ssh "$HOST" "cd $DIR && docker compose -p caramail-server -f compose.yaml -f compose.jumphp.yaml up -d --build"```Réglages du `.env` : `CARAMAIL_ADMIN_KEY` (clé modérateur), `CARAMAIL_SUPER_KEY` (clé administrateur), `CARAMAIL_OWNER_IPS`(adresses publiques du propriétaire, séparées par des virgules : depuis elles, le formulaire propose normal / modérateur / admin).Le WebSocket parle le petit morceau utile du protocole de php-wasm-network (la bibliothèque réseau de JumPHP) : leclient rejoint le salon « CHAT » où le serveur est le pair 0, et chaque message binaire porte les octets TCP del'applet, sans changement (`src/Net/WsSession.php`).## Lancer dans Docker (sur un serveur)```bashcd apps/caramail-serverecho "CARAMAIL_ADMIN_KEY=$(openssl rand -hex 16)" > .env      # la clé des modérateurs (jamais dans git)docker compose up -d --build                                   # écoute sur le port 4500docker compose logs -fdocker compose exec chat php app.php status                    # connectés et salons````CARAMAIL_PORT` (port publié, 4500 par défaut) et `CARAMAIL_ADMIN_KEY` se règlent dans `.env`.Le conteneur tourne sans privilège (utilisateur `chat`, système de fichiers en lecture seule, volume `/data`).## Commandes| Commande | ||---|---|| `serve [--host 0.0.0.0] [--port 4500] [--ws-port 8080] [--admin-key …]` | le serveur (s'arrête proprement sur SIGTERM, sauve les salons) || `status` | le serveur en cours (connectés, salons) ou les salons enregistrés || `rooms [list]`, `rooms add "Nom"`, `rooms remove "Nom"` | les salons permanents (lus au démarrage) || `token Pseudo --age 25 --sex 1 --city Lyon [--admin-key …]` | le `tempid` d'un profil || `demo` | une conversation sur un serveur en mémoire, trames affichées (marche aussi dans le navigateur) |Développement : `bin/jumphp test caramail-server`, `bin/jumphp run caramail-server demo`.## Le protocoleUne trame par ligne (`\n`), champs séparés par des tabulations, le premier est le code. Le serveur écrit toujours`code TAB champs… LF`. Connexion : le serveur envoie `100 TAB NewCaraChat v1.00 By Duch`, le client`0 TAB admin TAB tempid`.Le **tempid** était une clé à usage unique écrite par le site web dans la table `chat_tempid`. Sans base, il portele profil, en query string : `n=Pseudo&a=25&s=1&v=Lyon` (pseudo, âge, sexe 0 = homme / 1 = femme, ville) et`&k=<clé>` pour un modérateur.| Client → serveur | Serveur → client ||---|---|| `0` connexion | `0` id, 197, 0, pseudo · `330` · `332` · `56` liste des connectés || `20` / `40` salon public / privé (nom, type) | `20`/`40` 0, nom, ?, créateur · `70` ×15 dernières phrases · `85 0` arrivée (à tous) || `70` phrase (`FFCC` + texte) | `70` id, 0, pseudo, phrase (à tout le salon) || `72` privé (id, phrase) | `73` écho à l'expéditeur, `72` au destinataire || `85` membres du salon | `85 -1` liste ; `85 0` / `85 1` arrivée / départ || `90` salons publics, `94` permanents | liste nom, ?, créateur, nombre || `56` / `58` recherche pseudo / ville (début, tranche d'âge, sexe) | même code, la liste || `82` profil (id) | `82` id, admin, âge, sexe, ville || `199` nombre de connectés | `199` n || `555` éjection (pseudo:provenance) | `555` à l'éjecté, `76 5 …` au salon || `84` état, `667` ping | `84` écho ; `667` toutes les 120 s, coupure après 300 s de silence |Modérateurs : `!update texte` (ligne d'information `77` pour tous), `!bold texte`.Différences avec 2012 : plus de MySQL ni de maillage multi-serveurs (un seul serveur), pseudos rendus uniques(`Pseudo_2`) au lieu d'un suffixe aléatoire, la ville réelle au lieu de « server : N », requêtes protégées.Crédits : applet Caramail (Spray, 2002) ; serveur PHP « NewCaraChat v1.00 By Duch » (2012).