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 :
- écrit la clé dans
/var/work/<domain>/ssh_key (chmod 600, jamais loggée)
- persiste le reste dans
/var/work/<domain>/target.json
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)
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-publisherEndpoint dédié (la clé privée n'est pas passée à chaque publish) :
Le publisher :
/var/work/<domain>/ssh_key(chmod 600, jamais loggée)/var/work/<domain>/target.jsonssh-keyscan→known_hostsPipeline —
publishBuildSsh()dansserver.mjsLe 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
publishBuildSsh, endpointPOST /targets/ssh-setup, Dockerfile+ rsync openssh-client, gestion des transitions.sshdans l'enumbuildMode; option dropdown « Remote SSH (SSG) » (affichée dès quepublisherHostest défini). Si publish sans cible configurée → l'erreur du publisher est remontée telle quelle dans le toast.ssh-copy-id, config nginx/caddy côté serveur distant pour servir$sshPath).Prérequis serveur distant
rsyncinstallé · 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, enumbuildMode).Hors-scope
curl)