<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title>Guide - series - Sergey Chulanov&#39;s site</title>
        <link>https://dodcaf.ru/series/guide/</link>
        <description>Guide - series - Sergey Chulanov&#39;s site</description>
        <generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>tty8747@gmail.com (Sergey Chulanov)</managingEditor>
            <webMaster>tty8747@gmail.com (Sergey Chulanov)</webMaster><lastBuildDate>Tue, 15 Sep 2026 00:00:00 &#43;0000</lastBuildDate><atom:link href="https://dodcaf.ru/series/guide/" rel="self" type="application/rss+xml" /><item>
    <title>ZFS RAIDZ2 with ZFSBootMenu: A Fault-Tolerant 4-Disk NAS</title>
    <link>https://dodcaf.ru/zfs-raidz2-with-zfsbootmenu-a-fault-tolerant-4-disk-nas/</link>
    <pubDate>Tue, 15 Sep 2026 00:00:00 &#43;0000</pubDate>
    <author>tty8747@gmail.com (Sergey Chulanov)</author>
    <guid>https://dodcaf.ru/zfs-raidz2-with-zfsbootmenu-a-fault-tolerant-4-disk-nas/</guid>
    <description><![CDATA[<p>In my <a href="/install-ubuntu-on-zfs-mirror-with-zfsbootmenu/" rel="">previous article</a>, I described how to install Ubuntu on a ZFS mirror and boot it using ZFSBootMenu.</p>
<p>This time, the goal is more ambitious: build a proper four-disk NAS where both the operating system and user data live on a single ZFS RAIDZ2 pool, while still being able to boot the machine after losing one or even two physical disks.</p>
<p>I also wanted to avoid a dedicated boot SSD.</p>]]></description>
</item>
<item>
    <title>Run managed Samba and S3 storage on Ubuntu 26.04 with ZFS</title>
    <link>https://dodcaf.ru/run-samba-and-s3-storage-on-ubuntu-26.04-with-zfs/</link>
    <pubDate>Sun, 28 Jun 2026 11:30:00 &#43;0300</pubDate>
    <author>tty8747@gmail.com (Sergey Chulanov)</author>
    <guid>https://dodcaf.ru/run-samba-and-s3-storage-on-ubuntu-26.04-with-zfs/</guid>
    <description><![CDATA[<p>This guide turns one Ubuntu 26.04 LTS server with a ZFS pool into a small
LAN-only NAS. Samba, Cockpit, and the 45Drives management plugins run together
in an Incus system container. Garage provides an S3-compatible API from a
Docker container on the host.</p>
<p>Keeping Samba and its management interface in the same system container gives
Cockpit direct access to the Unix users, groups, Samba password database, and
service it manages. It avoids synchronizing <code>/etc/passwd</code>, <code>smb.conf</code>, or
<code>passdb.tdb</code> between application containers.</p>]]></description>
</item>
<item>
    <title>Run WireGuard and WireGuard UI behind Traefik</title>
    <link>https://dodcaf.ru/wireguard-ui-traefik/</link>
    <pubDate>Sat, 27 Jun 2026 12:00:00 &#43;0300</pubDate>
    <author>tty8747@gmail.com (Sergey Chulanov)</author>
    <guid>https://dodcaf.ru/wireguard-ui-traefik/</guid>
    <description><![CDATA[<p>This guide deploys a small VPN gateway on a public Ubuntu virtual machine.
Traefik is the only container that publishes host ports:</p>
<ul>
<li>TCP <code>80</code> and <code>443</code> for HTTPS and Let&rsquo;s Encrypt;</li>
<li>UDP <code>51820</code> for WireGuard;</li>
<li>WireGuard UI and the Traefik dashboard are available only over HTTPS.</li>
</ul>
<p>This setup does not require a separate router or port forwarding. The virtual
machine must have a public IP address, and its cloud firewall must allow
incoming TCP <code>80</code>, TCP <code>443</code>, and UDP <code>51820</code> traffic.</p>]]></description>
</item>
<item>
    <title>Forcing an ext4 filesystem check on the next reboot</title>
    <link>https://dodcaf.ru/forcing-an-ext4-filesystem-check-on-the-next-reboot/</link>
    <pubDate>Tue, 02 Jun 2026 09:27:51 &#43;0300</pubDate>
    <author>tty8747@gmail.com (Sergey Chulanov)</author>
    <guid>https://dodcaf.ru/forcing-an-ext4-filesystem-check-on-the-next-reboot/</guid>
    <description><![CDATA[<h2 id="forcing-an-ext4-filesystem-check-on-the-next-reboot-with-tune2fs">Forcing an ext4 Filesystem Check on the Next Reboot with <code>tune2fs</code></h2>
<p>Sometimes you need to verify an ext4 filesystem, but the filesystem is mounted and cannot safely be repaired online. This is especially common when the filesystem is the root filesystem, such as <code>/dev/md0</code> mounted as <code>/</code>.</p>
<p>Running <code>fsck</code> directly on a mounted filesystem is not a safe way to repair it:</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <button type="button" class="code-title" aria-label="Toggle code block"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></button>
        <span class="ellipses" aria-hidden="true"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <button type="button" class="copy" aria-label="Copy code" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></button>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo fsck -n -f /dev/md0</span></span></code></pre></div></div>
<p>The <code>-n</code> option makes it read-only, so it will not fix anything. Also, because the filesystem is mounted, the result may be noisy or misleading. For a real repair check, <code>fsck</code> must run before the filesystem is mounted, usually during boot.</p>]]></description>
</item>
<item>
    <title>Run docker image for arm64 on amd64</title>
    <link>https://dodcaf.ru/run-docker-image-for-arm64-on-amd64/</link>
    <pubDate>Tue, 04 Mar 2025 22:16:22 &#43;0300</pubDate>
    <author>tty8747@gmail.com (Sergey Chulanov)</author>
    <guid>https://dodcaf.ru/run-docker-image-for-arm64-on-amd64/</guid>
    <description><![CDATA[<p>Display the host architecture</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <button type="button" class="code-title" aria-label="Toggle code block"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></button>
        <span class="ellipses" aria-hidden="true"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <button type="button" class="copy" aria-label="Copy code" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></button>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">uname -m
</span></span><span class="line"><span class="cl">x86_64</span></span></code></pre></div></div>
<p>Let&rsquo;s try run image with <code>arm64</code>. We&rsquo;ve got an error</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <button type="button" class="code-title" aria-label="Toggle code block"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></button>
        <span class="ellipses" aria-hidden="true"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <button type="button" class="copy" aria-label="Copy code" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></button>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker run --rm -t arm64v8/ubuntu uname -m
</span></span><span class="line"><span class="cl">WARNING: The requested image<span class="err">&#39;</span>s platform <span class="o">(</span>linux/arm64/v8<span class="o">)</span> does not match the detected host platform <span class="o">(</span>linux/amd64/v3<span class="o">)</span> and no specific platform was requested 
</span></span><span class="line"><span class="cl"><span class="nb">exec</span> /usr/bin/uname: <span class="nb">exec</span> format error</span></span></code></pre></div></div>
<p>Install the qemu packages</p>]]></description>
</item>
<item>
    <title>Install Ubuntu on ZFS with ZFSBootMenu</title>
    <link>https://dodcaf.ru/install-ubuntu-on-zfs-mirror-with-zfsbootmenu/</link>
    <pubDate>Mon, 03 Feb 2025 00:25:01 &#43;0300</pubDate>
    <author>tty8747@gmail.com (Sergey Chulanov)</author>
    <guid>https://dodcaf.ru/install-ubuntu-on-zfs-mirror-with-zfsbootmenu/</guid>
    <description><![CDATA[<blockquote>
<p><strong>Tested on:</strong> Ubuntu 26.04 LTS (Resolute), x86_64, UEFI</p>
</blockquote>
<p>This guide installs a minimal Ubuntu system directly on ZFS. It supports three
root-pool layouts:</p>
<table>
	<thead>
			<tr>
					<th style="text-align: left">Layout</th>
					<th style="text-align: right">Minimum disks</th>
					<th style="text-align: right">Disk failures tolerated</th>
					<th style="text-align: left">Rough RAID equivalent</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td style="text-align: left">Mirror</td>
					<td style="text-align: right">2</td>
					<td style="text-align: right">1</td>
					<td style="text-align: left">RAID1</td>
			</tr>
			<tr>
					<td style="text-align: left">RAIDZ1</td>
					<td style="text-align: right">3</td>
					<td style="text-align: right">1</td>
					<td style="text-align: left">RAID5</td>
			</tr>
			<tr>
					<td style="text-align: left">RAIDZ2</td>
					<td style="text-align: right">4</td>
					<td style="text-align: right">2</td>
					<td style="text-align: left">RAID6</td>
			</tr>
	</tbody>
</table>
<p>The installation flow is the same for every layout. Only the <code>zpool create</code>
command changes.</p>
<p>The procedure follows the official
<a href="https://docs.zfsbootmenu.org/en/v3.1.x/guides/ubuntu/uefi.html" target="_blank" rel="noopener noreffer ">ZFSBootMenu Ubuntu UEFI guide</a>,
adapted for redundant pools and an EFI System Partition (ESP) on every disk.</p>]]></description>
</item>
<item>
    <title>Persist Always on Visible Workspace</title>
    <link>https://dodcaf.ru/persist-always-on-visible-workspace/</link>
    <pubDate>Fri, 31 Jan 2025 13:39:17 &#43;0300</pubDate>
    <author>tty8747@gmail.com (Sergey Chulanov)</author>
    <guid>https://dodcaf.ru/persist-always-on-visible-workspace/</guid>
    <description><![CDATA[<p>| Ubuntu 22.04</p>
<blockquote>
<p>It doesn&rsquo;t work on Wayland, only on Xorg</p>
</blockquote>
<p>Install devilspie2 an create test config for Mozilla Firefox</p>
<div class="code-block code-line-numbers" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <button type="button" class="code-title" aria-label="Toggle code block"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></button>
        <span class="ellipses" aria-hidden="true"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <button type="button" class="copy" aria-label="Copy code" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></button>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt install devilspie2
</span></span><span class="line"><span class="cl">mkdir -pv ~/.config/devilspie2
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">cat <span class="s">&lt;&lt;EOF &gt; /home/goto/.config/devilspie2/firefox.lua
</span></span></span><span class="line"><span class="cl"><span class="s">if (string.match(get_window_name(), &#34;Mozilla Firefox&#34;)) then
</span></span></span><span class="line"><span class="cl"><span class="s">    stick_window();
</span></span></span><span class="line"><span class="cl"><span class="s">--  maximize();
</span></span></span><span class="line"><span class="cl"><span class="s">end
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">devilspie2 --debug</span></span></code></pre></div></div>
<p>Mozilla Firefox should open in maximize and be visible on all workspaces</p>]]></description>
</item>
<item>
    <title>User systemd service</title>
    <link>https://dodcaf.ru/user-systemd-service/</link>
    <pubDate>Tue, 07 Jan 2025 15:08:39 &#43;0300</pubDate>
    <author>tty8747@gmail.com (Sergey Chulanov)</author>
    <guid>https://dodcaf.ru/user-systemd-service/</guid>
    <description><![CDATA[<p>| Ubuntu 22.04</p>
<p>All of users&rsquo; systemd have to place in directory ~/.config/systemd/user/</p>
<blockquote>
<p>If you want start user systemd unit when user login, run:</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <button type="button" class="code-title" aria-label="Toggle code block"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></button>
        <span class="ellipses" aria-hidden="true"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <button type="button" class="copy" aria-label="Copy code" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></button>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">systemctl --user <span class="nb">enable</span> &lt;service&gt;</span></span></code></pre></div></div>
</blockquote>
<p>List of available types of systemd units:</p>
<div class="code-block code-line-numbers" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <button type="button" class="code-title" aria-label="Toggle code block"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></button>
        <span class="ellipses" aria-hidden="true"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <button type="button" class="copy" aria-label="Copy code" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></button>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">systemctl -t <span class="nb">help</span>
</span></span><span class="line"><span class="cl">Available unit types:
</span></span><span class="line"><span class="cl">service
</span></span><span class="line"><span class="cl">mount
</span></span><span class="line"><span class="cl">swap
</span></span><span class="line"><span class="cl">socket
</span></span><span class="line"><span class="cl">target
</span></span><span class="line"><span class="cl">device
</span></span><span class="line"><span class="cl">automount
</span></span><span class="line"><span class="cl">timer
</span></span><span class="line"><span class="cl">path
</span></span><span class="line"><span class="cl">slice
</span></span><span class="line"><span class="cl">scope</span></span></code></pre></div></div>
<p>Create user systemd file to make ssh connection:</p>]]></description>
</item>
<item>
    <title>Ceph on isolated environment</title>
    <link>https://dodcaf.ru/ceph-on-isolated-environment/</link>
    <pubDate>Wed, 27 Nov 2024 11:33:56 &#43;0300</pubDate>
    <author>tty8747@gmail.com (Sergey Chulanov)</author>
    <guid>https://dodcaf.ru/ceph-on-isolated-environment/</guid>
    <description><![CDATA[<blockquote>
<p>Ubuntu 22.04 on all nodes</p>
</blockquote>
<ul>
<li><a href="https://docs.ceph.com/en/squid/cephadm/install/#single-host" target="_blank" rel="noopener noreffer ">Ceph on single host</a></li>
<li><a href="https://docs.ceph.com/en/squid/cephadm/install/#deployment-in-an-isolated-environment" target="_blank" rel="noopener noreffer ">Ceph on isolated environment</a></li>
</ul>
<h2 id="lets-prepare-our-network-environment-to-deploy-ceph-without-the-internet">Let&rsquo;s prepare our network environment to deploy Ceph without the Internet</h2>
<p>We need to create 6 nodes:</p>
<ul>
<li>3 for ceph installation (ceph1, ceph2, ceph3)</li>
<li>1 for apt repository (aptly)</li>
<li>1 for docker registry (harbor)</li>
<li>1 for dns server (infra)</li>
</ul>
<p>Also we need set up 3 networks:</p>
<ul>
<li><code>Ceph Internal</code> to connect only ceph nodes to each other</li>
<li><code>Internal</code> to connect ceph, aptly and harbor nodes</li>
<li><code>vLan</code> to connect aptly and harbor nodes to the internet</li>
</ul>
<p>And we need a dns server to resolve names connected with ip pools:</p>]]></description>
</item>
<item>
    <title>Aptly deb repository</title>
    <link>https://dodcaf.ru/aptly-deb-repository/</link>
    <pubDate>Wed, 20 Nov 2024 00:37:07 &#43;0300</pubDate>
    <author>tty8747@gmail.com (Sergey Chulanov)</author>
    <guid>https://dodcaf.ru/aptly-deb-repository/</guid>
    <description><![CDATA[<blockquote>
<p><strong>Tested on:</strong> Ubuntu 22.04</p>
</blockquote>
<h2 id="install-aptly">Install Aptly</h2>
<p>Official instruction <a href="https://www.aptly.info/download/" target="_blank" rel="noopener noreffer ">here</a>:</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <button type="button" class="code-title" aria-label="Toggle code block"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></button>
        <span class="ellipses" aria-hidden="true"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <button type="button" class="copy" aria-label="Copy code" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></button>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;deb [signed-by=/etc/apt/keyrings/aptly.asc] http://repo.aptly.info/ squeeze main&#34;</span> <span class="p">|</span> sudo tee /etc/apt/sources.list.d/aptly.list
</span></span><span class="line"><span class="cl">sudo mkdir -p /etc/apt/keyrings<span class="p">;</span> sudo chmod <span class="m">755</span> /etc/apt/keyrings
</span></span><span class="line"><span class="cl">sudo wget -O /etc/apt/keyrings/aptly.asc https://www.aptly.info/pubkey.txt
</span></span><span class="line"><span class="cl">sudo apt update <span class="o">&amp;&amp;</span> sudo apt install aptly</span></span></code></pre></div></div>
<p>Create aptly config:</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <button type="button" class="code-title" aria-label="Toggle code block"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></button>
        <span class="ellipses" aria-hidden="true"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <button type="button" class="copy" aria-label="Copy code" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></button>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat <span class="s">&lt;&lt;EOF | sudo tee /etc/aptly.conf
</span></span></span><span class="line"><span class="cl"><span class="s">{
</span></span></span><span class="line"><span class="cl"><span class="s">  &#34;rootDir&#34;: &#34;/opt/aptly&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s">  &#34;downloadConcurrency&#34;: 4,
</span></span></span><span class="line"><span class="cl"><span class="s">  &#34;downloadSpeedLimit&#34;: 0,
</span></span></span><span class="line"><span class="cl"><span class="s">  &#34;architectures&#34;: [&#34;amd64&#34;],
</span></span></span><span class="line"><span class="cl"><span class="s">  &#34;dependencyFollowSuggests&#34;: false,
</span></span></span><span class="line"><span class="cl"><span class="s">  &#34;dependencyFollowRecommends&#34;: false,
</span></span></span><span class="line"><span class="cl"><span class="s">  &#34;dependencyFollowAllVariants&#34;: false,
</span></span></span><span class="line"><span class="cl"><span class="s">  &#34;dependencyFollowSource&#34;: false,
</span></span></span><span class="line"><span class="cl"><span class="s">  &#34;dependencyVerboseResolve&#34;: false,
</span></span></span><span class="line"><span class="cl"><span class="s">  &#34;gpgDisableSign&#34;: false,
</span></span></span><span class="line"><span class="cl"><span class="s">  &#34;gpgDisableVerify&#34;: false,
</span></span></span><span class="line"><span class="cl"><span class="s">  &#34;gpgProvider&#34;: &#34;gpg&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s">  &#34;downloadSourcePackages&#34;: true,
</span></span></span><span class="line"><span class="cl"><span class="s">  &#34;skipLegacyPool&#34;: true,
</span></span></span><span class="line"><span class="cl"><span class="s">  &#34;ppaDistributorID&#34;: &#34;ubuntu&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s">  &#34;ppaCodename&#34;: &#34;&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s">  &#34;FileSystemPublishEndpoints&#34;: {
</span></span></span><span class="line"><span class="cl"><span class="s">    &#34;on-premises-repos&#34;: {
</span></span></span><span class="line"><span class="cl"><span class="s">      &#34;rootDir&#34;: &#34;/var/www/aptly&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s">      &#34;linkMethod&#34;: &#34;symlink&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s">      &#34;verifyMethod&#34;: &#34;md5&#34;
</span></span></span><span class="line"><span class="cl"><span class="s">    }
</span></span></span><span class="line"><span class="cl"><span class="s">  },
</span></span></span><span class="line"><span class="cl"><span class="s">  &#34;enableMetricsEndpoint&#34;: false
</span></span></span><span class="line"><span class="cl"><span class="s">}
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span></span></span></code></pre></div></div>
<h2 id="prepare-repos">Prepare repos</h2>
<p>Create 3 repos: k8s, ceph and shared for ubuntu jammy:</p>]]></description>
</item>
</channel>
</rss>
