<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Home Lab Blog</title>
        <link>http://localhost/documentation/blog</link>
        <description>Home Lab Blog</description>
        <lastBuildDate>Thu, 08 Oct 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Driving the whole stack from iac-ctl]]></title>
            <link>http://localhost/documentation/blog/driving-the-stack-with-iac-ctl</link>
            <guid>http://localhost/documentation/blog/driving-the-stack-with-iac-ctl</guid>
            <pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[iac-ctl is an interactive terminal UI that runs each deployer's automation from one session, so you]]></description>
            <content:encoded><![CDATA[<p><code>iac-ctl</code> is an interactive terminal UI that runs each deployer's automation from one session, so you
don't <code>cd</code> into every repo and run its playbook by hand.</p>
<p>Install it with <code>uv sync</code> and start it with <code>uv run iac-ctl</code>. The menu follows the deployment order.
The playbook-based deployer actions (Vault, DevOps server, and application) list the repo's hosts and
tags, ask you to pick at least one of each, confirm, and then run the playbook. The onboarding and
dashboard actions list the repo's console scripts instead, and run the one you pick.</p>
<p>Actions that read from Vault check connectivity first, and the footer shows a warning when Vault is
unreachable or <code>DEVOPS_SERVER_INVENTORY_HOSTNAME</code> is missing from the config's <code>extra_vars</code>. See the
<a class="" href="http://localhost/documentation/controller#controller-tool">controller tool docs</a> for every menu action.</p>]]></content:encoded>
            <category>iac-ctl</category>
            <category>tooling</category>
        </item>
        <item>
            <title><![CDATA[Vault as the platform's shared secrets store]]></title>
            <link>http://localhost/documentation/blog/vault-shared-secrets</link>
            <guid>http://localhost/documentation/blog/vault-shared-secrets</guid>
            <pubDate>Mon, 05 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[devops-server-deployer, devops-server-onboarding, and application-deployer read their secrets]]></description>
            <content:encoded><![CDATA[<p><code>devops-server-deployer</code>, <code>devops-server-onboarding</code>, and <code>application-deployer</code> read their secrets
from one mTLS-secured Vault KV store. <code>vault-deployer</code> deploys that store, so it takes its secrets from
the environment instead. Nothing secret is committed to a repo.</p>
<p>Each of those repos needs five values to reach Vault: <code>VAULT_API_ENDPOINT</code>, <code>VAULT_API_KEY</code>, and three
base64-encoded PEM values for the CA certificate, client certificate, and client key. The three PEM
values are decoded to temporary files at runtime.</p>
<p>Vault paths are scoped by <code>CS_PROJECT_CODE</code>, which is mandatory wherever it appears. An internal Root
CA, also stored in Vault, signs every internal TLS certificate, including the PostgreSQL server and
client certificates.</p>]]></content:encoded>
            <category>vault</category>
            <category>security</category>
        </item>
        <item>
            <title><![CDATA[Why the platform deploys in a fixed order]]></title>
            <link>http://localhost/documentation/blog/deployment-order</link>
            <guid>http://localhost/documentation/blog/deployment-order</guid>
            <pubDate>Thu, 01 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The platform deploys in one order: vault-deployer, devops-server-deployer, devops-server-onboarding,]]></description>
            <content:encoded><![CDATA[<p>The platform deploys in one order: <code>vault-deployer</code>, <code>devops-server-deployer</code>, <code>devops-server-onboarding</code>,
<code>application-deployer</code>, then <code>dashboard</code>. Each stage after the first depends on something an earlier
stage produced.</p>
<p>Vault goes first because every other repo reads its secrets and per-host config from it. The DevOps
server comes next. Its PyPI mirror, shared PostgreSQL server, and source-hosting service all run on one
host, and the PostgreSQL stage also seeds Vault with the downstream database credentials.</p>
<p>Onboarding then provisions users and publishes artifacts to the DevOps server's registries.
<code>application-deployer</code> installs its dependencies from the <code>devops-server</code> package registry, so it can't
run before that. The dashboard goes last because it links to, and monitors, everything else.</p>
<p>See the <a class="" href="http://localhost/documentation/">architecture notes</a> for the full picture.</p>]]></content:encoded>
            <category>architecture</category>
            <category>deployment</category>
        </item>
    </channel>
</rss>