Gestor de archivos
La pestaña Archivos recorre el sistema de archivos del contenedor en marcha de la aplicación. Sirve para inspeccionar y hacer pequeñas correcciones, no para meter o sacar datos.
Qué es
Cada operación ejecuta un comando dentro del contenedor en marcha (ls, head, tee, touch, mkdir -p, rm -rf), con el usuario del contenedor. Ve el contenedor exactamente como lo ve la aplicación, montajes incluidos.
Warning
Un cambio hecho fuera de un volumen montado solo vive en el contenedor actual. El siguiente despliegue arranca un contenedor nuevo a partir de la imagen y el cambio desaparece. Para conservar un archivo, póngalo en un montaje de la pestaña Volúmenes, o cambie su código y vuelva a desplegar.
Usar la pestaña Archivos
- Abra la aplicación y vaya a la pestaña Archivos. El árbol parte de
/; Actualizar vuelve a leer el directorio actual. Cada entrada muestra su tamaño, fecha y Permisos (solo lectura). - Haga clic en un archivo para mostrarlo. El contenido binario no se muestra.
- Editar y luego Guardar reescribe el archivo con el texto del editor.
- Nuevo archivo crea un archivo vacío y Nueva carpeta un directorio, en el directorio actual.
- Eliminar borra un archivo, o un directorio con todo su contenido, tras una confirmación.
- En una aplicación con varios servicios, un selector elige el contenedor; por defecto, el contenedor principal.
API
Las mismas operaciones por la API (respuestas reales):
$ 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=…-- listar un directorio.GET /api/v1/apps/<id>/file?path=…lee un archivo;PUTen la misma ruta, conpathycontent, lo escribe.POST /api/v1/apps/<id>/files/mkdiryPOST …/files/new, conpath-- crear un directorio o un archivo vacío.DELETE /api/v1/apps/<id>/files?path=…-- eliminar./,/bin,/etc,/usr,/lib,/lib64,/sbin,/proc,/sys,/devy/booten sí se rechazan («Cannot delete protected system directory»).- Las rutas deben ser absolutas y no contener
... Leer requiere el rol viewer en el proyecto de la aplicación; escribir, crear y eliminar requieren el rol developer.
Lo que no existe
- Sin subida. No hay ninguna ruta para enviar un archivo desde su equipo;
POST …/files/uploadresponde 404. - Sin descarga ni archivo comprimido. No se puede descargar un archivo ni un directorio como archivo comprimido;
GET …/files/downloadresponde 404. - Sin cambio de permisos ni de propietario. Los permisos se muestran, no se editan.
Para esas operaciones, use el servidor: docker cp entre el host y el contenedor, o trabaje directamente en el directorio del volumen en el host (vea Volúmenes y montajes). En el propio servidor, sh0 ssh <app> abre un shell en el contenedor (vea Acceso a la terminal).
Límites y precauciones
- Lectura limitada a 1 MB. La lectura devuelve como máximo los primeros 1 048 576 bytes de un archivo, sin indicar el corte. No edite ni guarde un archivo mayor desde la pestaña Archivos: el archivo guardado conservaría solo ese primer megabyte.
- La imagen debe tener las herramientas. Las imágenes sin utilidades de shell (distroless, scratch) carecen de
lsotee, y el gestor de archivos no puede trabajar en ellas. - El borrado es recursivo y definitivo. No hay papelera.
- El contenedor debe estar en marcha. Una aplicación detenida no tiene contenedor que explorar.