<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Steven Koch</title>
    <description>The latest articles on DEV Community by Steven Koch (@stevius10).</description>
    <link>https://dev.to/stevius10</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3371299%2F3bc3a337-f3da-4ec2-a0fe-80a05391526e.jpg</url>
      <title>DEV Community: Steven Koch</title>
      <link>https://dev.to/stevius10</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stevius10"/>
    <language>en</language>
    <item>
      <title>Proxmox-GitOps: Selfhosted GitOps IaC Container Automation</title>
      <dc:creator>Steven Koch</dc:creator>
      <pubDate>Sat, 27 Sep 2025 10:04:04 +0000</pubDate>
      <link>https://dev.to/stevius10/proxmox-gitops-a-self-contained-cicd-control-plane-for-proxmox-ve-5hmb</link>
      <guid>https://dev.to/stevius10/proxmox-gitops-a-self-contained-cicd-control-plane-for-proxmox-ve-5hmb</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; This post introduces Proxmox-GitOps, a system that creates a self-managing CI/CD control plane for Proxmox VE. It bootstraps from a single repository and manages itself recursively within the LXC containers it oversees.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
Proxmox-GitOps implements a self-contained CI/CD control plane for Proxmox VE that bootstraps from a single repository and manages itself recursively within the LXC containers under management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/stevius10/Proxmox-GitOps" rel="noopener noreferrer"&gt;stevius10/Proxmox-GitOps&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demo (1min+):&lt;/strong&gt;&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/2oXDgbvFCWY"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;A local bootstrap script (&lt;code&gt;./local/run.sh&lt;/code&gt;) seeds a Gitea instance and a runner, initializes the pipeline, and creates an initial pull request. Merging this PR transitions the system into full self-management. From that point on, subsequent commits automatically converge the desired state across all Proxmox LXC containers.&lt;/p&gt;

&lt;p&gt;The system uses a self-contained monorepo with reusable container libraries. Ansible handles provisioning against Proxmox, while Cinc (a Chef distribution) performs desired-state convergence and cross-layer orchestration where declarative modeling is insufficient.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo24vf98l3fb6fh8cy2di.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo24vf98l3fb6fh8cy2di.jpeg" alt="Architecture"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  Core Concepts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Recursive Self-Management:&lt;/strong&gt; The control plane executes from within the managed containers to maximize reproducibility and minimize configuration drift.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git as Current Desired State:&lt;/strong&gt; All operations map to standard Git workflows (commit, merge, rollback) in a completely stateless management model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Convention-Based Extensibility:&lt;/strong&gt; Add a new service by copying a container definition from the &lt;code&gt;libs&lt;/code&gt; directory, adding a minimal cookbook and a &lt;code&gt;config.env&lt;/code&gt; file. The pipeline automatically handles provisioning, configuration, and validation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loose Coupling:&lt;/strong&gt; Containers remain independently replaceable and continue to function without requiring manual follow-up actions after changes.&lt;/li&gt;
&lt;/ul&gt;



&lt;h2&gt;
  
  
  Environment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Proxmox VE:&lt;/strong&gt; Versions 8.4–9.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container OS:&lt;/strong&gt; Debian 13 LXC by default&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bootstrap:&lt;/strong&gt; Local bootstrap via Docker; all further actions are repository-driven.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl85y4j0l0zdydq5khz8f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl85y4j0l0zdydq5khz8f.png" alt="Environment"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; Configure your Proxmox credentials in &lt;code&gt;./local/config.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the bootstrap script to seed the environment:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./local/run.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Accept the initial Pull Request in the newly seeded Gitea instance at &lt;code&gt;http://localhost:8080/main/config&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Push any changes to your repository to trigger provisioning, convergence, and validation on Proxmox VE.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;



&lt;h2&gt;
  
  
  Trade-Offs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The recursive bootstrap model increases initial complexity to preserve "rebuild-from-repo" semantics and ensure deterministic behavior.&lt;/li&gt;
&lt;li&gt;On Proxmox 9, stricter token privileges limit certain operations. The automation therefore uses root-context API access where token permissions are insufficient.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F66giro937wpa05071s52.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F66giro937wpa05071s52.jpeg" alt="Overview"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gitops</category>
      <category>proxmox</category>
      <category>devops</category>
      <category>homelab</category>
    </item>
    <item>
      <title>Proxmox-GitOps: Self-configuring GitOps Environment for Container Automation in Proxmox VE.</title>
      <dc:creator>Steven Koch</dc:creator>
      <pubDate>Mon, 28 Jul 2025 16:02:11 +0000</pubDate>
      <link>https://dev.to/stevius10/proxmox-gitops-self-configuring-gitops-environment-for-container-automation-in-proxmox-ve-2lke</link>
      <guid>https://dev.to/stevius10/proxmox-gitops-self-configuring-gitops-environment-for-container-automation-in-proxmox-ve-2lke</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Proxmox-GitOps implements a self-sufficient, extensible CI/CD environment for provisioning, configuring, and orchestrating Linux Containers (LXC) within Proxmox VE. Leveraging an Infrastructure-as-Code approach, it manages the complete container lifecycle—bootstrapping, deployment, configuration, and validation—via version-controlled automation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The system architecture is based on a multi-stage pipeline capable of recursively deploying and configuring itself. Initial bootstrapping is performed via a local Docker environment, with subsequent deployments targeting Proxmox VE.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F80ldywsqu9f060hfs4b5.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F80ldywsqu9f060hfs4b5.jpeg" alt=" " width="800" height="695"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Concepts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ephemeral State&lt;/strong&gt;: Git repository represents current desired state; state purity across deployments.
Deployment consistency and stateless infrastructure over version history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recursive Self-Containment&lt;/strong&gt;: Embedded control plane recursively provisions itself within target containers. Prevents configuration drift; enables consistent and reproducible behavior.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mono-Repository&lt;/strong&gt;: Central code artifact; submodules modularize development at runtime. Consistency and modularity; dynamically resolved in recursive context.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnq7gq9gr737wqgiqlgkg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnq7gq9gr737wqgiqlgkg.png" alt=" " width="720" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Trade-offs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Complexity vs. Autonomy&lt;/strong&gt;: Recursive self-replication increases system complexity to achieve deterministic bootstrap and reproducible behavior.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git Convention vs. Infrastructure State&lt;/strong&gt;: Uses Git as a state engine in stateless contexts; the mono-repo encapsulates infrastructure as a self-contained, version-controlled asset.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgws4cr411jk1mum6no4c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgws4cr411jk1mum6no4c.png" alt=" " width="720" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Feedback
&lt;/h2&gt;

&lt;p&gt;Architectural feedback, edge cases, and use-case experiences are welcome.&lt;br&gt;
The project is under active development; suggestions and critical review are appreciated.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;GitHub: stevius10/&lt;a href="https://github.com/stevius10/Proxmox-GitOps/blob/main/README.md" rel="noopener noreferrer"&gt;Proxmox-GitOps&lt;/a&gt;&lt;/p&gt;

</description>
      <category>proxmox</category>
      <category>gitops</category>
      <category>automation</category>
      <category>iac</category>
    </item>
    <item>
      <title>Self-Configuring GitOps for Proxmox: Recursive LXC Automation as Code</title>
      <dc:creator>Steven Koch</dc:creator>
      <pubDate>Sun, 20 Jul 2025 05:15:40 +0000</pubDate>
      <link>https://dev.to/stevius10/self-configuring-gitops-for-proxmox-recursive-lxc-automation-as-code-58k0</link>
      <guid>https://dev.to/stevius10/self-configuring-gitops-for-proxmox-recursive-lxc-automation-as-code-58k0</guid>
      <description>&lt;p&gt;GitHub: &lt;a href="https://github.com/stevius10/Proxmox-GitOps/tree/main" rel="noopener noreferrer"&gt;stevius10/Proxmox-GitOps&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Proxmox-GitOps is a self-configuring CI/CD environment for Proxmox LXC.&lt;br&gt;
It manages container provisioning, configuration, and orchestration using an infrastructure-as-code workflow.&lt;br&gt;
All automation is version-controlled and idempotent.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa9afkwkhbqic6rfcmjmg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa9afkwkhbqic6rfcmjmg.png" alt="Demo" width="720" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works&lt;/strong&gt;&lt;br&gt;
    • Bootstrap locally in Docker (one command)&lt;br&gt;
    • CI/CD pipeline pushes codebase into a Gitea instance&lt;br&gt;
    • Recursive self-configuration: The pipeline triggers itself in every new container environment (“pipeline within a pipeline”)&lt;br&gt;
    • Provisioning with Ansible (Proxmox API)&lt;br&gt;
    • Configuration with Chef/Cinc (application logic)&lt;br&gt;
    • Consistent, modular: base config and workflows apply to all services, changes propagate automatically&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;• Self-managed, self-verifying infrastructure
• Full lifecycle: bootstrapping, deployment, configuration, validation
• Recursive, idempotent execution
• Modular and extensible (add container modules, adapt pipelines)
• Pure GitOps: all state and change managed via commits and PRs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who is this for?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Primarily built for my own homelab, but extensible for anyone who wants to automate and codify their Proxmox environment—without manual steps.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feedback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This project is still young and likely has rough edges.&lt;br&gt;
I would be very interested in technical feedback, ideas, or just what you are thinking.&lt;br&gt;
So, if you’re into Proxmox, GitOps, CI/CD, and infrastructure-as-code - or just to moan together recursion in an actually not idempotent Git based automation — feel free to check it out 🙂&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;GitHub: stevius10/Proxmox-GitOps&lt;/p&gt;

</description>
      <category>devops</category>
      <category>automation</category>
      <category>infrastructureascode</category>
      <category>proxmox</category>
    </item>
  </channel>
</rss>
