Minecraft Server automation on GCP, for my son and his friends.
Features:
- Secured server status/start/stop pages (served by Cloud Functions)
- Automated server shutdown if there is no active players (scheduled by Cloud Scheduler)
- Minecraft RCON password secured in Google Secret Manager
- Minecrart world synchronized to/from Google Storage
TODO list:
- Compute instance cost reduction
- OAuth authentication
- Docker image with Minecraft Server
- DNS
Server status page.
https://your-project.cloudfunctions.net/server_status?api_key=super_secret_key
Start server.
https://your-project.cloudfunctions.net/start_server?api_key=super_secret_key
Stop server.
https://your-project.cloudfunctions.net/stop_server?api_key=super_secret_key
Use the venv
command to create a virtual copy of the entire Python installation.
python -m venv venv
Set your shell to use the venv
paths for Python by activating the virtual environment.
source venv/bin/activate
Install packages (see pre-installed packages for recommended versions).
pip install -r minecraft/requirements.txt
Update components.
gcloud components update
Configure default projects.
gcloud config set project minecraft-272917
Enable required APIs.
gcloud services enable appengine.googleapis.com
gcloud services enable iam.googleapis.com
Create service account for Terraform.
gcloud iam service-accounts create terraform
Assign mandatory roles for created service account.
gcloud projects add-iam-policy-binding minecraft-272917 \
--member="serviceAccount:terraform@minecraft-272917.iam.gserviceaccount.com" \
--role="roles/storage.admin"
gcloud projects add-iam-policy-binding minecraft-272917 \
--member="serviceAccount:terraform@minecraft-272917.iam.gserviceaccount.com" \
--role="roles/cloudfunctions.admin"
gcloud projects add-iam-policy-binding minecraft-272917 \
--member="serviceAccount:terraform@minecraft-272917.iam.gserviceaccount.com" \
--role="roles/compute.admin"
gcloud projects add-iam-policy-binding minecraft-272917 \
--member="serviceAccount:terraform@minecraft-272917.iam.gserviceaccount.com" \
--role="roles/pubsub.admin"
gcloud projects add-iam-policy-binding minecraft-272917 \
--member="serviceAccount:terraform@minecraft-272917.iam.gserviceaccount.com" \
--role="roles/cloudscheduler.admin"
gcloud projects add-iam-policy-binding minecraft-272917 \
--member="serviceAccount:terraform@minecraft-272917.iam.gserviceaccount.com" \
--role="roles/appengine.appAdmin"
gcloud projects add-iam-policy-binding minecraft-272917 \
--member="serviceAccount:terraform@minecraft-272917.iam.gserviceaccount.com" \
--role="roles/iam.serviceAccountAdmin"
Service account needs to be a member of the Compute Engine default service account.
gcloud iam service-accounts add-iam-policy-binding minecraft-272917@appspot.gserviceaccount.com \
--member="serviceAccount:terraform@minecraft-272917.iam.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"
Generate service account key.
gcloud iam service-accounts keys create minecraft-terraform.json \
--iam-account=terraform@minecraft-272917.iam.gserviceaccount.com
Copy downloaded key into clipboard and set GitHub secret GCP_SA_KEY, paste the key from the clipboard.
pbcopy < minecraft-terraform.json
Remove the key.
rm minecraft-terraform.json
Set up GitHub secret GCP_PROJECT_ID.
Create secret for RCON.
gcloud secrets create "rcon" --replication-policy="automatic"
Add secret version.
echo -n "this is my super rcon secret" | \
gcloud secrets versions add "rcon" --data-file=-
Create secret for cloud functions api key.
gcloud secrets create "api" --replication-policy="automatic"
Add secret version.
echo -n "this is my super api secret" | \
gcloud secrets versions add "api" --data-file=-
Add secretmanager.secretAccessor
role to service account.
TODO
Deploy cloud functions (see deploy manual).
Server status page.
gcloud functions deploy server_status \
--timeout=180s --max-instances=1 \
--region=europe-west1 \
--stage-bucket=minecraft-272917-cloud-functions \
--source=./cloud-function --runtime=python38 --trigger-http
Start server page.
gcloud functions deploy start_server \
--timeout=300s --max-instances=1 \
--region=europe-west1 \
--stage-bucket=minecraft-272917-cloud-functions \
--source=./cloud-function --runtime=python38 --trigger-http
Stop server page.
gcloud functions deploy stop_server \
--timeout=300s --max-instances=1 \
--region=europe-west1 \
--stage-bucket=minecraft-272917-cloud-functions \
--source=./cloud-function --runtime=python38 --trigger-http
Automated server stopping handler.
gcloud functions deploy stop_server_handler \
--timeout=300s --max-instances=1 \
--region=europe-west1 \
--stage-bucket=minecraft-272917-cloud-functions \
--source=./cloud-function --runtime=python38 --trigger-topic ten-minutes-jobs
Disable built-in authentication for HTTP cloud functions.
gcloud alpha functions add-iam-policy-binding server_status --region=europe-west1 --member=allUsers --role=roles/cloudfunctions.invoker
gcloud alpha functions add-iam-policy-binding stop_server --region=europe-west1 --member=allUsers --role=roles/cloudfunctions.invoker
gcloud alpha functions add-iam-policy-binding start_server --region=europe-west1 --member=allUsers --role=roles/cloudfunctions.invoker