This guide deploys the blog for $0/month using:
Your live URL will look like: https://tarangeeta-blog.onrender.com
If the repo is not on GitHub yet:
cd tarangeeta-blog
git add .
git commit -m "Add Render + Neon deployment config"
git remote add origin https://github.com/YOUR_USERNAME/tarangeeta-blog.git
git push -u origin main
tarangeeta → create.Copy the connection string (URI format). It looks like:
postgresql://neondb_owner:xxxxxxxx@ep-xxxx.us-east-2.aws.neon.tech/neondb?sslmode=require
DATABASE_URL.Note: Neon URLs already use
postgresql://. The app also auto-converts legacypostgres://URLs.
tarangeeta-blog repository.render.yaml and creates the web service.Configure:
| Setting | Value |
|---|---|
| Name | tarangeeta-blog |
| Region | closest to you |
| Branch | main |
| Runtime | Python 3 |
| Build Command | pip install -r requirements.txt |
| Start Command | gunicorn main:app --bind 0.0.0.0:$PORT --workers 1 |
| Instance Type | Free |
In Render → your service → Environment → add:
| Variable | Value | Required |
|---|---|---|
DATABASE_URL |
Neon connection string from Step 2 | Yes |
SECRET_KEY |
Random string — run python -c "import secrets; print(secrets.token_hex(32))" |
Yes |
ADMIN_EMAIL |
Your Gmail (admin posts + messages) | Yes |
GOOGLE_CLIENT_ID |
From Google Console (Step 5) | For Google login |
GOOGLE_CLIENT_SECRET |
From Google Console (Step 5) | For Google login |
CLOUDINARY_CLOUD_NAME |
Cloudinary dashboard | For media upload |
CLOUDINARY_API_KEY |
Cloudinary dashboard | For media upload |
CLOUDINARY_API_SECRET |
Cloudinary dashboard | For media upload |
MAIL_ADDRESS |
Your Gmail address | For email |
MAIL_APP_PASSWORD |
Gmail App Password (Step 6) | For email |
Render auto-sets RENDER=true and PORT — do not add those manually.
Click Save Changes → Render redeploys automatically.
Replace YOUR_APP with your Render service name (e.g. tarangeeta-blog).
| Field | URL |
|---|---|
| Authorized JavaScript origins | https://YOUR_APP.onrender.com |
| Authorized redirect URIs | https://YOUR_APP.onrender.com/login/google/authorized |
This redirect URI is required by Flask-Dance. It is not
/google-callback— that is an internal route after OAuth completes.
GOOGLE_CLIENT_IDGOOGLE_CLIENT_SECRETSave and redeploy on Render.
MAIL_ADDRESS = your GmailMAIL_APP_PASSWORD = the 16-character app password (no spaces)CLOUDINARY_CLOUD_NAMECLOUDINARY_API_KEYCLOUDINARY_API_SECRETPosts can also use direct media URLs without Cloudinary.
https://YOUR_APP.onrender.com.ADMIN_EMAIL address (or use Google sign-in).Admin access is gated by ADMIN_EMAIL. The account must use that exact email.
Option A — Google (easiest)
Sign in with Google using the ADMIN_EMAIL account. OAuth users are auto-verified.
Option B — Email + password
/register with ADMIN_EMAIL./login.Browser
│
▼
Render (Gunicorn + Flask) ──HTTPS──► Neon PostgreSQL
│
├──► Cloudinary (media)
├──► Google OAuth
└──► Gmail SMTP (contact / verify)
| Service | Limit |
|---|---|
| Render | 750 hrs/month, sleeps after 15 min idle, ~60s cold start |
| Neon | 0.5 GB storage, compute scales to zero when idle |
| Cloudinary | 25 credits/month |
For a personal blog, this is usually enough.
requirements.txt installs cleanly.runtime.txt (3.12.7).DATABASE_URL includes ?sslmode=require.postgresql:// (app fixes postgres:// automatically).https://YOUR_APP.onrender.com/login/google/authorizedhttps://YOUR_APP.onrender.com (no path).ADMIN_EMAIL on Render.ADMIN_EMAIL env var, not a hardcoded address.onrender.com, not localhost.OAUTHLIB_INSECURE_TRANSPORT — it is only set in development.Push to main on GitHub — Render auto-deploys if connected.
git add .
git commit -m "Your change"
git push
Render free tier uses *.onrender.com. Custom domains require a paid Render plan. You would also add the domain to Google OAuth authorized origins.
| Service | What to set |
|---|---|
| Google OAuth origin | https://YOUR_APP.onrender.com |
| Google OAuth redirect | https://YOUR_APP.onrender.com/login/google/authorized |
| Live site | https://YOUR_APP.onrender.com |
| Email verify links | Auto — uses request.host_url over HTTPS |
| File | Purpose |
|---|---|
render.yaml |
Render Blueprint config |
Procfile |
Gunicorn start command with $PORT |
runtime.txt |
Python 3.12.7 |
.env.example |
Local env template |