# CaraChat Serveur Le serveur de chat Caramail de 2002 (protocole texte TCP de l'applet `net.spray.chat`), réécrit en PHP 8 à partir des sources PHP de 2012 (`proxyServer.php`, `servercaramail.php`) — **sans MySQL** : connectés, salons et derniè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.net Le 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à-bas rsync -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) : le client rejoint le salon « CHAT » où le serveur est le pair 0, et chaque message binaire porte les octets TCP de l'applet, sans changement (`src/Net/WsSession.php`). ## Lancer dans Docker (sur un serveur) ```bash cd apps/caramail-server echo "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 4500 docker compose logs -f docker 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 protocole Une 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 porte le profil, en query string : `n=Pseudo&a=25&s=1&v=Lyon` (pseudo, âge, sexe 0 = homme / 1 = femme, ville) et `&k=` 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).