<?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>iTrooz&#39;s website</title>
    <link>https://itrooz.fr/</link>
    <description>Recent content on iTrooz&#39;s website</description>
    <generator>Hugo -- 0.159.1</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 29 Mar 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://itrooz.fr/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Avoid granting s3:DeleteObjectVersion by mistake in MinIO</title>
      <link>https://itrooz.fr/posts/delete_objects_permission_minio/</link>
      <pubDate>Sun, 29 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://itrooz.fr/posts/delete_objects_permission_minio/</guid>
      <description>&lt;p&gt;This article is an answer to my bug report here: &lt;a href=&#34;https://github.com/minio/minio/issues/21735&#34;&gt;https://github.com/minio/minio/issues/21735&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;context&#34;&gt;Context&lt;/h1&gt;
&lt;p&gt;S3 buckets can be configured to keep old versions of objects when overwriting/deleting them. This is called a &lt;a href=&#34;https://docs.aws.amazon.com/AmazonS3/latest/userguide/manage-versioning-examples.html&#34;&gt;versioned bucket&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Calling &lt;code&gt;DeleteObject&lt;/code&gt; on an object in a versioned bucket will not really delete it, but mark it as so with a &lt;em&gt;delete marker&lt;/em&gt;. The object will appear deleted, but can still be viewed/deleted by specifying its &lt;code&gt;versionId&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This behaviour is really useful, for example for backups, where you want a client to upload its backups, but not be able to delete them all instantly. In this case, you would allow the client to do &lt;code&gt;DeleteObject&lt;/code&gt; calls, but not &lt;code&gt;DeleteObjectVersion&lt;/code&gt;, and clean up old versions periodically.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using nftables as your firewall</title>
      <link>https://itrooz.fr/posts/using_nftables_as_firewall/</link>
      <pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://itrooz.fr/posts/using_nftables_as_firewall/</guid>
      <description>&lt;p&gt;I love nftables. I&amp;rsquo;ve personally found it to be both more simple and featureful compared to other mainstream firewall services.&lt;/p&gt;
&lt;p&gt;It can be configured from a file with a simple yet powerful syntax, allowing you to create simple port-blocking rules, but also precisely classify and act on traffic.&lt;/p&gt;
&lt;p&gt;Plus, it can be used side by side with other firewall-like services running on your Linux machine, allowing it to be deployed nearly everywhere without disturbing existing applications.&lt;/p&gt;</description>
    </item>
    <item>
      <title>My tweaks to Arch Linux package management</title>
      <link>https://itrooz.fr/posts/my_tweaks_to_arch_package_management/</link>
      <pubDate>Tue, 09 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://itrooz.fr/posts/my_tweaks_to_arch_package_management/</guid>
      <description>&lt;p&gt;The Arch Linux package management is &lt;em&gt;great&lt;/em&gt;. But there are some things I had to change to fit my workflow. There are listed here.&lt;/p&gt;
&lt;h1 id=&#34;force-yourself-to-read-arch-news-before-upgrading&#34;&gt;Force yourself to read Arch news before upgrading&lt;/h1&gt;
&lt;p&gt;Arch Linux will sometimes upload package updates that will break your systems. On the top of my head, I can think of &lt;a href=&#34;https://archlinux.org/news/grub-bootloader-upgrade-and-configuration-incompatibilities/&#34;&gt;a grub update breaking my system in 2022&lt;/a&gt;, or &lt;a href=&#34;https://archlinux.org/news/linux-firmware-2025061312fe085f-5-upgrade-requires-manual-intervention/&#34;&gt;linux-firmware in 2025&lt;/a&gt;.&lt;br&gt;
While these breakages are rare, they can happen, and they can leave your computer unusable after an update. Arch Linux expects you to read the &lt;a href=&#34;https://archlinux.org/news/&#34;&gt;Arch News&lt;/a&gt; and be aware of them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to make RKE2 share port 80/443 with another application</title>
      <link>https://itrooz.fr/posts/rke2_share_port_80/</link>
      <pubDate>Wed, 12 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://itrooz.fr/posts/rke2_share_port_80/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;TLDR; destination-IP NAT that redirects to RKE2&amp;rsquo;s ingress input chain&lt;/p&gt;
&lt;p&gt;I recently had to make my RKE2 cluster cohabitate with an in-house service running on the same machines, and also exposing a website through port 80.&lt;/p&gt;
&lt;p&gt;The obvious problem here is: RKE2 clusters (most of the time) also need to listen on port 80 in order to make our RKE2-hosted websites work. So, how do we share port 80 between RKE2, and another application ?&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to create encrypted Kubernetes backups with Velero</title>
      <link>https://itrooz.fr/posts/velero_encrypted_backups/</link>
      <pubDate>Thu, 02 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://itrooz.fr/posts/velero_encrypted_backups/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Velero allows you to create backups of your k8s cluster. It handles both the resources (the yaml files), and the volumes. But it has a drawback (as of writing): the lack of encryption. In this post, we&amp;rsquo;re going to see how we can produce encrypted backups, by chaining velero with rclone.&lt;/p&gt;
&lt;p&gt;The key point of this post is: rclone is awesome and a Ops&amp;rsquo;s dream tool. In our case, the 2 features of rclone that we will use are its &lt;a href=&#34;https://rclone.org/crypt/&#34;&gt;crypt&lt;/a&gt; remote, and its &lt;a href=&#34;https://rclone.org/commands/rclone_serve_s3/&#34;&gt;serve (s3)&lt;/a&gt; feature.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to backup your bitwarden vault with restic ?</title>
      <link>https://itrooz.fr/posts/bitwarden_restic_backup/</link>
      <pubDate>Fri, 26 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://itrooz.fr/posts/bitwarden_restic_backup/</guid>
      <description>&lt;p&gt;My goal is to make a daily backup of my bitwarden vault, using restic. I also want to not store my master password on disk, which means backuping the encrypted vault.&lt;/p&gt;
&lt;p&gt;The solution to do that is to use a &lt;a href=&#34;https://bitwarden.com/help/personal-api-key/&#34;&gt;Bitwarden API key&lt;/a&gt;. API keys do not seem to have the capability to decrypt the vault, as you need to &lt;a href=&#34;https://bitwarden.com/help/cli/#unlock&#34;&gt;enter your master password yourself&lt;/a&gt; to unlock the vault before viewing items, which make them the perfect tool for the job.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Automating renewal of a wildcard TLS certificate for a specific subdomain on a OHV domain</title>
      <link>https://itrooz.fr/posts/ovh_dns_zone_tls/</link>
      <pubDate>Sun, 14 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://itrooz.fr/posts/ovh_dns_zone_tls/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Recently, I wanted to create a bunch of domains on my friend&amp;rsquo;s server, and have TLS certificates delivered.&lt;br&gt;
The option I find easiest to manage certificates is to ask my CA (Lets Encrypt) for a single, wildcard TLS certificate (e.g. &lt;code&gt;*.itrooz.fr&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;If you are using OVH to manage your domain, you can do that automatically by creating an API key for your account, and using the certbot OVH plugin to create/renew the certificate.&lt;br&gt;
Usually, tutorials will tell you to give &lt;a href=&#34;https://supersonique-studio.com/2020/06/creation-de-certificats-lets-encrypt-a-travers-les-dns-ovh-dns-01-challenge/&#34;&gt;these permissiont to the API key&lt;/a&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why do I use &#39;GPL-2.0-only OR GPL-3.0-or-later with proxy being me&#39; as licence for my Open Source projects ?</title>
      <link>https://itrooz.fr/posts/gpl_licence/</link>
      <pubDate>Sun, 27 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://itrooz.fr/posts/gpl_licence/</guid>
      <description>&lt;p&gt;If you stumble on one of my projects, you may have seen this licence:&lt;br&gt;
Licence: GPL-2.0-only OR GPL-3.0-or-later with proxy being me&lt;/p&gt;
&lt;p&gt;What does that mean ? Why did I choose such a long, and weird licence ?&lt;/p&gt;
&lt;p&gt;The reason is that I want:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;to be covered by a strong copyleft licence&lt;/li&gt;
&lt;li&gt;while being compatible with past/future GPL licences (and not block my project from being used with one that uses a different version of the GPL.)&lt;/li&gt;
&lt;li&gt;and not give power to the FSF to issue a new licence in the future that I would not agree with.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The solution to this last point is the proxy clause. Quoting GPL 3.0:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Connect a docker container to a WireGuard VPN (while keeping it accessible to other containers)</title>
      <link>https://itrooz.fr/posts/connect_container_to_wireguard/</link>
      <pubDate>Sun, 01 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://itrooz.fr/posts/connect_container_to_wireguard/</guid>
      <description>&lt;p&gt;A friend of mine wanted to make one of their docker containers go through Wireguard to connect to Internet. I came up with a solution using a docker container to manage the wireguard VPN itself. This allows us to fully isolate the VPN, and use &lt;code&gt;AllowedIPs=0.0.0.0/0&lt;/code&gt; without affecting the rest of the system.&lt;/p&gt;
&lt;p&gt;This solution is both simple technically (we just share the same network namespaces) and in usage (just add another container, without even changing the original).&lt;/p&gt;</description>
    </item>
    <item>
      <title>A list of Celeste/Everest bugs I&#39;ve encountered, and how to fix them</title>
      <link>https://itrooz.fr/posts/celeste_bugs/</link>
      <pubDate>Sun, 20 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://itrooz.fr/posts/celeste_bugs/</guid>
      <description>&lt;p&gt;This is a list of bugs I&amp;rsquo;ve encountered while playing Celeste/Everest with the Olympus launcher, and how to fix them.&lt;/p&gt;
&lt;h2 id=&#34;1&#34;&gt;1&lt;/h2&gt;
&lt;p&gt;Bugged light, I can see squares with &amp;ldquo;more light&amp;rdquo;, that makes gameplay hard to see&lt;br&gt;
Solution: replace OpenGL renderer with Vulkan. There are several ways to do this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;if using Everest, you need to find everest-launch.txt (in your Celeste install folder) and change &lt;code&gt;#--graphics OpenGL&lt;/code&gt; to &lt;code&gt;--graphics Vulkan&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;if using vanilla Celeste, you need to add &lt;code&gt;/gldevice:Vulkan&lt;/code&gt; to CLI arguments (you can do that with launch options in Steam)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Link: &lt;a href=&#34;https://www.reddit.com/r/celestegame/comments/1bnan6m/comment/m6nly5c/?context=3&#34;&gt;https://www.reddit.com/r/celestegame/comments/1bnan6m/comment/m6nly5c/?context=3&lt;/a&gt;&lt;br&gt;
Link 2: &lt;a href=&#34;https://www.reddit.com/r/linux_gaming/comments/1hmrtu0/comment/m4jzvgj/&#34;&gt;https://www.reddit.com/r/linux_gaming/comments/1hmrtu0/comment/m4jzvgj/&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>My keys</title>
      <link>https://itrooz.fr/keys/</link>
      <pubDate>Thu, 29 Dec 2022 00:00:00 +0000</pubDate>
      <guid>https://itrooz.fr/keys/</guid>
      <description>&lt;h1 id=&#34;gpg&#34;&gt;GPG&lt;/h1&gt;
&lt;p&gt;Fingerprint: 92C8321FDA1200B12D9D998B89F62F0E9713B474&lt;/p&gt;
&lt;p&gt;Plaintext:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;-----BEGIN PGP PUBLIC KEY BLOCK-----

mDMEY6y3txYJKwYBBAHaRw8BAQdASoDOhj6vX0sc+4Toufnf2sYxFwQ5bLFVfkSR
ejiA6oS0FmlUcm9veiA8aGV5QGl0cm9vei5mcj6IkAQTFggAOBYhBJLIMh/aEgCx
LZ2Zi4n2Lw6XE7R0BQJjrLe3AhsBBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJ
EIn2Lw6XE7R0HnQA/1VndlLMct2EnMnWozY4xgUbOxDdT9cLCiM00xj+t4cLAP9j
Ir6DzNK7eeJKnc4+KlwdZ5PtODLeO4JGpnWNXPViArgzBGOst9gWCSsGAQQB2kcP
AQEHQOShsuf58WC2s8PZpzVQNv2qQmqNcLuYXeiSJ5QHeASziO8EGBYIACAWIQSS
yDIf2hIAsS2dmYuJ9i8OlxO0dAUCY6y32AIbAgCBCRCJ9i8OlxO0dHYgBBkWCAAd
FiEEnwiC6rCK4fnHsY5Ji4P3dmexvGoFAmOst9gACgkQi4P3dmexvGrbwQD/WMrG
mVI4TCI3vDgPiDmeSyFcf9bH/u0rJ2+7OmIo8+QA/0kih1Ch8VSnNBIIrB1suQCh
FgJ9abSZdzBKpiMCvLwIdMQBAOK6451xoDgWnzv/aKAV9tOD1Q22/Joy4k+LpatP
4QlIAQCIn1+2ui3EcU+1bnMIW15e1zLutZo4ChAxf6vn3UA3Cbg4BGOsuEMSCisG
AQQBl1UBBQEBB0BCmEO2/ZEkSY3pICMaTMLxQDMu9VL58Dn0QmN4aYfRZAMBCAeI
eAQYFggAIBYhBJLIMh/aEgCxLZ2Zi4n2Lw6XE7R0BQJjrLhDAhsMAAoJEIn2Lw6X
E7R0ohcA/R3wpMiEyX42e9X5DXlI8RhLnVF9/gyn948DK7QwXOtJAQC5JnOmp4pm
Swf+18RyBFJeohfz+NVoP2hXHYGNqBrDCw==
=Q1Kg
-----END PGP PUBLIC KEY BLOCK-----
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;age&#34;&gt;age&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;age16p0ldj27uhqs7gucxznf4vmarw0sqa35dfn8zhth9nk6xev6svas7femma&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>About</title>
      <link>https://itrooz.fr/about/</link>
      <pubDate>Mon, 28 Nov 2022 00:00:00 +0000</pubDate>
      <guid>https://itrooz.fr/about/</guid>
      <description>&lt;p&gt;hello there !&lt;br&gt;
My name is &lt;strong&gt;iTrooz&lt;/strong&gt;, I&amp;rsquo;m a software engineering student.&lt;/p&gt;
&lt;p&gt;Computers, and especially software has been a passion of mine since my youth. I like to touch at everything, from Linux to data science &lt;em&gt;except web frontend&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;That said, I particulary like low level stuff and reverse-engineering, and generally speaking poking at computers with a stick&lt;/p&gt;
&lt;p&gt;You can contact me here :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href=&#34;https://github.com/iTrooz&#34;&gt;https://github.com/iTrooz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitLab: &lt;a href=&#34;https://gitlab.com/iTrooz&#34;&gt;https://gitlab.com/iTrooz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Discord: @iTrooz (old username: iTrooz#2050)&lt;/li&gt;
&lt;li&gt;Matrix: @itrooz_:matrix.org&lt;/li&gt;
&lt;li&gt;Email: 
&lt;style&gt;
  #span-bca4b5ef.cloaked-e-mail:before {
    content:attr(data-domain) &#34;\0040&#34; attr(data-user);
    unicode-bidi:bidi-override;
    direction:rtl;
  }
&lt;/style&gt;
&amp;#32;&lt;span class=&#34;cloaked-e-mail&#34; data-user=&#34;yeh&#34; data-domain=&#34;rf.zoorti&#34; id=&#34;span-bca4b5ef&#34;&gt;&lt;/span&gt;&amp;#32;

&lt;script id=&#34;script-bca4b5ef&#34;&gt;
  var scriptTag = document.getElementById(&#34;script-bca4b5ef&#34;);
  var link = document.createElement(&#34;a&#34;);
  var address = &#34;yeh&#34;.split(&#39;&#39;).reverse().join(&#39;&#39;) + &#34;@&#34; + &#34;rf.zoorti&#34;.split(&#39;&#39;).reverse().join(&#39;&#39;);
  link.href = &#34;mailto&#34; + &#34;:&#34; + address;
  link.innerText = address.split(&#39;?&#39;)[0];
  scriptTag.parentElement.insertBefore(link, scriptTag.previousElementSibling);
  scriptTag.parentElement.removeChild(scriptTag.previousElementSibling)
&lt;/script&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to contact me &amp;ldquo;securely&amp;rdquo;, you can take a look at &lt;a href=&#34;https://itrooz.fr/keys/&#34;&gt;my keys&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Legal info</title>
      <link>https://itrooz.fr/legal/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://itrooz.fr/legal/</guid>
      <description>&lt;p&gt;The domain &lt;code&gt;itrooz.fr&lt;/code&gt; is hosted by OVH. Their contact information can be found here: &lt;a href=&#34;https://www.ovhcloud.com/fr/terms-and-conditions/&#34;&gt;https://www.ovhcloud.com/fr/terms-and-conditions/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The following information about you is collected:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IP address and User agent, stored in the webserver log files. This information is only used for technical diagnostic, is not shared with anyone, and is deleted after 14 days.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://plausible.io/data-policy&#34;&gt;The following information&lt;/a&gt; (region and city excluded), stored in an aggregated/anonymised way, through the self-hosted analytics platform &lt;a href=&#34;https://plausible.io/&#34;&gt;Plausible&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can request your information to be deleted by contacting me. (See &lt;a href=&#34;https://itrooz.fr/about/&#34;&gt;About&lt;/a&gt;)&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
