Buh-bye Netlify!

Prelude: This post is mostly a rant about the back end development work I've been forced to undertake over the last bank holiday weekend, and outline how I fell into a little marketing "trap" from Netlify. It isn't a rant about "why Netlify is bad" ‒ I actually still think they're a phenomenal service, and will likely continue to use them for some fully static side projects ‒ nor is it a technical guide on how to migrate away from Netlify yourself. I aim to write one of those in the near future, but I've lied before about that kind of thing, so we'll see how it goes 😅


I've been using Netlify to host this site (and quite a few others) since early 2020. Over that time, I've been a huge champion of the service. I adore their genuinely simple "drag'n'drop upload" approach to hosting basic websites, as well as their "click to deploy" buttons, both of which make onboarding people to the web so much simpler than it used to be. And once you've gotten online, being able to integrate with services like GitHub, or use webhooks to trigger builds, or do any number of other clever little things, all means that it's easy to continue making your site more and more powerful.

Has the company taken some missteps? Absolutely! But each time, they've managed to follow up with some genuinely positive business decisions. For instance, remember that ridiculous case where a developer was DDOS'ed and ended up with a $100k invoice? The bill was waived but, more importantly, a couple of months later Netlify announced their "Free plan", which included the ability to automatically take your site offline rather than rack up unexpected fees ‒ a common-sense approach to prevent that issue ever happening again.

By comparison, their most immediate direct customers have had "minor" scandals like enabling mass-stalking and suicide-pressuring campaigns (*cough* Kiwi Farms *cough*) and, well, just being Vercel (seriously, that company, and its founder, just give me the creeps)[1].

As a result, I've long been a happy "customer", singing the service's praises to anyone that asked. But then... record scratch; freeze frame:

A blank screen with a warning message centered that reads: "Site not available. This site was suspended as it reached the limits of the Free plan. It will be restored on the first day of the next month. If this is your site, please Netlify's Billing FAQ page or log in to upgrade your plan."

Yup, that's me this website ⬆️ You're probably wondering how I got here... and so was I!

The Reckoning

At some point on Friday, every single one of my sites began redirecting to a Netlify error page, boldly claiming that they had been suspended for reaching some arcane limit. Had I been running any builds? Pushing new code? Doing anything that might have suddenly spiked my usage? Nope!

Looking at the (extremely limited) logs that I can access, my best guess is that some AI crawler had discovered a not-quite-live side project I'm working on and had inadvertently fallen into an accidental tar pit formed from a hashed together, rudimentary authentication system. Basically, some kind of infinite loop of page links. Or it was just desperately trying to log in, and failing over and over again. Either way, the result was near-constant Netlify function calls ‒ averaging about three a second ‒ for two or three days, absolutely obliterating the 125,000 function calls I'm allowed per month.

To Netlify's credit, they had sent me a warning email the evening before, saying that I'd hit 70% usage. The problem is, that didn't raise any red flags for me. I use Astro's server functionality to power the search on this site, and at some point near the end of each month, some bot[2] typically swoops in and spams off a few thousand searches. It's enough to cause a small spike, but never enough to actually bring me close to the limit. I've certainly never burnt away another 30% within the next twelve hours! I hadn't noticed that a completely different site had been named as the problem child ‒ my first mistake 😔

My second mistake was basically thinking: oh no, I'm about to hit the limit... so what? They'll start 404'ing my function calls? I can live without search for a week or so, that's no big deal 🤷 (I can always query the back end directly)

Yeah, that's not how this works. Remember that "no charges, ever" Free plan I mentioned above? I moved to that immediately. Like a lot of people, I was growing concerned that the rapid growth in AI bot farms and poorly written LLM crawlers was resulting in random, unintended DDOS attacks all over the web, and I didn't want a large, unexpected bill to land on my desk. In my eagerness to protect my wallet, I hadn't taken the time to fully read through the terms. Again, credit where it's due, Netlify is pretty up front about what will happen if you exceed any of their limits when on the Free plan. It's just that the original marketing material plays a little fast and loose with that language, and that's all I'd read.

Here's what they said in that original announcement post:

If your app or site exceeds the Free plan limits for the month, it will be suspended for the remaining days in the calendar month.

Cool, fine, that makes sense. Would I prefer it to just take that specific piece of functionality offline? Sure! It feels a little redundant that exceeding your build minutes, for instance, might take a fully static site offline. Or, in my case, that a single dynamic page on my otherwise static site would bring the whole thing crashing down. But I'm no back-end developer, and I have no idea about the increased complexity that kind of granularity might bring, so sure, take the nuclear option and lock the whole thing away.

In my case, that meant a small development site would go down. Take that offline for a week or so? Yeah, no worries, no one knows about it or uses it except for me. So I sat back and watched in bemusement as I was sent a "100% usage" email, and then a "150% usage" email, and the site continued working 😅 Perhaps this is like those Photobucket emails I've been getting for years, threatening to shut down an account I haven't used since I was 12 if I don't "log back in within the next ten days"? Maybe Netlify never bothered to make the actual stick, figuring that the threat was enough?

But that isn't what happened. As I said, at some point on Friday, the site was taken offline. Then, an hour or so later, I went to check something on my main site, and found that had been taken down too! I checked a few others, and suddenly realised, they were all offline: small tools and demos; hobby microsites; family memorials; even our wedding website. Almost all of them fully static; and all "suspended". I was about to open up a support ticket when I figured I'd just double-check the language, make sure I hadn't done something stupid, and that's when I saw this:

Please note that if one site exceeds its limits, all sites on your Free account will be suspended.

Suddenly I had an issue on my hands 😬

The Scramble

Now, to be clear, I don't think that many people would notice my sites being offline for a week; this isn't the highest traffic personal site in the world ‒ not even close! But, as much as I hate to admit it, I kinda like having some decent Google rankings, and this is exactly the kind of nonsense that can tank your rating. Plus, whilst other people probably visit the site in the single digits most days, I use the site daily. I use the search. I use my notes. It would actually impact me a fair amount.

So how can I get it all back online?

First, I went to my Netlify account and tried to find out what it would cost to just pay for the extra function calls. I was happy to take the development site offline immediately[3], so all I needed was to get a small resource bump, get things online, and then skate out the remainder of the month with reduced (but still viable!) service.

Unfortunately, Netlify's account management is surprisingly terrible. I couldn't work out whether I could bump up to a Pro account for a single month and then downgrade again. I couldn't purchase more function calls, as that required changing my account type. And I couldn't change my account type because, every time I tried, Netlify refused to accept my card details. I never got a meaningful error message, and I tried with both debit and credit accounts, across multiple banks, and with varying limits. As far as I can tell, either Netlify doesn't work in Firefox, or my account being suspended had blocked me from making radical changes.

So I couldn't buy my way out of this situation... what else could I do? I was getting a little desperate (and it was now fully dark outside). Maybe I could open a new Netlify account and migrated everything? That felt like a monumental headache and probably not worth the effort, plus it was almost certainly a breach of ToS that might see me banned outright. But maybe there was the grain of a solution hidden in that idea 🤔 What if I migrated... off Netlify?

The Exit

British newspapers circa 2016 would call this a "Nexit" or "Netlixit" or something equally banal and ridiculous. I call it a freaking master stroke 😂

I've been wondering for a while (honestly, since the first "you've used up 50% of your function calls for this month" email late last year) whether I could somehow run this site on my existing Krystal hosting package. After all, I already pay for that, and barely use it; RAM spikes maybe once a month, when running a Composer upgrade or something, but otherwise its completely over provisioned[4]. Can you run a Node app via CPanel? Well yes, yes you can! But can you run Astro via CPanel?

As I said in the prelude at the start of this article, I don't want to get into the technical nitty gritty here, but suffice to say, yes, you absolutely can. If you're reading these here words, right now, at some point around mid-2025, then that's proof enough, as you will be reading them on an Astro site running on a CPanel host. (Hopefully 😅)

I'm not about to say that it was extremely easy, barely an inconvenience, because that would be a lie. It's taken me the best part of two days to get this far, I had to raise multiple support tickets with my web host, and I'm still only running about half of the functionality I want to be. But I am running the other half!

The site is back up, accessible from my regular domain name, and I'm now able to log in to my Krystal account, push a button to run npm run build, and watch it rebuild on the fly. I've got GitHub integration sorted, allowing me to push another button and pull in the latest changes directly from source control (or push them, even more directly, from my local development environment). I have a separate development environment, running on a subdomain, and building from my dev branch, allowing me to play around with new ideas exactly like a Preview branch on Netlify would.

There are still a few things I want to try to work out:

And the big one (and only current hiccough in this whole migration): can I limit the number of server resources Node is using?

I need to write up a whole piece on that last one, but suffice to say, this has been the headache of the process. By Sunday, I thought everything was up and running and migrated, and then I tried to access my CMS and was hit with a 503 error 😬 My server had maxed out its resource usage for (what I've come to know as) "NPROC processes", mainly because each Node app had been carefully spawning an extra handful every hour or so 🤦

Line graph titled "Processes" with two visible lines, a red "limit" that stays sets at 100% (y-axis) and a green "average". The green line is solidly at 100%, almost invisible beneath the red, for half of the duration shown; it then drops steeply and resumes a more expected sequences of spikes and troughs, holding a baseline around 20%.
It's never good when you hit the red line on a chart, and even worse when you stay at it, solidly, for about five hours 😬

One CRON job later, the situation appears to have stabilised, but I'm still regularly peaking at or near 70% resource usage, with no obvious way to modify that behaviour. And running npm install or build scripts seems to spike that even higher, meaning I'm currently taking all apps offline, bar the one being actively worked on, before trying to run any npm commands. It's not ideal, but I have hope that it will be fixable.

And, hey, at the very least, this is an error that I have immediate and direct control over. Unlike Netlify, where my sites are still flagged as suspended, and will remain that way for another whole week 😔 (And hey, I got a shiny new footer design out of it as well 😉)

Footnotes

Explore Other Articles

Newer

An Ad Hoc Decade

Somehow, I've been writing these little blurbs for an entire decade now. What better time to take a look back at how this site has evolved.

Conversation

Likes

Want to take part?

Comments are powered by Webmentions; if you know what that means, do your thing 👍

Article permalink