<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Gitops on Matty Spangler</title>
    <link>https://mattyspangler.codeberg.page/tags/gitops/</link>
    <description>Recent content in Gitops on Matty Spangler</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 08 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://mattyspangler.codeberg.page/tags/gitops/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Etckeeper on Kicksecure</title>
      <link>https://mattyspangler.codeberg.page/posts/kicksecure-etckeeper/</link>
      <pubDate>Sun, 08 Mar 2026 00:00:00 +0000</pubDate>
      
      <guid>https://mattyspangler.codeberg.page/posts/kicksecure-etckeeper/</guid>
      <description>&lt;p&gt;This article is part of my &lt;a href=&#34;../kicksecure-self-hosting/&#34;&gt;Self-Hosting with Kicksecure&lt;/a&gt; series.&lt;/p&gt;
&lt;h2 id=&#34;1-introduction&#34;&gt;1. Introduction&lt;/h2&gt;
&lt;p&gt;Before making any system changes, I want to decide on a way to record every change I make so that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I can easily reproduce my work if I ever have to reinstall or migrate to another machine&lt;/li&gt;
&lt;li&gt;I can easily identify problematic configs and revert them&lt;/li&gt;
&lt;li&gt;I don&amp;rsquo;t forget the reasoning behind a particular security decision or config change in 6 months&lt;/li&gt;
&lt;li&gt;I can identify what changes I made as opposed to changes made by software or other people&lt;/li&gt;
&lt;li&gt;I can compare the current state of my configs against a &amp;lsquo;known-good&amp;rsquo; config&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;code&gt;/etc&lt;/code&gt; directory will contain most of my configs. Outside of /etc I will need to pay attention to my dotfiles which I like to manage with GNU Stow.&lt;/p&gt;</description>
      <content>&lt;p&gt;This article is part of my &lt;a href=&#34;../kicksecure-self-hosting/&#34;&gt;Self-Hosting with Kicksecure&lt;/a&gt; series.&lt;/p&gt;
&lt;h2 id=&#34;1-introduction&#34;&gt;1. Introduction&lt;/h2&gt;
&lt;p&gt;Before making any system changes, I want to decide on a way to record every change I make so that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I can easily reproduce my work if I ever have to reinstall or migrate to another machine&lt;/li&gt;
&lt;li&gt;I can easily identify problematic configs and revert them&lt;/li&gt;
&lt;li&gt;I don&amp;rsquo;t forget the reasoning behind a particular security decision or config change in 6 months&lt;/li&gt;
&lt;li&gt;I can identify what changes I made as opposed to changes made by software or other people&lt;/li&gt;
&lt;li&gt;I can compare the current state of my configs against a &amp;lsquo;known-good&amp;rsquo; config&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;code&gt;/etc&lt;/code&gt; directory will contain most of my configs. Outside of /etc I will need to pay attention to my dotfiles which I like to manage with GNU Stow.&lt;/p&gt;
&lt;p&gt;Etckeeper is a neat piece of software that turns &lt;code&gt;/etc&lt;/code&gt; into a git repository. It automatically commits changes before and after package installations, and I can manually commit my own changes too.&lt;/p&gt;
&lt;h2 id=&#34;2-installation&#34;&gt;2. Installation&lt;/h2&gt;
&lt;p&gt;Kicksecure protects itself by isolating system maintainence tasks from daily activity. This means administrative tasks like installing new software cannot be performed from the standard user account, even with sudo. You have to reboot and select an option to boot into a session with the sysmaint account, make your changes, and then reboot back into the standard user session to continue with daily usage.&lt;/p&gt;
&lt;p&gt;Having booted with sysmaint, I install Etckeeper from the Debian repositories:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install etckeeper
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;3-etckeeper-basics&#34;&gt;3. Etckeeper Basics&lt;/h2&gt;
&lt;p&gt;Do the standard git stuff:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git config --global user.email &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;person@email.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git config --global user.name &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;I&amp;#39;m a person with a name!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;I start by initializing the repository:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;```&lt;/span&gt;bash
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd /etc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;etckeeper init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And making my initial commit:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;etckeeper commit &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Initial configuration snapshot&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Etckeeper hooks into apt. When I install or remove packages, it automatically commits them to the git repo. So I don&amp;rsquo;t need to worry about doing a commit myself! I only need to commit after I make manual changes in /etc.&lt;/p&gt;
&lt;p&gt;For configuration changes I make outside of apt:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# within /etc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;etckeeper commit &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Descriptive message about what changed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;4-viewing-history&#34;&gt;4. Viewing History&lt;/h2&gt;
&lt;p&gt;Standard git commands work:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd /etc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git log --oneline
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;View a specific change:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git show COMMIT_HASH
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Compare two states:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git diff COMMIT_HASH1 COMMIT_HASH2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;5-the-gitignore-file&#34;&gt;5. The .gitignore File&lt;/h2&gt;
&lt;p&gt;Some files in &lt;code&gt;/etc&lt;/code&gt; shouldn&amp;rsquo;t be tracked: temporary files, secrets, or auto-generated content.&lt;/p&gt;
&lt;p&gt;On my server I ended up configuring a ZFS RAID. Here&amp;rsquo;s an example of excluding tracking of my ZFS cache with a few other things in &lt;code&gt;/etc/.gitignore&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# Ignore auto-generated ZFS cache
/zfs/zfs-list.cache/

# Example: ignore temporary files
*.tmp
*.swp
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After editing:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add .gitignore
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;etckeeper commit &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Updated gitignore to exclude my auto-generated ZFS cache&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;6-backups&#34;&gt;6. Backups&lt;/h2&gt;
&lt;p&gt;Always back up your changes so you have access to these records if your system breaks! In my case, I back up to a local &amp;lsquo;bare repository&amp;rsquo; on my BTRFS backup drive. I explain how I set up this drive on Kicksecure in a &lt;a href=&#34;../kicksecure-btrfs-storage/&#34;&gt;later post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Additionally, because I&amp;rsquo;d like to be able to identify known-good states of my configs even if an attacker compromises my server or network, I sanatize + compress + back up my data (or just the hashes for big files) to an air-gapped system regularly using something similar to a &lt;a href=&#34;https://en.wikipedia.org/wiki/Unidirectional_network&#34;&gt;data diode&lt;/a&gt;. The air gap setup is beyond the scope of this post, but I thought the suggestion might interest readers!&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how I back up my /etc repo:&lt;/p&gt;
&lt;h3 id=&#34;61-create-a-bare-repository&#34;&gt;6.1. Create a Bare Repository&lt;/h3&gt;
&lt;p&gt;On my already mounted BTRFS storage:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p /mnt/storage_name/host_vault/kicksecure-etckeeper.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git init --bare /mnt/storage_name/host_vault/kicksecure-etckeeper.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;62-add-as-remote&#34;&gt;6.2. Add as Remote&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd /etc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git remote add localvault /mnt/storage_name/host_vault/kicksecure-etckeeper.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;63-push-changes&#34;&gt;6.3. Push Changes&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git push -u localvault main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Future pushes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git push localvault
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;64-push-after-every-commit&#34;&gt;6.4. Push After Every Commit&lt;/h3&gt;
&lt;p&gt;This became a habit:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;etckeeper commit &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Made a change&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; git push localvault
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;7-what-to-track&#34;&gt;7. What to Track&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s what I have tracked so far in &lt;code&gt;/etc&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/fstab&lt;/code&gt; - Mount point config&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/crypttab&lt;/code&gt; - Encrypted drive config&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/ufw/&lt;/code&gt; - Firewall rules&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/ssh/&lt;/code&gt; - SSH configuration&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/permission-hardener.d/&lt;/code&gt; - Kicksecure permission whitelists&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/systemd/system/&lt;/code&gt; - Custom systemd units&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/modprobe.d/&lt;/code&gt; - Kernel module configuration&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;8-whats-next&#34;&gt;8. What&amp;rsquo;s Next&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;../kicksecure-btrfs-storage/&#34;&gt;Encrypted BTRFS Storage on Kicksecure&lt;/a&gt;&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Self-Hosting with Kicksecure</title>
      <link>https://mattyspangler.codeberg.page/posts/kicksecure-self-hosting/</link>
      <pubDate>Fri, 06 Mar 2026 00:00:00 +0000</pubDate>
      
      <guid>https://mattyspangler.codeberg.page/posts/kicksecure-self-hosting/</guid>
      <description>&lt;h2 id=&#34;1-intro&#34;&gt;1. Intro&lt;/h2&gt;
&lt;p&gt;I formerly self-hosted my services on a Kubernetes cluster with FluxCD inside openSUSE MicroOS VMs hosted by Proxmox. While that was really flexible, it became a burden maintaining it in my freetime and demanded too much RAM and storage on my resource-constrained servers. I still want to keep my K8s cluster around for tinkering in my homelab, but for a personal setup that I need to &amp;ldquo;just work&amp;rdquo; for NAS, git hosting, and backups, the complexity didn&amp;rsquo;t justify the benefits.&lt;/p&gt;</description>
      <content>&lt;h2 id=&#34;1-intro&#34;&gt;1. Intro&lt;/h2&gt;
&lt;p&gt;I formerly self-hosted my services on a Kubernetes cluster with FluxCD inside openSUSE MicroOS VMs hosted by Proxmox. While that was really flexible, it became a burden maintaining it in my freetime and demanded too much RAM and storage on my resource-constrained servers. I still want to keep my K8s cluster around for tinkering in my homelab, but for a personal setup that I need to &amp;ldquo;just work&amp;rdquo; for NAS, git hosting, and backups, the complexity didn&amp;rsquo;t justify the benefits.&lt;/p&gt;
&lt;p&gt;Yet, I loved my former workflows: GitOps, infrastructure as code, and declarative container management. I wanted to manage my self-hosting from a git repository. That&amp;rsquo;s how I landed on &lt;strong&gt;etckeeper&lt;/strong&gt; for managing my base system and &lt;strong&gt;Podman quadlets&lt;/strong&gt; for managing my container services declaratively with systemd.&lt;/p&gt;
&lt;p&gt;There was one more criteria I wanted to meet&amp;hellip;&lt;/p&gt;
&lt;h2 id=&#34;2-why-kicksecure&#34;&gt;2. Why Kicksecure?&lt;/h2&gt;
&lt;p&gt;I also don&amp;rsquo;t have enough time in my day to exhaustively follow hardening guides. I&amp;rsquo;d prefer an opinionated, secure by default system. I evaluated several options before choosing Kicksecure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Secureblue&lt;/strong&gt; looks promising! But I&amp;rsquo;m more comfortable with Debian-based systems, and I wasn&amp;rsquo;t familiar with its development background and whether the project is reputable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NixOS and Gentoo&lt;/strong&gt; were considered. Gentoo could be a really secure option but would have been another maintenance burden. NixOS might have worked since I daily drive it on my gaming PC and I&amp;rsquo;ve already gone through some hardening guides so I could copy my existing configs. Unfortunately I ran into a known bug preventing NixOS/GuixSD from booting with Heads on my server. Heads is a security focused distribution based on the coreboot open source BIOS based with features to prevent boot tampering, and rather than toiling against this bug I opted to go with the next option:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kicksecure&lt;/strong&gt; is connected to the same team behind Whonix which I already use! Whonix is a well-established project and it currently fits my constraints.&lt;/p&gt;
&lt;p&gt;Kicksecure does need extra configuration to work with podman, but it turned out to be much more manageable than my old stack.&lt;/p&gt;
&lt;h2 id=&#34;3-retrospective&#34;&gt;3. Retrospective&lt;/h2&gt;
&lt;p&gt;By the end of this project, I had assembled:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An etckeeper managed Kicksecure server&lt;/li&gt;
&lt;li&gt;An encrypted BTRFS storage with subvolumes for backing up extremely critical stuff&lt;/li&gt;
&lt;li&gt;Rootless Podman containers managed with git tracked systemd quadlets&lt;/li&gt;
&lt;li&gt;A running Gitea instance with SSH access on port 4022&lt;/li&gt;
&lt;li&gt;Firewall rules restricting access to only necessary ports&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;31-posts-in-this-series&#34;&gt;3.1 Posts in this series&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;m documenting my journey through the setup process in these posts:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Step&lt;/th&gt;
					&lt;th&gt;Article&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;1&lt;/td&gt;
					&lt;td&gt;&lt;a href=&#34;../kicksecure-etckeeper/&#34;&gt;Etckeeper GitOps on Kicksecure&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;Keep track of all my Kicksecure configuration changes from the start&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2&lt;/td&gt;
					&lt;td&gt;&lt;a href=&#34;../kicksecure-btrfs-storage/&#34;&gt;Encrypted BTRFS Storage on Kicksecure&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;Configuring server storage on BTRFS subvolumes with LUKS encryption&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;3&lt;/td&gt;
					&lt;td&gt;&lt;a href=&#34;../kicksecure-podman-permissions/&#34;&gt;Podman Permissions on Kicksecure&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;Allowing rootless Podman to use newuidmap/newgidmap via Kicksecure&amp;rsquo;s Permission Hardener&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;4&lt;/td&gt;
					&lt;td&gt;&lt;a href=&#34;../kicksecure-podman-quadlets/&#34;&gt;Podman Quadlets on Kicksecure&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;Deploying containers with Git-tracked Podman quadlets and UFW firewall&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Additionally, I flashed and locked down Heads/coreboot, installed an open source zero trust mesh VPN for remote access, deployed host-based IDS, moved server management to Ansible roles, and set up a Nextcloud instance utilizing storage on a ZFS RAID 10 array with 4x 8TB HDD&amp;rsquo;s. In the future I hope to expand this series with posts detailing those efforts, as well as posts further exploring Kicksecure&amp;rsquo;s nifty security features.&lt;/p&gt;
</content>
    </item>
    
  </channel>
</rss>
