<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jeansen</title>
    <description>The latest articles on DEV Community by Jeansen (@jeansen).</description>
    <link>https://dev.to/jeansen</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1033410%2F6e072d4a-6d9a-49ec-ac34-d8d85362681e.jpeg</url>
      <title>DEV Community: Jeansen</title>
      <link>https://dev.to/jeansen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jeansen"/>
    <language>en</language>
    <item>
      <title>From X11 to Wayland</title>
      <dc:creator>Jeansen</dc:creator>
      <pubDate>Fri, 13 Jun 2025 13:38:35 +0000</pubDate>
      <link>https://dev.to/jeansen/plank-dock-wich-wayland-fpf</link>
      <guid>https://dev.to/jeansen/plank-dock-wich-wayland-fpf</guid>
      <description>&lt;p&gt;Now it is official. Gnome will &lt;a href="https://blogs.gnome.org/alatiera/2025/06/08/the-x11-session-removal/#:~:text=TLDR%3A%20The%20X11%20session%20for,Go%20and%20try%20them%20out" rel="noopener noreferrer"&gt;remove X11 support until version 50!&lt;/a&gt;. I always stayed with X11 because it simply felt more stable than Wayland. But now, it is final. X11 will be no more in Gnome!&lt;/p&gt;

&lt;p&gt;Aside from special features only available in X11, e.g. running X11 applications from a remote host on a local machine though SSH, Gnome works the same way as it does on X11.&lt;/p&gt;

&lt;p&gt;What I truly miss is the &lt;code&gt;xkill&lt;/code&gt; command which allows me to kill any (stuck) X11 app quickly and easily. This was the ultimate BFG like &lt;code&gt;kill -9&lt;/code&gt; but for X11 applications.&lt;/p&gt;

&lt;p&gt;Other things I used on X11 were global hotkeys to remap any key combinations in any application to my liking and a lightweight and minimalistic Dock. For global hotkeys I used Autokey and for the dock I used Plank. Unfortunately both of these applications are X11 only.&lt;/p&gt;

&lt;p&gt;What follows are my (finally) working adoptions and workarounds to get Gnome on Wayland working with global application hotkeys and Plank.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plank
&lt;/h2&gt;

&lt;p&gt;Plank is my favorite lightweight and minimalistic Dock. Unfortunately, it does not natively support Wayland. It is X11 only. But, it does work with some help and using the XWayland wrapper. First, make sure you have XWayland installed. In Debian it is as simple as running &lt;code&gt;sudo apt install xwayland&lt;/code&gt;. This is a little extra package that makes it possible to run X11 applications with Wayland. Second, you must overrule Plank and &lt;code&gt;bamfdaeomon&lt;/code&gt; in detecting their environment.&lt;/p&gt;

&lt;p&gt;For &lt;code&gt;bamfdaemon.service&lt;/code&gt; create the file &lt;code&gt;/usr/lib/systemd/user/bamfdaemon.service.d/override.conf&lt;/code&gt; and put the following override in it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight systemd"&gt;&lt;code&gt;&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="nt"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;"XDG_SESSION_TYPE=x11"
&lt;span class="nt"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;"GDK_BACKEND=x11"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Afterwards, reload the service with &lt;code&gt;sudo systemctl daemon-reload&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;For Plank I wrote a little Systemd script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight systemd"&gt;&lt;code&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="nt"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;Plank Dock
&lt;span class="nt"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;graphical-session.target

&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="nt"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;"XDG_SESSION_TYPE=x11"
&lt;span class="nt"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;"GDK_BACKEND=x11"
&lt;span class="nt"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;/usr/bin/plank
&lt;span class="nt"&gt;Restart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;on-failure
&lt;span class="nt"&gt;RestartSec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;5s

&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;span class="nt"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;default.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Put the above script in &lt;code&gt;~/.config/systemd/user/plank.service&lt;/code&gt; and enable it with &lt;code&gt;systemctl --user enable plank.service&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now, whenever I boot into Gnome, Plank comes up automatically and pinning applications in the dock, including the indicator of already running (and pinned) applications, works as expected. If the indicator is missing, then it is not a X11 application (anymore). For instance, Gedit would not show up. To have it appear it is possible to force the application to run though the XWayland wrapper. Here is an example for Geidt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;GDK_BACKEND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;x11 gedit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Autokey
&lt;/h2&gt;

&lt;p&gt;Another X11-only application I do not want to miss is Autokey. You can make it run under Wayland like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;env&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; WAYLAND_DISPLAY autokey &amp;amp;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One caveat is that Autokey then only intercepts X11 applications. For instance, you could run Google Chrome like this on Wayland and make it compatible with Autokey again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;google-chrome-stable &lt;span class="nt"&gt;--enable-features&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;VaapiVideoDecoder &lt;span class="nt"&gt;--ozone-platform&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;x11 &lt;span class="nt"&gt;--use-gl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;egl &amp;amp;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure you have the necessary drivers installed. On Debian the minimum (with all its dependencies) are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;libva-drm2&lt;/li&gt;
&lt;li&gt;libva-wayland2&lt;/li&gt;
&lt;li&gt;libva-x11-2&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Running Google Chrome this way allowed me to use Autokey the same way I used it on X11. But don't expect the XWayland wrapper to behave exactly as X11. It is a wrapper and like every wrapper it has its flaws and performance issues!&lt;/p&gt;

&lt;h2&gt;
  
  
  xremap
&lt;/h2&gt;

&lt;p&gt;Recently I found a better solution and replaced Autokey with the Help of &lt;a href="https://github.com/xremap/xremap" rel="noopener noreferrer"&gt;xremap&lt;/a&gt;. Following the documentation I had to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;compile and install xremap&lt;br&gt;
&lt;code&gt;cargo install xremap --features gnome&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add a udev rule to run xremap without &lt;code&gt;sudo&lt;/code&gt; privileges&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;gpasswd &lt;span class="nt"&gt;-a&lt;/span&gt; YOUR_USER input
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'KERNEL=="uinput", GROUP="input", TAG+="uaccess", MODE:="0660", OPTIONS+="static_node=uinput"'&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/udev/rules.d/99-input.rules
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;install the accompanying &lt;a href="https://github.com/xremap/xremap-gnome" rel="noopener noreferrer"&gt;Gnome Shell Extension&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and create a configuration file in &lt;code&gt;~/.config/xremap/config.yml&lt;/code&gt;, for example:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;keymap&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Brave Browser&lt;/span&gt;
    &lt;span class="na"&gt;application&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;only&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;brave-browser&lt;/span&gt;
    &lt;span class="na"&gt;remap&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;C-d&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;C-w&lt;/span&gt;
      &lt;span class="na"&gt;C-Shift-d&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;C-Shift-t&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, I created a Systemd service so xremap would also start as soon my Gnome sessions is active:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight systemd"&gt;&lt;code&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="nt"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;Xremap
&lt;span class="nt"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;default.target

&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="nt"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;%h/.cargo/bin/xremap --watch=device %h/.config/xremap/config.yml
&lt;span class="nt"&gt;Restart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;on-failure
&lt;span class="nt"&gt;RestartSec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;3
&lt;span class="nt"&gt;StandardOutput&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;journal
&lt;span class="nt"&gt;StandardError&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;journal

&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;span class="nt"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;graphical-session.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As with the Plank service, put the above script in &lt;code&gt;~/.config/systemd/user/xremap.service&lt;/code&gt; and enable it with &lt;code&gt;systemctl --user enable xremap.service&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;With this setup in place I am now back on track running Gnome (but on Wayland) with my beloved Plank dock and global application hotkeys enabled. Taking the above little configuration file for xremap I can now run Brave and close any tab with &lt;code&gt;ctrl-d&lt;/code&gt; instead of &lt;code&gt;ctrl-w&lt;/code&gt; or reopen an accidentally closed tab with &lt;code&gt;ctrl-shift-d&lt;/code&gt; in place of &lt;code&gt;ctrl-shift-t&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>wayland</category>
      <category>gnome</category>
      <category>plank</category>
    </item>
    <item>
      <title>How AI makes Linux fun!</title>
      <dc:creator>Jeansen</dc:creator>
      <pubDate>Sat, 29 Mar 2025 22:46:57 +0000</pubDate>
      <link>https://dev.to/jeansen/how-ai-makes-linux-fun-30bf</link>
      <guid>https://dev.to/jeansen/how-ai-makes-linux-fun-30bf</guid>
      <description>&lt;p&gt;Remember those days when you face yourself with a challenge (I don't use the term problems anymore ...) and you start your research? For instance, I had the challenge to disconnect an external hard drive and reconnect it. Challenge was not to do physically it but solely from within a script.&lt;/p&gt;

&lt;p&gt;I had never done it before but anyway, I had some vage ideas of how to do it with e.g. &lt;code&gt;eject&lt;/code&gt; the hard way with the help of &lt;code&gt;sysfs&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Normally what followed was a journey like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ask the Internet.&lt;/li&gt;
&lt;li&gt;Read some Q'n A, Blogs etc ...&lt;/li&gt;
&lt;li&gt;Try out findings and consult the &lt;code&gt;man&lt;/code&gt; pages of recommended/unknown commands.&lt;/li&gt;
&lt;li&gt;Repeat step 3 and collect different solutions.&lt;/li&gt;
&lt;li&gt;Make a choice and implement it!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now, with AI tools at hand, it goes like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ask Mr. or Mrs. AI and tell him/her about your problem.&lt;/li&gt;
&lt;li&gt;Get multiple solutions.&lt;/li&gt;
&lt;li&gt;Preselect a favorite solution and try it out.&lt;/li&gt;
&lt;li&gt;Don't worry, be happy! ;-)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AI is a great time saver. What sometimes took me hours to figure out and put together the right way is now a matter of minutes. BUT, a word of caution: Mr. and Mrs. AI like to introduce some fiction, tell stories, get lost in the past and sometimes even hallucinate. I bet, they simply have too much on their mind ;-)&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;There is an idiom that says Linux is not about choice. It's about having to do everything yourself. So, who needs games when you have Linux? Maybe, with our AI couple now caring so much, we have more time for games again ... .&lt;/p&gt;

</description>
      <category>linux</category>
      <category>ai</category>
    </item>
    <item>
      <title>Fix "Dummy Device" for sound on Debian</title>
      <dc:creator>Jeansen</dc:creator>
      <pubDate>Fri, 27 Dec 2024 22:47:47 +0000</pubDate>
      <link>https://dev.to/jeansen/fix-dummy-device-for-sound-on-debian-45e</link>
      <guid>https://dev.to/jeansen/fix-dummy-device-for-sound-on-debian-45e</guid>
      <description>&lt;p&gt;After one of my daily upgrades on Debian (SID), my sound no longer worked. In only saw a "Dummy Device". Although I no longer have PulseAduio installed and replace it with PipeWire, there still were some artifacts that seemed to have caused problems. NOTE: I could still pair my BlueTooth devices. Only my internal Laptop sound devices did not work!&lt;/p&gt;

&lt;p&gt;Here is what worked for me:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I checked if there was any valuable output with &lt;code&gt;journalctl -b --no-pager -g pulseaudio&lt;/code&gt;. In my case it told me some binaries were no longer available and PipeWire shut down. The culprit was &lt;code&gt;/etc/xdg/autostart/pulseaudio.desktop&lt;/code&gt;.
I deleted that file. After a reboot, I did not have ANY sound device to select from.&lt;/li&gt;
&lt;li&gt;So, I reinstalled the following packages: gnome-audio, pipewire-pulse, pipewire-audio.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After another reboot, everything was back to normal :-)&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Debian (Sid|Unstable) with Gnome 47 on X11</title>
      <dc:creator>Jeansen</dc:creator>
      <pubDate>Wed, 30 Oct 2024 21:58:15 +0000</pubDate>
      <link>https://dev.to/jeansen/debian-with-gnome-47-4391</link>
      <guid>https://dev.to/jeansen/debian-with-gnome-47-4391</guid>
      <description>&lt;p&gt;It's been a while since my last post. Busy "days" this year ... Anyway, here's a quick tip because it took me some time to figure it out and there wasn't much help on the Internet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Restore Gnome on X11 session
&lt;/h2&gt;

&lt;p&gt;If you find yourself in the situation where (suddenly) your Gnome desktop would only run on Wayland and there is no longer any entry regarding X11 to choose from before you log in then it might help to simply do &lt;code&gt;sudo apt install gnome-session-xsession&lt;/code&gt;. You should be able to select &lt;code&gt;Gnome on X11&lt;/code&gt; then again from the available sessions. To get that list, enter your user name and then click on the gear symbol.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why stay with X11?
&lt;/h2&gt;

&lt;p&gt;Why not use Wayland you might ask? After all, with Gnome 47 a release appeared that could fully be compiled without any X11 support. It's now totally optional!&lt;/p&gt;

&lt;p&gt;But for me, there are some reasons to stick with X11:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Chrome has very poor performance under Wayland. It's barely usable (at least for me).&lt;/li&gt;
&lt;li&gt;I am very fond of &lt;code&gt;plank&lt;/code&gt;. That's a nice fish-eyed task bar but it has no support for Wayland!&lt;/li&gt;
&lt;li&gt;There's no such thing as &lt;code&gt;xkill&lt;/code&gt; in Wayland to simply get rid of broken GUIs.&lt;/li&gt;
&lt;li&gt;I use &lt;code&gt;autokey&lt;/code&gt; a lot for all sorts of quick key combinations. Doesn't work on Wayland, either.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, I'll stick with X11 for a bit longer. Maybe there some nice replacements I do not know of, yet. I'd be happy to read about them in the comments :-)&lt;/p&gt;

</description>
      <category>debian</category>
      <category>gnome</category>
      <category>linux</category>
    </item>
    <item>
      <title>Kubernetes Admission Controller written in Kotlin with Quarkus (demo)</title>
      <dc:creator>Jeansen</dc:creator>
      <pubDate>Thu, 08 Jun 2023 20:53:39 +0000</pubDate>
      <link>https://dev.to/jeansen/kubernetes-admission-controller-written-in-kotlin-with-quarkus-demo-36ng</link>
      <guid>https://dev.to/jeansen/kubernetes-admission-controller-written-in-kotlin-with-quarkus-demo-36ng</guid>
      <description>&lt;p&gt;Normally, most of additional logic in Kubernetes is written in GO. But since I am a big fan of Kotlin, I wanted to do something in Kotlin. In addition - with respect to my professional work - it should also be written with Quarkus. After all, everything in Kuberntes is REST. And frameworks like Qurakus or Spring make it fairly easy to write REST services.&lt;/p&gt;

&lt;p&gt;So, I thought writing a simple &lt;a href="https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/"&gt;admission controller&lt;/a&gt; would be a great challenge. During my research, I came across an older project, already 5 years old and written in GO. Anyway, it demonstrated quite well how to write a simple admission controller in GO.&lt;/p&gt;

&lt;p&gt;TLDR; I created a simple Quarkus/Kotlin project and finally got a working admission controller. If you are curious, check out my &lt;a href="https://github.com/Jeansen/lp39a"&gt;repository&lt;/a&gt;. The README will explain how to configure, build and deploy the project.&lt;/p&gt;

&lt;p&gt;But be warned. This is some advanced topic! You should feel comfortable with the Kubernetes API and have a Kubernetes cluster and an image registry (e.g. Harbor) at hand.&lt;/p&gt;

&lt;p&gt;I hope my project will help you understand Kubernetes and how to program against it. This project is as fresh as this post. Ist a first draft. And I though it is worth sharing. As you know: Release early, release often ;-)&lt;/p&gt;

&lt;p&gt;I will continue to work on it. For instance, my next task will be to make it run as a Quarkus Native service.&lt;/p&gt;

</description>
      <category>quarkus</category>
      <category>kotlin</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Move docker folder to external storage</title>
      <dc:creator>Jeansen</dc:creator>
      <pubDate>Tue, 09 May 2023 13:57:16 +0000</pubDate>
      <link>https://dev.to/jeansen/move-docker-folder-to-external-storage-5462</link>
      <guid>https://dev.to/jeansen/move-docker-folder-to-external-storage-5462</guid>
      <description>&lt;p&gt;Quick note to me and the world:&lt;/p&gt;

&lt;p&gt;Docker by design stores everything (except some certs and the daemon config) in one folder. By default, that's '/var/lib/docker'.&lt;/p&gt;

&lt;p&gt;That folder can grow quite big over time. Yes, one could do some housekeeping. But especially when using Docker Volumes for persistent data, this folder quickly grows. Aside from symlinks or mount binds, it is also possible to directly tell the Docker Daemon where to store all the files.&lt;/p&gt;

&lt;p&gt;For instance, I have the folder &lt;code&gt;/mnt/srv&lt;/code&gt; mounted to an external disk &lt;code&gt;/dev/sdb1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To make Docker use, e.g. &lt;code&gt;/mnt/srv/docker&lt;/code&gt;, I put the following in &lt;code&gt;/etc/docker/daemon.json&lt;/code&gt;. If the file does not exist, simply create it!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "data-root": "/mnt/srv/docker"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You do not have to create the docker folder. If &lt;code&gt;/mnt/srv/docker&lt;/code&gt; does not exist, Docker will create it. But normally, you do not want to have a blank start, so you could simply &lt;code&gt;mv /var/lib/docker /mnt/srv/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Make sure you first stop the Docker Dameon/Service. This can be done by executing &lt;code&gt;sudo systemctl stop docker.socket&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When done, simply start the service: &lt;code&gt;sudo systemctl start docker.service&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The first command makes sure docker really shuts down. If you only stop the service, the socket will still be active! On the other hand, if you start the service, the socket will be activated, too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Important
&lt;/h2&gt;

&lt;p&gt;If you mount a disk partition, like I did, it might happen that some containers fail. For instance, I tried to run sonatype/nexus3 and it always failed. Here's an excerpt from the logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Caused by: java.lang.UnsatisfiedLinkError: /nexus-data/tmp/jna4777440640643979514.tmp: /nexus-data/tmp/jna4777440640643979514.tmp: failed to map segment from shared object
        at java.lang.ClassLoader$NativeLibrary.load(Native Method)
        at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1934)
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1817)
        at java.lang.Runtime.load0(Runtime.java:782)
        at java.lang.System.load(System.java:1100)
        at com.sun.jna.Native.loadNativeDispatchLibraryFromClasspath(Native.java:1045)
        at com.sun.jna.Native.loadNativeDispatchLibrary(Native.java:1015)
        at com.sun.jna.Native.&amp;lt;clinit&amp;gt;(Native.java:221)
        at com.orientechnologies.common.jna.ONative.instance(ONative.java:31)
        at com.orientechnologies.orient.core.engine.OMemoryAndLocalPaginatedEnginesInitializer.configureDefaultDiskCacheSize(OMemoryAndLocalPaginatedEnginesInitializer.java:167)
        at com.orientechnologies.orient.core.engine.OMemoryAndLocalPaginatedEnginesInitializer.configureDefaults(OMemoryAndLocalPaginatedEnginesInitializer.java:77)
        at com.orientechnologies.orient.core.engine.OMemoryAndLocalPaginatedEnginesInitializer.initialize(OMemoryAndLocalPaginatedEnginesInitializer.java:62)
        at com.orientechnologies.orient.core.engine.local.OEngineLocalPaginated.startup(OEngineLocalPaginated.java:56)
        at com.orientechnologies.orient.core.Orient.startEngine(Orient.java:930)
        at com.orientechnologies.orient.core.Orient.loadStorage(Orient.java:523)
        at com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx.&amp;lt;init&amp;gt;(ODatabaseDocumentTx.java:173)
        at com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx.&amp;lt;init&amp;gt;(ODatabaseDocumentTx.java:154)
        at com.orientechnologies.orient.server.OSystemDatabase.init(OSystemDatabase.java:151)
        at com.orientechnologies.orient.server.OSystemDatabase.&amp;lt;init&amp;gt;(OSystemDatabase.java:44)
        at com.orientechnologies.orient.server.OServer.initSystemDatabase(OServer.java:1309)
        at com.orientechnologies.orient.server.OServer.activate(OServer.java:367)
        at org.sonatype.nexus.internal.orient.DatabaseServerImpl.doStart(DatabaseServerImpl.java:196)
        at org.sonatype.nexus.common.stateguard.StateGuardLifecycleSupport.start(StateGuardLifecycleSupport.java:69)
        at org.sonatype.nexus.common.stateguard.MethodInvocationAction.run(MethodInvocationAction.java:39)
        at org.sonatype.nexus.common.stateguard.StateGuard$TransitionImpl.run(StateGuard.java:193)
        at org.sonatype.nexus.common.stateguard.TransitionsInterceptor.invoke(TransitionsInterceptor.java:57)
        at org.sonatype.nexus.internal.orient.OrientBootstrap.doStart(OrientBootstrap.java:71)
        at org.sonatype.nexus.common.stateguard.StateGuardLifecycleSupport.start(StateGuardLifecycleSupport.java:69)
        at org.sonatype.nexus.common.stateguard.MethodInvocationAction.run(MethodInvocationAction.java:39)
        at org.sonatype.nexus.common.stateguard.StateGuard$TransitionImpl.run(StateGuard.java:193)
        at org.sonatype.nexus.common.stateguard.TransitionsInterceptor.invoke(TransitionsInterceptor.java:57)
        ... 7 common frames omitted

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The reason was, I had the following in my &lt;code&gt;/etc/fstab&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UUID=a3d2ba5a-dbbd-40e9-b6d7-a4349987e6f8   /mnt/srv        ext4    defaults,nofail,user  0       2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;user&lt;/code&gt; argument implies the options &lt;strong&gt;noexec&lt;/strong&gt;, &lt;strong&gt;nosuid&lt;/strong&gt;, and &lt;strong&gt;nodev&lt;/strong&gt;. With one or more of these implied options in place, I get the above error. Removing the &lt;code&gt;user&lt;/code&gt; argument from my mount resolved it!&lt;/p&gt;

</description>
      <category>docker</category>
      <category>linux</category>
    </item>
    <item>
      <title>Debian: non-free firmwares</title>
      <dc:creator>Jeansen</dc:creator>
      <pubDate>Tue, 04 Apr 2023 22:40:11 +0000</pubDate>
      <link>https://dev.to/jeansen/debian-non-free-firmwares-1a43</link>
      <guid>https://dev.to/jeansen/debian-non-free-firmwares-1a43</guid>
      <description>&lt;p&gt;I just became aware of the fact that there was a &lt;a href="https://wiki.debian.org/Firmware"&gt;resolution back in 2022&lt;/a&gt; which results in a new component for APT packages.&lt;/p&gt;

&lt;p&gt;I currently run on Debian unstable - which is rather stable - and have the following entry in my &lt;code&gt;/etc/apt/sources.list&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;deb http://http.us.debian.org/debian/ unstable main contrib non-free
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to access firmware packages (including upgrades), you'll have to add &lt;code&gt;non-free-firmware&lt;/code&gt;. So, my updated list entry now looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;deb http://http.us.debian.org/debian/ unstable main contrib non-free non-free-firmware
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>debian</category>
      <category>linux</category>
      <category>fimware</category>
    </item>
    <item>
      <title>Open-Source - I love it</title>
      <dc:creator>Jeansen</dc:creator>
      <pubDate>Wed, 29 Mar 2023 08:19:53 +0000</pubDate>
      <link>https://dev.to/jeansen/open-source-i-love-it-1jmc</link>
      <guid>https://dev.to/jeansen/open-source-i-love-it-1jmc</guid>
      <description>&lt;p&gt;So, a couple of days ago I faced a problem. My OwnCloud installation, running on a Raspberry Pi, did not work any longer after the latest update. I could not upload or sync any data, anymore: Not enough space on the server! Huh?&lt;/p&gt;

&lt;p&gt;Long story short, Problem was that OwnCloud does not officially support 32 Bit, only 64 Bit operation systems. I do run it on a Raspi 4, but only the Kernel is 64 Bit because I upgrade the running System from a previous installation on a Raspi 3.&lt;/p&gt;

&lt;p&gt;Anyway, folks from all over the world had the same problem. Some found a quick workaround and ultimately, after only a couple of days, the good guys from OwnCloud came up with a fix, though they officially do not support 32 Bit!&lt;/p&gt;

&lt;p&gt;I always enjoy this 'energy' when people from all over the world come together to exchange ideas, work together and produce something valuable. I don't know anyone of them, have not met them but the synergy is there, anyway. And that's always the same, not matter in what issue or pull request I am involved. May it be OwnCloud, Kubernetes, Vim or others.&lt;/p&gt;

&lt;p&gt;It simply feels great!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>From PulseAudio to PipeWire</title>
      <dc:creator>Jeansen</dc:creator>
      <pubDate>Sun, 12 Mar 2023 12:13:59 +0000</pubDate>
      <link>https://dev.to/jeansen/from-pulseaudio-to-pipewire-210b</link>
      <guid>https://dev.to/jeansen/from-pulseaudio-to-pipewire-210b</guid>
      <description>&lt;p&gt;Quick Note to myself the community:&lt;/p&gt;

&lt;p&gt;I recently replaced PulseAudio with PipeWire. Or, to be precise, I had to replace it because Gnome now has some depdencies on it.&lt;/p&gt;

&lt;p&gt;Unfortunately, my BlueTooth headset did not work, any longer. It connected but did not show in Gnome's sound settings. I had some kernel updates pending, so my expectation was it would be resolved after a restart. &lt;/p&gt;

&lt;p&gt;But, nay.....!&lt;/p&gt;

&lt;p&gt;TLDR; I did the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;systemctl --user restart pipewire
sudo systemctl restart bluetooth
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That worked. Maybe I'll have to do the same thing on next reboot ... I hope not ;-)&lt;/p&gt;

</description>
      <category>pulseaudio</category>
      <category>pipewire</category>
      <category>linux</category>
      <category>bluetooth</category>
    </item>
    <item>
      <title>Local Kubernetes with DNS</title>
      <dc:creator>Jeansen</dc:creator>
      <pubDate>Fri, 10 Mar 2023 15:45:27 +0000</pubDate>
      <link>https://dev.to/jeansen/local-kubernetes-with-dns-44b6</link>
      <guid>https://dev.to/jeansen/local-kubernetes-with-dns-44b6</guid>
      <description>&lt;p&gt;A simple and short experience report from my daily Kubernetes playground.&lt;/p&gt;

&lt;p&gt;I've got a local cluster running. Plain Kubernetes on virutal Nodes with KVM. That's my little lab where I can break things and repair them. That's the way I learn in tandem with all the abundance of documenation (which is old, as soon as you read it).&lt;/p&gt;

&lt;p&gt;So, having services and exposing them as NodePort or LoadBalancer is nice, but you either have to type in the IP of the cluster, put some static values in your &lt;code&gt;hosts&lt;/code&gt; file or provide a header when running &lt;code&gt;curl&lt;/code&gt; against a service.&lt;/p&gt;

&lt;p&gt;But, the little Kubernetes project &lt;a href="https://github.com/kubernetes-sigs/external-dns"&gt;external-dns&lt;/a&gt; allows you to make your cluster create DNS entries in cloud providers and even local DNS.&lt;/p&gt;

&lt;p&gt;In my case, I have the great tool &lt;a href="https://pi-hole.net/"&gt;pi-hole&lt;/a&gt; running on a dedicated little Raspberry-Pi, which also serves as my primary DNS.&lt;/p&gt;

&lt;p&gt;Now, whenever I expose an service and/or create an Ingress resource, specified DNS names will be &lt;a href="https://github.com/kubernetes-sigs/external-dns/blob/master/docs/tutorials/pihole.md"&gt;relayed to pi-hole&lt;/a&gt;. No need to hack in numbers or manipulate static files, anymore.&lt;/p&gt;

&lt;p&gt;I love it! ;-)&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>linux</category>
      <category>dns</category>
      <category>network</category>
    </item>
    <item>
      <title>Wifi hiccup</title>
      <dc:creator>Jeansen</dc:creator>
      <pubDate>Mon, 06 Mar 2023 20:28:27 +0000</pubDate>
      <link>https://dev.to/jeansen/wifi-hickup-4bg4</link>
      <guid>https://dev.to/jeansen/wifi-hickup-4bg4</guid>
      <description>&lt;p&gt;Ever had that problem that your wifi suddenly got a hiccup? 30 seconds where you are almost at a point to reboot or plug in the wire?&lt;/p&gt;

&lt;p&gt;Well, I got that feeling for some time now and worked around it by exactly doing the latter: Using the wire!&lt;/p&gt;

&lt;p&gt;Finaly, after tinkering around with all sorts of settings, I now found a working solution for myself. Seems like disabling the power saving mode for NetworkManager did the trick!&lt;/p&gt;

&lt;p&gt;Create the file &lt;code&gt;/etc/NetworkManager/conf.d/wifi-powersave-off.conf&lt;/code&gt; and put the following content in it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# File to be place under /etc/NetworkManager/conf.d
[connection]
# Values are 0 (use default), 1 (ignore/don't touch), 2 (disable) or 3 (enable).
wifi.powersave = 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart NetworkManger with &lt;code&gt;udo systemctl restart networking.service&lt;/code&gt;&lt;/p&gt;

</description>
      <category>wifi</category>
      <category>linux</category>
      <category>debian</category>
    </item>
    <item>
      <title>How to set up Athens proxy cache for GO</title>
      <dc:creator>Jeansen</dc:creator>
      <pubDate>Sat, 25 Feb 2023 22:41:22 +0000</pubDate>
      <link>https://dev.to/jeansen/how-to-set-up-athens-proxy-cache-for-go-f8f</link>
      <guid>https://dev.to/jeansen/how-to-set-up-athens-proxy-cache-for-go-f8f</guid>
      <description>&lt;p&gt;During the automated setup of my local Kubernetes cluster, I decided to cache most of my requests to APT. This works in a similar fashion to e.g. Artifactory, which I use to proxy Java/Kotlin dependencies. I soon faced the need to do the same for GO.&lt;/p&gt;

&lt;p&gt;The easiest way would probably have been to continue with Artifactory and use it for APT, GO, NPM and so on. Unfortunately, only the Maven part is free for individual applications.&lt;/p&gt;

&lt;p&gt;An alternative could have been Nexus. The open-source version offers all the repository types needed, e.g. APT or GO (and more). But there are some downsides. For example, there is no .deb package available. Installations must be done by hand. Configuration is another point of critic. Compared with Artifactory, it feels cumbersome to me. And finally, it still needs Java 8! The folks behind Nexus haven't been able to port it to Java 9 and later, yet.&lt;/p&gt;

&lt;p&gt;Either way, Artifactory and Nexus are quite "heavy". Not something I would run on a Raspberry Pi 3. So, I found Athens, a specialized proxy cache for GO modules. It's still in development, but exactly what I needed: Lightweight, simple setup. Only drawback here: No .deb file, either. But they provide an install script that builds Athens and installs a Systemd service, fully automated. There are some things to consider, though. What follows is a little step-by-step instruction of my journey installing Athens on a Raspberry Pi 3.&lt;/p&gt;

&lt;p&gt;Note: In the following sections I will use  &lt;code&gt;host&lt;/code&gt; and &lt;code&gt;proxy&lt;/code&gt; to denote my laptop and my Raspberry Pi (which I baptized 'proxy'). In former times, &lt;code&gt;pi&lt;/code&gt; was the default user on any Raspberry Pi. Nowadays, when you install Raspberry Pi OS, you will be prompted to name a first user. To make things simple, I'll stick wih the user &lt;code&gt;pi&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pre-Flight
&lt;/h2&gt;

&lt;p&gt;Before I could install Athens by means of compiling it, I heeded a GO versions &amp;gt;= 1.17. Raspberry Pi OS is based on Debian Bullseye (stable), which currently only ships with GO 1.15. But one can add the Debian backports repository to have newer versions of GO available. &lt;/p&gt;

&lt;p&gt;First, I added the backports repo:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo "deb http://deb.debian.org/debian bullseye-backports main" | sudo tee -a /etc/apt/sources.list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Then I needed to get the repository keys. For that, I spun up a Debian container on my local machine with Docker and copied over the public keys:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir -p /tmp/transfer
docker run -it --rm debian:bullseye -v /tmp/transfer:/transfer

#Within the container
cp -r  /etc/apt/trusted.gpg.d/ /transfer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Next, I copied the keys over to my Raspi:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scp -r /tmp/transfer/trusted.gpg.d/ pi@proxy:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;After I logged in on the Raspi, I finally copied the keys so APT would find them:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo cp ~/trusted.gpg.d/*  /etc/apt/trusted.gpg.d/ 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now, I was able to install GO 1.19 from the backports repository:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install golang -t bullseye-backports
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Athens installation
&lt;/h2&gt;

&lt;p&gt;Installing Athens was quite simple. First, I had to get the code:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/gomods/athens.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Then, I had to copy over the template config and adjust is to my liking. So far, I only made sure that instead of storing everything in memory, Athens would store all cached data on disk:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd athens
#systemd.sh expect a file config.toml at the root of the repository folder
cp config.dev.toml config.toml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;In &lt;code&gt;config.toml&lt;/code&gt; I changed &lt;code&gt;StorageType = "memory"&lt;/code&gt; to &lt;code&gt;StorageType = "disk"&lt;/code&gt; and in the '[Storage]' tree I set the path to where I wanted to have all files saved by replacing &lt;code&gt;RootPath = "/path/on/disk"&lt;/code&gt; with &lt;code&gt;RootPath = "/var/cache/athens"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I also needed to create that 'RootPath' (with the right permissions). When invoked by SystemD, Athens will be executed with the user &lt;code&gt;www-data&lt;/code&gt;. So, I had to take that into account:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo mkdir -p /var/cache/athens
sudo chown -R www-data:www-data /var/cache/athens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;In &lt;code&gt;scripts/systemd.sh&lt;/code&gt; I had to comment out the following four lines in &lt;code&gt;doInstallConfig()&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ATHENS_DISK_STORAGE_ROOT=/var/run/athens
sudo mkdir -p $ATHENS_DISK_STORAGE_ROOT
sudo chown www-data $ATHENS_DISK_STORAGE_ROOT
sudo chgrp www-data $ATHENS_DISK_STORAGE_ROOT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Otherwise, my customized 'RootPath' would have been overwritten.&lt;/p&gt;

&lt;p&gt;I also had to edit &lt;code&gt;scripts/service/athens.service&lt;/code&gt;. Again, there was some hard-coded stuff: &lt;code&gt;Environment=ATHENS_DISK_STORAGE_ROOT=/var/run/athens&lt;/code&gt;. I simply comment out that line.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Environment=ATHENS_DISK_STORAGE_ROOT=/var/run/athens&lt;/code&gt; neded to be adapted to the same path from the config.toml.&lt;/p&gt;

&lt;p&gt;Now, with the right GO version installed, a customized config file and a some fixed applied, I was fully prepared to install Athens. So, from the root of the repository folder I only had to execute:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo scripts/systemd.sh install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;That execution compiled Athens and installed a Systemd service. Sudo is required, otherwise the Systemd service would not be installed.&lt;/p&gt;

&lt;p&gt;Finally, I ran &lt;code&gt;scripts/systemd.sh status&lt;/code&gt; and made sure, everything was in order.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test
&lt;/h2&gt;

&lt;p&gt;Back on my host machine, I was then able to install for instance yq (which is not yet in the Debian repositories):&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export GOPROXY="http://proxy:3000
go install github.com/mikefarah/yq/v4@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;After that I had a look on the Raspi. There should now be some data in &lt;code&gt;/var/cache/athens&lt;/code&gt;, and it was. So, from now on, Athens will intercept each call, download any available updates or directly serve any cached version, in case there are no updates available upstream.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Athens is simple and easy to set up. The only thing that cost me some time was the hard-coded &lt;code&gt;ATHENS_DISK_STORAGE_ROOT&lt;/code&gt; variable. Unfortunately this installation procedure is not promoted by the project. Neither on the official homepage nor on the README. You can find it in &lt;a href="https://github.com/gomods/athens/blob/main/DEVELOPMENT.md"&gt;DEVELOPMENT.md&lt;/a&gt; file. Athens offers an abundance of configuration settings. You should definitely check out the full &lt;code&gt;config.dev.toml&lt;/code&gt; file. Hint: If you execute &lt;code&gt;scripts/systemd.sh&lt;/code&gt; without any parameters, it will tell you what it can do!&lt;/p&gt;

</description>
      <category>go</category>
      <category>raspberrypi</category>
      <category>linux</category>
    </item>
  </channel>
</rss>
