Step 1: Decide honestly whether to move
Good reasons:
- The bill is rising faster than your business
- You need something the platform doesn't allow (custom software, long-running processes, specific regions, private networking)
- Data location or compliance requirements
- You want to reduce dependence on one vendor's pricing and policies
Weak reasons: a general wish to "own everything," when nobody on the team is able or willing to operate servers. PaaS exists because operations is work. If you move, someone must do that work, whether it's you, a provider, or a managed service.
Step 2: List what the platform does for you
The platform gives you many things implicitly. Write them down, because you'll have to provide each one:
- Build and deploy pipeline: how code goes from repository to running application
- Runtime and process management: restarts, scaling, health checks
- HTTPS certificates and renewal
- Domains and routing
- Environment variables and secrets
- Databases and add-ons (Postgres, Redis, queues, search)
- Scheduled jobs
- Logs and metrics
- Backups
- Preview environments for pull requests
- Edge features: CDN, caching, serverless functions, image optimisation, redirects and headers
- Scaling during traffic peaks
- Zero-downtime deploys and rollbacks
For each item, decide how you'll replace it, or whether you can do without.
Step 3: Spot the lock-in points
Where applications depend on the platform:
Heroku:
- Buildpacks and the Procfile (portable in spirit, but your server needs equivalents)
- Add-ons with proprietary configuration
- Ephemeral filesystem assumptions
- Scheduler and release-phase commands
- Review apps and pipelines
Vercel / Netlify:
- Serverless and edge functions with platform-specific APIs
- Framework features tied to the platform (image optimisation, incremental rendering, middleware at the edge)
- Form handling, identity and other built-in services
- Redirect and header configuration formats
- Build plugins
The more platform-specific features you use, the more rework to expect. Static sites move easily. Applications built around edge functions and platform services need a design decision: rewrite those parts, run an open-source equivalent, or keep that component where it is.
Step 4: Choose the target
- A virtual server (VPS) at a European or other provider you pick: the simplest, cheapest, and most transparent. You run the application with a process manager or containers, plus a reverse proxy.
- Containers with a lightweight orchestrator, or a self-hosted PaaS (open source tools exist that reproduce the push-to-deploy experience on your own server): a way to keep convenience while owning the infrastructure.
- Managed Kubernetes: powerful, but heavy for a small team. Choose it for the needs it addresses, not for fashion.
- Managed databases at a provider under your account, even if the application runs on your own server. This removes the hardest operations job.
Match the target to your team's skills. A single well-maintained server serves many businesses better than an elaborate cluster nobody understands.
Step 5: Rebuild the pieces
Deployment. Define how code reaches production: a CI pipeline (in your own repository host) that builds an image or an archive, copies it to the server, runs migrations and restarts the service. Include a rollback step: the previous version should be one command away.
Configuration and secrets. Export environment variables, and store them in a proper secrets setup on the server or in a vault, not in a file in the repository. Rotate secrets that were visible in the old platform's dashboard or logs if access was shared.
HTTPS. Use automatic certificate issuance and renewal, and monitor expiry.
Reverse proxy. Configure redirects, headers, compression, caching and rate limits that the platform used to apply for you.
Database. Plan the move carefully (see below), and set up backups immediately (see backups that actually restore).
Scheduled jobs. Recreate them with cron or a job scheduler, with alerts if they fail.
Logs and monitoring. Centralise logs, set up uptime checks and alerts on errors, disk, memory and certificate expiry. On a platform you didn't have to think about these. Now you do.
Security. Harden the server: restrict SSH to keys, a firewall, automatic security updates, no unnecessary open ports, minimal user accounts.
Need a PaaS exit plan?
We map what your platform does today, rebuild deploy and secrets on infrastructure under your accounts, and keep a rollback path.
Step 6: Move the database with care
The database is the part you can't get wrong.
- Build the new database, same engine and compatible version.
- Test a dump and restore, and time it.
- Rehearse the cutover with a copy, verifying counts and application behaviour.
- At cutover: put the application in maintenance mode, take the final dump, restore it, switch the connection, verify, and reopen. For large databases that can't tolerate downtime, use replication to keep the new one in sync before switching.
- Keep the old database untouched until you're sure.
If your data is personal data, treat dumps and the test copies with the care described in GDPR and test environments.
Step 7: Switch traffic
Follow the DNS approach from switching hosting without downtime and migrating DNS without breaking email: lower TTLs ahead, test the new environment using a local hosts-file override, then change DNS and watch. Keep the old deployment running until traffic has fully moved, and keep a way back.
Check carefully for:
- Webhooks and callbacks from third parties pointing at old URLs
- OAuth redirect URLs registered with external providers
- Allowlists on other services that restrict by IP (your new server has a different address)
- Email-sending configuration, if the platform provided it
- Cookies and sessions, which may log users out at cutover (warn them if it matters)
Step 8: After the move
- Monitor errors, performance and costs for the first weeks
- Test a backup restore and a rollback
- Write the runbook: how to deploy, roll back, rotate secrets, restore, add a server
- Make sure at least two people can operate it
- Keep the old platform for a safe period, then export what you need and close it
- Compare the real total cost, including your time, not only the invoice
The honest cost comparison
PaaS bills look high, but you're paying for operations. Self-hosting bills look low, but you're paying with time. Count:
- Server and database costs
- Backup storage and monitoring
- Time to set up (once) and maintain (monthly)
- Cost of incidents and on-call
- Cost of being down while someone learns how to fix it
For small, simple projects, staying on the platform is often cheaper overall. For larger or steady-traffic applications, or ones that need special capabilities, moving usually pays off. A managed support arrangement can close the gap if you don't want to operate things yourself.
Common pitfalls
- Forgetting the platform's implicit services (certificates, restarts, logs)
- Assuming a local filesystem is persistent when the code expected the opposite, or the reverse
- No monitoring, so outages are discovered by customers
- A single server with no tested backups
- Webhooks and OAuth redirects still pointing at the old host
- IP allowlists not updated
- Secrets copied into the repository during the move
- Only one person understands the new setup
- Cancelling the old platform before a full billing cycle of stable operation
Checklist
- Reason to move confirmed, with a real cost comparison
- Platform services and lock-in points listed
- Target chosen to match team skills, accounts in our name
- Deployment pipeline and rollback working
- Secrets stored properly, shared ones rotated
- HTTPS, reverse proxy, firewall and updates configured
- Logs, monitoring and alerts live
- Database move rehearsed, backups tested
- External callbacks, redirects and allowlists updated
- Runbook written, two people able to operate
- Old platform kept briefly, then closed
From platform magic to something you can run
If you're outgrowing Heroku, Vercel or Netlify and want the move under your accounts, write us.
Étape 1: Décider honnêtement s'il faut partir
Bonnes raisons:
- La facture monte plus vite que l'activité
- Vous avez besoin de quelque chose que la plateforme n'autorise pas (logiciel sur mesure, processus longs, régions précises, réseau privé)
- Exigences de localisation des données ou de conformité
- Vous voulez réduire la dépendance aux tarifs et aux règles d'un seul éditeur
Mauvaises raisons: un désir vague de « tout posséder », alors que personne dans l'équipe ne peut ou ne veut exploiter des serveurs. Le PaaS existe parce que l'exploitation, c'est du travail. Si vous partez, quelqu'un doit le faire: vous, un prestataire, ou un service managé.
Étape 2: Lister ce que la plateforme fait pour vous
La plateforme vous apporte beaucoup de choses implicitement. Notez-les, car vous devrez fournir chaque élément:
- Pipeline de build et déploiement: comment le code passe du dépôt à l'application en ligne
- Runtime et gestion des processus: redémarrages, montée en charge, health checks
- Certificats HTTPS et renouvellement
- Domaines et routage
- Variables d'environnement et secrets
- Bases de données et add-ons (Postgres, Redis, files, recherche)
- Tâches planifiées
- Logs et métriques
- Sauvegardes
- Environnements de preview pour les pull requests
- Fonctions edge: CDN, cache, fonctions serverless, optimisation d'images, redirections et en-têtes
- Montée en charge lors des pics de trafic
- Déploiements sans coupure et rollbacks
Pour chaque point, décidez comment vous le remplacerez, ou si vous pouvez vous en passer.
Étape 3: Repérer les points de lock-in
Là où l'application dépend de la plateforme:
Heroku:
- Buildpacks et Procfile (portables en principe, mais votre serveur a besoin d'équivalents)
- Add-ons avec configuration propriétaire
- Hypothèses de disque éphémère
- Scheduler et commandes de phase release
- Review apps et pipelines
Vercel / Netlify:
- Fonctions serverless et edge avec APIs propres à la plateforme
- Fonctions du framework liées à la plateforme (optimisation d'images, rendu incrémental, middleware au edge)
- Formulaires, identité et autres services intégrés
- Formats de configuration des redirections et en-têtes
- Plugins de build
Plus vous utilisez de fonctions spécifiques à la plateforme, plus il faudra retravailler. Les sites statiques partent facilement. Les applications construites autour des fonctions edge et des services intégrés demandent un choix: réécrire, faire tourner un équivalent open source, ou garder ce composant où il est.
Étape 4: Choisir la cible
- Un serveur virtuel (VPS) chez un fournisseur européen ou autre que vous choisissez: le plus simple, le moins cher et le plus transparent. Vous faites tourner l'application avec un gestionnaire de processus ou des conteneurs, plus un reverse proxy.
- Conteneurs avec un orchestrateur léger, ou un PaaS auto-hébergé (des outils open source reproduisent le push-to-deploy sur votre serveur): garder une part de confort tout en possédant l'infrastructure.
- Kubernetes managé: puissant, mais lourd pour une petite équipe. Choisissez-le pour les besoins qu'il couvre, pas par mode.
- Bases managées chez un fournisseur sous votre compte, même si l'application tourne sur votre serveur. Cela retire le plus dur côté exploitation.
Adaptez la cible aux compétences de l'équipe. Un seul serveur bien tenu sert souvent mieux qu'un cluster élaboré que personne ne comprend.
Étape 5: Reconstruire les briques
Déploiement. Définissez comment le code arrive en production: un pipeline CI (sur votre hébergeur de dépôt) qui build une image ou une archive, la copie sur le serveur, lance les migrations et redémarre le service. Prévoyez un rollback: la version précédente doit être à une commande.
Configuration et secrets. Exportez les variables d'environnement et stockez-les dans un vrai dispositif de secrets sur le serveur ou dans un coffre, pas dans un fichier du dépôt. Faites tourner les secrets visibles dans l'ancien tableau de bord ou les logs si l'accès était partagé.
HTTPS. Utilisez l'émission et le renouvellement automatiques des certificats, et surveillez l'expiration.
Reverse proxy. Configurez redirections, en-têtes, compression, cache et limites de débit que la plateforme appliquait pour vous.
Base de données. Planifiez la migration avec soin (voir ci-dessous), et mettez les sauvegardes en place tout de suite (voir des sauvegardes qui restaurent vraiment).
Tâches planifiées. Recréez-les avec cron ou un planificateur, avec alertes en cas d'échec.
Logs et monitoring. Centralisez les logs, mettez des checks de disponibilité et des alertes sur erreurs, disque, mémoire et expiration des certificats. Sur une plateforme, vous n'y pensiez pas. Maintenant, oui.
Sécurité. Durcissez le serveur: SSH par clés, pare-feu, mises à jour de sécurité automatiques, pas de ports ouverts inutiles, comptes utilisateurs minimaux.
Besoin d'un plan de sortie PaaS ?
On cartographie ce que votre plateforme fait aujourd'hui, on reconstruit déploiement et secrets sur une infrastructure à votre nom, avec un chemin de retour.
Étape 6: Déplacer la base avec soin
La base de données est la partie qu'il ne faut pas rater.
- Construire la nouvelle base, même moteur et version compatible.
- Tester un dump et une restauration, et chronométrer.
- Répéter la bascule sur une copie, en vérifiant les volumes et le comportement de l'application.
- À la bascule: mettre l'application en maintenance, prendre le dump final, restaurer, basculer la connexion, vérifier, rouvrir. Pour les grosses bases sans tolérance à l'arrêt, utiliser la réplication pour synchroniser la nouvelle avant de basculer.
- Laisser l'ancienne base intacte tant que vous n'êtes pas sûrs.
Si vos données sont des données personnelles, traitez dumps et copies de test avec le soin décrit dans RGPD et environnements de test.
Étape 7: Basculer le trafic
Suivez l'approche DNS de changer d'hébergeur sans interruption et migrer le DNS sans casser l'email: baisser les TTL à l'avance, tester le nouvel environnement via le fichier hosts local, puis modifier le DNS et surveiller. Gardez l'ancien déploiement tant que le trafic n'a pas entièrement basculé, et un moyen de revenir en arrière.
Vérifiez avec attention:
- Webhooks et callbacks de tiers pointant vers d'anciennes URLs
- URLs de redirection OAuth enregistrées chez des fournisseurs externes
- Listes blanches sur d'autres services restreintes par IP (le nouveau serveur a une autre adresse)
- Configuration d'envoi d'email, si la plateforme la fournissait
- Cookies et sessions, qui peuvent déconnecter les utilisateurs à la bascule (prévenez-les si c'est important)
Étape 8: Après le déménagement
- Surveiller erreurs, performance et coûts les premières semaines
- Tester une restauration de sauvegarde et un rollback
- Rédiger le runbook: déployer, rollback, faire tourner les secrets, restaurer, ajouter un serveur
- S'assurer qu'au moins deux personnes peuvent exploiter le système
- Garder l'ancienne plateforme un temps de sécurité, puis exporter ce qu'il faut et la fermer
- Comparer le coût total réel, temps inclus, pas seulement la facture
Comparaison honnête des coûts
Les factures PaaS paraissent élevées, mais vous payez l'exploitation. L'auto-hébergement paraît bon marché, mais vous payez en temps. Comptez:
- Coût serveur et base
- Stockage de sauvegardes et monitoring
- Temps de mise en place (une fois) et de maintenance (mensuel)
- Coût des incidents et de l'astreinte
- Coût d'une indisponibilité pendant que quelqu'un apprend à réparer
Pour de petits projets simples, rester sur la plateforme est souvent moins cher au total. Pour des applications plus grosses, à trafic stable, ou qui ont besoin de capacités particulières, partir paie en général. Un accompagnement managé peut combler l'écart si vous ne voulez pas tout exploiter vous-même.
Pièges fréquents
- Oublier les services implicites de la plateforme (certificats, redémarrages, logs)
- Supposer un disque local persistant alors que le code pensait l'inverse, ou l'inverse
- Pas de monitoring: les clients découvrent la panne
- Un seul serveur sans sauvegardes testées
- Webhooks et redirections OAuth encore vers l'ancien hôte
- Listes blanches IP non mises à jour
- Secrets copiés dans le dépôt pendant le déménagement
- Une seule personne comprend le nouveau dispositif
- Résilier l'ancienne plateforme avant un cycle de facturation stable
Checklist
- Raison de partir confirmée, avec une vraie comparaison de coûts
- Services plateforme et points de lock-in listés
- Cible adaptée aux compétences, comptes à notre nom
- Pipeline de déploiement et rollback opérationnels
- Secrets bien stockés, secrets partagés tournés
- HTTPS, reverse proxy, pare-feu et mises à jour configurés
- Logs, monitoring et alertes en place
- Migration base répétée, sauvegardes testées
- Callbacks externes, redirections et listes blanches à jour
- Runbook rédigé, deux personnes capables d'exploiter
- Ancienne plateforme gardée un moment, puis fermée
De la magie plateforme à quelque chose que vous pouvez faire tourner
Si Heroku, Vercel ou Netlify vous limite et que vous voulez le déménagement sous vos comptes, écrivez-nous.