<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>rcwz.pl</title>
    <link>https://rcwz.pl/</link>
    <description>Recent content on rcwz.pl</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Sat, 01 Nov 2025 23:00:00 +0200</lastBuildDate>
    <atom:link href="https://rcwz.pl/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Talos: recovering from broken network interface</title>
      <link>https://rcwz.pl/2025-11-01-talos-recovering-from-broken-network-interface/</link>
      <pubDate>Sat, 01 Nov 2025 23:00:00 +0200</pubDate>
      <guid>https://rcwz.pl/2025-11-01-talos-recovering-from-broken-network-interface/</guid>
      <description>&lt;p&gt;While playing with my homelab Talos cluster, I accidentaly broke the network interface. As my Raspberry Pi has only one interface, that meant that my device was unreachable over the network. To make matter worse, the node I broke was the control plane, and I wanted to preserve as much data as possible.&lt;/p&gt;&#xA;&lt;p&gt;To recover from this situation, I was left with no other option, but to boot the device from an SD card. When Talos is installed and first boots up, it creates a couple of partitions on the install disk (&lt;code&gt;nvme0n1&lt;/code&gt; in my case):&lt;/p&gt;</description>
    </item>
    <item>
      <title>Setting up ArgoCD for continuous deployment</title>
      <link>https://rcwz.pl/2025-10-15-setting-up-argocd-for-continuous-deployment/</link>
      <pubDate>Wed, 15 Oct 2025 20:00:00 +0200</pubDate>
      <guid>https://rcwz.pl/2025-10-15-setting-up-argocd-for-continuous-deployment/</guid>
      <description>&lt;p&gt;In the &lt;a href=&#34;https://rcwz.pl/2025-10-13-managing-secrets-with-1password-and-external-secrets/&#34;&gt;previous blog post in this series&lt;/a&gt;, I added secret management with &lt;a href=&#34;https://external-secrets.io/latest/&#34;&gt;External Secrets Operator&lt;/a&gt; and &lt;a href=&#34;https://developer.1password.com/docs/connect/&#34;&gt;1Password Connect&lt;/a&gt;. This was a necessary step before introducing &lt;a href=&#34;https://argo-cd.readthedocs.io/en/stable/&#34;&gt;ArgoCD&lt;/a&gt;, which will automate the deployment of applications to my Kubernetes cluster. Without ESO, I would either have to commit secrets in Git (not ideal, unless you plan to use &lt;a href=&#34;https://github.com/bitnami-labs/sealed-secrets&#34;&gt;Sealed Secrets&lt;/a&gt; or &lt;a href=&#34;https://github.com/getsops/sops&#34;&gt;SOPS&lt;/a&gt;) or to manually create secrets in the cluster.&lt;/p&gt;&#xA;&lt;p&gt;Today, I will set up ArgoCD and migrate all components deployed so far to it. ArgoCD is quite powerful, but I&amp;rsquo;m going to keep it simple for now, since I wouldn&amp;rsquo;t be able to use all the features just yet.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Managing secrets with 1Password and External Secrets</title>
      <link>https://rcwz.pl/2025-10-13-managing-secrets-with-1password-and-external-secrets/</link>
      <pubDate>Mon, 13 Oct 2025 18:00:00 +0200</pubDate>
      <guid>https://rcwz.pl/2025-10-13-managing-secrets-with-1password-and-external-secrets/</guid>
      <description>&lt;p&gt;So far in this series, I&amp;rsquo;ve been putting secrets in 1Password vault and creating secrets with a &lt;code&gt;bootstrap.nu&lt;/code&gt; script that reads them from 1Password and creates &lt;code&gt;Secret&lt;/code&gt; resources in the cluster (using &lt;code&gt;kustomize&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;p&gt;In this post, I&amp;rsquo;ll add proper secret management to my Kubernetes cluster. I&amp;rsquo;ll be using 2 components:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developer.1password.com/docs/connect/&#34;&gt;&lt;strong&gt;1Password Connect&lt;/strong&gt;&lt;/a&gt; for syncing secrets from 1Password and exposing them via an in-cluster REST API,&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://external-secrets.io/&#34;&gt;&lt;strong&gt;External Secrets Operator&lt;/strong&gt;&lt;/a&gt; for syncing secrets from 1Password Connect to Kubernetes secrets.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;This setup will allow me to create &lt;code&gt;ExternalSecret&lt;/code&gt; resources in the cluster that contain references to secrets in 1Password vault. From these, &lt;code&gt;Secret&lt;/code&gt; resources will be automatically created and kept in sync.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Adding Cilium to a Talos cluster</title>
      <link>https://rcwz.pl/2025-10-08-adding-cilium-to-talos-cluster/</link>
      <pubDate>Wed, 08 Oct 2025 23:00:00 +0200</pubDate>
      <guid>https://rcwz.pl/2025-10-08-adding-cilium-to-talos-cluster/</guid>
      <description>&lt;p&gt;In today&amp;rsquo;s post, I will document how to install &lt;a href=&#34;https://cilium.io/&#34;&gt;Cilium&lt;/a&gt; on a Talos-managed Kubernetes cluster. Cilium is going to replace the default &lt;a href=&#34;https://github.com/flannel-io/flannel&#34;&gt;Flannel&lt;/a&gt; and &lt;a href=&#34;https://github.com/kubernetes/kubernetes/tree/master/cmd/kube-proxy&#34;&gt;&lt;code&gt;kube-proxy&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;As always, you can find all code in my &lt;a href=&#34;https://github.com/artuross/homelab&#34;&gt;homelab Git repository&lt;/a&gt; and all changes in this post are in &lt;a href=&#34;https://github.com/artuross/homelab/commit/e4ae409b9d0071ac437450751e78ce8b84a537bb&#34;&gt;this commit&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;p&gt;My cluster was created in the previous post. While most steps should be applicable to any Talos cluster, some steps may reuse files created in the previous post. If you haven&amp;rsquo;t set up a Talos cluster yet, please refer to the &lt;a href=&#34;https://rcwz.pl/2025-10-04-installing-talos-on-raspberry-pi-5/&#34;&gt;first post in the series&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Installing Talos on Raspberry Pi 5</title>
      <link>https://rcwz.pl/2025-10-04-installing-talos-on-raspberry-pi-5/</link>
      <pubDate>Sat, 04 Oct 2025 18:10:00 +0200</pubDate>
      <guid>https://rcwz.pl/2025-10-04-installing-talos-on-raspberry-pi-5/</guid>
      <description>&lt;p&gt;A few months ago, &lt;a href=&#34;https://github.com/siderolabs/sbc-raspberrypi/issues/23#issue-2563309502&#34;&gt;some smart folks&lt;/a&gt; have figured out patches required to make &lt;a href=&#34;https://www.talos.dev/&#34;&gt;Talos&lt;/a&gt; work on Raspberry Pi 5. As Talos is my favorite Kubernetes distro, I&amp;rsquo;ve been waiting for this moment for a long time. In this post, I&amp;rsquo;ll share all steps required to get Talos up and running on Raspberry Pi 5.&lt;/p&gt;&#xA;&lt;p&gt;Before we begin, you can find all files from this blog post in my &lt;a href=&#34;https://github.com/artuross/homelab&#34;&gt;&lt;code&gt;homelab&lt;/code&gt;&lt;/a&gt; repository, specifically commits &lt;a href=&#34;https://github.com/artuross/homelab/commit/b0f712519992e7cd3b2ce97bae838415cda750e7&#34;&gt;&lt;code&gt;b0f7125&lt;/code&gt;&lt;/a&gt; and &lt;a href=&#34;https://github.com/artuross/homelab/commit/24855553b9aeef4f25c3d6320477c6781426df27&#34;&gt;&lt;code&gt;2485555&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A case against migration files</title>
      <link>https://rcwz.pl/2025-04-03-a-case-against-migration-files/</link>
      <pubDate>Thu, 03 Apr 2025 18:50:00 +0200</pubDate>
      <guid>https://rcwz.pl/2025-04-03-a-case-against-migration-files/</guid>
      <description>&lt;p&gt;I never really understood the popularity of migration files. Sure enough, you need to somehow change schema from version A to version B and using SQL statements is the most straightforward way to do it, but surely, there has to be a better way, right..?&lt;/p&gt;&#xA;&lt;p&gt;What if I told you&amp;hellip; you don’t actually need migration files to manage your database schema — and your life would be way easier without them? No, I&amp;rsquo;m not advocating for an ORM.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Proxying WebSocket connections in Go</title>
      <link>https://rcwz.pl/2025-03-08-golang-websocket-proxy/</link>
      <pubDate>Sat, 08 Mar 2025 03:00:00 +0200</pubDate>
      <guid>https://rcwz.pl/2025-03-08-golang-websocket-proxy/</guid>
      <description>&lt;p&gt;Golang&amp;rsquo;s &lt;code&gt;net/http&lt;/code&gt; package provides built-in support for &lt;code&gt;http_proxy&lt;/code&gt; and &lt;code&gt;https_proxy&lt;/code&gt;.&#xA;This is awesome when developing apps locally, because one can use a tool like &lt;a href=&#34;https://proxyman.com/&#34;&gt;Proxyman&lt;/a&gt;&#xA;to watch the traffic.&lt;/p&gt;&#xA;&lt;p&gt;In a side project, I needed to use a WebSocket client. I used &lt;a href=&#34;https://github.com/gobwas/ws&#34;&gt;&lt;code&gt;github.com/gobwas/ws&lt;/code&gt;&lt;/a&gt;&#xA;and while proxy is not supported out of the box, it was very easy to add using &lt;a href=&#34;https://pkg.go.dev/golang.org/x/net/proxy&#34;&gt;&lt;code&gt;golang.org/x/net/proxy&lt;/code&gt;&lt;/a&gt;&#xA;which supports &lt;a href=&#34;https://en.wikipedia.org/wiki/SOCKS&#34;&gt;SOCKS5&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s the snippet:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&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;&#xA;&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;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&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;&#x9;&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;context&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&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;&#x9;&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&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;&#xA;&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;&#x9;&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;github.com/gobwas/ws&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&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;&#x9;&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;golang.org/x/net/proxy&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&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;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&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;&#xA;&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;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&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;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&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;&#x9;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;dialer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ws&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Dialer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&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;&#x9;&#x9;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;NetDial&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;nx&#34;&gt;proxy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Dial&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&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;&#x9;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&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;&#xA;&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;&#x9;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;conn&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;nx&#34;&gt;reader&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;nx&#34;&gt;_&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;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;dialer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Dial&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Background&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;s&#34;&gt;&amp;#34;wss://example.org/ws&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&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;&#x9;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&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;&#x9;&#x9;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Fatal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;connect to WebSocket server&amp;#34;&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;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&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;&#x9;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&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;&#xA;&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;&#x9;&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// ...&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&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;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Make sure to run your app with &lt;code&gt;ALL_PROXY&lt;/code&gt; env var (&lt;code&gt;all_proxy&lt;/code&gt; will work too):&lt;/p&gt;</description>
    </item>
    <item>
      <title>Manage Go tools with Go</title>
      <link>https://rcwz.pl/2023-07-21-manage-go-tools-with-go/</link>
      <pubDate>Fri, 21 Jul 2023 17:00:00 +0200</pubDate>
      <guid>https://rcwz.pl/2023-07-21-manage-go-tools-with-go/</guid>
      <description>&lt;p&gt;In almost any code, there comes a time when you need to use external tools for certain functionality. For example, you may want to use &lt;a href=&#34;https://github.com/golangci/golangci-lint&#34;&gt;&lt;code&gt;golangci-lint&lt;/code&gt;&lt;/a&gt; to lint your code, generate mocks with &lt;a href=&#34;https://github.com/golang/mock&#34;&gt;&lt;code&gt;mockgen&lt;/code&gt;&lt;/a&gt;, or run your DB schema migrations with &lt;a href=&#34;https://github.com/rubenv/sql-migrate&#34;&gt;&lt;code&gt;sql-migrate&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;There are few ways to achieve this: some projects use &lt;code&gt;Makefile&lt;/code&gt; to install dependencies, some other use &lt;code&gt;docker compose&lt;/code&gt; and run tools by running containers with mounted volumes.&lt;/p&gt;&#xA;&lt;p&gt;Today, I want to share a method that is known within Go community, but is still not frequently used.&lt;/p&gt;</description>
    </item>
    <item>
      <title>I&#39;m really bad at side projects</title>
      <link>https://rcwz.pl/2023-04-21-im-really-bad-at-side-projects/</link>
      <pubDate>Fri, 21 Apr 2023 17:00:00 +0200</pubDate>
      <guid>https://rcwz.pl/2023-04-21-im-really-bad-at-side-projects/</guid>
      <description>&lt;p&gt;I like side projects. Basically, my whole life is a side project after a side project after a side project. You&amp;rsquo;d think by now I must be some kind of a side project ninja, but no&amp;hellip; I almost never finish them.&lt;/p&gt;&#xA;&lt;p&gt;Before we dive deeper why I rarely finish my side projects, I want you to understand what a side project means &lt;em&gt;to me&lt;/em&gt;, as you may have a different definition. It&amp;rsquo;s a project that I work consistently on for at least few days. It does not need to become public one day nor it needs to become a potential revenue stream. Oftentimes, side projects are just about learning stuff that I consider interesting.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes is hard</title>
      <link>https://rcwz.pl/2023-03-26-kubernetes-is-hard/</link>
      <pubDate>Sun, 26 Mar 2023 16:21:00 +0200</pubDate>
      <guid>https://rcwz.pl/2023-03-26-kubernetes-is-hard/</guid>
      <description>&lt;p&gt;Recently, &lt;a href=&#34;https://37signals.com/&#34;&gt;37signals&lt;/a&gt; unveiled &lt;a href=&#34;https://github.com/mrsked/mrsk&#34;&gt;mrsk&lt;/a&gt;, a tool developed internally to ease with deployments of their services and an accompanying &lt;a href=&#34;https://dev.37signals.com/bringing-our-apps-back-home/&#34;&gt;blog post&lt;/a&gt; which sparked a lengthy &lt;a href=&#34;https://news.ycombinator.com/item?id=35263285&#34;&gt;discussion on Hacker News&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;is-kubernetes-hard&#34;&gt;Is Kubernetes hard?&lt;/h2&gt;&#xA;&lt;p&gt;Many commenters in the HN thread argued that Kubernetes is complex and I think they are partially right.&lt;/p&gt;&#xA;&lt;p&gt;Part of the complexity lies in it&amp;rsquo;s versatility, after all, you can run almost any workload on Kubernetes. That versatility means that resources must be composable. In other words, they must be like Lego, when you can join multiple pieces to build something meaningful. Take containers: in Kubernetes you don&amp;rsquo;t run containers on their own. Kubernetes has a concept of &lt;code&gt;Pods&lt;/code&gt; - a group of one or more containers tighly coupled. But even with &lt;code&gt;Pods&lt;/code&gt;, you are quite unlikely to run them on their own. You will usually run them via a &lt;code&gt;Deployment&lt;/code&gt;, &lt;code&gt;DaemonSet&lt;/code&gt; or a &lt;code&gt;StatefulSet&lt;/code&gt;. That&amp;rsquo;s before you&amp;rsquo;ve even exposed the service to the outside world.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
