<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Divyam Azad — notes</title><link>https://divyam.top/blog/</link><description>Recent content on Divyam Azad — notes</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 22 Aug 2026 09:00:00 +0530</lastBuildDate><atom:link href="https://divyam.top/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Self-hosted NetBird with the embedded IdP (and the bcrypt gotcha)</title><link>https://divyam.top/blog/self-hosted-netbird-embedded-idp/</link><pubDate>Sat, 22 Aug 2026 09:00:00 +0530</pubDate><guid>https://divyam.top/blog/self-hosted-netbird-embedded-idp/</guid><description>&lt;p&gt;I wanted a private network between my devices and the server: the box reachable over the mesh instead of the public internet, admin interfaces that do not need to be public, and a control plane I own. &lt;a href="https://netbird.io/"&gt;NetBird&lt;/a&gt; is WireGuard underneath, which is what I run elsewhere anyway, and its self-hosted server has become small enough to sit next to a portfolio site on a 4 GB VPS.&lt;/p&gt;</description></item><item><title>CrowdSec on a 4 GB VPS in an afternoon</title><link>https://divyam.top/blog/crowdsec-on-a-small-vps/</link><pubDate>Sat, 22 Aug 2026 08:55:00 +0530</pubDate><guid>https://divyam.top/blog/crowdsec-on-a-small-vps/</guid><description>&lt;p&gt;The server behind this site has exactly one thing listening on the internet: Caddy, on ports 80 and 443. Everything else is reachable only on the compose network. That is a small surface, but it is a surface, and the access log filled with vulnerability scanners within an hour of the first certificate being issued. This is how I put &lt;a href="https://www.crowdsec.net/"&gt;CrowdSec&lt;/a&gt; in front of it, in a way that fits the rest of the repository: declared in git, bootstrapped by the deploy script, visible on a public page.&lt;/p&gt;</description></item><item><title>Moving a Telegram bot between hosts without losing a message</title><link>https://divyam.top/blog/moving-a-telegram-bot-between-hosts/</link><pubDate>Sat, 22 Aug 2026 08:50:00 +0530</pubDate><guid>https://divyam.top/blog/moving-a-telegram-bot-between-hosts/</guid><description>&lt;p&gt;A small Telegram bot I wrote — a household assistant that lives entirely on button taps — used to run as a native binary on an old laptop under launchd. When I set up a proper server, I wanted to move it there. Moving it is not hard; moving it &lt;em&gt;without two copies running at once&lt;/em&gt; takes a little care.&lt;/p&gt;</description></item><item><title>The bind mount that pinned an inode</title><link>https://divyam.top/blog/the-bind-mount-that-pinned-an-inode/</link><pubDate>Sat, 22 Aug 2026 08:45:00 +0530</pubDate><guid>https://divyam.top/blog/the-bind-mount-that-pinned-an-inode/</guid><description>&lt;p&gt;A small one, but it bit hard enough to be worth writing down.&lt;/p&gt;&#10;&lt;h2 id="the-setup"&gt;The setup&lt;/h2&gt;&#10;&lt;p&gt;Caddy runs as a container with its configuration bind-mounted from the repository:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7ee787"&gt;volumes&lt;/span&gt;:&lt;span style="color:#6e7681"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;- &lt;span style="color:#a5d6ff"&gt;./caddy/Caddyfile:/etc/caddy/Caddyfile:ro&lt;/span&gt;&lt;span style="color:#6e7681"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The deploy script pulls the repository and, because Compose cannot see the contents of a bind mount changing, follows &lt;code&gt;docker compose up -d&lt;/code&gt; with a graceful &lt;code&gt;caddy reload&lt;/code&gt;. I added a &lt;code&gt;respond /healthz 200&lt;/code&gt; line, pushed, watched the deploy succeed and the reload report no errors — and &lt;code&gt;/healthz&lt;/code&gt; still returned 404.&lt;/p&gt;</description></item><item><title>Docker 29 made my bot restart on every deploy</title><link>https://divyam.top/blog/docker-29-made-my-bot-restart-on-every-deploy/</link><pubDate>Sat, 22 Aug 2026 08:40:00 +0530</pubDate><guid>https://divyam.top/blog/docker-29-made-my-bot-restart-on-every-deploy/</guid><description>&lt;p&gt;My deploy loop is deliberately boring: a systemd timer pulls a repository every five minutes, computes a fingerprint, and runs &lt;code&gt;docker compose up -d --build&lt;/code&gt; only when something changed. Compose, in turn, is supposed to recreate only the containers whose configuration or image changed. So when I pushed a README-only commit and watched the Telegram bot restart, something was wrong.&lt;/p&gt;</description></item><item><title>How this site is hosted</title><link>https://divyam.top/blog/how-this-site-is-hosted/</link><pubDate>Sat, 22 Aug 2026 08:30:00 +0530</pubDate><guid>https://divyam.top/blog/how-this-site-is-hosted/</guid><description>&lt;p&gt;Everything that runs behind &lt;strong&gt;divyam.top&lt;/strong&gt; lives on one small virtual server — two vCPUs, four gigabytes of memory — and is described by a single private git repository. The server pulls that repository every five minutes and converges to it with Docker Compose. Nothing on the machine is edited by hand; to change production, I push.&lt;/p&gt;</description></item></channel></rss>