diff --git a/Dockerfile b/Dockerfile index b9353e1..eef3f4b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,31 @@ +# use the classic alpine image FROM alpine as Builder -RUN apk update && apk add curl git + +# install curl and git +RUN apk add curl git + +# download and unnzip the hugo binary then place it in /usr/local/bin RUN curl -L https://github.com/gohugoio/hugo/releases/download/v0.92.2/hugo_0.92.2_Linux-ARM64.tar.gz > hugo.tar.gz && tar -zxf hugo.tar.gz && mv hugo /usr/local/bin + +# clone the blog repository as well as the theme submodule RUN git clone --recurse-submodules https://gitlab.com/AHMZA/blog.git + +# set blog (the folder we just cloned) as the current DIR WORKDIR blog + +# Hugo generates the static files and minifies them RUN hugo --minify + + +# Nginx image is as basic as we can get FROM nginx + +# copy the nginx.conf file COPY --from=Builder /blog/nginx.conf /etc/nginx/nginx.conf + +# copy the static files COPY --from=Builder /blog/public/ /usr/share/nginx/html + +# Tell the image to expose port 80 for HTTP EXPOSE 80 diff --git a/README.md b/README.md index 7a880b0..e12239b 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,57 @@ # blog-hugo -I am hoping to migrate my dynamic blog currently hosted using GHOST CMS -to a static site using HUGO. + +This is probably the hundredth rendition of this site xD Previously to +using HUGO my blog was built using GHOST CMS which is a great platform +and is feature rich. However my problem came with the base design +philosophy of a CMS, relying on a Database. + +HUGO is a static site generator meaning it takes a readable file format +like markdown and then compiles all that down into HTML (Static Files) +This removes the need for a database and in turn improves performance of +the site ten fold. ## Pros of static sites + * Security * Reliability * Speed * Scalability * Low Resource requirement -## Why -The reasons above all fit well with my current goal of trying to containerise -all of the services running on my home lab. Currently I have 2 servers running -Proxmox VE with a combined 48 threads and 256GB of RAM which as you can imagine -take a lot of power. +## Cons of a static site -The plan is to slowly move the majority of my services to a cluster of -4 RaspberryPis. If all the services required support the ARM CPU architecture -then I can completely decommission the power hungry servers. +* Less user friendly + +## Why + +The reasons above all fit within my goal of trying to containerise +services running in my home lab. + +The plan is to move the services I use to a cluster of Raspberry Pis. As +long as the services have an ARM image or I can build an ARM image then +this is a viable solution ## How -I am still coming up with the deployment method of this site but from what I -have seen the Gitlab CI/CD pipeline makes a lot of sense as the site will be -hosted on Gitlab anyway. -* Update Gitlab with new code -* Gitlab generates a docker image -* Docker Swarm cluster uses that image to host the site +The deployment method of this site relies on the Gitlab CI/CD pipeline. +* Clone the repository +* Push changes to Gitlab +* Gitlab runners create the docker image +* Image is pushed to my private docker repository +* Pi cluster uses that image to host the site locally ## When Pulling / Cloning + +Be sure to add `--recurse-submodules` as the theme used is a submodule + ``` bash git clone --recurse-submodules git@gitlab.com:AHMZA/blog.git ``` ## Update the theme + +As the theme is a submodule it will need to be update with the following + ``` bash git submodule update --remote --merge ``` diff --git a/content/posts/minecraft-server-on-docker.md b/content/posts/minecraft-server-on-docker.md new file mode 100644 index 0000000..a047287 --- /dev/null +++ b/content/posts/minecraft-server-on-docker.md @@ -0,0 +1,208 @@ +--- +title: Minecraft Server on Docker ⛏ 🐳 +date: 2022-05-24T09:33:35+01:00 +author: "ahmza" +draft: false +weight: + +tags: ["Games", "Docker", "ARM"] +description: "Ever wanted to build a Minecraft server in docker !! Start here" +canonicalURL: "https://blog.ahmza.com/Page%28/posts/minecraft-server-on-docker.md%29" + +cover: + image: "/webp/posts/mc-docker/feature-anim.webp" # image path/url + alt: "Minecraft Loves Docker" # alt text + caption: "" # display caption under cover + relative: false # when using page bundles set this to true +showtoc: true +searchHidden: false +--- + +## **Introduction** + +Minecraft is a great game and when it comes to multiplayer, a dedicated +server is the way to go (here's why[^1]). Myself and a few others +recently decided to start playing this game again, and I took the +opportunity to deploy the server in my lab. + +A Minecraft server does not require a ton of resources to run, However +from my experience the more resources you can throw at it the better, +especially when you start to introduce mods and more than a few players. + +I run our server on my main PC within WSL and Docker. This allows me to +leverage the system resources in my PC 🦾 leaving the [Pi Cluster](https://blog.ahmza.com/posts/building-a-docker-swarm-with-pis/) +to handle the rest of the stuff in my lab. The only reason I opted to +go this route is that I don’t want our server to be limited by hardware +resources as well as the Minecraft server effecting the overall +performance of the Pis. + +## **Prerequisites** + +- Docker +- Docker Compose + +## **Requirements**[^2] + +#### **Minimum (1-5 Players)** + +- Intel Pentium 4 or AMD Athlon based CPU +- 512 MB RAM +- 2 GB Storage space + +#### **Recommended (10-15 Players)** + +- Intel Core or AMD K8 based CPU +- 3 GB RAM +- 16 GB Storage Space + +#### **Optimal (20+ Players)** + +- Intel i5/i7 or AMD Ryzen 5/7 Based CPU +- 6 GB RAM +- 35 GB Storage Space + +## **Building the Container** + +Now we have the formalities sorted, we can get to work on creating the +docker container for Minecraft. + +1. **Create a directory in which you will keep the Minecraft server files** + - `mkdir minecraft-server` + - `cd minecraft-server` + +2. **Create an environment file to be used by the Docker Container** + - The *.env* file allows us to specify variables which we can use + across the build process. + - `touch .env` + - Edit the file in a text editor, i.e. vim `vim .env` + ```bash + CONTAINER_NAME=minecraft-server + SERVER_MEM=4096 #change this to your desired value (in MB) + SERVER_JAR=minecraft_server.1.18.2.jar + ``` + +3. **Create the docker-compose.yml file** + - The *docker-compose.yml* file specifies the container that we + want to build, outlining the build context (Dockerfile), + setting the variables (from .env), configuring storage volumes + for persistence as well as ports and the container name. + - `touch docker-compose.yml` + - Edit the file in a text editor[^3], I.e. vim `vim docker-compose.yml` + ```bash + version: "3" + + services: + minecraft-server: + build: + context: . + args: + SERVER_MEM: ${SERVER_MEM} + SERVER_JAR: ${SERVER_JAR} + volumes: + - .server-data:/server + ports: + - 25565:25565 + - 25575:25575 + container_name: ${CONTAINER_NAME} + restart: unless-stopped + + volumes: + server-data: + ``` + +4. **Create the Dockerfile file** + - The Dockerfile builds the container. We take the 17-jre base + image apply our variables change the working directory to + /server and start the jar file, effectively starting the + Minecraft server. + - `touch Dockerfile` + - Edit the file in a text editor, i.e. vim `vim Dockerfile` + ```bash + FROM eclipse-temurin:17-jre + + ARG SERVER_MEM + ARG SERVER_JAR + + ENV SERVER_MEM=${SERVER_MEM} + ENV SERVER_JAR=${SERVER_JAR} + + WORKDIR /server + + CMD echo "Minecraft Server is starting\n" && java -Xms128M -Xmx${SERVER_MEM}M -jar ${SERVER_JAR} nogui + ``` + +## **Setup the Server files** + +We’re almost there, just a few steps left !! + +The curious among you may have realised when trying to start the +container that it fails with the error below: + +```bash +Minecraft Server is starting + +Error: Unable to access jarfile server.jar +``` + +This is because we have not downloaded the server jar file yet, that is +our next step. + +1. **Navigate to one of the following sites:**[^4] + - [Vanilla Minecraft Server](https://www.minecraft.net/en-us/download/server) - instructions found here[^5] + - [Fabric Mod loader server](https://fabricmc.net/use/server/) - instructions found here [^6] +2. **Create a folder in the Minecraft-server folder called .server-data** + - `mkdir .server-data` + - `cd .server-data` +3. **Download the jar file - This will depend on the option above so read the instructions** +4. **Go back to the root minecraft-server folder** + - `cd ..` +5. **Run the container** + - `docker compose up` (use CTRL+C to exit) + - Once the server unpacks all the files you will see this: + ```bash + minecraft-server | Starting net.minecraft.server.Main + minecraft-server | [18:05:50] [ServerMain/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info. + minecraft-server exited with code 0 + ``` +7. **Accept the EULA** + - Go into the .server-data folder + 1. `cd .server-data` + - Edit the file named eula.txt in a text editor i.e. vim `vim eula.txt` + 1. Simply change `eula=false` to `eula=true` +8. **While in the .server-data folder make any changes you want** + - Some files to note in here are + - **server.properties** - properties like server name, game mode, world type etc… + - **ops.json** - list of server operators (easier to set ingame) + - **whitelist.json** - list of players allowed to join the server everyone else rejected access. +9. **Run the container** + - `docker compose up -d` (the -d means detatched so we can run the server in the background) + - `docker logs minecraft-server --follow` Will show us the progress of the server startup (to exit out of this do CTRL+C) + - If you see something like the following then you’re a winner 🥳 + ```bash + [18:17:01] [Server thread/INFO]: Time elapsed: 25529 ms + [18:17:01] [Server thread/INFO]: Done (34.571s)! For help, type "help" + ``` + +## Conclusion + +Well done you have successfully setup a Minecraft server, now go play !! +There is a lot of cool stuff you can do with a Minecraft server for +example installing mods or creating scripts to manage the server, this +will be covered in the next post so keep an eye out for it !! + + +[^1]: Hosting your own dedicated server allows you to modify every aspect of the server as you see fit. I.E you can modify the server-properties, you can implement a whitelist not to mention being able to add any mods you want + +[^2]: Requirements Gathered from here [https://minecraft.fandom.com/wiki/Server/Requirements/Dedicated#Unix\_.28Linux.2C\_BSD.2C\_macOS.29](https://minecraft.fandom.com/wiki/Server/Requirements/Dedicated#Unix_.28Linux.2C_BSD.2C_macOS.29) + +[^3]: Yaml is very picky 😞 when it comes to formatting so if you encounter any errors double check your formatting !! + +[^4]: I have left Forge out as it is a more involved process plus Fabric is better 😜 + +[^5]: Right click the green link that says something like minecraft_server.x.xx.x.jar and copy the link address + + curl -o server.jar \ + +[^6]: Select the Minecraft version, Fabric Loader Version and the Installer Version of your choice. I tend to go with the latest. + + Copy the curl command under CLI download diff --git a/nginx.conf b/nginx.conf index 2491dc3..1f6f2bd 100644 --- a/nginx.conf +++ b/nginx.conf @@ -36,9 +36,9 @@ http { # save logs here access_log /var/log/nginx/access.log compression; - # where the root here + # where's the root dir root /usr/share/nginx/html; - # what file to server as index + # what file to serve as index index index.html index.htm; location / { diff --git a/static/webp/posts/mc-docker/feature-anim.webp b/static/webp/posts/mc-docker/feature-anim.webp new file mode 100644 index 0000000..ef2c55c Binary files /dev/null and b/static/webp/posts/mc-docker/feature-anim.webp differ