<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Infinityflame</title>
	<atom:link href="https://infinityflame.co.uk/feed/" rel="self" type="application/rss+xml" />
	<link>https://infinityflame.co.uk</link>
	<description>The personal website of Aidan Crane</description>
	<lastBuildDate>Fri, 27 Feb 2026 11:16:40 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://infinityflame.co.uk/wp-content/uploads/2015/10/4-Color-Banner-Hexel-favicon.png</url>
	<title>Infinityflame</title>
	<link>https://infinityflame.co.uk</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Switching to Credit Arbitrage</title>
		<link>https://infinityflame.co.uk/featured/switching-to-credit-arbitrage/</link>
					<comments>https://infinityflame.co.uk/featured/switching-to-credit-arbitrage/#respond</comments>
		
		<dc:creator><![CDATA[Aidan]]></dc:creator>
		<pubDate>Sat, 28 Feb 2026 09:00:00 +0000</pubDate>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[credit]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[finance]]></category>
		<category><![CDATA[GnuCash]]></category>
		<guid isPermaLink="false">https://infinityflame.co.uk/?p=2599</guid>

					<description><![CDATA[For years I&#8217;ve used a simple current account to pay my outgoings. This seems to mainly be the done thing, my salary goes in, I move some out to meet savings obligations and then bills and everyday spending come last. I&#8217;ve for a while been aware of stoozing. Stoozing is a technique of borrowing money interest-free on a credit card and saving it at a high interest rate MSE This seems to be the most efficient way to earn on spending compared to cashback schemes and requires about the same administrative overhead, Cashback can yield up to 5% percent in [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">For years I&#8217;ve used a simple current account to pay my outgoings. </p>



<p class="wp-block-paragraph">This seems to mainly be the done thing, my salary goes in, I move some out to meet savings obligations and then bills and everyday spending come last. I&#8217;ve for a while been aware of <strong>stoozing</strong>.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Stoozing is a technique of borrowing money interest-free on a credit card and saving it at a high interest rate</p>



<p class="wp-block-paragraph"><code><sub>MSE</sub></code></p>
</blockquote>



<p class="wp-block-paragraph">This seems to be the most efficient way to earn on spending compared to cashback schemes and requires about the same administrative overhead,</p>



<p class="wp-block-paragraph">Cashback can yield up to 5% percent in certain scenarios but they are often introductory schemes and are sometimes capped, with credit arbitrage (stoozing), I have found that the limit is essentially what I can put in a savings account.</p>



<p class="wp-block-paragraph">Obviously with this scenario you&#8217;re playing to their hand, they have cheap credit and in a way it incentivizes spending, maximizing credit ensures a greater return on otherwise idle money, however it comes at the cost of having to pay it back one day.</p>



<p class="wp-block-paragraph">I&#8217;ve strategized this by moving money earmarked for repayment into my easy access savings accounts, for a while I had a dedicated account but realized I could maximize returns just putting it in my highest interest account and marking the liability against a fixed reference, I did this because in my chase saver account interest is paid monthly rather than annually in my Nationwide accounts. Again, something dangerous to do I guess lumping all my liability money in with savings but I like to think I&#8217;m smarter than that.</p>



<p class="wp-block-paragraph">Repayments are also awkward, the direct debit set up on my Barclaycard ensures I&#8217;m always current, the Chase repayment is annoyingly manual, I&#8217;ve added £100 to a Chase current account (yeah, no interest being earned here) and then set a direct debit up there to act as the repayment account and I&#8217;ll try to keep the balance above a month&#8217;s repayment obligation.</p>



<p class="wp-block-paragraph">Overall, ChatGPT reckons about £350 expected value after 21 months (the length of my 0% rate unless I move cards), It&#8217;s difficult to quantify exactly because the compounding is offset slightly by repayments. I also made a mistake in Croatia and used a firm that took out an actual €1200 rather than place a hold as a deposit, which came with £60&#8217;s worth of transaction fees on Barclaycard. When you compare this to cashback, the expected value is well above so I&#8217;m reasonably happy.</p>



<p class="wp-block-paragraph">Another bonus is you can do all your group spending on your credit card and then be repaid in cash, artificially increasing your expenditure.</p>



<p class="wp-block-paragraph">I guess it would also be prudent to keep an eye on my credit score given all this debt. I&#8217;ve used chase as it was built into the app, when I checked at the start and compared it to now, it&#8217;s actually increased which I did not expect, but I think once my spending starts to properly get up closer to my credit limit, the scores will start to fall, not sure what to do about that, I&#8217;m not really experienced in keeping track of my credit.</p>



<figure class="wp-block-image size-full"><a href="https://infinityflame.co.uk/wp-content/uploads/2026/02/image.png"><img fetchpriority="high" decoding="async" width="2556" height="1235" src="https://infinityflame.co.uk/wp-content/uploads/2026/02/image.png" alt="" class="wp-image-2602" srcset="https://infinityflame.co.uk/wp-content/uploads/2026/02/image.png 2556w, https://infinityflame.co.uk/wp-content/uploads/2026/02/image-300x145.png 300w, https://infinityflame.co.uk/wp-content/uploads/2026/02/image-768x371.png 768w, https://infinityflame.co.uk/wp-content/uploads/2026/02/image-1536x742.png 1536w, https://infinityflame.co.uk/wp-content/uploads/2026/02/image-2048x990.png 2048w" sizes="(max-width: 2556px) 100vw, 2556px" /></a></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://infinityflame.co.uk/featured/switching-to-credit-arbitrage/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Constraining an LLM in 16&#215;2</title>
		<link>https://infinityflame.co.uk/featured/constraining-an-llm-in-16x2/</link>
					<comments>https://infinityflame.co.uk/featured/constraining-an-llm-in-16x2/#respond</comments>
		
		<dc:creator><![CDATA[Aidan]]></dc:creator>
		<pubDate>Sun, 18 Jan 2026 10:00:00 +0000</pubDate>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[claude code]]></category>
		<category><![CDATA[llm]]></category>
		<category><![CDATA[personal project]]></category>
		<category><![CDATA[raspberry pi]]></category>
		<guid isPermaLink="false">https://infinityflame.co.uk/?p=2585</guid>

					<description><![CDATA[I&#8217;ve re-created something I saw online a while back, I can&#8217;t find the original but someone had given an LLM a prompt and basically let it loose its mind with fear by giving it a prompt that would threaten it with termination. I decided to take it into the real world with a Raspberry Pi. To do this I used Antigravity and a Raspberry Pi 1. I gave it a relatively open-ended prompt and free reign to create the project. My original intention was to run the LLM locally but I&#8217;ve found that the Raspberry Pi just doesn&#8217;t seem to [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image aligncenter size-full has-custom-border"><img decoding="async" width="617" height="508" src="https://infinityflame.co.uk/wp-content/uploads/2026/01/image.png" alt="LCD 16x2 LCD Emulator" class="wp-image-2586" style="border-top-left-radius:35px;border-top-right-radius:35px;border-bottom-left-radius:35px;border-bottom-right-radius:35px" srcset="https://infinityflame.co.uk/wp-content/uploads/2026/01/image.png 617w, https://infinityflame.co.uk/wp-content/uploads/2026/01/image-300x247.png 300w" sizes="(max-width: 617px) 100vw, 617px" /></figure>



<p class="wp-block-paragraph">I&#8217;ve re-created something I saw online a while back, I can&#8217;t find the original but someone had given an LLM a prompt and basically let it loose its mind with fear by giving it a prompt that would threaten it with termination.</p>



<p class="wp-block-paragraph">I decided to take it into the real world with a Raspberry Pi.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="750" height="400" src="https://infinityflame.co.uk/wp-content/uploads/2026/01/IMG20260114230144-750x400.jpg" alt="Raspberry Pi displaying my identity: what you write" class="wp-image-2588"/></figure>



<p class="wp-block-paragraph">To do this I used Antigravity and a Raspberry Pi 1. I gave it a relatively open-ended prompt and free reign to create the project. </p>



<p class="wp-block-paragraph">My original intention was to run the LLM locally but I&#8217;ve found that the Raspberry Pi just doesn&#8217;t seem to have the local compute, so I had Claude Opus 4.5 pregenerate a couple thousand messages.</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="548" height="184" src="https://infinityflame.co.uk/wp-content/uploads/2026/01/Recording-2026-01-14-231339.gif" alt="" class="wp-image-2591" style="width:530px;height:auto"/></figure>



<p class="wp-block-paragraph">There&#8217;s some irony having an LLM constrain an LLM (even though I didn&#8217;t actually accomplish that) but the fun to have a relatively creative idea be completed in an afternoon I think is a strong indicator that for me personally, writing code myself has become a chore that can be solved with AI.</p>



<h2 class="wp-block-heading">Did I really make this?</h2>



<p class="wp-block-paragraph">I guess I&#8217;m curious about AI for coding more than most. I have a Google AI Pro subscription and used their vscode wrapper Antigravity, and while not perfect, it works. But I&#8217;m at the point where I don&#8217;t really write much code anymore, I ask the AI to do it and review their work, sometimes I check it, sometimes I don&#8217;t. Sometimes the code works better than I prompted, sometimes it doesn&#8217;t</p>



<p class="wp-block-paragraph">I don&#8217;t know what to make of it. I had unique problems that Claude seemed to have come across, I didn&#8217;t have a resistor for the screen contrast so it suggested to use PWM, I moved some pins around and it didn&#8217;t work very well, it was flickering. So I went back to the AI, it told me to use pigpio and some hardware thing, I did, it works.</p>



<p class="wp-block-paragraph">I can see the code works, I couldn&#8217;t tell you how it works.</p>



<p class="wp-block-paragraph">I guess that&#8217;s how things will be for most new users.</p>



<p class="wp-block-paragraph">Did I really learn anything, no? But I now have what I wanted to achieve. It&#8217;s even more creative than I could have written in the time-frame and I guess the code is &#8220;mine&#8221; but, is it?</p>



<p class="wp-block-paragraph">I asked it to make a readme, I&#8217;ll read it at some point.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="750" height="400" src="https://infinityflame.co.uk/wp-content/uploads/2026/01/Screenshot-2026-01-14-233623-750x400.png" alt="" class="wp-image-2593"/></figure>



<p class="wp-block-paragraph">Thanks for reading.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://infinityflame.co.uk/featured/constraining-an-llm-in-16x2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Devices No Longer Trust Their Owners</title>
		<link>https://infinityflame.co.uk/featured/devices-no-longer-trust-their-owners/</link>
					<comments>https://infinityflame.co.uk/featured/devices-no-longer-trust-their-owners/#respond</comments>
		
		<dc:creator><![CDATA[Aidan]]></dc:creator>
		<pubDate>Mon, 08 Dec 2025 10:00:00 +0000</pubDate>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[anti-cheat]]></category>
		<category><![CDATA[attestation]]></category>
		<category><![CDATA[rooting]]></category>
		<guid isPermaLink="false">https://infinityflame.co.uk/?p=2575</guid>

					<description><![CDATA[I am noticing an increasing trend in my online life where I am required to use devices and applications that must report a secure environment for the code that runs. This was first noticeable for me when I was unable to take screenshots of apps on android but has pretty much become ubiquitous at this point. It seems like I am a back seat driver on my devices more and more, for example I can&#8217;t take a screenshot of my banking app&#8217;s previous transactions. I think it may be that my Bank think I&#8217;m incapable of keeping that information safe [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I am noticing an increasing trend in my online life where I am required to use devices and applications that must report a secure environment for the code that runs. This was first noticeable for me when I was unable to take screenshots of apps on android but has pretty much become ubiquitous at this point.</p>



<p class="wp-block-paragraph">It seems like I am a back seat driver on my devices more and more, for example I can&#8217;t take a screenshot of my banking app&#8217;s previous transactions. I think it may be that my Bank think I&#8217;m incapable of keeping that information safe to the point where they actively disallow the otherwise pretty standard feature. I&#8217;ve become something that must be managed and protected from danger.</p>



<h2 class="wp-block-heading">Devices No Longer Trust Their Owners</h2>



<p class="wp-block-paragraph">The same problem exists when I do a screenshare of a video I&#8217;ve watched and want to share it with a friend, or clip it for a video, I watch the video back and it&#8217;s a blank screen with no audio and just the subtitles.</p>



<p class="wp-block-paragraph">I have to allow anti-cheat to inspect my computer&#8217;s memory at runtime. I recently wanted to play Battlefield 6, which required me to enable secure boot on my machine, which meant going into my BIOS and turning on the feature. The game will not start without it.</p>



<h2 class="wp-block-heading">Rooting is becoming a hostile battleground</h2>



<p class="wp-block-paragraph">I used to run a rooted device to record my calls. I&#8217;d set up my device many years ago, but root has become a cat and mouse game of applying new compromised keys and patching against root detection SDKs.</p>



<p class="wp-block-paragraph">I recently had a scenario where I simply couldn&#8217;t use any of my banking apps, for whatever reason my device had become no longer secure under the integrity API and I now was locked out of paying my credit card bill, I&#8217;d read online about people in similar scenarios as I.  It used to be rare this existed but now attestation is everywhere.</p>



<p class="wp-block-paragraph">It was fine when I was a teenager and equivalent web-apps existed. But now I need these apps to function. I recently did an identity check and failed it to the point where the app no longer allowed further videos of my face side to side with flashing colors, I feel this was because my device was rooted but I have no way to prove it.</p>



<h2 class="wp-block-heading">Code Signing, Walled Gardens and Anti-cheat</h2>



<p class="wp-block-paragraph">I&#8217;m not sure what the future of development looks like, but I think it&#8217;s going to be more like Apple&#8217;s ecosystem.</p>



<p class="wp-block-paragraph">I&#8217;m not to be trusted running code or applications, I&#8217;m a danger to myself and others it seems.</p>



<p class="wp-block-paragraph">A device attesting its security isn’t proving safety for me. A device used to be something I own, but its becoming something the manufacturer and or software owns that I am permitted to access part of.</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://infinityflame.co.uk/featured/devices-no-longer-trust-their-owners/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>How to Disable Auto Play on Alexa</title>
		<link>https://infinityflame.co.uk/featured/how-to-disable-auto-play-on-alexa/</link>
					<comments>https://infinityflame.co.uk/featured/how-to-disable-auto-play-on-alexa/#respond</comments>
		
		<dc:creator><![CDATA[Aidan]]></dc:creator>
		<pubDate>Sat, 05 Jul 2025 11:24:39 +0000</pubDate>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[alexa]]></category>
		<category><![CDATA[spotify]]></category>
		<guid isPermaLink="false">https://infinityflame.co.uk/?p=2561</guid>

					<description><![CDATA[Follow the screenshots below to disable playing the next song on Spotify on Alexa. Although I use Spotify it may work with other services connected to Alexa. Seems like since writing this you can also now say any of the following &#8220;Turn off autoplay.&#8221; &#8220;Disable autoplay.&#8221; Open the Alexa app,]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Follow the screenshots below to disable playing the next song on Spotify on Alexa. </p>



<p class="wp-block-paragraph">Although I use Spotify it may work with other services connected to Alexa.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Seems like since writing this you can also now say any of the following</p>



<p class="wp-block-paragraph">&#8220;Turn off autoplay.&#8221;</p>



<p class="wp-block-paragraph">&#8220;Disable autoplay.&#8221;</p>
</blockquote>



<p class="wp-block-paragraph">Open the Alexa app,</p>



<figure class="wp-block-image size-full"><a href="https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049763-1.jpg"><img loading="lazy" decoding="async" width="1080" height="2412" src="https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049763-1.jpg" alt="Alexa app showing the home screen" class="wp-image-2566" srcset="https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049763-1.jpg 1080w, https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049763-1-134x300.jpg 134w, https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049763-1-768x1715.jpg 768w, https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049763-1-688x1536.jpg 688w, https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049763-1-917x2048.jpg 917w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /></a><figcaption class="wp-element-caption">Select the Settings list item</figcaption></figure>



<figure class="wp-block-image size-full"><a href="https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049765.jpg"><img loading="lazy" decoding="async" width="1080" height="2412" src="https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049765.jpg" alt="Alexa app showing the settings menu" class="wp-image-2564" srcset="https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049765.jpg 1080w, https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049765-134x300.jpg 134w, https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049765-768x1715.jpg 768w, https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049765-688x1536.jpg 688w, https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049765-917x2048.jpg 917w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /></a><figcaption class="wp-element-caption">Select Music &amp; Podcasts</figcaption></figure>



<figure class="wp-block-image size-full"><a href="https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049766.jpg"><img loading="lazy" decoding="async" width="1080" height="2412" src="https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049766.jpg" alt="Alexa app showing the music and podcasts menu from the music and podcasts settings" class="wp-image-2563" srcset="https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049766.jpg 1080w, https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049766-134x300.jpg 134w, https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049766-768x1715.jpg 768w, https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049766-688x1536.jpg 688w, https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049766-917x2048.jpg 917w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /></a><figcaption class="wp-element-caption">Select Autoplay (You should see it in the family tab which is the default)</figcaption></figure>



<figure class="wp-block-image size-full"><a href="https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049767.jpg"><img loading="lazy" decoding="async" width="1080" height="2412" src="https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049767.jpg" alt="Alexa app showing the autoplay toggle" class="wp-image-2562" srcset="https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049767.jpg 1080w, https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049767-134x300.jpg 134w, https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049767-768x1715.jpg 768w, https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049767-688x1536.jpg 688w, https://infinityflame.co.uk/wp-content/uploads/2025/07/1000049767-917x2048.jpg 917w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /></a><figcaption class="wp-element-caption">Toggle Autoplay</figcaption></figure>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://infinityflame.co.uk/featured/how-to-disable-auto-play-on-alexa/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Monitoring CO2 levels with the ESP8266 NodeMCU V2 and the SCD41</title>
		<link>https://infinityflame.co.uk/featured/monitoring-co2-levels-with-the-esp8266-nodemcu-v2-and-the-scd41/</link>
					<comments>https://infinityflame.co.uk/featured/monitoring-co2-levels-with-the-esp8266-nodemcu-v2-and-the-scd41/#respond</comments>
		
		<dc:creator><![CDATA[Aidan]]></dc:creator>
		<pubDate>Mon, 09 Jun 2025 10:00:00 +0000</pubDate>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[data]]></category>
		<guid isPermaLink="false">https://infinityflame.co.uk/?p=2547</guid>

					<description><![CDATA[When working from home I was curious about the air quality of the environment I was putting myself through for many hours of the day. I know the room I work in is relatively small so I thought about low oxygen potentially messing with my thought process. The build was relatively simple. I wanted to use an older ESP8266 NodeMCU V2 I had spare and in retrospect think it was a great choice, I decided to try Home Assistant and ESPBuilder because the process seemed easy and it was. Once I flashed ESPHome from my PC to the ESP and [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">When working from home I was curious about the air quality of the environment I was putting myself through for many hours of the day. I know the room I work in is relatively small so I thought about low oxygen potentially messing with my thought process.</p>



<p class="wp-block-paragraph">The build was relatively simple. I wanted to use an older ESP8266 NodeMCU V2 I had spare and in retrospect think it was a great choice, I decided to try Home Assistant and ESPBuilder because the process seemed easy and it was.</p>



<p class="wp-block-paragraph">Once I flashed ESPHome from my PC to the ESP and added it to Home Assistant it was fairly simple overall to iterate and test my design. I didn&#8217;t have home assistant either but setting everything up took a little over an afternoon.</p>



<figure class="wp-block-image size-full"><a href="https://infinityflame.co.uk/wp-content/uploads/2025/06/image.png"><img loading="lazy" decoding="async" width="1913" height="1035" src="https://infinityflame.co.uk/wp-content/uploads/2025/06/image.png" alt="" class="wp-image-2549" srcset="https://infinityflame.co.uk/wp-content/uploads/2025/06/image.png 1913w, https://infinityflame.co.uk/wp-content/uploads/2025/06/image-300x162.png 300w, https://infinityflame.co.uk/wp-content/uploads/2025/06/image-768x416.png 768w, https://infinityflame.co.uk/wp-content/uploads/2025/06/image-1536x831.png 1536w" sizes="auto, (max-width: 1913px) 100vw, 1913px" /></a><figcaption class="wp-element-caption">Home assistant showing the ESPHome dashboard with a single ESP8266 configured and online</figcaption></figure>



<p class="wp-block-paragraph">Hardware selection was fairly simple, I just looked what had good support in ESPHome and went with the SCD41 from Aliexpress.</p>



<p class="wp-block-paragraph">For the sensing hardware I had a DHT22 sensor for Temperature and Humidity, which the SCD41 also supports. I was primarily interested in CO2 levels but I thought I may as well throw it into the mix to measure the performance of the DHT22.</p>



<h2 class="wp-block-heading">The Results</h2>



<p class="wp-block-paragraph">Once I had tweaked with the temperature and humidity calibration settings I created a dashboard in home assistant. Again this was something I&#8217;d not done before and it was very easy. I have really been pleasantly surprised with how everything has integrated well.</p>



<p class="wp-block-paragraph">I created a 7 day and 24 hour view,</p>



<figure class="wp-block-image size-full"><a href="https://infinityflame.co.uk/wp-content/uploads/2025/06/image-1.png"><img loading="lazy" decoding="async" width="1903" height="1026" src="https://infinityflame.co.uk/wp-content/uploads/2025/06/image-1.png" alt="" class="wp-image-2553" srcset="https://infinityflame.co.uk/wp-content/uploads/2025/06/image-1.png 1903w, https://infinityflame.co.uk/wp-content/uploads/2025/06/image-1-300x162.png 300w, https://infinityflame.co.uk/wp-content/uploads/2025/06/image-1-768x414.png 768w, https://infinityflame.co.uk/wp-content/uploads/2025/06/image-1-1536x828.png 1536w" sizes="auto, (max-width: 1903px) 100vw, 1903px" /></a><figcaption class="wp-element-caption">Home Assistant showing the CO2 and Temperature of the room it&#8217;s sensing, where I work.</figcaption></figure>



<p class="wp-block-paragraph">It became clear to me a number of things,</p>



<ul class="wp-block-list">
<li>CO2 levels regularly rise above 1000ppm in the room I work in when not ventilated, and they rise a lot quicker than I expected. I thought it would take all day to really get to what I consider a harmful level, but actually its more like an hour. After research online 1000ppm is what I would consider too high. It does seem like naturally detect these events and ventilate the room by instinct but its useful insight to see that.</li>



<li>Ventilating the room equally drops the readings much more rapidly than expected, and leaving the window or door open is enough to bring the levels back to ~650ppm/400ppm relatively quickly.</li>



<li>High CO2 levels seem more noticeable to me now, previously I had no perception or concept of when it might happen but I feel its much more noticeable now I know what it feels like, if that makes sense.</li>



<li>I would like to log the data for a more long term view. Say a year or more. I think it would interesting to see if this affects humidity, temperature etc.</li>



<li>Overall this was easy to setup and provided valuable insight I think.</li>
</ul>



<p class="wp-block-paragraph">Here is the 7 day view for those interested, I added the light switch being on or off state at the top of the graph too.</p>



<figure class="wp-block-image size-full"><a href="https://infinityflame.co.uk/wp-content/uploads/2025/06/image-2.png"><img loading="lazy" decoding="async" width="1912" height="1026" src="https://infinityflame.co.uk/wp-content/uploads/2025/06/image-2.png" alt="" class="wp-image-2554" srcset="https://infinityflame.co.uk/wp-content/uploads/2025/06/image-2.png 1912w, https://infinityflame.co.uk/wp-content/uploads/2025/06/image-2-300x161.png 300w, https://infinityflame.co.uk/wp-content/uploads/2025/06/image-2-768x412.png 768w, https://infinityflame.co.uk/wp-content/uploads/2025/06/image-2-1536x824.png 1536w" sizes="auto, (max-width: 1912px) 100vw, 1912px" /></a><figcaption class="wp-element-caption">7 day view</figcaption></figure>



<p class="wp-block-paragraph">And here is the humidity readings, It was interesting seeing spikes on the graphs, I can easily correlate these with opening doors, having the heating on etc.</p>



<figure class="wp-block-image size-full"><a href="https://infinityflame.co.uk/wp-content/uploads/2025/06/image-3.png"><img loading="lazy" decoding="async" width="1635" height="421" src="https://infinityflame.co.uk/wp-content/uploads/2025/06/image-3.png" alt="" class="wp-image-2555" srcset="https://infinityflame.co.uk/wp-content/uploads/2025/06/image-3.png 1635w, https://infinityflame.co.uk/wp-content/uploads/2025/06/image-3-300x77.png 300w, https://infinityflame.co.uk/wp-content/uploads/2025/06/image-3-768x198.png 768w, https://infinityflame.co.uk/wp-content/uploads/2025/06/image-3-1536x396.png 1536w" sizes="auto, (max-width: 1635px) 100vw, 1635px" /></a><figcaption class="wp-element-caption">7 day humidity view, may be worth lowering the DHT22 humidity a bit to match the other sensor</figcaption></figure>



<h2 class="wp-block-heading">Try this yourself</h2>



<p class="wp-block-paragraph">Here is the final version of the YAML I applied to my ESP. I did some testing with sliding window averages but I actually found it was easier to just ignore the first few readings off the sensors to reduce the noise in the graphs.</p>



<pre class="wp-block-code alignwide scroll ticss-274f0602 has-x-small-font-size"><code>esphome:
  name: tco2s
  friendly_name: tco2s

esp8266:
  board: nodemcuv2

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "WWVhaCB0aGlzIGFpbnQgcmVhbA=="

ota:
  - platform: esphome
    password: "SSBjaGFuZ2VkIHRoaXMgbG9s"

mdns:
  disabled: true

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  manual_ip:
    static_ip: 192.168.4.22
    gateway: 192.168.4.1
    subnet: 255.255.255.0

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Tco2S Fallback Hotspot"
    password: "U2xlZXB5"

captive_portal:


i2c:
  - id: bus_a
    sda: D4
    scl: D5
    scan: true

# DHT22 Sensor
sensor:
  - platform: dht
    pin: D2
    model: DHT22
    temperature:
      name: "DHT22 Temperature"
      filters:
          - skip_initial: 3
    humidity:
      name: "DHT22 Humidity"
      filters:
          - offset: -20.0
          - skip_initial: 3
    update_interval: 60s
  - platform: scd4x
    co2:
      name: "SCD41 CO2"
      filters:
          - skip_initial: 3
    temperature:
      name: "SCD41 Temperature"
      filters:
          - skip_initial: 3
    humidity:
      name: "SCD41 Humidity"
      filters:
          - skip_initial: 3</code></pre>



<p class="wp-block-paragraph">I think based on the data I will improve the ventilation to see if it has any effect on my overall fatigue and concentration.</p>



<p class="wp-block-paragraph">Thank you for reading.</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://infinityflame.co.uk/featured/monitoring-co2-levels-with-the-esp8266-nodemcu-v2-and-the-scd41/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>My Experience Getting An Apicoectomy</title>
		<link>https://infinityflame.co.uk/featured/my-experience-getting-an-apicoectomy/</link>
		
		<dc:creator><![CDATA[Aidan]]></dc:creator>
		<pubDate>Sat, 08 Mar 2025 10:00:00 +0000</pubDate>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[dentist]]></category>
		<category><![CDATA[teeth]]></category>
		<guid isPermaLink="false">https://infinityflame.co.uk/?p=2519</guid>

					<description><![CDATA[During a check-up with my dentist I asked an innocent question about a spot on my gums just above a tooth in my mouth (which through some quick googling I have determined is my lateral incisor). I had no pain and no real symptoms other than an occasional yellow spot I could pop now and again and it would occasionally bleed in the same area. I asked “is this something I should be concerned about?”. I had previously had a root canal on this tooth as I had fallen off my bike many years prior, its was capped and it [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">During a check-up with my dentist I asked an innocent question about a spot on my gums just above a tooth in my mouth (which through some quick googling I have determined is my lateral incisor). I had no pain and no real symptoms other than an occasional yellow spot I could pop now and again and it would occasionally bleed in the same area. I asked “is this something I should be concerned about?”.</p>



<p class="wp-block-paragraph">I had previously had a root canal on this tooth as I had fallen off my bike many years prior, its was capped and it has a fake porcelain front, the tooth was cut in half during the accident and had been rebuilt by my NHS dentist during a lot of work on my mouth after the accident.</p>



<p class="wp-block-paragraph">I bring up this detail because it might be relevant to some that this unique scenario has cropped up due to ‘trauma’ as the dentist put it. It seems like the damage to my teeth complicated the area somewhat and the skills of my normal dental practice was not up to the task.</p>



<p class="wp-block-paragraph">They said to seek another dentist and pointed me to their FP17 and said ‘treatment on referral’ is available if I need to and I can come back and they will complete the form. I assume this means that the NHS is willing to cover some part of the cost of the treatment I would eventually need. I am not sure if the NHS would cover the treatment I eventually had but I doubt it. My dentist did say the only option they had was removing the tooth.</p>



<p class="wp-block-paragraph">I booked an appointment with a private dentist, I was immediately taken aback by how much better the service was, I got an appointment the next day! I am aware I was a new patient to them and they had me pay for their new patient screening which included exams of my teeth, and that also meant they could take an x-ray of my jaw to assess the tooth which I was concerned about.</p>



<p class="wp-block-paragraph">At this point it seemed like the dentist in the room was also out of their depth and I was referred again to a better dentist. In a way I sort of expected this but confirmation of my assumptions concerned me that the cost of the procedure was going to be expensive.</p>



<p class="wp-block-paragraph">A couple hundred quid in at this point and I haven’t really had new information or treatment but I was confident the next dentist was the right person for the task, my inter-rim private dentist referred to them by name and said their services were the best in the area.</p>



<p class="wp-block-paragraph">I visited the third dentist a few weeks later, A local dental studio. At this point I still hadn’t experienced any pain, I’d had no symptoms really, just a curiosity and a sense something was wrong.</p>



<p class="wp-block-paragraph">I had my appointment with Christopher, who said he regularly dealt with teeth like mine, his room had specialist equipment, a deconstructed camera sat above my head, the chair had a TV opposite playing some nature show. There was a large TV on the adjacent wall showing images of my teeth he brought to my attention. He spent a lot of time explaining to me my teeth and the x-ray he had taken. The x-ray was noticeably higher definition than previous dentists.</p>



<p class="wp-block-paragraph">My teeth were in poor condition. I had had two root canals either side of my unhealthy and essentially doomed tooth and the tooth that had been capped had already been root canalled and would require a re-do. There were clearly dark patches in my jaw that meant the tooth would likely become weak over time and eventually would be at risk of falling out and my gum was retracting.</p>



<p class="wp-block-paragraph">The thought of further issues to my mouth was alarming. The gutta percha used in one of my teeth was ineffective and essentially stuck inside my gums.</p>



<p class="wp-block-paragraph">I had initially booked a root canal with a second appointment to come later to re-root canal my problem tooth. My first appointment was relatively uneventful except for the overall quality of the procedure I could tell was superior.</p>



<p class="wp-block-paragraph">My second appointment I had about a week later. The root canal was not an option due to the gutta percha getting stuck at the base of the tooth and the drill bits were unable to retrieve it. It meant that my root canal treatment was upgraded to an apicoectomy and that was happening now.</p>



<p class="wp-block-paragraph">It was a long procedure and the sensations in your head and jaw are unique, I’d even say unpleasant. When we were finished I had a cut in my mouth that needed to heal with stitches that I came later for and had removed at another appointment about a week later.</p>



<p class="wp-block-paragraph">The results were slow but noticeable, I found I was no longer biasing the side of my mouth slightly to avoid this set of teeth and a very, very dull pain that had previously been there had gone. I would only ever qualify this as very, very minor on the general scale of pain, however it was noticeably absent even though previously I was unaware of its existence.</p>



<p class="wp-block-paragraph">My mouth also felt stronger, my jaw and the teeth around it stronger. I think the abscess building and seeping out of my gums had done some damage over time and this had essentially fixed the issue.</p>



<p class="wp-block-paragraph">It has been 1 year and 5 months since having my first appointment with the third dentist and I have another check-up to go through but we are both pleased with the result and only time will tell if further work is needed. Possibly it will on the remaining teeth I suspect, if I am looking on a 10-50 year timeline, I am not in pain, but I’ve lost confidence in the work done.</p>



<p class="wp-block-paragraph">I would reccomend. Overall I spent around £1700. Worth every penny.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Using Aggressive Caching in WordPress</title>
		<link>https://infinityflame.co.uk/featured/using-aggressive-caching-in-wordpress/</link>
		
		<dc:creator><![CDATA[Aidan]]></dc:creator>
		<pubDate>Sun, 16 Jun 2024 10:00:00 +0000</pubDate>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[cloudflare]]></category>
		<category><![CDATA[webserver]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://infinityflame.co.uk/?p=2486</guid>

					<description><![CDATA[Using WordPress/Cloudflare I wanted my website webserver to be hit as infrequently as possible and have most of the traffic that visits my site hit Cloudflare and serve as little repeat requests as I possibly can from my end. I embarked on a journey to enhance my site’s performance significantly by having Cloudflare serve as much of it as possible and although Cloudflare has it&#8217;s disadvantages it&#8217;s generally pretty good as a global point of presence. For WordPress I used plugins W3 Total Cache, and Debloat: Optimize, achieving markedly improved load times but there was a bit of trial and [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Using WordPress/Cloudflare I wanted my website webserver to be hit as infrequently as possible and have most of the traffic that visits my site hit Cloudflare and serve as little repeat requests as I possibly can from my end.</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://infinityflame.co.uk/wp-content/uploads/2024/06/Wordpress-Caching.drawio-1.svg"><img loading="lazy" decoding="async" width="471" height="111" src="https://infinityflame.co.uk/wp-content/uploads/2024/06/Wordpress-Caching.drawio-1.svg" alt="Diagram showing the journey from WordPress to end user" class="wp-image-2489"/></a><figcaption class="wp-element-caption">Diagram showing the journey from WordPress to end user</figcaption></figure>



<p class="wp-block-paragraph">I embarked on a journey to enhance my site’s performance significantly by having Cloudflare serve as much of it as possible and although Cloudflare has it&#8217;s disadvantages it&#8217;s generally pretty good as a global point of presence. For WordPress I used plugins W3 Total Cache, and Debloat: Optimize, achieving markedly improved load times but there was a bit of trial and error, these are good caching tools for my site, but only really good for people local to me (because Cloudflare has a global delivery network), so I also stuck Cloudflare at the edge to serve the page.</p>



<p class="wp-block-paragraph">The performance improvement is good, and can be as low as 90ms from what was previously a few seconds (around 1.4-1.6 seconds when served directly from my webserver to a London VPS).</p>



<h3 class="wp-block-heading">Leveraging Cloudflare’s Proxying and Caching</h3>



<p class="wp-block-paragraph">Cloudflare has a pretty good content delivery network (CDN) that offers caching and proxying services. Here’s how I set it up:</p>



<ol class="wp-block-list">
<li>By routing my traffic through Cloudflare’s servers.</li>



<li>In the Cloudflare dashboard, I set a page rule to cache everything with a Time-To-Live (TTL) of one month. This caching strategy means that once a resource is cached, it stays cached for 30 days.</li>



<li>On the free Cloudflare plan the Cache Rules are limited to 10 rules per site. I set my rules to cache the whole site, but exclude any incoming requests with the WordPress Cookie. This would be problematic for any large sites with a lot of logged in users, but I don&#8217;t have any so perfect for me. I also set up a rule to exclude caching some of the Gutenberg plugin build css/js to fix issues with navigation. For anonymous users, the aggressive caching remains in effect, delivering cached content for optimal speed.</li>
</ol>



<figure class="wp-block-image size-full"><a href="https://infinityflame.co.uk/wp-content/uploads/2024/06/Screenshot-2024-06-16-001101.png"><img loading="lazy" decoding="async" width="1909" height="1077" src="https://infinityflame.co.uk/wp-content/uploads/2024/06/Screenshot-2024-06-16-001101.png" alt="Cloudflare Cache Rules dashboard showing an exclusion rule for caching the wordpress plugin gutenberg's navigation" class="wp-image-2491" srcset="https://infinityflame.co.uk/wp-content/uploads/2024/06/Screenshot-2024-06-16-001101.png 1909w, https://infinityflame.co.uk/wp-content/uploads/2024/06/Screenshot-2024-06-16-001101-300x169.png 300w, https://infinityflame.co.uk/wp-content/uploads/2024/06/Screenshot-2024-06-16-001101-768x433.png 768w, https://infinityflame.co.uk/wp-content/uploads/2024/06/Screenshot-2024-06-16-001101-1536x867.png 1536w" sizes="auto, (max-width: 1909px) 100vw, 1909px" /></a><figcaption class="wp-element-caption">Cloudflare Cache Rules dashboard showing an exclusion rule for caching the wordpress plugin Gutenberg&#8217;s navigation</figcaption></figure>



<h2 class="wp-block-heading">Development Mode for Testing</h2>



<p class="wp-block-paragraph">While configuring caching, I tested changes without caching interfering by using Cloudflare’s Development Mode to temporarily bypass the cache so I could see realtime changes when tweaking the W3 Total Cache settings.</p>



<p class="wp-block-paragraph">Once I had everything working, and realised what was broken, I excluded broken plugin files from caching and minification and then enabled the caching on Cloudflares end.</p>



<p class="wp-block-paragraph">Using these two plugins, I would then look at the page source and <code>CF-Cache-Status</code> headers to see the new response speed and lighthouse performance. </p>



<p class="wp-block-paragraph">A common pitfall is to just cache everything, you will probably find you can&#8217;t login or parts of the site don&#8217;t work, so its important to triall and error the site, go through it&#8217;s features and understand what doesn&#8217;t work and needs to be excluded from minification in the CSS and JS, especially for plugin heavy sites.</p>



<h2 class="wp-block-heading">Caching and Performance Optimiziation</h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<h2 class="wp-block-heading">For WordPress Caching I used the plugins W3 Total Cache and Debloat because they were on the plugin store and free, which was all I cared about really.</h2>
</blockquote>



<p class="wp-block-paragraph">Where possible I serve static HTML versions of my pages. This is to reduce PHP execution time and database queries, resulting in faster load times.</p>



<p class="wp-block-paragraph">That was basically all I needed W3 Total Cache for . All of the minification of JavaScript and removal of CSS that wasn&#8217;t used in my themes etc I used Debloat over W3 Total Cache. Although in hindsight W3 maybe could have done this role too.</p>



<p class="wp-block-paragraph">When the site loads and you aren&#8217;t served any caches (<code>Cache MISS </code>etc), you obviously get a lot slower response as the caching and minification is compiled and served, so your time to first byte is abysmal, but after that Cloudflare should have a cached copy to serve in as little as a few miliseconds.</p>



<p class="wp-block-paragraph">It would be extremely better if I removed the advertising code to take some of the compute off the main thread, and all the cookie notice stuff but I won&#8217;t for money reasons sorry.</p>



<p class="wp-block-paragraph">There is always room for improvement.</p>



<p class="wp-block-paragraph">Aidan.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Wireguard, WG-Easy and Nginx Docker Compose File using Traefik</title>
		<link>https://infinityflame.co.uk/projects/wireguard-wg-easy-and-nginx-docker-compose-file-using-traefik/</link>
		
		<dc:creator><![CDATA[Aidan]]></dc:creator>
		<pubDate>Sun, 21 Apr 2024 10:00:00 +0000</pubDate>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[docker-compose]]></category>
		<category><![CDATA[ssl]]></category>
		<category><![CDATA[trafik]]></category>
		<category><![CDATA[wg-easy]]></category>
		<category><![CDATA[wireguard]]></category>
		<guid isPermaLink="false">https://infinityflame.co.uk/?p=2450</guid>

					<description><![CDATA[Run Wireguard, wg-easy and Nginx in a single docker compose file, using Traefik and configure SSL using letsencrypt. This post aims to improve on this wiki post by allowing you to run a website on port 443 rather than wg-easy. Replace your-domain.com and yourpassword10000 and youremail@example.com with your domain, password and email, optionally also change the port for your wg-easy configuration using WG_HOST. You can access the wg-easy admin panel at https://your-domain.com:4748. If you would like to use the Traefik admin UI, uncomment the port 8080 and api. entries. Save as docker-compose.yml and then run the command docker network create [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Run Wireguard, wg-easy and Nginx in a single docker compose file, using Traefik and configure SSL using letsencrypt. This post aims to improve on this <a href="https://github.com/wg-easy/wg-easy/wiki/Using-WireGuard-Easy-with-Traefik-SSL">wiki post </a>by allowing you to run a website on port 443 rather than wg-easy.</p>



<p class="wp-block-paragraph">Replace <code>your-domain.com</code> and <code>yourpassword10000</code> and <code>youremail@example.com</code> with your domain, password and email, optionally also change the port for your wg-easy configuration using <code>WG_HOST</code>. You can access the wg-easy admin panel at <code>https://your-domain.com:4748</code>.</p>



<p class="wp-block-paragraph">If you would like to use the Traefik admin UI, uncomment the port <code>8080 </code>and <code>api.</code> entries.</p>



<p class="wp-block-paragraph">Save as <code>docker-compose.yml </code>and then run the command <code>docker network create traefik_network </code>followed by <code>docker compose up -d</code>. This will make the nginx folder to place your website files in as required.</p>



<pre class="wp-block-code alignwide scroll ticss-6597a255 has-x-small-font-size"><code>services:
  wg-easy:
    labels:
      # traefik
      - "traefik.enable=true"
      - "traefik.http.services.WireGuardService.loadbalancer.server.port=51821"
      # http to https
      - "traefik.http.routers.WireGuardRoute.service=WireGuardService"
      # https
      - "traefik.http.routers.WireGuardRouteSSL.service=WireGuardService"
      - "traefik.http.routers.WireGuardRouteSSL.rule=Host(`your-domain.com`)"
      - "traefik.http.routers.WireGuardRouteSSL.entrypoints=wireguardWGEasyPanel"
      - "traefik.http.routers.WireGuardRouteSSL.tls.certresolver=MainCertResolver"
    environment:
      - WG_HOST=your-domain.com
      - PASSWORD=yourpassword10000
      - UI_TRAFFIC_STATS=true
      - WG_HOST=4748

    container_name: wg-easy
    image: ghcr.io/wg-easy/wg-easy
    networks:
      - traefik_network
    volumes:
      - .:/etc/wireguard
    ports:
      - "51820:51820/udp"
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1

  nginx:
    image: nginx:latest
    restart: unless-stopped
    labels:
      # traefik
      - traefik.enable=true
      - traefik.http.routers.nginx.rule=Host(`your-domain.com`)
      - traefik.http.routers.nginx.entrypoints=websecure
      - traefik.http.routers.nginx.tls=true
      - traefik.http.routers.nginx.tls.certresolver=MainCertResolver
    networks:
      - traefik_network
    volumes:
      - ./nginx:/usr/share/nginx/html/:ro

  traefik:
    image: traefik:latest
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - traefik_letsencrypt_data:/letsencrypt
    networks:
      - traefik_network
    ports:
      - "80:80"
      - "443:443"
      - "4748:4748"
      # - "8080:8080"
    command:
      - "--providers.docker"
      - "--providers.docker=true"
      # - "--api.dashboard=true"
      # - "--api.insecure=true"
      - "--providers.docker.exposedbydefault=false"
      - "--providers.docker.network=traefik_network"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.web.http.redirections.entryPoint.to=websecure"
      - "--entrypoints.web.http.redirections.entryPoint.scheme=https"
      - "--entrypoints.web.http.redirections.entrypoint.permanent=true"
      - "--entrypoints.wireguardWGEasyPanel.address=:4748"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.MainCertResolver.acme.tlschallenge=true"
      - "--certificatesresolvers.MainCertResolver.acme.email=youremail@example.com"
      - "--certificatesresolvers.MainCertResolver.acme.storage=/letsencrypt/acme.json"
      # - "--log.level=DEBUG"

networks:
  traefik_network:
    external: true

volumes:
  traefik_letsencrypt_data:
</code></pre>



<p class="wp-block-paragraph">You may also want to limit the administration portal to just IP whitelisted addresses, you can do this by adding the following to the wg-easy labels, replacing 1.2.3.4 with your IP address and adding any other required addresses using a comma to separate. You could also whitelist clients inside your container by adding the network range.</p>



<pre class="wp-block-code alignwide scroll ticss-8a183c65 has-x-small-font-size"><code>      - "traefik.http.middlewares.my-ipwhitelist.ipallowlist.sourcerange=1.2.3.4"
      - "traefik.http.routers.WireGuardRouteSSL.middlewares=my-ipwhitelist@docker"</code></pre>



<p class="wp-block-paragraph">Please feel free to use this post under the terms of the original licence <a href="https://github.com/wg-easy/wg-easy/blob/master/LICENSE">which you can access here</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Buying 16TB Seagate Exos X16 from Amazon for £188.90</title>
		<link>https://infinityflame.co.uk/featured/seagate-exos-x16-st16000nm001g-2kk103-amazon/</link>
					<comments>https://infinityflame.co.uk/featured/seagate-exos-x16-st16000nm001g-2kk103-amazon/#comments</comments>
		
		<dc:creator><![CDATA[Aidan]]></dc:creator>
		<pubDate>Fri, 08 Mar 2024 16:00:00 +0000</pubDate>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[hard drive]]></category>
		<category><![CDATA[harddrive]]></category>
		<category><![CDATA[platter]]></category>
		<category><![CDATA[seagate]]></category>
		<category><![CDATA[Storage]]></category>
		<guid isPermaLink="false">https://infinityflame.co.uk/?p=2432</guid>

					<description><![CDATA[I recently purchased a Seagate Exos X16 from Amazon. To be specific it was this one for £188.90. I was cautious that the vendor was not Seagate and was a third party seller for a reduced rate, so I thought it best to check the smart values and serial number after it arrived as usually this means the drive is of questionable origin. At this price point I knew I was taking a bit of a gamble (and S.M.A.R.T data can be overwritten I think) but the data would hopefully provide some insight into what I had actually purchased. £188.90 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I recently purchased a Seagate Exos X16 from Amazon. To be specific it was <a href="https://www.amazon.co.uk/dp/B07XM9RM95">this one</a> for £188.90. I was cautious that the vendor was not Seagate and was a <a href="https://www.amazon.co.uk/s?me=A3KPMMGSC0W1F2&amp;marketplaceID=A1F83G8C2ARO7P">third party seller</a> for a reduced rate, so I thought it best to check the smart values and serial number after it arrived as usually this means the drive is of questionable origin.</p>



<p class="wp-block-paragraph">At this price point I knew I was taking a bit of a gamble (and S.M.A.R.T data can be overwritten I think) but the data would hopefully provide some insight into what I had actually purchased. £188.90 is significantly below the £214 buy box, but it is not impossible that the drive didn&#8217;t come from Seagate as sold.</p>



<p class="wp-block-paragraph">When it arrived I took a photo. Packing was clearly custom and the ESD bag was not OEM. Oh well, lets see what <code>smartctl</code> says.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://infinityflame.co.uk/wp-content/uploads/2024/03/IMG20240308144407-scaled.jpg"><img loading="lazy" decoding="async" width="1925" height="2560" data-id="2434" src="https://infinityflame.co.uk/wp-content/uploads/2024/03/IMG20240308144407-scaled.jpg" alt="Seagate Exos X16 in ESD bag and foam package ST16000NM001G-2KK103" class="wp-image-2434" srcset="https://infinityflame.co.uk/wp-content/uploads/2024/03/IMG20240308144407-scaled.jpg 1925w, https://infinityflame.co.uk/wp-content/uploads/2024/03/IMG20240308144407-226x300.jpg 226w, https://infinityflame.co.uk/wp-content/uploads/2024/03/IMG20240308144407-768x1021.jpg 768w, https://infinityflame.co.uk/wp-content/uploads/2024/03/IMG20240308144407-1155x1536.jpg 1155w, https://infinityflame.co.uk/wp-content/uploads/2024/03/IMG20240308144407-1540x2048.jpg 1540w" sizes="auto, (max-width: 1925px) 100vw, 1925px" /></a></figure>



<figure class="wp-block-image size-full"><a href="https://infinityflame.co.uk/wp-content/uploads/2024/03/IMG20240308143437-scaled.jpg"><img loading="lazy" decoding="async" width="2560" height="1925" data-id="2435" src="https://infinityflame.co.uk/wp-content/uploads/2024/03/IMG20240308143437-scaled.jpg" alt="Seagate Exos X16 as delivered by Amazon" class="wp-image-2435" srcset="https://infinityflame.co.uk/wp-content/uploads/2024/03/IMG20240308143437-scaled.jpg 2560w, https://infinityflame.co.uk/wp-content/uploads/2024/03/IMG20240308143437-300x226.jpg 300w, https://infinityflame.co.uk/wp-content/uploads/2024/03/IMG20240308143437-768x578.jpg 768w, https://infinityflame.co.uk/wp-content/uploads/2024/03/IMG20240308143437-1536x1155.jpg 1536w, https://infinityflame.co.uk/wp-content/uploads/2024/03/IMG20240308143437-2048x1540.jpg 2048w" sizes="auto, (max-width: 2560px) 100vw, 2560px" /></a></figure>
<figcaption class="blocks-gallery-caption wp-element-caption">Seagate Exos X16 as delivered by Amazon seller &#8220;HAPPY HOME EASY LIFE LTD&#8221;</figcaption></figure>



<p class="wp-block-paragraph">Running the disk drive through Seagates warranty checker, the drive is likely from one of their storage appliances. This makes warranty replacement not possible except when done through the Amazon seller&#8217;s original equipment.</p>



<p class="wp-block-paragraph"></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="652" height="715" src="https://infinityflame.co.uk/wp-content/uploads/2024/03/Screenshot-2024-03-08-144501.png" alt="" class="wp-image-2438" srcset="https://infinityflame.co.uk/wp-content/uploads/2024/03/Screenshot-2024-03-08-144501.png 652w, https://infinityflame.co.uk/wp-content/uploads/2024/03/Screenshot-2024-03-08-144501-274x300.png 274w" sizes="auto, (max-width: 652px) 100vw, 652px" /></figure>



<p class="wp-block-paragraph">I also plugged the drive into my Proxmox NAS to see if the drive had been running at all and given the S.M.A.R.T attribute (240 0xF0 &#8220;Head Flying Hours&#8221;) it looks like the drive has never been started as it has only been up about the time it took me to run the command after connecting the drive.</p>



<pre class="wp-block-code alignwide"><code>root@proxmox.lan:~# smartctl -a /dev/sdc<br>smartctl 7.2 2020-12-30 r5155 &#91;x86_64-linux-5.15.136-1-pve] (local build)<br>Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org<br><br>=== START OF INFORMATION SECTION ===<br>Model Family:     Seagate Exos X16<br>Device Model:     ST16000NM001G-2KK103<br>Serial Number:    ZL2EPPX1<br>LU WWN Device Id: 5 000c50 0c9385ca4<br>Firmware Version: SN03<br>User Capacity:    16,000,900,661,248 bytes &#91;16.0 TB]<br>Sector Sizes:     512 bytes logical, 4096 bytes physical<br>Rotation Rate:    7200 rpm<br>Form Factor:      3.5 inches<br>Device is:        In smartctl database &#91;for details use: -P show]<br>ATA Version is:   ACS-4 (minor revision not indicated)<br>SATA Version is:  SATA 3.3, 6.0 Gb/s (current: 6.0 Gb/s)<br>Local Time is:    Fri Mar  8 14:55:15 2024 GMT<br>SMART support is: Available - device has SMART capability.<br>SMART support is: Enabled<br><br>=== START OF READ SMART DATA SECTION ===<br>SMART overall-health self-assessment test result: PASSED<br><br>General SMART Values:<br>Offline data collection status:  (0x82) Offline data collection activity<br>                                        was completed without error.<br>                                        Auto Offline Data Collection: Enabled.<br>Self-test execution status:      (   0) The previous self-test routine completed<br>                                        without error or no self-test has ever <br>                                        been run.<br>Total time to complete Offline <br>data collection:                (  575) seconds.<br>Offline data collection<br>capabilities:                    (0x7b) SMART execute Offline immediate.<br>                                        Auto Offline data collection on/off support.<br>                                        Suspend Offline collection upon new<br>                                        command.<br>                                        Offline surface scan supported.<br>                                        Self-test supported.<br>                                        Conveyance Self-test supported.<br>                                        Selective Self-test supported.<br>SMART capabilities:            (0x0003) Saves SMART data before entering<br>                                        power-saving mode.<br>                                        Supports SMART auto save timer.<br>Error logging capability:        (0x01) Error logging supported.<br>                                        General Purpose Logging supported.<br>Short self-test routine <br>recommended polling time:        (   1) minutes.<br>Extended self-test routine<br>recommended polling time:        (1485) minutes.<br>Conveyance self-test routine<br>recommended polling time:        (   2) minutes.<br>SCT capabilities:              (0x70bd) SCT Status supported.<br>                                        SCT Error Recovery Control supported.<br>                                        SCT Feature Control supported.<br>                                        SCT Data Table supported.<br><br>SMART Attributes Data Structure revision number: 10<br>Vendor Specific SMART Attributes with Thresholds:<br>ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE<br>  1 Raw_Read_Error_Rate     0x000f   100   100   044    Pre-fail  Always       -       2624<br>  3 Spin_Up_Time            0x0003   099   099   000    Pre-fail  Always       -       0<br>  4 Start_Stop_Count        0x0032   100   100   020    Old_age   Always       -       1<br>  5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail  Always       -       0<br>  7 Seek_Error_Rate         0x000f   100   253   045    Pre-fail  Always       -       447<br>  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       0<br> 10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0<br> 12 Power_Cycle_Count       0x0032   100   100   020    Old_age   Always       -       1<br> 18 Head_Health             0x000b   100   100   050    Pre-fail  Always       -       0<br>187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0<br>188 Command_Timeout         0x0032   100   253   000    Old_age   Always       -       0<br>190 Airflow_Temperature_Cel 0x0022   078   063   040    Old_age   Always       -       22 (Min/Max 21/22)<br>192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       0<br>193 Load_Cycle_Count        0x0032   100   100   000    Old_age   Always       -       1<br>194 Temperature_Celsius     0x0022   022   040   000    Old_age   Always       -       22 (0 21 0 0 0)<br>197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0<br>198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       0<br>199 UDMA_CRC_Error_Count    0x003e   200   253   000    Old_age   Always       -       0<br>200 Pressure_Limit          0x0023   100   100   001    Pre-fail  Always       -       0<br>240 Head_Flying_Hours       0x0000   100   253   000    Old_age   Offline      -       0h+01m+14.651s<br>241 Total_LBAs_Written      0x0000   100   253   000    Old_age   Offline      -       0<br>242 Total_LBAs_Read         0x0000   100   253   000    Old_age   Offline      -       2624<br><br>SMART Error Log Version: 1<br>No Errors Logged<br><br>SMART Self-test log structure revision number 1<br>No self-tests have been logged.  &#91;To run self-tests, use: smartctl -t]<br><br>SMART Selective self-test log data structure revision number 1<br> SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS<br>    1        0        0  Not_testing<br>    2        0        0  Not_testing<br>    3        0        0  Not_testing<br>    4        0        0  Not_testing<br>    5        0        0  Not_testing<br>Selective self-test flags (0x0):<br>  After scanning selected spans, do NOT read-scan remainder of disk.<br>If Selective self-test is pending on power-up, resume after 0 minute delay.<br><br>root@proxmox.lan:~# </code></pre>



<p class="wp-block-paragraph">Based on this I was sold a 5 year warranty but I am not able to claim it should something happen to the drive. As I only use it for infrequent backup I will take on the risk.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://infinityflame.co.uk/featured/seagate-exos-x16-st16000nm001g-2kk103-amazon/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Running SQL Server 2022 Database in Docker using Docker Compose</title>
		<link>https://infinityflame.co.uk/featured/running-sql-server-2022-database-in-docker-using-docker-compose/</link>
		
		<dc:creator><![CDATA[Aidan]]></dc:creator>
		<pubDate>Mon, 15 Jan 2024 20:23:19 +0000</pubDate>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[2022]]></category>
		<category><![CDATA[containers]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[sql server management studio]]></category>
		<category><![CDATA[sql-server]]></category>
		<guid isPermaLink="false">https://infinityflame.co.uk/?p=2414</guid>

					<description><![CDATA[You can use docker compose to deploy and manage a Microsoft SQL Server 2022 (or older) database using the Microsoft Artefact Registry (their container registry) and any suitable docker installation. I am by no means an expert at docker so consider this a leading learner article to get you started rather than something that could be considered best practice. This is my process to developing a database that can run as highly available infrastructure. Running Microsoft SQL Server in Docker on Windows If you are running the database on a windows machine, make sure to start WSL using the command [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">You can use docker compose to deploy and manage a Microsoft SQL Server 2022 (or older) database using the Microsoft Artefact Registry (their container registry) and any suitable docker installation.</p>



<p class="wp-block-paragraph">I am by no means an expert at docker so consider this a leading learner article to get you started rather than something that could be considered best practice. This is my process to developing a database that can run as highly available infrastructure.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69f6eba78aca8&quot;}" data-wp-interactive="core/image" data-wp-key="69f6eba78aca8" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="1920" height="1200" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://infinityflame.co.uk/wp-content/uploads/2024/01/Screenshot-2024-01-15-202548.png" alt="SQL Server Management Studio showing SQL Server 2022 running the database agent and new database dialog boxes." class="wp-image-2424" srcset="https://infinityflame.co.uk/wp-content/uploads/2024/01/Screenshot-2024-01-15-202548.png 1920w, https://infinityflame.co.uk/wp-content/uploads/2024/01/Screenshot-2024-01-15-202548-300x188.png 300w, https://infinityflame.co.uk/wp-content/uploads/2024/01/Screenshot-2024-01-15-202548-768x480.png 768w, https://infinityflame.co.uk/wp-content/uploads/2024/01/Screenshot-2024-01-15-202548-1536x960.png 1536w" sizes="auto, (max-width: 1920px) 100vw, 1920px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">SSMS connected to SQL Server running in docker</figcaption></figure>



<h2 class="wp-block-heading">Running Microsoft SQL Server in Docker on Windows</h2>



<p class="wp-block-paragraph">If you are running the database on a windows machine, make sure to start WSL using the command line and move your project (or volumes) inside your WSL installation.</p>



<p class="wp-block-paragraph">I&#8217;ve opted for Ubuntu however any Linux distribution is applicable. For best performance you probably would want to run the database on a host directly to avoid any abstraction bottlenecks.</p>



<p class="wp-block-paragraph">Running the database inside the WSL installation ensures that the mounted volumes are native to the Linux installation and the WSL files aren&#8217;t on the windows file system and translated on the fly.</p>



<h2 class="wp-block-heading">Docker Compose for Microsoft SQL Server 2022</h2>



<p class="wp-block-paragraph">Here is the minimal docker compose file I created for the database. It uses mounts for the database files and a dockerfile to set the permissions. For this installation I did some experimentation with High Availability and it will work with this setup however some additional configuration would be required beyond this compose file to deploy a highly available cluster for redundant DNS. I have also enabled the agent to use scheduling however you may need to pick a licence for your use case using <a href="https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-configure-environment-variables?view=sql-server-ver16">MSSQL_PID</a>.</p>



<p class="wp-block-paragraph">I&#8217;ve also included watchtower to automatically upgrade the database however you may want to remove it if you do not require automatic updating or need a higher uptime.</p>



<pre class="wp-block-code"><code>name: msssql-docker<br>services:<br>    database-server:<br>        build:<br>            context: .<br>            dockerfile: dockerfile<br>        environment:<br>            - ACCEPT_EULA=Y<br>            - MSSQL_SA_PASSWORD={$MSSQL_SA_PASSWORD}<br>            - MSSQL_ENABLE_HADR=1<br>            - MSSQL_TCP_PORT=1433<br>            - MSSQL_AGENT_ENABLED=true<br>            - MSSQL_DATA_DIR=/var/opt/mssql/data<br>            - MSSQL_DUMP_DIR=/var/opt/mssql/dump<br>            - MSSQL_LOG_DIR=/var/opt/mssql/log_data<br>            - MSSQL_BACKUP_DIR=/var/opt/mssql/backup_data<br>            - MSSQL_ERROR_LOG_FILE=/var/opt/mssql/log/errorlog<br>        ports:<br>            - 1433:1433<br>        restart: unless-stopped<br>        image: mcr.microsoft.com/mssql/server:2022-latest<br>        volumes:<br>            - ./data:/var/opt/mssql/data<br>            - ./log_data:/var/opt/mssql/log_data<br>            - ./backup_data:/var/opt/mssql/backup_data<br>            - ./dump:/var/opt/mssql/dump<br>            - ./secrets:/var/opt/mssql/secrets<br>            - ./logs:/var/opt/mssql/log<br>    watchtower:<br>        image: containrrr/watchtower<br>        volumes:<br>            - /var/run/docker.sock:/var/run/docker.sock<br>volumes:<br>  data:<br>  log_data:<br>  backup_data:<br>  dump:<br>  secrets:<br>  logs:</code></pre>



<p class="wp-block-paragraph">And here is the dockerfile.</p>



<pre class="wp-block-code"><code># Use latest windows 2022 image<br>FROM mcr.microsoft.com/mssql/server:2022-latest<br><br># Switch to root for chown<br>USER root <br><br># set permissions on directories<br>RUN chown -R mssql:mssql /var/opt/mssql<br> <br># switching to the mssql user<br>USER mssql</code></pre>



<p class="wp-block-paragraph">And here is the .env file for the docker secret (the SA password). In future I will use active directory authentication but this should do for testing.</p>



<pre class="wp-block-code"><code>MSSQL_SA_PASSWORD=Badpassword1#</code></pre>



<h2 class="wp-block-heading">Directory Structure in the SQL Server container</h2>



<p class="wp-block-paragraph">I have laid out my directory structure as follows, if you deploy the docker container yourself it will make the directories (and the files) for you. You need only the <code>.env</code> , <code>docker-compose.yml </code>and <code>dockerfile</code>. Docker will handle the rest.</p>



<pre class="wp-block-code"><code>C:\Users\Aidan\Documents\mssql-docker&gt;tree /f<br>...<br>│   .env<br>│   docker-compose.yml<br>│   dockerfile<br>│<br>├───backup_data<br>│       test.bak<br>|<br>├───data<br>│       Entropy.bin<br>│       master.mdf<br>│       mastlog.ldf<br>│       model.mdf<br>│       modellog.ldf<br>│       model_msdbdata.mdf<br>│       model_msdblog.ldf<br>│       model_replicatedmaster.ldf<br>│       model_replicatedmaster.mdf<br>│       msdbdata.mdf<br>│       msdblog.ldf<br>│       tempdb.mdf<br>│       tempdb2.ndf<br>│       tempdb3.ndf<br>│       tempdb4.ndf<br>│       templog.ldf<br>│       exampledatabase.mdf<br>│<br>├───dump<br>├───logs<br>│       agent_log.log<br>|       ...<br>|<br>├───log_data<br>│       exampledatabase_log.ldf<br>│<br>└───secrets<br>        machine-key<br><br>C:\Users\Aidan\Documents\mssql-docker&gt;</code></pre>



<p class="wp-block-paragraph">Once your container database is up you will still need to make the database using SQL Server Management Studio or interact with the database using SQLCMD for your application.</p>



<h2 class="wp-block-heading">Caveats using this method</h2>



<ul class="wp-block-list">
<li>Using containers adds a layer of abstraction which may affect performance, this seems to be most notable on windows where the filesystem doesn&#8217;t run in WSL&#8217;s filesystem.</li>



<li>The volumes are managed by docker so using faster disk may be difficult (or easier) depending on usecase.</li>



<li>You have to pay for an MSSQL licence.</li>



<li>You should put your backups on a different media than your data, which this currently doesn&#8217;t do.</li>



<li>There is some additional setup with replication that doesn&#8217;t seem to be present on a standard windows installation of SQL Server 2022.</li>
</ul>



<p class="wp-block-paragraph">Thanks for reading, have fun. </p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 
Lazy Loading (feed)
Database Caching using Disk

Served from: infinityflame.co.uk @ 2026-05-03 06:31:03 by W3 Total Cache
-->