{"id":511,"date":"2024-06-29T12:33:35","date_gmt":"2024-06-29T11:33:35","guid":{"rendered":"http:\/\/10.1.7.2:9701\/?p=511"},"modified":"2025-06-18T02:51:18","modified_gmt":"2025-06-18T01:51:18","slug":"at-a-decent-ground-with-my-home-lab","status":"publish","type":"post","link":"https:\/\/davidsula.com\/index.php\/511\/at-a-decent-ground-with-my-home-lab\/","title":{"rendered":"At a decent ground with my home-lab."},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In recent time, I went through the process of completely revamping my home-lab from scratch. I ditched the old Dell PowerEdge R720xd and settled for an R720 just because I didn\u2019t need all those 2.5 inch drive slots that the R720xd had to offer.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full has-custom-border is-style-default\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"http:\/\/10.1.7.102\/wp-content\/uploads\/2024\/06\/image-11.webp\" alt=\"\" class=\"has-border-color has-foreground-border-color wp-image-828\" style=\"border-width:2px;box-shadow:var(--wp--preset--shadow--shadow-2)\" srcset=\"https:\/\/davidsula.com\/wp-content\/uploads\/2024\/06\/image-11.webp 1024w, https:\/\/davidsula.com\/wp-content\/uploads\/2024\/06\/image-11-300x169.webp 300w, https:\/\/davidsula.com\/wp-content\/uploads\/2024\/06\/image-11-768x432.webp 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\"><sup>The Dell PowerEdge R720<\/sup><\/figcaption><\/figure>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">I also, with the help of my father, managed to pull an ethernet cable across the house &#8211; from my router to my server. This way I now get a nice speed of 900mbps<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Now here is where the <span id=\"fluctuating-word\">fun<\/span> part comes in.<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">IT Mode Crossflashing<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">I started off with having to flash my new perc card to IT mode. Already getting thrown into the deep end. This process took me several tries because in the first two attempts I ignored the instruction to &#8216;remove the raid battery&#8217; from the perc card in the <a href=\"https:\/\/fohdeesha.com\/docs\/perc.html\">tutorial<\/a> I was following.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Even after following the tutorial correctly, it took me multiple tries before it finally decided to work. I never changed my process in these attempts, it just worked eventually so I refuse to touch it any further.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">This took me about two days. After this, I set up Proxmox booting off a 3TB HDD.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Setting up remote access<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Since I&#8217;d want to spend time here and there whilst I&#8217;m away at school working on my home-lab projects, I started off my setting up my pfSense VM. This way all VMs I&#8217;d make from there on could be put on my pfSense network, and I could set up an OpenVPN server on pfSense to remotely access my Proxmox from anywhere when I feel the need to carry on with my projects.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">One big long-lasting issue I came across was that my laptop and phone would randomly disconnect from my OpenVPN server. I started off convinced that the school Wi-Fi had somehow managed to block me from using OpenVPN to remote into my home network and access my home-lab, but it turned out to be a setting in the configuration. Apparently there are two separate settings for concurrent connections to the VPN server. One is how many concurrent connections to allow, and another is how many concurrent connections to allow from the same user. Unfortunately I had only configured concurrent connections overall, and not those from the same user, so whenever I&#8217;d turn on my laptop in school my VPN would go ham because there were two concurrent connections from the same user.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">That part took me about a week to figure out because I was so convinced that it was the school Wi-Fi, having only experienced the issue whilst I was in school because that&#8217;s where I use my laptop. Before finding the actual fix, I even changed my subnet from 10.1.1.0\/24 to 10.1.7.0\/24 thinking that conflicting subnets with the school&#8217;s may be an issue (it was a stupid blog post I read online and I decided to give it a try). At the end of the day, I made the change in the configuration and have not had issues since.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">My pfSense now runs stable on 2 CPUs, with 4GB of RAM and a 32GB boot disk size.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">MySQL<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">I decided that this time, instead of having a MySQL host for each app I host, I will have one database host to manage all of my databases on. What I mean by this is that, before I made this restart in my home-lab, I used to have docker containers from stacks like &#8216;wordpress-wordpress&#8217;, accompanied with &#8216;wordpress-db&#8217;, and I&#8217;d also have a separate database host for my pterodactyl panel. This time I decided to make a separate Proxmox VM dedicated to MySQL. This way I can have all my databases in one spot.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">This came with huge advantages.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"has-small-font-size\">I no longer had to make loads of separate SQL databases.<\/li>\n\n\n\n<li class=\"has-small-font-size\">and best of all, I could use HeidiSQL to access all my databases within one spot with ease.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full has-custom-border\"><img loading=\"lazy\" decoding=\"async\" width=\"972\" height=\"631\" src=\"http:\/\/10.1.7.102\/wp-content\/uploads\/2024\/06\/image-12.png\" alt=\"\" class=\"has-border-color has-foreground-border-color wp-image-829\" style=\"border-width:2px;box-shadow:12px 12px 50px rgba(0, 0, 0, 0.4)\" srcset=\"https:\/\/davidsula.com\/wp-content\/uploads\/2024\/06\/image-12.png 972w, https:\/\/davidsula.com\/wp-content\/uploads\/2024\/06\/image-12-300x195.png 300w, https:\/\/davidsula.com\/wp-content\/uploads\/2024\/06\/image-12-768x499.png 768w\" sizes=\"auto, (max-width: 972px) 100vw, 972px\" \/><\/figure>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">I run this VM with the same allocated hardware as pfSense, that being on 2 CPUs, with 4GB of RAM and a 32GB boot disk size. Looking at how the usage has been so far, I would likely be able to lower this to 1 CPU, but I will not for now just because I still have a lot of spare logical processors and don&#8217;t feel the need to.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"docker\">Docker<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">As I had done before, I made a Proxmox VM on which I primarily run docker. This way I host all my lightweight apps in quick succession. With docker, I can just find a container with the app I want, and deploy it immediately.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">I installed docker through a couple of quick commands, and then immediately deployed Portainer through another quick command.<\/p>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary><font size=\"3\">The commands; these can be copy and pasted into ubuntu from a fresh VM creation and it will get you Docker with Portainer installed.<\/font><\/summary>\n<pre class=\"wp-block-code\"><code>sudo apt update\n\nsudo apt install docker.io\n\nsudo systemctl enable docker\n\nsudo systemctl start docker\n\n<strong><em>Paste this all at once:<\/em><\/strong>\nsudo docker run -d \\\n--name=\"portainer\" \\\n--restart on-failure \\\n-p 9000:9000 \\\n-p 8000:8000 \\\n-v \/var\/run\/docker.sock:\/var\/run\/docker.sock \\\n-v portainer_data:\/data \\\nportainer\/portainer-ce:latest<\/code><\/pre>\n<\/details>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Now, I have a sleek UI through which I can quickly deploy containers.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"513\" src=\"http:\/\/10.1.7.102\/wp-content\/uploads\/2024\/06\/image-13.png\" alt=\"\" class=\"wp-image-831\" style=\"box-shadow:12px 12px 50px rgba(0, 0, 0, 0.4)\" srcset=\"https:\/\/davidsula.com\/wp-content\/uploads\/2024\/06\/image-13.png 1024w, https:\/\/davidsula.com\/wp-content\/uploads\/2024\/06\/image-13-300x150.png 300w, https:\/\/davidsula.com\/wp-content\/uploads\/2024\/06\/image-13-768x385.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">SWAG<\/h4>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">The first docker container I deployed was <a href=\"https:\/\/github.com\/linuxserver\/docker-swag\">SWAG<\/a>, which is an easy-to-use reverse-proxying image which consists of an nginx webserver, reverse-proxy, and Let&#8217;s-Encrypt client. In summary, all information received to my domain, for example, a person simply visiting <a href=\"https:\/\/www.dsla.co.uk\" title=\"\">www.dsla.co.uk<\/a>, will go through SWAG, which will then decide where to send the information to depending on the subdomain (e.g. www.). Hence, everytime somebody visits <a href=\"https:\/\/www.dsla.co.uk\" title=\"\">www.dsla.co.uk<\/a>, this goes through SWAG which then sees that the subdomain chosen (www.) is associated with WordPress, and forwards the information to there.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Cloudflare-DDNS<\/h4>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">The next docker container I set up was <a href=\"https:\/\/hub.docker.com\/r\/oznu\/cloudflare-ddns\">Cloudflare-DDNS<\/a>, because I have a Dynamic IP. What this container does is monitor whenever my IP address changes, and updates it on Cloudflare through their API.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">WordPress<\/h4>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><a href=\"https:\/\/hub.docker.com\/_\/wordpress\">WordPress<\/a> is what you are seeing now. This is the software I use to run my blog website. In the documentation, this typically comes as a stack on docker, meaning that it deploys with a MySQL container to accompany it. This is how I ran WordPress on my last server. However, this time I have already made my own separate MySQL dedicated VM, so I just typed the IP of that database host in the &#8220;DB_HOST&#8221; environment variable whilst setting up WordPress. I did also have to create a WordPress user and WordPress database on the MySQL host, which WordPress could log into in order to access its own database. I use SWAG to reverse-proxy to WordPress recognising (www.) as its subdomain.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">VaultWarden<\/h4>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><a href=\"https:\/\/hub.docker.com\/r\/vaultwarden\/server\" data-type=\"page\" data-id=\"2\">Vaultwarden<\/a> has by far been one of my most convenient docker containers. It is a substitute for <a href=\"https:\/\/www.dashlane.com\/\">Dashlane<\/a>, which is a password manager that I used to pay for. What it does is securely store all my passwords, as well as generate random secure passwords for most websites I use, and auto-fills them when I visit a login page on that website.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Flame<\/h4>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">On my last server, I used to use <a href=\"https:\/\/hub.docker.com\/r\/linuxserver\/heimdall\">Heimdall<\/a> as a customised home page for all my applications, however as of now I&#8217;ve started using <a href=\"https:\/\/hub.docker.com\/r\/pawelmalak\/flame\">Flame<\/a> as it looks so much more sleek and has other features such as weather. Although the container hasn&#8217;t been updated for almost a year, it is still very good, and certainly better than Heimdall.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">In my Google Chrome, I also went to &#8220;Settings &gt; Appearance &gt; Home Button&#8221; and setup a Home button in the top left of my Chrome which leads to my Flame. Here is what that looks like:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"450\" src=\"http:\/\/10.1.7.102\/wp-content\/uploads\/2024\/06\/Replay2024-06-2913-25-11-Trim-ezgif.com-speed-1-1.gif\" alt=\"\" class=\"wp-image-832\" style=\"box-shadow:12px 12px 50px rgba(0, 0, 0, 0.4);width:960px;height:auto\"\/><figcaption class=\"wp-element-caption\"><sup>This is me going from DSLA, to Flame through the home button, to the DSLA home page from Flame. You can also see it shows an outside temperature of 19.2 degrees celsius with a cloud coverage of 0%. I have all of my applications on Flame, as well as a couple of bookmarks underneath like YouTube.<\/sup><\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">That is all there is to show for docker so far. The VM consisting of docker runs on 8 CPUs with 48GB of RAM and a bootdisk size of 384GB (Pretty overkill, but I have a lot to spare so why not).<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"471\" src=\"http:\/\/10.1.7.102\/wp-content\/uploads\/2024\/06\/image-15.png\" alt=\"\" class=\"wp-image-833\" style=\"box-shadow:12px 12px 50px rgba(0, 0, 0, 0.4)\" srcset=\"https:\/\/davidsula.com\/wp-content\/uploads\/2024\/06\/image-15.png 1024w, https:\/\/davidsula.com\/wp-content\/uploads\/2024\/06\/image-15-300x138.png 300w, https:\/\/davidsula.com\/wp-content\/uploads\/2024\/06\/image-15-768x353.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Mailcow<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">The final VM I set up for now is <a href=\"https:\/\/docs.mailcow.email\/\">Mailcow<\/a>.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Mailcow is a software used for self-hosting a mail server. This is what I use to self-host my personal mailbox at support@dsla.co.uk. It takes a while to setup, I couldn&#8217;t tell you how I got it running as I just partially followed a tutorial whilst having to improvise. It was a long process, but it works really well now, it comes with a neat UI, and integration with the Mail app on the IPhone.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">I can also filter E-Mails to specific folders depending on keywords. Junk filtering is more difficult, I still haven&#8217;t fully figured out that part.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">I run this on a Proxmox VM with 4 CPUs and 8GB of RAM.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion and Next Steps<\/h2>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">That pretty much sums up my new server setup so far, I have all but one main part set up. I&#8217;m still waiting on getting two more 3TB Hard Drives before I can get my <a href=\"https:\/\/www.truenas.com\/\">TrueNAS<\/a> setup. After I setup TrueNAS, I&#8217;m looking to setup a <a href=\"https:\/\/pterodactyl.io\/\">Pterodactyl Panel<\/a> like I had done before, for whenever I want to run and game servers.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In recent time, I went through the process of completely revamping my home-lab from scratch. Here&#8217;s how it went.<\/p>\n","protected":false},"author":1,"featured_media":855,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-511","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blogs"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/davidsula.com\/index.php\/wp-json\/wp\/v2\/posts\/511","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/davidsula.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/davidsula.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/davidsula.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/davidsula.com\/index.php\/wp-json\/wp\/v2\/comments?post=511"}],"version-history":[{"count":1,"href":"https:\/\/davidsula.com\/index.php\/wp-json\/wp\/v2\/posts\/511\/revisions"}],"predecessor-version":[{"id":834,"href":"https:\/\/davidsula.com\/index.php\/wp-json\/wp\/v2\/posts\/511\/revisions\/834"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/davidsula.com\/index.php\/wp-json\/wp\/v2\/media\/855"}],"wp:attachment":[{"href":"https:\/\/davidsula.com\/index.php\/wp-json\/wp\/v2\/media?parent=511"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/davidsula.com\/index.php\/wp-json\/wp\/v2\/categories?post=511"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/davidsula.com\/index.php\/wp-json\/wp\/v2\/tags?post=511"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}