<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Carmen</title>
    <description>The latest articles on Forem by Carmen (@carmoruda).</description>
    <link>https://forem.com/carmoruda</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F832779%2F24b18339-e4b4-4386-9909-48f71d5783a9.png</url>
      <title>Forem: Carmen</title>
      <link>https://forem.com/carmoruda</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/carmoruda"/>
    <language>en</language>
    <item>
      <title>Setting Up Minecraft Server in AWS</title>
      <dc:creator>Carmen</dc:creator>
      <pubDate>Tue, 26 Aug 2025 22:06:50 +0000</pubDate>
      <link>https://forem.com/carmoruda/setting-up-minecraft-server-in-aws-4kci</link>
      <guid>https://forem.com/carmoruda/setting-up-minecraft-server-in-aws-4kci</guid>
      <description>&lt;p&gt;Hosting your own Minecraft server is one of the best ways to enjoy the game with friends, explore custom worlds, or add plugins that make the experience unique. In this guide, we’ll walk through how to set up a fully functional Minecraft server on &lt;strong&gt;Amazon Web Services (AWS)&lt;/strong&gt; using &lt;strong&gt;EC2&lt;/strong&gt;. By the end, you’ll have a server that starts automatically, uses a static IP so players can always connect, and can be customized with plugins or new worlds, all while keeping costs under control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Set up the Server (EC2 Instance)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Log in&lt;/strong&gt; to &lt;a href="https://aws.amazon.com/console/" rel="noopener noreferrer"&gt;AWS Management Console&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Choose a region&lt;/strong&gt;: In the top-right corner, select the AWS region closest to your players.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Example: If most players are on the US West Coast, select one of the us-west regions.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open the EC2 service:&lt;/strong&gt; Search for EC2 in the console search bar and open the dashboard.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Launch a new instance:&lt;/strong&gt; Click on Launch instance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure the instance:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Give the instance a descriptive name, such as “&lt;em&gt;Minecraft Server&lt;/em&gt;”.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Amazon Linux 2023 AMI.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Set the architecture to &lt;strong&gt;64-bit (Arm).&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Select the instance type:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start with &lt;em&gt;t4g.small&lt;/em&gt;, which is enough for a basic Minecraft server (it’s fine for a few players, but laggy with mods or &amp;gt;5 players. If you expect more, go to &lt;em&gt;t4g.medium&lt;/em&gt; or larger).&lt;/li&gt;
&lt;li&gt;If you need more performance later, you can &lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-resize.html" rel="noopener noreferrer"&gt;resize/upgrade the instance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;For compute-intensive workloads, consider using the &lt;em&gt;C family&lt;/em&gt; (Compute Optimized) instances.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6cx5nk89jsmv6dya2s8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6cx5nk89jsmv6dya2s8.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Create a Key Pair:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Under &lt;strong&gt;Key pair name&lt;/strong&gt;, click &lt;strong&gt;Create a new key pair&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enter a name for the key (e.g.&lt;em&gt;, minecraft-key&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create a key pair.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The private key file (&lt;code&gt;.pem&lt;/code&gt;) will be automatically downloaded to your computer. Keep this file safe (you will need it later if you want to connect to the server).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3j8ghdrm03li0642etf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3j8ghdrm03li0642etf.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Configure Network Settings:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scroll down to the &lt;strong&gt;Network settings&lt;/strong&gt; section and click &lt;strong&gt;Edit.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;default VPC&lt;/strong&gt;. Leave the subnet as &lt;em&gt;No preference.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Make sure &lt;strong&gt;Auto-assign public IP&lt;/strong&gt; is &lt;strong&gt;enabled.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Firewall (security groups):&lt;/strong&gt;

&lt;ol&gt;
&lt;li&gt;Choose &lt;strong&gt;Create security group.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Name it something like &lt;em&gt;Minecraft Server SG.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;(Optional) Add a description such as: &lt;em&gt;Security group for Minecraft Server. Ports open for SSH (22) and Minecraft TCP (25565).&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Add inbound rules:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SSH access (EC2 Instance Connect):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;By default, SSH (port 22) is enabled, but you must restrict it to the correct IP range for EC2 Instance Connect in you AWS region.&lt;/li&gt;
&lt;li&gt;Find the correct CIDR range in the &lt;a href="https://docs.aws.amazon.com/vpc/latest/userguide/aws-ip-ranges.html#aws-ip-download" rel="noopener noreferrer"&gt;AWS IP address ranges documentation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;For example, in the &lt;code&gt;eu-west-3&lt;/code&gt; (Paris) region, the IP CIDR range is: &lt;code&gt;35.180.112.80/29&lt;/code&gt; .&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In &lt;strong&gt;Inbound rules&lt;/strong&gt;, edit the SSH rule and set &lt;strong&gt;Source Custom&lt;/strong&gt;, then paste the correct IP range for your region.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;em&gt;Tip: To find the IP CIDR, download the JSON file from the documentation, open it in your browser as raw data, and search (Control+F) for &lt;code&gt;EC2_INSTANCE_CONNECT&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftrjhv0npsk3ht2pf4v26.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftrjhv0npsk3ht2pf4v26.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Minecraft traffic:&lt;/strong&gt; Add another inbound rule:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Type:&lt;/strong&gt; &lt;em&gt;Custom TCP&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Port Range:&lt;/strong&gt; &lt;em&gt;25565&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; &lt;em&gt;0.0.0.0/0&lt;/em&gt; (to allow players to connect).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faorch2b5h575f19zreq1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faorch2b5h575f19zreq1.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Add Storage:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;By default your instance comes with an &lt;strong&gt;8 GB gp3 root volume&lt;/strong&gt;, which is enough for a small server.&lt;/li&gt;
&lt;li&gt;If you expect more data (e.g., larger worlds, mods, or backups), you may increase the size here.&lt;/li&gt;
&lt;li&gt;AWS Free Tier includes up to &lt;strong&gt;30GB&lt;/strong&gt; of Elastic Block Storage (EBS), so you can expand the volume without leaving the free tier (as long as you stay under the 30GB).&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 2: Set up Minecraft Automatically
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Add a startup script:&lt;/strong&gt; We’ll use a bash script so that the Minecraft server is automatically downloaded, configured and started every time the EC2 instance launches.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Locate the User Data field:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scroll down to the &lt;strong&gt;Advanced Details&lt;/strong&gt; section.&lt;/li&gt;
&lt;li&gt;Expand it, then scroll to the bottom to find the &lt;strong&gt;User data&lt;/strong&gt; field.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copy and paste the following script into that field:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-euo&lt;/span&gt; pipefail

&lt;span class="c"&gt;# ===== CONFIG =====&lt;/span&gt;
&lt;span class="c"&gt;# Replace with the latest server .jar URL from the official page&lt;/span&gt;
&lt;span class="nv"&gt;MINECRAFT_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://piston-data.mojang.com/v1/objects/6bce4ef400e4efaa63a13d5e6f6b500be969ef81/server.jar"&lt;/span&gt;
&lt;span class="nv"&gt;MINECRAFT_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/opt/minecraft/server"&lt;/span&gt;
&lt;span class="nv"&gt;MINECRAFT_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"minecraft"&lt;/span&gt;
&lt;span class="nv"&gt;SERVICE_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"minecraft"&lt;/span&gt;

&lt;span class="c"&gt;# ===== PREREQS =====&lt;/span&gt;
&lt;span class="c"&gt;# Install Java (Amazon Corretto)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; java-21-amazon-corretto-headless

&lt;span class="c"&gt;# Create a dedicated user and directories&lt;/span&gt;
&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$MC_USER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null 2&amp;gt;&amp;amp;1 &lt;span class="o"&gt;||&lt;/span&gt; useradd &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="nt"&gt;--create-home&lt;/span&gt; &lt;span class="nt"&gt;--shell&lt;/span&gt; /sbin/nologin &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$MC_USER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$MC_DIR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$MC_DIR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# ===== DOWNLOAD SERVER =====&lt;/span&gt;
&lt;span class="c"&gt;# Download the Minecraft server JAR from the URL&lt;/span&gt;
&lt;span class="c"&gt;# (Overwrites existing server.jar if present)&lt;/span&gt;
wget &lt;span class="nt"&gt;-O&lt;/span&gt; server.jar &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$MINECRAFT_URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# ===== FIRST BOOT TO GENERATE FILES =====&lt;/span&gt;
&lt;span class="c"&gt;# Run once to create eula.txt and default configs (ignore non-zero exit)&lt;/span&gt;
java &lt;span class="nt"&gt;-Xmx1024M&lt;/span&gt; &lt;span class="nt"&gt;-Xms1024M&lt;/span&gt; &lt;span class="nt"&gt;-jar&lt;/span&gt; server.jar nogui &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;

&lt;span class="c"&gt;# Accept EULA&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/false/true/p'&lt;/span&gt; eula.txt

&lt;span class="c"&gt;# ===== CALCULATE HEAP SIZE FROM TOTAL RAM =====&lt;/span&gt;
&lt;span class="c"&gt;# Use ~50% of total memory, clamp to [1024, 16384] MB, round down to nearest 256 MB&lt;/span&gt;
&lt;span class="nv"&gt;TOTAL_MEM_MB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/MemTotal/ {printf "%.0f", $2/1024}'&lt;/span&gt; /proc/meminfo&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;XMX_MB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt; TOTAL_MEM_MB &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="k"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$XMX_MB&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-lt&lt;/span&gt; 1024 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then &lt;/span&gt;&lt;span class="nv"&gt;XMX_MB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1024&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;fi
if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$XMX_MB&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-gt&lt;/span&gt; 16384 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then &lt;/span&gt;&lt;span class="nv"&gt;XMX_MB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;16384&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;fi
&lt;/span&gt;&lt;span class="nv"&gt;XMX_MB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;XMX_MB/256&lt;span class="o"&gt;)*&lt;/span&gt;&lt;span class="m"&gt;256&lt;/span&gt; &lt;span class="k"&gt;))&lt;/span&gt;

&lt;span class="c"&gt;# ===== START/STOP SCRIPTS =====&lt;/span&gt;
&lt;span class="c"&gt;# Create start script&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; start &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
#!/bin/bash
set -euo pipefail

MC_DIR="/opt/minecraft/server"
cd "&lt;/span&gt;&lt;span class="nv"&gt;$MC_DIR&lt;/span&gt;&lt;span class="sh"&gt;"

# Recompute heap on each start (handles instance type changes)
TOTAL_MEM_MB=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/MemTotal/ {printf "%.0f", $2/1024}'&lt;/span&gt; /proc/meminfo&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;
XMX_MB=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt; TOTAL_MEM_MB &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="k"&gt;))&lt;/span&gt;&lt;span class="sh"&gt;
if [ "&lt;/span&gt;&lt;span class="nv"&gt;$XMX_MB&lt;/span&gt;&lt;span class="sh"&gt;" -lt 1024 ]; then XMX_MB=1024; fi
if [ "&lt;/span&gt;&lt;span class="nv"&gt;$XMX_MB&lt;/span&gt;&lt;span class="sh"&gt;" -gt 16384 ]; then XMX_MB=16384; fi
XMX_MB=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;XMX_MB/256&lt;span class="o"&gt;)*&lt;/span&gt;&lt;span class="m"&gt;256&lt;/span&gt; &lt;span class="k"&gt;))&lt;/span&gt;&lt;span class="sh"&gt;

ulimit -n 4096
exec java -Xmx&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;XMX_MB&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;M -Xms&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;XMX_MB&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;M -jar server.jar nogui
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x start

&lt;span class="c"&gt;# Create stop script&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; stop &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
#!/bin/bash
# Graceful stop via systemd is preferred: systemctl stop minecraft
# Fallback: kill Java owned by the minecraft user running the server.jar
pkill -u minecraft -f 'java .*server&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sh"&gt;jar' || true
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x stop

&lt;span class="c"&gt;# Permissions&lt;/span&gt;
&lt;span class="nb"&gt;chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$MC_USER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;:&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$MC_USER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; /opt/minecraft

&lt;span class="c"&gt;# ===== SYSTEMD SERVICE =====&lt;/span&gt;
&lt;span class="c"&gt;# Create a systemd service to run Minecraft on startup&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;' &amp;gt; /etc/systemd/system/minecraft.service
[Unit]
Description=Minecraft Server
Wants=network-online.target
After=network-online.target

[Service]
User=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MC_USER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;
WorkingDirectory=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MC_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;
ExecStart=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MC_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;/start
ExecStop=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MC_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;/stop
Restart=on-failure
RestartSec=15
NoNewPrivileges=true
ProtectSystem=full
ProtectHome=true
PrivateTmp=true

[Install]
WantedBy=multi-user.target
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# Enable and start the service&lt;/span&gt;
systemctl daemon-reload
systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SERVICE_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.service
systemctl start &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SERVICE_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.service
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyr2mvll0g9opfvzd5k5n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyr2mvll0g9opfvzd5k5n.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Get the latest Minecraft server link:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;To ensure you’re running the newest version, go to the &lt;a href="https://www.minecraft.net/en-us/download/server" rel="noopener noreferrer"&gt;official Minecraft Server download page&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Find the link to “&lt;em&gt;Download minecraft_server.jar&lt;/em&gt;”.&lt;/li&gt;
&lt;li&gt;Right-click the &lt;em&gt;minecraft_server.jar&lt;/em&gt; link and copy the URL.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace the value of &lt;code&gt;MINECRAFT_URL&lt;/code&gt; in the script above with this new link.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe6pr8c4vtsqbrfuz4o0n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe6pr8c4vtsqbrfuz4o0n.png" alt=" " width="800" height="509"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Launch the instance:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Once you’ve added the script, click &lt;strong&gt;Launch Instance.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The EC2 instance may take 5-10 minutes on first boot while it installs dependencies and sets up the server.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🧪 &lt;em&gt;Test: After the instance finishes launching, copy its public IPv4 address from the EC2 console. Open Minecraft, go to Multiplayer, add a new server, and paste the IP address. Within a few minutes, you should be able to connect to your new Minecraft server.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 3: Set Up Static IP
&lt;/h2&gt;

&lt;p&gt;Every time an EC2 instance turns off, its public IP address will change. Having to search for your new IP every time you turn your server on and off is inefficient. We will associate an Elastic IP with our EC2 instance to solve this problem. Elastic IP addresses are dedicated IP addresses that do not change and can be attached to different resources.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Open Elastic IPs:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the EC2 dashboard, expand the left-hand menu.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Under &lt;strong&gt;Network &amp;amp; Security&lt;/strong&gt;, click &lt;strong&gt;Elastic IPs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdik69lar1odiw72upwn8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdik69lar1odiw72upwn8.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Allocate an Elastic IP:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Allocate Elastic IP address&lt;/strong&gt; (top right).&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Public IPv4&lt;/strong&gt; from Amazon’s pool of IPv4 addresses.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;strong&gt;Allocate.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffrjdkxszgsrbr4uapauf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffrjdkxszgsrbr4uapauf.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Name the IP:&lt;/strong&gt; To keep things organized, rename the Elastic IP to something descriptive, like &lt;em&gt;Minecraft Server IP&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqrxv6cqy6ni2wphmmvp0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqrxv6cqy6ni2wphmmvp0.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Associate the Elastic IP with the instance:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select the new Elastic IP.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;strong&gt;Actions&lt;/strong&gt; → &lt;strong&gt;Associate Elastic IP Address.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9fl3ryq16x2htih5fq6k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9fl3ryq16x2htih5fq6k.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For &lt;strong&gt;Resource type&lt;/strong&gt;, choose &lt;strong&gt;Instance.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;From the drop-down list, select the Minecraft EC2 instance we created before.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Associate.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp3ylkno1rf7toipg3far.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp3ylkno1rf7toipg3far.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Verify the Elastic IP:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go back to the Minecraft EC2 instance details.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Public IPv4 address&lt;/strong&gt;, we should now see the Elastic IP.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqt0fdcdhvjx7s603pi3t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqt0fdcdhvjx7s603pi3t.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Connect to the server in Minecraft:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Minecraft and go to the &lt;strong&gt;Multiplayer screen.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add Server&lt;/strong&gt; (or use &lt;strong&gt;Direct Connect).&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Server Address&lt;/strong&gt; field, enter the Elastic IP.&lt;/li&gt;
&lt;li&gt;The server should now be accessible with the static IP every time you restart the instance.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;em&gt;Warning: Elastic IPs are free **as long as they are attached to a running instance&lt;/em&gt;&lt;em&gt;. If you allocate one but don’t associate it with anything, AWS may charge you a small hourly fee.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Extra: Customize the Server (Plugins, World Files, etc.)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Once the server is up and running, you may want to install plugins, change the world, or modify configuration files. To do that, you’ll need to connect directly to your EC2 instance.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Connect to the instance:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to the EC2 dashboard and select the Minecraft server instance.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;strong&gt;Connect&lt;/strong&gt; at the top.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fklcd8ayttgwqey9yc6y5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fklcd8ayttgwqey9yc6y5.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the connection screen, make sure the user is set to &lt;code&gt;ec2-user&lt;/code&gt;, then click &lt;strong&gt;Connect&lt;/strong&gt; again.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If the connection fails, try rebooting the instance and waiting a few minutes, or review the &lt;a href="https://repost.aws/knowledge-center/ec2-instance-connect-troubleshooting" rel="noopener noreferrer"&gt;common troubleshooting tips.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjgahzgkkpz1o949g7l1t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjgahzgkkpz1o949g7l1t.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Navigate to the server directory:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;After logging in, you’ll be in a terminal. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvq9gg4o81jrjkzakk3tx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvq9gg4o81jrjkzakk3tx.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run: &lt;code&gt;cd /opt/minecraft/server/&lt;/code&gt;. This directory contains all the Minecraft server files. Remember this location for future edits.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To check the server files, use the following command: &lt;code&gt;ls&lt;/code&gt; . You should see files like &lt;em&gt;world/&lt;/em&gt;, &lt;em&gt;logs/&lt;/em&gt;, &lt;em&gt;server.jar&lt;/em&gt;, as well as the &lt;em&gt;start&lt;/em&gt; and &lt;em&gt;stop scripts.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Stop the server before making changes:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The server console runs in the background, so files can’t be edited while it’s active.&lt;/li&gt;
&lt;li&gt;To stop the server, run: &lt;code&gt;sudo systemctl stop minecraft&lt;/code&gt; .&lt;/li&gt;
&lt;li&gt;Once the service is stopped, you can upload a new world, add plugins or edit configuration files.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Restart the server:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;After making changes, restart the instance or run: &lt;code&gt;sudo systemctl start minecraft&lt;/code&gt; .&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Useful commands:&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start the server&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start minecraft

&lt;span class="c"&gt;# Stop the server&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl stop minecraft

&lt;span class="c"&gt;# Restart the server&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart minecraft

&lt;span class="c"&gt;# Check if the server is running&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status minecraft
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Clean Up (Avoid Extra Charges)
&lt;/h2&gt;

&lt;p&gt;When you’re done testing or hosting your server, it’s important to shut down resources to prevent ongoing AWS charges.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Terminate the EC2 instance:&lt;/strong&gt;

&lt;ol&gt;
&lt;li&gt;In the EC2 dashboard, select your Minecraft instance.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Instance state → Terminate instance.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Confirm the termination.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Release the Elastic IP:&lt;/strong&gt;

&lt;ol&gt;
&lt;li&gt;In the EC2 dashboard, open the sidebar and go to &lt;strong&gt;Elastic IPs.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Select the Elastic IP you associated with your instance.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Actions → Release Elastic IP addresses.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;Once done, you will no longer incur charges from this setup.&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources &amp;amp; Useful Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@pzawadz/how-to-set-up-minecraft-server-java-edition-for-free-for-12-months-on-aws-38239753cca1" rel="noopener noreferrer"&gt;How to Set up Minecraft Server Java Edition for Free for 12 Months on AWS - 2023/2024 Complete Tutorial (Pawel Zawadzki)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/gametech/setting-up-a-minecraft-java-server-on-amazon-ec2/" rel="noopener noreferrer"&gt;Setting up a Minecraft Java server on Amazon EC2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/free/" rel="noopener noreferrer"&gt;AWS Free Tier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://minecraft.fandom.com/wiki/Tutorials/Setting_up_a_server" rel="noopener noreferrer"&gt;Mineraft Wiki: Tutorials/Setting up a server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>minecraft</category>
      <category>aws</category>
      <category>ec2</category>
    </item>
    <item>
      <title>Text-To-Speech in Python</title>
      <dc:creator>Carmen</dc:creator>
      <pubDate>Mon, 26 Feb 2024 09:13:36 +0000</pubDate>
      <link>https://forem.com/carmoruda/text-to-speech-in-python-3ikb</link>
      <guid>https://forem.com/carmoruda/text-to-speech-in-python-3ikb</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I’ve been working in the development of Python software that aimed to enable playing chess directly from the terminal. Initially, the project was conceive as a platform for local matches between players or against a bot, as well as online games.&lt;/p&gt;

&lt;p&gt;In addition to its primary functionality, the project’s focus has shifted towards becoming an accessible tool for people with functional diversity, implying the integration of assistive technologies such as Text-To-Speech to ensure an inclusive experience.&lt;/p&gt;

&lt;p&gt;In this regard, I have dedicated time to researching the available options in Python for implementing text-to-speech for free.&lt;/p&gt;

&lt;h2&gt;
  
  
  Library Installation
&lt;/h2&gt;

&lt;p&gt;Firstly, it’s crucial to consider the libraries that will allow us to incorporate Text-To-Speech into our software. Among these libraries, we will be using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pypi.org/project/gTTS/" rel="noopener noreferrer"&gt;&lt;strong&gt;Google Text-to-Speech (gTTS)&lt;/strong&gt;&lt;/a&gt;: Used for generating audio files from the provided text.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pypi.org/project/pygame/" rel="noopener noreferrer"&gt;&lt;strong&gt;Pygame&lt;/strong&gt;&lt;/a&gt;: Used for playing the generated audio without concerns regarding device compatibility or operating systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;gtts&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;gTTS&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pygame&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize Pygame mixer
&lt;/span&gt;&lt;span class="n"&gt;pygame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mixer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Path to the audio file
&lt;/span&gt;&lt;span class="n"&gt;sound_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sound_file.mp3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Generate audio from text
&lt;/span&gt;&lt;span class="n"&gt;text_to_speech&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;gTTS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Hi, good evening&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;en&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sound_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Load the audio file into Pygame
&lt;/span&gt;&lt;span class="n"&gt;sound&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pygame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mixer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Sound&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sound_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Play the audio
&lt;/span&gt;&lt;span class="n"&gt;sound&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;play&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Wait for the sound to finish playing
&lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;pygame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mixer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_busy&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; 
    &lt;span class="n"&gt;pygame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This simple code demonstrates how to use the gTTS library to convert specific text, in this case, “Hi, good evening”, into an audio file in MP3 format. Subsequently, using Pygame, we play the audio file.&lt;/p&gt;

</description>
      <category>python</category>
      <category>development</category>
    </item>
    <item>
      <title>How I sync my Obsidian vault across devices</title>
      <dc:creator>Carmen</dc:creator>
      <pubDate>Mon, 11 Apr 2022 23:24:56 +0000</pubDate>
      <link>https://forem.com/carmoruda/how-i-sync-my-vault-across-devices-43gn</link>
      <guid>https://forem.com/carmoruda/how-i-sync-my-vault-across-devices-43gn</guid>
      <description>&lt;p&gt;In the last few days, I’ve trying to improve my productivity and with it  my note-taking system. Over the last couple of years, I've tried  different tools, from &lt;a href="https://www.notion.so/product?fredir=1" rel="noopener noreferrer"&gt;Notion&lt;/a&gt;, &lt;a href="https://evernote.com/" rel="noopener noreferrer"&gt;Evernote&lt;/a&gt;, &lt;a href="https://docs.google.com" rel="noopener noreferrer"&gt;Google Docs&lt;/a&gt;, &lt;a href="https://keep.google.com" rel="noopener noreferrer"&gt;Google Keep&lt;/a&gt;, etc.  In the end and after many hesitations, research and testing, I have  concluded that the best software for me is &lt;a href="http://obsidian.md/" rel="noopener noreferrer"&gt;Obsidian.md&lt;/a&gt;.  Obsidian is a handy little program that uses links to connect notes. It  is based on &lt;a href="https://en.wikipedia.org/wiki/Markdown" rel="noopener noreferrer"&gt;Markdown&lt;/a&gt;, which is a lightweight language used for writing  and formatting plain text documents.&lt;/p&gt;

&lt;p&gt;One advantage that Obsidian offers over many other applications is that it is completely free but  within certain nuances. That is, for personal use it is 100% free, you  don't need to register, and it offers access to many plugins and  community support. Thanks to this, the fact that the possibility of  &lt;a href="https://obsidian.md/sync" rel="noopener noreferrer"&gt;syncing your notes through Obsidian&lt;/a&gt; is a paid feature was not a  drawback. This is because I have decided to use &lt;a href="https://git-scm.com/" rel="noopener noreferrer"&gt;git&lt;/a&gt;, software for  tracking changes in any set files, and &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; as the cloud-based git  &lt;a href="https://en.wikipedia.org/wiki/Repository_(version_control)" rel="noopener noreferrer"&gt;repository&lt;/a&gt; hosting service.&lt;/p&gt;

&lt;p&gt;In this way, I only had to install  and set up &lt;a href="https://git-scm.com/" rel="noopener noreferrer"&gt;git&lt;/a&gt; on my different devices and clone the repository. In case  anyone is wondering, my devices are a desktop pc, an iPad, and a phone  (Android). I built my system as follows:&lt;/p&gt;

&lt;p&gt;First of all, I created  the repo on &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. Afterward, on my pc I installed Obsidian and with  &lt;a href="https://www.gitkraken.com/" rel="noopener noreferrer"&gt;Gitkraken&lt;/a&gt;, a graphical interface for git, I cloned the repo to my local  machine. For anyone who wants to build a similar system, there is no  need to use Gitkraken, you may directly use git from the &lt;a href="https://en.wikipedia.org/wiki/Command-line_interface" rel="noopener noreferrer"&gt;command line&lt;/a&gt; as  well as other graphical interfaces such as &lt;a href="https://desktop.github.com/" rel="noopener noreferrer"&gt;GitHub Desktop&lt;/a&gt; or  &lt;a href="https://www.sourcetreeapp.com/" rel="noopener noreferrer"&gt;Sourcetree&lt;/a&gt;. Then, the only thing left to do was to use my repository as  the base folder for the Obsidian vault.&lt;/p&gt;

&lt;p&gt;On the other hand, as for  the iPad, the tools I use are &lt;a href="https://apps.apple.com/us/app/working-copy-git-client/id896694807" rel="noopener noreferrer"&gt;Working Copy&lt;/a&gt; and the &lt;a href="https://apps.apple.com/us/app/obsidian-connected-notes/id1557175442" rel="noopener noreferrer"&gt;Obsidian app&lt;/a&gt;. I must  admit that the setup on my iPad took me a bit longer since I didn't  know how to do it at first, but I don't have any regrets since I have  found the way that best suits my needs. You may pull repos with the free  version of Working Copy, but I think you need the pro version to push  to a repo (You may access all Pro features while you are a student  through the &lt;a href="https://education.github.com/pack/offers" rel="noopener noreferrer"&gt;GitHub Student Developer Pack&lt;/a&gt;). To start with the setup, you  need to download the Obsidian app from the App Store and create a new  vault. On the creation screen, you need to make sure that &lt;code&gt;Store in iCloud&lt;/code&gt; isn’t selected.&lt;/p&gt;

&lt;p&gt;Next, after downloading Working Copy will  have to configure the credentials for the git host (&lt;a href="https://github.com/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, &lt;a href="https://bitbucket.org/" rel="noopener noreferrer"&gt;Bitbucket&lt;/a&gt;,  &lt;a href="https://about.gitlab.com/" rel="noopener noreferrer"&gt;GitLab&lt;/a&gt;…) where you have the repo. Once you are done, clone the repo.  Subsequently, from Working Copy, open the repo, select the “share menu”  and click on the &lt;code&gt;Setup Folder Sync&lt;/code&gt; option. Under the &lt;code&gt;On My iPad&lt;/code&gt; section  there should be an Obsidian folder that contains the Obsidian vault  folder which you need to select. This step is crucial because it’s the way to sync the repo with  the vault.&lt;/p&gt;

&lt;p&gt;Finally, the configuration that I honestly find the  most time-consuming and complicated. The first thing to do is to install  &lt;a href="https://github.com/termux/termux-app" rel="noopener noreferrer"&gt;Termux&lt;/a&gt;, an android terminal application, and a Linux environment. There  are two ways to download the latest version of Termux: &lt;a href="https://f-droid.org/en/packages/com.termux/" rel="noopener noreferrer"&gt;F-droid&lt;/a&gt; and  &lt;a href="https://github.com/termux/termux-app/releases" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. Once we have successfully installed Termux we must run a series  of commands:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;apt update &amp;amp;&amp;amp; upgrade&lt;/code&gt;. With this command, we will update all the packages in Termux.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;termux-setup-storage&lt;/code&gt; . Allow Termux to access your existing directories.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pkg install git&lt;/code&gt; . Install git.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pkg install gh&lt;/code&gt; . Not needed, but recommended. It’s a command-line tool by GitHub.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gh auth login&lt;/code&gt; . Login into your GitHub account.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git config --global&lt;/code&gt; &lt;code&gt;user.name&lt;/code&gt; &lt;code&gt;“your name”&lt;/code&gt; . Global git username associated with commits on all repositories in your system.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git config --global&lt;/code&gt; &lt;code&gt;user.email&lt;/code&gt; &lt;code&gt;“youremail@yourdomain.com”&lt;/code&gt; . Global git email address associated with commits on all repositories in your system.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git clone “your repo link”&lt;/code&gt; . Clone the repo to your local environment.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mv “your repo name”/ storage/shared/&lt;/code&gt; . Move the repo to the shared folder so you may access it from any Android app.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When  using obsidian on your different devices, always remember to pull down  the latest repo changes and commit and push any changes you make  afterward!!&lt;/p&gt;

&lt;p&gt;Thanks for reading this far!! I will be leaving links  to resources below, in case it helps!! I’m open to constructive  criticism, feedback and suggestions 😊&lt;/p&gt;

&lt;p&gt;Resources &amp;amp; Useful links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desktop setup software:

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://obsidian.md/download" rel="noopener noreferrer"&gt;Download Obsidian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/downloads" rel="noopener noreferrer"&gt;Download git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/download/gui/windows" rel="noopener noreferrer"&gt;Git Windows GUIs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/download/gui/Mac" rel="noopener noreferrer"&gt;Git MAC GUIs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/download/gui/Linux" rel="noopener noreferrer"&gt;Git Linux GUIs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;iPad setup software:

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apps.apple.com/us/app/obsidian-connected-notes/id1557175442" rel="noopener noreferrer"&gt;Obsidian app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apps.apple.com/us/app/working-copy-git-client/id896694807" rel="noopener noreferrer"&gt;Working copy app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/download/gui/ios" rel="noopener noreferrer"&gt;More Git GUIs for iOS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Android setup software:

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=md.obsidian&amp;amp;gl=US" rel="noopener noreferrer"&gt;Obsidian app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/termux/termux-app" rel="noopener noreferrer"&gt;Termux GitHub repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://f-droid.org/en/packages/com.termux/" rel="noopener noreferrer"&gt;Termux F-droid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/download/gui/android" rel="noopener noreferrer"&gt;More Git GUIs for Android&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Guides, documentation, tutorials…

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/doc" rel="noopener noreferrer"&gt;Git documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en" rel="noopener noreferrer"&gt;Github documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/jyotirmoydotdev/git-for-termux-g14"&gt;Git for Termux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://domenicoluciani.com/2021/12/31/how-to-sync-your-obsidian-vault-on-android.html" rel="noopener noreferrer"&gt;How to sync your obsidian vault on android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://renerocks.ai/blog/obsidian-encrypted-github-android/" rel="noopener noreferrer"&gt;Syncing your Obsidian vault to Android via an encrypted GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.greghilston.com/post/how-i-use-obsidian-mobile-with-git-on-android/" rel="noopener noreferrer"&gt;How I use obsidian mobile with git on android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ryan.himmelwright.net/post/obsidian-ios-setup/" rel="noopener noreferrer"&gt;Obsidian Notes iOS + working copy setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/H6ipjzaN2WY" rel="noopener noreferrer"&gt;Obsidian: Sync Your Vaults with Git/GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/CaqhIoj8MWk" rel="noopener noreferrer"&gt;How to use Obsidian remotely with GitHub Codespaces&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://forum.obsidian.md/t/how-do-you-sync-your-vaults/21332/3" rel="noopener noreferrer"&gt;How do you sync your vaults - Obsidian forum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gildoncodex.com/articles/how-to-sync-obsidian-for-free-using-google-drive/" rel="noopener noreferrer"&gt;How to sync Obsidian for free using Google Drive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://desktopofsamuel.com/how-to-sync-obsidian-vault-for-free-using-git/" rel="noopener noreferrer"&gt;How to sync Obsidian vault for free using Git?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/" rel="noopener noreferrer"&gt;Token authentication requirements for git operations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kmaasrud/awesome-obsidian" rel="noopener noreferrer"&gt;Awesome Obsidian&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>productivity</category>
      <category>git</category>
      <category>github</category>
      <category>obsidian</category>
    </item>
  </channel>
</rss>
