CLI
Instala la CLI `skiffly`, inicia sesión, vincula un directorio y despliega. Los comandos siguen a la CLI de Railway siempre que Skiffly tenga un equivalente.
npm i -g skiffly # o: pnpm add -g skiffly, o npx skiffly <command>
skiffly --helpNode.js 20+. La CLI es un único archivo autocontenido sin dependencias nativas; incorpora el servidor MCP y el runtime de configuración como código.
Iniciar sesión#
skiffly login # abre app.skiffly.dev/cli-login en el navegador; confirma ahí
skiffly login --browserless # máquinas sin navegador: imprime la URL y el código de emparejamiento y espera la confirmación
skiffly login --token skiffly_… # no interactivo: un token de espacio de trabajo de Configuración → Desarrollador
skiffly whoami
skiffly logout # revoca el token de cuenta en el servidor y lo olvida localmenteskiffly login funciona como railway login: la CLI abre el panel, confirmas el código de emparejamiento con la sesión iniciada
y la CLI recibe un token de cuenta (skiffly_acct_…, válido por 90 días, todos tus espacios de trabajo). Las sesiones se listan
y pueden revocarse en Configuración → Desarrollador → Sesiones de CLI y apps conectadas. El token se guarda en
~/.config/skiffly/config.json (modo 600). En CI define SKIFFLY_TOKEN=skiffly_… (un token de espacio de trabajo con el scope
write); la variable de entorno tiene prioridad sobre el token guardado.
Vincular un directorio#
skiffly init # proyecto nuevo, vinculado a este directorio
skiffly link # elige un proyecto / entorno / servicio existente
skiffly link -p my-app -e staging -s web
skiffly status # qué está vinculado, más el estado y los dominios de cada servicio
skiffly unlinkLos vínculos se guardan por ruta en la configuración global y se encuentran desde los subdirectorios. SKIFFLY_PROJECT_ID, SKIFFLY_ENVIRONMENT_ID y SKIFFLY_SERVICE_ID tienen prioridad sobre el vínculo, y todo comando que necesite un destino acepta -p/--project, -e/--environment, -s/--service (id o nombre).
Desplegar#
skiffly up # sube el directorio actual, lo compila y transmite los logs
skiffly up ./apps/api # sube otro directorio
skiffly up -d # se desconecta en cuanto el despliegue queda creado
skiffly up --git # despliega en cambio el HEAD pusheado de la rama actual desde GitHub
skiffly up --git --commit <sha>
skiffly redeploy # el último build otra vez, con la configuración actual
skiffly restart # reinicia los contenedores, sin build
skiffly deploy --image ghcr.io/acme/api:1.4 --name api --port 8080 -v LOG_LEVEL=info
skiffly deploy --template postgres
skiffly deployment listskiffly up funciona como railway up: el directorio se empaqueta en un tarball (se omiten los archivos que coinciden con
.gitignore y .skifflyignore, y .git siempre; máximo 100 MB comprimido), se sube al servicio vinculado y se compila
con Railpack o con el Dockerfile del servicio; no hace falta commit ni push. El despliegue aparece en el panel como
Subida desde CLI, y el servicio se crea si el proyecto no tiene ninguno (-y omite la pregunta). --git conserva el
comportamiento anterior: el directorio debe ser un repositorio git cuyo origin esté conectado al servicio, y Skiffly
compila el HEAD pusheado de la rama.
Importar desde Railway#
skiffly import --from-railway # interactivo: token de Railway → proyecto → proyecto de Skiffly, con una tabla de resumen
skiffly import --from-railway --railway-token … --railway-project <id> --project new --dry-runCopia servicios (origen, comandos de build/inicio, health checks, cron, réplicas), variables con sus referencias
${{Service.VAR}}, volúmenes, dominios propios y proxies TCP a un proyecto de Skiffly, e imprime lo que todavía requiere un
paso manual (registros DNS, datos de los volúmenes). Detalles: Migrar desde Railway.
Logs, shell, run#
skiffly logs -f # logs de runtime, en seguimiento
skiffly logs --build # salida del build; --system para reinicios / OOM
skiffly logs -n 200 --filter "error"
skiffly ssh # /bin/sh en un contenedor en ejecución
skiffly ssh -s api -- ls -la /app # comando único, se propaga el código de salida
echo "select 1" | skiffly ssh -s postgres -T -- psql -U postgres
skiffly run -- pnpm dev # ejecuta un comando local con las variables del servicioAbrir un shell en un contenedor#
skiffly ssh (alias shell) abre un shell interactivo en la primera réplica en ejecución del servicio; --deployment <id> elige un despliegue, -T desactiva la pseudoterminal para usar tuberías. Las sesiones pasan por la API mediante WebSocket con tu token, quedan en el registro de auditoría, se limitan a cinco por usuario y se cierran tras 30 minutos de inactividad. Ver Seguridad.
Variables, dominios, volúmenes, proxies#
skiffly variables # --kv para KEY=value, --shared para las de todo el entorno
skiffly variables set KEY=value … [--stdin KEY] [--skip-deploys]
skiffly variables delete KEY …
skiffly domain # genera un dominio *.skiffly.cloud
skiffly domain app.example.com # dominio propio, imprime CNAME + TXT
skiffly domain status app.example.com
skiffly volume add --mount-path /data --size 5
skiffly proxy add --port 5432 # proxy TCP público
skiffly connect [service] # psql / mysql / redis-cli / mongosh a través de un proxyEntornos y servicios#
skiffly environment # cambiar de entorno
skiffly environment new staging --duplicate production
skiffly service # vincula un servicio; service list; service delete
skiffly open # el panel en el navegador (--print para la URL)Configuración como código, facturación, docs, API directa#
skiffly config init | validate | plan | apply
skiffly billing # saldo, plan, uso actual (alias: usage)
skiffly templates [search]
skiffly docs deploy # busca en la documentación incluida
skiffly api '{ me { login } }' # GraphQL directo con el token de la CLI; -v '{"id":"…"}' para variables
skiffly mcp # servidor MCP por stdio; mcp install claude|cursor|codexSalida y códigos de salida#
Todo comando de listado tiene --json. Códigos de salida: 0 ok, 1 error, 2 uso incorrecto o sin vínculo, 3 sin autenticar, 4 no encontrado, 5 prohibido o límite del plan, 6 red. SKIFFLY_DEBUG=1 imprime los stack traces.
La tabla completa de comandos está en la referencia de la CLI.