Migrer depuis Heroku
Migrez une app Heroku avec sa base de données, ses config vars et son domaine.
Ce guide vous aide à migrer une app Heroku vers Nodion : code, variables d'environnement, Heroku Postgres, Heroku Key-Value Store, tâches du
Scheduler et domaine personnalisé. Prévoyez une courte interruption des écritures pendant la copie de la base de données. Il n'existe
pas d'outil d'import pour app.json ou heroku.yml ; chaque étape ci-dessous se fait en quelques clics ou commandes.
Correspondances entre Heroku et Nodion
| Heroku | Nodion |
|---|---|
| App | Application |
Types de processus et dynos (web, worker) | Processus d'une même app, chacun avec ses propres réplicas et son propre package |
| Taille du dyno | Package (Discovery, General Purpose) |
| Config vars | Variables d'environnement (onglet Environment) |
| Procfile | Procfile (builds avec buildpacks) |
| Release phase | Entrée release: du Procfile ou commande de release de l'app |
| Heroku Postgres | Postgres managé, rattaché en tant que DATABASE_URL |
| Heroku Key-Value Store | Valkey, rattaché en tant que REDIS_URL |
| Heroku Scheduler | Tâches cron de l'app |
| Review apps | Environnements de preview |
| Automated Certificate Management | Certificats automatiques |
1. Créez le projet et la base de données
Créez un projet et, dans ce projet, une base de données PostgreSQL dans la région où l'app doit tourner (EU Central pour Francfort). L'app et sa base de données doivent se trouver dans la même région ; Nodion refuse de les rattacher d'une région à l'autre. Choisissez une version de Postgres au moins aussi récente que celle de votre base Heroku. Plus d'informations dans Bases de données.
2. Copiez la base de données
Commencez par arrêter toutes les écritures. Avec le maintenance mode de Heroku,
les dynos worker et les tâches du Scheduler continuent de tourner. Réduisez donc à zéro chaque type de processus qui écrit (pas seulement worker)
et retirez les tâches de Heroku Scheduler pendant toute la durée de la copie. Selon Heroku, le maintenance mode n'est pas disponible
pour les apps Fir ; dans ce cas, réduisez aussi web à zéro ou arrêtez les écritures dans l'app elle-même :
bashheroku maintenance:on --app example-app
heroku ps:scale worker=0 --app example-app # every process type that writes Sur Fir :
bashheroku ps:scale web=0 worker=0 --app example-app # Fir: no maintenance mode
Créez ensuite une sauvegarde et téléchargez-la. Heroku l'enregistre sous latest.dump au format personnalisé de pg_dump
(documentation Heroku).
Heroku recommande PGBackups pour les bases jusqu'à 20 Go ; pour les bases plus volumineuses, lancez pg_dump directement sur l'URL renvoyée par heroku pg:credentials:url (bases classiques) ou
heroku data:pg:credentials:url (bases Advanced, documentation Heroku).
bashheroku pg:backups:capture --app example-app
heroku pg:backups:download --app example-app Les bases Advanced ne prennent pas en charge PGBackups ; pour celles-ci, ainsi que pour les bases de plus de 20 Go, créez le dump directement dans le même format personnalisé, avec l'URL fournie par la commande d'identifiants correspondante. Selon Heroku, les bases Private et Shield n'acceptent pas de connexions externes (et Shield n'a pas PGBackups) ; pour celles-ci, suivez la procédure que Heroku décrit pour les Private Spaces.
bashpg_dump -Fc --no-acl --no-owner -f latest.dump \
"postgres://USER:PASSWORD@HOST:5432/DATABASE?sslmode=require"
Dans Nodion, ouvrez l'onglet Overview de la base de données et cliquez sur Enable public access. Attendez que l'endpoint
n'affiche plus Provisioning, puis copiez l'URL de connexion affichée dans le dashboard (toujours en TLS, sslmode=require).
Ajoutez votre propre IP aux sources autorisées, pour que personne d'autre ne puisse se connecter. Restaurez ensuite :
bashpg_restore --verbose --no-owner --no-acl \
--dbname "postgresql://nodion:PASSWORD@HOST:PORT/DATABASE?sslmode=require" \
latest.dump
Utilisez un pg_restore au moins aussi récent que le plus récent des deux serveurs. Si la restauration signale des erreurs sur le schéma
heroku_ext, créez-le d'abord : CREATE SCHEMA heroku_ext; (un conseil de Heroku lui-même). Vérifiez le nombre
de lignes dans l'onglet Browse de la base, puis désactivez à nouveau l'accès public ; la base de données continue de tourner en interne.
Un Valkey vide ne suffit que si votre app utilise Key-Value Store comme cache, ou comme file d'attente que vous laissez se vider au préalable. S'il contient des données dont vous avez besoin (sessions ou clés persistantes, par exemple), migrez-les avant l'arrêt, ou conservez la source jusqu'à ce qu'elle ne soit plus nécessaire.
3. Créez l'application
Créez une application à partir de votre dépôt Git avec la stratégie Buildpacks. Les buildpacks lisent votre
Procfile : web est le processus par défaut et les autres lignes deviennent des types de processus
(Buildpacks). Pour Node.js, un script heroku-postbuild s'exécute après le build.
Comme sur Heroku, le processus web reçoit la variable PORT.
Si le Procfile n'a pas de ligne web:, sa première ligne devient la commande par défaut et tourne dans le processus web de Nodion.
Nodion vérifie ce processus en HTTP avant sa mise en ligne ; un worker sans serveur HTTP ne passe donc pas cette vérification. Gardez une
ligne web: pour le serveur HTTP de votre app.
Les lignes du Procfile ne créent pas de processus. Pour une ligne worker:, ouvrez Processes, New process, nommez-le
worker et laissez la commande vide ; il exécute alors le type de processus du même nom.
Une ligne release: s'exécute une fois par déploiement, avant le démarrage de web. Si elle échoue, le déploiement échoue
et la release précédente continue de servir le trafic. Si vous utilisiez heroku.yml pour le build sur Heroku, choisissez la stratégie Dockerfile :
il n'y a pas de Procfile dans ce cas, définissez donc la commande de release de l'app (Settings, dans la carte Preview environments, où le champ apparaît une fois les previews activées, ou release_command via l'API). Nodion ne définit pas PORT pour les apps Dockerfile ; l'app écoute
sur le port du processus web (sinon sur celui de l'EXPOSE de l'image, sinon sur 8080).
4. Transférez les config vars
Exportez les config vars au format shell (Heroku CLI) :
bashheroku config -s --app example-app > heroku.env
Collez les lignes dans Environment, Add many, puis importez-les. Vérifiez le résultat : les valeurs contenant des guillemets ou des
barres obliques inverses peuvent nécessiter une correction manuelle, et les valeurs sur plusieurs lignes (clés PEM, par exemple) se saisissent via la CLI ou
l'API. Les variables importées ne sont pas secrètes ; définissez les secrets avec nodion env set KEY=value --secret.
Supprimez ensuite DATABASE_URL et REDIS_URL des variables importées : une variable que vous définissez vous-même
remplace la valeur injectée par une base de données rattachée. Utilisez Attach database pour la base Postgres
(url en tant que DATABASE_URL) et pour Valkey (url en tant que REDIS_URL).
Au sein de Nodion, la connexion passe par le réseau privé, sans TLS (sslmode=disable). Si votre code
force SSL pour la base de données, comme Heroku l'exige, désactivez-le pour cette URL ; il en va de même pour rediss:// vers Valkey.
5. Les jobs du Scheduler deviennent des tâches cron
Ajoutez chaque job de Heroku Scheduler dans l'onglet Cron de l'app : une planification cron à cinq champs en UTC, la même commande, un timeout de 30 minutes maximum. Une app accepte jusqu'à 8 tâches cron ; tant qu'une exécution est en cours, la suivante est ignorée.
6. Déployez et vérifiez
Déployez, suivez l'onglet Logs et ouvrez l'app sur son nom d'hôte Nodion. Si / ne répond pas rapidement avec un 2xx
ou un 3xx, définissez votre propre chemin de health check dans Settings.
7. Transférez le domaine
Ajoutez le domaine dans l'onglet Domains. Nodion affiche deux enregistrements : un enregistrement TXT _nodion-challenge.your-domain et un
CNAME (un ALIAS à l'apex) vers le nom d'hôte par défaut de l'app. Vous pouvez ajouter l'enregistrement TXT à l'avance. Le certificat est
émis dès que le CNAME pointe vers Nodion ; comptez donc quelques minutes sans certificat valide après la bascule, et baissez le
TTL au préalable.
8. Arrêtez Heroku
Une fois le trafic et les données transférés sur Nodion, supprimez l'app Heroku. Selon Heroku, cette opération est irréversible ; conservez donc latest.dump.
bashheroku apps:destroy --app example-app Ce qui fonctionne différemment
- Il n'y a ni mode maintenance ni pipelines avec promotion entre apps.
- À la place des one-off dynos, l'onglet Shell ouvre un terminal dans un processus en cours d'exécution.
- La CLI récupère les logs mais ne peut pas les suivre en continu ; pour les voir en direct, utilisez l'onglet Logs.
- Les environnements de preview n'ont pas besoin d'
app.json; chacun reçoit une base de données vide. - Un rollback redéploie une image antérieure avec les variables d'environnement actuelles.
Pour aller plus loin
Nodion comparé à Heroku, Tarifs, Applications et Bases de données.