Update for AWS
This commit is contained in:
parent
6d22b4d999
commit
98e610704e
61
README.md
61
README.md
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user