Aye guys. I know most of you won't care about this, but I wanted to help those out that might have wanted to learn about IT/Computer Science with a side project. I have a Computer Science degree and have been working the field for around two years now.
A problem I see with school is the fact that they normally do teach things decently, but it's tough to relate it to anything real world or just downright unenjoyable. A buddy of mine randomly mentioned that he wanted to casually play some Minecraft whenever we drank or were tired of CS/OW/etc. He started setting up the server on his own desktop and an idea hit me. What if I started teaching him about Amazon Web Services (Amazon's cloud services) while using a Minecraft server as the focal point.
These could be done quickly or taken slowly. I'm talking weeks in between each one. The end goal is to slowly make your Minecraft server more reliable, available, secure, and functional while learning along the way.
1. Create an AWS account and dig around a little. This will let a student, or someone who wants to learn, to get a better understanding of cloud services and AWS in particular which is dominant. Start learning about Linux a little during this stage as well.
2. After learning a little about AWS you should know what an EC2 instance is (it's a Virtual Machine). Spin up a standard AWS linux instance and follow raibledesigns.com/rd/entry/setting_up_a_..
This will let you learn a little more about Linux. It will also let you learn about how to connect to remote servers, firewalls, ports, etc.
3. After you get your server up and running this is the time to start slowly adding to it to make it better. Start looking into S3 (simple storage service on AWS. Allows infinite storage and is highly reliable/available meaning you will never lose your data in it even if Amazon has an entire server warehouse shit out). Then start looking into bash scripting. Start thinking of how to never lose your server and allow it to roll back if the server failed or something bad happened within the server. How can you create a bash script that runs every half an hour to backup your server files? Yep, create a bash script to compress your server files and send it to a directory in S3 and have it run every half hour, or hour. This will let you learn about Linux, reliability, backups, bash scripting, cron jobs, and AWS services.
4. Where can you go from here? How about making the instance more secure from outsiders? Start learning about VPCs (virtual private clouds), DMZs (networking), subnets, and general networking. Try to move your existing instance (VM) to your own VPC in AWS. Create a DMZ for it and try to figure out how to lock down your server. You'll have to go through some trouble shooting for sure, but the learning experience will be worth it. You'll learn about networking, AWS, general design, and security here.
5. What's next? How about how to make sure the server will be up at all times? AWS provides many tools to let you set up instances in a highly available, reliable, and fault tolerant way. What happens if the CPU fails on your VM? Yep, your MC server would be gone until you hopped on and manually stood it back up. How do you avoid this? Start looking into how you would set up your minecraft server using autoscaling groups (AWS), user data (AWS), images (AMIs on AWS), and through scripting. Let's say your server fails. The Autoscaling group should look at it's min and max limits and decide whether it should spin up a new AMI (VM). Let's say you want a minimum of 1 minecraft server running all of the time and a maximum of 1 as well. If a server shits out your ASG will see your actual server count fell below 1 and will stand up a new instance using an image (VM) you created for the server. But wait, that image has an older version of your server on it. How do you automatically update the server from your backups that you were making? Look into user data. Create a script that will run when the instance stands up through user data that replaces the older server files with the most recently backed up server files in S3. With this you will have a decently reliable server that can go down even when you're out of town for a week and you won't have to think twice on whether it is running or not. It's all hands off. With this section you will have learned about general design concepts such as high availability, reliability, and fault tolerance. Also general scripting and AWS services. This will cement the fact that design is important before diving into setting things up or coding.
6. What's next? Maybe logging? Minecraft servers output logs on the server and you can also download third party stuff to add even more logging such as player chat, actions, etc. How do you store (important because what if a server fails? They cannot just be sitting on the server in a decent design) and view these logs? At this point maybe you yourself can think of a solution to this. If not, maybe start looking into Elasticsearch (search engine/database), kibana (dashboard to view data in elasticsearch), and filebeat (how to grab the logs and ship it to elasticsearch). Maybe some logstash. Try to spin up a new instance and set up the Elasticstack so you can send your logs to the Elasticsearch instance on it. Then play around with Kibana and try to set up a dashboard to view the data that got indexed in Elasticsearch. Maybe you want to view the recent 100 bannable actions by players? Maybe another dashboard showing server events such as crashes? Maybe a map showing the locations of where players logged in? All up to you.
7. What's next? Maybe start learning a little about web design. Host a web service on an AWS instance that you made with CSS/HTML/JS, etc that allows you to modify server properties (configuration), or plugins, on the fly without going to the server directly. Maybe add some authentication page to this web service and incorporate some AWS tech for it.
8. At this point you're probably to the point where you can imagine new ways to improve your server, but here is the last one from me. Imagine you want to update your server, which might take a few hours. How would you avoid the anger inducing action of telling your players "Hey, the server will be down for two hours"? Yep, you can use AWS. This is a pretty complicated action so approach it carefully. Will still provide a learning experience even if you fail. Look into how to do rolling updates on AWS.
Look into docs.aws.amazon.com/elasticbeanstalk/lat..
See if you can setup a way for the old, non-updated version of the server, to continue running and have a server running in the background that is updating at the same time. Any incoming connection will go to the older server running. Once the new server finishes updating kill the old server and all new incoming connections will now go to the new server. Make sure you set up some type of script to backup the server right when the old server finished and to update the new server so there is no gap of the state of the world. If you take this route you will have to start looking into Elastic load balancers (AWS), static public IP addresses, etc so you don't have to tell your players the new public IP address every time the server changes.
Thanks guys. I don't expect many replies. Maybe one or two people might bookmark it and try it out. I just wanted to provide a decent way to learn about different technology in a relatable way. If you guys do go through this and finish all of the steps I can promise you that you will have one of the most reliable MC servers out there. Most people don't spend time on them at all. The cool part about this is the fact it can be applied to a ton of situations. OSRS private server? Your own application? They all apply and you would have a better approach going into those than before.