<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>-ENOTTY (Posts about english)</title><link>https://enotty.pipebreaker.pl/</link><description></description><atom:link href="https://enotty.pipebreaker.pl/categories/english.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><lastBuildDate>Fri, 16 Jan 2026 19:09:22 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Apple knows better (how big it is)</title><link>https://enotty.pipebreaker.pl/posts/2026/01/apple-knows-better-how-big-it-is/</link><dc:creator>Tomasz Torcz</dc:creator><description>&lt;p&gt;Last year, I've spent few months exchanging emails and packet dumps with Zoom's support.
They provide videoconferencing software which gave me connectivity problems . Specifically, Zoom
client, on my work Macbook, when connected to my home network, failed. To make reporting
harded, Zoom's webpage did not open in Chrome on that laptop neither.&lt;/p&gt;
&lt;p&gt;Perplexingly, my private Fedora laptop, on the same network, had no problems
whatsoever. I'll spare the details of weeks-long investigation (no, it wasn't DNS' fault;
nor Cloudflare's).&lt;/p&gt;
&lt;p&gt;The problem source…&lt;/p&gt;
&lt;p&gt;MacOS X DHCP client &lt;strong&gt;ignores&lt;/strong&gt; Maximum Transfer Unit (option 26) from DHCP server!&lt;/p&gt;
&lt;p&gt;I couldn't believe it, but there are tons of similar reports over the net. Apparently,
Apple deems MTU information not trustworthy. Well, thank you 🍏, there went weeks of my
time.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;&lt;em&gt;Why do I even have non-standard MTU in my network?&lt;/em&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Since my ISP &lt;a class="reference external" href="https://enotty.pipebreaker.pl/posts/2023/12/logitus-netia/"&gt;was acquired&lt;/a&gt;, I had to deal with blast-from-the-past networking.
Plain, reliable Ethernet connection was replaced with PPPoE, lowering the MTU to 1492 bytes, bringing
distaste and headaches.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;em&gt;Why other webpages and software continued working?&lt;/em&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Most communications use TCP/IP protocol, which knows how to deal with decreased MTU.
Modern pages (and Zoom) try to use QUIC protocol. It works over UDP. UDP
has no mechanisms of Path MTU discovery and too big packets are just dropped.
PMPTU for QUIC is still at &lt;a class="reference external" href="https://datatracker.ietf.org/doc/draft-pskim-pmtu-algorithm-issue/00/"&gt;a draft stage&lt;/a&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;em&gt;Why it started to happening recently?&lt;/em&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Due to other circuimstances, I had disabled IPv6 connectivity for my work laptop around summer last year.
I didn't noticed at the time, but before that, Zoom worked fine over IPv6. MTU information from RA is good enough for Apple,
whereas from DHCP is a no-no.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Kudos to Zoom Support, for spotting the MTU problem in the end.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;030/100 of &lt;a class="reference external" href="https://100daystooffload.com/"&gt;#100DaysToOffload&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description><category>100DaysToOffload</category><category>english</category><guid>https://enotty.pipebreaker.pl/posts/2026/01/apple-knows-better-how-big-it-is/</guid><pubDate>Fri, 16 Jan 2026 10:38:18 GMT</pubDate></item><item><title>I Voted, F43 edition</title><link>https://enotty.pipebreaker.pl/posts/2026/01/i-voted-f43-edition/</link><dc:creator>Tomasz Torcz</dc:creator><description>&lt;p&gt;I've cast my votes in Fedora Engineering Steering Comittee.
&lt;a class="reference external" href="https://elections.fedoraproject.org/"&gt;The voting&lt;/a&gt; closes tomorrow.&lt;/p&gt;
&lt;p&gt;As usual, I've read interview with the candidates, and then
decided on my preferences. Red Hat employees get a minus, new faces
get plus. There are exceptions, it's not a hard rule!&lt;/p&gt;
&lt;p&gt;That's one of the way I contribute to Fedora. Sometimes
&lt;a class="reference external" href="https://enotty.pipebreaker.pl/posts/2019/11/its-election-time-in-fedora-land/"&gt;I blog about elections&lt;/a&gt;.
I've also been a Fedora packages for almost 18 years!&lt;/p&gt;
&lt;img alt="https://badges.fedoraproject.org/pngs/ivoted-f43.png" class="align-center" src="https://badges.fedoraproject.org/pngs/ivoted-f43.png"&gt;
&lt;p&gt;028/100 of &lt;a class="reference external" href="https://100daystooffload.com/"&gt;#100DaysToOffload&lt;/a&gt;&lt;/p&gt;</description><category>100DaysToOffload</category><category>english</category><guid>https://enotty.pipebreaker.pl/posts/2026/01/i-voted-f43-edition/</guid><pubDate>Tue, 06 Jan 2026 16:44:33 GMT</pubDate></item><item><title>Fedora 42→43, more eventful than usual</title><link>https://enotty.pipebreaker.pl/posts/2025/12/fedora-42-43-more-eventful-than-usual/</link><dc:creator>Tomasz Torcz</dc:creator><description>&lt;p&gt;I've found time for &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;dist-upgrade&lt;/span&gt;&lt;/code&gt; of my home server, finally. As usual, there was one thing
needing manual intervention: PostgreSQL update.  But this time it was more complicated.&lt;/p&gt;
&lt;p&gt;Between Fedora 42 and 43, PostgreSQL jumped from v16 to v18. And &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;postgresql-setup&lt;/span&gt; &lt;span class="pre"&gt;--upgrade&lt;/span&gt;&lt;/code&gt;
handles adjacent versions upgrades only.  Fortunately, Fedora ships other version-suffixed
packages for this database.&lt;/p&gt;
&lt;p&gt;It is possible (and needed!) to use &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;postgresql-server17&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;postgresql17-upgrade&lt;/span&gt;&lt;/code&gt; packages as an intermediate
step in the upgrade.  Commands are documented in &lt;a class="reference external" href="https://bugzilla.redhat.com/show_bug.cgi?id=2411778#c1"&gt;bz#2411778#c1&lt;/a&gt;.
It should be included in &lt;a class="reference external" href="https://discussion.fedoraproject.org/tags/c/ask/common-issues/82/none/f43"&gt;F43 Common Bugs&lt;/a&gt;
list, but it isn't. (And the list itself was moved from Wiki into Discourse…)&lt;/p&gt;
&lt;p&gt;Note to self: the upgrade always fails with my customised &lt;code class="docutils literal"&gt;postgresql.conf&lt;/code&gt;.
Remember to plant the default config for the duration of postgresql upgrade.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;026/100 of &lt;a class="reference external" href="https://100daystooffload.com/"&gt;#100DaysToOffload&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description><category>100DaysToOffload</category><category>english</category><guid>https://enotty.pipebreaker.pl/posts/2025/12/fedora-42-43-more-eventful-than-usual/</guid><pubDate>Fri, 12 Dec 2025 10:39:03 GMT</pubDate></item><item><title>Backups with btrbk</title><link>https://enotty.pipebreaker.pl/posts/2025/11/backups-with-btrbk/</link><dc:creator>Tomasz Torcz</dc:creator><description>&lt;p&gt;&lt;a class="reference external" href="https://enotty.pipebreaker.pl/posts/2016/05/migracja-do-bcache/"&gt;Storage setup&lt;/a&gt; of my home server is
btrfs raid1 over two, dm-crypt'ed 16TB HDDs cached with bcache on NVMe.
It works fine, however for PostgreSQL database and my homedir I prefer full NVMe
speed.&lt;/p&gt;
&lt;p&gt;Therefore I've put those two directories on (dm-crypt'ed) btrfs subvolumes
directly on NVMe. Thanks to &lt;code class="docutils literal"&gt;DUP&lt;/code&gt; profile there's a protection against bitrot.
But it's still a single device which may just die. Regardless of full backups,
I was doing daily &lt;code class="docutils literal"&gt;rsync&lt;/code&gt; into main drives, but there's faster and more capable
way.&lt;/p&gt;
&lt;p&gt;Enter &lt;a class="reference external" href="https://github.com/digint/btrbk"&gt;btrbk&lt;/a&gt;, which operates on btrfs subvolumes.
It uses btrfs' native &lt;code class="docutils literal"&gt;send&lt;/code&gt; capability to copy the subvolume between filesystems effectively.&lt;/p&gt;
&lt;p&gt;Additionally, it's very easy to keep some number of historic subvolume snapshots. They utilize
copy-on-write, minimizing space usage. This let me recover files quickly or
compare filesystem's state over last few days.&lt;/p&gt;
&lt;p&gt;The config it bit tricky, that's why I'm posting this.  My full backup config
below, divided in three sections for explanations.&lt;/p&gt;
&lt;pre class="literal-block"&gt;timestamp_format        long
snapshot_preserve       14d
snapshot_preserve_min   2d      # defaults to 'all'&lt;/pre&gt;
&lt;p&gt;The source definition. &lt;code class="docutils literal"&gt;preserve&lt;/code&gt; option combination is needed to have
daily snapshots kept for last two weeks and have older snapshots removed.&lt;/p&gt;
&lt;pre class="literal-block"&gt;target_preserve         7d
target_preserve_min     latest  # defaults to 'all'&lt;/pre&gt;
&lt;p&gt;What to do with subvolumes copies at the target directory. Above combination
of options keeps last seven days of snapshots copies.&lt;/p&gt;
&lt;pre class="literal-block"&gt;send_compressed_data    yes

volume /run/btrbk-work
        target /home/poligon/backs/btrbk_snaps

        subvolume home_zdzichu

        subvolume var_lib_pgsql&lt;/pre&gt;
&lt;p&gt;Job definition. &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;/run/btrbk-work&lt;/span&gt;&lt;/code&gt; is a directory where I temporarily mount
NVMe drive root volume with subvolumes beneath. &lt;code class="docutils literal"&gt;/home/poligon/backs/btrbk_snaps&lt;/code&gt;
is the directory on my main (raid1) pool where subvolume copies are stored.
And the last two lines are specific subvolumes to copy.&lt;/p&gt;
&lt;p&gt;That works for me. &lt;code class="docutils literal"&gt;btrbk&lt;/code&gt; is run by &lt;code class="docutils literal"&gt;cron.daily/&lt;/code&gt; from a short script
ensuring everything is mounted where it should be.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;020/100 of &lt;a class="reference external" href="https://100daystooffload.com/"&gt;#100DaysToOffload&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description><category>100DaysToOffload</category><category>english</category><guid>https://enotty.pipebreaker.pl/posts/2025/11/backups-with-btrbk/</guid><pubDate>Sun, 02 Nov 2025 19:52:18 GMT</pubDate></item><item><title>Actalis EAB ACME works – it was base64url issue</title><link>https://enotty.pipebreaker.pl/posts/2025/08/actalis-eab-acme-works-it-was-base64url-issue/</link><dc:creator>Tomasz Torcz</dc:creator><description>&lt;p&gt;As an addendum to &lt;a class="reference external" href="https://enotty.pipebreaker.pl/posts/2025/08/leaving-buypass-as-acme-provider/"&gt;yesterday's note&lt;/a&gt;: I've got
Actalis issuer to work with &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;cert-manager&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;cert-manager&lt;/span&gt;&lt;/code&gt; expects some credentials to be in so-called &lt;code class="docutils literal"&gt;base64url&lt;/code&gt; encoding, which
is &lt;a class="reference external" href="https://cert-manager.io/docs/configuration/acme/#external-account-bindings"&gt;stated in a note&lt;/a&gt; in the
documentation. Fix was easy, I had to remove &lt;code class="docutils literal"&gt;=&lt;/code&gt; from provided HMAC Keys. The docs have
&lt;code class="docutils literal"&gt;sed&lt;/code&gt; invocation to use.&lt;/p&gt;
&lt;p&gt;002/100 of &lt;a class="reference external" href="https://100daystooffload.com/"&gt;#100DaysToOffload&lt;/a&gt;&lt;/p&gt;</description><category>100DaysToOffload</category><category>english</category><guid>https://enotty.pipebreaker.pl/posts/2025/08/actalis-eab-acme-works-it-was-base64url-issue/</guid><pubDate>Wed, 20 Aug 2025 07:55:32 GMT</pubDate></item><item><title>Leaving BuyPass as an ACME provider</title><link>https://enotty.pipebreaker.pl/posts/2025/08/leaving-buypass-as-acme-provider/</link><dc:creator>Tomasz Torcz</dc:creator><description>&lt;p&gt;For a long time I've been using BuyPass as TLS certificates provider for ACME.
Unfortunately they &lt;a class="reference external" href="https://community.buypass.com/t/y4y130p"&gt;decided to disengage from this area of services&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There are &lt;a class="reference external" href="https://acmeclients.com/certificate-authorities/"&gt;quite a few ACME providers&lt;/a&gt;. Some even look
like they could replace BuyPass, which had two strong traits: it is based in Europe and was providing certificates
valid for half a year. It looked like &lt;a class="reference external" href="https://www.actalis.com/subscription"&gt;Actalis&lt;/a&gt; would be a good replacement.
They're from Italy and have 1 year certificates, but available in paid plans only.&lt;/p&gt;
&lt;p&gt;After some tinkering with &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;cert-manager&lt;/span&gt;&lt;/code&gt; I was unable to make it work. Some cryptic, discouraging messages
like &lt;code class="docutils literal"&gt;"ACME server URL host and ACME private key registration host differ. &lt;span class="pre"&gt;Re-checking&lt;/span&gt; ACME account registration"&lt;/code&gt;
and &lt;code class="docutils literal"&gt;"failed to verify ACME account" &lt;span class="pre"&gt;err="failed&lt;/span&gt; to decode external account binding key data: illegal base64 data at input byte 43"&lt;/code&gt; made me look further.&lt;/p&gt;
&lt;p&gt;Next shot, &lt;a class="reference external" href="https://cert-manager.io/docs/tutorials/zerossl/zerossl/"&gt;ZeroSSL&lt;/a&gt; worked straight away. Worth noting –
official &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;cert-manager&lt;/span&gt;&lt;/code&gt; documentation has a tutorial on using ZeroSSL. There are some limitation, but it's
fine to me. There's nothing more to write, it just works.&lt;/p&gt;
&lt;p&gt;For private services (meant to be accessed only from my devices), I'm using
&lt;a class="reference external" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/"&gt;FreeIPA as an ACME provider&lt;/a&gt;, of course.&lt;/p&gt;
&lt;p&gt;Why not Let's Encrypt? Only because it is not &lt;em&gt;hipster&lt;/em&gt; enough.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is post 001/100 of &lt;a class="reference external" href="https://100daystooffload.com/"&gt;100DaysToOffload&lt;/a&gt; challenge. I intend to write
short posts about nothing in particular, just collected thoughts. Language will vary: Polish, English,
maybe Arabic if I get back to learning it.&lt;/p&gt;
&lt;/blockquote&gt;</description><category>100DaysToOffload</category><category>english</category><guid>https://enotty.pipebreaker.pl/posts/2025/08/leaving-buypass-as-acme-provider/</guid><pubDate>Tue, 19 Aug 2025 18:26:33 GMT</pubDate></item><item><title>Fixing FreeIPA ACME</title><link>https://enotty.pipebreaker.pl/posts/2024/02/fixing-freeipa-acme/</link><dc:creator>Tomasz Torcz</dc:creator><description>&lt;p&gt;I've managed to fix &lt;a class="reference external" href="https://enotty.pipebreaker.pl/posts/2024/01/woes-with-freeipa-and-sids/"&gt;one of the recent problems with my FreeIPA&lt;/a&gt;.
To be more specific – after few months breakage, ACME issuer is working again for me.&lt;/p&gt;
&lt;p&gt;Solution was dead simple after I've found the relevant line in the logs:&lt;/p&gt;
&lt;pre class="literal-block"&gt;2024-02-07 21:59:24 [ajp-nio-0:0:0:0:0:0:0:1-8009-exec-3]
SEVERE: Servlet.service() for servlet [ACME] in context with path [/acme] threw exception
org.jboss.resteasy.spi.UnhandledException: com.netscape.certsrv.base.UnauthorizedException:
Authorization failed: Authorization failed on resource: group=Certificate Manager Agents, operation: {1}&lt;/pre&gt;
&lt;p&gt;I've fired up an LDAP client (I'm using &lt;a class="reference external" href="https://jxplorer.org/"&gt;JXplorer&lt;/a&gt;), went to &lt;code class="docutils literal"&gt;/ipaca/groups/Certificate Manager Agents&lt;/code&gt; and added
two records. Type &lt;code class="docutils literal"&gt;uniqueMember&lt;/code&gt; with value &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;uid=acme-kaitain.pipebreaker.pl,ou=people,o=ipaca&lt;/span&gt;&lt;/code&gt;, plus another one for the second replica.
FreeIPA started to issue certificates again, although there are still some strange trackbacks in the logs.&lt;/p&gt;
&lt;p&gt;Why the group membership dissapeared? I don't know.&lt;/p&gt;</description><category>english</category><guid>https://enotty.pipebreaker.pl/posts/2024/02/fixing-freeipa-acme/</guid><pubDate>Thu, 08 Feb 2024 20:17:56 GMT</pubDate></item><item><title>Woes with FreeIPA and SIDs</title><link>https://enotty.pipebreaker.pl/posts/2024/01/woes-with-freeipa-and-sids/</link><dc:creator>Tomasz Torcz</dc:creator><description>&lt;img alt="Sid (from Ice Age)" class="align-right" src="https://lumiere-a.akamaihd.net/v1/images/ct_iceage_sid_21464_10f2d363.jpeg?region=0,0,800,800&amp;amp;width=320"&gt;
&lt;p&gt;As cool as &lt;a class="reference external" href="https://freeipa.org"&gt;FreeIPA&lt;/a&gt; is – I'm using it for over 10 years at home – sometimes
I fell it breaks just by being looked at.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TLDR: If you have accounts or groups with UID or GID not falling in any defined range ID ranges,
fix that by any of: 1) changing the UID/GID; 2) extending defined ID range; 3) creating a new ID range
covering those UIDs/GIDs.&lt;/p&gt;
&lt;p&gt;Then generate new SIDs with &lt;code class="docutils literal"&gt;ipa &lt;span class="pre"&gt;config-mod&lt;/span&gt; &lt;span class="pre"&gt;--enable-sid&lt;/span&gt; &lt;span class="pre"&gt;--add-sids&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Few months ago my FreeIPA installation stopped allowing users to login. It was
mostly a nuisance for me, nothing critical:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;on most important computers I have local accounts&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;services authenticating with plain LDAP continued to work&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;so what didn't work? Login into FreeIPA's web interface. But &lt;cite&gt;admin&lt;/cite&gt; accounted worked, so…&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When I eventually started to debug, I found following logs in &lt;code class="docutils literal"&gt;krb5kdc.log&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;krb5kdc[3123](info): AS_REQ : handle_authdata (2)
krb5kdc[3123](info): AS_REQ (6 etypes {aes256-cts-hmac-sha384-192(20), aes128-cts-hmac-sha256-128(19),
aes256-cts-hmac-sha1-96(18), aes128-cts-hmac-sha1-96(17), camellia256-cts-cmac(26),
camellia128-cts-cmac(25)}) 192.168.x.x: HANDLE_AUTHDATA: zdzichu@PIPEBREAKER.PL for krbtgt/PIPEBREAKER.PL@PIPEBREAKER.PL, No such file or directory&lt;/pre&gt;
&lt;p&gt;Some searching the web later, I've concluded &lt;cite&gt;No such file or directory&lt;/cite&gt; refers to SID, a &lt;em&gt;Security Identifier&lt;/em&gt;.
SIDs are some Microsoft's Active Directory properties. I see no reason to have them on Linux-only FreeIPA installs.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://freeipa.readthedocs.io/en/latest/designs/adtrust/sidconfig.html#id2"&gt;Upgrade section&lt;/a&gt; in the documentation is wrong:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The upgrade does not turn on the feature. If the admin wants to enable SID generation, he needs to update the packages and run the new command&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It's not true, admin desires don't matter. As Alexander Bokovoy wrote &lt;a class="reference external" href="https://www.mail-archive.com/freeipa-users@lists.fedorahosted.org/msg17032.html"&gt;on the mailing list&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;FreeIPA generates SIDs by default since FreeIPA 4.9.8. It is configured
to do so on new installations even when integration with AD is not
considered, due to tightened requirements to process constrained
delegation in Kerberos.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So SIDs are really &lt;strong&gt;required&lt;/strong&gt; in FreeIPA now. I don't want them, but whatever. There is a command
which is supposed to generate missing data:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code class="docutils literal"&gt;ipa &lt;span class="pre"&gt;config-mod&lt;/span&gt; &lt;span class="pre"&gt;--enable-sid&lt;/span&gt; &lt;span class="pre"&gt;--add-sids&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It finished without errors, but login still didn't work.&lt;/p&gt;
&lt;p&gt;More searching. The commands fires up a job (in LDAP server?) so let look into &lt;em&gt;dirsvr's&lt;/em&gt; &lt;cite&gt;errors.log&lt;/cite&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;[12/Jan/2024:14:07:51.524937136 +0100] - ERR - sidgen_task_thread - [file ipa_sidgen_task.c, line 194]: Sidgen task starts ...
[12/Jan/2024:14:07:51.566941696 +0100] - ERR - find_sid_for_ldap_entry - [file ipa_sidgen_common.c, line 521]: Cannot convert Posix ID [135] into an unused SID.
[12/Jan/2024:14:07:51.585948214 +0100] - ERR - do_work - [file ipa_sidgen_task.c, line 154]: Cannot add SID to existing entry.
[12/Jan/2024:14:07:51.597088076 +0100] - ERR - sidgen_task_thread - [file ipa_sidgen_task.c, line 199]: Sidgen task finished [32].&lt;/pre&gt;
&lt;p&gt;OK, we're getting somewhere. I had some an obsolete group defined with GID 135. Let's remove it and re-run the command.&lt;/p&gt;
&lt;pre class="literal-block"&gt;[12/Jan/2024:14:24:29.879953617 +0100] - ERR - find_sid_for_ldap_entry - [file ipa_sidgen_common.c, line 521]: Cannot convert Posix ID [1037] into an unused SID&lt;/pre&gt;
&lt;p&gt;I know this UID, this is one of the users I've migrated to FreeIPA. Obviously I cannot remove it.&lt;/p&gt;
&lt;p&gt;Turns out, FreeIPA has something called &lt;a class="reference external" href="https://www.freeipa.org/page/V3/ID_Ranges"&gt;ID ranges&lt;/a&gt;.
&lt;strong&gt;If you have accounts or groups with UID or GID not falling in any defined range, sidgen script just fails.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I had to go to &lt;em&gt;IPA Server -&amp;gt; ID Ranges -&amp;gt; Add&lt;/em&gt; in web console and make changes. I did not want to mess with already
defined ranges, so I created a new one. An “unix” range. Base 1000, size 1000, had to guess some numbers for RID ranges before it was accepted.&lt;/p&gt;
&lt;p&gt;Not that I'm so smart to figure it out. There's &lt;a class="reference external" href="https://access.redhat.com/solutions/394763"&gt;Knowledgebase solution 394763&lt;/a&gt; for exactly this problem.&lt;/p&gt;
&lt;p&gt;And just like that, kerberized login to FreeIPA started working again.&lt;/p&gt;
&lt;p&gt;Knowing what was wrong, I've started noticing (and understanding)
&lt;a class="reference external" href="https://lists.fedorahosted.org/archives/list/freeipa-users@lists.fedorahosted.org/message/LB5LTBK45BHGGLGKKR2NXJRMKN3WB2PJ/"&gt;other people have the same kind of issues&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One problem down, two to go. Replication between my replicas is not working. Again with unhelpful message:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[12/Jan/2024:14:33:32.812986996 +0100] - ERR - NSMMReplicationPlugin - acquire_replica - agmt="cn=kaitain.pipebreaker.pl-to-okda.pipebreaker.pl" (okda:389): Unable to acquire replica: permission denied. The bind dn "" does not have permission to supply replication updates to the replica. Will retry later.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I did all the steps from &lt;a class="reference external" href="https://access.redhat.com/solutions/2988311"&gt;KB 2988311&lt;/a&gt; but it didn't help.&lt;/p&gt;
&lt;p&gt;Second problem, &lt;a class="reference external" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/"&gt;ACME on FreeIPA&lt;/a&gt; ceased to work for me.&lt;/p&gt;
&lt;p&gt;I hadn't had willpower to debug these two, yet.&lt;/p&gt;</description><category>english</category><guid>https://enotty.pipebreaker.pl/posts/2024/01/woes-with-freeipa-and-sids/</guid><pubDate>Sat, 20 Jan 2024 17:23:22 GMT</pubDate></item><item><title>How systemd exponential restart delay works</title><link>https://enotty.pipebreaker.pl/posts/2024/01/how-systemd-exponential-restart-delay-works/</link><dc:creator>Tomasz Torcz</dc:creator><description>&lt;p&gt;Since the beginning, &lt;code class="docutils literal"&gt;systemd&lt;/code&gt; had a &lt;a class="reference external" href="https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html#Restart="&gt;Restart=&lt;/a&gt; directive to do just that – restart a service when it fails or exists. Some tuning was provided by &lt;a class="reference external" href="https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html#RestartSec="&gt;RestartSec=&lt;/a&gt; (how long to wait between restarts), &lt;a class="reference external" href="https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html#StartLimitIntervalSec=interval"&gt;StartLimitBurst=&lt;/a&gt; (how many times to try) and few minor directives.&lt;/p&gt;
&lt;p&gt;Starting with &lt;code class="docutils literal"&gt;systemd v254&lt;/code&gt;, we have two new knobs:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html#RestartSteps="&gt;RestartSteps=&lt;/a&gt; &lt;em&gt;the number of steps to take to increase the interval of auto-restarts&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html#RestartMaxDelaySec="&gt;RestartMaxDelaySec=&lt;/a&gt; &lt;em&gt;the longest time to sleep before restarting a service as the interval goes up&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Together, they provide ability to exponentially extend wait-time between restarts. First restart is quite quick, but then system waits more and more. Here what it means.&lt;/p&gt;
&lt;p&gt;Let assume a service with following settings:&lt;/p&gt;
&lt;pre class="literal-block"&gt;Restart=always
RestartSec=100ms (the default)
RestartMaxDelaySec=10s
RestartSteps=5&lt;/pre&gt;
&lt;p&gt;Upon a failure, &lt;code class="docutils literal"&gt;systemd&lt;/code&gt; will wait (rounded a bit):&lt;/p&gt;
&lt;ol class="arabic simple" start="0"&gt;
&lt;li&gt;&lt;p&gt;100ms until first restart&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;250ms until next restart (first step)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;630ms until next restart (second step)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1.58s until next restart (third step)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;3.98s until next restart (fourth step)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;10.0s until next restart (&lt;code class="docutils literal"&gt;RestartSteps=5&lt;/code&gt; – fifth step) and following restarts&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Second example. Given:&lt;/p&gt;
&lt;pre class="literal-block"&gt;RestartSec=1s
RestartMaxDelaySec=10s
RestartSteps=3&lt;/pre&gt;
&lt;p&gt;subsequent restarts will be done after waiting:&lt;/p&gt;
&lt;ol class="arabic simple" start="0"&gt;
&lt;li&gt;&lt;p&gt;100ms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2.15s (step 1)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;4.64s (step 2)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;10.0s (step 3, as in &lt;code class="docutils literal"&gt;RestartSteps=3&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Hope this helps. You can find &lt;a class="reference external" href="https://github.com/systemd/systemd/blob/v255/src/core/service.c#L322"&gt;the exact formula in src/core/service.c&lt;/a&gt;.&lt;/p&gt;</description><category>english</category><guid>https://enotty.pipebreaker.pl/posts/2024/01/how-systemd-exponential-restart-delay-works/</guid><pubDate>Tue, 02 Jan 2024 20:25:44 GMT</pubDate></item><item><title>Migrated home server to the UEFI boot</title><link>https://enotty.pipebreaker.pl/posts/2023/02/migrated-home-server-to-uefi-boot/</link><dc:creator>Tomasz Torcz</dc:creator><description>&lt;p&gt;I've migrated my home server to boot using UEFI. It means suprising number of things:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;I did something useful during my unplanned PTO days&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://fedoraproject.org/wiki/GRUB_2#Instructions_for_UEFI-based_systems"&gt;Fedora's GRUB instructions&lt;/a&gt; are useful and precise&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I was really wrong in &lt;a class="reference external" href="https://enotty.pipebreaker.pl/posts/2015/07/it-seems-my-ecs-h67h2-m-motherboard-bis-notb-uefi-capablebrigui-uef/"&gt;my rant&lt;/a&gt; couple years ago. Although I had to switch firmware into &lt;em&gt;Windows 8 (no CSM)&lt;/em&gt; mode today.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the server is ready for modernization later this year, the upgrade of fives: some AMD Ryzen 7xxx (AM5 socket), DDR5, PCIe5. Packed in a SSUPD Meshroom S case. Getting back to the integrated GPU and hopefully lowering power consumption (now it idles at around 90W🙁)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I can unsubscribe from &lt;a class="reference external" href="https://fedoraproject.org/wiki/SIGs/BiosBoot"&gt;BIOS Boot SIG&lt;/a&gt;, as this was my last legacy-booting computer. The SIG mailing list is completely empty, apparently all the ruckus with needing BIOS booting within Fedora has no real standing.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;</description><category>english</category><category>shorts</category><guid>https://enotty.pipebreaker.pl/posts/2023/02/migrated-home-server-to-uefi-boot/</guid><pubDate>Fri, 17 Feb 2023 11:58:31 GMT</pubDate></item><item><title>Obvious webdevel things dump</title><link>https://enotty.pipebreaker.pl/posts/2022/02/obvious-webdevel-things-dump/</link><dc:creator>Tomasz Torcz</dc:creator><description>&lt;p&gt;Having just spent hours debugging simple Flask application, I need to went:&lt;/p&gt;
&lt;p&gt;1. &lt;code class="docutils literal"&gt;tzdata&lt;/code&gt; package in &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;fedora-minimal&lt;/span&gt;&lt;/code&gt; container image &lt;a class="reference external" href="https://bugzilla.redhat.com/show_bug.cgi?id=1870814"&gt;is broken&lt;/a&gt;.
RPM database lists files which are not installed (actually, they were removed during base container build). It's getting fixed.&lt;/p&gt;
&lt;p&gt;Symptom: &lt;code class="docutils literal"&gt;FileNotFoundError: [Errno 2] No such file or directory: '/usr/share/zoneinfo/zone.tab'&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Workaround: &lt;code class="docutils literal"&gt;microdnf reinstall tzdata&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;2. HTML checkboxes are weird. When they are set, they appear in HTTP request data with &lt;code class="docutils literal"&gt;value&lt;/code&gt;. When unset, they are &lt;strong&gt;not&lt;/strong&gt; in the
request (i.e. one cannot look for &lt;code class="docutils literal"&gt;checked = False&lt;/code&gt;). Thus, following is enough to find if the checkbox has been checked:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_bf7c97b468e240e19766861513fdd689-1" name="rest_code_bf7c97b468e240e19766861513fdd689-1" href="https://enotty.pipebreaker.pl/posts/2022/02/obvious-webdevel-things-dump/#rest_code_bf7c97b468e240e19766861513fdd689-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s2"&gt;"checkbox_name"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;form&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_bf7c97b468e240e19766861513fdd689-2" name="rest_code_bf7c97b468e240e19766861513fdd689-2" href="https://enotty.pipebreaker.pl/posts/2022/02/obvious-webdevel-things-dump/#rest_code_bf7c97b468e240e19766861513fdd689-2"&gt;&lt;/a&gt; &lt;span class="err"&gt;…&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;3. default-on checkboxes with state retained over POST… This one was tricky.  Apparently, initialising Flask-WTForms with
request data on &lt;em&gt;the first load&lt;/em&gt; overwrites default state. Solution: use form data in POST handler only.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_a2acb1c695824ba39148a89f213adbf2-1" name="rest_code_a2acb1c695824ba39148a89f213adbf2-1" href="https://enotty.pipebreaker.pl/posts/2022/02/obvious-webdevel-things-dump/#rest_code_a2acb1c695824ba39148a89f213adbf2-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SomeForm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FlaskForm&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a id="rest_code_a2acb1c695824ba39148a89f213adbf2-2" name="rest_code_a2acb1c695824ba39148a89f213adbf2-2" href="https://enotty.pipebreaker.pl/posts/2022/02/obvious-webdevel-things-dump/#rest_code_a2acb1c695824ba39148a89f213adbf2-2"&gt;&lt;/a&gt;  &lt;span class="n"&gt;checkbox_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BooleanField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Some label"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_a2acb1c695824ba39148a89f213adbf2-3" name="rest_code_a2acb1c695824ba39148a89f213adbf2-3" href="https://enotty.pipebreaker.pl/posts/2022/02/obvious-webdevel-things-dump/#rest_code_a2acb1c695824ba39148a89f213adbf2-3"&gt;&lt;/a&gt;
&lt;a id="rest_code_a2acb1c695824ba39148a89f213adbf2-4" name="rest_code_a2acb1c695824ba39148a89f213adbf2-4" href="https://enotty.pipebreaker.pl/posts/2022/02/obvious-webdevel-things-dump/#rest_code_a2acb1c695824ba39148a89f213adbf2-4"&gt;&lt;/a&gt;  &lt;span class="nd"&gt;@app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"GET"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"POST"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;a id="rest_code_a2acb1c695824ba39148a89f213adbf2-5" name="rest_code_a2acb1c695824ba39148a89f213adbf2-5" href="https://enotty.pipebreaker.pl/posts/2022/02/obvious-webdevel-things-dump/#rest_code_a2acb1c695824ba39148a89f213adbf2-5"&gt;&lt;/a&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a id="rest_code_a2acb1c695824ba39148a89f213adbf2-6" name="rest_code_a2acb1c695824ba39148a89f213adbf2-6" href="https://enotty.pipebreaker.pl/posts/2022/02/obvious-webdevel-things-dump/#rest_code_a2acb1c695824ba39148a89f213adbf2-6"&gt;&lt;/a&gt;      &lt;span class="c1"&gt;# doing "form = SomeForm(request.form)" here would obliterate default checkbox state; don't do it&lt;/span&gt;
&lt;a id="rest_code_a2acb1c695824ba39148a89f213adbf2-7" name="rest_code_a2acb1c695824ba39148a89f213adbf2-7" href="https://enotty.pipebreaker.pl/posts/2022/02/obvious-webdevel-things-dump/#rest_code_a2acb1c695824ba39148a89f213adbf2-7"&gt;&lt;/a&gt;
&lt;a id="rest_code_a2acb1c695824ba39148a89f213adbf2-8" name="rest_code_a2acb1c695824ba39148a89f213adbf2-8" href="https://enotty.pipebreaker.pl/posts/2022/02/obvious-webdevel-things-dump/#rest_code_a2acb1c695824ba39148a89f213adbf2-8"&gt;&lt;/a&gt;      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"POST"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_a2acb1c695824ba39148a89f213adbf2-9" name="rest_code_a2acb1c695824ba39148a89f213adbf2-9" href="https://enotty.pipebreaker.pl/posts/2022/02/obvious-webdevel-things-dump/#rest_code_a2acb1c695824ba39148a89f213adbf2-9"&gt;&lt;/a&gt;          &lt;span class="n"&gt;form&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SomeForm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;form&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_a2acb1c695824ba39148a89f213adbf2-10" name="rest_code_a2acb1c695824ba39148a89f213adbf2-10" href="https://enotty.pipebreaker.pl/posts/2022/02/obvious-webdevel-things-dump/#rest_code_a2acb1c695824ba39148a89f213adbf2-10"&gt;&lt;/a&gt;          &lt;span class="err"&gt;…&lt;/span&gt;
&lt;a id="rest_code_a2acb1c695824ba39148a89f213adbf2-11" name="rest_code_a2acb1c695824ba39148a89f213adbf2-11" href="https://enotty.pipebreaker.pl/posts/2022/02/obvious-webdevel-things-dump/#rest_code_a2acb1c695824ba39148a89f213adbf2-11"&gt;&lt;/a&gt;      &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_a2acb1c695824ba39148a89f213adbf2-12" name="rest_code_a2acb1c695824ba39148a89f213adbf2-12" href="https://enotty.pipebreaker.pl/posts/2022/02/obvious-webdevel-things-dump/#rest_code_a2acb1c695824ba39148a89f213adbf2-12"&gt;&lt;/a&gt;          &lt;span class="c1"&gt;# not a POST? start with default, empty form&lt;/span&gt;
&lt;a id="rest_code_a2acb1c695824ba39148a89f213adbf2-13" name="rest_code_a2acb1c695824ba39148a89f213adbf2-13" href="https://enotty.pipebreaker.pl/posts/2022/02/obvious-webdevel-things-dump/#rest_code_a2acb1c695824ba39148a89f213adbf2-13"&gt;&lt;/a&gt;          &lt;span class="n"&gt;form&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SomeForm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a id="rest_code_a2acb1c695824ba39148a89f213adbf2-14" name="rest_code_a2acb1c695824ba39148a89f213adbf2-14" href="https://enotty.pipebreaker.pl/posts/2022/02/obvious-webdevel-things-dump/#rest_code_a2acb1c695824ba39148a89f213adbf2-14"&gt;&lt;/a&gt;          &lt;span class="err"&gt;…&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</description><category>english</category><guid>https://enotty.pipebreaker.pl/posts/2022/02/obvious-webdevel-things-dump/</guid><pubDate>Tue, 15 Feb 2022 14:29:29 GMT</pubDate></item><item><title>The lights are blinking, but a part of me is broken</title><link>https://enotty.pipebreaker.pl/posts/2022/02/the-lights-are-blinking-but-a-part-of-me-is-broken/</link><dc:creator>Tomasz Torcz</dc:creator><description>&lt;p&gt;Software neglect forces perfectly good hardware obsolete. I was suprised it could strike such basic devices as
an ethernet switch.&lt;/p&gt;
&lt;p&gt;Few years ago I bought a TP-Link gigabit switch for home network. TL-SG2216 model ticked all the
boxes: 16 ports, 2 SFP slots (if I ever get FTTH), VLANs, IPv6 support and remote management, 5 years warranty.
Although &lt;code class="docutils literal"&gt;ssh&lt;/code&gt; required strange dances since the beginning
(&lt;code class="docutils literal"&gt;ssh &lt;span class="pre"&gt;-oKexAlgorithms=+diffie-hellman-group1-sha1&lt;/span&gt; &lt;span class="pre"&gt;-oCiphers=aes256-cbc&lt;/span&gt; &lt;span class="pre"&gt;-oHostKeyAlgorithms=+ssh-dss&lt;/span&gt; …&lt;/code&gt;), the HTTPS
interface worked fine. Until it broke last year.&lt;/p&gt;
&lt;p&gt;Firefox was adamant – SSL_ERROR_NO_CYPHER_OVERLAP. Chromium threw similar tantrum: ERR_SSL_VERSION_OR_CIPHER_MISMATCH.
HTTPS management UI on my switch ceased to be secure enough for modern browsers. The world rushed forward,
obsoleting and disabling old, unsecure algorthms and protocols. In the meantime my switch stood still.
Eventually the world surpassed what was possible with TP-Link.&lt;/p&gt;
&lt;p&gt;From my perspective, the web UI broke. I bought a switch with HTTPS management, and this feature stopped working.
So, in the last days of my warranty coverage, I reported the issue to TP-Link. Long story short, it was denied on
a technicality. I should have opened the issue through the distributor who sold me the switch, not directly
with TP-Link. I've got this information after the warranty lapsed, which ended the story.&lt;/p&gt;
&lt;p&gt;But frankly, I do not think TP-Link would be able to salvage this situation. I put only a tiny blame on them.&lt;/p&gt;
&lt;p&gt;They designed the switch couple years ago. It was good enough and worked with the ecosystem of its time.
They provided couple minor firmware upgrades, and after a decade on the market, EOLed the switch.&lt;/p&gt;
&lt;p&gt;It is the world which changed.&lt;/p&gt;
&lt;p&gt;Couple decades ago, network hardware once deployed would be working for years, practically forever. Security risks weren't
so serious as we have now. No one would deprecate and remove protocols in the name of security.
How long 3DES (hell, even single DES?) was with us?&lt;/p&gt;
&lt;p&gt;Today, security is paramount. Our lifes are entwined with TCP/IP services. Protocols are phased out
and improved when needed. Web browsers automatically update to newer versions. &lt;strong&gt;And this is good&lt;/strong&gt;.
But manufactures need to catch up. Product development cannot end when market availability starts.
Fixes, updates are required to do more work to retain functionality. Even bigger changes like adding new TLS protocol
needs to happen during the device lifetime. We need regulators (like EU) to enforce that.&lt;/p&gt;
&lt;p&gt;We also need to vote with our wallets. Maybe pay a bit more, but buy from companies providing better support
for their products, through their shelf-life and beyond. Couple of years ago I was &lt;a class="reference external" href="https://lwn.net/Articles/659603/"&gt;dissapointed&lt;/a&gt;
&lt;a class="reference external" href="https://enotty.pipebreaker.pl/posts/2016/04/schronisko-dla-kart-sd/"&gt;[2]&lt;/a&gt; with Motorola not delivering on promise of upgrades for Moto G. I will not buy Motorola Android phone
again.&lt;/p&gt;
&lt;p&gt;What options do I have with the switch?&lt;/p&gt;
&lt;p&gt;I could replace the switch with something modern, but it's just spending money and generating electro-waste.&lt;/p&gt;
&lt;p&gt;I could get a little VM with obsolete operating system and an old browser just to manage this switch. This is unsafe,
makes me shudder and is too cumbersome to even consider.&lt;/p&gt;
&lt;p&gt;Finally, I can manage the device using plain, unencrypted HTTP. Given it's accessible in my LAN only,
this is the way to go. I will be sad inside, but that's the only loss.&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal"&gt;sslscan&lt;/code&gt; output below shows the sad state of TP-SG2216 web management:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code text"&gt;&lt;a id="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-1" name="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-1" href="https://enotty.pipebreaker.pl/posts/2022/02/the-lights-are-blinking-but-a-part-of-me-is-broken/#rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-1"&gt;&lt;/a&gt;Testing SSL server distrans.pipebreaker.pl on port 443 using SNI name distrans.pipebreaker.pl
&lt;a id="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-2" name="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-2" href="https://enotty.pipebreaker.pl/posts/2022/02/the-lights-are-blinking-but-a-part-of-me-is-broken/#rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-2"&gt;&lt;/a&gt;
&lt;a id="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-3" name="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-3" href="https://enotty.pipebreaker.pl/posts/2022/02/the-lights-are-blinking-but-a-part-of-me-is-broken/#rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-3"&gt;&lt;/a&gt;SSL/TLS Protocols:
&lt;a id="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-4" name="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-4" href="https://enotty.pipebreaker.pl/posts/2022/02/the-lights-are-blinking-but-a-part-of-me-is-broken/#rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-4"&gt;&lt;/a&gt;SSLv2     disabled
&lt;a id="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-5" name="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-5" href="https://enotty.pipebreaker.pl/posts/2022/02/the-lights-are-blinking-but-a-part-of-me-is-broken/#rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-5"&gt;&lt;/a&gt;SSLv3     disabled
&lt;a id="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-6" name="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-6" href="https://enotty.pipebreaker.pl/posts/2022/02/the-lights-are-blinking-but-a-part-of-me-is-broken/#rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-6"&gt;&lt;/a&gt;TLSv1.0   enabled
&lt;a id="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-7" name="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-7" href="https://enotty.pipebreaker.pl/posts/2022/02/the-lights-are-blinking-but-a-part-of-me-is-broken/#rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-7"&gt;&lt;/a&gt;TLSv1.1   disabled
&lt;a id="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-8" name="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-8" href="https://enotty.pipebreaker.pl/posts/2022/02/the-lights-are-blinking-but-a-part-of-me-is-broken/#rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-8"&gt;&lt;/a&gt;TLSv1.2   disabled
&lt;a id="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-9" name="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-9" href="https://enotty.pipebreaker.pl/posts/2022/02/the-lights-are-blinking-but-a-part-of-me-is-broken/#rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-9"&gt;&lt;/a&gt;TLSv1.3   disabled
&lt;a id="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-10" name="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-10" href="https://enotty.pipebreaker.pl/posts/2022/02/the-lights-are-blinking-but-a-part-of-me-is-broken/#rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-10"&gt;&lt;/a&gt;
&lt;a id="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-11" name="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-11" href="https://enotty.pipebreaker.pl/posts/2022/02/the-lights-are-blinking-but-a-part-of-me-is-broken/#rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-11"&gt;&lt;/a&gt;Supported Server Cipher(s):
&lt;a id="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-12" name="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-12" href="https://enotty.pipebreaker.pl/posts/2022/02/the-lights-are-blinking-but-a-part-of-me-is-broken/#rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-12"&gt;&lt;/a&gt;Preferred TLSv1.0  128 bits  RC4-SHA
&lt;a id="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-13" name="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-13" href="https://enotty.pipebreaker.pl/posts/2022/02/the-lights-are-blinking-but-a-part-of-me-is-broken/#rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-13"&gt;&lt;/a&gt;Accepted  TLSv1.0  128 bits  RC4-MD5
&lt;a id="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-14" name="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-14" href="https://enotty.pipebreaker.pl/posts/2022/02/the-lights-are-blinking-but-a-part-of-me-is-broken/#rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-14"&gt;&lt;/a&gt;Accepted  TLSv1.0  112 bits  DES-CBC3-SHA
&lt;a id="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-15" name="rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-15" href="https://enotty.pipebreaker.pl/posts/2022/02/the-lights-are-blinking-but-a-part-of-me-is-broken/#rest_code_ad8ec2f234ce4e9a834d473d0a33cef5-15"&gt;&lt;/a&gt;Accepted  TLSv1.0  56 bits   TLS_RSA_WITH_DES_CBC_SHA
&lt;/pre&gt;&lt;/div&gt;</description><category>english</category><guid>https://enotty.pipebreaker.pl/posts/2022/02/the-lights-are-blinking-but-a-part-of-me-is-broken/</guid><pubDate>Sat, 12 Feb 2022 13:34:33 GMT</pubDate></item><item><title>I am sorry if you read this at “We Make Fedora” :(</title><link>https://enotty.pipebreaker.pl/posts/2021/11/i-am-sorry-if-you-read-this-at-we-make-fedora/</link><dc:creator>Tomasz Torcz</dc:creator><description>&lt;p&gt;Chances are you are reading this post on a blog aggregator (“planet”)
named &lt;em&gt;We Make Fedora&lt;/em&gt; (lack of link deliberate). &lt;em&gt;We Make Fedora&lt;/em&gt; was
&lt;a class="reference external" href="https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/S37ZLH6WV26JZDA4UXIFKV4V52KL2M3Q/"&gt;apparently organised by Daniel Pocock&lt;/a&gt;.
He copied all the blog sources from &lt;a class="reference external" href="http://fedoraplanet.org/"&gt;Planet Fedora&lt;/a&gt;,
&lt;strong&gt;but mixed-in some shady, anonymous sources&lt;/strong&gt;. This way, “conspiracy theory”-like nameless
posts &lt;strong&gt;build on credibility of real Fedora developer's blogs&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I do not want neither my name nor mine posts to appear alongside such content. Examples
of recent posts:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;borderline slanderous posts about Chris Lamb, former Debian leadership (on allegely Fedora-related site!) personal matters&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;insinuations about trafficking of underage girls by open source communities, on one occasion implicating Justin W. Flory from Fedora&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;comparison between Adolf Hitler's activities (!!!) and German Free Software Foundation of Europe&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;equaling Google's Youth Hacking 4 Freedom with nazi Concentration Camps&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- Sources:
https://fsfellowship.eu/open-labs-mozilla-grooming-women-for-outreachy/
https://fsfellowship.eu/justin-flory-unicef-redhat-jeffrey-epstein-moment/
https://fsfellowship.eu/100-years-hitler-psychological-experiments-on-volunteers/
https://fsfellowship.eu/matthias-kirschner-fsfe-people-trafficking-coercion-volunteers/
http://fsfellowship.eu/google-fsfe-child-labor/
https://debian.community/karen-sandler-outreachy-debian-money/
https://debian.community/mark-shuttleworth-elio-qoshi-debian-ubuntu-underage-girls/ --&gt;
&lt;p&gt;Holocaust is a very painful memory for European society. It should never be
forgotten, the memory should be treated with seriousness in places like
&lt;a class="reference external" href="https://www.yadvashem.org/"&gt;Yad Vashem Institue&lt;/a&gt;. It should &lt;strong&gt;never&lt;/strong&gt; be
used in an anonymous slanderous content.&lt;/p&gt;
&lt;p&gt;Again, &lt;strong&gt;I do not want my name used to legitimise above content&lt;/strong&gt;.
I've asked Daniel to remove my blog from his aggregator three times:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;on Tue, 24 Aug 2021 12:00:33 +0200, in a direct email&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;on Mon, 6 Sep 2021 09:17:35 +0200, in an email to Daniel and fedora-devel (apparently still in moderation queue)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;on Mon, 6 Sep 2021 17:08:42 +0200, in a reply to Daniel&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Despite above efforts, my posts still appear on &lt;em&gt;We Make Fedora&lt;/em&gt;. I don't
want to see my name on a site with such dubious content. I going to block access
to my RSS/ATOM feeds for the aggregator. Unfortunately anyone can utilize
public feeds to create any site he wants.&lt;/p&gt;</description><category>english</category><guid>https://enotty.pipebreaker.pl/posts/2021/11/i-am-sorry-if-you-read-this-at-we-make-fedora/</guid><pubDate>Sat, 27 Nov 2021 16:00:00 GMT</pubDate></item><item><title>ACME &amp; FreeIPA – super easy</title><link>https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/</link><dc:creator>Tomasz Torcz</dc:creator><description>&lt;p&gt;This post will be short. Recent &lt;a class="reference external" href="https://freeipa.org"&gt;FreeIPA&lt;/a&gt; versions
contain ACME server implementation, which makes TLS certificate issuance a breeze.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;FreeIPA&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;FreeIPA is a solution giving you LDAP for user accounts, CA for issuing certificates
and Kerberos for SSO, delivered with nice WebUI in an integrated package.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;ACME&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;em&gt;Automated Certificate Management Environment&lt;/em&gt; is a protocol designed to automate
process of getting a TLS certificate. It was popularised by Let's Encrypt, BuyPass,
Venafi and others.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;When you have FreeIPA, you have your own Certificate Authority. It is most sensible
to use it for securing your internal endpoints. Your clients should already trust this CA.
Your internal network may not be reachable by external ACME providers. And you may want
to hide your internal hostnames from appearing in global Certificate Transparency Databases.&lt;/p&gt;
&lt;p&gt;Ready to start? Make sure package &lt;cite&gt;pki-acme&lt;/cite&gt; is installed on you FreeIPA server. Next,
enable ACME functionality:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;$ ipa-acme-manage enable&lt;/p&gt;
&lt;p&gt;The ipa-acme-manage command was successful&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Done! Now configure the client – for my k8s I'm using awesome &lt;a class="reference external" href="https://cert-manager.io/"&gt;cert-manager&lt;/a&gt;.
Start with definition of a &lt;cite&gt;ClusterIssuer&lt;/cite&gt; with your FreeIPA URL (put you own email and server address, of course):&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code yaml"&gt;&lt;a id="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-1" name="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-1" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/#rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-1"&gt;&lt;/a&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;a id="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-2" name="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-2" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/#rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-2"&gt;&lt;/a&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ClusterIssuer&lt;/span&gt;
&lt;a id="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-3" name="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-3" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/#rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-3"&gt;&lt;/a&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;cert-manager.io/v1&lt;/span&gt;
&lt;a id="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-4" name="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-4" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/#rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-4"&gt;&lt;/a&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-5" name="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-5" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/#rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;pipebreaker-freeipa&lt;/span&gt;
&lt;a id="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-6" name="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-6" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/#rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-7" name="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-7" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/#rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;acme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-8" name="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-8" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/#rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;tomek@pipebreaker.pl&lt;/span&gt;
&lt;a id="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-9" name="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-9" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/#rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;https://ipa-ca.pipebreaker.pl/acme/directory&lt;/span&gt;
&lt;a id="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-10" name="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-10" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/#rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;privateKeySecretRef&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-11" name="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-11" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/#rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# Secret resource that will be used to store the account's private key.&lt;/span&gt;
&lt;a id="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-12" name="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-12" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/#rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;issuer-pbrk-account-key&lt;/span&gt;
&lt;a id="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-13" name="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-13" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/#rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;solvers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-14" name="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-14" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/#rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;http01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-15" name="rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-15" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/#rest_code_cbf4792ede8e45cf8bc153f8cc4f8b20-15"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;ingress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Second (and last) step is to annotate each ingress which should get a TLS certificate
automatically provided:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code yaml"&gt;&lt;a id="rest_code_336dcaa664f34c79b608473d02d739d2-1" name="rest_code_336dcaa664f34c79b608473d02d739d2-1" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/#rest_code_336dcaa664f34c79b608473d02d739d2-1"&gt;&lt;/a&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;a id="rest_code_336dcaa664f34c79b608473d02d739d2-2" name="rest_code_336dcaa664f34c79b608473d02d739d2-2" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/#rest_code_336dcaa664f34c79b608473d02d739d2-2"&gt;&lt;/a&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Ingress&lt;/span&gt;
&lt;a id="rest_code_336dcaa664f34c79b608473d02d739d2-3" name="rest_code_336dcaa664f34c79b608473d02d739d2-3" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/#rest_code_336dcaa664f34c79b608473d02d739d2-3"&gt;&lt;/a&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;networking.k8s.io/v1&lt;/span&gt;
&lt;a id="rest_code_336dcaa664f34c79b608473d02d739d2-4" name="rest_code_336dcaa664f34c79b608473d02d739d2-4" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/#rest_code_336dcaa664f34c79b608473d02d739d2-4"&gt;&lt;/a&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_336dcaa664f34c79b608473d02d739d2-5" name="rest_code_336dcaa664f34c79b608473d02d739d2-5" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/#rest_code_336dcaa664f34c79b608473d02d739d2-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;annotations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_336dcaa664f34c79b608473d02d739d2-6" name="rest_code_336dcaa664f34c79b608473d02d739d2-6" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/#rest_code_336dcaa664f34c79b608473d02d739d2-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;cert-manager.io/cluster-issuer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;pipebreaker-freeipa&lt;/span&gt;
&lt;a id="rest_code_336dcaa664f34c79b608473d02d739d2-7" name="rest_code_336dcaa664f34c79b608473d02d739d2-7" href="https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/#rest_code_336dcaa664f34c79b608473d02d739d2-7"&gt;&lt;/a&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;…&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And that's basically it. After few moments certificate should be issued:&lt;/p&gt;
&lt;img alt="/dżogstaff/2021.11.25-freeipa-issued-certificate.png" class="align-center" src="https://enotty.pipebreaker.pl/d%C5%BCogstaff/2021.11.25-freeipa-issued-certificate.png"&gt;
&lt;p&gt;When using &lt;cite&gt;cert-manager&lt;/cite&gt;, make sure it's version &lt;strong&gt;1.6.0&lt;/strong&gt; or later. There was
&lt;a class="reference external" href="https://github.com/jetstack/cert-manager/pull/4430"&gt;a fix for ambiguity in spec&lt;/a&gt; which solved
some interoperability problems with FreeIPA implementation. The fix &lt;em&gt;may&lt;/em&gt; be backported for older
&lt;cite&gt;cert-manager&lt;/cite&gt; releases.&lt;/p&gt;</description><category>english</category><guid>https://enotty.pipebreaker.pl/posts/2021/11/acme-freeipa-super-easy/</guid><pubDate>Thu, 25 Nov 2021 11:05:24 GMT</pubDate></item><item><title>Makeshift Kubernetes external load balancer with haproxy</title><link>https://enotty.pipebreaker.pl/posts/2021/07/makeshift-kubernetes-external-load-balancer-with-haproxy/</link><dc:creator>Tomasz Torcz</dc:creator><description>&lt;p&gt;Some time ago I've replaced Google Analytics with &lt;a class="reference external" href="https://plausible.io/"&gt;Plausible&lt;/a&gt;. It works great,
except for one tiny thing. The map of visitors was empty. Due to various layers of Network Adress Translations
in &lt;a class="reference external" href="https://enotty.pipebreaker.pl/posts/2020/12/k3s-is-tiny-and-cute/"&gt;k3s&lt;/a&gt; networking setup, the original
client IP address information was not reaching analytics engine.&lt;/p&gt;
&lt;p&gt;There are solutions – there is a &lt;a class="reference external" href="https://www.haproxy.com/blog/haproxy/proxy-protocol/"&gt;PROXY Protocol&lt;/a&gt; exactly
for that case. And Traefik, which handles ingress in k3s, supports PROXY. Only a bit of gymnastic was needed.&lt;/p&gt;
&lt;p&gt;Legacy IPv4 traffic entry point to my bare-metal cluster has a form of a small &lt;em&gt;in-the-cloud&lt;/em&gt; virtual machine. It routes incoming TCP/443 traffic
over the VPN into the cluster. The VM itself &lt;strong&gt;is not&lt;/strong&gt; a part of kubernetes setup – I cannot run any pods on it. I've
decided to use Ansible to configure it.&lt;/p&gt;
&lt;p&gt;The outcome lives in &lt;a class="reference external" href="https://github.com/zdzichu/k8s-haproxy-external-lb"&gt;k8s-haproxy-external-lb&lt;/a&gt; and gives me following map:&lt;/p&gt;
&lt;img alt="/dżogstaff/2021.07.30-plausible-map.png" class="align-center" src="https://enotty.pipebreaker.pl/d%C5%BCogstaff/2021.07.30-plausible-map.png"&gt;
&lt;p&gt;&lt;em&gt;(greetings Australia, have you found information about the red LED on Sonoff?)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There are few moving parts, but with Python, Kubernetes and Ansible, the result is suprisingly simple:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;there's a persistent pod running on the k8s cluster, watching &lt;code class="docutils literal"&gt;EndPoints&lt;/code&gt; exposed by Traefik. When
a change occurs (traefik pod restart, replica count modification, etc.) – ansible playbook is triggered.
This pod may be seen as a &lt;em&gt;k8s controller&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ansible playbook collects Traefik pod's IP addresses and ports.
JSON parsing in ansible is a bit suboptimal:
&lt;code class="docutils literal"&gt;… | first | first | first&lt;/code&gt; &lt;a class="reference external" href="https://github.com/zdzichu/k8s-haproxy-external-lb/blob/9a964ecafd6311a92fe954993147cac4f4248b4f/ansible/haproxy-configure.yaml#L28"&gt;looks bad&lt;/a&gt; but works.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;still using ansible, haproxy configuration file is created, put on the edge nodes, and the service is restarted. I've selected
haproxy because:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;it implements PROXY protocol&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I did &lt;a class="reference external" href="https://enotty.pipebreaker.pl/posts/2019/07/openshifts-haproxy-as-ipv6-ingress/"&gt;similar thing on OpenShift&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;haproxy passes received traffic directly to Traefik. This happens at the TCP level. TLS is terminated at Traefik,
and certificates do not leave kubernetes cluster.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some minimal preparations were needed. Communication between edge node and kubernetes pod network had to be established.
This was done in an instant, thanks to &lt;a class="reference external" href="https://wireguard.com"&gt;Wireguard&lt;/a&gt;.
SSH keypair for ansible had to be put in a k8s &lt;code class="docutils literal"&gt;Secret&lt;/code&gt; and distributed among edge nodes. Finally, small fix
was needed in ansible itself: &lt;em&gt;local&lt;/em&gt; connection plugin was not happy when run in a container, as random user without
an entry in &lt;code class="docutils literal"&gt;/etc/passwd&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Traefik&lt;/em&gt; had to be configured to trust PROXY protocol information and generate &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;X-Forwarded-For&lt;/span&gt;&lt;/code&gt; headers.
&lt;em&gt;Plausible&lt;/em&gt; utilized information in those headers without additional tinkering.&lt;/p&gt;
&lt;p&gt;Configuration details are described at &lt;a class="reference external" href="https://github.com/zdzichu/k8s-haproxy-external-lb"&gt;https://github.com/zdzichu/k8s-haproxy-external-lb&lt;/a&gt;.&lt;/p&gt;</description><category>english</category><guid>https://enotty.pipebreaker.pl/posts/2021/07/makeshift-kubernetes-external-load-balancer-with-haproxy/</guid><pubDate>Fri, 30 Jul 2021 12:56:58 GMT</pubDate></item><item><title>PSA: kernel 5.12.11 is safe for bcache, again</title><link>https://enotty.pipebreaker.pl/posts/2021/06/psa-kernel-51211-is-safe-for-bcache-again/</link><dc:creator>Tomasz Torcz</dc:creator><description>&lt;p&gt;With the release of Linux kernel 5.12.11, &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Bcache"&gt;bcache&lt;/a&gt;
is safe to use, again. The &lt;a class="reference external" href="https://marc.info/?l=linux-bcache&amp;amp;m=162307032231208&amp;amp;w=2"&gt;patch&lt;/a&gt;
&lt;code class="docutils literal"&gt;bcache: avoid oversized read request in cache missing code path&lt;/code&gt; has been merged.&lt;/p&gt;
&lt;p&gt;Due to changes in 5.12 kernels, &lt;code class="docutils literal"&gt;bcache&lt;/code&gt; was prone to cause a &lt;code class="docutils literal"&gt;BUG_ON()&lt;/code&gt; when submitting
large I/O requests. The result was a kernel panic or a system freeze. Problem was reported in
couple of places: &lt;a class="reference external" href="https://bugzilla.redhat.com/show_bug.cgi?id=1965809"&gt;Fedora bug#1965809&lt;/a&gt;,
&lt;a class="reference external" href="https://www.spinics.net/lists/linux-bcache/msg10224.html"&gt;bcache mailing list #1&lt;/a&gt;,
&lt;a class="reference external" href="https://marc.info/?l=linux-bcache&amp;amp;m=162110659619628&amp;amp;w=2"&gt;bcache mailing list #2&lt;/a&gt;.&lt;/p&gt;</description><category>english</category><guid>https://enotty.pipebreaker.pl/posts/2021/06/psa-kernel-51211-is-safe-for-bcache-again/</guid><pubDate>Wed, 16 Jun 2021 10:32:18 GMT</pubDate></item><item><title>At some point UI loses usefulness</title><link>https://enotty.pipebreaker.pl/posts/2021/04/at-some-point-ui-loses-usefulness/</link><dc:creator>Tomasz Torcz</dc:creator><description>&lt;p&gt;When it comes to configurability, modern software often
hits a sweet spot. We are given nice, usable User Interface (UI) helping
with configuration – by hinting, auto-filling and validating fields.
Additionaly, the configuration itself is stored in &lt;em&gt;text&lt;/em&gt; format,
making it easy to backup and track changes. For example in git version control system.&lt;/p&gt;
&lt;p&gt;Recently I encountered at least two cases, where the above features conflict.&lt;/p&gt;
&lt;section id="argo-cd"&gt;
&lt;h2&gt;Argo CD&lt;/h2&gt;
&lt;p&gt;Argo CD is a wonderful tool to implement GitOps with you Kubernetes cluster.&lt;/p&gt;
&lt;p&gt;Kubernetes is configured by plain text files in YAML format. That's a perfect
form to track in git. Argo CD provides synchronization service: what you have in
git repository is applied to kubernetes. Synchronization could be automatic or
you can opt to sync manually. In later case, Argo CD provides a nice &lt;em&gt;diff&lt;/em&gt;
view, showing what's currently configured and how should it be.&lt;/p&gt;
&lt;p&gt;Argo CD also has a nice concept of responsibility boundaries: it cares only about YAML sections
and fields present in the git repo. If you &lt;em&gt;add&lt;/em&gt; new section on the running cluster,
it won't be touched. It may be a single field,
&lt;a class="reference external" href="https://argoproj.github.io/argo-cd/user-guide/best_practices/#leaving-room-for-imperativeness"&gt;for example – replicas:&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Above can be utilized when you manage Argo CD by Argo CD. &lt;code class="docutils literal"&gt;install.yaml&lt;/code&gt; file
defines configuration resources likes &lt;code class="docutils literal"&gt;ConfigMaps&lt;/code&gt; and &lt;code class="docutils literal"&gt;Secrets&lt;/code&gt;, yet
it doesn't provide actual &lt;code class="docutils literal"&gt;data:&lt;/code&gt; sections. When you configure
Argo CD installation – using nice web UI, no less - &lt;code class="docutils literal"&gt;data:&lt;/code&gt; sections
are created and configuration is stored into k8s cluster.&lt;/p&gt;
&lt;p&gt;Those sections are not part of what is stored in git repository, so they
will neither be touched nor rewritten.&lt;/p&gt;
&lt;p&gt;But what happens when we &lt;em&gt;want&lt;/em&gt; to store the Argo CD configuration in the repository,
and gitops it to the Moon and back?&lt;/p&gt;
&lt;p&gt;If we add &lt;code class="docutils literal"&gt;data:&lt;/code&gt; sections, they will be synced. But we will lose ability
to use nice UI directly! As UI makes changes on the running cluster,
Argo CD will notice live configuration differs from git repository one.
It will overwrite our new configuration, undoing changes.&lt;/p&gt;
&lt;p&gt;If we want to gitops configuration, we basically must stop using UI
and manually add all changes to the text files in the repository!&lt;/p&gt;
&lt;/section&gt;
&lt;section id="grafana"&gt;
&lt;h2&gt;Grafana&lt;/h2&gt;
&lt;p&gt;Grafana is another cool project. It is a graphing/dashboarding/alerting solution,
which looks pretty and is quite powerful, yet easy to use. Mainly because
user interface is a pleasure to use; all changes are visible instantly and we are
free to experiment.&lt;/p&gt;
&lt;p&gt;Behind the scenes dashboards are just &lt;a class="reference external" href="https://grafana.com/docs/grafana/latest/dashboards/json-model/"&gt;text (JSON) files&lt;/a&gt;.
Great, text, let's store it in git! Well…&lt;/p&gt;
&lt;p&gt;First of all, generated JSON tend to be dynamic. If you do some manipulations in the UI,
sections in final file may move relative to each other. Even if the content does not change.&lt;/p&gt;
&lt;p&gt;Second, those documents tend to be &lt;em&gt;verbose&lt;/em&gt;. Like, really. It is not recommended to edit
them manually, better use some templating language. For example &lt;a class="reference external" href="https://github.com/grafana/grafonnet-lib"&gt;grafonnet&lt;/a&gt;, which
is a customisation of &lt;em&gt;jsonnet&lt;/em&gt; - templating for JSON.&lt;/p&gt;
&lt;p&gt;The reader probably sees where it's all going. Decision to use grafonnet makes the
whole nice UI almost useless, as it spits JSON only. Again, to have better control, history
and visibility we must forego one of the main selling points of the software.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="solutions-are-there-any"&gt;
&lt;h2&gt;Solutions? Are there any?&lt;/h2&gt;
&lt;p&gt;Frankly, I don't see anything perfect. We have some workarounds, but they feel cumbersome.&lt;/p&gt;
&lt;p&gt;For &lt;strong&gt;Argo CD&lt;/strong&gt; we can disable &lt;em&gt;self-healing&lt;/em&gt; of an app. That is, &lt;em&gt;disable automatic synchronisation&lt;/em&gt;.
That way we can still use the UI to do the configuration. Argo CD will notice out-of-sync status
between git and live cluster. It will also provide helpful diff: showing exactly how
changes made in the UI are reflected in the text configuration.&lt;/p&gt;
&lt;p&gt;When we're happy with the changes, we have to extract them from diff view and commit to the
git repository. Cumbersome. And we lose active counter-measurements against configuration drift.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Grafana&lt;/strong&gt; problem we fight with &lt;em&gt;sandbox&lt;/em&gt; instance. Any (templated) dashboard can be loaded,
then customised with &lt;em&gt;clickety click&lt;/em&gt; and exported to JSON. Now the tedious part begins:
new stuff from JSON need to be identified, extracted, &lt;em&gt;translated back into templating language&lt;/em&gt;
and hand merged into grafonnet dashboard definition.&lt;/p&gt;
&lt;p&gt;The improved dashboard should be imported into sandbox again and verified. If it is all right,
it could be promoted to more important environments. Cumbersome².&lt;/p&gt;
&lt;p&gt;I'm very interested in better solutions. If you have comments, ideas, links, please
use comments section below!&lt;/p&gt;
&lt;/section&gt;</description><category>english</category><guid>https://enotty.pipebreaker.pl/posts/2021/04/at-some-point-ui-loses-usefulness/</guid><pubDate>Thu, 29 Apr 2021 18:47:21 GMT</pubDate></item><item><title>KubeCon NA 2020 talks to watch, part 1</title><link>https://enotty.pipebreaker.pl/posts/2021/01/kubecon-na-2020-talks-to-watch-part-1/</link><dc:creator>Tomasz Torcz</dc:creator><description>&lt;p&gt;Pandemic situation forced most of the conferences to go on-line.  On the one hand, it's not
the same experience as in-person attendance. On the other hand - I can participate in events I wouldn't be able to travel
to. Therefore I took part in &lt;strong&gt;KubeCon + CloudNativeCon North America 2020&lt;/strong&gt; last November.
Moving to online format reduced price from $1000+ to just $75, which made it easier to justify 😊.
It was a bit unusual to be at work in the morning, then move to couch and stay at the conference past midnight.&lt;/p&gt;
&lt;p&gt;The online setup was quite good. There were virtual "booths" one would expect at expo – with demos,
links to more materials and exhibitor's crew available for chat. There were additional number of channels
on CNCF Slack. I followed the announcement one, sponsors one (heaps of interesting information there!) and
some run by specific companies.&lt;/p&gt;
&lt;p&gt;During the Conference there were some "meet the maintainer" events and accompanying gatherings. Those mainly
had a form of Zoom (the owners of Keybase) video meetings where one could chat with the developers. I liked these!&lt;/p&gt;
&lt;p&gt;The main course of conference are talks. There were plenty. Sometimes there were a dozen or so parallel tracks,
so I did not have a chance to watch everything. I'm slowly working through backlog of things I missed.
The talks itself were pre-recorded, but after the talk there was a live Q&amp;amp;A session with the speaker.
Sadly, the Q&amp;amp;A is not available in recordings below. I guess this was one of the exclusive perks for attendees.&lt;/p&gt;
&lt;p&gt;Below you'll find part 1 of my selection of most interesting talks. Second part will be coming later, but
you can find all descriptions and links to the videos at &lt;a class="reference external" href="https://kccncna20.sched.com/"&gt;https://kccncna20.sched.com/&lt;/a&gt;.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;PKI the Wrong Way: Simple TLS Mistakes and Surprising Consequences - Tabitha Sable, Datadog&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="youtube-video align-center"&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/gcOLDEzsVHI?rel=0&amp;amp;wmode=transparent" frameborder="0" allow="encrypted-media" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The Quest for the Ultimate Kubernetes Homelab - Dan Garfield, Codefresh&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="youtube-video align-center"&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/TLEcfZMMB9Q?rel=0&amp;amp;wmode=transparent" frameborder="0" allow="encrypted-media" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Stop Writing Operators - Joe Thompson, HashiCorp&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="youtube-video align-center"&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/CwVCfl4qpdg?rel=0&amp;amp;wmode=transparent" frameborder="0" allow="encrypted-media" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Clean Up Your Room! What Does It Mean to Delete Something in K8s - Aaron Alpar, Kasten&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="youtube-video align-center"&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/F7-ZxWwf4sY?rel=0&amp;amp;wmode=transparent" frameborder="0" allow="encrypted-media" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;How to Multiply the Power of Argo Projects By Using Them Together - Hong Wang&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="youtube-video align-center"&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/fKiU7txd4RI?rel=0&amp;amp;wmode=transparent" frameborder="0" allow="encrypted-media" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Stress and Mental Health in Technology - Dr. Jennifer Akullian, Growth Coaching Institute&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="youtube-video align-center"&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/Z_Eo3i4K6Kk?rel=0&amp;amp;wmode=transparent" frameborder="0" allow="encrypted-media" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The Open Source Revolution: How Kubernetes is Changing the Games Industry - Dominic Green&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="youtube-video align-center"&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/VH5aXYO6f3o?rel=0&amp;amp;wmode=transparent" frameborder="0" allow="encrypted-media" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Admission Control, We Have a Problem - Ryan Jarvinen, Red Hat&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="youtube-video align-center"&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/mZlv0Jp8TcI?rel=0&amp;amp;wmode=transparent" frameborder="0" allow="encrypted-media" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;High Performance KubeVirt in Action - Huamin Chen, Red Hat &amp;amp; Marcin Franczyk, Kubermatic&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="youtube-video align-center"&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/_dyUGDhCb6U?rel=0&amp;amp;wmode=transparent" frameborder="0" allow="encrypted-media" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;This one is from last year, but interesting:  How the Department of Defense Moved to Kubernetes and Istio - Nicolas Chaillan&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="youtube-video align-center"&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/YjZ4AZ7hRM0?rel=0&amp;amp;wmode=transparent" frameborder="0" allow="encrypted-media" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;&lt;p&gt;An observation: as for virtual conference, this one had a hefty carbon footprint! Imagine how many planes were flown to deliver these:&lt;/p&gt;
&lt;img alt="KubeCon NA 2020 swag (t-shirts and a tumbler)" class="align-center" src="https://enotty.pipebreaker.pl/d%C5%BCogstaff/2021.01.09-kubeconNA2020swag.jpg" style="width: 90%;"&gt;</description><category>english</category><guid>https://enotty.pipebreaker.pl/posts/2021/01/kubecon-na-2020-talks-to-watch-part-1/</guid><pubDate>Sat, 09 Jan 2021 12:47:23 GMT</pubDate></item><item><title>k3s is tiny and cute</title><link>https://enotty.pipebreaker.pl/posts/2020/12/k3s-is-tiny-and-cute/</link><dc:creator>Tomasz Torcz</dc:creator><description>&lt;p&gt;After KubeCon I've decided to give &lt;a class="reference external" href="https://k3s.io"&gt;k3s&lt;/a&gt; a try. And I'm impressed!&lt;/p&gt;
&lt;p&gt;K3s is a small distribution of Kubernetes (k8s), Linux container orchestrator system. It's
really tiny while being functional. One starts with a single 52MiB binary and after
few seconds there's a functional installation with half a dozen of system pods. It's
a far cry from &lt;a class="reference external" href="https://enotty.pipebreaker.pl/posts/2020/07/trying-okd4-home-lab-needs-to-grow/"&gt;OKD and its resource hunger&lt;/a&gt;.
Of course, compared to OKD, there's much less functionality in k3s, but enough
for most cases (including mine).&lt;/p&gt;
&lt;p&gt;First, I'm writing now, because only recently &lt;code class="docutils literal"&gt;cgroupsv2&lt;/code&gt; support was added to k3s. Previously it just didn't work on modern systems, like Fedora.&lt;/p&gt;
&lt;p&gt;Second, the &lt;code class="docutils literal"&gt;etcd&lt;/code&gt; database, widely perceived as a mandatory part of k8s, is &lt;strong&gt;optional&lt;/strong&gt; in k3s! By default
embedded SQLite is used – enough for simple scenarios. I'm particularly happy for &lt;strong&gt;Postgresql&lt;/strong&gt; support. Yes,
you can have your Kubernetes working with &lt;em&gt;pgsql&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;But K3s is &lt;em&gt;not&lt;/em&gt; a single-node solution only. Adding worker nodes is simple; High-Availability solutions for control-plane
looks sound (haven't tried yet, but it's on my TODO).&lt;/p&gt;
&lt;p&gt;For networking one can easily encrypt inter-node traffic using &lt;strong&gt;WireGuard&lt;/strong&gt;. It's a matter of single switch for
provided &lt;code class="docutils literal"&gt;flannel&lt;/code&gt; network backend.  Higher level needs? k3s ships with &lt;code class="docutils literal"&gt;Traefik&lt;/code&gt; (which supports ACME for getting
TLS certificates) and &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;klipper-lb&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Unfortunately at the lowest level, networking still depends on &lt;code class="docutils literal"&gt;iptables&lt;/code&gt;. This was horrible choice in the
beginning of Kubernetes, already 15 years obsolete when it was selected. With known performance problems:
nf-hipac tried to solve the problems when, in 2002? Huawei &lt;a class="reference external" href="https://www.youtube.com/watch?v=4-pawkiazEg"&gt;replaced iptables with Linux IP Virtual Server in 2017&lt;/a&gt;
to have k8s scale. But the solution is still not default in upstream Kubernetes.&lt;/p&gt;
&lt;p&gt;Anyway, for small cluster k3s with iptables should work fine, but it has a potential to demolish your
carefully tuned firewall configuration. So beware. For the positive aspect, go and read
&lt;a class="reference external" href="https://github.com/k3s-io/klipper-lb/blob/master/entry"&gt;klipper-lb entire source code&lt;/a&gt;. This is world
championship in simplicity and getting things done with existing infrastructure.&lt;/p&gt;
&lt;p&gt;Keeping cluster up-to-date can be automated with &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;system-upgrade-controller&lt;/span&gt;&lt;/code&gt;, which downloads new version
and restarts the services. Simple.&lt;/p&gt;
&lt;p&gt;k3s is provided by our Rancher friends at SUSE. I strongly recommend giving it some attention
(at the moment &lt;code class="docutils literal"&gt;INSTALL_K3S_COMMIT=fadc5a8057c244df11757cd47cc50cc4a4cf5887&lt;/code&gt; works for me).
Besides, I vaguely remember one needs k8s cluster to build some Fedora content. ;)&lt;/p&gt;
&lt;section id="unrelated-blog-summary"&gt;
&lt;h2&gt;Unrelated blog summary&lt;/h2&gt;
&lt;p&gt;This year I've strived to write at least one note per month. Well… I've managed to write
9 notes only. In 2021 I will do better!&lt;/p&gt;
&lt;/section&gt;</description><category>english</category><guid>https://enotty.pipebreaker.pl/posts/2020/12/k3s-is-tiny-and-cute/</guid><pubDate>Mon, 14 Dec 2020 11:17:01 GMT</pubDate></item><item><title>Trying OKD4: home lab needs to grow</title><link>https://enotty.pipebreaker.pl/posts/2020/07/trying-okd4-home-lab-needs-to-grow/</link><dc:creator>Tomasz Torcz</dc:creator><description>&lt;p&gt;I've spent last week tinkering with &lt;a class="reference external" href="https://www.okd.io/"&gt;OKD4&lt;/a&gt;, which
is open source base for OpenShift. OpenShift in turn is Red Hat's distribution
of Kubernetes. Such opensource/commercial differentiation is quite popular
among Red Hat products. OKD/OpenShift relation is like AWX/Ansible Tower,
Spacewalk/Satellite, WildFly/JBoss, oVirt/RHEV etc.&lt;/p&gt;
&lt;p&gt;I already had previous version deployed - 3.11, then called &lt;em&gt;Origin&lt;/em&gt;, not OKD.
My cluster consists of two old ThinkPads and a virtual machine, and I
was planning to redeploy OKD4 on them. But first some PoC on virtual machines.&lt;/p&gt;
&lt;p&gt;So I started with minimal viable cluster – 3 schedulable master nodes.
(There's a &lt;a class="reference external" href="https://github.com/code-ready/crc"&gt;Code Ready Containers&lt;/a&gt; version, too – 1 node cluster,
but it's non-upgradable). Requirements table looks scary – 4 CPU cores
and 16GiB per master – but that's probably an overkil, right?&lt;/p&gt;
&lt;p&gt;As it turned out, I won't be able re-use my legacy hardware to host
new cluster. Oh boy, OKD4 is &lt;strong&gt;massive&lt;/strong&gt;.&lt;/p&gt;
&lt;img alt="/dżogstaff/2020.07.25-okd-size.png" src="https://enotty.pipebreaker.pl/d%C5%BCogstaff/2020.07.25-okd-size.png"&gt;
&lt;p&gt;That's the cluster dashboard just after the installation. For all practical
purposes it's an empty platform, I haven't deployed any of my stuff yet.
Almost 5 CPU cores used and 10 gigs of memory. Huh.&lt;/p&gt;
&lt;p&gt;My VMs setup is below minimal requirements, each has 10GiB of RAM and
3 CPU cores. I'm used to think that you &lt;strong&gt;can't&lt;/strong&gt; skimp on memory, but
you &lt;strong&gt;can&lt;/strong&gt; assign fewer CPU cores – at worst everything would be slower.
That won't fly with OKD. Components define CPU needs with &lt;code class="docutils literal"&gt;requires:&lt;/code&gt;
sections. If you don't deliver, you'll get admission errors and the
pods will not run.&lt;/p&gt;
&lt;p&gt;So my home lab would need to be expanded with 64GiB of RAM and some
16 threads CPU, just for OKD. Speaking of CPU…&lt;/p&gt;
&lt;p&gt;I'm seriously taken-aback with CPU usage of this &lt;em&gt;empty&lt;/em&gt; cluster.
I don't know exactly what's using so much. There is
Prometheus scraping metric, one CronJob and a handful of healthchecks,
that's all. Everything should be event-driven and just be idle
when not running any workload. Right now OKD wastes tremendous
amount of power just to do nothing.&lt;/p&gt;
&lt;p&gt;Enough complaining. I like how OKD is managed and configured.&lt;/p&gt;
&lt;p&gt;OKD owns the master nodes, including operating system (Fedora CoreOS).
Everything is managed from within the cluster, and configured
like normal Kubernetes resources - via YAML. LDAP connectivity,
custom logo, apiserver's TLS certificates… create a ConfigMap, update
a field in resources definition and it just happens.&lt;/p&gt;
&lt;p&gt;I much prefer &lt;em&gt;eventual consistency&lt;/em&gt;, asynchronously achieved by k8s operators, to
using &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;openshift-ansible&lt;/span&gt;&lt;/code&gt;. The latter touches everything and tends to break when something
isn't 100% right. Which is cumbersome when each run takes 40+ minutes.&lt;/p&gt;
&lt;p&gt;With OKD you have clean bootstrapping (with ignition config served by
bootstrap k8s node – how cool is that?) and you receive basic working cluster,
which you customize using kubernetes YAMLs.&lt;/p&gt;
&lt;p&gt;Documentation is also very nice and seem to cover every common (and some
less common) case.&lt;/p&gt;</description><category>english</category><guid>https://enotty.pipebreaker.pl/posts/2020/07/trying-okd4-home-lab-needs-to-grow/</guid><pubDate>Sun, 26 Jul 2020 12:27:19 GMT</pubDate></item></channel></rss>