I have quite a bit of computer hardware experience, but I don't
            get to practice it much since industries have pushed towards
            cloud computing. Self hosting is still a valuable skill and works
            great for smaller projects and particular use cases where cloud
            isn't required. Also many skills are transferable, such as using
            docker or setting up firewall.
        
        
        
        
            
Hardware
             
            
            For around $60, and an old outdated laptop, I can have a custom server
                with minimal to no monthly costs.
            
            
                
                  Benefits of Self Hosting 
                
                
                  
                    |  | AWS Free Tier | Old Computer | 
                
                
                  
                    | RAM | 1 GB | 32GB | 
                  
                    | Storage | 5GB | 2048 GB+ | 
                  
                    | Uptime | 750 Hours/Month | Unlimited | 
                
              
              There's a handful of other reasons too. Customizability, 
                no sunk costs, no surge pricing, no subscriptions, and
                no certification required.
              
        
    
        
            Operating System - Linux
            For the OS, I chose the Linux Ubuntu Server
                since it's widely used and has lots of documentation. It's also free and
                relatively easy to setup. They also provide a free desktop OS, which
                helps bring in users and developers
 
            Using a Linux server has a few benefits. Being a server OS, 
                it's designed to be "headless." Headless means that
                there's no desktop, and it's interacted with through a terminal. 
                Similar to the original computers. This ultimately 
                saves resources and 
                improves automation
            OS Install Setup: (simplified)
            
                - Download and flash Ubuntu Server's ISO to a removable drive ⚡
                    
                
                - Boot the server from the removable drive 🐛
                    -  Depending on the BIOS/PC, the process of telling a computer to boot from a 
                        specific drive can vary. It may require pressing F8 before another drive boots,
                        going into BIOS settings, or nothing at all. 
                    
 
 
- Complete the setup prompts ✅
                    -  Linux will ask for some help: connecting to the internet, knowing which
                        drive to use, and what packages + settings you want. Depending on the version or OS, this
                        may be easy or complicated
                    
 
Post-Install Setup: (optional)
            
                - Activate Firewall 🦺
                    - In My situation, I'll be port forwarding, 
                        exposing the server to the internet. I went through a firewall setup
                        to ensure only certain ports are open.
                    
 
- Setup + Test SSH 🖥️📡🖥️
                    - Many people prefer to connect to the server
                        on another computer. This means you won't need a second monitor, 
                        keyboard, etc. Establishing this connection can be done many ways.
                        I used OpenSHH which came default on Ubuntu Server and 
                        Mobaxterm
                        to provide a UI for the SSH connection. I tried VSCode for hours and it was all errors.
                    
 
- Move/Store Server Hardware 📦
                    - If you don't plan to interact with the computer much, 
                        then consider placing it somewhere safe and secure. Away from liquids, pets, 
                        and in a spot with good wifi (or wired is best). Airflow and clean air matter
                        to the health of the hardware.
                    
 
Software
            My first project was getting a gaming server setup. I wanted to use Minecraft due to it's relatively open source nature
            Setting up Java Developer Kit
            Normally, this is a pretty  simple setup. Even using ChatGPT, it suggest running 
                
- sudo apt install openjdk-17-jre-headless
                This used to work and was the case for years, but in this case, the AI models like GPT and Gemini are outdated: 
                 
            But according to the  and official patch notes and  the wiki, 
                it's been using Java 21 since Apr 2024, so be careful blindly trusting AI. Run this instead:
                
- sudo apt install openjdk-21-jre-headless
            
            Open Ports in Linux
            The server needs to know where to allow and direct traffic. This allows people from outside 
                the network (others online) to connect to the server. The standard minecraft port is 25565
                but any port works. To open this port run:
                
            
            Retrieve the Installer
            The installer will be a .jar file provided here
                Copy the link to the .jar file like seen below:
                
                The reason we want the link, and not the file downloaded, is we can automatically download it with a command on the server. Run:
                
                 Replace  the "https://..." with the actual link and it will download it to the current directory From there you can run:
                - java -Xmx4GB -Xms4GB -jar server.jar nogui
and this will get the server setup going.
        
        
        
            
Network
            To allow others to access the server, the router needs to know that it can direct traffic in and out.
                It needs to be told what traffic to allow (request to port 25565), and where (to the local IP of the server)
            Port Forwarding
            To access the router's settings, you need to find the network's "Default Gateway" on the
                non-server device. This can be done by running the command "ipconfig" in Command Prompt, or  the equivalent in other terminals
 
            The default gateway will look something like "192.168.__.__" and can be copy pasted into the browser to access the UI for the
                router:
             
            This is an example of what it may look like after navigating to the Port Forwarding tab. By filling out this form
                you can expose the server to the web and allow others to connect. Specifics for port forwarding vary a lot depending on the device.
            
            Networking Notes:
            
                - Protocol Option 
                    - 
                        The form will request you chose a protocol. There are many options, but TCP is the only
                        one required by Minecraft. Some say TCP+UDP is the right option, but UDP is not used
                    
 
- Reverse Proxy
                    - 
                        It is very often suggested to setup a reverse proxy to handle disguising your IP. For most
                        situations where you only share the IP with a few people, don't leave it on 24/7, and don't have
                        anything sensitive in reach of the server, this may not be necessary,
                    
 
- Domain Name
                    - Along with the reverse proxy, you can use a custom domain name 
                        to further disguise your public IP. This isn't really hiding your IP, but allowing it to be
                        reached using a more easy to spell and remember name.