Auto-héberger un serveur de chat Stoat privé
Sécurisez un nouveau Droplet, installez la pile Docker Compose officielle de Stoat, puis prouvez le fonctionnement du client web avant d’inviter quelqu’un.
Créez le Droplet et le firewall
Créez un Droplet Ubuntu neuf avec au moins deux vCPU et 2 Go de RAM. Ajoutez une clé SSH pendant la création. Créez ensuite un Cloud Firewall, attachez-le à ce Droplet et pointez un nom comme chat.example.com vers son IPv4 public. C'est un déploiement Docker Compose, pas une app App Platform ni une démo à un seul conteneur.
Avant de créer le serveur, vérifiez le prix actuel du plan Droplet et tout coût de domaine que vous assumerez. Le serveur reste provisionné quand le chat est inactif, et les appels facultatifs ajoutent des ports publics et de la capacité à exploiter. Commencez par le chat texte ; ajoutez les appels seulement après avoir prouvé le parcours web privé.
- TCP 22 depuis votre adresse IP publique ou VPN seulement.
- TCP 80 et 443 depuis partout pour le client web et les certificats HTTPS.
- TCP 7881 et UDP 50000 à 50100 depuis partout seulement si vous voulez les appels LiveKit.
- Ne donnez pas de ports hôte publics à MongoDB, Valkey, RabbitMQ, MinIO ou Docker.
Attachez le firewall avant de vous connecter
Dans le formulaire Cloud Firewall, créez les règles entrantes ci-dessous puis choisissez ce serveur dans Appliquer aux Droplets. Gardez les règles sortantes par défaut qui autorisent tout. Les deux règles d'appel sont facultatives. Ne les ajoutez pas si votre communauté n'utilisera pas les appels.
Connectez-vous, sécurisez, puis installez
Utilisez l'adresse IPv4 publique du Droplet depuis le tableau de bord DigitalOcean. Le script de sécurité met Ubuntu à jour et désactive la connexion SSH par mot de passe seulement s'il trouve une clé SSH root. Gardez ce terminal ouvert puis confirmez qu'une seconde connexion SSH marche. Le précontrôle ne change rien. Le script d'installation exige --apply, refuse d'écraser /opt/stoat et ouvre le générateur de configuration de Stoat.
Avant de continuer : Cette procédure met Ubuntu à jour et désactive la connexion SSH par mot de passe après avoir confirmé l'existence d'une clé SSH root. Gardez la première session ouverte et testez une seconde connexion.
- Remplacez chaque valeur surlignée avant d’exécuter la commande.
ssh root@YOUR_DROPLET_IP git clone https://github.com/TylorMayfield/stoat-droplet-runbook.gitcd stoat-droplet-runbooksudo ./scripts/harden-host.sh --apply
Avant de continuer : Cette procédure installe Docker et écrit les secrets Stoat sur un nouveau serveur. Confirmez le Cloud Firewall et le DNS avant l'installation finale.
cd ~/stoat-droplet-runbook- Remplacez chaque valeur surlignée avant d’exécuter la commande.
sudo ./scripts/preflight.sh chat.example.com - Remplacez chaque valeur surlignée avant d’exécuter la commande.
sudo ./scripts/install-official-stoat.sh --apply chat.example.com
Exiger une invitation avant le premier démarrage
Ouvrez /opt/stoat/Revolt.toml dans l'éditeur du serveur. Dans la section api.registration existante, définissez invite_only = true; ne dupliquez pas la section. Enregistrez avant de démarrer les services. HTTPS protège la connexion; ce réglage restreint la création de comptes.
[api.registration]
invite_only = trueDémarrez une fois puis vérifiez HTTPS
Le générateur crée secrets.env. Sauvegardez-le avant de démarrer le service. Démarrez au premier plan, lisez les erreurs éventuelles, arrêtez avec Ctrl+C puis lancez la commande en arrière-plan. Le script de vérification contrôle la configuration Compose, les services actifs et HTTPS public sans afficher les secrets. Il ne prouve pas encore que l'app web marche.
Si la vérification ne peut pas atteindre HTTPS, contrôlez l’enregistrement DNS du nom et l’attachement du Cloud Firewall avant d’ouvrir d’autres ports. Si un conteneur est dégradé, lisez seulement la sortie du service Compose concerné et expurgez-la avant de la partager. Ne résolvez aucun de ces symptômes en publiant un service interne ou en copiant des secrets dans un ticket.
Avant de continuer : La commande au premier plan démarre toute la pile Stoat. Lisez sa sortie avant de l'arrêter et de lancer le service en arrière-plan.
cd /opt/stoatsudo docker compose upsudo docker compose up -d- Remplacez chaque valeur surlignée avant d’exécuter la commande.
sudo ~/stoat-droplet-runbook/scripts/verify-stoat.sh chat.example.com
Tester le refus, puis une inscription invitée
Dans un profil de navigateur neuf, ouvrez https://chat.example.com et tentez une inscription sans invitation. Elle doit échouer. Créez ensuite une invitation avec la commande serveur ci-dessous. Copiez le code affiché dans un gestionnaire de mots de passe, jamais dans un ticket ou une capture. Utilisez-le pour créer votre compte de test, puis envoyez un message et un fichier jetable.
Testez les appels depuis un second réseau si vous les avez activés. Utilisez le client web ou sa PWA; la prise en charge des serveurs auto-hébergés varie selon les clients officiels. N'invitez personne tant que l'inscription sans code réussit ou qu'un service de données a un port public.
cd /opt/stoat
sudo docker compose exec database mongosh revolt --quiet --eval 'const invite = require("crypto").randomBytes(24).toString("hex"); db.account_invites.insertOne({_id: invite}); print(invite);'Faire une sauvegarde hors ligne avant d’inviter
Dans la configuration Compose officielle non modifiée, les données persistantes sont sous /opt/stoat/data. Enregistrez le script sous /root/backup-stoat.sh et lancez sudo bash /root/backup-stoat.sh pendant une maintenance. Il arrête les services actifs, archive toute l’installation avec fichiers cachés et données, puis redémarre seulement ces services. Les montages modifiés et bases externes demandent une sauvegarde distincte.
L’archive réservée à root contient mots de passe et messages privés. Copiez-la par votre procédure de sauvegarde chiffrée vers une autre machine, puis vérifiez la présence de secrets.env, Revolt.toml et data/. Sur un serveur isolé, restaurez le dossier et la configuration Compose d’origine avec accès entrant restreint ; vérifiez le compte, le message et le fichier de test. N’utilisez pas le nom de production et empêchez les notifications du serveur de test.
#!/usr/bin/env bash
set -euo pipefail
umask 077
cd /opt/stoat
mapfile -t running < <(docker compose ps --services --status running)
resume() {
if (( ${#running[@]} )); then docker compose start "${running[@]}"; fi
}
trap resume EXIT
if (( ${#running[@]} )); then docker compose stop "${running[@]}"; fi
install -d -m 700 /var/backups/stoat
archive="/var/backups/stoat/stoat-$(date -u +%Y%m%dT%H%M%SZ).tar.gz"
tar -C /opt -czf "$archive" stoat
tar -tzf "$archive" > /dev/null
printf "Backup: %s\n" "$archive"Vérifier le résultat
- Résultat attendu
- L’inscription sans invitation échoue ; un compte invité envoie un message et un fichier.
- Arrêter si
- Arrêtez si SSH est ouvert à Internet, si un service de données a un port hôte, si le DNS ne pointe pas vers le Droplet, si un certificat échoue, si un secret apparaît dans la sortie ou si un port LiveKit est ouvert sans plan de test d'appel délibéré.
- Étape suivante
- Sauvegardez la configuration et les données persistantes, testez une restauration loin de la production, puis notez le commit du dépôt et les versions d'images avant d'inviter des utilisateurs.