Migreren vanaf Heroku
Verhuis een Heroku-app met database, config vars en domein.
Deze gids verhuist één Heroku-app naar Nodion: code, config vars, Heroku Postgres, Heroku Key-Value Store, Scheduler-jobs
en het eigen domein. Plan een korte schrijfpauze terwijl de database wordt gekopieerd. Er is geen importer voor
app.json of heroku.yml; elke stap hieronder is een paar klikken of commando's.
Wat vervangt wat
| Heroku | Nodion |
|---|---|
| App | Application |
Process types en dyno's (web, worker) | Processen van één app, elk met eigen replica's en een eigen pakket |
| Dyno-grootte | Pakket (Discovery, General Purpose) |
| Config vars | Omgevingsvariabelen (tabblad Environment) |
| Procfile | Procfile (bij buildpack-builds) |
| Release phase | release:-regel in de Procfile of het release command van de app |
| Heroku Postgres | Managed Postgres, gekoppeld als DATABASE_URL |
| Heroku Key-Value Store | Valkey, gekoppeld als REDIS_URL |
| Heroku Scheduler | Cronjobs van de app |
| Review apps | Previewomgevingen |
| Automated Certificate Management | Automatische certificaten |
1. Maak het project en de database aan
Maak een project aan en daarin een PostgreSQL-database in de regio waar de app moet draaien (EU Central voor Frankfurt). De app en de database moeten in dezelfde regio staan; Nodion weigert koppelingen tussen regio's. Kies een Postgres-versie die minstens zo nieuw is als je Heroku-database. Meer bij Databases.
2. Kopieer de database
Stop eerst alle schrijfacties. In de maintenance mode van Heroku
blijven worker-dyno's en Scheduler-jobs draaien. Schaal daarom elk procestype dat schrijft naar nul (niet alleen worker)
en verwijder de jobs in Heroku Scheduler zolang de kopie loopt. Volgens Heroku is maintenance mode niet beschikbaar
voor Fir-apps; schaal daar ook web naar nul of stop de schrijfacties in de app zelf:
bashheroku maintenance:on --app example-app
heroku ps:scale worker=0 --app example-app # every process type that writes Op Fir:
bashheroku ps:scale web=0 worker=0 --app example-app # Fir: no maintenance mode
Maak daarna een backup en download die. Heroku schrijft hem als latest.dump in het custom-formaat van
pg_dump (Heroku-docs).
Heroku raadt PGBackups aan voor databases tot 20 GB; voor grotere databases draai je pg_dump rechtstreeks tegen de URL uit heroku pg:credentials:url (classic databases) of
heroku data:pg:credentials:url (Advanced-databases, Heroku-docs).
bashheroku pg:backups:capture --app example-app
heroku pg:backups:download --app example-app Advanced-databases ondersteunen geen PGBackups; maak voor die databases, en voor databases boven 20 GB, rechtstreeks een dump in hetzelfde custom-formaat, met de URL uit het bijbehorende credentials-commando. Volgens Heroku accepteren Private- en Shield-databases geen externe verbindingen (en heeft Shield geen PGBackups); volg daarvoor de route die Heroku beschrijft voor Private Spaces.
bashpg_dump -Fc --no-acl --no-owner -f latest.dump \
"postgres://USER:PASSWORD@HOST:5432/DATABASE?sslmode=require"
Open in Nodion het tabblad Overview van de database en klik op Enable public access. Wacht tot het endpoint
niet meer Provisioning toont en kopieer dan de verbindings-URL die het dashboard toont (altijd TLS, sslmode=require).
Voeg je eigen IP toe onder allowed sources, zodat alleen jij verbinding kunt maken. Zet daarna de dump terug:
bashpg_restore --verbose --no-owner --no-acl \
--dbname "postgresql://nodion:PASSWORD@HOST:PORT/DATABASE?sslmode=require" \
latest.dump
Gebruik een pg_restore die minstens zo nieuw is als de nieuwste van de twee servers. Krijg je bij het herstellen fouten over het schema
heroku_ext, maak het dan eerst aan: CREATE SCHEMA heroku_ext; (advies van Heroku zelf). Controleer het
aantal rijen in het tabblad Browse van de database en zet publieke toegang daarna weer uit; de database blijft intern draaien.
Een lege Valkey is alleen genoeg als je app de Key-Value Store als cache gebruikt, of als queue die je eerst laat leeglopen. Staat er data in die je nodig hebt (bijvoorbeeld sessies of persistente keys), verhuis die data dan vóór het uitschakelen, of houd de bron aan tot je die niet meer nodig hebt.
3. Maak de applicatie aan
Maak een applicatie aan vanuit je Git-repository met de strategie Buildpacks. De buildpacks lezen je
Procfile: web is het standaardproces en de andere regels worden procestypes
(Buildpacks). Voor Node.js draait na de build een heroku-postbuild-script.
Net als op Heroku krijgt het web-proces de variabele PORT.
Heeft de Procfile geen web:-regel, dan wordt de eerste regel de standaard en draait die in het web-proces van Nodion.
Nodion controleert dat proces via HTTP voordat het live gaat, dus een worker zonder HTTP-server komt niet door die controle. Houd een
web:-regel aan voor de HTTP-server van je app.
Procfile-regels maken geen processen aan. Open voor een worker:-regel Processes, New process, noem het proces
worker en laat het commando leeg; het draait dan het procestype met dezelfde naam.
Een release:-regel draait één keer per deploy, voordat web start. Mislukt die, dan mislukt de deploy en
blijft de vorige release het verkeer afhandelen. Bouwde je op Heroku met heroku.yml, gebruik dan de Dockerfile-strategie: daar
is geen Procfile, dus stel het release command van de app in (Settings, in de kaart Preview environments, waar het veld verschijnt zodra previews zijn ingeschakeld, of release_command via de API). Nodion zet geen PORT voor Dockerfile-apps; de app luistert op
de poort van het web-proces (anders de EXPOSE van de image, anders 8080).
4. Verhuis de config vars
Exporteer de config vars in shell-formaat (Heroku CLI):
bashheroku config -s --app example-app > heroku.env
Plak de regels in Environment, Add many, en importeer ze. Controleer het resultaat: waarden met aanhalingstekens of
backslashes moet je soms met de hand corrigeren, en waarden over meerdere regels (bijvoorbeeld PEM-sleutels) voer je in via de CLI of
API. Geïmporteerde variabelen zijn niet geheim; stel secrets in met nodion env set KEY=value --secret.
Verwijder daarna DATABASE_URL en REDIS_URL uit de geïmporteerde variabelen: een variabele die je zelf instelt,
overschrijft de waarde die een gekoppelde database injecteert. Gebruik Attach database voor de Postgres-database
(url als DATABASE_URL) en voor Valkey (url als REDIS_URL).
Binnen Nodion loopt de verbinding over het privénetwerk zonder TLS (sslmode=disable). Dwingt je code
SSL af voor de database, zoals Heroku vereist, zet dat dan uit voor deze URL; hetzelfde geldt voor rediss:// naar Valkey.
5. Scheduler-jobs worden cronjobs
Voeg elke job uit Heroku Scheduler toe op het tabblad Cron van de app: een cronschema met vijf velden in UTC, hetzelfde commando, een timeout van maximaal 30 minuten. Een app kan tot 8 cronjobs hebben; zolang een run nog loopt, wordt de volgende tick overgeslagen.
6. Deploy en controleer
Deploy, volg het tabblad Logs en open de app op zijn Nodion-hostnaam. Antwoordt / niet snel met een 2xx
of 3xx, stel dan onder Settings je eigen pad voor de health check in.
7. Verhuis het domein
Voeg het domein toe op het tabblad Domains. Nodion toont twee records: een TXT-record _nodion-challenge.your-domain en een
CNAME (een ALIAS op de apex) naar de standaardhostname van de app. Het TXT-record kun je vooraf toevoegen. Het certificaat wordt
uitgegeven zodra de CNAME naar Nodion wijst, dus reken na de overstap op enkele minuten zonder geldig certificaat en verlaag de
TTL vooraf.
8. Zet Heroku uit
Draaien verkeer en data op Nodion, verwijder dan de Heroku-app. Volgens Heroku kan dat niet ongedaan worden gemaakt, dus bewaar latest.dump.
bashheroku apps:destroy --app example-app Wat anders werkt
- Er is geen maintenance mode en er zijn geen pipelines met promotie tussen apps.
- In plaats van one-off-dyno's opent het tabblad Shell een terminal in een draaiend proces.
- De CLI haalt logs op, maar kan ze niet live volgen; bekijk ze live op het tabblad Logs.
- Previewomgevingen hebben geen
app.jsonnodig; elke omgeving krijgt een lege database. - Een rollback deployt een eerdere image opnieuw met de huidige omgevingsvariabelen.
Verder lezen
Nodion vergeleken met Heroku, Prijzen, Applicaties en Databases.