Skip to content

feat: mode ssh — publier un site SSG sur un serveur distant via rsync #7

Description

@vianmora

Sous-issue de #22.

Permet de publier un site en SSG puis de l'expédier par rsync/SSH vers un serveur distant, au lieu de le servir localement. Config SSH propre à chaque site.

buildMode: "ssh"

Config par domaine — webstudio-publisher

Endpoint dédié (la clé privée n'est pas passée à chaque publish) :

POST /targets/ssh-setup
{
  "domain": "mon-site",
  "sshHost": "192.168.1.50",
  "sshUser": "deploy",
  "sshPath": "/var/www/mon-site",
  "sshPort": 22,
  "sshPrivateKey": "-----BEGIN OPENSSH PRIVATE KEY-----\n..."
}

Le publisher :

  1. écrit la clé dans /var/work/<domain>/ssh_key (chmod 600, jamais loggée)
  2. persiste le reste dans /var/work/<domain>/target.json
  3. ssh-keyscan → known_hosts

Pipeline — publishBuildSsh() dans server.mjs

lire target.json  (échec net + message avec la commande curl si absent)
→ stopPreviousMode(prevState)   (stop container/process, purge /var/publish/<host>, purge YAML Traefik)
→ buildSsgOutput()   (sync → build ssg → patch +data.ts → npm install → vite build → réécriture URLs)
→ rsync -az --delete \
    -e "ssh -p $port -i /var/work/<domain>/ssh_key -o StrictHostKeyChecking=accept-new" \
    /var/work/<domain>/dist/client/  $user@$host:$path/
→ state.json { mode: "ssh", sshHost, sshPath, publishDomain, customDomains }
→ notifyBuildStatus(PUBLISHED)

Le publisher ne sert pas le hostname et n'écrit pas de config Traefik.
Unpublish : oubli local ; le contenu distant est laissé en place (mentionné dans le retour).

Travail par repo

  • webstudio-publisher : publishBuildSsh, endpoint POST /targets/ssh-setup, Dockerfile + rsync openssh-client, gestion des transitions.
  • webstudio-fork : valeur ssh dans l'enum buildMode ; option dropdown « Remote SSH (SSG) » (affichée dès que publisherHost est défini). Si publish sans cible configurée → l'erreur du publisher est remontée telle quelle dans le toast.
  • webstudio-self-host : section README (générer la paire de clés, ssh-copy-id, config nginx/caddy côté serveur distant pour servir $sshPath).

Prérequis serveur distant

rsync installé · un serveur web configuré pour servir le dossier cible · port SSH ouvert + clé publique déposée.

Dépend de

Le groundwork commun de #22 (buildSsgOutput(), stopPreviousMode, enum buildMode).

Hors-scope

  • Formulaire de configuration dans le builder (amélioration ultérieure — pour l'instant curl)
  • Gestion du TLS / domaine du serveur distant (responsabilité de l'utilisateur)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions