01Services02Process03Projects04About05FAQ06Blog07Hire Me

25+ products shipped · $3.8M+ raised by clients

Back to Blog
InfrastructureSeries overviewSeptember 28, 20266 min read

A server that never sleeps, for $0 a month

An API with jobs that must run every minute, forever — hosted for $0 a month from India, with no open ports, an alarm that notices silence, and backups I've actually restored. The whole setup on one page.

Subhankar Denria

Subhankar Denria

Software Architect · Product Engineer

A server that never sleeps, for $0 a month
~6 min

I'm building Lampsill, a safety app for people who live alone. The phone notices when its owner has gone unusually quiet, and if they don't respond, it starts contacting the people they chose — gently at first, then more firmly. That "move the alert along" step happens on a server, and it has to happen every minute, forever. If it stops, nobody is checked on, and nothing looks wrong — a stopped server looks exactly like a quiet night.

This series is how I host that server for $0 a month, set up entirely from India, and how I made sure I'd know if it ever stopped. It's written for someone who has never run a server. If you have, the "Why" lines and the traps are still worth a skim — several of them cost real money when missed.

If you're a founder deciding whether a $0 server can be trusted with something that matters, the five ideas below and the traps in Part 9 are the ten-minute version.

Time
About three hours, over a day or two
Cost
$0 a month
What's at stake
A stopped server looks exactly like a quiet night

What we end up with

What we end up with

Phone app

calls the API

You, anywhere

the browser SSH button

▼
HTTPSAn ordinary, encrypted request
▼
Signed-in onlyYour Google account, or nothing

Cloudflare

api.example.com · HTTPS · rate limit

Google's SSH relay

port 22, and only from here

▲
Tunnel · dialled outThe server opened this line; requests come back down it
▼
IAPGoogle's relay — the one door, port 22

Google Cloud · one e2-micro · Iowa

$0 / month

nginx

the web server · 127.0.0.1 only

Laravel API

the app itself · runs as its own user

Postgres

the database · localhost only

Every minute

two jobs run, then say "I'm alive"

Every night · 02:30 UTC

encrypted database backup

▲
“I'm alive”Sent after every successful run
▲
Locked backupEncrypted before it leaves the server

healthchecks.io

emails me if the pings stop

Cloudflare R2

30 nights of encrypted backups

Nothing on the internet can open a connection in. The server only reaches out.
Arrows show which side opens each connection. Visitors reach the API only through the tunnel the server dialled out; you reach the shell only through Google's relay.
The monthly bill

Lampsill API · hosting

per month · as of September 2026

  • Google Cloud e2-micro$6.11/mo$0
    An always-on Linux computer · 2 shared CPUs · 1 GB memory · 30 GB diskFree-tier credit
  • IPv6 address$3.65/mo$0
    The server's internet address. No IPv4 at allAvoided
  • Laravel · PHP 8.5 · Postgres 18$0
    The API and its database, on the same machineOpen source
  • Cloudflare Tunnel$0
    A public HTTPS address without opening a portFree
  • Cloudflare rate limiting$0
    Turns away anyone flooding the APIFree · 1 rule
  • healthchecks.io$0
    Emails me if the every-minute jobs stopHobbyist plan
  • Cloudflare R2$0
    An encrypted copy of the database, every nightFree · to 10 GB
Total$0.00

Card on file · budget alert emails me at ₹50 (under $1)
the day anything starts costing money

The ideas that make it work

If you remember nothing else from this series, remember these five:

  1. 1"Free" has to mean "never sleeps". Most free hosting pauses your app when nobody is visiting. For a job that runs every minute, that's fatal — and silent. (Post 1)
  2. 2The free tier is free only inside its lines. One machine type, three US regions, one disk type, no public IPv4, and a paid (not trial) billing account. Step outside any line and it bills — quietly, for 90 days, while the sign-up credit hides it. (Posts 2–4)
  3. 3No open doors. The server has no web ports open to the internet at all. It dials out to Cloudflare, and Cloudflare sends visitors back down that line. You log in through Google's own relay. (Posts 3 and 6)
  4. 4Something outside must notice silence. A monitor on the same server dies with it. An outside service that expects a ping every minute is the only thing that can tell you the server is gone. (Post 7)
  5. 5A backup you haven't restored is a belief. Backups are encrypted before they leave the server, stored with a different company, and I've restored one to prove it works. (Post 8)

What you need before you start

  • A Google account you'll keep, with 2-step verification.
  • A credit card that supports recurring payments (Indian cards: one that allows an RBI e-mandate — explained in post 2). It won't be charged, but Google requires it, and it's what keeps the free server running past day 90.
  • A domain on Cloudflare (the free plan is fine). In the examples I write api.example.com — put your own domain where it appears.
  • A laptop with PHP and Composer, to build the app before uploading it (post 5 explains why the server can't).
  • About three hours, spread over a day or two. Most of it is reading and waiting, not typing.

You do not need to know Linux well. Every command is given in full and explained.

How the series is laid out

Each post has the same shape:

  • Purpose — what the step achieves, in one or two sentences.
  • The steps, with the exact setting for every field, and a Why for each one. The why is what lets you adapt when the screen looks different.
  • What went wrong — the real mistakes I made or nearly made, so you don't.
  • What you should see before moving on.

Let's connect

Choose your preferred way

Available for new projects