Update for AWS

This commit is contained in:
Will Bradley 2023-01-27 08:32:24 +00:00
parent 6d22b4d999
commit 98e610704e
3 changed files with 92 additions and 39 deletions

View File

@ -1,31 +1,76 @@
# Minecraft server automatic startup and shutdown # Minecraft server automatic startup and shutdown
A collection of scripts to start a Minecraft server on Digitalocean on demand A collection of scripts to start a Minecraft server on Amazon AWS on demand
and automatically shut it down when not in use. and automatically shut it down when not in use.
## Installation and Usage ## Installation and Usage
These packages require PHP, Python3, the PIP module mcstatus, and a webserver. These packages require PHP, Python3, the PIP module mcstatus, the AWS cli, and a webserver.
Install this on a server different from your minecraft server, since you'll be shutting that down.
`python3 -m pip install mcstatus` Run as root: `python3 -m pip install mcstatus`
Install the .php file on a webserver and configure the variables as desired. Install the .php file on a webserver and configure the variables as desired.
Place the remaining files on a server with CRON (could be the same server, just Place the remaining files the same server in the `/var/minecraft/` folder
not inside the web folder) and run the shell script every 5 minutes: and use CRON to run the shell script every 5 minutes:
`*/5 * * * * root /your/path/here/mineautoshutdown.sh 2>&1 | logger` `*/5 * * * * root /var/minecraft/mineautoshutdown.sh 2>&1 | logger`
Ensure the same password is present in the php script and the shutdown script. Ensure the same password is present in the php script and the shutdown script.
Review all other files to make sure passwords/keys/hostnames are correct. Review all other files to make sure passwords/keys/hostnames/regions are correct.
Call the php script via HTTP using the correct password when players want to play: Call the php script via HTTP using the correct password when players want to play:
`curl http://your.webserver.here/minecraft.php?action=on&password=your_password_here` `curl -X POST -F "action=on" http://your.webserver.here/minecraft.php?password=your_password_here`
Or just direct them to <http://your.webserver.here/minecraft.php?password=your_password_here>
If the CRON job runs properly and has all the right variables/permissions/dependencies, If the CRON job runs properly and has all the right variables/permissions/dependencies,
it will shut down the DO droplet about 30-40 minutes after no players are detected in the game. it will shut down the DO droplet about 30-40 minutes after no players are detected in the game.
### AWS Setup
Install Minecraft Java Edition on an AWS instance. Give it an Elastic IP so it stays consistent.
Set Minecraft to start on boot and ensure it has the correct ports open in its Security Group.
Create an IAM policy with these permissions (edit the instance ID to be your minecraft instance)
```
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"ec2:StartInstances",
"ec2:StopInstances"
],
"Resource": "arn:aws:ec2:*:*:instance/your_instance_id_here"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "ec2:DescribeInstanceStatus",
"Resource": "*"
}
]
}
```
Create an IAM user attached to that policy and create an access key for it.
On a the server where you've downloaded Minecraft-Minder, save the key
and id to `/var/www/.aws/credentials` (assuming you use Ubuntu/Apache) with:
```
[default]
aws_access_key_id = AKIA_your_key_id_here
aws_secret_access_key = your_secret_key_here
```
Finally `chown -r www-data:www-data /var/www/.aws/`
## License ## License
Copyright (C) 2023 zyphlar Copyright (C) 2023 zyphlar

View File

@ -4,8 +4,8 @@ DO_STATUS_URL="http://example.com/minecraft.php"
PASSWORD="your_password_here" PASSWORD="your_password_here"
status=$(curl -s -X POST -F "action=status" "$DO_STATUS_URL?password=$PASSWORD") status=$(curl -s -X POST -F "action=status" "$DO_STATUS_URL?password=$PASSWORD")
if [[ $status == "active" ]]; then if [[ $status == "running" ]]; then
players=$(python3 $(dirname $0)minestatus.py | jq ".players") players=$(python3 $(dirname $0)/minestatus.py | jq ".players")
if [[ $players == 0 ]]; then if [[ $players == 0 ]]; then

View File

@ -1,47 +1,35 @@
<?php <?php
$DIGITALOCEAN_TOKEN="dop_your_digitalocean_token_here"; $REGION="us-west-1"; // change as needed
$DROPLET_ID="your_droplet_id_here"; $INSTANCE_ID="your_instance_id_here";
$PASSWORD="your_password_here"; $PASSWORD="your_password_here";
if ($_GET['password'] !== $PASSWORD) {
usleep(rand(0,999999));
exit("Invalid password.");
}
if ($_POST['action'] == "on") { if ($_POST['action'] == "on") {
$out = `curl -X POST \ $out = `aws ec2 start-instances --region=$REGION --instance-id $INSTANCE_ID 2>&1`;
-H "Content-Type: application/json" \
-H "Authorization: Bearer $DIGITALOCEAN_TOKEN" \
-d '{"type":"power_on"}' \
"https://api.digitalocean.com/v2/droplets/$DROPLET_ID/actions"`;
} elseif ($_POST['action'] == "off") { } elseif ($_POST['action'] == "off") {
$out = `curl -X POST \ $out = `aws ec2 stop-instances --region=$REGION --instance-id $INSTANCE_ID`;
-H "Content-Type: application/json" \
-H "Authorization: Bearer $DIGITALOCEAN_TOKEN" \
-d '{"type":"power_off"}' \
"https://api.digitalocean.com/v2/droplets/$DROPLET_ID/actions"`;
} elseif ($_POST['action'] == "status") { } elseif ($_POST['action'] == "status") {
$out = `curl -X GET \ $out = `aws ec2 describe-instance-status --region=$REGION --include-all-instances --instance-id $INSTANCE_ID`;
-H "Content-Type: application/json" \
-H "Authorization: Bearer $DIGITALOCEAN_TOKEN" \
"https://api.digitalocean.com/v2/droplets/$DROPLET_ID"`;
} }
if ($out) { if ($out) {
$json = json_decode($out, true); $json = json_decode($out, true);
if ($json['action']) { if ($_POST['action'] == "on") {
$status = $json['action']['status']; echo "<a href='javascript:history.back()'>Go back</a><br/><br/><b>Result:</b> ";
} elseif ($json['droplet']) { }
$status = $json['droplet']['status'];
if ($json['StartingInstances']) {
exit($json['StartingInstances'][0]['CurrentState']['Name']);
} elseif ($json['StoppingInstances']) {
exit($json['StoppingInstances'][0]['CurrentState']['Name']);
} elseif ($json['InstanceStatuses']) {
exit($json['InstanceStatuses'][0]['InstanceState']['Name']);
} }
} }
@ -49,12 +37,32 @@ if ($out) {
<head><title>MineCollective Minecraft Server</title></head> <head><title>MineCollective Minecraft Server</title></head>
<body> <body>
<p> <p>
Press this button to turn on the server. It'll take up to 5 minutes to boot, and turn off Press this button to turn on the server. It'll take a couple minutes to fully turn on,
after about 30 minutes of inactivity. and it'll turn off automatically after about 30 minutes of inactivity.
</p> </p>
<form action="#" method="POST"> <form action="#" method="POST">
<input type="hidden" name="action" value="on" /> <input type="hidden" name="action" value="on" />
<input type="submit" value="Turn On" /> <input type="submit" value="Turn On" />
</form> </form>
<b>Current status:</b>
<i><?php
$status = `aws ec2 describe-instance-status --region=$REGION --include-all-instances --instance-id $INSTANCE_ID 2>&1`;
$json = json_decode($status, true);
echo $json['InstanceStatuses'][0]['InstanceState']['Name'];
if ($json['InstanceStatuses'][0]['InstanceState']['Name'] == "running") {
$players = `python3 /var/minecraft/minestatus.py 2>&1`;
$json = json_decode($players, true);
if ($json['players'] !== null) {
echo " with ".$json['players']." players";
} else {
echo " but not reachable yet.";
}
}
?></i>
</body> </body>
</html> </html>