<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
	<title>David&#39;s Webpage</title>
	<link>https://davidvogel.xyz/</link>
	<description>Recent content on David&#39;s Webpage</description>
	<generator>Hugo -- gohugo.io</generator>
	<language>en-us</language>
	<lastBuildDate>Thu, 30 Nov 2023 22:24:38 -0500</lastBuildDate>
    
        <atom:link href="https://davidvogel.xyz/index.xml" rel="self" type="application/rss+xml" />
	
	
	<item>
		<title>Getting Rusty</title>
		<link>https://davidvogel.xyz/home-lab/other/rust/</link>
		<pubDate>Thu, 30 Nov 2023 22:24:38 -0500</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/other/rust/</guid>
		<description>



&lt;p&gt;This article was written in 2024, looking back at my previous &lt;a href=&#34;https://davidvogel.xyz/home-lab/&#34;&gt;home lab projects&lt;/a&gt; and where my journey into IT began.&lt;/p&gt;




&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/&#34; id=&#34;tag_other&#34;&gt;Other Projects&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/rust-banner.png&#34; alt=&#34;Rust banner&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;This article tells the story of how I found Rust, the true &amp;ldquo;first programming language&amp;rdquo; that I chose to learn. As I made progress reading through &amp;ldquo;The Book&amp;rdquo;, I created a Git project called &lt;a href=&#34;https://github.com/DavidVogelxyz/fibonacci&#34;&gt;fibonacci&lt;/a&gt;, a CLI program that calculates the &amp;ldquo;nth&amp;rdquo; position of the Fibonacci sequence. I also created a Git repository called &lt;a href=&#34;https://github.com/DavidVogelxyz/rust-collection&#34;&gt;Rust collection&lt;/a&gt;, which contains a bunch of scratch projects I worked on during this time. Both projects can be found on my GitHub, and are directly accessible by following the links.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;time-to-get-rusty&#34;&gt;Time to Get Rusty&lt;/h2&gt;
&lt;p&gt;By the end of 2023 October, I was still in the process of choosing the &amp;ldquo;first programming language&amp;rdquo; that I would dedicate a solid amount of time to learn. After trying out &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/python&#34;&gt;Python and TypeScript&lt;/a&gt; for a time, and not really feeling like either was right for me, I went back to my Bash projects, working to &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/debian-dwm&#34;&gt;improve my &lt;code&gt;debian-dwm&lt;/code&gt; installer&lt;/a&gt;. But, even as I made more progress with Bash, I still felt that it would be good to start learning &amp;ldquo;a real programming language&amp;rdquo;. As I mentioned in a previous article, I &amp;ldquo;wanted a language that would punish my lack of understanding, and would force me to better appreciate what I was trying to tell the computer to do&amp;rdquo;. Put another way, I wanted a language that would make me use all the knowledge I had gained from &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/theprimeagen-dsa-course&#34;&gt;thePrimeagen&amp;rsquo;s Data Structures and Algorithms course&lt;/a&gt;. I forget exactly how I stumbled upon it; but, by the end of 2023 October, I finally found a language that would give me all of that: Rust.&lt;/p&gt;
&lt;p&gt;One of the benefits of learning Rust at any stage of a programmer&amp;rsquo;s journey is that there are a &lt;em&gt;&lt;strong&gt;TON&lt;/strong&gt;&lt;/em&gt; of resources available. There&amp;rsquo;s &amp;ldquo;&lt;a href=&#34;https://doc.rust-lang.org/book/&#34;&gt;The Book&lt;/a&gt;&amp;rdquo;, which is an online collection of documentation put out by the Rust Foundation, explaining exactly how to get started. There&amp;rsquo;s &amp;ldquo;&lt;a href=&#34;https://doc.rust-lang.org/rust-by-example/&#34;&gt;Rust by Example&lt;/a&gt;&amp;rdquo;, which was also created by the Rust Foundation, and is almost a different version of &amp;ldquo;The Book&amp;rdquo; that requires less reading, and has more examples. There&amp;rsquo;s also &amp;ldquo;&lt;a href=&#34;https://github.com/rust-lang/rustlings/&#34;&gt;Rustlings&lt;/a&gt;&amp;rdquo;, which is a compilation of practice examples, essentially in the form of a game. Despite knowing no Rust at the time, I decided to start with &amp;ldquo;Rustlings&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;rustlings&#34;&gt;Rustlings&lt;/h2&gt;
&lt;p&gt;I started to learn Rust by working through Rustlings. Because of my lack of Rust knowledge, and lack of coding experience in general, I decided to do Rustlings in a (likely) unorthodox way &amp;ndash; I had a YouTube video walkthrough playing at the same time. I attempted every problem by myself at first; but, I quickly allowed myself to view &amp;ldquo;the answer&amp;rdquo;. In retrospect, I think this was the perfect way (at least, for me) to get introduced to the language. It provided a very fun way to get started, and it allowed me to get a wide view of how Rust worked and what it had to offer, without getting too bogged down in understanding what I was doing. This allowed me to confirm my major suspicion: yes, this was going to be a language where having a solid foundation of data structures would be extremely useful.&lt;/p&gt;
&lt;p&gt;While my first go-around with Rustlings came with a large amount of hand-holding, it was my intention that it would serve only as an introduction, and nothing more. Once I got that introduction, my plan was to read through &amp;ldquo;The Book&amp;rdquo; in its entirety, and get a much deeper understanding of Structs and Enum and all the rest. After I completed &amp;ldquo;The Book&amp;rdquo;, I would return to Rustlings, and I would do it again from scratch. But, that next time, there would be no hand-holding. If I needed help, the solutions would be found in &amp;ldquo;The Book&amp;rdquo;. I would have to read documentation, and read my own code, to figure out what was wrong.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://davidvogel.xyz/images/rustlings-completion.png&#34;&gt;&lt;img src=&#34;https://davidvogel.xyz/images/rustlings-completion.png&#34; alt=&#34;Rustlings completion&#34; title=&#34;Rustlings completion&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;With my first completion of Rustlings under my belt, it was time to start reading &amp;ldquo;The Book&amp;rdquo;. However, I did take a short break from Rust to work on my &lt;code&gt;debian-dwm&lt;/code&gt; project. While what I learned from Rust wasn&amp;rsquo;t &lt;em&gt;directly&lt;/em&gt; applicable, I now had a far better understanding of functions, and how to write them. This &lt;em&gt;was&lt;/em&gt; directly relatable, and I used that understanding to perform a &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/debian-dwm&#34;&gt;major refactoring of the &lt;code&gt;debian-dwm&lt;/code&gt; project&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;the-book-and-fibonacci&#34;&gt;The Book, and &lt;code&gt;fibonacci&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;After completing the &lt;code&gt;debian-dwm&lt;/code&gt; refactor, I was more enthusiastic than ever about learning Rust and becoming a better programmer. So, I started at the beginning of &amp;ldquo;The Book&amp;rdquo;, and began to work through the chapters.&lt;/p&gt;
&lt;p&gt;I was only a few sections before I was presented with a stopping point, where I was told that I knew &amp;ldquo;enough to make a small program&amp;rdquo;. One of the suggestions for a project was to write a program that calculated the Fibonacci sequence. I immediately got excited by the prospect, as I began to think about all the different ways I could tackle writing the code. Specifically, I was pumped to write the algorithm that would calculate the Fibonacci. I was already envisioning a number line that would be looped over. The loop would take two numbers (call them &amp;ldquo;l&amp;rdquo; and &amp;ldquo;r&amp;rdquo;, for left and right), add them together, and then &amp;ldquo;step up&amp;rdquo; to the next set of numbers. The loop would continue this process until it reached the given index, and then spit out the sum. I took a crack at it, and after a bit, I had a piece of code that worked!&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;fibonacci&lt;/code&gt; project was great for so many reasons. One of the primary reasons was that it gave me something to continually return to as I made more progress in &amp;ldquo;The Book&amp;rdquo;. When I learned how to write a &amp;ldquo;for loop&amp;rdquo;, I swapped it in for the &amp;ldquo;while loop&amp;rdquo; I had been using. When I learned how to write module files, I moved the code from &amp;ldquo;main.rs&amp;rdquo; to a &amp;ldquo;fibonacci.rs&amp;rdquo; file. Then, when I learned about library files, I moved the code over to a &amp;ldquo;lib.rs&amp;rdquo; file. The process continued:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I learned how to write tests, so I added some to the &amp;ldquo;lib.rs&amp;rdquo; file.&lt;/li&gt;
&lt;li&gt;I was taught how to accept command line arguments as inputs, so I updated my program to accept arguments.&lt;/li&gt;
&lt;li&gt;As I learned how to write better code, I began to abstract out functions to create simpler functions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One thing that&amp;rsquo;s worth shouting out is the following: I noticed that there were insufficient logic regarding ordinal numbers (&amp;ldquo;1st&amp;rdquo;, &amp;ldquo;2nd&amp;rdquo;, &amp;ldquo;3rd&amp;rdquo;, etc). Specifically, &amp;ldquo;1st, 2nd, 3rd&amp;rdquo; worked correctly, and everything else received &amp;ldquo;th&amp;rdquo;. Unfortunately, this didn&amp;rsquo;t cover &amp;ldquo;21st, 22nd, 23rd, 31st, 32nd, 33rd, etc&amp;rdquo;. I thought the simple solution was to have the program read the last digit and output based on that. But, that logic would fail at &amp;ldquo;111th, 112th, 113th&amp;rdquo;. In addition, I found out that grabbing the last numeral in my integer was more complicated than originally assumed. So, I thought about it, and brought together everything I learned in order to come up with a solution. And then it came to me &amp;ndash; I can use modulo (specifically, mod 10), and that would return the last digit! I used the modulo operation, in combination with some clever logical operators, to write a solution that would encompass all cases.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not sure that it was &amp;ldquo;The Book&amp;rdquo;&amp;rsquo;s intention that I keep returning to an introductory project and keep refining it. However, the &lt;code&gt;fibonacci&lt;/code&gt; project began a home for my development, and one of the best indications of my progression in learning the fundamentals of Rust. While it&amp;rsquo;s honestly nothing special, it serves as a demonstration of the improvements in my understanding as I worked through all of the chapters, almost more so than the other practice problems I worked on in the other chapters.&lt;/p&gt;
&lt;h2 id=&#34;conclusions&#34;&gt;Conclusions&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m honestly not sure that I ever finished &amp;ldquo;The Book&amp;rdquo;. I worked through it until the end of 2023 November, when I became distracted by Advent of Code, which I saw as another opportunity to take what I had learned and practice more Rust. Soon after, I started a new job as a System Administrator in the middle of 2023 December, and that took my focus away from learning to code. But, I came back to Rust on occasion throughout 2024 &amp;ndash; the &amp;ldquo;modulo&amp;rdquo; story only happened at the end of 2024 May. Despite my attention being split between more projects than ever before, I was happy that I began to deep dive Rust for the time that I did. As compared to my experience with Python and TypeScript, it felt like the right language for me to start with. It gave me everything that I was looking for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I wrote command line programs that I could easily run on a Linux computer.&lt;/li&gt;
&lt;li&gt;I made use of a good amount of the data strucutres and algorithms that I had learned with thePrimeagen in 2023 August.&lt;/li&gt;
&lt;li&gt;It was a fair level of &amp;ldquo;difficult&amp;rdquo;, in that I felt rewarded for taking breaks to &amp;ldquo;learn how things worked underneath the hood&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In conclusion, after many months of working to find a coding language that I would be happy to learn and make progress in, I found that reality in Rust.&lt;/p&gt;
</description>
	</item>
	
	<item>
		<title>Getting Better at Bash</title>
		<link>https://davidvogel.xyz/home-lab/other/bash-scripting/</link>
		<pubDate>Fri, 17 Nov 2023 22:24:38 -0400</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/other/bash-scripting/</guid>
		<description>



&lt;p&gt;This article was written in 2024, looking back at my previous &lt;a href=&#34;https://davidvogel.xyz/home-lab/&#34;&gt;home lab projects&lt;/a&gt; and where my journey into IT began.&lt;/p&gt;




&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/&#34; id=&#34;tag_other&#34;&gt;Other Projects&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/bash-banner.png&#34; alt=&#34;Bash banner&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;This article tells the story of my progress at learning how to work better in Bash. As I grew and learned, I created a Git repository called &lt;a href=&#34;https://github.com/DavidVogelxyz/bash-collection&#34;&gt;Bash collection&lt;/a&gt;, which contains a bunch of scratch projects I&amp;rsquo;ve worked on &amp;ndash; this project can be found on my GitHub, and is directly accessible by following the link.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;my-first-refactor&#34;&gt;My First Refactor&lt;/h2&gt;
&lt;p&gt;Starting at the beginning of 2023 August, I had spent a good amount of time learning the basics of how to code. In August, I took a &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/theprimeagen-dsa-course&#34;&gt;data structures and algorithms (DSA) course&lt;/a&gt;, finished the first pass of the &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/debian-dwm&#34;&gt;&lt;code&gt;debian-dwm&lt;/code&gt; project&lt;/a&gt;, and wrote &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/neovim&#34;&gt;my own Neovim configuration files in Lua&lt;/a&gt;. In September, I began playing around with &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/python&#34;&gt;Python and Typescript&lt;/a&gt;, and made more progress on &lt;code&gt;debian-dwm&lt;/code&gt; and my Neovim configs. I had even dipped my toes into &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/rust&#34;&gt;Rust&lt;/a&gt; by working through Rustlings. But, it was now 2023 November, and I was looking to do something concrete that would cement the learning I did over the past few months.&lt;/p&gt;
&lt;p&gt;After reviewing the current state of my &lt;code&gt;debian-dwm&lt;/code&gt; project through the lens of what I had learned, I saw some glaring problems with it. While I had implemented some basic &amp;ldquo;for loops&amp;rdquo; and variables in early 2023 September, which made the code a lot cleaner, I was having issues with variable expansion within some of my commands. While there were other ways to fix my mistakes, such as exporting variables so they would be accessible throughout the code, I realized that using functions would be another way to resolve the matter. As an aside, this was something that Luke Smith had done with his LARBS project; but, I was too novice at the time to implement functions correctly. Now, with what I had learned, I felt confident that I could make those improvements to my project.&lt;/p&gt;
&lt;p&gt;Most of the major changes that I made during this refactor were to make the scripts easier to read. Examples of these changes include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I had some commands that were unnecessarily long, and would perform some of the same actions as other commands.
&lt;ul&gt;
&lt;li&gt;In these cases, I decided to write functions that could be called by other commands.&lt;/li&gt;
&lt;li&gt;The added benefit of doing this was, when a change needed to be made, I only had to make the edit once, and it would be reflected in every invocation of that function.&lt;/li&gt;
&lt;li&gt;This also made it much easier to write conditional statements that, if true, were able to do more complex functions, without impacting readability.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I added sections to my scripts.
&lt;ul&gt;
&lt;li&gt;Specifically:
&lt;ul&gt;
&lt;li&gt;The first section would be the script-wide variables that I was setting.&lt;/li&gt;
&lt;li&gt;The second section contained all the functions that I wrote.&lt;/li&gt;
&lt;li&gt;The third section was the &amp;ldquo;actual script&amp;rdquo;, which included all of the functions that were actually being invoked.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;This made it really easy to read the script, especially in Vim.
&lt;ul&gt;
&lt;li&gt;I could easily jump to the bottom and read &lt;em&gt;exactly&lt;/em&gt; what was being run and when.&lt;/li&gt;
&lt;li&gt;If I had a question about a function&amp;rsquo;s definition, I could use the keymap &lt;code&gt;gd&lt;/code&gt; to jump directly to the function and see what it was doing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I wrote some functions to take in files as arguments.
&lt;ul&gt;
&lt;li&gt;This allowed me to break off the package list from the script that installed packages, and create a separate &amp;ldquo;package-list&amp;rdquo; file that was far easier to read and edit.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The product of this refactoring process was a set of scripts that were far easier to read and debug. While the project was far from perfect, I was able to massively improve the code I wrote only a few short months ago, and make it &lt;em&gt;that much better&lt;/em&gt;, all because of the different things I had learned in the preceeding weeks. Content with the changes I had made, I committed the changes on 2023 November 12 and started reading through &amp;ldquo;The Book&amp;rdquo;, a set of documentation that would teach me the foundations of writing code in Rust. But, that commit had a problem that I wouldn&amp;rsquo;t notice until days later.&lt;/p&gt;
&lt;h2 id=&#34;indirect-variable-assignment&#34;&gt;Indirect Variable Assignment&lt;/h2&gt;
&lt;p&gt;A couple of days into beginning to read through &amp;ldquo;The Book&amp;rdquo;, I needed to set up a new virtual machine (VM) with &lt;code&gt;debian-dwm&lt;/code&gt;. So, I cloned the git repo I had been working on and ran the installer. However, I was met with a funny error: the &lt;code&gt;echo&lt;/code&gt; commands that I would use to tell the end user that a package needed to be installed before continuing, were instead printing nothing in place of the &lt;code&gt;$pkg&lt;/code&gt; variable. When I went to debug the scripts, I came across the problem: the variables weren&amp;rsquo;t being expanded correctly. As I looked more into the issue, I found out that it had a name: &amp;ldquo;indirect variable assignment&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;As I understand it, the problem had to do with my use of single quotes &amp;quot; &amp;rsquo; &amp;quot; versus double quotes &amp;quot; &amp;quot; &amp;ldquo;. While I know more than I did at the time, and I could have used double quotes had I escaped them correctly (using &amp;quot; \ &amp;ldquo;), I instead went a different route. I solved the issue by abstracting out the &lt;code&gt;echo&lt;/code&gt; command into a new &lt;code&gt;installcomment&lt;/code&gt; function, which &lt;em&gt;could&lt;/em&gt; correctly expand the variable, despite using single quotes. While I learned more since this incident, and I realize that a simple read of the &lt;code&gt;bash&lt;/code&gt; man page would have averted this issue entirely, it was a great experience for me. It gave me an opportunity, and a reason, to troubleshoot a more complex issue in some code that I had written, and to figure out my own way of resolving the problem. In addition, it was an indirect way for me to learn to abstract out more of m repeating code into simpler functions that could be invoked by other commands, rather than having repeating commands that do the same thing. In either case, it was one more experience added to my journey that helped me to learn better the tools with which I was working.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;While I was working during 2023 November both on improving my Bash skills and learning Rust, I can safely say as of writing (2024 August) that I&amp;rsquo;ve used more Bash than I have Rust. That&amp;rsquo;s simply a function of all the projects that I&amp;rsquo;ve worked on since this time, and there being more utility for Bash than there was for Rust, especially at my level of expertise with both. Even though I&amp;rsquo;ve made even more progress in Bash since this time period, this article highlights an important part of my journey and development. A few years ago, I couldn&amp;rsquo;t even read a Bash script. Only a few months before, I was writing scripts that were essentially just a long list of commands, one after the other. But, by 2023 November, I was starting to get a good enough handle on Bash that I could write more complex scripts. These lessons would become foundational for all the progress I would make in the months to come.&lt;/p&gt;
</description>
	</item>
	
	<item>
		<title>Python and TypeScript: Learning How to Code</title>
		<link>https://davidvogel.xyz/home-lab/other/python/</link>
		<pubDate>Fri, 08 Sep 2023 22:24:38 -0400</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/other/python/</guid>
		<description>



&lt;p&gt;This article was written in 2024, looking back at my previous &lt;a href=&#34;https://davidvogel.xyz/home-lab/&#34;&gt;home lab projects&lt;/a&gt; and where my journey into IT began.&lt;/p&gt;




&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/&#34; id=&#34;tag_other&#34;&gt;Other Projects&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/python-banner.png&#34; alt=&#34;Python banner&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;This article tells the story of how I started working with Python and TypeScript. As I made progress in both languages, I created Git repositories called &lt;a href=&#34;https://github.com/DavidVogelxyz/python-collection&#34;&gt;Python collection&lt;/a&gt; and &lt;a href=&#34;https://github.com/DavidVogelxyz/typescript-collection&#34;&gt;TypeScript collection&lt;/a&gt;, which contains a bunch of scratch projects I worked on during this time &amp;ndash; these projects can be found on my GitHub, and are directly accessible by following the links.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;my-first-real-coding-language&#34;&gt;My First &amp;ldquo;Real Coding Language&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;I was feeling pretty good about my progress from the past month. I had completed &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/theprimeagen-dsa-course&#34;&gt;thePrimeagen&amp;rsquo;s data structures and algorithms (DSA) course&lt;/a&gt; a few weeks prior, finished the first pass of the &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/debian-dwm&#34;&gt;&lt;code&gt;debian-dwm&lt;/code&gt; project&lt;/a&gt;, and written &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/neovim&#34;&gt;my own Neovim configuration files in Lua&lt;/a&gt;. I was also getting used to the new &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/kinesis&#34;&gt;Kinesis keyboard&lt;/a&gt;, and had starting learning how to use &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/git&#34;&gt;Git&lt;/a&gt; better. However, I was weeks out from the DSA course, and I hadn&amp;rsquo;t made much use of it. While I gained a ton of insights into programming, I was being self-critical: &amp;ldquo;Bash isn&amp;rsquo;t a real language&amp;rdquo;, and &amp;ldquo;Lua &lt;em&gt;is&lt;/em&gt; a real coding language, but all you did was set a bunch of options&amp;rdquo;. I felt it was time to start learning a &amp;ldquo;real coding language.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Since I had the Frontend Masters subscription for another few weeks, I wanted to get as much value out of it as I could. So, I thought about what language I wanted to start with. I considered TypeScript/JavaScript heavily, as the DSA course was done in TypeScript. But, I wasn&amp;rsquo;t sure if TypeScript would be the most accessible first language. I considered some other languages, and then made my decision: Python.&lt;/p&gt;
&lt;p&gt;I made the decision to start with Python for a few reasons. The primary reason was that I thought Python might be more &amp;ldquo;noob-friendly&amp;rdquo;, and would be a better starting point than any other language, because of its accessibility. While this was the case, it incidentally also became the reason that I moved away from Python - I felt that the DSA course wasn&amp;rsquo;t necessary to use Python. To be more clear, Python is a great language, and has a bunch of use cases, such as data analysis and machine learning. However, none of those use cases were directly applicable to me. In addition, because of Python&amp;rsquo;s &amp;ldquo;noob-friendly&amp;rdquo; syntax, I had concerns that I wouldn&amp;rsquo;t be able to build the same foundation of understanding that I would from using other languages. I didn&amp;rsquo;t necessarily need to understand how things worked &amp;ldquo;under the hood&amp;rdquo; in order to do some basic projects, and that bothered me. As I would find out from using Python, I wanted a language that would punish my lack of understanding, and would force me to better appreciate what I was trying to tell the computer to do.&lt;/p&gt;
&lt;h2 id=&#34;getting-a-handle-on-python&#34;&gt;Getting a Handle on Python&lt;/h2&gt;
&lt;p&gt;During this time, I completed a handful of projects using Python. I worked on a simple &amp;ldquo;gambling game&amp;rdquo; by watching a video by the YouTuber &amp;ldquo;Tech with Tim&amp;rdquo; and gained some experience writing simple functions. I completed a crash course on Python from Frontend Masters, in which I learned some tips about how to work with Python virtual environments on Linux. I even took a swing at some Leetcode problems, where I got to work with data structures such as hashsets, and maps/dictionaries. In addition, I got to apply some of what I learned from the DSA course and think about clever ways to implement algorithms to solve problems. By working on these projects, I was excited to continue learning to code; however, I didn&amp;rsquo;t really see how Python was going to assist me with the types of things I was already doing.&lt;/p&gt;
&lt;p&gt;So, after about a month of playing around with Python, I started to move away from it. Throughout 2023 September and October, I also tried out some Leetcode problems in TypeScript as well, just to see if that was a better fit for my first language. But, neither Python nor TypeScript gave me what I was looking for. While I had benefitted from the time spent working with Python and TypeScript, and I had gained a better understanding of how to write code, I couldn&amp;rsquo;t see how either language would help me with the other stuff I was doing. In contrast, I felt that getting better at Bash would be more useful to me, and the projects I was working on. Therefore, I kept working on my Neovim configuration, and continued to &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/debian-dwm&#34;&gt;improve my &lt;code&gt;debian-dwm&lt;/code&gt; project&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;However, later in 2023, I eventually discovered the language that would be my true &amp;ldquo;first coding language&amp;rdquo;: &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/rust&#34;&gt;Rust&lt;/a&gt;.&lt;/p&gt;
</description>
	</item>
	
	<item>
		<title>Neovim: Now in Lua!</title>
		<link>https://davidvogel.xyz/home-lab/other/neovim/</link>
		<pubDate>Sun, 27 Aug 2023 22:24:38 -0400</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/other/neovim/</guid>
		<description>



&lt;p&gt;This article was written in 2024, looking back at my previous &lt;a href=&#34;https://davidvogel.xyz/home-lab/&#34;&gt;home lab projects&lt;/a&gt; and where my journey into IT began.&lt;/p&gt;




&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/&#34; id=&#34;tag_other&#34;&gt;Other Projects&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/neovim-banner.png&#34; alt=&#34;Neovim banner&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;This article tells the story of how I wrote my own &lt;a href=&#34;https://github.com/davidvogelxyz/nvim&#34;&gt;Neovim configuration&lt;/a&gt; from scratch &amp;ndash; this project can be accessed by following the link to my GitHub.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;you-can-go-your-own-way&#34;&gt;&amp;ldquo;You Can Go Your Own Way&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;While I was working on my &lt;code&gt;debian-dwm&lt;/code&gt; project (links: to &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/debian-dwm&#34;&gt;article&lt;/a&gt;; to &lt;a href=&#34;https://github.com/davidvogelxyz/debian-dwm&#34;&gt;GitHub&lt;/a&gt;), I began to notice that my Neovim experience wasn&amp;rsquo;t exactly where I wanted it to be. I had been using Luke Smith&amp;rsquo;s Vim config file for about a year now, and it was an excellent way to get started with Neovim. However, I was beginning to use Neovim for everything I did on my machine, and I was starting to realize that there were more features that I wanted. After watching enough of thePrimeagen&amp;rsquo;s content, I knew that I wanted some additional plugins that would take my experience to the next level. Fortunately, I had recently come across a video of his, where he starts with the bare-bones Neovim experience and builds it from scratch to suit his needs. And, I thought, &amp;ldquo;hey, why not do it with him?&amp;rdquo; In the worst case scenario, I could always revert back to using Luke&amp;rsquo;s Vim config file.&lt;/p&gt;
&lt;p&gt;So, I sat down one day in late August 2023, and wrote my own Neovim configs alongside Prime. The first thing that I had to get used to was Lua. While Luke Smith&amp;rsquo;s Vim config was written in Vimscript, so it would be backwards compatible with the original Vim, Prime was writing configs for Neovim alone, and so he opted to use Lua in order to have greater control over the code he wrote. By doing this, I learned a ton about how my favorite text editor functioned. I learned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How to work in Netrw, Neovim&amp;rsquo;s default file explorer, allowing me to create files and directories without having to exit Neovim.&lt;/li&gt;
&lt;li&gt;How to create profiles for Neovim, so I could have alternate versions of my setup.
&lt;ul&gt;
&lt;li&gt;For example, I created two profiles that were identical, except that one would install the LSP plugin, and one that wouldn&amp;rsquo;t.&lt;/li&gt;
&lt;li&gt;Pairing this with &lt;code&gt;debian-dwm&lt;/code&gt;, I would be able to choose whether or not to install an LSP with my Neovim, saving myself time on VMs that weren&amp;rsquo;t going to be used for coding.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;How to create custom keymaps that worked well with my &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/kinesis&#34;&gt;new Kinesis keyboard&lt;/a&gt;.
&lt;ul&gt;
&lt;li&gt;One of my favorites is that I bound &amp;ldquo;save file&amp;rdquo; to a double-tap of the spacebar.
&lt;ul&gt;
&lt;li&gt;This has enabled me to save my work incredibly quickly.&lt;/li&gt;
&lt;li&gt;As a byproduct, I now save my work after every change, without even realizing it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;How to install and operate a plugin manager.
&lt;ul&gt;
&lt;li&gt;While I still use &lt;code&gt;vim-plug&lt;/code&gt;, as I did when using Luke&amp;rsquo;s configs, I learned how it actually works, and that allowed me to more easily add and remove plugins.&lt;/li&gt;
&lt;li&gt;Also, I learned how to direct &lt;code&gt;vim-plug&lt;/code&gt; to install a specific version of a plugin.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;How to add new colorschemes to my Neovim configs.
&lt;ul&gt;
&lt;li&gt;This didn&amp;rsquo;t really help my productivity, but it definitely improves the experience. When you&amp;rsquo;re looking at raw texts for hours at a time, you want it to look aesthetically pleasing!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;How to set options in Lua, as opposed to Vimscript.
&lt;ul&gt;
&lt;li&gt;While all my settings are beneficial, the following is a small list of options I figured out at this time:
&lt;ul&gt;
&lt;li&gt;Incremental search is useful for showing what exactly I&amp;rsquo;m searching for, and where it appears in the file.&lt;/li&gt;
&lt;li&gt;Scroll offset (scrolloff) keeps me from editing files near the bottom or top of my file.
&lt;ul&gt;
&lt;li&gt;Unless I&amp;rsquo;m at the absolute first or last lines of a file, Neovim will enforce a buffer, so I can see the lines above or below what I&amp;rsquo;m working on.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Remapping &lt;!-- raw HTML omitted --&gt; and &lt;!-- raw HTML omitted --&gt; with &amp;ldquo;zz&amp;rdquo; &amp;ndash; this allows me to keep my eyes on the center of the screen as I jump up and down the file.
&lt;ul&gt;
&lt;li&gt;I also have the same setting for using search, which means I barely have to scan to find the string I&amp;rsquo;m searching for, since it&amp;rsquo;s always near the center of the screen.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I was also introduced to some awesome new plugins!&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://davidvogel.xyz/images/neovim-configs.png&#34;&gt;&lt;img src=&#34;https://davidvogel.xyz/images/neovim-configs.png&#34; alt=&#34;Neovim&#34; title=&#34;Neovim&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;An image of my Neovim configuration directory, in Neovim, using the Telescope plugin to view files.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;plugins&#34;&gt;Plugins&lt;/h2&gt;
&lt;p&gt;These tools have greatly improved my ability to use Neovim. Especially when working on code projects, I can&amp;rsquo;t work without them.&lt;/p&gt;
&lt;h3 id=&#34;telescope&#34;&gt;Telescope&lt;/h3&gt;
&lt;p&gt;One of my favorite additions to my Neovim is Telescope: a fuzzy finder. While Luke&amp;rsquo;s configs also had a fuzzy finder, Telescope enabled me to also have a file preview for any file that I was searching over. Because of Telescope, I massively increased my use of the fuzzy finder within Neovim &amp;ndash; where I almost never used &lt;code&gt;fzf&lt;/code&gt;, I constantly use Telescope. With Prime&amp;rsquo;s help, I also added some custom keymaps, including one that allows me to use &lt;code&gt;grep&lt;/code&gt; through the entire working directory to search for a file, and then displays that output in Telescope. This has been a great help when working within a repository, as I can now quickly find files I&amp;rsquo;m working on.&lt;/p&gt;
&lt;h3 id=&#34;harpoon&#34;&gt;Harpoon&lt;/h3&gt;
&lt;p&gt;As Prime accurately describes it, Harpoon is truly &amp;ldquo;a glorious way to navigate files&amp;rdquo;. Basically, what Harpoon allows the user to do is to use the same set of keymaps for switching between files. What does that mean? It means that I know that &amp;ldquo;Ctrl-J&amp;rdquo; is always my #1 file in a project, &amp;ldquo;Ctrl-K&amp;rdquo; is my #2 file, and &amp;ldquo;Ctrl-L&amp;rdquo; is my #3 file. Then, no matter what project I&amp;rsquo;m working on, I can use those same keymaps to always hit the most important files. I can readily change those files out; if another file needs to be moved in, or the positions need to change, I can do that with no effort required. In addition, the marks are set on a &amp;ldquo;per repo&amp;rdquo; basis. If I&amp;rsquo;m working on my &lt;code&gt;debian-dwm&lt;/code&gt; project, those keymaps will access the marks for that project; if I switch over to the &lt;code&gt;library&lt;/code&gt; repo, then I have access to the marks for &lt;em&gt;that&lt;/em&gt; repo. So, I now have the muscle memory to very effortlessly flip through the most accessed files in any one of my repos/directories/projects. And, if I want to add something that&amp;rsquo;s not in my Harpoon just yet, I use Telescope to navigate to it, add it to Harpoon, and then set it as whichever mark I need it to be. Harpoon is incredibly useful.&lt;/p&gt;
&lt;h3 id=&#34;lsp&#34;&gt;LSP&lt;/h3&gt;
&lt;p&gt;The last thing I want to shout out in particular are Language Server Protocols (LSPs) in Neovim. While I wasn&amp;rsquo;t coding much besides Bash scripts at the time, setting up LSPs paid dividends in the future. Once I started coding in Rust, having &lt;code&gt;rust-analyzer&lt;/code&gt; built into Neovim made life so easy, as I was able to have my code actively assessed by the Rust compiler while I was programming. I also got some auto-complete features and function descriptions built into my Neovim. It&amp;rsquo;s not something I needed up until this point, but now that I have them, I don&amp;rsquo;t know what I&amp;rsquo;d do without them.&lt;/p&gt;
&lt;h2 id=&#34;i-use-vim-btw&#34;&gt;I Use Vim, BTW&lt;/h2&gt;
&lt;p&gt;While I was using Vim a lot before this, creating my own custom configuration caused me to love Vim even more. I now use Vim for everything I can, whether it&amp;rsquo;s coding, writing documentation in Markdown, or even my daily to-do lists. The more I use it, the more I become comfortable with using Vim motions and navigating using Harpoon and Telescope. Since creating these config files, I have become a bit obsessed with using Vim for everything I can. I even have a version of my Neovim configs written in Vimscript; that way, when I&amp;rsquo;m working on servers, I can quickly deploy a more lean version of my setup using just Vim (as opposed to Neovim).&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s kinda become a way of life. 🤣&lt;/p&gt;
&lt;h2 id=&#34;helpful-videos&#34;&gt;Helpful Videos&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes1hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/w7i4amO_zaE&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;0 to LSP : Neovim RC From Scratch&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
</description>
	</item>
	
	<item>
		<title>Debian DWM: Like LARBS, But Not Exactly</title>
		<link>https://davidvogel.xyz/home-lab/other/debian-dwm/</link>
		<pubDate>Wed, 23 Aug 2023 22:24:38 -0400</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/other/debian-dwm/</guid>
		<description>



&lt;p&gt;This article was written in 2024, looking back at my previous &lt;a href=&#34;https://davidvogel.xyz/home-lab/&#34;&gt;home lab projects&lt;/a&gt; and where my journey into IT began.&lt;/p&gt;




&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/&#34; id=&#34;tag_other&#34;&gt;Other Projects&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/larbs-banner.png&#34; alt=&#34;LARBS banner&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;This article tells the story of how I created my first true Git project, &lt;a href=&#34;https://github.com/davidvogelxyz/debian-dwm&#34;&gt;&lt;code&gt;debian-dwm&lt;/code&gt;&lt;/a&gt; &amp;ndash; this project can be accessed by following the link to my GitHub. If you want to learn more about how I install Debian onto new computers and VMs prior to using &lt;code&gt;debian-dwm&lt;/code&gt;, check out &lt;a href=&#34;https://github.com/davidvogelxyz/library/blob/master/install-os/install-debian.md&#34;&gt;my guide on installing Debian&lt;/a&gt;!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;my-first-real-git-project&#34;&gt;My First Real Git Project&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;debian-dwm&lt;/code&gt; is a project I have been working on since late July 2023, though it really only took shape in late August 2023. I had been using LARBS on my Artix desktop for about 6 months, so much so that I was loathe to use any other desktop solution. While KDE is definitely my favorite desktop environment for Linux, I vastly prefer the flexibility of a window manager like DWM. However, LARBS is written for Arch-based distros, such as Artix Linux. There was no easy way to deploy a similar build of DWM onto a Debian machine. So, I decided to make it myself.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t directly copy Luke Smith&amp;rsquo;s LARBS for a handful of reasons. The primary one was that my Bash knowledge wasn&amp;rsquo;t where it needed to be &amp;ndash; I had no idea what Luke was doing with portions of his script. For example, the way that he was using Bash to pass arguments into functions that he had written completely baffled me at the time. But, another reason was that there were some things that I wanted the script to do, that Luke&amp;rsquo;s script didn&amp;rsquo;t do. A great example of this was the ability for the script, were it to fail, to be able to pick up from some sort of &amp;ldquo;milestone marker&amp;rdquo;, rather than starting again from the beginning. I saw this as a great opportunity to push myself to learn more, to build something myself that would be heavily inspired by, but not a carbon copy of, someone else&amp;rsquo;s work.&lt;/p&gt;
&lt;h3 id=&#34;we-all-start-somewhere&#34;&gt;&amp;ldquo;We All Start Somewhere&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;The first iteration of &lt;code&gt;debian-dwm&lt;/code&gt; was completed by early August. At that point, it was genuinely just a list of commands that would run in succession. There was honestly nothing special about my script, &lt;em&gt;&lt;strong&gt;except&lt;/strong&gt;&lt;/em&gt; for the fact that it would work on a Debian system. I actually used this first iteration to create the VM that I would use to complete the &amp;ldquo;Starting Points&amp;rdquo; section of &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/hackthebox&#34;&gt;HackTheBox&lt;/a&gt;. I even used a version of these scripts to get DWM working on &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/nixos&#34;&gt;NixOS&lt;/a&gt; because I refused to make use of &lt;code&gt;home-manager&lt;/code&gt;. While the script wasn&amp;rsquo;t anything special, it did what it needed to do: it installed Luke Smith&amp;rsquo;s DWM onto a Debian system. However, I was already beginning to implement my own additions to the script. The primary example of this was creating a way to have those &amp;ldquo;milestone markers&amp;rdquo;: thus, my idea of &amp;ldquo;modules&amp;rdquo; was born.&lt;/p&gt;
&lt;p&gt;Simply put, I had no idea how to have the installer be able to &amp;ldquo;pick up where it left off.&amp;rdquo; I hadn&amp;rsquo;t been introduced to Ansible at the time, so I was struggling to find a way to make my main script be able to know what part of the install it was on. So, I came up with my way of doing it.&lt;/p&gt;
&lt;p&gt;I broke the script up into smaller modules. The key was that every module that was going to get forked into an external shell would be preceeded by a logical operator that checked to see if the module file existed. If it didn&amp;rsquo;t exist, it would simply move onto to the next module. If the module completed successfully, it would move that module into a separate directory, so that it wouldn&amp;rsquo;t exist the next time the main script was run. And, if the module failed, it would leave the file in place, so that the main script would start from there if run again. It would also print a message to user, telling them exactly which script failed. Though it wasn&amp;rsquo;t particularly elegant, it worked as a first implementation.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://davidvogel.xyz/images/debian-dwm.png&#34;&gt;&lt;img src=&#34;https://davidvogel.xyz/images/debian-dwm.png&#34; alt=&#34;Debian DWM&#34; title=&#34;Debian DWM&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;An image of DWM running on a Debian VM, after having been installed using the &lt;code&gt;debian-dwm&lt;/code&gt; script.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;improving-my-work&#34;&gt;Improving My Work&lt;/h3&gt;
&lt;p&gt;However, once I completed thePrimeagen&amp;rsquo;s &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/theprimeagen-dsa-course&#34;&gt;Data Structures and Algorithms course&lt;/a&gt;, I decided to revisit &lt;code&gt;debian-dwm&lt;/code&gt; and make it better. Armed with my &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/kinesis&#34;&gt;Kinesis keyboard&lt;/a&gt; and a &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/git&#34;&gt;better understanding of Git&lt;/a&gt;, I knew it was time to start applying what I had learned. One of the first things I learned how to do was to create a loop to run my modules, rather than a bunch of sequential commands. Again, in retrospect, it wasn&amp;rsquo;t anything special, but it was yet another example of visible improvement. I also learned how to utilize variables in conjunction with my loop &amp;ndash; this meant that I could retain control of what order the loop ran the modules in by listing the modules in the order I wanted them to run. In addition, I leveraged the tools at my disposal by using my Proxmox server to test my code: by creating a standardized VM that I could clone for testing, I was able to rapidly test changes I made before uploading new commits to GitHub. At a much faster pace than before, I was able to write, test, and then implement improvements to my code.&lt;/p&gt;
&lt;p&gt;Because I was now leveraging Git in more intelligent ways, I also no longer had to worry about finding a way to achieve proper version control. Instead of having a bunch of nearly identical directories, differentiated only by timestamps, I now had the ability to keep all that data in one repository. If I ever needed to look back a previous version, it was as easy as checking a previous commit. In addition, Git and GitHub allowed me to have a central repository for these scripts. Cloning down the repository was far easier than going through the hassle of using &lt;code&gt;scp&lt;/code&gt; or &lt;code&gt;rsync&lt;/code&gt; to get the scripts onto new VMs. For a first project, I really felt like I was working efficiently and utilizing all my tools in an effective way.&lt;/p&gt;
&lt;p&gt;While I started August 2023 with a mess of repositories on my computer, with only slightly different changes between them, I ended August 2023 with a single, awesome repo that &lt;em&gt;I&lt;/em&gt; wrote, containing a LARBS-inspired installer uploaded to GitHub. Now, whenever I want to create a new computer with DWM on it, I can use either LARBS or &lt;code&gt;debian-dwm&lt;/code&gt; to quickly and effortlessly perform the install. I would continue to work on this project over the coming months, refining it further. But, for now, my attention had turned to something else: my &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/neovim&#34;&gt;Neovim configuration files&lt;/a&gt;.&lt;/p&gt;
</description>
	</item>
	
	<item>
		<title>Building a Library of Documentation</title>
		<link>https://davidvogel.xyz/home-lab/other/library/</link>
		<pubDate>Wed, 23 Aug 2023 21:24:38 -0400</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/other/library/</guid>
		<description>



&lt;p&gt;This article was written in 2024, looking back at my previous &lt;a href=&#34;https://davidvogel.xyz/home-lab/&#34;&gt;home lab projects&lt;/a&gt; and where my journey into IT began.&lt;/p&gt;




&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/&#34; id=&#34;tag_other&#34;&gt;Other Projects&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;This article tells the story of how I wrote my own &lt;a href=&#34;https://github.com/davidvogelxyz/library&#34;&gt;Git repository for guides&lt;/a&gt; &amp;ndash; this project can be accessed by following the link to my GitHub.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;documenting-my-progress&#34;&gt;Documenting my progress&lt;/h2&gt;
&lt;p&gt;The more I&amp;rsquo;ve made progress in my IT and home lab journey, the more I&amp;rsquo;ve noticed a certain trend regarding documentation. Often, for whatever project I&amp;rsquo;m working on, there is a common breakdown with resources I use:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There is a primary resource (official documentation, etc) that gets me about 90% of the way through the project.&lt;/li&gt;
&lt;li&gt;There is a secondary resource that gets me another 8% of my progression.&lt;/li&gt;
&lt;li&gt;Finally, there&amp;rsquo;s a third resource that resolves some issue I&amp;rsquo;m having, and that resource gets me the last 2% of the way through.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The percentages may vary, but there are almost always primaries I use, with some other resources assisting me with issues along the way. I usually make a point of bookmarking all those resources, though I&amp;rsquo;ll also bookmark other resources I used throughout the process. Once I&amp;rsquo;ve deployed whatever service it is, I won&amp;rsquo;t touch the project, or its resources, for about 3-6 months.&lt;/p&gt;
&lt;p&gt;Eventually, I&amp;rsquo;ll come back to the project, and this is where I began to notice problems. I can almost always find the primary resource, and I can usually find the secondary resource. However, I often have immense trouble finding that obscure post buried deep on some message board. Even despite having the bookmarks saved, I&amp;rsquo;ll have to repeat the process of digging through the bookmarks to find that post. And, if I don&amp;rsquo;t have the post bookmarked, then I have to try and remember what search query I used to find that page, etc. It can be a real hassle, and it&amp;rsquo;s especially irritating when it&amp;rsquo;s regarding a problem for which I already found a solution.&lt;/p&gt;
&lt;p&gt;So, I decided in 2023 August to take it upon myself to document the steps I was taking. I was absolutely tired of struggling to find the resources I used in the past, and I knew that keeping records of the process would allow me to more rapidly deploy projects I had already completed. I imagined it would be helpful to have a single resource that, if I followed the outlined steps, would get me 100% completion every time. I also thought that reading documentation written by me, for me, would be far easier to read and parse than some article written by someone else. This initiative became my Library git repository.&lt;/p&gt;
&lt;h2 id=&#34;the-library-repository&#34;&gt;The &amp;ldquo;Library&amp;rdquo; repository&lt;/h2&gt;
&lt;p&gt;While it started out pretty basic, with some guides on installing Arch Linux and Debian (as well as some other troubleshooting tips), my Library repository has developed in an ever growing assortment of documentation on many of the projects I&amp;rsquo;ve completed. While it&amp;rsquo;s a time-consuming process to document the working steps, and it&amp;rsquo;s meant that I complete projects slower than I would if I skipped the write-ups, it has paid dividends in excess of the effort I&amp;rsquo;ve put in to maintain it.&lt;/p&gt;
&lt;p&gt;Maintaining the documentation on GitHub has had extraordinary benefits. While I didn&amp;rsquo;t know much about &lt;code&gt;git&lt;/code&gt; when I first started, having version control on my guides since the beginning has enabled me to easily view past versions of the guides. Whether it be looking back at the original versions of guides and seeing how much they&amp;rsquo;ve changed, or making an adjustment that didn&amp;rsquo;t work out as intended and reverting the change, using &lt;code&gt;git&lt;/code&gt; to manage a large store of documents has made it really easy to work with a constantly developing set of materials. Also, while this was never the expectation, I have since had co-workers ask me how I set up certain services and servers, and it&amp;rsquo;s been really awesome to be able to direct them to guides I wrote. Mostly, my guides have been complete enough to get them to the point where they were able to set those same services up, without having to debug the issues I ran into. On occasion, something I added to the guides wasn&amp;rsquo;t as clear as it could have been. While the guides were originally written for me, and I could usually understand my own shorthand, learning to write documentation more clearly has benefitted everyone involved. It&amp;rsquo;s definitely inspired me to continue maintaining the &amp;ldquo;Library&amp;rdquo; as I learn more.&lt;/p&gt;
&lt;p&gt;As of 2024 August, almost an entire year later, I now have guides on so many different projects I&amp;rsquo;ve worked on. I have writeups on 9 different server projects, how to set up default server configurations for both Debian and Alpine Linux, as well as troubleshooting docs on various issues I&amp;rsquo;ve encountered. I have also improved a bunch of the content that I&amp;rsquo;ve posted throughout the year, and made the guides more readable and useable; not just for me, but for anyone who uses the documentation.&lt;/p&gt;
</description>
	</item>
	
	<item>
		<title>Git: I &#34;Git&#34; It Now</title>
		<link>https://davidvogel.xyz/home-lab/other/git/</link>
		<pubDate>Tue, 22 Aug 2023 22:24:38 -0400</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/other/git/</guid>
		<description>



&lt;p&gt;This article was written in 2024, looking back at my previous &lt;a href=&#34;https://davidvogel.xyz/home-lab/&#34;&gt;home lab projects&lt;/a&gt; and where my journey into IT began.&lt;/p&gt;




&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/&#34; id=&#34;tag_other&#34;&gt;Other Projects&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/git-banner.png&#34; alt=&#34;Git banner&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;clowning-around-on-github&#34;&gt;Clowning Around on GitHub&lt;/h2&gt;
&lt;p&gt;To tell the story of how I learned Git, I have to start by being honest: I began using GitHub in January 2023, before I understood Git. Back then, I used it primarily to upload some text files containing &amp;ldquo;tricks and tips&amp;rdquo; that I had written and accumulated throughout 2022. None of them were all that good; I didn&amp;rsquo;t even know how to write Markdown at the time. I just needed a place to put some badly formatted text files so I could access them from other computers, and GitHub worked for that purpose.&lt;/p&gt;
&lt;p&gt;I was such a clown about it though. For example, I was editing those text files through GitHub, &lt;em&gt;directly from the browser&lt;/em&gt;. Every time I made a small change, I would &amp;ldquo;save changes&amp;rdquo; on the web page. I didn&amp;rsquo;t understand how GitHub worked under the hood, I just did what seemed to make sense. Now, looking back at those repos, I recoil at seeing 300+ commits with absolutely 0 useful commit messages. Checking the difference history and seeing that I was literally editing the text files one typo at a time&amp;hellip; it hurts.&lt;/p&gt;
&lt;p&gt;I really started properly using Git (and GitHub) in summer of 2023. While I created my &lt;a href=&#34;https://github.com/davidvogelxyz&#34;&gt;@davidvogelxyz&lt;/a&gt; account in June 2023, it took a few months for me to start using it. However, after learning more from thePrimeagen, especially from his &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/theprimeagen-dsa-course&#34;&gt;Data Structures and Algorithms course&lt;/a&gt;, I realized it was high time for me to learn how to use Git in a more intelligent way.&lt;/p&gt;
&lt;p&gt;And, I&amp;rsquo;m really glad that I did. It has been, by far, the most useful tool that I&amp;rsquo;ve learned to use thus far.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://davidvogel.xyz/images/git-comic.png&#34;&gt;&lt;img src=&#34;https://davidvogel.xyz/images/git-comic.png&#34; alt=&#34;Git comic&#34; title=&#34;Git comic&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;beginning-to-git-good&#34;&gt;Beginning to &amp;ldquo;Git&amp;rdquo; Good&lt;/h3&gt;
&lt;p&gt;There were tons of resources on YouTube that I remember using to start to learn Git: a couple of channels include Chris Titus Tech and Fireship. Some of those videos are embedded below. With my &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/kinesis&#34;&gt;new keyboard&lt;/a&gt; assisting me, I consumed tons of content on Git, and came up with some projects that would allow me to test out what I learned. More on those in a bit.&lt;/p&gt;
&lt;p&gt;While my Git skills have developed massively since this period, I was starting from zero. Therefore, my focus was on the small things. I began to learn how to make useful commit messages. I leveraged what I knew about GPG keys to make sure I was always signing commit messages with a GPG key. I moved away from editing files in the browser, in favor of using Vim and the terminal to make changes. After committing those changes, I learned how to push changes to the remote repository. These were small steps, I know. But, it was progress.&lt;/p&gt;
&lt;p&gt;I also started to develop a deeper appreciation for good documentation. Instead of badly formatted text files, I was writing up guides to projects I was working on using Markdown, compiling them into a repository I called the &lt;a href=&#34;https://github.com/davidvogelxyz/library&#34;&gt;Library&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I began to notice that any project I worked on usually involved three different sources of information: one that I got 85% of the knowledge from, one that was 12%, and a final one that was the remaining 3%. While I could almost always find the 85% again, and usually find the 12%, it was incredible how often I would fail to bookmark the 3% tip that would fix some issue that I was struggling with. Instead of trying to dig through pages of search results to find it again, I began to write my own comprehensive guides, so that I could use that &amp;ldquo;single source of truth&amp;rdquo; going forward, knowing that it had all the information I needed. It didn&amp;rsquo;t matter to me if no one else ever used them; it was good for me to start working on building and maintaining my own work.&lt;/p&gt;
&lt;p&gt;Git is a version control software, and it is definitely the main attraction. Having the ability to manage only one set of files (rather than multiple copies of the same files, differentiated by timestamps), but also the ability to look back at previous versions, was an incredible benefit. It also allowed me to easily peer back at the previous state of my work, which made it easier than ever for me to appreciate my growth over time. More than ever before, I had a tool that enabled me to visualize the progress I was making. And that felt really good.&lt;/p&gt;
&lt;p&gt;After watching those videos over the course of a day or two, I decided that the best way to gain some skill with Git was to work on a few projects that would force me to use Git properly. The two primary ones from this period of time were:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://davidvogel.xyz/home-lab/other/debian-dwm&#34;&gt;debian-dwm&lt;/a&gt; - Any time I installed an Arch/Artix Linux desktop, I was using LARBS. I was a huge fan. However, I was using my &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/proxmox&#34;&gt;Proxmox&lt;/a&gt; to spin up a bunch of Debian VMs over the summer, and I wanted a way to automate the process of installing the tiling window manager &lt;code&gt;dwm&lt;/code&gt; onto those machines. So, I wrote an installer, inspired by LARBS, that would do exactly that.
&lt;ul&gt;
&lt;li&gt;Link to the &lt;a href=&#34;https://github.com/davidvogelxyz/debian-dwm&#34;&gt;debian-dwm&lt;/a&gt; project on GitHub&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://davidvogel.xyz/home-lab/other/neovim&#34;&gt;Neovim config files&lt;/a&gt; - While I had studied the art of Vim under Vim Diesel (Luke Smith), I was approaching a point of stagnation by using someone else&amp;rsquo;s Neovim config files. Therefore, assisted by a video by thePrimeagen, I decided to write my own config files.
&lt;ul&gt;
&lt;li&gt;Link to my &lt;a href=&#34;https://github.com/davidvogelxyz/nvim&#34;&gt;Neovim config files&lt;/a&gt; on GitHub&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;helpful-videos&#34;&gt;Helpful Videos&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes1hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/v_1iqtOnUMg&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;How to Use GitHub&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes2hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/ecK3EnyGD8o&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;13 Advanced (but useful) Git Techniques and Shortcuts&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
</description>
	</item>
	
	<item>
		<title>Kinesis Keyboard: Typing Without Pain</title>
		<link>https://davidvogel.xyz/home-lab/other/kinesis/</link>
		<pubDate>Mon, 21 Aug 2023 22:24:38 -0400</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/other/kinesis/</guid>
		<description>



&lt;p&gt;This article was written in 2024, looking back at my previous &lt;a href=&#34;https://davidvogel.xyz/home-lab/&#34;&gt;home lab projects&lt;/a&gt; and where my journey into IT began.&lt;/p&gt;




&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/&#34; id=&#34;tag_other&#34;&gt;Other Projects&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/kinesis-banner.png&#34; alt=&#34;Kinesis banner&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;a-better-way-to-type&#34;&gt;A Better Way to Type&lt;/h2&gt;
&lt;p&gt;Coming off the heels of &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/theprimeagen-dsa-course&#34;&gt;thePrimeagen&amp;rsquo;s Data Structures and Algorithms course&lt;/a&gt;, I was experiencing some major wrist pains from writing TypeScript code on a laptop keyboard for 20 hours of the past week. I realized that I would need to do something (and fast) in order to solve the problem, if this was a path I wanted to pursure. However, the solution was right in front of me, even if it was a bit expensive: the Kinesis Advantage360 keyboard.&lt;/p&gt;
&lt;p&gt;I had seen Prime using the Kinesis keyboard throughout the Data Structures and Algorithms (DSA) course, and I knew from other videos of his that he was a huge fan of his keyboard. Since I had already started to feel pain in my wrists from only a week of coding, I decided to take the plunge and get myself one too.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/kinesis-advantage360.jpg&#34; alt=&#34;Kinesis Advantage360&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;An image of the Kinesis Advantage360 keyboard.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It was an absolute game-changer. It wasn&amp;rsquo;t without some growing pains&amp;hellip; but, at least the wrist pains were gone.&lt;/p&gt;
&lt;p&gt;I ordered the keyboard the weekend after taking Prime&amp;rsquo;s DSA course, and it arrived the following Monday. I excitedly unboxed the keyboard, cleared it off my desk, and admired it for a few minutes before plugging it in and testing how it felt. I pulled up &lt;a href=&#34;https://monkeytype.com&#34;&gt;MonkeyType&lt;/a&gt; and started doing some typing tests. I was amazed. Where I had been able to type at ~100 words per minute (WPM) on my conventional mechanical keyboard, I was now typing at a record&amp;hellip; 3 WPM.&lt;/p&gt;
&lt;p&gt;I was &lt;em&gt;shook&lt;/em&gt;. Was this a skill issue, or was it the keyboard? I tried out some more typing tests. Thankfully, I started seeing some improvements after a few minutes. 3 WPM became 4 WPM, 4 WPM became 6 WPM, and it wasn&amp;rsquo;t long before I was back at a mighty 10 WPM. Clearly, it was going to take more effort than I had expected to get use to the keyboard. After a few hours of typing tests, I started to approach 60 WPM. Not my fastest, but I was getting the hang of the keyboard.&lt;/p&gt;
&lt;h3 id=&#34;the-benefits-of-using-a-kinesis-keyboard&#34;&gt;The Benefits of Using a Kinesis Keyboard&lt;/h3&gt;
&lt;p&gt;While I&amp;rsquo;m back to my previous highs of 100 WPM, and I&amp;rsquo;m grateful for all the changes I had to get use to, I didn&amp;rsquo;t realize that it would take a day or two (up to a week) to get used to them. The benefits of the curved and orthogonal keys are unmatched; but, early on, I found myself attempting to move my fingers in ways that I no longer needed. In addition, I no longer have to use my weakest fingers to reach out for curly braces (&amp;quot;{ }&amp;quot;) and brackets (&amp;quot;[ ]&amp;quot;), as they&amp;rsquo;re found just below the comma and period keys. This has resulted in a far more comfortable experience when writing code. I also like that I get to use my thumbs to access keys like Ctrl, Alt, and the Super (Windows) key, which means I can utilize my window manager (DWM) with far less strain than I would with a regular keyboard.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s been most interesting about the experience has been going back to conventional-style keyboard, like I do when I use a laptop from time to time. I really haven&amp;rsquo;t seen much of a slow-down coming back to regular keyboards, as I can still hit numbers in the high 90s (WPM). The only difference is: I know what I&amp;rsquo;m missing, and I&amp;rsquo;ll long to get back to my Kinesis keyboard as soon as possible. And, that&amp;rsquo;s because using a Kinesis keyboard really has been such an improvement to my work flow. I really didn&amp;rsquo;t think it would make such an outsized difference in the typing experience, but it has.&lt;/p&gt;
&lt;p&gt;The only other thing I&amp;rsquo;d mention in this article is this: while I only heard thePrimeagen say this &lt;em&gt;after&lt;/em&gt; I purchased the keyboard, it&amp;rsquo;s stuck with me ever since. As I can&amp;rsquo;t find the clip where he said it, I&amp;rsquo;ll paraphrase: &amp;ldquo;don&amp;rsquo;t wait until you start having wrist issues to get a fix implemented.&amp;rdquo; I find it astonishing that I started to have wrist pains after only a week of attempting to code on a laptop keyboard. In contrast, I have spent many hundreds, if not thousands, of hours typing on the Kinesis keyboards since purchasing my first one in August 2023. Not once since then have I experienced any sort of discomfort while typing. Not only are my wrists saved, but by using a split keyboard, I&amp;rsquo;m also sitting up straighter as I type, which has helped my posture immensely.&lt;/p&gt;
&lt;p&gt;It really has been a game-changer.&lt;/p&gt;
&lt;h2 id=&#34;helpful-videos&#34;&gt;Helpful Videos&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes1hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/nh-BAxbithc&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;Unboxing A New Keyboard!!! (Typing Test Too!)&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
</description>
	</item>
	
	<item>
		<title>Learning Data Structures and Algorithms with thePrimeagen</title>
		<link>https://davidvogel.xyz/home-lab/other/theprimeagen-dsa-course/</link>
		<pubDate>Fri, 18 Aug 2023 22:24:38 -0400</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/other/theprimeagen-dsa-course/</guid>
		<description>



&lt;p&gt;This article was written in 2024, looking back at my previous &lt;a href=&#34;https://davidvogel.xyz/home-lab/&#34;&gt;home lab projects&lt;/a&gt; and where my journey into IT began.&lt;/p&gt;




&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/&#34; id=&#34;tag_other&#34;&gt;Other Projects&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/frontendmasters-banner.png&#34; alt=&#34;Frontend Masters banner&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;This article describes what it was like taking thePrimeagen&amp;rsquo;s Frontend Masters course on Data Structures and Algorithms. In order to best learn the course material, I followed along and manually typed out the same algorithms, in TypeScript, that were taught in the course. Those algorithms can be found on my GitHub in the &lt;a href=&#34;https://github.com/davidvogelxyz/typescript-collection&#34;&gt;TypeScript collection&lt;/a&gt; repository.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;deciding-to-learn-some-programming&#34;&gt;Deciding to Learn Some Programming&lt;/h2&gt;
&lt;p&gt;During the end of July 2023 and into August, I began to watch YouTube videos by a Twitch streamer by the name of &amp;ldquo;&lt;a href=&#34;https://www.youtube.com/@ThePrimeagen&#34;&gt;thePrimeagen&lt;/a&gt;&amp;rdquo;. His content seriously caught my attention, if for no other reason than he was an avid Vim user, whose skills greatly surpassed mine. Maybe it was his use of coconut oil; I wasn&amp;rsquo;t sure. But, I felt that I could learn a lot by watching him work.&lt;/p&gt;
&lt;p&gt;I was wrapping up my free trial experience with &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/hackthebox&#34;&gt;HackTheBox&lt;/a&gt;, and getting ready to put down $15/month in order to get access to the full platform, when I came across thePrimeagen&amp;rsquo;s Data Structures and Algorithms course on Frontend Masters. It was appropriately named &amp;ldquo;The Last Algorithms Course You&amp;rsquo;ll Need&amp;rdquo;. I was sold. As someone who had been working on some basic Bash scripts over the past few months and had a very basic understanding of programming, I felt like this course might be a great place to learn the foundations of computer science.&lt;/p&gt;
&lt;p&gt;My interest in learning how to code had also been accelerated by the HackTheBox experience. I was getting frustrated with myself for having such a limited understanding of some of the tools that I used for penetration testing. I wanted to get to the next level, where I might be able to start building useful tools for myself. Plus, if I completed thePrimeagen&amp;rsquo;s algorithms course quickly, I could use my remaining month with Frontend Masters to take some other courses. And, worst case scenario, I could always revisit HackTheBox in September once my membership had expired.&lt;/p&gt;
&lt;h3 id=&#34;taking-the-course&#34;&gt;Taking the Course&lt;/h3&gt;
&lt;p&gt;I started taking thePrimagen&amp;rsquo;s course on August 14th, the Monday after the Friday that I finished the HackTheBox free tier. I was extremely excited for the course, as Prime brought an energy to teaching that I had sparingly encountered. However, I was not prepared for what I had gotten myself into&amp;hellip;&lt;/p&gt;
&lt;p&gt;I wasn&amp;rsquo;t prepared for a handful of reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I had never really done any coding before.
&lt;ul&gt;
&lt;li&gt;While I had some experience with Bash from the scripting I had been doing, my scripts were incredibly basic at this time. Essentially, they were just a series of commands that were being done in succession. I hadn&amp;rsquo;t even written a &amp;ldquo;for loop&amp;rdquo; before!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I had never seen any JavaScript code before, much less TypeScript.
&lt;ul&gt;
&lt;li&gt;I was able to follow along with what was going on, simply because I had been working for the past year on reading source code for Bash scripts, etc. However, I didn&amp;rsquo;t have any experience with JS/TS, and so there were operations that were being performed that I didn&amp;rsquo;t understand without pausing the lectures and looking up documentation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;There was a lot of terminology that I had never encountered before.
&lt;ul&gt;
&lt;li&gt;Similarly to the coding language being used in the course, there was a lot that I hadn&amp;rsquo;t seen before. There were many times throughout the course that I chose to stop and look up the things I didn&amp;rsquo;t know, so I could make the most of the learning experience.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;My wrists hurt. A lot.
&lt;ul&gt;
&lt;li&gt;Erroneously, I decided to take the course by casting the lectures to my TV and working with Prime by using a laptop. After a 10 hour course that required an additional 10 hours of work as I followed along, typing out every algorithm that he used, I started to get incredible wrist pains, especially from trying to hit all of the curly braces (&amp;quot;{ }&amp;quot;) with my ring and pinky fingers. More on this in a bit.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;However, I was also more prepared than I thought I&amp;rsquo;d be. For someone with only a basic understanding of programming, I realized that the work I had put into Linux and Bash were working in my favor. I may not have been able to intuit everything Prime was teaching, but I could read the code, and I was able to complete the course despite having to look things up. I was also reminded of a YouTuber named Presh Talwalker, who ran a channel called &amp;ldquo;Mind Your Decisions&amp;rdquo;. On this channel, Presh would give some difficult math and logic problems, and then demonstrate how to solve them. Watching some of his videos had definitely prepped me for Prime&amp;rsquo;s course, as many of the algorithms he taught allowed the students to solve problems similar to the ones on Presh&amp;rsquo;s channel. Not only were the problems similar, but I was learning to solve them using code!&lt;/p&gt;
&lt;p&gt;An example of a logic problem that was solved with an elegant solution was dubbed the &amp;ldquo;Two Crystal Balls&amp;rdquo; problem. The context for the problem was this: the student was given two crystal balls, from which we needed to find the height from which the ball would break. Obviously, we could just drop the first ball from &lt;code&gt;n=1&lt;/code&gt;, and iterate up until the ball broke. Then, we&amp;rsquo;d have the answer! However, this solution would take O(n) (O of &amp;ldquo;n&amp;rdquo;) time to solve. The more efficient way to solve the problem was to utilize both balls. How? We could drop the ball from multiple of the square root of the highest point (100). Once the ball broke, we could use the second ball to iterate by one, starting from the last point of non-breakage, until we found the height at which the balls would break. Solving the problem in this way would only take O(log(n)) (O of log(n)) time.&lt;/p&gt;
&lt;p&gt;I found learning to solve problems like this fascinating, and learning how to utilize different algorithms and concepts to solve problems more efficiently has yielded tons of benefits to me (most of which would only reveal themselves later into the future). I was enjoying the content so much, that I powered through the entire course in less than a week &amp;ndash; starting on Monday the 14th, I had completed the entire course by Friday, August 18th.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://davidvogel.xyz/images/typescript-stack.png&#34;&gt;&lt;img src=&#34;https://davidvogel.xyz/images/typescript-stack.png&#34; alt=&#34;TypeScript - Stack&#34; title=&#34;TypeScript - Stack&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;An image of some TypeScript code that was written as I worked through thePrimeagen&amp;rsquo;s DSA course. Specifically, this was an implementation of a data structure called a &amp;ldquo;stack&amp;rdquo;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In the course, I also learned algorithms and concepts such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linear search&lt;/li&gt;
&lt;li&gt;Binary search&lt;/li&gt;
&lt;li&gt;Bubble sort&lt;/li&gt;
&lt;li&gt;Queues and stacks&lt;/li&gt;
&lt;li&gt;Arrays and linked lists&lt;/li&gt;
&lt;li&gt;Quicksort&lt;/li&gt;
&lt;li&gt;Tree traversal
&lt;ul&gt;
&lt;li&gt;Depth first traversal&lt;/li&gt;
&lt;li&gt;Breadth first traversal&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Binary search tree&lt;/li&gt;
&lt;li&gt;Heaps&lt;/li&gt;
&lt;li&gt;Graphs&lt;/li&gt;
&lt;li&gt;Dijkstra&amp;rsquo;s shortest path&lt;/li&gt;
&lt;li&gt;Maps&lt;/li&gt;
&lt;li&gt;LRU caching&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;the-aftermath&#34;&gt;The Aftermath&lt;/h3&gt;
&lt;p&gt;After completing Prime&amp;rsquo;s algorithm course, and deriving a ton of value from it, I decided that it might be worth my while to learn a programming language and go deeper into coding. I hadn&amp;rsquo;t yet figured out which language I would choose. Right after the course ended, I thought it might be JavaScript or TypeScript. After taking an intro course to Python with my remaining Frontend Masters membership, I decided that it &lt;em&gt;wouldn&amp;rsquo;t&lt;/em&gt; be Python; mainly, because I noticed that I could code in Python without too deep of an understanding of the concepts I had just learned about from Prime&amp;rsquo;s course. I wanted a language that would allow (nay, &lt;em&gt;force&lt;/em&gt;) me to continue to develop my understanding of computer science. I wouldn&amp;rsquo;t figure it out for a few months, but I eventually chose &lt;a href=&#34;&#34;&gt;Rust&lt;/a&gt; as my first programming language.&lt;/p&gt;
&lt;p&gt;However, more immediately, I resolved to make a few changes to how I did things. First, if I was to continue to learn to code and do the things I had been doing, I would need to figure out this keyboard situation. After watching Prime use a Kinesis keyboard throughout the course, I decided to &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/kinesis&#34;&gt;get my own&lt;/a&gt;. I also made the decision to &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/git&#34;&gt;learn how to use &lt;code&gt;git&lt;/code&gt; properly&lt;/a&gt;. With the combination of the Kinesis keyboard and a better understanding of &lt;code&gt;git&lt;/code&gt;, I would also spend the next few weeks working on two major projects: &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/debian-dwm&#34;&gt;creating &lt;code&gt;debian-dwm&lt;/code&gt;&lt;/a&gt;, a version of Luke Smith&amp;rsquo;s LARBS that would install DWM onto Debian computers, and &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/neovim&#34;&gt;building my own Neovim configuration files from scratch&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;video-preview-of-the-course&#34;&gt;Video Preview of the Course&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes1hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/Lwr3-doAgaI&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;The Last Algorithms Course You&amp;#39;ll Need by ThePrimeagen - Preview&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
</description>
	</item>
	
	<item>
		<title>HackTheBox: Learning Penetration Testing</title>
		<link>https://davidvogel.xyz/home-lab/other/hackthebox/</link>
		<pubDate>Fri, 11 Aug 2023 22:24:38 -0400</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/other/hackthebox/</guid>
		<description>



&lt;p&gt;This article was written in 2024, looking back at my previous &lt;a href=&#34;https://davidvogel.xyz/home-lab/&#34;&gt;home lab projects&lt;/a&gt; and where my journey into IT began.&lt;/p&gt;




&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/&#34; id=&#34;tag_other&#34;&gt;Other Projects&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/hackthebox-banner.png&#34; alt=&#34;HackTheBox banner&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;hacking-the-box-ethically-of-course&#34;&gt;Hacking the Box (ethically, of course)&lt;/h2&gt;
&lt;p&gt;Throughout the summer of 2023, I was working on improving my Linux and IT skills. I had built a &lt;a href=&#34;https://davidvogel.xyz/home-lab/services/web-server&#34;&gt;webpage and e-mail server&lt;/a&gt;, deployed a &lt;a href=&#34;https://davidvogel.xyz/home-lab/services/nextcloud-docker&#34;&gt;Nextcloud instance using Docker&lt;/a&gt;, and even messed around with &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/nixos&#34;&gt;NixOS&lt;/a&gt;. I was putting hours of my day, every day, into this process. While this was a fun and engaging process, I also sought out downtime here and there. But, I also wanted my downtime to at least be &amp;ldquo;somewhat productive.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I settled on finding a &amp;ldquo;hacking game&amp;rdquo; to play &amp;ndash; something that would help me learn about the Linux command line interface (CLI), while also being fun. I found a few games, including &lt;a href=&#34;https://store.steampowered.com/app/504210/SHENZHEN_IO/&#34;&gt;Shenzhen I/O&lt;/a&gt; and &lt;a href=&#34;https://store.steampowered.com/app/365450/Hacknet/&#34;&gt;Hacknet&lt;/a&gt;. While playing through the first hour of Hacknet, I realized that it was &lt;em&gt;at best&lt;/em&gt; a facsimile of the actual CLI experience; it wasn&amp;rsquo;t going to teach me much, but it was going to approximate the experience. But, I thought, &amp;ldquo;why play a game on a pseudo-Linux CLI when I could learn stuff that actually uses the Linux CLI?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Around the same time, I watched yet &lt;a href=&#34;https://www.youtube.com/watch?v=uTAaFExLgwQ&#34;&gt;another NetworkChuck video&lt;/a&gt; or two, where he mentioned a platform called &lt;a href=&#34;https://hackthebox.com&#34;&gt;HackTheBox&lt;/a&gt;. It was exactly what I was looking for. Instead of playing a game that &amp;ldquo;mimicked&amp;rdquo; hacking, and wasting valuable time, I could instead divert my attention to something that would provide value to a future career in IT and system administration. Not only would learning basic penetration testing provide value, but it would also develop skills that could translate into the real world. If my future involved &amp;ldquo;white hat hacking&amp;rdquo;, then I would learn how to penetrate Linux systems; if my future involved cyber-security or system administration, then I would learn what types of attacks were possible, and I could start thinking of ways to better secure servers.&lt;/p&gt;
&lt;p&gt;So, I spun up a free HackTheBox account and started my journey. I started with the &amp;ldquo;Starting Points&amp;rdquo; section, which claimed that it would teach me the &amp;ldquo;basics of penetration testing.&amp;rdquo; I learned how to connect to &lt;code&gt;FTP&lt;/code&gt;, &lt;code&gt;SMB&lt;/code&gt;, &lt;code&gt;telnet&lt;/code&gt;, &lt;code&gt;rsync&lt;/code&gt;, and &lt;code&gt;RDP&lt;/code&gt; anonymously; used &lt;code&gt;nmap&lt;/code&gt; to identify open ports, and broke into a MongoDB server. Then, I continued on, and learned how to perform SQL injections, server-side template injection, remote file inclusion, and how to perform attacks using remote SSH shells. I also learned how to use privilege escalation, perform cookie manipulation, brute force passwords with john the ripper, and exploited some LXD containers to gain access to privileged file systems. I was so engrossed with what I was learning, I completed all of the roughly 15 free VM targets in about a day or so &amp;ndash; I started on Thursday afternoon, and had exhausted the free tier by Friday evening.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://davidvogel.xyz/images/hackthebox.png&#34;&gt;&lt;img src=&#34;https://davidvogel.xyz/images/hackthebox.png&#34; alt=&#34;HacktheBox&#34; title=&#34;HacktheBox&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;An image of the &amp;ldquo;HacktheBox - Starting Points - Tier 2&amp;rdquo; dashboard, with a short overview of the activities in this section.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;pwning-hackthebox&#34;&gt;Pwning HackTheBox&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;As a note: I have since learned a few things about the platform. HackTheBox (HTB) Labs is the part of the website that gives access to the &amp;ldquo;Starting Points&amp;rdquo; educational boxes. In addition, a &amp;ldquo;free user&amp;rdquo; is usually limited by the 2 hour time limit on the free-to-use &amp;ldquo;pwnboxes&amp;rdquo; &amp;ndash; I was able to maximize my use of the free tier by leveraging my Proxmox and VMs.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Not only did I power through the free tier, but I did so utilizing skills I had been building over the past 6 months. While I could have used the freely provided &amp;ldquo;pwnbox&amp;rdquo; VMs, I instead opted to use my own VM through my &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/proxmox&#34;&gt;Proxmox&lt;/a&gt; to complete the &amp;ldquo;Starting Points&amp;rdquo; course. Where I could have installed &amp;ldquo;Kali Linux&amp;rdquo; to a VM, to have all of these hacking tools readily available, I instead opted to use a Debian VM I had created, running &lt;code&gt;dwm&lt;/code&gt;. This meant that I had to go out and install all of the different packages I needed myself. And, it resulted in me learning more about the tools I would use than I would have if I had them pre-installed on the VM. I remember using &lt;code&gt;nmap&lt;/code&gt; to query a server&amp;rsquo;s open ports, &lt;code&gt;hashcat&lt;/code&gt; to crack password hashes, and &lt;code&gt;tcpdump&lt;/code&gt; to intercept network traffic. While some of the packages were available in the Debian package repos, there were also tools that I could only acquire by cloning down &lt;code&gt;git&lt;/code&gt; repositories and building the software from source code, something I had rarely done before this point. Going through the HackTheBox course material improved my skills in far more ways than just &amp;ldquo;penetration testing.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Once I completed the free tier of HackTheBox, I seriously considered shelling out $15 for a month&amp;rsquo;s subscription to gain access to the gated content. While I didn&amp;rsquo;t end up doing this, it was only for a few main reasons.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The free VMs that were part of the &amp;ldquo;Starting Points&amp;rdquo; course were very structured.
&lt;ul&gt;
&lt;li&gt;While there were more &amp;ldquo;Starting Points&amp;rdquo; VMs to hack, I would soon complete those too. Then, I would have access to a myriad of boxes that were far less structured. It would quickly become a test of &amp;ldquo;use the skills you&amp;rsquo;ve learned, and be creative.&amp;rdquo; While there was tons of merit to continuing on, I decided that I wanted to only spend the $15 if I was going to seriously commit to an hour or two of HackTheBox per day, and I wasn&amp;rsquo;t ready to do that.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I decided to go down a different path. In late July and early August, I had come across on YouTube a programmer and streamer by the name of &amp;ldquo;&lt;a href=&#34;https://www.youtube.com/@ThePrimeagen&#34;&gt;thePrimeagen&lt;/a&gt;&amp;rdquo;. I enjoyed his content greatly, and his videos started to plant a seed in my head - maybe I should consider learning more about coding. In particular, I had discovered that he had a &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/theprimeagen-dsa-course&#34;&gt;data structures and algorithms course on Frontend Masters&lt;/a&gt;, and that I could access that course for a $39 monthly subscription. Instead of putting the $15 towards HackTheBox, I decided to pursue a Frontend Masters subscription, with an expectation that I would eventually return to HackTheBox when I was done.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;helpful-videos&#34;&gt;Helpful Videos&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes1hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/uTAaFExLgwQ&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;the hacker’s roadmap (how to get started in IT in 2023)&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes2hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/4CJMpZfK1rI&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;hack the box&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
</description>
	</item>
	
	<item>
		<title>NixOS: Declarative Configuration Systems</title>
		<link>https://davidvogel.xyz/home-lab/other/nixos/</link>
		<pubDate>Tue, 11 Jul 2023 22:24:38 -0400</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/other/nixos/</guid>
		<description>



&lt;p&gt;This article was written in 2024, looking back at my previous &lt;a href=&#34;https://davidvogel.xyz/home-lab/&#34;&gt;home lab projects&lt;/a&gt; and where my journey into IT began.&lt;/p&gt;




&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/&#34; id=&#34;tag_other&#34;&gt;Other Projects&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/nixos-banner.png&#34; alt=&#34;NixOS banner&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;running-nixos&#34;&gt;Running NixOS&lt;/h2&gt;
&lt;p&gt;After getting my &lt;a href=&#34;https://davidvogel.xyz/home-lab/services/web-server&#34;&gt;website and e-mail server&lt;/a&gt; set up, and after trying out &lt;a href=&#34;https://davidvogel.xyz/home-lab/services/nextcloud-docker&#34;&gt;Nextcloud through a Docker container&lt;/a&gt;, I was looking for other ways to expand my Linux knowledge. I had already come to the conclusion that distro-hopping was largely a waste of time. I ran Arch (specifically, Artix) for my main desktop PC, and I used Debian (no longer Ubuntu) for all of my server projects. Beyond this, I felt that other Linux distributions were just &amp;ldquo;variations on themes&amp;rdquo; &amp;ndash; a few configurations might be changed here and there, but nothing was ever substantially different. If I wanted to see real variation, I could just install a different desktop environment (DE) onto a Debian or Arch VM and test that out.&lt;/p&gt;
&lt;p&gt;However, this all changed when I found out about NixOS, thanks primarily to Chris Titus Tech&amp;rsquo;s videos on his testing of NixOS.&lt;/p&gt;
&lt;p&gt;NixOS is a Linux distribution that is more than just its eponymous package manager, Nix. It is an Linux distribution that focuses on state-based configurations, using an immutable design and declarative configuration. In more simple words, it was an operating system that allowed the user to configure the system using one configuration file, and this file would allow a user to deploy a fresh install of NixOS and have a perfect reproduction of another system. This is incredibly cool, and has many utilities when it comes to deploying multiple identical Linux machines.&lt;/p&gt;
&lt;p&gt;Specifically, I saw a &lt;a href=&#34;https://www.youtube.com/watch?v=fuWPuJZ9NcU&#34;&gt;Chris Titus video from mid-June 2023&lt;/a&gt; that discussed the utility of NixOS in a corporate environment, because of Nix&amp;rsquo;s state-based configurations. The last time I had heard someone say that (re: &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/proxmox&#34;&gt;Proxmox&lt;/a&gt;), I jumped on the opportunity to learn and benefitted greatly. Would NixOS be another Proxmox in terms of the value I would derive from it?&lt;/p&gt;
&lt;p&gt;I had to find out.&lt;/p&gt;
&lt;p&gt;While my stint with NixOS wasn&amp;rsquo;t longer than a few weeks, I was able to successfully configure a fresh &amp;ldquo;configuration.nix&amp;rdquo; file that implemented &lt;code&gt;dwm&lt;/code&gt; as the window manager, as well as my &lt;code&gt;zsh&lt;/code&gt; config files.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://davidvogel.xyz/images/nixos-neofetch.png&#34;&gt;&lt;img src=&#34;https://davidvogel.xyz/images/nixos-neofetch.png&#34; alt=&#34;NixOS - Neofetch&#34; title=&#34;NixOS - Neofetch&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;An image of a &lt;code&gt;neofetch&lt;/code&gt; output on a NixOS VM running DWM.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;beginning-to-appreciate-git&#34;&gt;Beginning to Appreciate Git&lt;/h3&gt;
&lt;p&gt;One thing I will note is that this was one of the first instances where I began to appreciate the value of &lt;code&gt;git&lt;/code&gt;, and separately GitHub. Part of the fun of NixOS is being able to completely delete a VM and reinstall NixOS from scratch, while retaining all the progress I made by using a configuration file. However, in order to do that, I would need an easy way to access that configuration file. This is where GitHub began to play a role. GitHub allowed me to upload my configuration file to a publicly hosted repository, which made using &lt;code&gt;curl&lt;/code&gt; to download that configuration file during install incredibly easy. On top of that, by using &lt;code&gt;git&lt;/code&gt;, I now had a way to track any changes I made during the process.&lt;/p&gt;
&lt;p&gt;Didn&amp;rsquo;t like something that I did? Changing a line broke my system? I could just roll back the changes to a previous commit and keep going as if nothing had happened. This was very useful, and I was only beginning to scratch the surface of that utility.&lt;/p&gt;
&lt;h3 id=&#34;the-inception-of-dwm-install-scripts&#34;&gt;The Inception of DWM Install Scripts&lt;/h3&gt;
&lt;p&gt;Another note worth mentioning is that, between spinning up a bunch of Debian VMs on my local &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/proxmox&#34;&gt;Proxmox&lt;/a&gt;, and now creating a NixOS VM, I was hitting a phase where I was getting tired of doing &amp;ldquo;the same work over and over again.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Because of my appreciation for how efficiently I was using LARBS on my &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/desktop&#34;&gt;desktop&lt;/a&gt;, I figured out how to get &lt;code&gt;dwm&lt;/code&gt; working on Debian, as well as on this NixOS VM, and I wanted to make future deployments simple and quick. So, in combination with beginning to learn about and appreciate &lt;code&gt;git&lt;/code&gt;, I started working on scripts that I could use to quickly install &lt;code&gt;dwm&lt;/code&gt; to VMs, without having to manually enter commands. While those adventures will be detailed in a future article, I was beginning to write those preliminary scripts in late July and early August of 2023, and was using them in conjunction with my &amp;ldquo;configuration.nix&amp;rdquo; file. This allowed me to use a NixOS VM, test out some new features, tear it down, and then use both my &amp;ldquo;configuration.nix&amp;rdquo; file and my &lt;code&gt;dwm&lt;/code&gt; scripts in order to get everything back in working order. While I could have improved the reproducibility of my NixOS experience by using &lt;code&gt;home-manager&lt;/code&gt;, I was beginning to get more proficient with different Linux distributions and learning how to troubleshoot issues that would arise.&lt;/p&gt;
&lt;h3 id=&#34;troubleshooting-nixos&#34;&gt;Troubleshooting NixOS&lt;/h3&gt;
&lt;p&gt;My initial attempts at NixOS, and specifically getting &lt;code&gt;dwm&lt;/code&gt; and &lt;code&gt;dwmblocks&lt;/code&gt; working correctly, came with a bunch of obstacles to overcome. I probably could have used &lt;code&gt;home-manager&lt;/code&gt; to resolve some of these issues, but I was focused on making things more difficult than they had to be by configuring everything the way I was used to.&lt;/p&gt;
&lt;p&gt;While I was able to get &lt;code&gt;dwm&lt;/code&gt; working rather quickly, I spent a decent amount of time attempting to get &lt;code&gt;dwmblocks&lt;/code&gt; to display correctly. Even when I did, I had a lot of trouble getting the bar&amp;rsquo;s objects to be clickable. I&amp;rsquo;m writing this article after the fact (and after having deleted my NixOS VM in favor of a fresh start), but I don&amp;rsquo;t recall ever getting the bar to work as it does on Arch and Debian.&lt;/p&gt;
&lt;p&gt;Another piece that required many iterations was getting an optimized &amp;ldquo;configuration.nix&amp;rdquo; file. Back during the summer of 2023, my coding and scripting skills were minimal. I could parse a NixOS configuration file, but I ran into some issues while writing my own. Piecing together a working config file required trial and error, and I redeployed the NixOS VM a handful of times as I figured out what worked and what didn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;The only reason why I didn&amp;rsquo;t continue further with NixOS was because I set my sights on a new target: &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/hackthebox&#34;&gt;learning penetration testing with HackTheBox&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;fresh-install---tips-and-tricks&#34;&gt;Fresh Install - Tips and Tricks&lt;/h2&gt;
&lt;p&gt;While it took me a handful of days to get my &amp;ldquo;configuration.nix&amp;rdquo; file working correctly, the benefit of NixOS is that a fresh install is incredibly easy when using a previously configured installation. I would simply use the file I created, which can be found on my &lt;a href=&#34;https://github.com/davidvogelxyz/nixos&#34;&gt;GitHub&lt;/a&gt;, and run:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;nixos-rebuild switch
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A fresh configuration is mostly similar. Boot into an installation media (ISO burned onto a USB drive), do the same partitioning and file system creation done for any Linux distribution, mount the drives, and then run:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;nixos-generate-config --root /mnt
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Configure the file found at &amp;ldquo;/mnt/etc/nixos/configuration.nix&amp;rdquo;, and then install the OS using:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;nixos-install
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id=&#34;helpful-videos&#34;&gt;Helpful Videos&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes1hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/_Z32SYFbxpw&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;First Time NixOS Install with Customization&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes2hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/IRRtk320j2A&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;NixOS Config - Autologin - Flatpak - Fonts - Polkit - Release Upgrade&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes3hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/1qd0iHadvdo&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;NixOS Fast Reboots with SystemD TimeOut&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes4hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/l7HvMM6rLNE&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;NixOS NFS Mounting&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes5hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/fuWPuJZ9NcU&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;NixOS is Mindblowing&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes6hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/wpS3qIprHL0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;NixOS Gaming Setup and Comparison&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes7hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/NuPKijYukuQ&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;NixOS is NOT for Beginners&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes8hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/Hiwyu7wXB8U&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;NixOS Revisited&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes9hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/8lCgb1xEp8w&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;NixOS Update and Cleanup&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes10hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/T8mY9LhnER4&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;NixOS Home Manager Install&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
</description>
	</item>
	
	<item>
		<title>Nextcloud Cloud Storage, in a Docker container</title>
		<link>https://davidvogel.xyz/home-lab/services/nextcloud-docker/</link>
		<pubDate>Sat, 08 Jul 2023 22:24:38 -0400</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/services/nextcloud-docker/</guid>
		<description>



&lt;p&gt;This article was written in 2024, looking back at my previous &lt;a href=&#34;https://davidvogel.xyz/home-lab/&#34;&gt;home lab projects&lt;/a&gt; and where my journey into IT began.&lt;/p&gt;




&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/services/&#34; id=&#34;tag_services&#34;&gt;Self-hosted Services&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/nextcloud-banner.png&#34; alt=&#34;Nextcloud banner&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;a-personal-secure-open-source-cloud-storage-suite&#34;&gt;A Personal, Secure, Open-Source Cloud Storage Suite&lt;/h2&gt;
&lt;p&gt;Having just completed the &lt;a href=&#34;https://davidvogel.xyz/home-lab/services/web-server&#34;&gt;website and e-mail server&lt;/a&gt; project, I was looking for another project to expand my home-lab. Fortunately, NetworkChuck had just released a video a few weeks before on setting up what is essentially a &amp;ldquo;self-hosted version of Google Cloud.&amp;rdquo; After watching the video, I decided this would be a worthwhile project to work on.&lt;/p&gt;
&lt;p&gt;However, NetworkChuck&amp;rsquo;s video was about using a software called FileCloud, and deploying it on Amazon Web Services (AWS). After my &lt;a href=&#34;https://davidvogel.xyz/home-lab/network/openvpn-aws&#34;&gt;previous experience with AWS&lt;/a&gt;, I chose not to go that route. I also reviewed FileCloud, and decided not to use it, as it wasn&amp;rsquo;t free and open-source software (FOSS).&lt;/p&gt;
&lt;p&gt;Instead, I opted to deploy Nextcloud, a FOSS solution, on Vultr. While I could have also deployed this server on my local &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/proxmox&#34;&gt;Proxmox&lt;/a&gt;, I would have to open up my home network in order to make the service publicly accessible, which was something I didn&amp;rsquo;t want to do. At the time, I didn&amp;rsquo;t know enough about networking and deploying remote SSH tunnels to have known there were other solutions to this problem. While I already had my TrueNAS configured and working, I didn&amp;rsquo;t feel comfortable opening up public access to my private NAS. I wanted something separate from my NAS, that also came with a web UI for easy drag-and-drop access regardless of what computer I was using. As a reference, I had used ProtonDrive in the past, and I was looking for a self-hosted FOSS solution that would mimic the experience I had there.&lt;/p&gt;
&lt;p&gt;So, with my plan in hand, I spun up a Debian VM on Vultr and deployed a Docker container running Nextcloud All-in-One (AIO), using Portainer to make the container management easier. I also purchased a domain to pair with the server, so that I could easily access the server from any VM or computer I used in the future. Given that the Nextcloud documentation specified certain resource usage, but also keeping in mind cost limitations, I decided to roll with a $20/month Vultr VM with 2 CPUs, 4GB RAM, and 80GB storage. I had very little issue with running the Docker container after my &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/docker&#34;&gt;previous experience with Docker&lt;/a&gt;, and I shortly went into the testing phase.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://davidvogel.xyz/images/nextcloud-login.png&#34;&gt;&lt;img src=&#34;https://davidvogel.xyz/images/nextcloud-login.png&#34; alt=&#34;Nextcloud Login&#34; title=&#34;Nextcloud Login&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;An image of the Nextcloud login page, after deploying Nextcloud on a cloud service provider.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This project was interesting, for a bunch of reasons. The primary reason was that this Nextcloud deployment was the first time I ran into a situation where my choice of VM was directly affecting performance. I actually started with a $10/month 1 CPU, 2GB RAM machine, and instantly would have problems with the server crashing when trying to upload files to my shared drive. Even after upgrading to the 4GB RAM version, I was still encountering issues with the web UI locking up if I interacted with it too much. Any of these server issues ended up requiring a server restart. It was incredibly frustrating, and directly impacted my ability to make use of the service I had created.&lt;/p&gt;
&lt;p&gt;Eventually, I realized that I was either going to be paying $20/month for a sub-par experience, or have to upgrade to the $40/month 8GB RAM VM in order to get the performance I was looking for. For the amount of usage I was getting from the deployment, I couldn&amp;rsquo;t justify a $240/year server, and I &lt;em&gt;really&lt;/em&gt; couldn&amp;rsquo;t justify a $480/year server. So, after a month of testing the Nextcloud Docker container, I shut down the server and moved on to other projects. Fortunately, I had one on my radar: testing out &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/nixos&#34;&gt;NixOS&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;helpful-videos&#34;&gt;Helpful Videos&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes1hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/xBIowQ0WaR8&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;build your own cloud&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
</description>
	</item>
	
	<item>
		<title>Web Pages and Mail Servers</title>
		<link>https://davidvogel.xyz/home-lab/services/web-server/</link>
		<pubDate>Thu, 22 Jun 2023 22:24:38 -0400</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/services/web-server/</guid>
		<description>



&lt;p&gt;This article was written in 2024, looking back at my previous &lt;a href=&#34;https://davidvogel.xyz/home-lab/&#34;&gt;home lab projects&lt;/a&gt; and where my journey into IT began.&lt;/p&gt;




&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/services/&#34; id=&#34;tag_services&#34;&gt;Self-hosted Services&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/vultr-banner.png&#34; alt=&#34;Vultr banner&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;For more information on how I would set up a web and SMTP server today, check out &lt;a href=&#34;https://github.com/DavidVogelxyz/library/blob/master/servers/smtp-server-on-debian.md&#34;&gt;my guide on creating a web and SMTP server&lt;/a&gt;, found on my GitHub.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;my-first-web-page&#34;&gt;My first web page&lt;/h2&gt;
&lt;p&gt;This website, &lt;a href=&#34;https://davidvogel.xyz&#34;&gt;davidvogel.xyz&lt;/a&gt;, is a project that I created using Hugo and self-hosted using Vultr.&lt;/p&gt;
&lt;p&gt;After learning how to use Hugo from Luke Smith and his videos (more &lt;a href=&#34;https://davidvogel.xyz/home-lab/services/hugo&#34;&gt;here&lt;/a&gt;), I was excited to create my own webpage to document my journey through the build-out of my home lab. Through the guidance of another of his videos, embedded below, I deployed a VPS on Vultr and bought a domain and built this website.&lt;/p&gt;
&lt;p&gt;At that time, there was only a handful of projects to document, so I got to work writing articles. Through this process, I not only became more comfortable with spinning up servers in the cloud, but I also learned how to do various things, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;configuring DNS records for websites&lt;/li&gt;
&lt;li&gt;create webpage configurations with &lt;code&gt;nginx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;working within &lt;code&gt;vim&lt;/code&gt; (specifically, &lt;code&gt;neovim&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;writing shortcodes for Hugo in Go&lt;/li&gt;
&lt;li&gt;writing articles in Markdown&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;During early summer of 2023, I created articles for all of the projects that I had done up until this point. While my writing has improved over the course of running this website, it was a great experience to document what I had done thus far. I learned how to write documentation in Markdown, which has come in handy as I&amp;rsquo;ve continued to write &lt;a href=&#34;https://github.com/davidvogelxyz/library&#34;&gt;guides for my GitHub&lt;/a&gt;. I started to learn how to code during this time. One of my accomplishments was to create a shortcode that governs the menu found at the top of my website. Another was to write a shortcode that assessed if my articles were older than a certain date, and to add a context blurb explaining that the article was written &amp;ldquo;in the future&amp;rdquo;. I also edited some of the existing shortcodes that controlled the &amp;ldquo;previous&amp;rdquo; and &amp;ldquo;next&amp;rdquo; articles, found at the bottom of most pages. All of this was done in &lt;code&gt;neovim&lt;/code&gt;, which I was beginning to really like as a text editor. I was learning Vim motions, and I no longer felt that &lt;code&gt;nano&lt;/code&gt; was a faster way to get work done. It was a great summer!&lt;/p&gt;
&lt;p&gt;However, I wasn&amp;rsquo;t satisfied with just a webpage. As Luke demonstrates in the video, it was also possible to set up a hosted mail server, such that I could have an e-mail account with my own personal site. I used the installation script that he built to do this too (and had to get permission from Vultr to open the SMTP ports for my server), but I was able to get that working too.&lt;/p&gt;
&lt;p&gt;The more I worked on projects like this, the more I was developing a passion for Linux, and self-hosted servers, and free and open-source software. I wanted to complete even more projects, which is why I quickly jumped into the next one: deploying an instance of &lt;a href=&#34;https://davidvogel.xyz/home-lab/services/nextcloud-docker&#34;&gt;Nextcloud cloud storage&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;fresh-install---tips-and-tricks&#34;&gt;Fresh Install - Tips and Tricks&lt;/h2&gt;
&lt;p&gt;Tips and tricks for setting up a webpage and mail server for the future including the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;watch Luke Smith&amp;rsquo;s video. There are a handful of minor additions I have from my time setting up this webpage, but this is an occasion where the original video is truly the best source of information on how to do it.&lt;/li&gt;
&lt;li&gt;Regarding &lt;code&gt;nginx&lt;/code&gt;, reading documentation on what the server configuration settings actually mean will help in the future with deploying other server projects.&lt;/li&gt;
&lt;li&gt;Regarding &lt;code&gt;vim&lt;/code&gt; and &lt;code&gt;neovim&lt;/code&gt;, I learned the basics from watching videos made by Luke Smith. In particular, he has a &lt;a href=&#34;https://www.youtube.com/watch?v=d8XtNXutVto&#34;&gt;video&lt;/a&gt; where he spends an hour going through &lt;code&gt;vimtutor&lt;/code&gt;. This is an excellent starting point, and gave me a foundation from which to learn how to Vim. More on this in a future article.&lt;/li&gt;
&lt;li&gt;Regarding shortcodes, Luke&amp;rsquo;s video on how to create shortcodes is a great introduction. To go beyond that, read the Go documentation and start learning Go&amp;rsquo;s syntax.&lt;/li&gt;
&lt;li&gt;Regarding Markdown, a quick read-through of the &lt;a href=&#34;https://www.markdownguide.org/getting-started/&#34;&gt;documentation on getting started&lt;/a&gt; will help greatly.
&lt;ul&gt;
&lt;li&gt;I think this is an especially good skill to develop, as being able to write in Markdown has many applications, such as being able to create guides and documentation that can be posted onto GitHub, etc. Many projects support Markdown, and it is a simple syntax that makes writing formatted text really easy.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;helpful-videos&#34;&gt;Helpful Videos&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes1hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/3dIVesHEAzc&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;Becoming an Internet Landchad with Luke Smith&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes2hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/d8XtNXutVto&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;Vim Diesel&amp;#39;s OFFICIAL Vimtutor Let&amp;#39;s Play/Commentary!&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
</description>
	</item>
	
	<item>
		<title>Hugo: A Static Site Generator</title>
		<link>https://davidvogel.xyz/home-lab/services/hugo/</link>
		<pubDate>Fri, 16 Jun 2023 22:24:38 -0400</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/services/hugo/</guid>
		<description>



&lt;p&gt;This article was written in 2024, looking back at my previous &lt;a href=&#34;https://davidvogel.xyz/home-lab/&#34;&gt;home lab projects&lt;/a&gt; and where my journey into IT began.&lt;/p&gt;




&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/services/&#34; id=&#34;tag_services&#34;&gt;Self-hosted Services&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/hugo-banner.png&#34; alt=&#34;Hugo banner&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;creating-websites&#34;&gt;Creating Websites&lt;/h2&gt;
&lt;p&gt;After building out a bunch of different services for my home lab, I decided that I wanted to document my journey and process. What better way to do that than to build my own website and begin to post content in the form of blog posts, etc?&lt;/p&gt;
&lt;p&gt;While there are many services (WordPress, Wix, SquareSpace, etc) that make it relatively easy to set up a web page, I instead opted to use &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt;, a static site generator written in Go. The reasons for this were multi-faceted but simple. I wanted a solution that was:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;free and open source&lt;/li&gt;
&lt;li&gt;easy to learn, implement, and reproduce&lt;/li&gt;
&lt;li&gt;did &lt;em&gt;not&lt;/em&gt; add in any unnecessary bloat (additional code, like JavaScript, or any additional features like databases, etc)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With this in mind, I found a couple of tutorial videos by Luke Smith (embedded below) that vastly reduced the learning curve for Hugo. It took no more than a few hours of reviewing his content and beginning to build a web page before I had this website built.&lt;/p&gt;
&lt;p&gt;One of the perks of Hugo that I really like is its ability to host a Hugo server on a local machine, and being able to access to a live preview of the website. While there are other ways to implement a Markdown previewer, such as a Neovim plugin, having a live test webserver meant that I could make an edit to an article, and immediately see the rendered output before committing any changes. This is incredibly useful, as it allows me to make sure that everything on the site, including hotlinks, are linking correctly before I push any articles to the live webserver.&lt;/p&gt;
&lt;p&gt;To make life easier, I set up a VM on my &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/proxmox&#34;&gt;Proxmox&lt;/a&gt; for hosting Hugo servers. One particular trick that I implemented was creating a systemd service that would initialize the Hugo server on startup. Beyond the benefit of the server automatically coming online anytime the VM was booted up, setting up systemd services also allowed me to host numerous Hugo servers at the same time by changing the port. This allowed me to work on multiple different website projects at any given time, with all of the startup automated. Very convenient!&lt;/p&gt;
&lt;p&gt;With my first web page created in Hugo, the next step was to &lt;a href=&#34;https://davidvogel.xyz/home-lab/services/web-server&#34;&gt;self-host it&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;fresh-install---tips-and-tricks&#34;&gt;Fresh Install - Tips and Tricks&lt;/h2&gt;
&lt;p&gt;The following is an example of what a systemd file for Hugo looks like:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Unit]
Description=hugo
After=network.target

[Service]
WorkingDirectory=/home/$USER/...
ExecStart=/usr/bin/hugo server --noHTTPCache --bind 0.0.0.0 -b $IP_ADDRESS -p 1313
User=$USER

Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Obviously, a few edits would need to be made for this example file to work:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the working directory needs to point to the active Hugo directory&lt;/li&gt;
&lt;li&gt;the &amp;ldquo;ExecStart&amp;rdquo; setting requires an IP address for the -b (bind) flag
&lt;ul&gt;
&lt;li&gt;this IP address is the same as the IP of the server hosting the Hugo server&lt;/li&gt;
&lt;li&gt;instead of an IP address, a hostname for the server can be used, so long as DNS is able to be resolved at the network level&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;the &amp;ldquo;User&amp;rdquo; setting needs to be set to the user on the server&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;helpful-videos&#34;&gt;Helpful Videos&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes1hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/ZFL09qhKi5I&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;Learning to Hugo with Luke Smith&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes2hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/QTolhoxMyXg&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;Learning to write shortcodes in Go, with Luke Smith&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
</description>
	</item>
	
	<item>
		<title>OpenVPN Server Using Amazon Web Services</title>
		<link>https://davidvogel.xyz/home-lab/network/openvpn-aws/</link>
		<pubDate>Mon, 12 Jun 2023 15:25:35 +0000</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/network/openvpn-aws/</guid>
		<description>





&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/network/&#34; id=&#34;tag_network&#34;&gt;Network Administration&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/aws-banner.png&#34; alt=&#34;AWS banner&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;For more information on how I would set up a VPN server today, check out &lt;a href=&#34;https://github.com/DavidVogelxyz/library/blob/master/servers/openvpn-server-on-debian.md&#34;&gt;my guide on creating a VPN server&lt;/a&gt;, found on my GitHub.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;welcome-to-the-jungle&#34;&gt;Welcome to the Jungle&lt;/h2&gt;
&lt;p&gt;While I have been working with cloud service providers (CSP) for months, I hadn&amp;rsquo;t yet tried out Amazon Web Services (AWS). I decided to re-deploy a project that I&amp;rsquo;m familiar with, OpenVPN, because I thought it would be easy. &amp;ldquo;Easy&amp;rdquo; is not how I would describe my experience with AWS.&lt;/p&gt;
&lt;p&gt;The OpenVPN parts of the setup were streamlined and quick; all the hurdles came from the AWS side of the experience. Everything was made intentionally obtuse, and it feels like it was done to necessitate a certification on &amp;ldquo;AWS.&amp;rdquo; Instead of just spinning up a Debian server/container using an image, I had to find my way over to the &amp;ldquo;EC2&amp;rdquo; dashboard in order to search the &amp;ldquo;AMI catalog&amp;rdquo; (AMI, for Amazon Machine Image) for the right selection. The VM configuration page was also riddled with jargon and terms, with all the useful information tucked away behind links. None of this is to even mention how slow the website operates compared to Linode. Despite all the complications, I managed to boot a pre-imaged OpenVPN server and test it out.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/xkcd-standards.png&#34; alt=&#34;xkcd comic&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;An &lt;a href=&#34;https://xkcd.com/927&#34;&gt;&lt;em&gt;xkcd&lt;/em&gt; comic&lt;/a&gt;. No context given.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The experience with the OpenVPN web UI itself was smooth. I had never used an OpenVPN server with a web UI before, so it was fun to click around for a bit and see what all the menu options were. I eventually found out that this version of OpenVPN server was operating on a &amp;ldquo;7 day free trial,&amp;rdquo; after which I would be billed via AWS. Even though I was supposed to have a &amp;ldquo;12 month free trial&amp;rdquo; with AWS for certain VMs, this apparently did not extend to the OpenVPN server. I used the server for a bit longer before bringing it down and terminating all my VMs with AWS. I like the web UI, don&amp;rsquo;t like having to pay, and still prefer self hosting for my VPN needs.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m actually in awe of how bad my AWS experience was compared to other CSPs I&amp;rsquo;ve used. The AWS web dashboard was slow and painful to use, I spent far too long getting a VM spun up, and I spent the entire time feeling confused. I know from using other CSPs and their platforms that doesn&amp;rsquo;t have to be the case. Other things that bothered me include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Because of the SSH sign in being mediated through keys (with no passwords), AWS actually seems to disallow passwords on the servers. To me, this is a huge red flag.&lt;/li&gt;
&lt;li&gt;Pricing. While &amp;ldquo;12 month free trial&amp;rdquo; sounds enticing, I saw that the pricing for a year of this VPN after the trial ended was $660 USD, or over $50 per month. That&amp;rsquo;s insane.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;All in all, I still have no idea what the appeal of AWS is. It just doesn&amp;rsquo;t make sense to me. I still want to try Google&amp;rsquo;s cloud platform though.&lt;/p&gt;
&lt;p&gt;So far, I&amp;rsquo;m pretty happy that I started with Linode and other CSPs like it.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://davidvogel.xyz/images/aws-openvpn-aws-admindash.png&#34;&gt;&lt;img src=&#34;https://davidvogel.xyz/images/aws-openvpn-aws-admindash.png&#34; alt=&#34;OpenVPN Admin Server - Dashboard&#34; title=&#34;OpenVPN Admin Server - Dashboard&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;An image of the dashboard to the web UI for the OpenVPN Admin Server running on an AWS machine.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-build&#34;&gt;The Build&lt;/h2&gt;
&lt;h3 id=&#34;software-stack&#34;&gt;Software stack:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu&lt;/li&gt;
&lt;li&gt;OpenVPN&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://davidvogel.xyz/images/aws-dash.png&#34;&gt;&lt;img src=&#34;https://davidvogel.xyz/images/aws-dash.png&#34; alt=&#34;AWS Web UI - Dashboard&#34; title=&#34;AWS Web UI - Dashboard&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;An image of the dashboard of the web UI for Amazon Web Services.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;fresh-install-bullet-points&#34;&gt;Fresh Install Bullet Points&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;NB: I have no interest in running this project again, and I have no interest in running any project on AWS ever again.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Thanks to those who got me here!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NetworkChuck for his &lt;a href=&#34;https://www.youtube.com/watch?v=m-i2JBtG4FE&#34;&gt;video on installing an OpenVPN server on AWS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;hahahugoshortcodes1hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/m-i2JBtG4FE&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;OpenVPN on pfSense with Lawrence Systems&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
</description>
	</item>
	
	<item>
		<title>Docker Containers on Arch Linux VM</title>
		<link>https://davidvogel.xyz/home-lab/virtualization/docker/</link>
		<pubDate>Wed, 31 May 2023 16:22:27 +0000</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/virtualization/docker/</guid>
		<description>





&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/&#34; id=&#34;tag_virtualization&#34;&gt;Virtualization (Hypervisors)&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/docker-banner.png&#34; alt=&#34;Docker banner&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;everybody-loves-docker&#34;&gt;Everybody Loves Docker&lt;/h2&gt;
&lt;p&gt;Since getting into virtualization, I have heard tons of people say many positive things about &lt;code&gt;Docker&lt;/code&gt;. I created a Ubuntu VM in early 2023 when I first created my &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/proxmox&#34;&gt;Proxmox server&lt;/a&gt;, but I had only created one or two containers quickly. Now, I not only had an interest in learning about Docker, but a need to learn Docker: I wanted to host my &lt;a href=&#34;https://davidvogel.xyz/home-lab/services/hugo&#34;&gt;Hugo server&lt;/a&gt; using Docker, so I could work on my website before pushing it live.&lt;/p&gt;
&lt;p&gt;Docker is incredibly lean. The VM I have Docker running on was given a small amount of CPU resources and only 4GB of RAM. Despite that, it has the ability to run tons of containers all at the same time. While I have been able to run certain containers in ways to push their resource use and max out the VM, it&amp;rsquo;s not something that I&amp;rsquo;ve run into during standard server use.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/docker-vm-neofetch.png&#34; alt=&#34;Docker VM - Neofetch&#34; title=&#34;Docker VM - Neofetch&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A neofetch of a SSH terminal window for the Proxmox VM running my Docker containers.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-build&#34;&gt;The Build&lt;/h2&gt;
&lt;h3 id=&#34;hardware-virtualized&#34;&gt;Hardware (virtualized):&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2 CPU cores @ 3.8GHz&lt;/li&gt;
&lt;li&gt;4GB RAM&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;software&#34;&gt;Software:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Portainer&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;portainer&#34;&gt;Portainer&lt;/h3&gt;
&lt;p&gt;I really, really like &lt;code&gt;Portainer&lt;/code&gt;. It has made getting into Docker extremely easy. While it was good to watch &lt;a href=&#34;https://www.youtube.com/watch?v=eGz9DS-aIeY&#34;&gt;this NetworkChuck video&lt;/a&gt; and do the exercise with him of setting up containers using the command line, there&amp;rsquo;s a lot with Docker that can get confusing when it comes to the proper switches and flags. Portainer makes it incredibly easy to get Docker containers set up that run the way I want them to.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://davidvogel.xyz/images/portainer-dashboard.png&#34;&gt;&lt;img src=&#34;https://davidvogel.xyz/images/portainer-dashboard.png&#34; alt=&#34;Portainer - Dashboard&#34; title=&#34;Portainer - Dashboard&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;An image of the dashboard of the web UI for the Portainer docker container, running on my Arch Linux VM, which itself runs on my Proxmox VE server. So cool.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;fresh-install-bullet-points&#34;&gt;Fresh Install Bullet Points&lt;/h2&gt;
&lt;p&gt;Here’s how I would reinstall Docker and Portainer if I needed to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go to my personal GitHub and reference my guides on:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/DavidVogelxyz/library/blob/master/docker/install-docker-arch.md&#34;&gt;Installing Docker and Portainer on Arch Linux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to those who got me here!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=iX0HbrfRyvc&#34;&gt;NetworkChuck Portainer video&lt;/a&gt; on YouTube&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/playlist?list=PLIhvC56v63IJlnU4k60d0oFIrsbXEivQo&#34;&gt;NetworkChuck Docker playlist&lt;/a&gt; on YouTube&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;helpful-videos&#34;&gt;Helpful Videos&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes1hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/iX0HbrfRyvc&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;Installing Portainer with NetworkChuck&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes2hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/eGz9DS-aIeY?list=PLIhvC56v63IJlnU4k60d0oFIrsbXEivQo&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;Docker playlist with NetworkChuck&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
</description>
	</item>
	
	<item>
		<title>Homer Web Dashboard</title>
		<link>https://davidvogel.xyz/home-lab/services/homer/</link>
		<pubDate>Wed, 10 May 2023 22:58:58 -0400</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/services/homer/</guid>
		<description>





&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/services/&#34; id=&#34;tag_services&#34;&gt;Self-hosted Services&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;h1 id=&#34;my-first-website&#34;&gt;&amp;ldquo;My first website&amp;rdquo;&lt;/h1&gt;
&lt;p&gt;I never thought that I would need a web dashboard for all of my web-based self-hosted services. Back then, I had one service. Maybe two.&lt;/p&gt;
&lt;p&gt;But, one day, I had far too many services to keep track of. All of the local IP addresses, all of the port numbers, which ones were &amp;lsquo;http&amp;rsquo; versus &amp;lsquo;https,&amp;rsquo; etc. It got to be very onerous.&lt;/p&gt;
&lt;p&gt;This is when I decided to configure a Homer dashboard.&lt;/p&gt;
&lt;p&gt;Life-changer.&lt;/p&gt;
&lt;p&gt;This is a screenshot of part of my Homer dashboard.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://davidvogel.xyz/images/homer-dashboard.png&#34;&gt;&lt;img src=&#34;https://davidvogel.xyz/images/homer-dashboard.png&#34; alt=&#34;Homer Web UI - Dashboard&#34; title=&#34;Homer Web UI - Dashboard&#34;&gt;&lt;/a&gt;&lt;/p&gt;
</description>
	</item>
	
	<item>
		<title>pfSense on a Protectli Router</title>
		<link>https://davidvogel.xyz/home-lab/network/pfsense/</link>
		<pubDate>Thu, 04 May 2023 22:56:48 -0400</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/network/pfsense/</guid>
		<description>





&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/network/&#34; id=&#34;tag_network&#34;&gt;Network Administration&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/pfsense-banner.png&#34; alt=&#34;pfSense banner&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;building-a-home-network-from-scratch&#34;&gt;Building a Home Network from Scratch&lt;/h1&gt;
&lt;p&gt;I was working my way through the CompTIA Network+ certification, and had just finished the travel router project, when I decided it was time to upgrade my home network setup. I had previously been using a Netgear device that served as both the router and the access point (AP) for my network. However, various issues, including a slow web UI and an inability to do VLANs properly, made it clear that it needed to be replaced at some point. I decided to take a small break from studying &amp;ndash; May 2023 was now that moment.&lt;/p&gt;
&lt;p&gt;I set up a Protectli router running pfSense. And, the process was relatively painlessly, the first time around. I followed a guide (link below) and set up a basic home network, with some custom firewall rules and NAT permissions for my OpenVPN server. I did have to overcome the hurdle of bridging some physical interfaces so I could have additional LAN ports. But, it felt like the issues I was experiencing made sense, and so did the solutions. After getting the network to a stable, working place; I resumed my studying for my upcoming exam. Afterwards, though, it was time for VLANs!&lt;/p&gt;
&lt;p&gt;A couple of weeks later, I revisited the router in order to implement those VLANs. Even though I passed my exam, and received my CompTIA Network+ certification, I was not prepared for the weekend of obstacles that I endured. I spent far too many hours of a full weekend troubleshooting. While that was painful, I also gained a ton of experience that studying for the Network+ had not given me. Before, I could correctly answer exam questions about VLANs. Now, I understand them so well that I can set them up even if some of the hardware isn&amp;rsquo;t playing nice.&lt;/p&gt;
&lt;p&gt;Surprisingly, I feel rewarded for the time I spent fixing my home network. I received extremely valuable hands-on knowledge that I&amp;rsquo;m confident will be useful in the future. I became really comfortable with pfSense too. I can follow someone&amp;rsquo;s guide and configure a network, but I can also say that I know how to deviate from that guide, as is needed, in order to build a custom network that suits my needs. And, that&amp;rsquo;s another thing: I got a really secure home network out of it, one that I set up myself. That&amp;rsquo;s really awesome.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://davidvogel.xyz/images/pfsense-firewall.png&#34;&gt;&lt;img src=&#34;https://davidvogel.xyz/images/pfsense-firewall.png&#34; alt=&#34;pfSense - Firewall&#34; title=&#34;pfSense - Firewall&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;An image of the firewall rules for the LAN interface on my pfSense router.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id=&#34;the-build&#34;&gt;The Build&lt;/h1&gt;
&lt;h3 id=&#34;hardware&#34;&gt;Hardware&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Protectli&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;software&#34;&gt;Software&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;pfSense&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;old-hardware&#34;&gt;Old hardware&lt;/h3&gt;
&lt;p&gt;I was able to make use of all of my old hardware. The managed switches I had stayed where they were, and the old Netgear router was demoted to just being an access point (AP). This allowed me to extend the wireless coverage to more areas of my home that needed it, since the office area was entirely wired connections.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;takeaways&#34;&gt;Takeaways&lt;/h2&gt;
&lt;p&gt;Even though I followed a guide throughout the process, having a good understanding of networking basics was extremely helpful as I set up my pfSense router.&lt;/p&gt;
&lt;h3 id=&#34;bridging&#34;&gt;Bridging&lt;/h3&gt;
&lt;p&gt;The Protectli router that I have doesn&amp;rsquo;t have a bunch of LAN connections in the way I was use to. It has one LAN port, and an OPT1 and an OPT2 port (short for &lt;em&gt;optional&lt;/em&gt;). In order to make use of the OPT1 port as another LAN port, I had to set up a bridge between the interfaces. That required setting up a new interface between the two, adjusting some settings, and then adding in some firewall rules to allow LAN traffic to talk to anyone. Figuring this out took a mix of searching the right keywords and knowing how to correctly implement the forum post solution I had found.&lt;/p&gt;
&lt;h3 id=&#34;firewall&#34;&gt;Firewall&lt;/h3&gt;
&lt;p&gt;pfSense makes it easy to set firewall rules on a per interface basis. That meant firewall rules for LAN, OPT1, their bridge, and any VLANs I created (and any bridges they needed). While that felt like a lot of work, my solution was building a spreadsheet of rules and working from there. The table allowed me visual clarity into the differences between the VLANs, based on their firewall rules. Then, I copied over to all of them the default &lt;em&gt;block&lt;/em&gt; and &lt;em&gt;allow ping&lt;/em&gt; rules. Soon enough, I had a complete set of firewall rules for all of my VLANs and other network interfaces. Then, all I had to do was test them.&lt;/p&gt;
&lt;h3 id=&#34;vlans&#34;&gt;VLANs&lt;/h3&gt;
&lt;p&gt;Learning VLANs was painful. The pain had little to do with pfSense or Protectli, a fair amount to do with these being my first VLANs, and a lot to do with issues with my switches and wireless access point. But, through this pain, I learned how to set up VLANs, and that&amp;rsquo;s awesome.&lt;/p&gt;
&lt;p&gt;My first issue was a combination of my inexperience with VLANs and the switches&amp;rsquo; (TP-Link) software. Figuring out the correct way to interact with their software took many trials and errors, and a few factory resets for the switches. Some of this was due to the requirement that the PVID also needed to be set in order for the port to &lt;em&gt;actually&lt;/em&gt; be tagged. Some of my issues were also due to my interest in putting the switch onto a management VLAN. Eventually, I figured out how to get the VLAN traffic flowing.&lt;/p&gt;
&lt;p&gt;The other issue arose at this point, and related to the Netgear wireless access point. When I first implemented the pfSense router, I changed the Netgear device to &lt;code&gt;access point&lt;/code&gt; mode, over from &lt;code&gt;router&lt;/code&gt; mode. In doing so, a software configuration happened that removed the device&amp;rsquo;s ability to process VLAN tags &amp;ndash; essentially making the Netgear a &amp;ldquo;dumb switch.&amp;rdquo; This meant that the AP&amp;rsquo;s IP address would have to reside within the same VLAN it was propogating. Naturally, this also conflicted with my attempts to set up a management VLAN. Solutions were arrived at, as they always are, but I spent a good while thinking that I had misconfigured the VLANs on the pfSense side.&lt;/p&gt;
&lt;p&gt;There was also the small thing with bridging VLANs in order to get VLAN traffic from the VLAN interfaces on the LAN port to the VLAN interfaces on the OPT1 port. Not getting it right (ex. bridging a VLAN to its parent interface) would cause loops and bring the network down. That was a fun learning experience too.&lt;/p&gt;
&lt;h3 id=&#34;openvpn&#34;&gt;OpenVPN&lt;/h3&gt;
&lt;h3 id=&#34;wireguard-coming-soon&#34;&gt;WireGuard (coming soon)&lt;/h3&gt;
&lt;hr&gt;
&lt;h2 id=&#34;fresh-install-bullet-points&#34;&gt;Fresh Install Bullet Points&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Follow &lt;a href=&#34;https://nguvu.org/pfsense/pfsense-baseline-setup&#34;&gt;the guide&lt;/a&gt; that I originally found for setting up a pfSense router&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://linustechtips.com/topic/753059-how-do-i-configure-opt1-and-opt2-as-additional-lan-on-pfsense&#34;&gt;Message board post&lt;/a&gt; from Linus Tech Tips about bridging OPT1 with LAN&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=5ohLAFHnOHg&amp;amp;t=855&#34;&gt;YouTube video&lt;/a&gt; from Tom Lawrence at Lawrence Systems on YouTube describing how to tag the VLANs correctly on TP-Link switches&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=I61t7aoGC2Q&#34;&gt;YouTube video&lt;/a&gt; from Tom at Lawrence Systems about OpenVPN on pfSense&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;helpful-videos&#34;&gt;Helpful Videos&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes1hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/5ohLAFHnOHg?start=855&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;Tagging VLANs correctly on TP-Link switches with Lawrence Systems&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes2hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/I61t7aoGC2Q&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;OpenVPN on pfSense with Lawrence Systems&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
</description>
	</item>
	
	<item>
		<title>Travel Router - Raspberry Pi Running OpenWrt</title>
		<link>https://davidvogel.xyz/home-lab/network/travel-router/</link>
		<pubDate>Mon, 01 May 2023 22:58:45 -0400</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/network/travel-router/</guid>
		<description>





&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/network/&#34; id=&#34;tag_network&#34;&gt;Network Administration&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/openwrt-banner.png&#34; alt=&#34;OpenWrt banner&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;secure-vpn-internet-on-the-go&#34;&gt;Secure VPN Internet On-the-Go&lt;/h2&gt;
&lt;p&gt;I successfully built multiple travel routers, each one using nothing more than a Raspberry Pi, an external USB wireless adapter, and a connection to a remote OpenVPN server.&lt;/p&gt;
&lt;p&gt;But why do this? Two main reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Home lab access no matter where I am&lt;/li&gt;
&lt;li&gt;Secure internet access when outside the home&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If I&amp;rsquo;m not using my home network, I&amp;rsquo;m using someone else&amp;rsquo;s network. Now that I have an awesome home lab, that&amp;rsquo;s not okay. So I built my travel router with a connection back to my &lt;a href=&#34;https://davidvogel.xyz/home-lab/network/openvpn-raspberry-pi&#34;&gt;home OpenVPN server&lt;/a&gt; so that I always have access to my home&amp;rsquo;s local network. Access that, for example, allows my laptops to connect to my &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/proxmox&#34;&gt;Proxmox VM server&lt;/a&gt;, and therefore my &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/docker&#34;&gt;Docker containers&lt;/a&gt;, at all times. Or, I can pull a file off of my &lt;a href=&#34;https://davidvogel.xyz/home-lab/services/truenas&#34;&gt;network attached storage (NAS)&lt;/a&gt; anywhere I go. It means that, no matter where I am, I always look like I&amp;rsquo;m using the internet from the comfort of my home. Sometimes, that&amp;rsquo;s exactly what I want.&lt;/p&gt;
&lt;p&gt;An added benefit to this &amp;ldquo;everywhere-I-go&amp;rdquo; home network access is that the VPN tunnel protects my traffic from a potentially compromised network connection. Whether it&amp;rsquo;s rogue users or a rogue network administrator, using other networks confers a level of risk that the traffic sent over the network will be sniffed. Even with HTTPS and SSL, there&amp;rsquo;s tons of metadata that can be gathered from any traffic going over the network. If the traffic is instead being routed through an encrypted tunnel until it reaches the VPN server, it would be entirely unreadable. So, the travel router adds a security benefit as well.&lt;/p&gt;
&lt;p&gt;Another plus of the travel router is its convenience. Normally, any device that wanted to connect to the VPN would need VPN software and a configuration file. Instead of needing to do that, I simply connect the device to a specific wireless network hosted by the travel router, and the device is automatically connected to the internet through the VPN. The travel router is also configured to have a &amp;ldquo;VPN kill switch,&amp;rdquo; so that the router cuts the internet anytime the VPN connection is lost. This ensures that any traffic leaving the router is on its way to the home OpenVPN server) and, therefore, encrypted.&lt;/p&gt;
&lt;p&gt;Yet another benefit to building the travel routers was that I was actively pursuing my CompTIA Network+ certification at the time, and the travel routers were a practical home lab project for someone studying for a networking exam. While I followed guides for most of the initial setup, I had a strong understanding of what I was doing because I was solidifying the material I was learning for my certification.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://davidvogel.xyz/images/travel-router-dashboard.png&#34;&gt;&lt;img src=&#34;https://davidvogel.xyz/images/travel-router-dashboard.png&#34; alt=&#34;Travel Router Web UI Dashboard&#34; title=&#34;Travel Router Web UI Dashboard&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;An image of the travel router&amp;rsquo;s web UI dashboard.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-build&#34;&gt;The Build&lt;/h2&gt;
&lt;h3 id=&#34;hardware&#34;&gt;Hardware:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Raspberry Pi 4, 8GB RAM&lt;/li&gt;
&lt;li&gt;External USB wireless antenna
&lt;ul&gt;
&lt;li&gt;MediaTek 7601u chipset&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;software&#34;&gt;Software:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;OpenWrt&lt;/li&gt;
&lt;li&gt;OpenVPN&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mt7601u-firmware&lt;/code&gt; driver&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As is posted on my GitHub, my particular pair of antenna and driver no longer installs correctly, as the 2023 May 15 update to the &lt;code&gt;mt7601u-firmware&lt;/code&gt; driver package broke the compatibility. I now build new travel routers by using a backup image I created from a currently working travel router.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;fresh-install-bullet-points&#34;&gt;Fresh Install Bullet Points&lt;/h2&gt;
&lt;p&gt;Here’s how I would rebuild my travel router if I needed to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go to my personal GitHub and reference my guide on:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/DavidVogelxyz/library/blob/master/network/install-openwrt-travelrouter.md&#34;&gt;Setting up travel routers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To give credit to those who got me here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=jlHWnKVpygw&#34;&gt;NetworkChuck Raspberry Pi Travel Router video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://openwrt.org/docs/guide-user/services/vpn/openvpn/client-luci&#34;&gt;OpenWrt guide to OpenVPN client using LuCI&lt;/a&gt; specifically for help with the VPN kill-switch&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;helpful-videos&#34;&gt;Helpful Videos&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes1hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/jlHWnKVpygw&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;NetworkChuck Raspberry Pi Travel Router video&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
</description>
	</item>
	
	<item>
		<title>Network Attached Storage Using TrueNAS Scale</title>
		<link>https://davidvogel.xyz/home-lab/services/truenas/</link>
		<pubDate>Sun, 23 Apr 2023 22:56:32 -0400</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/services/truenas/</guid>
		<description>





&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/services/&#34; id=&#34;tag_services&#34;&gt;Self-hosted Services&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/truenas-banner.png&#34; alt=&#34;TrueNAS banner&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;self-hosted-cloud-storage&#34;&gt;Self-hosted Cloud Storage&lt;/h2&gt;
&lt;p&gt;If the &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/proxmox&#34;&gt;Proxmox VE server&lt;/a&gt; wasn&amp;rsquo;t my first &amp;ldquo;home lab flex,&amp;rdquo; then my network attached storage (NAS) definitely was. It&amp;rsquo;s a flex because of the hardware it&amp;rsquo;s running, but it&amp;rsquo;s also a flex because of the software it&amp;rsquo;s running. And, it&amp;rsquo;s a flex because of how that software is configured. It was actually as impressive as rebuilding a PC and turning it into a Proxmox server with GPU passthrough. Maybe more.&lt;/p&gt;
&lt;p&gt;What makes my NAS so great?&lt;/p&gt;
&lt;p&gt;The 16GB of RAM it has is pretty great. What makes it better is that I had to completely disassemble the ASUSTOR NAS I had purchased in order to install the two RAM modules. After working on my desktop PC and the Proxmox server, opening up a NAS was no problem, even if it was a complete disassembly.&lt;/p&gt;
&lt;p&gt;It runs TrueNAS Scale. TrueNAS is awesome because it&amp;rsquo;s free and open-source software (FOSS) that&amp;rsquo;s built on a Debian architecture. What&amp;rsquo;s more awesome is that I installed TrueNAS on a device whose manufacturer doesn&amp;rsquo;t condone non-official softwares being installed on their hardware. I would rather have control over the devices I purchase than have a warranty, so I just installed my own software over it. So cool.&lt;/p&gt;
&lt;p&gt;The 4 drives that fill the 4 bays of the NAS, and all their storage capacity, are maybe the best part. Self-hosting my own cloud storage that I can access from anywhere with the help of my &lt;a href=&#34;https://davidvogel.xyz/home-lab/network/openvpn-raspberry-pi&#34;&gt;home VPN server&lt;/a&gt; &amp;ndash; that&amp;rsquo;s undoubtedly pretty cool. &lt;em&gt;&lt;strong&gt;BUT&lt;/strong&gt;&lt;/em&gt;, what&amp;rsquo;s actually the best part is how I set those drives up:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The NAS is running ZFS as the file system.&lt;/li&gt;
&lt;li&gt;The NAS is configured in RAID 10.
&lt;ul&gt;
&lt;li&gt;RAID 10 isn&amp;rsquo;t officially a thing in ZFS. So, I just configured my datapool to stripe the data between two drives, and then use the &lt;em&gt;other&lt;/em&gt; two drives as mirrors. Basically, a RAID 10 on ZFS.&lt;/li&gt;
&lt;li&gt;I get 50% of the theoretical storage capacity of my 4 drives, but I get increased transfer speeds and the ability to lose any 1 drives without issue.
&lt;ul&gt;
&lt;li&gt;Depending on which drives fail, I can even lose two drives without issue.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The NAS has link aggregation (LAG).
&lt;ul&gt;
&lt;li&gt;I had extra room on the switch, so I configured LAG on my NAS take advantage of the second Gigabit Ethernet port and speed up transfer times.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&amp;rsquo;s why my NAS is such a &amp;ldquo;home lab flex&amp;rdquo; &amp;ndash; it&amp;rsquo;s freaking awesome.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-build&#34;&gt;The Build&lt;/h2&gt;
&lt;h3 id=&#34;base---asustor-nas&#34;&gt;Base - ASUSTOR NAS:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Upgrades/additions:
&lt;ul&gt;
&lt;li&gt;16GB RAM, upgraded from 4GB&lt;/li&gt;
&lt;li&gt;Internal SSD&lt;/li&gt;
&lt;li&gt;4x 8TB hard drives&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;software&#34;&gt;Software&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;TrueNAS Scale&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;fresh-install-bullet-points&#34;&gt;Fresh Install Bullet Points&lt;/h2&gt;
&lt;p&gt;Here’s how I would reinstall TrueNAS if I needed to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use the &lt;a href=&#34;https://www.youtube.com/watch?v=u9qPZQczuPI&#34;&gt;video guide&lt;/a&gt; released by ASUSTOR to correctly disassemble the unit and replace/upgrade the RAM and add an internal SSD&lt;/li&gt;
&lt;li&gt;Follow the &lt;a href=&#34;https://www.youtube.com/watch?v=q5y9BDkwHmQ&#34;&gt;video guide&lt;/a&gt; by the YouTube channel NASCompares to walkthrough the software install, using TrueNAS Scale instead of Core (not by choice; Core wouldn&amp;rsquo;t install; related to drivers for the NIC)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to those who got me here!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;helpful-videos&#34;&gt;Helpful Videos&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes1hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/u9qPZQczuPI&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;Upgrade RAM with ASUSTOR&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes2hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/q5y9BDkwHmQ&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;Installing TrueNAS Scale with NASCompares&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
</description>
	</item>
	
	<item>
		<title>Proxmox Virtual Environment</title>
		<link>https://davidvogel.xyz/home-lab/virtualization/proxmox/</link>
		<pubDate>Sat, 18 Mar 2023 22:52:04 -0400</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/virtualization/proxmox/</guid>
		<description>





&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/&#34; id=&#34;tag_virtualization&#34;&gt;Virtualization (Hypervisors)&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/proxmox-banner.png&#34; alt=&#34;Proxmox banner&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;type-1-hypervisor-a-vm-server-for-free-in-the-cloud&#34;&gt;Type 1 Hypervisor, a VM Server, for free, in the cloud&lt;/h1&gt;
&lt;p&gt;Soon after building my &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/desktop&#34;&gt;custom DIY Desktop PC&lt;/a&gt; and replacing my old PC, I watched a &lt;a href=&#34;https://www.youtube.com/watch?v=_u8qTN3cCnQ&#34;&gt;video on YouTube&lt;/a&gt; by NetworkChuck about Proxmox, a type of virtualization software that I could run as a server. Once I found out I could turn the old computer into a VM server, I knew immediately that I had to make it happen.&lt;/p&gt;
&lt;p&gt;In March of 2023, I took the old pre-built computer I had purchased from NewEgg and upgraded nearly every single part of it. Where before I would severely limit how often I opened the comptuer&amp;rsquo;s case for fear of breaking something, I now enjoyed completely breaking down the machine and rebuilding it as if it was from parts. When it finally booted up with all the upgrades installed, I was so excited - I couldn&amp;rsquo;t wait to install Proxmox.&lt;/p&gt;
&lt;p&gt;And that&amp;rsquo;s what I did. With my new &amp;ldquo;old computer&amp;rdquo; ready, I watched a few YouTube videos and made Proxmox happen. Then, I immediately took it a step further by making sure it had the GPU passthrough right at the start, just like I had done with the &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/qemu&#34;&gt;QEMU setup&lt;/a&gt; on my desktop PC. The upgraded parts came from a one-at-a-time process of trying to fix different problems as they came up. But, I got it done, and my type 1 hypervisor VM juggernaut was ready.&lt;/p&gt;
&lt;p&gt;Building out another component of my home lab on my personal home cloud really motivated me to tackle other home lab projects. I felt like I could do it all! But, I had to wait. Right after completing the server, I began studying intensely for the CompTIA Security+ exam, and I had to take a pause from VMs and hypervisors and home lab projects.&lt;/p&gt;
&lt;p&gt;Since building the server, Proxmox has become an essential part of my home network. With my self-hosted VM server, I can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;run a VM that hosts all my &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/docker&#34;&gt;Docker containers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;try out other Linux distributions that I don&amp;rsquo;t want to install on bare metal.&lt;/li&gt;
&lt;li&gt;use it to play old software, like the occasional ISO I have from old video games I use to play on Windows 98 or Windows XP.&lt;/li&gt;
&lt;li&gt;test out anything I want, like intentionally downloading old viruses onto a Windows XP machine.
&lt;ul&gt;
&lt;li&gt;And, I can do that all from within a safe environment where I can delete the VM the moment I&amp;rsquo;m done with it, and it doesn&amp;rsquo;t harm any of my other machines.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;do all of this without bloating my &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/desktop&#34;&gt;main machine&lt;/a&gt; with test VMs, or detracting from its &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/qemu&#34;&gt;virtualization tasks&lt;/a&gt; by utilizing system resources for smaller VMs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&amp;rsquo;s awesome.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://davidvogel.xyz/images/proxmox-ubuntu.png&#34;&gt;&lt;img src=&#34;https://davidvogel.xyz/images/proxmox-ubuntu.png&#34; alt=&#34;Proxmox - Ubuntu VM&#34; title=&#34;Proxmox - Ubuntu VM&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A screenshot of the desktop of a Ubuntu VM, being run on a local Proxmox server and being accessed through a web browser.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-build&#34;&gt;The Build&lt;/h2&gt;
&lt;h3 id=&#34;hardware-upgrades&#34;&gt;Hardware upgrades:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Motherboard: ASRock B450M Pro4 -&amp;gt; ASUS
&lt;ul&gt;
&lt;li&gt;Old motherboard was giving me issues in conjunction with other upgraded parts&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CPU: AMD Ryzen 2700X -&amp;gt; AMD Ryzen 5700G
&lt;ul&gt;
&lt;li&gt;This was a crucial upgrade, as the integrated graphics allowed for the passthrough of the GPU, while still allowing the hypervisor to boot.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RAM: 16GB -&amp;gt; 32GB
&lt;ul&gt;
&lt;li&gt;More RAM to split between all the virtual machines&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Storage: blah&lt;/li&gt;
&lt;li&gt;GPU: NVIDIA GeForce -&amp;gt; AMD Radeon
&lt;ul&gt;
&lt;li&gt;Technically a side-grade at best. I gave the NVIDIA card to my &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/desktop&#34;&gt;desktop&lt;/a&gt; for use with &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/qemu&#34;&gt;QEMU&lt;/a&gt;. However, I needed to passthrough a GPU, so I went and found the cheapest Chinese GPU I could find.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;software-stack&#34;&gt;Software stack:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Proxmox Virtual Environment
&lt;ul&gt;
&lt;li&gt;Type 1 hypervisor&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/docker-vm-neofetch.png&#34; alt=&#34;Docker VM - Neofetch&#34; title=&#34;Docker VM - Neofetch&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A neofetch of a SSH terminal window of the Arch Linux VM running on my Proxmox VE server. The Arch VM is actively running all of my Docker containers.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;how-to-do-backups-using-cli&#34;&gt;How to do backups using CLI&lt;/h2&gt;
&lt;dl&gt;
&lt;dt&gt;/var/lib/vz&lt;/dt&gt;
&lt;dd&gt;Directory for VM images and something else&amp;hellip;&lt;/dd&gt;
&lt;dt&gt;/etc/pve/qemu-server&lt;/dt&gt;
&lt;dd&gt;stuff&lt;/dd&gt;
&lt;dt&gt;/etc/&amp;hellip;&lt;/dt&gt;
&lt;dd&gt;more stuff&lt;/dd&gt;
&lt;/dl&gt;
&lt;hr&gt;
&lt;h2 id=&#34;fresh-install-bullet-points&#34;&gt;Fresh Install Bullet Points&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s how I would reinstall Proxmox if I needed to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go to my personal GitHub and reference my guides on:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/DavidVogelxyz/library/blob/master/proxmox/install-proxmox.md&#34;&gt;Installing Proxmox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/DavidVogelxyz/library/blob/master/proxmox/proxmox-gpu-passthrough.md&#34;&gt;GPU passthrough on Proxmox&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to those who got me here!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=_u8qTN3cCnQ&#34;&gt;NetworkChuck - Proxmox install video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=GoZaMgEgrHw&#34;&gt;Techno Tim - 11 Things to Setup Proxmox video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pve.proxmox.com/wiki/PCI_Passthrough&#34;&gt;Proxmox documentation&lt;/a&gt; on how to set up PCI (GPU) passthrough&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;helpful-videos&#34;&gt;Helpful Videos&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes1hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/_u8qTN3cCnQ&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;Installing Proxmox with NetworkChuck&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes2hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/GoZaMgEgrHw&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;First 11 Things on Proxmox with TechnoTim&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
</description>
	</item>
	
	<item>
		<title>QEMU on Artix Linux Desktop PC</title>
		<link>https://davidvogel.xyz/home-lab/virtualization/qemu/</link>
		<pubDate>Mon, 20 Feb 2023 22:51:13 -0500</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/virtualization/qemu/</guid>
		<description>





&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/&#34; id=&#34;tag_virtualization&#34;&gt;Virtualization (Hypervisors)&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/qemu-banner.png&#34; alt=&#34;QEMU banner&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;virtualization-for-the-desktop&#34;&gt;Virtualization for the Desktop&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;QEMU&lt;/code&gt; is a type 2 hypervisor. What that means is that, I can install &lt;code&gt;QEMU&lt;/code&gt; on an operating system, like Artix Linux on my &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/desktop&#34;&gt;desktop PC&lt;/a&gt;, and that will allow me to virtualize computers within my computer. Using a type 2 hypervisor, I can run virtual machines of all different operating systems from &lt;em&gt;within&lt;/em&gt; my Linux PC. As an example, I can run Windows occasionally for games, but virtualize Windows within my Linux OS, and that keeps all of the spooky stuff that Windows does restricted to the virtual machine.&lt;/p&gt;
&lt;p&gt;Almost immediately after I got my new desktop PC up and running, I installed &lt;code&gt;QEMU&lt;/code&gt;, &lt;code&gt;virt-manager&lt;/code&gt;, and a few other packages on it. Not only did I manage to get the hypervisor running; but, not long after that, I successfully passed through the second GPU to the virtualization software. With assistance from an HDMI splitter, I can access my VMs from the same keyboard, mouse, and monitor. That may not sound special on its own, but consider that the setup needs to receive two different HDMI outputs from two different GPUs in order to work. Because of this setup, I am able to get essentially bare metal performance from my Windows VMs, which means that high performance tasks like gaming work just as well virtualized.&lt;/p&gt;
&lt;p&gt;Because of my success with installing &lt;code&gt;QEMU&lt;/code&gt; and getting the GPU passed through, I was starting to feel good at computers. I got this virtualization setup working, which was one of the main drivers behind building the new PC. But, in addition, I also had installed a &amp;rsquo;new-to-me&amp;rsquo; version of Linux (Arch, as opposed to Ubuntu/Debian), and I was still successful. I felt like I could tackle any home lab project and I&amp;rsquo;d make it work. So, when I soon heard about type 1 hypervisors, like Proxmox, I was eager to build out a &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/proxmox&#34;&gt;VM server self-hosted by my own personal cloud&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://davidvogel.xyz/images/qemu-win10-desktop.png&#34;&gt;&lt;img src=&#34;https://davidvogel.xyz/images/qemu-win10-desktop.png&#34; alt=&#34;Windows 10 VM - Desktop&#34; title=&#34;Windows 10 VM - Desktop&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A screenshot of the desktop of my Windows 10 VM, running on my Artix Linux Desktop PC using QEMU. There are a couple of &lt;code&gt;dxdiag&lt;/code&gt; windows up showing the NVIDIA GPU being passed through, as well as the hardware that Windows 10 is virtualizing on top of.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id=&#34;the-build&#34;&gt;The Build&lt;/h1&gt;
&lt;p&gt;QEMU&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Type 2 hypervisor&lt;/li&gt;
&lt;li&gt;Deployed using &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/desktop&#34;&gt;Desktop&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/desktop-with-qemu-windows.png&#34; alt=&#34;Desktop - Neofetch - QEMU&#34; title=&#34;Desktop - Neofetch - QEMU&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A &lt;code&gt;neofetch&lt;/code&gt; of the desktop PC while also virtualizing my Windows 10 gaming VM.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;fresh-install-bullet-points&#34;&gt;Fresh Install Bullet Points&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s how I would reinstall QEMU on an Arch Linux machine if I needed to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go to my personal GitHub and reference my guides on:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/DavidVogelxyz/library/blob/master/qemu/install-qemu-arch.md&#34;&gt;Installing QEMU on Arch Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/DavidVogelxyz/library/blob/master/qemu/qemu-gpu-passthrough.md&#34;&gt;GPU passthrough on QEMU&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to those who got me here!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mental Outlaw &lt;a href=&#34;https://www.youtube.com/watch?v=wxxP39cNJOs&#34;&gt;QEMU install video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mental Outlaw &lt;a href=&#34;https://www.youtube.com/watch?v=KVDUs019IB8&#34;&gt;GPU pass-through video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wiki.archlinux.org/title/PCI_passthrough_via_OVMF&#34;&gt;Arch Linux wiki&lt;/a&gt; article on PCI passthrough&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;helpful-videos&#34;&gt;Helpful Videos&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes1hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/wxxP39cNJOs&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;Installing QEMU with Mental Outlaw&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes2hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/KVDUs019IB8&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;GPU pass-through with Mental Outlaw&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
</description>
	</item>
	
	<item>
		<title>DIY Desktop PC Running Artix Linux</title>
		<link>https://davidvogel.xyz/home-lab/other/desktop/</link>
		<pubDate>Mon, 13 Feb 2023 22:51:03 -0500</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/other/desktop/</guid>
		<description>





&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/&#34; id=&#34;tag_other&#34;&gt;Other Projects&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/artix-banner.png&#34; alt=&#34;Artix banner&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;the-new-computer&#34;&gt;The New Computer&lt;/h1&gt;
&lt;p&gt;This desktop PC, which I built from parts in February 2023, is ridiculously awesome. Why?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Because I built it myself.
&lt;ul&gt;
&lt;li&gt;Building my PC gave me a greater understanding of the inner workings of computers. Even though I had been working with the Raspberry Pi for over a year, I learned more from building a PC that I had from the Pi computers. I felt empowered to diagnose and fix my own computer problems. It was cool.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Because it runs Artix Linux.
&lt;ul&gt;
&lt;li&gt;I had been running Ubuntu Desktop on my desktop PC since summer 2022, and I had tried Arch before. However, this was my first time using Arch as a daily driver.&lt;/li&gt;
&lt;li&gt;LARBS!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Because I learned about &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/&#34;&gt;virtualization&lt;/a&gt;.
&lt;ul&gt;
&lt;li&gt;One of the reasons why I built this computer with the parts I chose was for virtualization. I had been having trouble playing certain games on Linux because I was using container solutions and emulators to run the games, and I had heard that virtualization through a software such as &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/qemu&#34;&gt;QEMU&lt;/a&gt; could be a potential solution.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Because all of this gave me the tools to learn about &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/proxmox&#34;&gt;Proxmox virtualization&lt;/a&gt;.
&lt;ul&gt;
&lt;li&gt;While working with QEMU to set up virtual machines was useful in setting up a Proxmox server, so was building a PC. It gave me the skills to rebuild my old desktop PC and convert it into a Proxmox server.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, for all these reasons and more, my current desktop PC is a powerhouse.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/desktop-neofetch.png&#34; alt=&#34;Desktop - Neofetch&#34; title=&#34;Desktop - Neofetch&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A neofetch of the desktop PC at rest after running VMs for nearly 2.5 days.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id=&#34;the-build&#34;&gt;The Build&lt;/h1&gt;
&lt;h2 id=&#34;hardware&#34;&gt;Hardware:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Motherboard: ROG Strix X570-E&lt;/li&gt;
&lt;li&gt;CPU: AMD Ryzen 9 5900X&lt;/li&gt;
&lt;li&gt;RAM: 64GB (4x 16GB) G.Skill Trident Z DDR4 3600MHz&lt;/li&gt;
&lt;li&gt;GPU 1: 12GB AMD Radeon RX 6700 XT GDDR6&lt;/li&gt;
&lt;li&gt;GPU 2: 8GB NVIDIA GeForce RTX 2070&lt;/li&gt;
&lt;li&gt;Storage 1: 1TB Samsung 980 Pro SSD&lt;/li&gt;
&lt;li&gt;Storage 2: 1TB Samsung 980 Pro SSD&lt;/li&gt;
&lt;li&gt;Storage 3: 4TB Seagate Barracuda HDD&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;software&#34;&gt;Software:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Artix Linux
&lt;ul&gt;
&lt;li&gt;Arch-based&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LARBS&lt;/li&gt;
&lt;li&gt;QEMU&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Installed using legacy boot (BIOS) and a fully encrypted root partition.&lt;/p&gt;
&lt;p&gt;I use LARBS, created by Luke Smith, as a desktop solution. Check out &lt;a href=&#34;https://larbs.xyz&#34;&gt;LARBS on Luke&amp;rsquo;s site&lt;/a&gt; or over on &lt;a href=&#34;https://github.com/LukeSmithxyz/LARBS&#34;&gt;Luke&amp;rsquo;s GitHub&lt;/a&gt;. It uses a combination of &lt;code&gt;dwm&lt;/code&gt; and &lt;code&gt;dmenu&lt;/code&gt; to create a simple window manager solution.&lt;/p&gt;
&lt;p&gt;One of the things I find most impressive about my desktop is not how much software it runs, but actually how &lt;em&gt;little&lt;/em&gt; software it runs.&lt;/p&gt;
&lt;p&gt;I used &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/&#34;&gt;virtualization&lt;/a&gt; to solve some of those needs. With &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/qemu&#34;&gt;QEMU&lt;/a&gt;, I can spin up a Windows machine for any software I want to use that runs best on Microsoft software. No more Wine containers, or bottles; no more Lutris; and, no more having to stash a Windows computer for &amp;ldquo;just in case.&amp;rdquo; In fact, the performance using QEMU is so good, that I even install any superfluous Linux software on a VM &lt;em&gt;first&lt;/em&gt;, meaning that the amount of software I install on bare metal is very little.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;fresh-install-bullet-points&#34;&gt;Fresh Install Bullet Points&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s how I would reinstall my current desktop if I needed to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go to my personal GitHub and reference my guides on:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/DavidVogelxyz/library/blob/master/install-os/install-arch.md&#34;&gt;Installing Artix Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/DavidVogelxyz/library/blob/master/security/secure-arch.md&#34;&gt;Security Hardening on Artix Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/DavidVogelxyz/library/blob/master/qemu/install-qemu-arch.md&#34;&gt;Installing QEMU on Artix Linux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Download LARBS for the desktop&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to those who got me here!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Building a PC
&lt;ul&gt;
&lt;li&gt;Linus Tech Tips
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=v7MYOpFONCU&#34;&gt;Video 1 - POV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=BL4DCEp7blY&#34;&gt;Video 2 - comprehensive&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Installing Artix Linux
&lt;ul&gt;
&lt;li&gt;this &lt;a href=&#34;https://videos.lukesmith.xyz/w/n1cMQYYzwPoegM2oXfz2iC&#34;&gt;video guide&lt;/a&gt; by Luke Smith (&lt;a href=&#34;https://www.youtube.com/watch?v=dI3bGeT31Bo&#34;&gt;YouTube link&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;The &lt;a href=&#34;https://wiki.artixlinux.org&#34;&gt;Artix wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;a href=&#34;https://wiki.archlinux.org&#34;&gt;Arch wiki&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Learning Artix Linux
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=d8XtNXutVto&#34;&gt;VimTutor with Vim Diesel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Using LARBS&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;helpful-videos&#34;&gt;Helpful Videos&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes1hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/v7MYOpFONCU&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;Build Computer Video #1&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes2hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/BL4DCEp7blY&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;Build Computer Video #2&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes3hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/dI3bGeT31Bo&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;Install Artix Linux with Luke Smith&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes4hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/d8XtNXutVto&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;VimTutor with Vim Diesel&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
</description>
	</item>
	
	<item>
		<title>OpenVPN Servers Using Cloud Service Providers</title>
		<link>https://davidvogel.xyz/home-lab/network/openvpn-cloud/</link>
		<pubDate>Fri, 16 Dec 2022 22:46:08 -0500</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/network/openvpn-cloud/</guid>
		<description>
&lt;p&gt;This article was written in 2023, looking back at my previous &lt;a href=&#34;https://davidvogel.xyz/home-lab/&#34;&gt;home lab projects&lt;/a&gt; and where my journey into IT began.&lt;/p&gt;







&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/network/&#34; id=&#34;tag_network&#34;&gt;Network Administration&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/openvpn-banner.png&#34; alt=&#34;OpenVPN banner&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;For more information on how I would set up a VPN server today, check out &lt;a href=&#34;https://github.com/DavidVogelxyz/library/blob/master/servers/openvpn-server-on-debian.md&#34;&gt;my guide on creating a VPN server&lt;/a&gt;, found on my GitHub.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-advantages-of-using-another-persons-computer&#34;&gt;The Advantages of Using Another Person&amp;rsquo;s Computer&lt;/h2&gt;
&lt;p&gt;At the end of 2022, I revisited VPNs. My Raspberry Pi VPN was doing a great job with allowing me remote access to my home network, but my public IP was always my own. Why did I want a different IP? So I could give my phone a VPN connection when using the internet, to reduce the amount of data I leak, and to try and control what does leak. That way, web apps, like social media apps, would believe I live in a different part of the US. I would get reminders to vote for states I didn&amp;rsquo;t live in. It felt good to push back a bit against all the unrequested, unwanted, permissionless corporate data collection.&lt;/p&gt;
&lt;p&gt;Therefore, I sought out cloud service providers (CSP) such as Vultr and Linode for access to cheap and easy-to-use computing platforms. I didn&amp;rsquo;t know it at the time, but those infrastructure-as-a-service platforms were being offered because of &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/&#34;&gt;virtualization&lt;/a&gt;. Virtualization made it easy to spin up a Debian machine, secure it, and then run the &lt;a href=&#34;https://github.com/angristan/openvpn-install&#34;&gt;OpenVPN installation script&lt;/a&gt; by Angristan. Because of how easy and cheap it was, I actually showed others how to set up their own VPN servers, in order to have alternatives to the well-known VPN service providers. It didn&amp;rsquo;t make sense to run projects I&amp;rsquo;ve already run using CSPs; but, I was excited to have them as another tool in my toolbox.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;INSERT FROM THE FUTURE:&lt;/strong&gt; I used &lt;a href=&#34;https://davidvogel.xyz/home-lab/network/openvpn-aws&#34;&gt;Amazon Web Services (AWS) to run an OpenVPN server&lt;/a&gt;. For many reasons that are detailed on that post, it was a terrible experience compared to using CSPs such as Vultr and Linode (and others like them). AWS is unnecessarily convoluted with terms, the web UI is slow, and it felt weirdly neutered (and not in a way that made it simpler).&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://davidvogel.xyz/images/cloud-dashboard.png&#34;&gt;&lt;img src=&#34;https://davidvogel.xyz/images/cloud-dashboard.png&#34; alt=&#34;Vultr - Dashboard&#34; title=&#34;Vultr - Dashboard&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;An image of a cloud service provider web dashboard showing two active servers; one for OpenVPN, and one for Hugo.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-build&#34;&gt;The Build&lt;/h2&gt;
&lt;h3 id=&#34;version-11---cloud-server-deployment-winter-2022&#34;&gt;Version 1.1 - Cloud server deployment (winter 2022)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Debian 11 (Bullseye)
&lt;ul&gt;
&lt;li&gt;UFW&lt;/li&gt;
&lt;li&gt;fail2ban&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;OpenVPN&lt;/li&gt;
&lt;li&gt;Nala (wrapper for &lt;code&gt;apt&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This build lacked much that was noteworthy. Vultr and Linode (and other CSPs like them) made it really easy to spin up a VM with a pre-installed OS, and using Debian meant that I could use the most up-to-date OS installer without casuing the script to break. It was simple and reliable. It simply worked.&lt;/p&gt;
&lt;p&gt;The only thing of note was &lt;code&gt;nala&lt;/code&gt;. It was around this time that I learned of &lt;code&gt;nala&lt;/code&gt;, a wrapper for &lt;code&gt;apt&lt;/code&gt; that made package management feel more like &lt;code&gt;pacman&lt;/code&gt; while on Debian-based systems. It&amp;rsquo;s noteworthy because, it made Debian (and by extension, Ubuntu) fun again. It was enjoyable to SSH into a server running Debian/Ubuntu and to do regular updates, if it meant getting to watch &lt;code&gt;nala&lt;/code&gt; render the output. It almost made me want to start migrating back to Debian-based systems&amp;hellip;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;fresh-install-bullet-points&#34;&gt;Fresh Install Bullet Points&lt;/h2&gt;
&lt;p&gt;Here’s how I would rebuild my VPN server if I needed to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go to my personal GitHub and reference my guide on:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/DavidVogelxyz/library/blob/master/network/install-openvpn-server.md&#34;&gt;Installing OpenVPN server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to those who got me here!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Angristan for his &lt;a href=&#34;https://github.com/angristan/openvpn-install&#34;&gt;script&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mental Outlaw for his &lt;a href=&#34;https://odysee.com/@AlphaNerd:8/how-to-create-your-own-vpn-(and-why)&#34;&gt;video about creating an OpenVPN server&lt;/a&gt; (&lt;a href=&#34;https://www.youtube.com/watch?v=Lk_v6Q0YsNo&#34;&gt;YouTube link&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;helpful-videos&#34;&gt;Helpful Videos&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes1hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/Lk_v6Q0YsNo&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;How to Create a VPN Server with Mental Outlaw&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
</description>
	</item>
	
	<item>
		<title>Bitcoin Node: Version 3</title>
		<link>https://davidvogel.xyz/home-lab/bitcoin/bitcoin-node-v3/</link>
		<pubDate>Fri, 11 Nov 2022 15:58:03 -0500</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/bitcoin/bitcoin-node-v3/</guid>
		<description>
&lt;p&gt;This article was written in 2023, looking back at my previous &lt;a href=&#34;https://davidvogel.xyz/home-lab/&#34;&gt;home lab projects&lt;/a&gt; and where my journey into IT began.&lt;/p&gt;







&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/bitcoin/&#34; id=&#34;tag_bitcoin&#34;&gt;Bitcoin Nodes&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/arch-banner.png&#34; alt=&#34;Arch banner&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;This article describes an outdated way to build a Bitcoin node. For more information on how I would set up a Bitcoin node today, check out &lt;a href=&#34;https://github.com/DavidVogelxyz/library/blob/master/servers/bitcoin-node-on-debian.md&#34;&gt;my guide on creating a Bitcoin node&lt;/a&gt;, found on my GitHub.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;leveling-up-my-bitcoin-node-even-further&#34;&gt;Leveling Up My Bitcoin Node Even Further&lt;/h2&gt;
&lt;p&gt;By the end of 2022, I had been running the &lt;a href=&#34;https://davidvogel.xyz/home-lab/bitcoin/bitcoin-node-v2#the-build&#34;&gt;Bitcoin Node Version 2.1&lt;/a&gt; for about a year. It had been running incredibly robustly since I brought it online, and especially after upgrading it to Ubuntu 22.04 LTS in May 2022. But, it also gave off a sense of staleness. I had thought about testing out some potential upgrades, and the end of the year provided the time. And, it was the perfect time, because it was just about the &lt;strong&gt;two year anniversary&lt;/strong&gt; since I started running Ubuntu Linux servers.&lt;/p&gt;
&lt;p&gt;I upgraded the Bitcoin node in a big way. I upgraded the hardware to a badass mini laptop meant for gaming; except, instead, I threw a 1TB SSD inside and made it into a portable powerhouse. I also moved away from Ubuntu, right past Debian, and installed Arch Linux. Why not? Then, on top of Arch, I installed a more powerful indexer, Fulcrum, that was going to make my Mempool explorer quicker and my wallet sync even faster. Finally, I added a web UI dashboard, so I can keep track of my home lab web links for later.&lt;/p&gt;
&lt;p&gt;The upgrade had its challenges. There were issues with networking and with nginx, and there were some issues that had to do with differences between Debian-based systems and Arch-based ones. Some packages had extra installation steps that I was unaware of. It was not easy.&lt;/p&gt;
&lt;p&gt;But, as I perservered through each problem, I became better at troubleshooting issues. I learned more about Linux and about how different softwares interact with each other. I practiced finding my own answers, instead of being able to ask someone for help. It was a struggle, but I came out a better Linux user because of it.&lt;/p&gt;
&lt;p&gt;The Version 3 era is also where I really developed a love for building servers. The emptiness of my Homer web dashboard was an invitation to deploy more services and create as many buttons as possible. I also developed an interest in writing scripts so that I could quickly re-deploy my installs instead of copy-pasting commands again and again. That would allow me to build a foundation of knowledge and skill, such that I could reiterate the base layer far more quickly, and spend more time working on new additions to my home lab.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-build&#34;&gt;The Build&lt;/h2&gt;
&lt;h3 id=&#34;version-30-fall-2022&#34;&gt;Version 3.0 (fall 2022)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Arch Linux (x86)
&lt;ul&gt;
&lt;li&gt;UFW&lt;/li&gt;
&lt;li&gt;fail2ban&lt;/li&gt;
&lt;li&gt;nginx&lt;/li&gt;
&lt;li&gt;Tor daemon&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bitcoin Core (daemon)&lt;/li&gt;
&lt;li&gt;Fulcrum (indexer)&lt;/li&gt;
&lt;li&gt;Mempool (timechain explorer)
&lt;ul&gt;
&lt;li&gt;MariaDB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Homer web dashboard&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some key notes about upgrading to Version 3.0:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Getting networking at the beginning of the setup process takes a bit more work.&lt;/li&gt;
&lt;li&gt;Ubuntu has a user named &amp;lsquo;www-data&amp;rsquo;; on Arch, this user is named &amp;lsquo;http&amp;rsquo;. In addition, the Arch directory is located at &amp;lsquo;/srv/http&amp;rsquo;, rather than whatever Ubuntu is. This took me a while to figure out, and I was not able to get Mempool nor NGINX working until I did.&lt;/li&gt;
&lt;li&gt;Some of the directories for NGINX needs to be manually added. Not sure why, but a quick &lt;code&gt;mkdir&lt;/code&gt; fixes this.&lt;/li&gt;
&lt;li&gt;Some of the package names are different.&lt;/li&gt;
&lt;li&gt;Installing MariaDB has additional steps.&lt;/li&gt;
&lt;li&gt;In addition, when installing Mempool, certain files need to be redirected to point to the right direction or use the right user.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;While it runs &lt;code&gt;systemd&lt;/code&gt; just like the Version 2 era Ubuntu servers, it boots incredibly fast. I believe it has something to do with how the full disk encryption was set up, because the Version 2 Ubuntu servers all boot much slower than the Version 3 Arch servers.&lt;/p&gt;
&lt;p&gt;Another difference between the two Version eras is the encryption passphrase entry at startup. Ubuntu was far slower to process the entry, and would only allow one entry before forcing the user to shutdown and restart to attempt the unlock again. In contrast, the Version 3 Arch servers process entries very quickly and allow multiple attempts.&lt;/p&gt;
&lt;p&gt;Fulcrum was also a massive success at speeding up the wallet lookups. Everything became near instant, especially on the local network, which I now was addicted to using. With the power of the VPNs, I could always use this fast connection to use my wallets and check on transactions using the Mempool explorer. Life&amp;rsquo;s good.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;fresh-install-bullet-points&#34;&gt;Fresh Install Bullet Points&lt;/h2&gt;
&lt;p&gt;Here’s how I would rebuild my Bitcoin node if I needed to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go to my personal GitHub and reference my guides on:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/DavidVogelxyz/library/blob/master/install-os/install-arch.md&#34;&gt;Installing Arch Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/DavidVogelxyz/library/blob/master/security/secure-arch.md&#34;&gt;Security Hardening on Arch Linux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to those who got me here!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stadicus again for his &lt;a href=&#34;https://raspibolt.org/&#34;&gt;Raspibolt guide series&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;I learned how to install Arch (and Artix) Linux with assistance from:
&lt;ul&gt;
&lt;li&gt;the &lt;a href=&#34;https://wiki.archlinux.org&#34;&gt;Arch wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;this &lt;a href=&#34;https://videos.lukesmith.xyz/w/n1cMQYYzwPoegM2oXfz2iC&#34;&gt;video guide&lt;/a&gt; by Luke Smith (&lt;a href=&#34;https://www.youtube.com/watch?v=dI3bGeT31Bo&#34;&gt;YouTube link&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;helpful-videos&#34;&gt;Helpful Videos&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes1hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/dI3bGeT31Bo&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;Installing Arch Linux with Luke Smith&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
</description>
	</item>
	
	<item>
		<title>OpenVPN Server on a Raspberry Pi</title>
		<link>https://davidvogel.xyz/home-lab/network/openvpn-raspberry-pi/</link>
		<pubDate>Mon, 23 May 2022 22:46:08 -0400</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/network/openvpn-raspberry-pi/</guid>
		<description>
&lt;p&gt;This article was written in 2023, looking back at my previous &lt;a href=&#34;https://davidvogel.xyz/home-lab/&#34;&gt;home lab projects&lt;/a&gt; and where my journey into IT began.&lt;/p&gt;







&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/network/&#34; id=&#34;tag_network&#34;&gt;Network Administration&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/openvpn-banner.png&#34; alt=&#34;OpenVPN banner&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;For more information on how I would set up a VPN server today, check out &lt;a href=&#34;https://github.com/DavidVogelxyz/library/blob/master/servers/openvpn-server-on-debian.md&#34;&gt;my guide on creating a VPN server&lt;/a&gt;, found on my GitHub.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;vpns-done-right&#34;&gt;VPNs Done Right&lt;/h2&gt;
&lt;p&gt;Most people don&amp;rsquo;t understand VPNs. This is mostly due to effective marketing by companies selling VPN services. People believe VPNs are far more than they actually are. But, VPN still have utility, if applied correctly.&lt;/p&gt;
&lt;p&gt;The one and only utility that a VPN provides is the ability to relocate the point where one&amp;rsquo;s local traffic becomes wider internet traffic. Put simply, VPN servers allows an individual to change their public IP address. Uses for this include remotely accessing private networks, such as a corporate or home network, or pretending to be somewhere else to get a different country&amp;rsquo;s streaming service catalog. For this purpose, a VPN service with access to servers in different countries may have use.&lt;/p&gt;
&lt;p&gt;VPNs are claimed to be secure because of the &lt;strong&gt;encryption&lt;/strong&gt; provided by the VPN tunnel. Because traffic leaves the client computer and transits over to the &amp;ldquo;external local network&amp;rdquo; using an encrypted tunnel, the client&amp;rsquo;s ISP no longer has &amp;ldquo;provider-level access&amp;rdquo; to the client data. But, that access doesn&amp;rsquo;t go away &amp;ndash; the control is simply transferred over to the ISP of the VPN server. This is one big caveat to the marketing reads of the VPN service companies regarding security.&lt;/p&gt;
&lt;p&gt;With this in mind, in the spring of 2022, I used another Raspberry Pi to deploy an OpenVPN server. I was deploying the server simply to gain remote access to my home network using an encrypted connection. Nothing more, nothing less.&lt;/p&gt;
&lt;p&gt;The OpenVPN Pi server was awesome. It was one of my most stable server projects, achieving a &amp;gt;99% uptime for the 6 months that it ran. I tested it from across the world and I was always able to connect, no matter what. And, it was much faster than the hidden services I had been routing through the Tor onion network. The OpenVPN Raspberry Pi project was also the first to open my eyes to networking. While I had been communicating with my Bitcoin and camera servers over the local network and over Tor, being able to set up a Raspberry Pi to enable full network access from anywhere across the world, with minimal latency, was incredibly cool.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-build&#34;&gt;The Build&lt;/h2&gt;
&lt;h3 id=&#34;version-10---raspberry-pi-4-8gb-spring-2022&#34;&gt;Version 1.0 - Raspberry Pi 4, 8GB (spring 2022)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu Server 20.04 LTS (arm64)
&lt;ul&gt;
&lt;li&gt;UFW&lt;/li&gt;
&lt;li&gt;fail2ban&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;OpenVPN&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Regarding operating systems, it is worth noting that Ubuntu 22.04 LTS (Jammy Jellyfish) had already released by the time I started this project. However, due to issues of package dependencies and wanting different version, I was unable to get Ubuntu 22.04 working with the &lt;a href=&#34;https://github.com/angristan/openvpn-install&#34;&gt;script&lt;/a&gt; I was using to install the OpenVPN server. I had to downgrade to Ubuntu 20.04 (Focal Fossa) in order to get everything working.&lt;/p&gt;
&lt;p&gt;It is also worth noting that current Debian systems seems to work fine as well &amp;ndash; it is &lt;em&gt;only&lt;/em&gt; Ubuntu, and &lt;em&gt;only&lt;/em&gt; versions 22.04 and above, that have the issues with the script.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;fresh-install-bullet-points&#34;&gt;Fresh Install Bullet Points&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;NB: The Raspberry Pi OpenVPN server was the first way I learned to set up a VPN server, but it is only one of many ways. From spinning up a &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/docker&#34;&gt;Docker container&lt;/a&gt; or a &lt;a href=&#34;https://davidvogel.xyz/home-lab/virtualization/proxmox&#34;&gt;Proxmox VM&lt;/a&gt;, to running the server on the cloud (with &lt;a href=&#34;https://davidvogel.xyz/home-lab/network/openvpn-cloud&#34;&gt;Linode&lt;/a&gt;, not &lt;a href=&#34;https://davidvogel.xyz/home-lab/network/openvpn-aws&#34;&gt;AWS&lt;/a&gt;), to running the VPN server directly on a &lt;a href=&#34;https://davidvogel.xyz/home-lab/network/pfsense&#34;&gt;pfSense router&lt;/a&gt;, there are so many options to choose from. Building another Raspberry Pi VPN server would be driven almost entirely by circumstance.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here’s how I would rebuild my VPN server if I needed to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go to my personal GitHub and reference my guide on:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/DavidVogelxyz/library/blob/master/network/install-openvpn-server.md&#34;&gt;Installing OpenVPN server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to those who got me here!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Angristan for his &lt;a href=&#34;https://github.com/angristan/openvpn-install&#34;&gt;script&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mental Outlaw for his &lt;a href=&#34;https://odysee.com/@AlphaNerd:8/how-to-create-your-own-vpn-(and-why)&#34;&gt;video about creating an OpenVPN server&lt;/a&gt; (&lt;a href=&#34;https://www.youtube.com/watch?v=Lk_v6Q0YsNo&#34;&gt;YouTube link&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;helpful-videos&#34;&gt;Helpful Videos&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes1hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/Lk_v6Q0YsNo&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;How to Create a VPN Server with Mental Outlaw&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
</description>
	</item>
	
	<item>
		<title>Cameras using MotionEyeOS</title>
		<link>https://davidvogel.xyz/home-lab/other/cameras/</link>
		<pubDate>Tue, 08 Mar 2022 22:35:03 -0500</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/other/cameras/</guid>
		<description>
&lt;p&gt;This article was written in 2023, looking back at my previous &lt;a href=&#34;https://davidvogel.xyz/home-lab/&#34;&gt;home lab projects&lt;/a&gt; and where my journey into IT began.&lt;/p&gt;







&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/other/&#34; id=&#34;tag_other&#34;&gt;Other Projects&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;h2 id=&#34;open-source-home-camera-system&#34;&gt;Open-source home camera system&lt;/h2&gt;
&lt;p&gt;The MotionEyeOS camera project was mostly a project of &amp;ldquo;what&amp;rsquo;s possible?&amp;rdquo; I took a couple of Raspberry Pi and deployed new software, turning them into a combination of a camera server and multiple wireless cameras. Being able to self-host software that was being sold commerically was really cool, because it meant that &amp;ldquo;my data&amp;rdquo; would stay &amp;ldquo;my data.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;This project also proved that self-hosting didn&amp;rsquo;t have to mean a loss of features &amp;ndash; I had multiple cameras set up around the house, communicating wirelessly, live streaming video in decent quality, with the ability to do video capture when they sensed motion. This project was a demonstration that I didn&amp;rsquo;t have to trust some faceless corporation with my camera data, I could do it myself using free and open-source software (FOSS).&lt;/p&gt;
&lt;p&gt;As I found out in 2023 when attempting to install MotionEyeOS into a Docker container, there are no images for MotionEyeOS that work on the x86 platform. Therefore, I was unable to test out the software again, as I did not have an interest in reinstalling the OS onto a Raspberry Pi.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-build&#34;&gt;The Build&lt;/h2&gt;
&lt;h3 id=&#34;hardware-stack&#34;&gt;Hardware stack:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Raspberry Pi 4, 8GB (server)&lt;/li&gt;
&lt;li&gt;Raspberry Pi 4, 8GB (camera)&lt;/li&gt;
&lt;li&gt;Raspberry Pi Zero W (camera)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I remember having one issue with the web UI related to adding cameras. I think the issue was not including &lt;code&gt;http://&lt;/code&gt; in front of the camera&amp;rsquo;s IP address.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://davidvogel.xyz/images/motioneye-add-camera.png&#34; alt=&#34;MotionEye - Add Camera&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The issue -was- not including &amp;ldquo;http://&amp;rdquo; in front of the camera IP addresses. Image from &lt;a href=&#34;https://github.com/motioneye-project/motioneye/wiki/Screenshots&#34;&gt;MotionEye GitHub&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;fresh-install-bullet-points&#34;&gt;Fresh Install Bullet Points&lt;/h2&gt;
&lt;p&gt;Here’s how I would rebuild my camera system if I needed to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Follow the &lt;a href=&#34;https://github.com/motioneye-project/motioneyeos/wiki/Installation&#34;&gt;MotionEyeOS documentation&lt;/a&gt; to set up the server&lt;/li&gt;
&lt;li&gt;Then, use the same documentation to set up the cameras&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to those who got me here!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tom from Lawrence Systems on Youtube for &lt;a href=&#34;https://www.youtube.com/watch?v=og-zI0CozLs&amp;amp;t=730s&#34;&gt;verification re adding cameras&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;helpful-videos&#34;&gt;Helpful Videos&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes1hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/og-zI0CozLs?start=730&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;Raspberry Pi Motion Detection Surveillance Camera System using MotionEyeOS&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
</description>
	</item>
	
	<item>
		<title>Bitcoin Node: Version 2</title>
		<link>https://davidvogel.xyz/home-lab/bitcoin/bitcoin-node-v2/</link>
		<pubDate>Sat, 18 Dec 2021 21:26:15 -0500</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/bitcoin/bitcoin-node-v2/</guid>
		<description>
&lt;p&gt;This article was written in 2023, looking back at my previous &lt;a href=&#34;https://davidvogel.xyz/home-lab/&#34;&gt;home lab projects&lt;/a&gt; and where my journey into IT began.&lt;/p&gt;







&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/bitcoin/&#34; id=&#34;tag_bitcoin&#34;&gt;Bitcoin Nodes&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;This article describes an outdated way to build a Bitcoin node. For more information on how I would set up a Bitcoin node today, check out &lt;a href=&#34;https://github.com/DavidVogelxyz/library/blob/master/servers/bitcoin-node-on-debian.md&#34;&gt;my guide on creating a Bitcoin node&lt;/a&gt;, found on my GitHub.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;going-down-the-rabbit-hole-of-headless-servers&#34;&gt;Going Down the Rabbit Hole of Headless Servers&lt;/h2&gt;
&lt;p&gt;My first home lab project was about to level up in a big way.&lt;/p&gt;
&lt;p&gt;My first experience with a headless server was in the spring of 2021. I reinitialized my Raspberry Pi with Ubuntu Server and I forced myself to set up a node from scratch using only the command line. With some help and assistance and some guide videos, I made it happen. Skills I had just learned continued to develop:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;software integrity checks using GPG&lt;/li&gt;
&lt;li&gt;full disk encryption&lt;/li&gt;
&lt;li&gt;networking through the Tor network&lt;/li&gt;
&lt;li&gt;writing service files&lt;/li&gt;
&lt;li&gt;connecting new software to other self-hosted services&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also gained some new skills and abilities. Those included learning how to SSH, in addition to learning how to SSH securely by securing &lt;code&gt;sshd&lt;/code&gt; using public/private key pairs. I learned how to troubleshoot multiple Raspberry Pi servers and maintain maximum uptime and high availability. I also combined SSH with a previous skill, Tor networking, in order to expose a Tor hidden service so I could remotely administer a server without exposing my home IP address. It was slow, but it was private and it was encrypted. It was also really cool.&lt;/p&gt;
&lt;p&gt;The high achievement of the Version 2 era was the end of 2021, when I upgraded the entire headless software stack to include the block indexer. Suddenly, my node was supercharged. It powered stronger wallet software and a more aesthetically pleasing (yet incredibly useful) web-based timechain explorer. It also had better security with a firewall and software to limit the potential for DDoS attacks by banning spam attacks. That&amp;rsquo;s pretty cool.&lt;/p&gt;
&lt;p&gt;The best part was that, in just a year, I had managed to go from running my node on Windows 10 (LOL) to running my node on Linux, with just a command line. So freaking awesome.&lt;/p&gt;
&lt;p&gt;This new node was so good that it basically ran uninterrupted from the end of 2021 until the end of 2022, when it was upgraded to the new &lt;a href=&#34;https://davidvogel.xyz/home-lab/bitcoin/bitcoin-node-v3&#34;&gt;Version 3&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://davidvogel.xyz/images/mempool-dashboard.png&#34;&gt;&lt;img src=&#34;https://davidvogel.xyz/images/mempool-dashboard.png&#34; alt=&#34;Mempool - Dashboard&#34; title=&#34;Mempool - Dashboard&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;An image of the home page of the web UI for the Mempool explorer, added to the Bitcoin node stack in Version 2.1. A public version of the website can be found at &lt;a href=&#34;https://mempool.space&#34;&gt;mempool.space&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-build&#34;&gt;The Build&lt;/h2&gt;
&lt;h3 id=&#34;version-20-spring-2021&#34;&gt;Version 2.0 (spring 2021)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu Server 20.04 LTS (arm64)
&lt;ul&gt;
&lt;li&gt;Tor daemon&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bitcoin Core (daemon)&lt;/li&gt;
&lt;li&gt;Specter Wallet (Server)&lt;/li&gt;
&lt;li&gt;btc-rpc-explorer&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;version-21-winter-2021&#34;&gt;Version 2.1 (winter 2021)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu Server 22.04 LTS (arm64)
&lt;ul&gt;
&lt;li&gt;UFW&lt;/li&gt;
&lt;li&gt;fail2ban&lt;/li&gt;
&lt;li&gt;nginx&lt;/li&gt;
&lt;li&gt;Tor daemon&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bitcoin Core (daemon)&lt;/li&gt;
&lt;li&gt;Electrs (indexer)&lt;/li&gt;
&lt;li&gt;Mempool (timechain explorer)
&lt;ul&gt;
&lt;li&gt;MariaDB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To address a potential discrepancy, Version 2.1 ran Ubuntu 20.04 LTS until spring 2022, when Ubuntu 22.04 LTS was released. Since Version 2.1 ran 22.04 for the majority of its life, it is listed as such.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;NB: Around this time, I also learned that Ubuntu Desktop can be made into Ubuntu Server by setting the &lt;code&gt;systemd&lt;/code&gt; boot to be &lt;code&gt;multi-user&lt;/code&gt; and not &lt;code&gt;graphical&lt;/code&gt;. To go further, the desktop environment can be uninstalled, as well as the &lt;code&gt;snap&lt;/code&gt; related packages and any other Ubuntu bloat.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;fresh-install-bullet-points&#34;&gt;Fresh Install Bullet Points&lt;/h2&gt;
&lt;p&gt;This version, and all of its subversions, have been retired in favor of a more recent version. Check &lt;a href=&#34;https://davidvogel.xyz/home-lab/bitcoin/&#34;&gt;this page&lt;/a&gt; for the most up-to-date version of the Bitcoin node stack.&lt;/p&gt;
&lt;p&gt;Thanks to those who got me here!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tj for his &lt;a href=&#34;https://help.ubuntu.com/community/Full_Disk_Encryption_Howto_2019&#34;&gt;guide to &amp;ldquo;Full Disk Encryption on Ubuntu&amp;rdquo;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Stadicus for his &lt;a href=&#34;https://raspibolt.org/&#34;&gt;Raspibolt guide series&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
	</item>
	
	<item>
		<title>Bitcoin Node: Version 1</title>
		<link>https://davidvogel.xyz/home-lab/bitcoin/bitcoin-node-v1/</link>
		<pubDate>Thu, 18 Feb 2021 21:26:15 -0500</pubDate>
		
		<guid>https://davidvogel.xyz/home-lab/bitcoin/bitcoin-node-v1/</guid>
		<description>
&lt;p&gt;This article was written in 2023, looking back at my previous &lt;a href=&#34;https://davidvogel.xyz/home-lab/&#34;&gt;home lab projects&lt;/a&gt; and where my journey into IT began.&lt;/p&gt;







&lt;p&gt;This article is part of a series on &lt;a href=&#34;https://davidvogel.xyz/home-lab/bitcoin/&#34; id=&#34;tag_bitcoin&#34;&gt;Bitcoin Nodes&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;


&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;This article describes an outdated way to build a Bitcoin node. For more information on how I would set up a Bitcoin node today, check out &lt;a href=&#34;https://github.com/DavidVogelxyz/library/blob/master/servers/bitcoin-node-on-debian.md&#34;&gt;my guide on creating a Bitcoin node&lt;/a&gt;, found on my GitHub.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;my-first-home-server&#34;&gt;My First Home Server&lt;/h2&gt;
&lt;p&gt;My first home lab project was a Bitcoin node.&lt;/p&gt;
&lt;p&gt;This was back in the spring of 2020, during the coronavirus lockdown times. I knew nothing of building home labs at the time. I really knew nothing at all besides Windows, and a little bit of Mac OS. The first iteration of my Bitcoin node was nothing more than a Dell laptop running Windows 10 with Bitcoin Core GUI running on top of that. It was simple, and it allowed me to connect my Wasabi Wallet software to it. But, the more I learned about Bitcoin nodes, the more I understood that the next step was for me to harness the power of the command line. To do that, I would need to install Linux.&lt;/p&gt;
&lt;p&gt;I ran Linux for the first time in the winter of 2020. I wasn&amp;rsquo;t ready for the full command line experience, so I installed Ubuntu Desktop onto a laptop and ran the Bitcoin Core GUI. On the surface, all I had done was import my Windows experience onto Linux. This was mostly true. My use with Linux was primarily graphical, which meant a lot of clicking through a GUI. But, I was beginning to gain a little experience with pulling up a terminal and entering some commands.&lt;/p&gt;
&lt;p&gt;My next move was to free up the laptop and install my node onto a Raspberry Pi. At the start (January 2021), I continued to use Ubuntu Desktop, same as before. But, I started to train new skills such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;doing software integrity checks using GPG&lt;/li&gt;
&lt;li&gt;performing full disk encryption&lt;/li&gt;
&lt;li&gt;networking services through the Tor network&lt;/li&gt;
&lt;li&gt;writing service files to run software at startup&lt;/li&gt;
&lt;li&gt;installing new software and connecting it to other self-hosted services&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As I did, I also noticed how cumbersome my setup was. On the occassions that I wanted to check in on my server, I had to put together a complete monitor-keyboard-mouse setup that I would be putting away at the end of the check-in. In addition, I was also becoming painfully aware of how slow the Raspberry Pi was, because I demanded a graphical interface.&lt;/p&gt;
&lt;p&gt;So, for &lt;a href=&#34;https://davidvogel.xyz/home-lab/bitcoin/bitcoin-node-v2&#34;&gt;Version 2&lt;/a&gt;, I decided to go completely headless. My server, that is.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://davidvogel.xyz/images/btc-rpc-explorer.png&#34;&gt;&lt;img src=&#34;https://davidvogel.xyz/images/btc-rpc-explorer.png&#34; alt=&#34;btc-rpc-explorer&#34; title=&#34;btc-rpc-explorer Dashboard&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;An image of the dashboard of the web UI for the btc-rpc-explorer (Version 1.2 era). This is an image from the public version of the website, which can be accessed using &lt;a href=&#34;https://bitcoinexplorer.org/&#34;&gt;this link&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-build&#34;&gt;The Build&lt;/h2&gt;
&lt;h3 id=&#34;version-10---windows-10-laptop-spring-2020&#34;&gt;Version 1.0 - Windows 10 (laptop; spring 2020)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Windows 10
&lt;ul&gt;
&lt;li&gt;Tor daemon&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bitcoin Core (GUI)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;version-11---ubuntu-desktop-laptop-winter-2020&#34;&gt;Version 1.1 - Ubuntu Desktop (laptop; winter 2020)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu Desktop 20.04 LTS (x86)
&lt;ul&gt;
&lt;li&gt;Tor daemon&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bitcoin Core (GUI)&lt;/li&gt;
&lt;li&gt;Specter Wallet (Server)&lt;/li&gt;
&lt;li&gt;btc-rpc-explorer&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;version-12---ubuntu-desktop-raspberry-pi-4-8gb-early-2021&#34;&gt;Version 1.2 - Ubuntu Desktop (Raspberry Pi 4, 8GB; early 2021)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu Desktop 20.04 LTS (arm64)
&lt;ul&gt;
&lt;li&gt;Tor daemon&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bitcoin Core (GUI)&lt;/li&gt;
&lt;li&gt;Specter Wallet (Server)&lt;/li&gt;
&lt;li&gt;btc-rpc-explorer&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;fresh-install-bullet-points&#34;&gt;Fresh Install Bullet Points&lt;/h2&gt;
&lt;p&gt;This version, and all of its subversions, have been retired in favor of a more recent version. Check &lt;a href=&#34;https://davidvogel.xyz/home-lab/bitcoin/&#34;&gt;this page&lt;/a&gt; for the most up-to-date version of the Bitcoin node stack.&lt;/p&gt;
&lt;p&gt;Thanks to those who got me here!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://askubuntu.com/questions/1287837/luks-disk-encryption-on-raspberry-pi-4-and-ubuntu-desktop-20-10&#34;&gt;This forum post&lt;/a&gt; for explaining how to do full disk encryption on a Raspberry Pi&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://k3tan.com&#34;&gt;Ketan&lt;/a&gt; &amp;amp; Ministry of Nodes for &lt;a href=&#34;https://www.youtube.com/playlist?list=PLCRbH-IWlcW290O0N0lQV6efxuCA5Ja8c&#34;&gt;this YouTube playlist&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;helpful-videos&#34;&gt;Helpful Videos&lt;/h2&gt;
&lt;h2 id=&#34;hahahugoshortcodes1hbhb&#34;&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/gT1izYKvhBw?list=PLCRbH-IWlcW290O0N0lQV6efxuCA5Ja8c&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;Node Box Guide by Ministry of Nodes&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/h2&gt;
</description>
	</item>
	
	</channel>
</rss>
