[{"data":1,"prerenderedAt":895},["ShallowReactive",2],{"site":3,"blog-listing":16},{"id":4,"calendlyUrl":5,"copyright":6,"email":7,"extension":8,"meta":9,"socials":10,"stem":14,"__hash__":15},"site\u002Fdata\u002Fsite.yml","https:\u002F\u002Fcalendly.com\u002Fherdeybayor\u002Fdiscovery-call","All rights reserved, ©2026","hello@0xsherif.dev","yml",{},{"linkedin":11,"twitter":12,"github":13},"https:\u002F\u002Flinkedin.com\u002Fin\u002F0xsherifdev\u002F","https:\u002F\u002Fx.com\u002F0xsherifdev","https:\u002F\u002Fgithub.com\u002F0xsherifdev","data\u002Fsite","-S03CjOfpfnvoKqIM6EvytqEogbFk4013kamLvbviCQ",[17,337],{"id":18,"title":19,"body":20,"canonical":324,"category":325,"cover":324,"coverAlt":324,"date":326,"description":327,"extension":328,"meta":329,"navigation":162,"path":330,"published":162,"readingTime":324,"seo":331,"stem":332,"tags":333,"updated":324,"__hash__":336},"blog\u002Fblog\u002Fhello-world.md","Hello World",{"type":21,"value":22,"toc":317},"minimark",[23,28,32,35,39,42,45,49,52,71,74,78,81,280,284,310,313],[24,25,27],"h2",{"id":26},"so-a-blog","So, a blog.",[29,30,31],"p",{},"I've been building software for over 10 years now. Fintech platforms, enterprise systems, mobile apps, no-code sites. I've shipped a lot of stuff. But I never really wrote about any of it.",[29,33,34],{},"That changes today.",[24,36,38],{"id":37},"why-now","Why now?",[29,40,41],{},"Honestly? I kept running into the same problems, googling the same things, explaining the same concepts to junior devs on my team. At some point it just made sense to write things down properly. If I'm going to explain how to set up a CI\u002FCD pipeline for the third time this year, might as well put it somewhere useful.",[29,43,44],{},"Also, I recently rebuilt this entire portfolio from a Framer site into a Nuxt 4 app with a headless CMS. That process alone gave me enough material for like five posts.",[24,46,48],{"id":47},"what-ill-write-about","What I'll write about",[29,50,51],{},"Mostly things I actually deal with day to day:",[53,54,55,59,62,65,68],"ul",{},[56,57,58],"li",{},"Building fullstack apps with TypeScript, React, Next.js, Vue, Node.js",[56,60,61],{},"Cloud stuff. AWS, Docker, Kubernetes, CI\u002FCD pipelines",[56,63,64],{},"Mobile dev with React Native and Flutter",[56,66,67],{},"No-code tools like Framer, Webflow, n8n (yes, I use these too)",[56,69,70],{},"Lessons from working across fintech, edtech, and enterprise",[29,72,73],{},"No fluff. No \"10 reasons why React is amazing\" listicles. Just real problems, real solutions, and the occasional opinion.",[24,75,77],{"id":76},"a-quick-hello-in-code","A quick hello in code",[29,79,80],{},"Since this is a dev blog, here's how I'd introduce myself in TypeScript:",[82,83,88],"pre",{"className":84,"code":85,"language":86,"meta":87,"style":87},"language-ts shiki shiki-themes github-dark","interface Developer {\n  name: string;\n  skills: string[];\n  yearsOfExperience: number;\n}\n\nconst sheriff: Developer = {\n  name: \"Sherifdeen Adebayo\",\n  skills: [\"TypeScript\", \"React\", \"Node.js\", \"AWS\", \"Docker\"],\n  yearsOfExperience: 10,\n};\n\nconsole.log(`Hello from ${sheriff.name}!`);\n","ts","",[89,90,91,108,125,138,151,157,164,182,195,228,239,245,250],"code",{"__ignoreMap":87},[92,93,96,100,104],"span",{"class":94,"line":95},"line",1,[92,97,99],{"class":98},"snl16","interface",[92,101,103],{"class":102},"svObZ"," Developer",[92,105,107],{"class":106},"s95oV"," {\n",[92,109,111,115,118,122],{"class":94,"line":110},2,[92,112,114],{"class":113},"s9osk","  name",[92,116,117],{"class":98},":",[92,119,121],{"class":120},"sDLfK"," string",[92,123,124],{"class":106},";\n",[92,126,128,131,133,135],{"class":94,"line":127},3,[92,129,130],{"class":113},"  skills",[92,132,117],{"class":98},[92,134,121],{"class":120},[92,136,137],{"class":106},"[];\n",[92,139,141,144,146,149],{"class":94,"line":140},4,[92,142,143],{"class":113},"  yearsOfExperience",[92,145,117],{"class":98},[92,147,148],{"class":120}," number",[92,150,124],{"class":106},[92,152,154],{"class":94,"line":153},5,[92,155,156],{"class":106},"}\n",[92,158,160],{"class":94,"line":159},6,[92,161,163],{"emptyLinePlaceholder":162},true,"\n",[92,165,167,170,173,175,177,180],{"class":94,"line":166},7,[92,168,169],{"class":98},"const",[92,171,172],{"class":120}," sheriff",[92,174,117],{"class":98},[92,176,103],{"class":102},[92,178,179],{"class":98}," =",[92,181,107],{"class":106},[92,183,185,188,192],{"class":94,"line":184},8,[92,186,187],{"class":106},"  name: ",[92,189,191],{"class":190},"sU2Wk","\"Sherifdeen Adebayo\"",[92,193,194],{"class":106},",\n",[92,196,198,201,204,207,210,212,215,217,220,222,225],{"class":94,"line":197},9,[92,199,200],{"class":106},"  skills: [",[92,202,203],{"class":190},"\"TypeScript\"",[92,205,206],{"class":106},", ",[92,208,209],{"class":190},"\"React\"",[92,211,206],{"class":106},[92,213,214],{"class":190},"\"Node.js\"",[92,216,206],{"class":106},[92,218,219],{"class":190},"\"AWS\"",[92,221,206],{"class":106},[92,223,224],{"class":190},"\"Docker\"",[92,226,227],{"class":106},"],\n",[92,229,231,234,237],{"class":94,"line":230},10,[92,232,233],{"class":106},"  yearsOfExperience: ",[92,235,236],{"class":120},"10",[92,238,194],{"class":106},[92,240,242],{"class":94,"line":241},11,[92,243,244],{"class":106},"};\n",[92,246,248],{"class":94,"line":247},12,[92,249,163],{"emptyLinePlaceholder":162},[92,251,253,256,259,262,265,268,271,274,277],{"class":94,"line":252},13,[92,254,255],{"class":106},"console.",[92,257,258],{"class":102},"log",[92,260,261],{"class":106},"(",[92,263,264],{"class":190},"`Hello from ${",[92,266,267],{"class":106},"sheriff",[92,269,270],{"class":190},".",[92,272,273],{"class":106},"name",[92,275,276],{"class":190},"}!`",[92,278,279],{"class":106},");\n",[24,281,283],{"id":282},"lets-talk","Let's talk",[29,285,286,287,293,294,206,299,304,305,270],{},"If you want to work together or just nerd out about tech, ",[288,289,292],"a",{"href":5,"rel":290},[291],"nofollow","book a call"," or find me on ",[288,295,298],{"href":296,"rel":297},"https:\u002F\u002Flinkedin.com\u002Fin\u002Fherdeybayor\u002F",[291],"LinkedIn",[288,300,303],{"href":301,"rel":302},"https:\u002F\u002Fx.com\u002Fherdeybayor",[291],"X",", or ",[288,306,309],{"href":307,"rel":308},"https:\u002F\u002Fgithub.com\u002Fherdeybayor",[291],"GitHub",[29,311,312],{},"More posts coming soon. For real this time.",[314,315,316],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":87,"searchDepth":127,"depth":127,"links":318},[319,320,321,322,323],{"id":26,"depth":110,"text":27},{"id":37,"depth":110,"text":38},{"id":47,"depth":110,"text":48},{"id":76,"depth":110,"text":77},{"id":282,"depth":110,"text":283},null,"General","2026-05-14","First post. Why I'm starting a blog after 10 years of writing code.","md",{},"\u002Fblog\u002Fhello-world",{"title":19,"description":327},"blog\u002Fhello-world",[334,335],"announcement","blog","zlQOasnjm2r827TL6zXl2Qnt88zRN9DjZ3WT_b3v8a0",{"id":338,"title":339,"body":340,"canonical":324,"category":324,"cover":881,"coverAlt":324,"date":326,"description":882,"extension":328,"meta":883,"navigation":884,"path":885,"published":162,"readingTime":324,"seo":886,"stem":888,"tags":889,"updated":326,"__hash__":894},"blog\u002Fblog\u002Fself-hosting-30-docker-containers-on-a-single-vps.md","Self-Hosting 30+ Docker Containers on a Single VPS",{"type":21,"value":341,"toc":870},[342,345,349,352,355,358,362,369,386,389,393,396,536,539,543,550,553,574,577,581,588,591,603,606,610,613,742,745,748,752,758,764,770,780,786,789,793,798,815,820,834,838,858,861,864,867],[29,343,344],{},"Let me explain how I got here, because trust me, this wasn't the plan.",[24,346,348],{"id":347},"how-it-started","How It Started",[29,350,351],{},"It started innocently. I needed n8n for some workflow automation. The cloud plan? $20\u002Fmonth for limited executions. \"I'll just self-host it,\" I said. Famous last words 😅",[29,353,354],{},"Then I needed a search engine. Then file storage. Then a database tool. Then monitoring. Then a document processing API. Then... you get the idea.",[29,356,357],{},"Before I knew it, I was running a mini data center from a $15\u002Fmonth VPS. My friends think I have a problem. They might be right.",[24,359,361],{"id":360},"the-server","The Server",[29,363,364,365,117],{},"I'm running a ",[366,367,368],"strong",{},"Contabo Cloud VPS 30",[53,370,371,374,377,380,383],{},[56,372,373],{},"12 CPU cores (AMD EPYC)",[56,375,376],{},"24 GB RAM",[56,378,379],{},"200 GB NVMe disk",[56,381,382],{},"Unlimited traffic",[56,384,385],{},"~$15\u002Fmonth",[29,387,388],{},"Is Contabo the fastest? No. Is the support great? Also no. But for $15\u002Fmonth with those specs? Nothing comes close. It's the Honda Civic of VPS providers. Reliable, affordable, gets the job done. Nobody's taking Instagram photos of it, but it works 🚗",[24,390,392],{"id":391},"the-stack-aka-what-are-you-running","The Stack (aka \"What Are You Running?!\")",[29,394,395],{},"Here's what's actually running on this thing:",[397,398,399,415],"table",{},[400,401,402],"thead",{},[403,404,405,409,412],"tr",{},[406,407,408],"th",{},"Service",[406,410,411],{},"What It Does",[406,413,414],{},"Why Not SaaS?",[416,417,418,432,445,458,471,484,497,510,523],"tbody",{},[403,419,420,426,429],{},[421,422,423],"td",{},[366,424,425],{},"Coolify",[421,427,428],{},"Self-hosted PaaS",[421,430,431],{},"Replaces Vercel\u002FRailway. Free.",[403,433,434,439,442],{},[421,435,436],{},[366,437,438],{},"n8n",[421,440,441],{},"Workflow automation",[421,443,444],{},"Unlimited executions. No per-run billing.",[403,446,447,452,455],{},[421,448,449],{},[366,450,451],{},"SearXNG",[421,453,454],{},"Meta search engine",[421,456,457],{},"Private, no tracking. Try doing that with Google 👀",[403,459,460,465,468],{},[421,461,462],{},[366,463,464],{},"NocoDB",[421,466,467],{},"Spreadsheet database",[421,469,470],{},"Airtable but free and unlimited",[403,472,473,478,481],{},[421,474,475],{},[366,476,477],{},"Nextcloud",[421,479,480],{},"File storage & sync",[421,482,483],{},"Google Drive but I own my data",[403,485,486,491,494],{},[421,487,488],{},[366,489,490],{},"Docling",[421,492,493],{},"Document processing API",[421,495,496],{},"PDF\u002Fimage parsing for AI pipelines",[403,498,499,504,507],{},[421,500,501],{},[366,502,503],{},"Uptime Kuma",[421,505,506],{},"Monitoring",[421,508,509],{},"Knows when things break before my clients do",[403,511,512,517,520],{},[421,513,514],{},[366,515,516],{},"PostgreSQL",[421,518,519],{},"Database",[421,521,522],{},"Shared across multiple services",[403,524,525,530,533],{},[421,526,527],{},[366,528,529],{},"Redis",[421,531,532],{},"Caching",[421,534,535],{},"Makes Nextcloud not feel like it's running on a toaster",[29,537,538],{},"Plus Tailscale for private networking, Let's Encrypt for HTTPS, and about 15 other app deployments. It adds up.",[24,540,542],{"id":541},"coolify-the-thing-that-makes-it-all-possible","Coolify: The Thing That Makes It All Possible",[29,544,545,546,549],{},"Before Coolify, I was SSH-ing into the server and running ",[89,547,548],{},"docker compose up -d"," like some kind of caveman 🦕",[29,551,552],{},"Now I have a nice web UI where I can:",[53,554,555,558,565,568,571],{},[56,556,557],{},"Deploy from GitHub with one click",[56,559,560,561,564],{},"Manage environment variables without touching ",[89,562,563],{},".env"," files",[56,566,567],{},"Get automatic HTTPS on every service",[56,569,570],{},"Monitor which container is eating all my RAM (it's always Nextcloud, by the way)",[56,572,573],{},"Roll back when I inevitably break something",[29,575,576],{},"The learning curve? About a weekend. If you've used Vercel or Railway before, you'll feel right at home. Except this time, you're not paying per seat, per build, or per breath.",[24,578,580],{"id":579},"tailscale-because-not-everything-needs-to-be-public","Tailscale: Because Not Everything Needs to Be Public",[29,582,583,584,587],{},"Some of my services are... let's say \"for my eyes only.\" My search engine, database tools, internal dashboards. These are only accessible through ",[366,585,586],{},"Tailscale",", a mesh VPN.",[29,589,590],{},"The setup is embarrassingly simple:",[592,593,594,597,600],"ol",{},[56,595,596],{},"Install Tailscale on server",[56,598,599],{},"Install on your devices",[56,601,602],{},"Private services bind to Tailscale IP only",[29,604,605],{},"That's it. No VPN configs. No firewall rules. No \"why can't I connect\" debugging at 2am. Tailscale just works. And the free tier covers 100 devices, which is about 97 more than I need.",[24,607,609],{"id":608},"lets-talk-money","Let's Talk Money 💰",[29,611,612],{},"This is the part that makes me smile every time:",[397,614,615,627],{},[400,616,617],{},[403,618,619,621,624],{},[406,620,408],{},[406,622,623],{},"SaaS Cost (monthly)",[406,625,626],{},"My Cost",[416,628,629,640,650,659,669,678,688,697,711,725],{},[403,630,631,634,637],{},[421,632,633],{},"n8n Cloud",[421,635,636],{},"$20+",[421,638,639],{},"$0",[403,641,642,645,648],{},[421,643,644],{},"Nextcloud \u002F Google One",[421,646,647],{},"$10+",[421,649,639],{},[403,651,652,655,657],{},[421,653,654],{},"NocoDB \u002F Airtable",[421,656,636],{},[421,658,639],{},[403,660,661,664,667],{},[421,662,663],{},"Search API",[421,665,666],{},"$50+",[421,668,639],{},[403,670,671,673,676],{},[421,672,506],{},[421,674,675],{},"$7+",[421,677,639],{},[403,679,680,683,686],{},[421,681,682],{},"Vercel\u002FRailway (multiple apps)",[421,684,685],{},"$40+",[421,687,639],{},[403,689,690,692,695],{},[421,691,493],{},[421,693,694],{},"$30+",[421,696,639],{},[403,698,699,704,706],{},[421,700,701],{},[366,702,703],{},"My VPS",[421,705],{},[421,707,708],{},[366,709,710],{},"$15",[403,712,713,718,720],{},[421,714,715],{},[366,716,717],{},"Domain",[421,719],{},[421,721,722],{},[366,723,724],{},"~$1",[403,726,727,732,737],{},[421,728,729],{},[366,730,731],{},"Total",[421,733,734],{},[366,735,736],{},"$187+",[421,738,739],{},[366,740,741],{},"~$16",[29,743,744],{},"That's a conservative estimate. Some of these SaaS tools charge per seat, per execution, or per GB stored. The real gap is probably wider.",[29,746,747],{},"But before you go canceling all your subscriptions, let me be honest about the other side...",[24,749,751],{"id":750},"the-stuff-nobody-tells-you","The Stuff Nobody Tells You 😬",[29,753,754,757],{},[366,755,756],{},"It's not set-and-forget."," Things break. Docker runs out of disk space at 3am. A container decides to eat all 24GB of RAM for breakfast. PostgreSQL needs vacuuming (yes, databases need housekeeping too).",[29,759,760,763],{},[366,761,762],{},"Backups are YOUR problem."," When you use Vercel, they handle backups. When you self-host, if your disk dies and you didn't set up backups... that's on you. I learned this the scary way. Set up automated backups early. Do it now. I'll wait.",[29,765,766,769],{},[366,767,768],{},"Updates never stop."," Security patches, version upgrades, dependency conflicts. It's not hard, but it's constant. Think of it like having a garden. Rewarding, but you can't just plant things and walk away.",[29,771,772,775,776,779],{},[366,773,774],{},"RAM is never enough."," 24 GB sounds like a lot until PostgreSQL, Redis, Nextcloud, and 10 other services are all fighting over it. I've become very familiar with ",[89,777,778],{},"docker stats"," and very good at setting memory limits.",[29,781,782,785],{},[366,783,784],{},"Start small."," I didn't deploy 30 containers on day one. I started with Coolify and one app. Then added services as I needed them. Each new service taught me something about Docker networking, reverse proxies, or why you should always read the docs before running random commands from Stack Overflow 📚",[29,787,788],{},"The biggest lesson? Self-hosting is a skill. The first service takes a weekend. The tenth takes 20 minutes.",[24,790,792],{"id":791},"should-you-do-this","Should You Do This?",[29,794,795],{},[366,796,797],{},"Yes, if you:",[53,799,800,803,806,809,812],{},[56,801,802],{},"Run multiple side projects",[56,804,805],{},"Know basic Linux and Docker",[56,807,808],{},"Like owning your stuff",[56,810,811],{},"Want to learn DevOps by actually doing it",[56,813,814],{},"Are tired of surprise SaaS invoices",[29,816,817],{},[366,818,819],{},"No, if you:",[53,821,822,825,828,831],{},[56,823,824],{},"Need five-nines uptime for production",[56,826,827],{},"Don't want to think about servers ever",[56,829,830],{},"Haven't used Docker before (learn that first, then come back)",[56,832,833],{},"Value your weekends too much 😂",[24,835,837],{"id":836},"getting-started-the-quick-version","Getting Started (The Quick Version)",[592,839,840,843,846,849,852,855],{},[56,841,842],{},"Get a VPS (Contabo or Hetzner)",[56,844,845],{},"Install Coolify (literally one command)",[56,847,848],{},"Deploy the service that costs you the most",[56,850,851],{},"Add Tailscale for private access",[56,853,854],{},"Add more services as you go",[56,856,857],{},"Try not to become addicted",[29,859,860],{},"You don't need to replace everything overnight. Start with one service and build from there.",[862,863],"hr",{},[29,865,866],{},"I've been running this setup for months now and I keep finding new things to self-host. At this point, I think I might have an actual problem 😂",[29,868,869],{},"What would be the first service you'd move off SaaS? Drop it in the comments, I'm curious!",{"title":87,"searchDepth":127,"depth":127,"links":871},[872,873,874,875,876,877,878,879,880],{"id":347,"depth":110,"text":348},{"id":360,"depth":110,"text":361},{"id":391,"depth":110,"text":392},{"id":541,"depth":110,"text":542},{"id":579,"depth":110,"text":580},{"id":608,"depth":110,"text":609},{"id":750,"depth":110,"text":751},{"id":791,"depth":110,"text":792},{"id":836,"depth":110,"text":837},"\u002Fimages\u002Fblog\u002Fselfhosted-stack.webp","I run 30+ Docker containers on a single VPS. Yes, thirty. On one box. And no, my server hasn't caught fire yet 🔥 (I check every morning though, just in case).",{},{"icon":87,"title":87},"\u002Fblog\u002Fself-hosting-30-docker-containers-on-a-single-vps",{"title":887,"description":882},"Self-Hosting 30+ Docker Containers on a Single VPS file","blog\u002Fself-hosting-30-docker-containers-on-a-single-vps",[890,891,892,893],"self-hosting","docker","coolify","devops","lpYVBaFM_MGeJoUWxJ2465eHB0M_xl0dHit-5jVSf-E",1778737092052]