<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Zammad Podman Quadlets on Spoljarevic's Knowledgebase</title><link>https://kb-migration.spoljarevic.sh/Big-Projects/Zammad-Podman-Quadlets/</link><description>Recent content in Zammad Podman Quadlets on Spoljarevic's Knowledgebase</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Sun, 05 Jul 2026 18:47:44 +0200</lastBuildDate><atom:link href="https://kb-migration.spoljarevic.sh/Big-Projects/Zammad-Podman-Quadlets/index.xml" rel="self" type="application/rss+xml"/><item><title>Introduction</title><link>https://kb-migration.spoljarevic.sh/Big-Projects/Zammad-Podman-Quadlets/Introduction/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kb-migration.spoljarevic.sh/Big-Projects/Zammad-Podman-Quadlets/Introduction/</guid><description>&lt;h2 id="what-is-zammad"&gt;What is Zammad?&#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://zammad.org/"&gt;Zammad&lt;/a&gt; is an open-source ticket system. A ticket system is essential for any IT&#10;sysadmin — it organizes user problems into tickets and lets you document everything you did to solve them,&#10;instead of losing that history in email or chat.&lt;/p&gt;&#10;&lt;h2 id="what-are-quadlets"&gt;What are Quadlets?&#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html"&gt;Quadlets&lt;/a&gt; are a Podman feature that&#10;lets you describe containers, pods, networks, and volumes as native &lt;strong&gt;systemd unit files&lt;/strong&gt;. &lt;code&gt;systemd&lt;/code&gt;&#10;generates the actual &lt;code&gt;.service&lt;/code&gt; units from them at boot/login, so Podman containers get managed exactly&#10;like any other systemd service — restarted on failure, started in dependency order, and started&#10;automatically without a separate compose daemon running in the background.&lt;/p&gt;</description></item><item><title>Usage</title><link>https://kb-migration.spoljarevic.sh/Big-Projects/Zammad-Podman-Quadlets/Usage/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kb-migration.spoljarevic.sh/Big-Projects/Zammad-Podman-Quadlets/Usage/</guid><description>&lt;h2 id="prerequisites"&gt;Prerequisites&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;A recent &lt;a href="https://podman.io/"&gt;Podman&lt;/a&gt; version with Quadlet support (Podman 4.4+; check with &lt;code&gt;podman --version&lt;/code&gt;).&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;systemd&lt;/code&gt; (used both as the rootless user&amp;rsquo;s &lt;code&gt;systemd --user&lt;/code&gt; instance and, optionally, system-wide).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="1-configure-your-environment"&gt;1. Configure your environment&#10;&lt;/h2&gt;&#10;&lt;p&gt;Copy the example environment file and fill in your own values:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-7d2906f7-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="sh" data-td-line-count="2"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-7d2906f7-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp .env.example .env&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$EDITOR&lt;/span&gt; .env&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;At minimum, review and change the database/Elasticsearch credentials (&lt;code&gt;POSTGRES_PASS&lt;/code&gt;, &lt;code&gt;ELASTICSEARCH_PASS&lt;/code&gt;),&#10;&lt;code&gt;ZAMMAD_FQDN&lt;/code&gt;, &lt;code&gt;TZ&lt;/code&gt;, and the backup schedule (&lt;code&gt;BACKUP_TIME&lt;/code&gt;, &lt;code&gt;HOLD_DAYS&lt;/code&gt;). Everything under &amp;ldquo;PROXY / EXTERNAL&#10;ACCESS&amp;rdquo; and &amp;ldquo;Cloudflare Tunnel&amp;rdquo; in &lt;code&gt;.env.example&lt;/code&gt; is optional and commented out by default.&lt;/p&gt;</description></item><item><title>Code Explanation</title><link>https://kb-migration.spoljarevic.sh/Big-Projects/Zammad-Podman-Quadlets/Code-Explanation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kb-migration.spoljarevic.sh/Big-Projects/Zammad-Podman-Quadlets/Code-Explanation/</guid><description>&lt;h2 id="anatomy-of-a-quadlet-unit"&gt;Anatomy of a Quadlet unit&#10;&lt;/h2&gt;&#10;&lt;p&gt;Every &lt;code&gt;.container&lt;/code&gt; file in this repo follows the same shape:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-9f43d6d1-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="ini" data-td-line-count="18"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-9f43d6d1-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;After&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;zammad.pod ... # start order&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Requires&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;zammad.pod ... # hard dependency&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;PartOf&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;zammad.pod # stop/restart together with the pod&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Container]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;ContainerName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Pod&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;zammad.pod # joins the shared pod network namespace&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;... # command run inside the Zammad image for this role&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;EnvironmentFile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;.env&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Service]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;RestartSec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Install]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;default.target # lets systemctl enable start it at boot/login&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&lt;code&gt;PartOf=zammad.pod&lt;/code&gt; means stopping or restarting the pod stops/restarts the container with it.&#10;&lt;code&gt;Pod=zammad.pod&lt;/code&gt; puts every container in the same network namespace, so they can reach each other over&#10;&lt;code&gt;localhost&lt;/code&gt; instead of needing container-to-container DNS.&lt;/p&gt;</description></item><item><title>FAQ</title><link>https://kb-migration.spoljarevic.sh/Big-Projects/Zammad-Podman-Quadlets/FAQ/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kb-migration.spoljarevic.sh/Big-Projects/Zammad-Podman-Quadlets/FAQ/</guid><description>&lt;h3 id="why-quadlets-instead-of-docker-compose--podman-compose"&gt;Why Quadlets instead of &lt;code&gt;docker-compose&lt;/code&gt; / &lt;code&gt;podman-compose&lt;/code&gt;?&#10;&lt;/h3&gt;&#10;&lt;p&gt;Quadlets translate directly into native systemd units, so Podman containers get systemd&amp;rsquo;s process&#10;supervision, dependency ordering, and boot/login integration for free — no separate compose daemon needs to&#10;keep running in the background, and it works cleanly rootless.&lt;/p&gt;&#10;&lt;h3 id="can-i-really-run-this-rootless"&gt;Can I really run this rootless?&#10;&lt;/h3&gt;&#10;&lt;p&gt;Yes — that&amp;rsquo;s the point of this setup. Place the unit files in &lt;code&gt;~/.config/containers/systemd/&lt;/code&gt;, run&#10;&lt;code&gt;systemctl --user daemon-reload&lt;/code&gt;, and use &lt;code&gt;loginctl enable-linger &amp;lt;user&amp;gt;&lt;/code&gt; so the services keep running even&#10;when you&amp;rsquo;re logged out. See &lt;a href="https://kb-migration.spoljarevic.sh/Big-Projects/Zammad-Podman-Quadlets/Usage/"&gt;Usage&lt;/a&gt; for the full steps.&lt;/p&gt;</description></item></channel></rss>