<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ops on 7nolikov | Dmitrii Novikov</title><link>https://7nolikov.dev/categories/ops/</link><description>Recent content in Ops on 7nolikov | Dmitrii Novikov</description><generator>Hugo</generator><language>en-US</language><managingEditor>7nolikov@gmail.com (Dmitrii Novikov)</managingEditor><webMaster>7nolikov@gmail.com (Dmitrii Novikov)</webMaster><copyright>Dmitrii Novikov</copyright><lastBuildDate>Mon, 01 Jan 0001 00:00:00 +0000</lastBuildDate><atom:link href="https://7nolikov.dev/categories/ops/index.xml" rel="self" type="application/rss+xml"/><item><title>Caddy</title><link>https://7nolikov.dev/notes/caddy/</link><pubDate>Fri, 21 Aug 2026 00:00:00 +0000</pubDate><author>7nolikov@gmail.com (Dmitrii Novikov)</author><guid>https://7nolikov.dev/notes/caddy/</guid><description>&lt;p&gt;A web server that gets HTTPS right by default. Point it at a domain and it obtains and renews the certificate itself, with no cron job and no certbot.&lt;/p&gt;
&lt;p&gt;A whole reverse proxy config is two lines:&lt;/p&gt;
&lt;figure class="codeblock not-prose relative scroll-mt-8" id="codeblock-01"&gt;
 &lt;aside
 class="absolute right-0 top-0 hidden rounded-bl-sm rounded-tr-sm bg-white/10 px-2 py-1 text-white/70 transition-opacity md:inline-block"
 &gt;
 &lt;div class="codeblock-meta flex max-w-xs flex-row items-center space-x-3"&gt;
 &lt;div class="small-caps shrink cursor-default truncate font-mono text-xs" aria-hidden="true"&gt;
 &lt;span class="relative"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;div&gt;
 &lt;clipboard-copy
 type="button"
 aria-label="Copy code to clipboard"
 title="Copy code to clipboard"
 class="block cursor-pointer transition-colors hover:text-sky-400"
 target="#codeblock-01 code"
 &gt;
 &lt;svg
 xmlns="http://www.w3.org/2000/svg"
 fill="none"
 stroke="currentColor"
 stroke-width="2"
 stroke-linecap="round"
 stroke-linejoin="round"
 class="lucide lucide-clipboard h-4 w-4"
 viewBox="0 0 24 24"
&gt;
 &lt;rect width="8" height="4" x="8" y="2" rx="1" ry="1" /&gt;
 &lt;path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2" /&gt;
&lt;/svg&gt;

 &lt;/clipboard-copy&gt;
 &lt;/div&gt;
 &lt;div&gt;
 &lt;a
 href="#codeblock-01"
 class="block"
 aria-label="Link to this code block"
 title="Link to this code block"
 &gt;
 &lt;svg
 xmlns="http://www.w3.org/2000/svg"
 width="16"
 height="16"
 fill="none"
 stroke="currentColor"
 stroke-linecap="round"
 stroke-linejoin="round"
 stroke-width="2"
 class="lucide lucide-link w-4 h-4 block"
 viewBox="0 0 24 24"
&gt;
 &lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71" /&gt;
 &lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71" /&gt;
&lt;/svg&gt;

 &lt;/a&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/aside&gt;
 &lt;p class="sr-only"&gt; code snippet start&lt;/p&gt;</description></item><item><title>Distroless container images</title><link>https://7nolikov.dev/notes/distroless/</link><pubDate>Fri, 21 Aug 2026 00:00:00 +0000</pubDate><author>7nolikov@gmail.com (Dmitrii Novikov)</author><guid>https://7nolikov.dev/notes/distroless/</guid><description>&lt;p&gt;Base images containing your application and its runtime dependencies, and nothing else. No shell, no package manager, no utilities.&lt;/p&gt;
&lt;p&gt;The trade-off against Alpine, which is the usual alternative:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Distroless&lt;/strong&gt; has the smaller attack surface - with no shell in the image, a lot of privilege escalation and post-exploitation techniques simply have nothing to run. The static variant is around 2MB. The cost is debugging: you cannot exec in and look around, because there is nothing to exec. In Kubernetes you attach an ephemeral container instead.&lt;/p&gt;</description></item><item><title>Dokku - a small PaaS on your own box</title><link>https://7nolikov.dev/notes/dokku/</link><pubDate>Fri, 21 Aug 2026 00:00:00 +0000</pubDate><author>7nolikov@gmail.com (Dmitrii Novikov)</author><guid>https://7nolikov.dev/notes/dokku/</guid><description>&lt;p&gt;&lt;code&gt;git push&lt;/code&gt; to your own server and it builds, containerises and runs your app behind a reverse proxy with a TLS certificate. Heroku&amp;rsquo;s workflow on a VPS you control.&lt;/p&gt;
&lt;p&gt;It handles the parts that are tedious to assemble by hand: buildpack or Dockerfile detection, environment variables, zero-downtime restarts, database plugins, Let&amp;rsquo;s Encrypt.&lt;/p&gt;
&lt;p&gt;One thing to know before you commit: Dokku officially supports Debian and Ubuntu LTS. Pairing it with an immutable container OS looks appealing and does not work - Dokku installs via apt and owns nginx and the container lifecycle, which is exactly what an immutable OS refuses to let it do.&lt;/p&gt;</description></item><item><title>Reproducible Builds</title><link>https://7nolikov.dev/notes/reproducible-builds/</link><pubDate>Fri, 21 Aug 2026 00:00:00 +0000</pubDate><author>7nolikov@gmail.com (Dmitrii Novikov)</author><guid>https://7nolikov.dev/notes/reproducible-builds/</guid><description>&lt;p&gt;A set of practices for making a build produce a bit-for-bit identical artifact every time from the same source.&lt;/p&gt;
&lt;p&gt;The reason it matters is supply chain: if the binary you ship cannot be reproduced from the source you published, nobody - including you - can verify that the two correspond. Reproducibility turns &amp;ldquo;trust the build server&amp;rdquo; into something checkable by anyone.&lt;/p&gt;
&lt;p&gt;The things that break it are mundane and everywhere: embedded timestamps, absolute paths, locale, filesystem ordering, and anything that hashes a map iterated in random order. The site catalogues each one and how to fix it.&lt;/p&gt;</description></item><item><title>Uncloud - Compose for production</title><link>https://7nolikov.dev/notes/uncloud/</link><pubDate>Fri, 21 Aug 2026 00:00:00 +0000</pubDate><author>7nolikov@gmail.com (Dmitrii Novikov)</author><guid>https://7nolikov.dev/notes/uncloud/</guid><description>&lt;p&gt;Fills the gap between &amp;ldquo;docker compose on a VPS&amp;rdquo; and Kubernetes. Clustering, automatic HTTPS, service discovery, a WireGuard mesh between machines - without a control plane.&lt;/p&gt;
&lt;p&gt;The design choice I find interesting: there is no central control plane at all. Every machine holds the full cluster state in a CRDT-backed distributed SQLite, syncing peer to peer. No etcd, no leader election, and the cluster keeps working when machines go offline.&lt;/p&gt;</description></item></channel></rss>