بنقرة واحدة
sklein-ssh-push-deploy
Script de déploiement par envoi de payload via SSH sans Ansible.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Script de déploiement par envoi de payload via SSH sans Ansible.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Créer un nouveau projet Node.js avec PostgreSQL (raw SQL, migrations, conteneur Podman) basé sur les préférences de Stéphane Klein. Use when user wants to create a Node.js project with PostgreSQL, migrations, or raw SQL.
Initialize ADR/agents/docs infrastructure in a project
Génère le template (template/), le script generate.sh, le vars-example.yaml, et le SKILL.md d'un projet à partir d'un projet source existant. Use when user wants to create a project scaffolding template from an existing project.
Conventions HTTP API de Stéphane Klein — nommage, verbes, codes, pagination, erreurs, versioning, HATEOAS, filtres, embedding, upload, OpenAPI. Utiliser lors de la création, modification ou review d'une API HTTP.
Gère la todo list de Stéphane via la banque mémoire hindsight `todo` et le sous-agent `@todo`. Use when user says: ajoute à ma todo, marque comme fait, liste mes tâches, supprime une tâche, bloque/débloque une tâche, quelles sont mes priorités, importe ça dans ma todo, ou colle un bloc de texte contenant plusieurs tâches.
Guide pour la création de nouveaux skills
| name | sklein-ssh-push-deploy |
| description | Script de déploiement par envoi de payload via SSH sans Ansible. |
Ce skill est activé lorsque l'utilisateur demande de :
deploy_*.sh / _payload_deploy_*.shLorsque l'activation correspond à un contexte où Ansible serait une alternative envisageable (déploiement, configuration distante, exécution de tâches à distance), l'assistant doit explicitement demander à l'utilisateur :
Veux-tu un script SSH push (launcher + payload) ou utiliser Ansible ?
minijinja-cli : installé avec Mise :
[tools]
...
"github:mitsuhiko/minijinja" = "2.20.0"
...
deploy_<target>.sh # Launcher (local)
_payload_deploy_<target>.sh # Payload (exécuté à distance, template Jinja2)
Le launcher utilise minijinja-cli --env pour injecter des variables d'environnement
dans le payload (template Jinja2), puis pipe le résultat dans une session SSH :
minijinja-cli --env _payload_deploy_<target>.sh | ssh user@host 'bash -s'
Le payload contient toutes les commandes à exécuter sur le serveur distant : création de dossiers, écriture de fichiers, téléchargement, démarrage de services, etc.
deploy_<target>.sh)#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$0")"
minijinja-cli --env _payload_deploy_<target>.sh | ssh <user>@$<SERVER_IP> 'bash -s'
Règles :
set -euo pipefail pour la robustessecd "$(dirname "$0")" pour être insensible au répertoire d'appel_payload_deploy_<target>.sh)#!/usr/bin/env bash
set -euo pipefail
# Commandes exécutées à distance
# Utiliser {{ ENV.VARNAME }} pour les paramètres injectés par minijinja-cli --env
Règles :
set -euo pipefail en tête{{ ENV.VARNAME }} pour toute valeur qui diffère entre exécutionscat <<'EOF' > chemin (EOF entre quotes pour éviter
l'expansion des variables shell locales par le heredoc)_payload_deploy_<target>.sh) avec toutes les commandes
distantes et les placeholders {{ ENV.VARNAME }}deploy_<target>.sh) avec le pipe minijinja-cli --env | sshchmod +x deploy_<target>.shexport SERVER_IP="203.0.113.42"
export DB_PASSWORD="$(gopass show ...)"
export TOKEN="$(gopass show ...)"
./deploy_mon_service.sh
Le payload devrait être écrit pour être exécuté plusieurs fois de suite sans effet de bord (ou avec un effet de bord acceptable). Par exemple :
mkdir -p plutôt que mkdircat <<EOF > fichier écrase le fichier existant (attention : >, pas >>)systemctl restart svc || systemctl start svcLes parties du payload qui doivent être évaluées par minijinja-cli utilisent la syntaxe Jinja2 standard :
{{ ENV.MA_VARIABLE }} — insère la valeur de la variable d'environnement{% if ENV.DEBUG %}set -x{% endif %} — conditionnel{% for key in ENV.HOSTS.split(',') %}...{% endfor %} — boucleAttention : dans un heredoc (cat <<EOF), le shell évalue $var et les backticks.
Pour éviter ça, toujours quoter le délimiteur : cat <<'EOF' ou cat <<'HEREDOC'.
_payload_install_<target>.sh,
_payload_upgrade_<target>.sh, _payload_backup_<target>.shdeploy_<target>.sh, backup_<target>.sh