Dans cet article

Un parcours court et sûr pour exécuter Stoat sur un nouveau Droplet Ubuntu. Le runbook sécurise SSH, installe la pile officielle et s'arrête aux bonnes vérifications.

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.

Exécuter un assistant OpenClaw privé toujours actif

Le README amont relu recommande au moins 2 vCPU et 2 Go de RAM au départ. La pile publie TCP 80/443 et, pour les appels, TCP 7881 et UDP 50000–50100. Ce n’est pas une capacité utilisateurs testée. Le web/PWA reste la base ; le guide officiel des clients documente l’option de bureau --force-server, tout en signalant une prise en charge limitée dans la plupart des clients.

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.

Liste des règles Cloud Firewall : SSH restreint, HTTP et HTTPS publics, ports d'appel LiveKit facultatifs, et Droplet Stoat choisi pour l'attachement.

Une liste compacte pour le formulaire DigitalOcean. Le firewall doit être attaché au Droplet.

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 bloc d’installation ci-dessous refuse un répertoire /opt/stoat existant et sélectionne la révision amont relue avant d’ouvrir son générateur.

Deux révisions ont été relues le 8 octobre 2026 : le guide complémentaire cb062ae06e67 et la pile amont 9af5e9063a8d. L’installateur complémentaire clone la branche courante amont ; cet article remplace donc son appel : installez Docker avec les instructions Ubuntu officielles, puis sélectionnez le commit amont avant d’exécuter le générateur. Le faire après serait trop tard. Gardez la session root ouverte pendant la vérification d’un nouvel accès SSH. Les SHA Git ne figent pas toutes les images ; consignez leurs digests durant l’essai.

Commande shell
ssh root@YOUR_DROPLET_IP
git clone https://github.com/TylorMayfield/stoat-droplet-runbook.git
git -C stoat-droplet-runbook checkout --detach cb062ae06e67624db5e216ca2ae29acdb04dcab1
test "$(git -C stoat-droplet-runbook rev-parse HEAD)" = cb062ae06e67624db5e216ca2ae29acdb04dcab1
cd stoat-droplet-runbook
chmod 700 scripts/*.sh
sudo ./scripts/harden-host.sh --apply
Commande shell
cd ~/stoat-droplet-runbook
sudo ./scripts/preflight.sh chat.example.com
# Docker Engine and the Compose plugin must already be installed.
sudo bash -euo pipefail -c '
test ! -e /opt/stoat
git clone https://github.com/stoatchat/self-hosted.git /opt/stoat
git -C /opt/stoat checkout --detach 9af5e9063a8d1311477b7d2f24f5764ffe3e1cd1
test "$(git -C /opt/stoat rev-parse HEAD)" = 9af5e9063a8d1311477b7d2f24f5764ffe3e1cd1
cd /opt/stoat
chmod 700 generate_config.sh
./generate_config.sh chat.example.com
chmod 600 secrets.env
docker compose config --quiet
'

Exiger une invitation avant le premier démarrage

Ouvrez /opt/stoat/Revolt.toml dans l'éditeur du serveur. Définissez invite_only = true dans api.registration. Si cette section est absente, ajoutez le bloc ci-dessous une seule fois ; ne créez pas de section en double. Enregistrez avant de démarrer les services. HTTPS protège la connexion; ce réglage restreint la création de comptes.

/opt/stoat/Revolt.toml
[api.registration]
invite_only = true

Configuration officielle des invitations

Dé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.

Commande shell
cd /opt/stoat
sudo docker compose up
# Après un premier démarrage propre, appuyez sur Ctrl+C.
sudo docker compose up -d
cd ~/stoat-droplet-runbook
sudo ./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.

Commande shell
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.

Si l’identification des services actifs échoue, le script s’arrête avant de stopper des services ou de créer une archive, même si la commande en échec a renvoyé une liste partielle. Une liste vide obtenue sans erreur signifie que la pile est déjà arrêtée. Après une erreur d’arrêt ou d’archivage, le gestionnaire de sortie tente quand même de redémarrer les services initialement actifs et conserve le premier code d’échec. Il affiche Backup: seulement après la lecture de la liste des fichiers de l’archive et la réussite de tout redémarrage nécessaire. Si le redémarrage échoue, contrôlez ces services manuellement avant de terminer la maintenance.

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.

/root/backup-stoat.sh
#!/usr/bin/env bash
set -euo pipefail
umask 077
cd /opt/stoat
if running_services=$(docker compose ps --services --status running); then
  running=()
  if [[ -n "$running_services" ]]; then
    mapfile -t running <<< "$running_services"
  fi
else
  status=$?
  printf 'Could not list running services; no verified backup was produced.\n' >&2
  exit "$status"
fi
resume() {
  local status=$?
  local restart_status
  trap - EXIT
  if (( ${#running[@]} )); then
    if docker compose start "${running[@]}"; then
      :
    else
      restart_status=$?
      printf 'Service restart failed; check the original running services manually.\n' >&2
      if (( status == 0 )); then status=$restart_status; fi
    fi
  fi
  if (( status == 0 )); then
    printf "Backup: %s\n" "$archive"
  else
    printf 'Backup did not complete successfully; check the errors above.\n' >&2
  fi
  exit "$status"
}
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

Pour chaque résultat, consignez SHA du guide, SHA amont, digests et date : inscription sans invitation refusée ; compte invité créé ; message et fichier connus retrouvés depuis une sauvegarde hors ligne isolée ; appels depuis un second réseau si activés. Indiquez « non exécuté » jusqu’à observation. Une relecture et une réponse HTTP ne prouvent pas ces résultats.

Questions fréquentes

Puis-je utiliser ces scripts sur un serveur existant ?

Non. Le script vise un Droplet Ubuntu neuf et refuse de remplacer /opt/stoat. Gardez un service de chat séparé d'un serveur d'application existant.

Quels ports Stoat doit-il rendre publics ?

Le client web utilise TCP 80 et 443. Les appels LiveKit utilisent TCP 7881 et UDP 50000 à 50100. Limitez SSH à votre réseau d'administration et gardez les services de données privés.

Que fait le dépôt compagnon ?

Il vérifie Ubuntu et DNS, installe Docker, clone le dépôt officiel de Stoat, lance son générateur de configuration et vérifie la première réponse HTTPS. Il ne crée pas de Droplet, ne modifie pas le Cloud Firewall et ne sauvegarde pas les secrets à votre place.

Les apps mobiles Stoat se connecteront-elles à mon serveur ?

En général, non. Stoat indique que la plupart des clients officiels ne prennent pas en charge les instances auto-hébergées. Utilisez le client navigateur ou installez-le comme PWA.

Que vérifier avant d’inviter d’autres personnes ?

Vérifiez le refus d'une inscription sans invitation, puis l'inscription invitée et l'envoi d'un message. Sauvegardez la configuration, secrets.env et les données persistantes avant d'inviter d'autres personnes.