<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Posts on Thariq&#39;s workplace</title>
    <link>https://blog.aristocat.in/posts/</link>
    <description>Recent content in Posts on Thariq&#39;s workplace</description>
    <image>
      <title>Thariq&#39;s workplace</title>
      <url>https://blog.aristocat.in/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</url>
      <link>https://blog.aristocat.in/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</link>
    </image>
    <generator>Hugo -- 0.147.1</generator>
    <language>en</language>
    <copyright>thariq shah</copyright>
    <lastBuildDate>Wed, 22 Jul 2026 02:56:00 +0530</lastBuildDate>
    <atom:link href="https://blog.aristocat.in/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Self-Hosting Ente Photos Behind a Cloudflare Tunnel: Preserving Request Integrity Through the Proxy Chain</title>
      <link>https://blog.aristocat.in/posts/self-hosting-ente-photos/</link>
      <pubDate>Wed, 22 Jul 2026 02:56:00 +0530</pubDate>
      <guid>https://blog.aristocat.in/posts/self-hosting-ente-photos/</guid>
      <description>&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;
&lt;p&gt;This is a complete account of standing up &lt;a href=&#34;https://ente.com&#34;&gt;Ente&lt;/a&gt; — an end-to-end encrypted photo and video backup service — on a home server, exposed to the internet through a Cloudflare Tunnel, with mobile and web clients connecting to it from arbitrary networks. The straightforward part of this project was running &lt;code&gt;docker compose up&lt;/code&gt;. The interesting part, and the reason this write-up exists, is a single architectural constraint that determines almost every other decision in the stack: &lt;strong&gt;Ente&amp;rsquo;s storage layer issues AWS SigV4 pre-signed URLs directly to the client, and pre-signed URL validation is byte-for-byte sensitive to header mutation along the request path.&lt;/strong&gt; Any reverse proxy sitting between the client and the object store is a candidate for silently breaking uploads and downloads — and Cloudflare&amp;rsquo;s edge, which every hostname routed through a Cloudflare Tunnel passes through, is exactly this kind of proxy.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Setup RKLLM Runtime on CM3588 (Rockchip RK3588)</title>
      <link>https://blog.aristocat.in/posts/self-hosted-rkllm/</link>
      <pubDate>Sun, 01 Mar 2026 14:26:00 +0530</pubDate>
      <guid>https://blog.aristocat.in/posts/self-hosted-rkllm/</guid>
      <description>&lt;h2 id=&#34;why-did-i-do-this&#34;&gt;Why did I do this?&lt;/h2&gt;
&lt;p&gt;Like always being bored is the reason for anything I do with tech. With the AI hype threatening my job (LOL), I wanted to play around with LLMs for actual daily use and not just generating slop.&lt;/p&gt;
&lt;p&gt;Since I own FriendlyElec&amp;rsquo;s CM3588 board with RK3588 with 32GB ram and 256GB storage it was overkill for my home lab use with CF tunnel, K3s cluster and containers just serving me my flac files, Immich and occasional side projects which I never use. I was aware that this board has an NPU but I never had the time to play with it and run a model off it. I did try ollama in my desktop but it never made any sense because of the resource usage and power consumption.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Securing K3s With Lets Encrypt</title>
      <link>https://blog.aristocat.in/posts/securing-k3s-with-lets-encrypt/</link>
      <pubDate>Wed, 14 May 2025 19:55:46 +0530</pubDate>
      <guid>https://blog.aristocat.in/posts/securing-k3s-with-lets-encrypt/</guid>
      <description>&lt;h1 id=&#34;-tls-certificates-for-homelab-using-cloudflare--cert-manager--lets-encrypt&#34;&gt;🔐 TLS Certificates for Homelab Using Cloudflare + Cert-Manager + Let&amp;rsquo;s Encrypt&lt;/h1&gt;
&lt;p&gt;With Traefik operational as the ingress controller in a K3s cluster, the next logical step is to provision HTTPS automatically using &lt;strong&gt;Let&amp;rsquo;s Encrypt&lt;/strong&gt; certificates, &lt;strong&gt;Cloudflare DNS validation&lt;/strong&gt;, and &lt;strong&gt;Cert-Manager&lt;/strong&gt;. This ensures encrypted traffic across services in a self-hosted homelab.&lt;/p&gt;
&lt;h2 id=&#34;-prerequisites&#34;&gt;☁️ Prerequisites&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;A domain managed by &lt;strong&gt;Cloudflare&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;An API token with DNS edit permissions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traefik&lt;/strong&gt; installed and configured as the ingress controller&lt;/li&gt;
&lt;li&gt;A functional &lt;strong&gt;K3s&lt;/strong&gt; cluster with outbound internet access&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;-step-1-install-cert-manager&#34;&gt;🔧 Step 1: Install Cert-Manager&lt;/h2&gt;
&lt;p&gt;Install &lt;code&gt;cert-manager&lt;/code&gt; using Helm&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building a Homelab with K3s</title>
      <link>https://blog.aristocat.in/posts/setting-up-k3s-with-helm/</link>
      <pubDate>Tue, 13 May 2025 22:48:10 +0530</pubDate>
      <guid>https://blog.aristocat.in/posts/setting-up-k3s-with-helm/</guid>
      <description>&lt;h1 id=&#34;-self-hosting-with-k3s-and-traefik&#34;&gt;🚀 Self-Hosting with K3s and Traefik&lt;/h1&gt;
&lt;p&gt;Set up a lightweight Kubernetes cluster using K3s on a Raspberry Pi, deploy Traefik via Helm, and prepare for self-hosted services with ingress routing and local TLS.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-prerequisites&#34;&gt;🧰 Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A Linux host with root access (e.g., Raspberry Pi or any ARM64/x86_64 board)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kubectl&lt;/code&gt; installed on a client machine&lt;/li&gt;
&lt;li&gt;Helm 3 installed on the cluster (&lt;a href=&#34;https://helm.sh/docs/intro/install/&#34;&gt;https://helm.sh/docs/intro/install/&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-install-k3s-without-traefik&#34;&gt;⚙️ Install K3s without Traefik&lt;/h2&gt;
&lt;p&gt;Skip the bundled Traefik and gain full control by managing ingress via Helm&lt;/p&gt;</description>
    </item>
    <item>
      <title>Running Valheim Server on FriendlyELEC CM3588</title>
      <link>https://blog.aristocat.in/posts/running-valheim-server/</link>
      <pubDate>Sun, 04 May 2025 18:58:31 +0530</pubDate>
      <guid>https://blog.aristocat.in/posts/running-valheim-server/</guid>
      <description>&lt;h2 id=&#34;-running-the-valheim-server-using-docker-compose&#34;&gt;🚀 Running the Valheim Server Using Docker Compose&lt;/h2&gt;
&lt;p&gt;The Docker Compose configuration we used to deploy a Valheim server on the FriendlyELEC CM3588 board/Arm SBC&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;3&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;raspiheim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;arokan/raspiheim:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;raspiheim&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;SERVER_NAME=Raspiheim&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;SERVER_PASS=Raspipass&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;WORLD_NAME=Raspiworld&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUBLIC=disabled&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;CROSSPLAY=disabled&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;UPDATE=enabled&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;SAVE_INTERVAL=1800&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;BOX86=default&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;BOX64=default&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;NO_BUILD_COST=disabled&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PLAYER_EVENTS=disabled&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PASSIVE_MOBS=disabled&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;NO_MAP=disabled&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;2456:2456/udp&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;2457:2457/udp&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;/path/to/valheim/data:/data&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;/path/to/valheim/server:/valheim&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Note&lt;/strong&gt;: Replace &lt;code&gt;/path/to/valheim/data&lt;/code&gt; and &lt;code&gt;/path/to/valheim/server&lt;/code&gt; with actual absolute paths.&lt;/p&gt;</description>
    </item>
    <item>
      <title>From Need to Solution: Home server</title>
      <link>https://blog.aristocat.in/posts/need-to-solution-home-server/</link>
      <pubDate>Sun, 01 Sep 2024 12:23:17 +0530</pubDate>
      <guid>https://blog.aristocat.in/posts/need-to-solution-home-server/</guid>
      <description>&lt;h2 id=&#34;what-is-a-home-server&#34;&gt;What is a Home Server?&lt;/h2&gt;
&lt;p&gt;Let’s start with the basics: what exactly is “the cloud”? It’s just someone else’s computer sitting in a data center somewhere—likely in a different country or even a different continent—managed by your friendly neighborhood cloud vendor (think Google, Amazon, Apple&amp;hellip; you get the idea).&lt;/p&gt;
&lt;p&gt;Now, about servers. The word “server” might sound intimidating, but it’s really just a computer that’s designed and dedicated to doing a specific job. And yes, your smartphone can technically be a server. Heck, if you’re really feeling adventurous, you could even turn your toaster into one (please don’t try this at home, though).&lt;/p&gt;</description>
    </item>
    <item>
      <title>CRUD Application with Spring boot 3.3 and GraalVM native Image</title>
      <link>https://blog.aristocat.in/posts/crud-app-on-graal-image/</link>
      <pubDate>Sun, 18 Aug 2024 18:58:31 +0530</pubDate>
      <guid>https://blog.aristocat.in/posts/crud-app-on-graal-image/</guid>
      <description>&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Java 21&lt;/li&gt;
&lt;li&gt;Clone &lt;a href=&#34;https://github.com/thariqshah/inventory-service&#34;&gt;inventory-service&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;This article is the second part of &lt;a href=&#34;https://blog.aristocat.in/posts/sprinboot-3.3-on-graal-image/&#34;&gt;Low memory footprint with Spring boot 3.3 and Graalvm native image&lt;/a&gt;.
Here, we will be building REST CRUD resources and package as a native executable within a container.
We are using flyway for database versioning and springdoc library for swagger documentation with a web UI.&lt;/p&gt;
&lt;h2 id=&#34;flyway&#34;&gt;Flyway&lt;/h2&gt;
&lt;p&gt;Flyway is a database migration tool that helps you manage and apply database changes within your application
to achieve database environment parity.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Low memory footprint with Spring boot 3.3 and Graalvm native image</title>
      <link>https://blog.aristocat.in/posts/sprinboot-3.3-on-graal-image/</link>
      <pubDate>Sun, 18 Aug 2024 11:58:14 +0530</pubDate>
      <guid>https://blog.aristocat.in/posts/sprinboot-3.3-on-graal-image/</guid>
      <description>&lt;h2 id=&#34;what-is-a-native-image&#34;&gt;What is a Native Image?&lt;/h2&gt;
&lt;p&gt;GraalVM native image is an ahead-of-time compilation technology that generates native executables.
Native executables have low resource usage and fast startup time in compact packaging.&lt;/p&gt;
&lt;p&gt;It is an ideal candidate for serverless workloads in Java.&lt;/p&gt;
&lt;p&gt;I use it to create hobby projects, so I don&amp;rsquo;t exhaust my free tier quotas on services like &lt;a href=&#34;https://fly.io&#34;&gt;fly.io&lt;/a&gt; 😉&lt;/p&gt;
&lt;p&gt;GraalVM Native Image is a broad topic with many resources and videos available for a deeper understanding.
The &lt;a href=&#34;https://www.graalvm.org/latest/reference-manual/native-image/&#34;&gt;Official documentation&lt;/a&gt; is a great place to start.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
