Migrar desde Heroku
Los dynos pasan a ser servicios, los add-ons pasan a ser plantillas con volúmenes, las config vars pasan a ser variables y el Procfile pasa a ser un comando de inicio. Una mudanza paso a paso.
Correspondencia de conceptos#
| Heroku | Skiffly | Notas |
|---|---|---|
| App | Proyecto con uno o más servicios | un servicio por tipo de proceso |
Tipo de dyno (web, worker) | Servicio | web recibe un dominio; los workers corren sin uno |
| Etapas del pipeline (staging, production) | Entornos | un proyecto, entornos staging y production |
| Review apps | Entornos de vista previa de PR | activa las vistas previas de PR en el proyecto |
| Buildpacks | Railpack | detecta los mismos lenguajes; o agrega un Dockerfile |
Procfile | Comando de inicio por servicio | web: gunicorn app:app → comando de inicio gunicorn app:app |
| Config vars | Variables | referencias ${{Postgres.DATABASE_URL}} en lugar de URLs copiadas |
| Add-ons de Heroku Postgres / Redis | Plantillas de Postgres / Redis con volúmenes | la instancia y sus datos son tuyos |
| Heroku Scheduler | Programación cron en un servicio | 0 * * * * |
heroku run bash | skiffly ssh | shell en el contenedor en ejecución |
heroku logs --tail | skiffly logs -f | |
heroku ps:scale web=2 | réplicas | Configuración → Despliegue → Réplicas |
| Tamaños de dyno | Límites de CPU / memoria por servicio | cualquier valor dentro del plan |
*.herokuapp.com | *.skiffly.cloud | dominios propios con TLS automático |
heroku.yml | .skiffly/skiffly.ts | configuración como código |
| Factura mensual | Saldo prepago | PayPal o cripto |
Paso a paso#
-
Inicia sesión en app.skiffly.dev con GitHub; el código debe estar en GitHub (el remoto git de Heroku no sirve como origen).
-
Crea el proyecto y un servicio por tipo de proceso:
skiffly initen el repositorio,skiffly upparaweb. Para unworker, crea un segundo servicio desde el mismo repositorio y pon como comando de inicio la línea del worker delProcfile; déjalo sin dominio. -
Bases de datos.
skiffly deploy --template postgres(yredis). Copia los datos:heroku pg:backups:capture -a my-app && heroku pg:backups:download -a my-app # latest.dump skiffly connect postgres --print pg_restore -d "<url>" --no-owner --clean --if-exists latest.dump skiffly proxy delete <port> -
Config vars.
heroku config -s -a my-app > vars.env, quita las URLs de los add-ons y luego:skiffly variables set --skip-deploys $(cat vars.env | xargs) skiffly variables set 'DATABASE_URL=${{Postgres.DATABASE_URL}}' 'REDIS_URL=${{Redis.REDIS_URL}}' skiffly redeploy -
Puerto. Heroku define
$PORT; Skiffly también. No hay nada que cambiar si la app ya lo lee. -
Release phase. No hay hook de release phase. Ejecuta las migraciones desde el comando de inicio (
sh -c "npm run migrate && npm start") o como tarea puntual:skiffly ssh -- npm run migrate. -
Scheduler. Por cada tarea programada, crea un servicio desde el mismo repositorio con una programación cron y el comando de la tarea como comando de inicio.
-
Dominio. Agrega el dominio propio, crea los registros CNAME y TXT, verifica y luego cambia el DNS desde Heroku cuando se emita el certificado.
-
Apaga Heroku después de unos días de tráfico en Skiffly.
Diferencias que conviene conocer#
- Los servicios de Skiffly no entran en reposo a menos que actives App Sleeping; las apps del plan Free y las apps hobby inactivas no se detienen por temporizador.
- El sistema de archivos es efímero como el de un dyno, pero puedes adjuntar un volumen persistente para subidas de archivos o SQLite.
- Los logs se conservan hasta las últimas 5 000 líneas por despliegue; reenvíalos desde la app si necesitas historial.
- Marketplace de add-ons: elige en su lugar entre 136 plantillas; tú ejecutas la instancia y pagas por sus recursos, no un precio por add-on.