<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Linux on Budiman JoJo</title>
    <link>https://budimanjojo.com/categories/linux/</link>
    <description>Recent content in Linux on Budiman JoJo</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Thu, 06 Mar 2025 12:20:51 +0700</lastBuildDate>
    <atom:link href="https://budimanjojo.com/categories/linux/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>The Pain and Peculiarity of NixOS Networking with systemd-networkd</title>
      <link>https://budimanjojo.com/2025/03/06/systemd-networkd-nixos-pain/</link>
      <pubDate>Thu, 06 Mar 2025 12:20:51 +0700</pubDate>
      <guid>https://budimanjojo.com/2025/03/06/systemd-networkd-nixos-pain/</guid>
      <description>&lt;p&gt;Setting up networking on NixOS with &lt;code&gt;systemd-networkd&lt;/code&gt; should, in theory, be a straightforward and declarative process.&#xA;Just define your network configurations in Nix, let &lt;code&gt;systemd-networkd&lt;/code&gt; handle the interfaces, and enjoy a seamless, reproducible setup.&#xA;But reality hits differently.&#xA;My journey with &lt;code&gt;systemd-networkd&lt;/code&gt; on NixOS has been a mix of frustration, debugging marathons, and the occasional victory that feels more like luck than mastery.&#xA;In this article, I&amp;rsquo;ll go over some of the quirks I&amp;rsquo;ve encountered, the pitfalls that made me question my sanity, and the workarounds that (sometimes) saved the day.&lt;/p&gt;</description>
    </item>
    <item>
      <title>My Journey Containerizing Fullstack Java GUI App</title>
      <link>https://budimanjojo.com/2024/02/01/my-journey-containerizing-fullstack-java-gui-app/</link>
      <pubDate>Thu, 01 Feb 2024 18:45:56 +0000</pubDate>
      <guid>https://budimanjojo.com/2024/02/01/my-journey-containerizing-fullstack-java-gui-app/</guid>
      <description>&lt;p&gt;Do you find yourself stuck with an outdated application, due to the absence of viable alternatives or work requirements?&#xA;Well, you&amp;rsquo;re not alone.&#xA;In this blog post, I&amp;rsquo;ll share my experience dealing with an old Java application that not only require an obsolete version but also demanded a specific environment setup, including a Postgres server and a CUPS server.&#xA;To liberate my system from these complexity, I embarked on the journey of containerizing the entire stack.&#xA;Join me as I recount the challenges faced and the valuable lessons learned along the way.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How I Write Kubernetes Manifests</title>
      <link>https://budimanjojo.com/2023/02/22/how-i-write-kubernetes-manifests/</link>
      <pubDate>Wed, 22 Feb 2023 18:45:56 +0000</pubDate>
      <guid>https://budimanjojo.com/2023/02/22/how-i-write-kubernetes-manifests/</guid>
      <description>&lt;p&gt;While tools like &lt;a href=&#34;https://helm.sh&#34;&gt;Helm&lt;/a&gt; and &lt;a href=&#34;https://kustomize.io&#34;&gt;kustomize&lt;/a&gt; can significantly reduce the amount of manual &lt;a href=&#34;https://medium.com/@sujithabdulrahim/understanding-the-kubernetes-manifest-e96d680f2a11&#34;&gt;Kubernetes manifests&lt;/a&gt; writing, it&amp;rsquo;s often impossible to completely avoid it (even (&lt;code&gt;kustomization.yaml&lt;/code&gt; file is itself a Kubernetes manifest).&#xA;For instance, you may need to create a basic ingress because the chart you&amp;rsquo;re using doesn&amp;rsquo;t provide a template for it, or generate a certificate for your domain with cert-manager.&#xA;In this post, I&amp;rsquo;ll describe how I leverage &lt;a href=&#34;https://code.visualstudio.com/docs/editor/userdefinedsnippets&#34;&gt;VSCode snippets&lt;/a&gt; and &lt;a href=&#34;https://github.com/redhat-developer/yaml-language-server&#34;&gt;yaml-language-server&lt;/a&gt; to write Kubernetes manifests.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Neovim Is Awesome</title>
      <link>https://budimanjojo.com/2022/08/27/neovim-is-awesome/</link>
      <pubDate>Sat, 27 Aug 2022 12:20:51 +0700</pubDate>
      <guid>https://budimanjojo.com/2022/08/27/neovim-is-awesome/</guid>
      <description>&lt;p&gt;&#xA;&lt;a href=&#34;https://budimanjojo.com/images/neovim-is-awesome_1.png&#34; data-dimbox data-dimbox-caption=&#34;neovim-is-awesome&#34;&gt;&#xA;  &lt;img alt=&#34;neovim-is-awesome&#34; src=&#34;https://budimanjojo.com/images/neovim-is-awesome_1.png&#34;/&gt;&#xA;&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;I was a long time &lt;a href=&#34;https://www.vim.org/&#34;&gt;Vim&lt;/a&gt; user, long before &lt;a href=&#34;https://neovim.io/&#34;&gt;Neovim&lt;/a&gt; was born.&#xA;I was sold to Neovim when &lt;a href=&#34;https://github.com/neoclide/coc.nvim&#34;&gt;CoC&lt;/a&gt; came out and there were some features that don&amp;rsquo;t work with Vim.&#xA;At that time, Neovim was marketed as Vim but with more sane default experience.&#xA;As time goes by, now Neovim is more than just Vim with better defaults.&#xA;In this post, I will share my two cents on why Neovim is so much better than Vim, at least for me.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Managing Dotfiles With Chezmoi</title>
      <link>https://budimanjojo.com/2021/12/13/managing-dotfiles-with-chezmoi/</link>
      <pubDate>Mon, 13 Dec 2021 23:54:07 +0000</pubDate>
      <guid>https://budimanjojo.com/2021/12/13/managing-dotfiles-with-chezmoi/</guid>
      <description>&lt;p&gt;&#xA;&lt;a href=&#34;https://budimanjojo.com/images/managing-dotfiles-with-chezmoi_1.png&#34; data-dimbox data-dimbox-caption=&#34;managing-dotfiles-with-chezmoi&#34;&gt;&#xA;  &lt;img alt=&#34;managing-dotfiles-with-chezmoi&#34; src=&#34;https://budimanjojo.com/images/managing-dotfiles-with-chezmoi_1.png&#34;/&gt;&#xA;&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;The biggest difference between my setup and your setup might be our configuration files.&#xA;In Unix world we call them dotfiles.&#xA;Dotfiles are files whose filename starts with a dot and hidden by default in our file managers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How I GitOps Home Assistant Configurations</title>
      <link>https://budimanjojo.com/2021/11/04/gitops-home-assistant-configurations/</link>
      <pubDate>Thu, 04 Nov 2021 17:37:02 +0000</pubDate>
      <guid>https://budimanjojo.com/2021/11/04/gitops-home-assistant-configurations/</guid>
      <description>&lt;p&gt;&#xA;&lt;a href=&#34;https://budimanjojo.com/images/gitops-home-assistant-configurations_1.png&#34; data-dimbox data-dimbox-caption=&#34;home assistant gitops&#34;&gt;&#xA;  &lt;img alt=&#34;home assistant gitops&#34; src=&#34;https://budimanjojo.com/images/gitops-home-assistant-configurations_1.png&#34;/&gt;&#xA;&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;I always love the idea of GitOps, where everything I have in a git repo represents the current state of my application.&#xA;But not everything are made for GitOps, so we have to sort of “make it work”.&#xA;In this post, I will show you how I manage to GitOps my Home Assistant configurations.&#xA;Spoiler, this is hacky and messy at the same time, so please bear this in mind before continuing.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Automating Kubernetes Nodes Reboot with Kured</title>
      <link>https://budimanjojo.com/2021/10/28/automating-kubernetes-nodes-reboot-with-kured/</link>
      <pubDate>Thu, 28 Oct 2021 16:05:01 +0000</pubDate>
      <guid>https://budimanjojo.com/2021/10/28/automating-kubernetes-nodes-reboot-with-kured/</guid>
      <description>&lt;p&gt;&#xA;&lt;a href=&#34;https://budimanjojo.com/images/kured-kubernetes_1.png&#34; data-dimbox data-dimbox-caption=&#34;kured-kubernetes&#34;&gt;&#xA;  &lt;img alt=&#34;kured-kubernetes&#34; src=&#34;https://budimanjojo.com/images/kured-kubernetes_1.png&#34;/&gt;&#xA;&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;Having an up-to-date Kubernetes node is important, especially security updates.&#xA;Sometimes an update requires a reboot to take effect, and you don’t want to keep checking them manually.&#xA;In this post, I will share about how I automate my Kubernetes nodes to reboot when necessary using &lt;a href=&#34;https://github.com/weaveworks/kured&#34;&gt;Kured&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Variable Substitution in Flux GitOps</title>
      <link>https://budimanjojo.com/2021/10/27/variable-substitution-in-flux-gitops/</link>
      <pubDate>Wed, 27 Oct 2021 13:36:08 +0000</pubDate>
      <guid>https://budimanjojo.com/2021/10/27/variable-substitution-in-flux-gitops/</guid>
      <description>&lt;p&gt;&#xA;&lt;a href=&#34;https://budimanjojo.com/images/variable-substitution-in-flux-gitops_1.png&#34; data-dimbox data-dimbox-caption=&#34;variable substitution in flux&#34;&gt;&#xA;  &lt;img alt=&#34;variable substitution in flux&#34; src=&#34;https://budimanjojo.com/images/variable-substitution-in-flux-gitops_1.png&#34;/&gt;&#xA;&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;Sometimes there are values that you want to use multiple times in your manifest files.&#xA;Usually, we define them using a config map or secret and we either mount them as a file or environment variable.&#xA;This is easy if you don’t use GitOps and have a small amount of pods.&#xA;Also, having a single configmap and secret will clean up a lot of mess out of your cluster, and this is what variable substitution will do for you.&#xA;I find this really useful especially for sensitive information you don’t want people all around the world to see.&#xA;In this post, I will show you how I do variable substitution using Flux GitOps tool.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How I Manage My Kubernetes Manifests Using Flux</title>
      <link>https://budimanjojo.com/2021/10/20/manage-kubernetes-manifests-using-flux/</link>
      <pubDate>Wed, 20 Oct 2021 18:45:56 +0000</pubDate>
      <guid>https://budimanjojo.com/2021/10/20/manage-kubernetes-manifests-using-flux/</guid>
      <description>&lt;p&gt;&#xA;&lt;a href=&#34;https://budimanjojo.com/images/how-i-manage-my-kubernetes-manifests-using-flux_1.png&#34; data-dimbox data-dimbox-caption=&#34;manage kubernetes manifests flux&#34;&gt;&#xA;  &lt;img alt=&#34;manage kubernetes manifests flux&#34; src=&#34;https://budimanjojo.com/images/how-i-manage-my-kubernetes-manifests-using-flux_1.png&#34;/&gt;&#xA;&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;GitOps is currently the most popular way to manage your services.&#xA;It’s sort of what DevOps is but with Git.&#xA;To put it in a simple way, it is a practice where you manage everything through git.&#xA;Whatever you have in your git repository is what your cluster current state is.&#xA;Because GitOps is so popular there are a lot of new tools focusing on GitOps right now, and &lt;a href=&#34;https://fluxcd.io/&#34;&gt;Flux&lt;/a&gt; is one of them.&#xA;In this post I will give you a glance on how I manage my Kubernetes manifests using Flux.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Raspberry Pi Media Server Series 4 - Setting Up Docker</title>
      <link>https://budimanjojo.com/2019/12/18/raspberry-pi-media-server-series-4-setting-up-docker/</link>
      <pubDate>Wed, 18 Dec 2019 01:24:55 +0000</pubDate>
      <guid>https://budimanjojo.com/2019/12/18/raspberry-pi-media-server-series-4-setting-up-docker/</guid>
      <description>&lt;p&gt;This is the forth part of my Raspberry Pi Media Server series.&#xA;If you haven’t read our previous part, &lt;a href=&#34;https://budimanjojo.com/2019/12/09/raspberry-pi-media-server-series-3-external-drives/&#34;&gt;here’s&lt;/a&gt; where we discussed setting up external drives on Raspberry Pi.&#xA;In this part, we are going to setting up &lt;a href=&#34;https://www.docker.com/&#34;&gt;Docker&lt;/a&gt; on Raspberry Pi.&#xA;Here’s what you will get if you follow through the end of the tutorial:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Docker and Docker Compose installed&lt;/li&gt;&#xA;&lt;li&gt;Docker data will be in the external drives&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://wiki.archlinux.org/index.php/systemd&#34;&gt;Systemd&lt;/a&gt; will only start Docker if external drives are mounted&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;getting-started&#34;&gt;Getting Started&lt;/h2&gt;&#xA;&lt;p&gt;Before we get our hands on setting up docker on our Raspberry Pi, let’s first do a system update.&#xA;If you are on Manjaro, the command will be:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Raspberry Pi Media Server Series 3 - External Drives</title>
      <link>https://budimanjojo.com/2019/12/09/raspberry-pi-media-server-series-3-external-drives/</link>
      <pubDate>Mon, 09 Dec 2019 17:35:52 +0000</pubDate>
      <guid>https://budimanjojo.com/2019/12/09/raspberry-pi-media-server-series-3-external-drives/</guid>
      <description>&lt;p&gt;This is the third part of Raspberry Pi Media Server series, if you haven’t read our previous part, here’s where we discussed &lt;a href=&#34;https://budimanjojo.com/2019/11/30/raspberry-pi-media-server-series-2-secure-ssh/&#34;&gt;securing SSH server&lt;/a&gt; on Raspberry Pi.&#xA;In this post, I’m going to share how I setup external drives on my Raspberry Pi.&#xA;Here’s a glimpse on my setup before you decided to read this entire lengthy page:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Raspberry Pi Media Server Series 2 - Secure Ssh</title>
      <link>https://budimanjojo.com/2019/11/30/raspberry-pi-media-server-series-2-secure-ssh/</link>
      <pubDate>Sat, 30 Nov 2019 10:31:59 +0000</pubDate>
      <guid>https://budimanjojo.com/2019/11/30/raspberry-pi-media-server-series-2-secure-ssh/</guid>
      <description>&lt;p&gt;This is the second part of my Raspberry Pi Media Server series.&#xA;On &lt;a href=&#34;https://budimanjojo.com/2019/11/25/raspberry-pi-media-server-series-1-installing-manjaro/&#34;&gt;previous post&lt;/a&gt;, I wrote about installing Manjaro Linux ARM into my Raspberry Pi 4.&#xA;Now, we are going to secure our SSH server on Raspberry Pi so that we can at least prevent &lt;a href=&#34;https://en.wikipedia.org/wiki/Brute-force_attack&#34;&gt;brute-force&lt;/a&gt; attempt on our future home media server from the evil outside world.&#xA;Securing SSH server is one of the most crucial part of every server that can be accessible on the internet.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Raspberry Pi Media Server Series 1 - Installing Manjaro</title>
      <link>https://budimanjojo.com/2019/11/25/raspberry-pi-media-server-series-1-installing-manjaro/</link>
      <pubDate>Mon, 25 Nov 2019 00:04:50 +0000</pubDate>
      <guid>https://budimanjojo.com/2019/11/25/raspberry-pi-media-server-series-1-installing-manjaro/</guid>
      <description>&lt;p&gt;So you bought a Raspberry Pi and you don’t know what should you do with it.&#xA;Well, in this series I want to share my way of using my Raspberry Pi.&#xA;I bet you already guessed it right by reading the title.&#xA;Yes, this is the first part of my Raspberry Pi Media Server series.&#xA;Before I continue, here’s what I have for this project:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A full set of &lt;a href=&#34;https://www.raspberrypi.org/products/raspberry-pi-4-model-b/&#34;&gt;2GB Raspberry Pi 4 Model B&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://my.orico.cc/goods.php?id=4817&#34;&gt;ORICO 3.5 inch Dual Bay Aluminum Alloy USB3.0 Hard Drive Enclosure (9528U3)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Two 1TB Hard Disk Drive&lt;/li&gt;&#xA;&lt;li&gt;A memory card reader&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
  </channel>
</rss>
