Docs/ Opérations/ Gestionnaire de fichiers

Gestionnaire de fichiers

L'onglet Fichiers parcourt le système de fichiers du conteneur en marche de l'application. Il sert à inspecter et à faire de petites corrections, pas à faire entrer ou sortir des données.

De quoi il s'agit

Chaque opération exécute une commande dans le conteneur en marche (ls, head, tee, touch, mkdir -p, rm -rf), avec l'utilisateur du conteneur. Vous voyez le conteneur exactement comme l'application le voit, montages compris.

Warning
Une modification faite hors d'un volume monté ne vit que dans le conteneur actuel. Le déploiement suivant démarre un nouveau conteneur à partir de l'image, et la modification disparaît. Pour garder un fichier, placez-le dans un montage de l'onglet Volumes, ou modifiez votre code et redéployez.

Utiliser l'onglet Fichiers

  • Ouvrez l'application et allez dans l'onglet Fichiers. L'arborescence part de / ; Actualiser relit le répertoire courant. Chaque entrée affiche sa taille, sa date et ses Permissions (en lecture seule).
  • Cliquez sur un fichier pour l'afficher. Le contenu binaire n'est pas affiché.
  • Modifier, puis Enregistrer, réécrit le fichier avec le texte de l'éditeur.
  • Nouveau fichier crée un fichier vide et Nouveau dossier un répertoire, dans le répertoire courant.
  • Supprimer efface un fichier, ou un répertoire avec tout son contenu, après confirmation.
  • Pour une application à plusieurs services, un sélecteur choisit le conteneur ; par défaut, c'est le conteneur principal.

API

Les mêmes opérations par l'API (réponses réelles) :

Terminal
$ curl -s -H "Authorization: Bearer $SH0_TOKEN" "https://panel.example.com/api/v1/apps/<app-id>/browse?path=/app"
{"data":{"entries":[{"file_type":"file","modified":"1970-01-01 00:00:00","name":"server.js","permissions":"-rw-r--r--","size":"182"}],"path":"/app"}}

$ curl -s -X PUT -H "Authorization: Bearer $SH0_TOKEN" -H "Content-Type: application/json" \
    -d '{"path":"/app/notes/todo.txt","content":"hello from sh0\n"}' \
    https://panel.example.com/api/v1/apps/<app-id>/file
{"data":{"path":"/app/notes/todo.txt","written":true}}

$ curl -s -H "Authorization: Bearer $SH0_TOKEN" "https://panel.example.com/api/v1/apps/<app-id>/file?path=/app/notes/todo.txt"
{"data":{"content":"hello from sh0\n","path":"/app/notes/todo.txt"}}
  • GET /api/v1/apps/<id>/browse?path=… -- lister un répertoire.
  • GET /api/v1/apps/<id>/file?path=… lit un fichier ; PUT sur la même route, avec path et content, l'écrit.
  • POST /api/v1/apps/<id>/files/mkdir et POST …/files/new, avec path -- créer un répertoire ou un fichier vide.
  • DELETE /api/v1/apps/<id>/files?path=… -- supprimer. /, /bin, /etc, /usr, /lib, /lib64, /sbin, /proc, /sys, /dev et /boot eux-mêmes sont refusés (« Cannot delete protected system directory »).
  • Les chemins doivent être absolus et ne pas contenir ... Lire exige le rôle viewer sur le projet de l'application ; écrire, créer et supprimer exigent le rôle developer.

Ce qui n'existe pas

  • Pas d'envoi. Aucune route ne permet d'envoyer un fichier depuis votre ordinateur ; POST …/files/upload répond 404.
  • Ni téléchargement ni archive. On ne peut télécharger ni un fichier ni un répertoire sous forme d'archive ; GET …/files/download répond 404.
  • Pas de changement de droits ni de propriétaire. Les permissions sont affichées, pas modifiables.

Pour ces opérations, passez par le serveur : docker cp entre l'hôte et le conteneur, ou travaillez directement dans le répertoire du volume sur l'hôte (voir Volumes et montages). Sur le serveur lui-même, sh0 ssh <app> ouvre un shell dans le conteneur (voir Accès au terminal).

Limites et précautions

  • Lecture limitée à 1 Mo. La lecture renvoie au plus les 1 048 576 premiers octets d'un fichier, sans signaler la coupure. Ne modifiez pas et n'enregistrez pas un fichier plus gros depuis l'onglet Fichiers : le fichier enregistré ne garderait que ce premier mégaoctet.
  • L'image doit fournir les outils. Les images sans boîte à outils shell (distroless, scratch) n'ont ni ls ni tee, et le gestionnaire de fichiers ne peut pas y travailler.
  • La suppression est récursive et définitive. Il n'y a pas de corbeille.
  • Le conteneur doit tourner. Une application arrêtée n'a pas de conteneur à parcourir.