<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Selfhosting on Bastien Traverse</title>
    <link>https://bastientraverse.com/en/tags/selfhosting/</link>
    <description>Recent content in Selfhosting on Bastien Traverse</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Sat, 03 Feb 2024 00:00:00 +0100</lastBuildDate><atom:link href="https://bastientraverse.com/en/tags/selfhosting/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Using a container to sidestep a forgotten password in CasaOS</title>
      <link>https://bastientraverse.com/en/posts/2024-02/casa-password-recovery/</link>
      <pubDate>Sat, 03 Feb 2024 00:00:00 +0100</pubDate>
      
      <guid>https://bastientraverse.com/en/posts/2024-02/casa-password-recovery/</guid>
      <description>&lt;h2 id=&#34;problem-statement&#34;&gt;&lt;a href=&#34;#problem-statement&#34; class=&#34;headerlink anchor&#34;&gt;&lt;i class=&#34;iconfont icon-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;Problem statement&lt;/h2&gt;&lt;p&gt;As part of dabbling with self-hosting again, I installed &lt;a href=&#34;https://github.com/IceWhaleTech/CasaOS&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CasaOS&lt;/a&gt; on an Oracle Cloud free Ampere instance to try it out.&lt;/p&gt;
&lt;p&gt;After setting it aside for a few weeks, when I logged in via SSH and tried to use &lt;code&gt;sudo&lt;/code&gt; I realized I absolutely couldn&amp;rsquo;t remember my user&amp;rsquo;s password 😅&lt;/p&gt;
&lt;p&gt;The standard operating procedure in this case is to either reboot the machine on a live system and use that to chroot into the local install, or fiddle with GRUB rescue/kernel command line.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;But since I could still install containers through CasaOS web interface, I thought I&amp;rsquo;d use this opportunity to explore ways to recover my sudo access/change my password without rebooting (which could be nice in case it is essential to avoid downtime).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Edit:&lt;/strong&gt; As I was finishing this post, I realized that the third constraint listed below was incorrect, and as a result a less cumbersome resolution was possible. So read on if you are interested in the learning journey, or jump straight to &lt;a href=&#34;#the-solution-simplified&#34;&gt;the simplified solution&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;the-constraints&#34;&gt;&lt;a href=&#34;#the-constraints&#34; class=&#34;headerlink anchor&#34;&gt;&lt;i class=&#34;iconfont icon-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;The constraints&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;the CLI/SSH access is &amp;ldquo;useless&amp;rdquo;: my user is not setup to interact with the Docker socket without elevated privileges (which is usually a good thing)&lt;/li&gt;
&lt;li&gt;besides its App Store content, CasaOS allows to manually install containers using a Compose file or a &lt;code&gt;docker run&lt;/code&gt; command (which is then &lt;a href=&#34;https://www.composerize.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;composerized&lt;/a&gt;): see &lt;a href=&#34;https://youtu.be/ToV6vRIl3Nk?si=HH9YiQdyqy2LDsva&amp;amp;t=16&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;official video&lt;/a&gt; or &lt;a href=&#34;https://docs.zimaboard.com/docs/Self-Deploying-Applications.html#Follow-these-steps-in-order&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;screenshots&lt;/a&gt; of the process&lt;/li&gt;
&lt;li&gt;&lt;del&gt;its interface however doesn&amp;rsquo;t allow to &lt;code&gt;docker exec&lt;/code&gt; or interact with containers in any other way; the installed containers &lt;em&gt;must&lt;/em&gt; expose a web interface for us to be able to interact with them.&lt;/del&gt; As it turns out, CasaOS interface does &lt;a href=&#34;https://github.com/IceWhaleTech/CasaOS/issues/1316&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;offer access to containers&amp;rsquo; console&lt;/a&gt; (equivalent to a &lt;code&gt;docker exec -it &amp;lt;containe&amp;gt; /bin/sh&lt;/code&gt;), at least for apps installed from its official Store, via the app Settings &amp;gt; &amp;ldquo;Terminal and Logs&amp;rdquo; icon.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://bastientraverse.com/en/posts/2024-02/casa-password-recovery/casa-app-settings-terminal.png&#34;
    alt=&#34;Access to a container shell and logs in CasaOS interface&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Access to a container shell and logs in CasaOS interface&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&#34;hacking-around&#34;&gt;&lt;a href=&#34;#hacking-around&#34; class=&#34;headerlink anchor&#34;&gt;&lt;i class=&#34;iconfont icon-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;Hacking around&lt;/h2&gt;&lt;p&gt;Because I&amp;rsquo;m pretty new to this, my first idea was to start a container which would give me a root shell with access to the docker socket, and then use that environment to start a second privileged container (&lt;a href=&#34;https://www.docker.com/blog/docker-can-now-run-within-docker/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Docker-in-Docker&lt;/a&gt; style) from which I would mount the host filesystem and use &lt;code&gt;{ch,}passwd&lt;/code&gt; or such&amp;hellip; Yes, I felt very smart thinking this up 😅&lt;/p&gt;
&lt;p&gt;Unaware of my mistaken approach, I looked online for a &amp;ldquo;web terminal container&amp;rdquo; and the first result on StartPage was the &lt;a href=&#34;https://github.com/raonigabriel/web-terminal&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;web terminal&lt;/a&gt; GitHub repo, which did what I needed (expose a root shell in the browser) but hadn&amp;rsquo;t been updated since August 2021 😕&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://bastientraverse.com/en/posts/2024-02/casa-password-recovery/sp-results-webterm.png&#34;
    alt=&#34;StartPage results for web terminal container&#34;&gt;
&lt;/figure&gt;
&lt;details class=&#34;admonition note&#34;&gt;&lt;summary class=&#34;admonition-title&#34;&gt;Aside&lt;/summary&gt;
  &lt;p&gt;Docker Hub search is appalling: searching for &lt;code&gt;web terminal&lt;/code&gt; gave me a bunch of &lt;a href=&#34;https://hub.docker.com/search?q=web%20terminal&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;completely unrelated results&lt;/a&gt;. I had to put a dash between the two words &lt;a href=&#34;https://hub.docker.com/search?q=web-terminal&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;to get anywhere&lt;/a&gt;, but then the two first results hadn&amp;rsquo;t been updated in 2 years either&amp;hellip;&lt;/p&gt;
&lt;p&gt;Searching for &lt;code&gt;web shell&lt;/code&gt; and &lt;code&gt;&amp;quot;web shell&amp;quot;&lt;/code&gt; didn&amp;rsquo;t give better results, while &lt;code&gt;web-shell&lt;/code&gt; and &lt;code&gt;webshell&lt;/code&gt; led to very outdated stuff without any description. I can&amp;rsquo;t believe there isn&amp;rsquo;t a reference implementation of this stuff!!&lt;/p&gt;
&lt;p&gt;I also looked up &lt;code&gt;ttyd&lt;/code&gt;, the software used by &lt;code&gt;web-terminal&lt;/code&gt;, and here the first result was fresh from a few days ago; however there was no mention of &lt;em&gt;&amp;ldquo;How to use this with Docker&amp;rdquo;&lt;/em&gt; , so I wasn&amp;rsquo;t sure a simple &lt;code&gt;docker run&lt;/code&gt; would achieve the desired result&amp;hellip; Had I checked its &lt;a href=&#34;https://hub.docker.com/layers/tsl0922/ttyd/alpine/images/sha256-92dd5758ccda91ffc1f113c4c8d8c7407cc236d02c55993dd01d5629fe3a882b?context=explore&amp;amp;tab=vulnerabilities&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Dockerfile&lt;/a&gt;, I would have seen that its &lt;code&gt;ENTRYPOINT&lt;/code&gt;/&lt;code&gt;CMD&lt;/code&gt; was, in fact, starting up the service 🙃&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;Lo and behold, I took the &amp;ldquo;risk&amp;rdquo; (after checking the image&amp;rsquo;s Dockerfile) and entered the following command in CasaOS Docker CLI interface:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;docker&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;run&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;v&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;var&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;docker&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;sock&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;var&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;docker&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sock&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;7681&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;7681&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;raonigabriel&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;web&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;terminal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After setting up the access port in CasaOS interface and confirming everything was okay, I clicked &amp;ldquo;Install&amp;rdquo; and connected to my server&amp;rsquo;s port &lt;code&gt;7681&lt;/code&gt; in a browser&amp;hellip; Success, I was in!&lt;/p&gt;
&lt;p&gt;For the next stage of my plan I ran the following command inspired by &lt;a href=&#34;https://security.stackexchange.com/questions/218355/how-to-execute-a-command-directly-on-the-host-system-through-docker-sock-in-a-do&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;this StackExchange thread&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;docker&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;run&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ti&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;privileged&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;net&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pid&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ipc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;volume&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/:/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;busybox&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;chroot&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bin&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;sh&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nl&#34;&gt;docker&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;found&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Crap, I didn&amp;rsquo;t even check that the container had docker installed 🤦 You can tell I really don&amp;rsquo;t know what I am doing 😂&lt;/p&gt;
&lt;p&gt;Of course when I subsequently tried to install docker&amp;hellip;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d0fa4b64c55&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;apk&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;add&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;docker&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;fetch&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cdn&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;alpinelinux&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;alpine&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;edge&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;aarch64&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;APKINDEX&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gz&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ERROR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cdn&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;alpinelinux&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;alpine&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;edge&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;UNTRUSTED&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;signature&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;WARNING&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Ignoring&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;APKINDEX&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e37b76c2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gz&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;No&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;such&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;or&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;fetch&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cdn&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;alpinelinux&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;alpine&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;edge&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;community&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;aarch64&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;APKINDEX&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gz&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ERROR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cdn&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;alpinelinux&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;alpine&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;edge&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;community&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;UNTRUSTED&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;signature&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;WARNING&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Ignoring&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;APKINDEX&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d022dfc8&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gz&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;No&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;such&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;or&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ERROR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;unsatisfiable&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;constraints&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;docker&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;missing&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;required&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;by&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;world&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;docker&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d0fa4b64c55&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;apk&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;update&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;fetch&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cdn&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;alpinelinux&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;alpine&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;edge&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;aarch64&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;APKINDEX&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gz&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ERROR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cdn&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;alpinelinux&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;alpine&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;edge&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;UNTRUSTED&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;signature&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;WARNING&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Ignoring&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;APKINDEX&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e37b76c2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gz&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;No&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;such&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;or&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;fetch&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cdn&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;alpinelinux&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;alpine&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;edge&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;community&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;aarch64&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;APKINDEX&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gz&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ERROR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cdn&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;alpinelinux&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;alpine&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;edge&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;community&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;UNTRUSTED&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;signature&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;WARNING&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Ignoring&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;APKINDEX&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d022dfc8&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gz&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;No&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;such&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;or&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;errors&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;36&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;distinct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;packages&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;available&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A quick search seems to indicate that the image is &lt;a href=&#34;https://stackoverflow.com/questions/73374745/error-http-dl-4-alpinelinux-org-alpine-edge-testing-untrusted-signature&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;simply too old&lt;/a&gt;. Building an updated image was out of the scope I had set for this experiment, so I paused and took time to think.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;That&amp;rsquo;s when it occurred to me that this &amp;ldquo;nested container&amp;rdquo; approach was completely useless, and would most likely not work since at that point you have the first container&amp;rsquo;s virtualized filesystem namespace acting as a buffer between the host and the DinD container&amp;hellip; Complete misdirection, backing up!&lt;/p&gt;
&lt;h2 id=&#34;the-solution&#34;&gt;&lt;a href=&#34;#the-solution&#34; class=&#34;headerlink anchor&#34;&gt;&lt;i class=&#34;iconfont icon-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;The solution&lt;/h2&gt;&lt;p&gt;After thinking it through some more, I realized one could achieve the desired outcome by simply mounting the host &lt;code&gt;/&lt;/code&gt; read-write as an attached volume 😁&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;docker&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;run&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;v&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/:/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;7681&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;7681&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;raonigabriel&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;web&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;terminal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Et voilà&lt;/em&gt;, I finally had a root shell from which I could chroot into the host and update the user password and/or configure password-less sudo (which amounts to the same). Or really, do (nearly) everything to the host system 😨&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://bastientraverse.com/en/posts/2024-02/casa-password-recovery/webterm.png&#34;
    alt=&#34;Root shell provided by the web-terminal container&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Root shell provided by the web-terminal container&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;Initially I thought it would be necessary to use a &lt;a href=&#34;https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;privileged&lt;/a&gt; container, but trying it showed that wasn&amp;rsquo;t the case. I guess it&amp;rsquo;s because I was only editing files/using regular utilites, and not trying to create new devices/nodes etc.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;the-solution-simplified&#34;&gt;&lt;a href=&#34;#the-solution-simplified&#34; class=&#34;headerlink anchor&#34;&gt;&lt;i class=&#34;iconfont icon-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;The solution: simplified&lt;/h2&gt;&lt;p&gt;This is what happens when you don&amp;rsquo;t know your tools enough&amp;hellip; You miss very obvious pathways that lead to simpler solutions 😁&lt;/p&gt;
&lt;p&gt;Indeed, there is no need to install a third-party container. It is enough to add the &lt;code&gt;/:/host&lt;/code&gt; volume to an existing app installed from CasaOS official App Store (&lt;em&gt;e.g.&lt;/em&gt; NextCloud), and  after making sure in its settings it runs with the root &lt;code&gt;UID&lt;/code&gt;/&lt;code&gt;GID&lt;/code&gt;, we can use the interface to connect the container&amp;rsquo;s console!&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://bastientraverse.com/en/posts/2024-02/casa-password-recovery/casa-nc-root-shell.png&#34;
    alt=&#34;Root shell inside nextcloud container&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Root shell inside nextcloud container&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;And that is the Easy Way© to get a root shell on your server using containers!&lt;/p&gt;
&lt;h2 id=&#34;trying-to-refine-the-solution&#34;&gt;&lt;a href=&#34;#trying-to-refine-the-solution&#34; class=&#34;headerlink anchor&#34;&gt;&lt;i class=&#34;iconfont icon-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;Trying to refine the solution&lt;/h2&gt;&lt;p&gt;Now that I was there, I felt like I should have been able to use a simple &lt;code&gt;busybox&lt;/code&gt; image to execute a command non-interactively directly from &lt;code&gt;docker run&lt;/code&gt;/Compose file, eliminating the need to find an image that exposes a web service or to connect to the container&amp;rsquo;s console.&lt;/p&gt;
&lt;p&gt;After a bit of fiddling, I came up with the following invocation:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;docker&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;run&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;v&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;etc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;sudoers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;etc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sudoers&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;busybox&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bin&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sh&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sudo&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;ALL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ALL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;nl&#34;&gt;NOPASSWD&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ALL&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;etc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sudoers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But CasaOS interface constantly threw an error. Probably the redirection in the command, but no amount of quoting led me to a successful run.&lt;/p&gt;
&lt;p&gt;At that point I threw the towel in: I had recovered access to my sudo access and learnt quite a few things along the way. Time to wrap up.&lt;/p&gt;
&lt;h2 id=&#34;takeways&#34;&gt;&lt;a href=&#34;#takeways&#34; class=&#34;headerlink anchor&#34;&gt;&lt;i class=&#34;iconfont icon-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;Takeways&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Docker default security story is scary: because the daemon runs as root by default, the mere ability to run containers (even without &lt;code&gt;--privileged&lt;/code&gt;) and mount any desired host path as a volume gives &lt;a href=&#34;https://stackoverflow.com/a/32192369&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;root-equivalent status&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Due to this, access to CasaOS interface is equivalent to root access on the server&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&amp;rsquo;s all folks, thanks for reading this account I hope you enjoyed!&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;See &lt;em&gt;e.g.&lt;/em&gt; &lt;a href=&#34;https://gcore.com/learning/how-to-reset-password-in-linux/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://gcore.com/learning/how-to-reset-password-in-linux/&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Graphical management interfaces for Linux servers</title>
      <link>https://bastientraverse.com/en/posts/2023-12/server-management-gui/</link>
      <pubDate>Mon, 11 Dec 2023 00:00:00 +0100</pubDate>
      
      <guid>https://bastientraverse.com/en/posts/2023-12/server-management-gui/</guid>
      <description>&lt;h2 id=&#34;terminology-considerations&#34;&gt;&lt;a href=&#34;#terminology-considerations&#34; class=&#34;headerlink anchor&#34;&gt;&lt;i class=&#34;iconfont icon-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;Terminology considerations&lt;/h2&gt;&lt;p&gt;&amp;ldquo;&lt;em&gt;Server management interface&lt;/em&gt;&amp;rdquo;, &amp;ldquo;&lt;em&gt;control panel&lt;/em&gt;&amp;rdquo;, &amp;ldquo;&lt;em&gt;dashboard&lt;/em&gt;&amp;rdquo;&amp;hellip; While investigating Free and Open Source graphical server management software, I had trouble establishing the categorical difference between the different solutions I was reading about.&lt;/p&gt;
&lt;p&gt;My use case being a &amp;ldquo;single user homelab/server&amp;rdquo; and not a multi-tenancy reseller/web hosting solution, I initially left aside the well established category of &lt;a href=&#34;https://www.linode.com/docs/guides/how-to-choose-a-control-panel/#what-is-a-control-panel&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;control panels&lt;/a&gt; (with the exception of HestiaCP).&lt;/p&gt;
&lt;p&gt;The projects that caught my interest were &lt;a href=&#34;https://cockpit-project.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Cockpit&lt;/a&gt;, &lt;a href=&#34;https://hestiacp.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;HestiaCP&lt;/a&gt;, &lt;a href=&#34;https://www.portainer.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Portainer&lt;/a&gt;, &lt;a href=&#34;https://caprover.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CapRover&lt;/a&gt;, &lt;a href=&#34;https://casaos.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CasaOS&lt;/a&gt;, &lt;a href=&#34;https://www.cloudron.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Cloudron&lt;/a&gt;, and to a lesser extent, &lt;a href=&#34;https://github.com/SelfhostedPro/Yacht&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Yacht&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But try as I might, I just couldn&amp;rsquo;t wrap my head around what precisely distinguished them. Of course I could see that they had different focus: some were more sysadmin/general server management-oriented while others were more app- and Docker-oriented; but I lacked a general &lt;em&gt;category theory&lt;/em&gt; for them.&lt;/p&gt;
&lt;p&gt;My search-fu not yielding anything relevant, I thought I&amp;rsquo;d probe ChatGPT about it. This resulted in a most enlightening conversation, as it answered with a distinction that felt like a Eureka moment to me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The solutions you&amp;rsquo;ve mentioned, including Portainer, HestiaCP, CapRover, CasaOS, Cloudron, and Yacht, represent a different category of software compared to the &lt;strong&gt;server management tools&lt;/strong&gt; like Cockpit, Webmin, Ajenti, and others.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It then went on to provide the following breakup:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Server Management Tools&lt;/strong&gt; (e.g. Cockpit, Webmin, Ajenti):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Purpose:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Primarily focused on server administration and configuration.&lt;/li&gt;
&lt;li&gt;Provide a broad range of controls over system settings, users, and services.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Complexity:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Varies from beginner-friendly to advanced, catering to users with different skill levels.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Interface Type:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Often web-based but can include desktop GUI options.&lt;/li&gt;
&lt;li&gt;Aimed at managing servers directly, not specifically for application or container orchestration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scalability:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Typically suitable for small to large enterprises.&lt;/li&gt;
&lt;li&gt;Designed for overall server management, including security, networking, and system configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Community Support:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Active open-source communities provide support and contribute to feature development.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Integration:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Extensive third-party module or plugin support for customization.&lt;/li&gt;
&lt;li&gt;May include features for managing server-wide tasks and configurations.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Application and Container Orchestration Tools&lt;/strong&gt; (e.g. Portainer, HestiaCP, CapRover, CasaOS, Cloudron, Yacht):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Purpose:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Focused on managing and orchestrating applications, containers, and services.&lt;/li&gt;
&lt;li&gt;Streamlined for deploying and managing web applications and services in containerized environments.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Complexity:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Typically designed to be user-friendly, catering to developers and administrators with varying skill levels.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Interface Type:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Primarily web-based interfaces, emphasizing container and application management.&lt;/li&gt;
&lt;li&gt;Often include features for easy deployment, scaling, and monitoring of applications.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scalability:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Suited for small to medium-scale applications and services.&lt;/li&gt;
&lt;li&gt;Designed for ease of use in deploying and managing containerized applications.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Community Support:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Active communities, often developer-focused, providing support and contributing to the development of container-related features.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Integration:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Strong integration with containerization technologies (e.g., Docker, Kubernetes).&lt;/li&gt;
&lt;li&gt;Emphasis on managing application stacks, updating applications, and maintaining service availability.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;Note that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the content of some categories don&amp;rsquo;t really fit their header (&lt;em&gt;e.g.&lt;/em&gt; &amp;ldquo;Interface Type&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;HestiaCP is lumped in the &amp;ldquo;Application and Container Orchestration Tools&amp;rdquo; category, despite its &lt;a href=&#34;https://hestiacp.com/features.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;features&lt;/a&gt; being arguably more control panel-y/towards server management.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is to just highlight the very reasonable limits of ChatGPT (3.5), in what was otherwise a super useful answer.&lt;/p&gt;
&lt;h2 id=&#34;coming-up-with-a-unified-categorization&#34;&gt;&lt;a href=&#34;#coming-up-with-a-unified-categorization&#34; class=&#34;headerlink anchor&#34;&gt;&lt;i class=&#34;iconfont icon-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;Coming up with a unified categorization&lt;/h2&gt;&lt;p&gt;I kept poking at the prompt until I managed to formulate a General Category Theory of Server Management Graphical User Interfaces™, inclusive of control panels and &lt;em&gt;mere&lt;/em&gt; dashboards. Here&amp;rsquo;s the result:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The terms &amp;ldquo;server management tools&amp;rdquo;, &amp;ldquo;control panels&amp;rdquo;, &amp;ldquo;application and container orchestration tools&amp;rdquo; and &amp;ldquo;server dashboards&amp;rdquo; are sometimes used interchangeably, but they often refer to different aspects of managing and monitoring servers. Here&amp;rsquo;s how you can distinguish between them:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Server Management Tools:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose:&lt;/strong&gt; Server management tools are software applications designed to facilitate the configuration, administration, and monitoring of servers. They offer a range of features for tasks such as user management, service configuration, and system monitoring.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scope:&lt;/strong&gt; Server management tools encompass a broad set of functionalities related to overall server administration, configuration, and maintenance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Examples:&lt;/strong&gt; Cockpit, Webmin, Ajenti and ISPConfig are examples of server management tools.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Control Panels:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose:&lt;/strong&gt; Control panels are specialized interfaces that provide centralized control over specific server functionalities, often in a web-based environment. They are designed to simplify the management of specific server aspects, such as web hosting, email services, or database management.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scope:&lt;/strong&gt; Control panels are more focused and may not cover all aspects of server management. They often excel in specific use cases and are user-friendly for individuals who may not have extensive server administration experience.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Examples:&lt;/strong&gt; HestiaCP, Froxlor and Virtualmin are examples of control panels.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Application and Container Orchestration Tools&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose:&lt;/strong&gt; These tools aim to streamline application deployment, scale applications automatically to handle varying workloads, provide centralized management for containers, and automate various aspects of deployment and updates, ultimately enhancing overall efficiency.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scope:&lt;/strong&gt; Their scope includes container orchestration, service discovery, load balancing, health monitoring, and automated rollbacks and updates. They focus on managing and coordinating the deployment, scaling, and operation of application containers in a containerized environment, ensuring seamless and efficient operations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Examples&lt;/strong&gt;: Portainer, CapRover and Yacht are examples of application and container orchestration tools.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Server Dashboards:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose:&lt;/strong&gt; Server dashboards are visual representations of real-time or historical server data, allowing users to monitor key metrics and performance indicators. They provide a quick overview of the server&amp;rsquo;s health and status.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scope:&lt;/strong&gt; Dashboards are primarily focused on providing visibility into server performance metrics and may not offer the same depth of configuration and administration features as management tools or control panels.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Examples:&lt;/strong&gt; Grafana, Kibana, and custom dashboards created using tools like Prometheus or Nagios are examples of server dashboards.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In summary, while there is some overlap in functionality, server management tools generally provide a comprehensive set of features for overall server administration. Control panels are more specialized, focusing on specific server functionalities. Application and container orchestration tools are geared towards managing and orchestrating applications and containers, ensuring efficient deployment, scaling, and maintenance. Server dashboards, on the other hand, offer visual representations of server performance metrics for monitoring purposes. The choice between them depends on the specific needs and preferences of the user or organization.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, even though ChatGPT kind of threw my FOSS requirement to the wind by mentioning famous proprietary panels (that I replaced here), all in all I feel like we did a great job coming up with a good &lt;em&gt;typology of graphical, general purpose GNU/Linux server management solutions&lt;/em&gt; (what a mouthful 😅).&lt;/p&gt;
&lt;h2 id=&#34;category-members&#34;&gt;&lt;a href=&#34;#category-members&#34; class=&#34;headerlink anchor&#34;&gt;&lt;i class=&#34;iconfont icon-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;Category members&lt;/h2&gt;&lt;p&gt;Now that our categories are well defined, it is time to flesh them out by filling them with our candidates!&lt;/p&gt;
&lt;p&gt;Without further ado, here&amp;rsquo;s a curated list with stuff somewhat beyond my initial use case:&lt;/p&gt;
&lt;h3 id=&#34;server-management-tools&#34;&gt;&lt;a href=&#34;#server-management-tools&#34; class=&#34;headerlink anchor&#34;&gt;&lt;i class=&#34;iconfont icon-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;Server Management Tools:&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://cockpit-project.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Cockpit Project&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;License:&lt;/strong&gt; LGPL 2.1&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Purpose:&lt;/em&gt; Web-based server administration and monitoring.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Complexity:&lt;/em&gt; Beginner to Intermediate.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Interface Type:&lt;/em&gt; Web-based.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Scalability:&lt;/em&gt; Suitable for both SMEs and large enterprises.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Community Support:&lt;/em&gt; Growing community.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Integration:&lt;/em&gt; Focus on integration with systemd and containers.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/cockpit-project/cockpit&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://www.webmin.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Webmin&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;License:&lt;/strong&gt; BSD&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Purpose:&lt;/em&gt; Comprehensive web-based server configuration and management.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Complexity:&lt;/em&gt; Varies from beginner-friendly to advanced.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Interface Type:&lt;/em&gt; Web-based.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Scalability:&lt;/em&gt; Suitable for SMEs and large enterprises.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Community Support:&lt;/em&gt; Active community.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Integration:&lt;/em&gt; Extensive third-party module support.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/webmin/webmin&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://ajenti.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Ajenti&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;License:&lt;/strong&gt; AGPLv3&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Purpose:&lt;/em&gt; Web-based server administration with support for plugins.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Complexity:&lt;/em&gt; Intermediate.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Interface Type:&lt;/em&gt; Web-based.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Scalability:&lt;/em&gt; Suitable for SMEs.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Community Support:&lt;/em&gt; Active community.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Integration:&lt;/em&gt; Supports various plugins for extended functionality.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/ajenti/ajenti&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.ispconfig.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;ISPConfig&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;License:&lt;/strong&gt; BSD&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Purpose:&lt;/em&gt; All-in-one server management panel.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Complexity:&lt;/em&gt; Intermediate to Advanced.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Interface Type:&lt;/em&gt; Web-based.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Scalability:&lt;/em&gt; Suitable for SMEs and large enterprises.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Community Support:&lt;/em&gt; Active community.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Integration:&lt;/em&gt; Strong support for multi-server setups.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/servisys/ispconfig_setup&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://zentyal.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Zentyal&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;License:&lt;/strong&gt; GPLv2&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Purpose:&lt;/em&gt; Linux Small Business Server.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Complexity:&lt;/em&gt; Intermediate.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Interface Type:&lt;/em&gt; Web-based.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Scalability:&lt;/em&gt; Suitable for SMEs.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Community Support:&lt;/em&gt; Active community.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Integration:&lt;/em&gt; Offers a wide range of server modules.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/zentyal/zentyal&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;web-hostingcontrol-panels&#34;&gt;&lt;a href=&#34;#web-hostingcontrol-panels&#34; class=&#34;headerlink anchor&#34;&gt;&lt;i class=&#34;iconfont icon-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;Web hosting/Control Panels&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://hestiacp.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;HestiaCP&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;License:&lt;/strong&gt; GPLv3&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Purpose:&lt;/em&gt; Web hosting control panel.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Complexity:&lt;/em&gt; Intermediate.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Interface Type:&lt;/em&gt; Web-based.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Scalability:&lt;/em&gt; Suitable for SMEs.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Community Support:&lt;/em&gt; Active community.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Integration:&lt;/em&gt; Manages website hosting, email services, and server configurations.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/hestiacp/hestiacp&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.froxlor.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Froxlor&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;License:&lt;/strong&gt; GPL&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Purpose:&lt;/em&gt; Server management panel with a focus on web hosting and server administration.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Complexity:&lt;/em&gt; Intermediate.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Interface Type:&lt;/em&gt; Web-based.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Scalability:&lt;/em&gt; Suitable for SMEs.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Community Support:&lt;/em&gt; Active community.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Integration:&lt;/em&gt; Manages web hosting, domain configurations, and server settings.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/Froxlor/Froxlor&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.virtualmin.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Virtualmin&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;License:&lt;/strong&gt; GPL&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Purpose:&lt;/em&gt; Web hosting control panel with a focus on managing virtual hosts.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Complexity:&lt;/em&gt; Intermediate.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Interface Type:&lt;/em&gt; Web-based.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Scalability:&lt;/em&gt; Suitable for SMEs.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Community Support:&lt;/em&gt; Active community.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Integration:&lt;/em&gt; Manages website hosting, email services, and server configurations.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/virtualmin/virtualmin&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub Repository&lt;/a&gt; &lt;em&gt;(Note: Virtualmin is primarily available through its official website, and its source code is available on GitHub for specific components.)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://cyberpanel.net/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CyberPanel&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;License:&lt;/strong&gt; GPL&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Purpose:&lt;/em&gt; Web hosting control panel with a focus on performance and security.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Complexity:&lt;/em&gt; Intermediate.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Interface Type:&lt;/em&gt; Web-based.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Scalability:&lt;/em&gt; Suitable for SMEs.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Community Support:&lt;/em&gt; Active community.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Integration:&lt;/em&gt; Manages website hosting, email services, and server configurations.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/usmannasir/cyberpanel&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub Repository&lt;/a&gt; &lt;em&gt;(Note: CyberPanel is primarily available through its official website, and its source code is available on GitHub.)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://alternc.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;AlternC&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;License:&lt;/strong&gt; GPLv3&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Purpose:&lt;/em&gt; Web hosting control panel with a focus on environmental responsibility.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Complexity:&lt;/em&gt; Intermediate.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Interface Type:&lt;/em&gt; Web-based.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Scalability:&lt;/em&gt; Suitable for SMEs.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/AlternC/AlternC&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;applicationcontainer-orchestration-tools&#34;&gt;&lt;a href=&#34;#applicationcontainer-orchestration-tools&#34; class=&#34;headerlink anchor&#34;&gt;&lt;i class=&#34;iconfont icon-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;Application/Container Orchestration Tools:&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.portainer.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Portainer&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;License:&lt;/strong&gt; AGPLv3&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Purpose:&lt;/em&gt; Docker container management.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Complexity:&lt;/em&gt; Beginner to Intermediate.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Interface Type:&lt;/em&gt; Web-based.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Scalability:&lt;/em&gt; Suitable for SMEs.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Community Support:&lt;/em&gt; Active community.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Integration:&lt;/em&gt; Manages Docker containers with a user-friendly interface.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/portainer/portainer&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://caprover.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CapRover&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;License:&lt;/strong&gt; Apache License 2.0&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Purpose:&lt;/em&gt; Automated deployment for web apps.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Complexity:&lt;/em&gt; Beginner to Intermediate.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Interface Type:&lt;/em&gt; Web-based.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Scalability:&lt;/em&gt; Suitable for SMEs.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Community Support:&lt;/em&gt; Active community.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Integration:&lt;/em&gt; Focus on automated deployment of web applications.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/caprover/caprover&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://casaos.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CasaOS&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;License:&lt;/strong&gt; AGPLv3&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Purpose:&lt;/em&gt; Server management and automation.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Complexity:&lt;/em&gt; Intermediate.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Interface Type:&lt;/em&gt; Web-based.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Scalability:&lt;/em&gt; Suitable for SMEs.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Community Support:&lt;/em&gt; Active community.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Integration:&lt;/em&gt; Provides server management and automation features.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/casaos/casaos&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.cloudron.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Cloudron&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;License:&lt;/strong&gt; Proprietary&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Purpose:&lt;/em&gt; Self-hosted web app platform.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Complexity:&lt;/em&gt; Beginner to Intermediate.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Interface Type:&lt;/em&gt; Web-based.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Scalability:&lt;/em&gt; Suitable for SMEs.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Community Support:&lt;/em&gt; Active community.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Integration:&lt;/em&gt; Manages self-hosted web applications.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://git.cloudron.io/cloudron&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/SelfhostedPro/Yacht&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Yacht&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;License:&lt;/strong&gt; MIT&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Purpose:&lt;/em&gt; Docker management with a focus on simplicity.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Complexity:&lt;/em&gt; Beginner to Intermediate.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Interface Type:&lt;/em&gt; Web-based.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Scalability:&lt;/em&gt; Suitable for SMEs.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Community Support:&lt;/em&gt; Active community.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Integration:&lt;/em&gt; Simplifies Docker container management.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/SelfhostedPro/Yacht&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now it&amp;rsquo;s experimentation time! 🥳&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PS: If you need even more, &lt;a href=&#34;https://medevel.com/os-server-control-panel/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;here is a random article&lt;/a&gt; listing 30 similar solutions including many dashboards.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Happy hacking!&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
