mirror of
https://github.com/DerTyp7/docker_minecraft_server_auto_starter.git
synced 2025-10-28 20:32:16 +01:00
Update Dockerfile and utils.py
This commit is contained in:
@@ -3,10 +3,8 @@ FROM nginx:1.25.3
|
||||
|
||||
ENV PORT_MAP ""
|
||||
ENV PYTHONUNBUFFERED=1
|
||||
ENV PLACEHOLDER_SERVER_SLEEPING_IP ""
|
||||
ENV PLACEHOLDER_SERVER_STARTING_IP ""
|
||||
|
||||
# Install Python and pip
|
||||
# Install Python, pip and git
|
||||
RUN apt-get update && apt-get install -y python3 python3-pip python3-venv
|
||||
|
||||
# Create a virtual environment and activate it
|
||||
|
||||
1
app/FakeMCServer
Submodule
1
app/FakeMCServer
Submodule
Submodule app/FakeMCServer added at d7d7bedb2b
24
app/app.py
24
app/app.py
@@ -1,17 +1,37 @@
|
||||
from math import log
|
||||
import os
|
||||
import time
|
||||
from dockerHandler import DockerHandler
|
||||
from nginxHandler import NginxHandler
|
||||
from minecraftServerHandler import MinecraftServerHandler
|
||||
from requestHandler import RequestHandler
|
||||
import logging
|
||||
|
||||
from FakeMCServer.fake_mc_server import FakeMCServer
|
||||
import threading
|
||||
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
|
||||
|
||||
def init_placeholder_servers():
|
||||
sleeping = FakeMCServer(port=20000, motd={
|
||||
"1": "sleeping!", "2": "§aCheck example.com for more information!"})
|
||||
starting = FakeMCServer(port=20001, motd={
|
||||
"1": "starting!", "2": "§aCheck example.com for more information!"})
|
||||
|
||||
# Create threads for each server initialization
|
||||
sleeping_thread = threading.Thread(target=sleeping.start_server)
|
||||
starting_thread = threading.Thread(target=starting.start_server)
|
||||
|
||||
# Start the threads
|
||||
sleeping_thread.start()
|
||||
starting_thread.start()
|
||||
|
||||
|
||||
def main() -> None:
|
||||
try:
|
||||
logging.info('[INIT] initializing placeholder servers...')
|
||||
init_placeholder_servers()
|
||||
logging.info('[INIT] placeholder servers initialized')
|
||||
|
||||
logging.info('[INIT] initializing auto starter...')
|
||||
logging.info('[INIT] initializing docker handler...')
|
||||
docker_handler: DockerHandler = DockerHandler(
|
||||
|
||||
@@ -30,7 +30,8 @@ class RequestHandler(threading.Thread):
|
||||
logging.info(
|
||||
f'[RequestHandler:{self.port}] starting up on {server_address[0]} port {server_address[1]}')
|
||||
self.sock.bind(server_address)
|
||||
self.sock.listen(1)
|
||||
self.sock.settimeout(5)
|
||||
self.sock.listen(30)
|
||||
logging.info(
|
||||
f'[RequestHandler:{self.port}] request handler initialized')
|
||||
|
||||
@@ -124,23 +125,19 @@ class RequestHandler(threading.Thread):
|
||||
logging.info(
|
||||
'[RequestHandler:{self.port}] forwarding request to placeholder server')
|
||||
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket:
|
||||
ip = self.docker_handler.get_ip_by_service_name(
|
||||
os.environ.get('PLACEHOLDER_SERVER_SLEEPING_SERVICE'))
|
||||
if minecraft_server.is_starting() == True:
|
||||
logging.info(
|
||||
'[RequestHandler:{self.port}] container is starting. Using starting placeholder ip')
|
||||
ip = self.docker_handler.get_ip_by_service_name(
|
||||
os.environ.get('PLACEHOLDER_SERVER_STARTING_SERVICE'))
|
||||
|
||||
if not ip:
|
||||
logging.info(
|
||||
'[RequestHandler:{self.port}] no placeholder server ip found')
|
||||
return
|
||||
|
||||
ip = "127.0.0.1"
|
||||
logging.info(
|
||||
f'[RequestHandler:{self.port}] placeholder server ip: {ip}')
|
||||
try:
|
||||
server_socket.connect((ip, 25565))
|
||||
if minecraft_server.is_starting() == True:
|
||||
logging.info(
|
||||
'[RequestHandler:{self.port}] container is starting. Using placeholder port 20001')
|
||||
server_socket.connect((ip, 20001))
|
||||
else:
|
||||
logging.info(
|
||||
'[RequestHandler:{self.port}] container is not starting. Using placeholder port 20000')
|
||||
server_socket.connect((ip, 20000))
|
||||
|
||||
server_socket.sendall(request)
|
||||
response = server_socket.recv(1024)
|
||||
self.connection.sendall(response)
|
||||
|
||||
34
app/utils.py
34
app/utils.py
@@ -1,9 +1,11 @@
|
||||
import logging
|
||||
import os
|
||||
import socket
|
||||
import json
|
||||
import json
|
||||
from typing import List, Dict
|
||||
|
||||
|
||||
def docker_container_mapping():
|
||||
def docker_container_mapping() -> Dict[str, str]:
|
||||
port_map_str = os.environ.get('PORT_MAP')
|
||||
|
||||
port_map = {}
|
||||
@@ -18,3 +20,31 @@ def docker_container_mapping():
|
||||
for port in port_map:
|
||||
logging.info(f'{port} -> {port_map[port]}')
|
||||
return port_map
|
||||
|
||||
|
||||
# motd = {
|
||||
# "1": "§4Maintenance!",
|
||||
# "2": "§aCheck example.com for more information!"
|
||||
# }
|
||||
# version_text = "§4Maintenance"
|
||||
# samples = ["§bexample.com", "", "§4Maintenance"]
|
||||
# kick_message = ["§bSorry", "", "§aThis server is offline!"]
|
||||
|
||||
def generate_placeholder_server_config_file(path: str, ip: str, port: int, motd: Dict[str, str], version_text: str, samples: List[str], kick_message: List[str]) -> None:
|
||||
config = {
|
||||
"ip": ip,
|
||||
"kick_message": kick_message,
|
||||
"motd": motd,
|
||||
"player_max": 0,
|
||||
"player_online": 0,
|
||||
"port": port,
|
||||
"protocol": 2,
|
||||
"samples": samples,
|
||||
"server_icon": "server_icon.png",
|
||||
"show_hostname_if_available": True,
|
||||
"show_ip_if_hostname_available": True,
|
||||
"version_text": version_text
|
||||
}
|
||||
|
||||
with open(path, 'w') as f:
|
||||
json.dump(config, f, indent=4)
|
||||
|
||||
@@ -9,10 +9,6 @@ services:
|
||||
- 25565:25565
|
||||
- 25566:25566
|
||||
environment:
|
||||
# The ip of the placeholder servers below
|
||||
PLACEHOLDER_SERVER_SLEEPING_SERVICE: "mc_placeholder_server_sleeping"
|
||||
PLACEHOLDER_SERVER_STARTING_SERVICE: "mc_placeholder_server_starting"
|
||||
|
||||
# Port mapping for the servers
|
||||
# The key is the external port of the placeholder server
|
||||
# The value is the internal ip of the actual server
|
||||
@@ -23,55 +19,6 @@ services:
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
|
||||
# These are the placeholder servers. They are used to show the player a message
|
||||
# They are not needed, but they are nice to have
|
||||
# Keep in mind these servers are consuming some resources
|
||||
mc_placeholder_server_sleeping:
|
||||
container_name: mc_placeholder_server_sleeping
|
||||
restart: always
|
||||
image: itzg/minecraft-server:java8
|
||||
environment:
|
||||
VERSION: "1.12.2"
|
||||
EULA: "TRUE"
|
||||
MOTD: "Sleeping | Join to wake up"
|
||||
|
||||
# The placeholder servers should be as lightweight as possible
|
||||
MAX_PLAYERS: "0"
|
||||
MAX_MEMORY: "512M"
|
||||
INIT_MEMORY: "512M"
|
||||
LEVEL_TYPE: "FLAT"
|
||||
JVM_XX_OPTS: "-XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC -XX:+UseCompressedOops"
|
||||
VIEW_DISTANCE: "1"
|
||||
SPAWN_ANIMALS: "false"
|
||||
SPAWN_MONSTERS: "false"
|
||||
SNOOPER_ENABLED: "false"
|
||||
GENERATE_STRUCTURES: "false"
|
||||
ALLOW_NETHER: "false"
|
||||
ALLOW_END: "false"
|
||||
|
||||
mc_placeholder_server_starting:
|
||||
container_name: mc_placeholder_server_starting
|
||||
restart: always
|
||||
image: itzg/minecraft-server:java8
|
||||
environment:
|
||||
VERSION: "1.12.2"
|
||||
EULA: "TRUE"
|
||||
MOTD: "Starting, please wait..."
|
||||
|
||||
# The placeholder servers should be as lightweight as possible
|
||||
MAX_PLAYERS: "0"
|
||||
MAX_MEMORY: "512M"
|
||||
INIT_MEMORY: "512M"
|
||||
LEVEL_TYPE: "FLAT"
|
||||
JVM_XX_OPTS: "-XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC -XX:+UseCompressedOops"
|
||||
VIEW_DISTANCE: "1"
|
||||
SPAWN_ANIMALS: "false"
|
||||
SPAWN_MONSTERS: "false"
|
||||
SNOOPER_ENABLED: "false"
|
||||
GENERATE_STRUCTURES: "false"
|
||||
ALLOW_NETHER: "false"
|
||||
ALLOW_END: "false"
|
||||
|
||||
# These are the actual servers
|
||||
# For itzg/minecraft-server you can find the documentation here: https://docker-minecraft-server.readthedocs.io/en/latest/variables/
|
||||
mc:
|
||||
|
||||
Reference in New Issue
Block a user