The cost of managed deployment and the Coolify surge
Developers are migrating from Heroku to self-hosted solutions like Coolify to avoid high costs, such as $190 monthly bills for medium stacks. Coolify v4 offers a Git push to deploy experience with Nixpacks and Docker Compose support to replace managed platform workflows.
The $190 monthly bill for a medium Heroku stack drives developers toward self-hosting. I see a massive discrepancy when a typical app with a web dyno, a worker, Postgres, and Redis costs $190 on Heroku but only $11 on a Hetzner server. Heroku transitioned to a "sustaining engineering model" in February 2026, which limits the platform to stability and reliability updates. While October 2026 brought Heroku Postgres Advanced with dedicated instance pools and decoupled storage and compute scaling, the cost for growing apps remains high. Developers escaping the Vercel Tax specifically target bandwidth costs because Vercel charges roughly $0.15/GB while DigitalOcean charges less than $0.01/GB. A small app with a web dyno and a database costs $26 on Heroku, but the $5 Eco tier sleeps after 30 minutes of inactivity. Heroku also limits bandwidth to 2TB per app per month. For those needing specific architectures, Fir Private Spaces now default to x86_64 to improve binary compatibility. The Eco tier provides 1,000 shared hours per month, while the Basic tier costs $7 and stays always on. For database needs, the Essential-0 plan costs $5 for 1 GB of storage, while the Standard-0 tier costs $50 and provides 4 GB of RAM and 64 GB of storage.
Automation and the Corelix Addon
Coolify v4 provides a Git push to deploy experience that mirrors managed platforms. It uses Traefik to manage Let’s Encrypt SSL certificates and generates unique URLs for every pull request. The platform supports Nixpacks, Dockerfile, Docker Compose, and Static files. Users who require enterprise-grade security use the Corelix Platform addon to enable granular permissions and encrypted S3 backups. This addon utilizes rclone’s crypt backend to provide per-storage encryption for all database backups. The addon also expands the database image list by 50 entries, which allows the system to recognize modern engines like Neo4j or Milvus. If you use the coolify.database label in your Compose file, Coolify correctly classifies your service and enables scheduled backups.
For users choosing the Git repository path, Coolify parses the Compose definition to manage service images, builds, commands, environment references, volumes, and networking. You must specify the BASE_DIRECTORY and DOCKER_COMPOSE_LOCATION to help the platform locate the file. This path enables branch-based deployments, webhooks, and preview environments. Coolify also manages magic variables like SERVICEURL<ID> to generate URLs based on your wildcard domain, and it uses SERVICEFQDN<ID> for the domain name without the scheme. It can even generate 64-character passwords using SERVICE_PASSWORD64<ID> for specific identifiers. If you need a service to expose multiple ports, the coolify.proxyPorts label allows you to define a mapping, such as 3000:web. When you use a variable like SERVICE_URL_API_3000, Coolify generates a URL for the service named api and routes traffic to port 3000. If you select the Raw deployment option, Coolify applies the definition as-is without adding management labels or proxy configurations.
| Heroku Plan | Monthly Cost | RAM Capacity |
|---|---|---|
| Eco | $5 | 0.5 GB |
| Basic | $7 | 0.5 GB |
| Standard-1X | $25 | 0.5 GB |
| Standard-2X | $50 | 1 GB |
| Performance-M | $250 | 2.5 GB |
The Friction of Migration
Migrating from Heroku breaks several fundamental application assumptions. Your Procfile no longer performs any function because external platforms do not recognize its syntax. You must manually convert every instruction from your Procfile into a container command or a build strategy. The migration also exposes bugs in code that assumes a persistent filesystem. If your application writes user uploads or SQLite data to the local disk, these files vanish after a restart because Heroku dynos use an ephemeral filesystem. You should move such data to object storage before you attempt a migration. You know the drill: push code, wait for the build, check the logs, and pray the health check passes.
The transition from buildpack magic to a Dockerfile requires significant effort. You must explicitly define the runtime version and system packages that Heroku previously inferred. You also have to ensure your process binds to 0.0.0.0 rather than 127.0.0.1 to allow the proxy to reach the container. Additionally, you must verify your port configuration matches your container settings. The migration process requires you to manually re-implement every instruction found in your Procfile, including the critical release commands that previously handled your database migrations before new code went live. You must also account for the release: line, which historically ran migrations before the new code became active. You must also dump your config vars before you migrate to distinguish between configuration and secret storage. Your Procfile lines, like the web or worker processes, must become individual services in your new platform. Does the reduced cost of a self-hosted server outweigh the time you spend managing the underlying Linux OS? Railway offers a middle ground with usage-based billing, but its costs climb as your production traffic grows. Pick Coolify if you want total control over your infrastructure.