diff --git a/Dockerfile b/Dockerfile index 556f496..d94de09 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:bullseye-slim +FROM debian:trixie-slim LABEL maintainer="ACE Team - https://github.com/acemod" LABEL org.opencontainers.image.source=https://github.com/acemod/docker-reforger @@ -7,15 +7,16 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"] RUN apt-get update \ && \ apt-get install -y --no-install-recommends --no-install-suggests \ - python3 \ - lib32stdc++6 \ - lib32gcc-s1 \ - wget \ ca-certificates \ + lib32gcc-s1 \ + lib32stdc++6 \ + libterm-readline-perl-perl \ libcurl4 \ + libssl3 \ net-tools \ - libssl1.1 \ + python3 \ wamerican \ + wget \ && \ apt-get remove --purge -y \ && \ @@ -76,10 +77,11 @@ ENV SKIP_INSTALL=false WORKDIR /reforger -VOLUME /steamcmd VOLUME /home/profile +VOLUME /reforger VOLUME /reforger/Configs VOLUME /reforger/workshop +VOLUME /steamcmd EXPOSE 2001/udp EXPOSE 17777/udp diff --git a/launch.py b/launch.py index b02e942..3abc70a 100644 --- a/launch.py +++ b/launch.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 import json import os import random @@ -7,6 +8,8 @@ import subprocess import sys from pathlib import Path +import secrets +import string # On SIGTERM, raise KeyboardInterrupt instead of exiting abruptly. signal.signal(signal.SIGTERM, signal.default_int_handler) @@ -19,12 +22,21 @@ def env_defined(key): def random_passphrase(): - password = "'" - while "'" in password: - with open("/usr/share/dict/american-english") as f: - words = f.readlines() - password = "-".join(random.sample(words, 2)).replace("\n", "").lower() - return password + + words = [] + with open("/usr/share/dict/american-english", encoding="utf-8") as word_file: + words = [word.strip() for word in word_file if len(word.strip()) >= 4] + + # Generate a passphrase with two random words and a random separator + word1 = secrets.choice(words).lower() + word2 = secrets.choice(words).lower() + separator = secrets.choice(["-", "_", ".", "~"]) + + # Add a random number and a special character for extra security + random_number = secrets.randbelow(100) + special_char = secrets.choice(string.punctuation) + + return f"{word1}{separator}{word2}{random_number}{special_char}" def bool_str(text): @@ -132,13 +144,24 @@ def bool_str(text): else: config["a2s"] = None + if "rcon" not in config: + config["rcon"] = {} + + if env_defined("RCON_PASSWORD"): + rconPassword = os.environ["RCON_PASSWORD"] + else: + rconPassword = random_passphrase() + print(f"\033[92m[INFO]\033[0m Autogenerated RCON password: \033[93m{rconPassword}\033[0m") + + config["rcon"]["password"] = rconPassword + if env_defined("RCON_ADDRESS") and env_defined("RCON_PORT"): - config["rcon"] = { + config["rcon"].update({ "address": os.environ["RCON_ADDRESS"], "port": int(os.environ["RCON_PORT"]), - "password": os.environ["RCON_PASSWORD"], + "password": rconPassword, "permission": os.environ["RCON_PERMISSION"], - } + }) else: config["rcon"] = None @@ -151,7 +174,7 @@ def bool_str(text): else: adminPassword = random_passphrase() config["game"]["passwordAdmin"] = adminPassword - print(f"Admin password: {adminPassword}") + print(f"\033[92m[INFO]\033[0m Autogenerated Admin password: \033[93m{adminPassword}\033[0m") if env_defined("GAME_ADMINS"): admins = str(os.environ["GAME_ADMINS"]).split(",") admins[:] = [admin for admin in admins if admin] # Remove empty items form list