Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,9 @@ For the most up-to-date documentation, refer to the [source config.xml](https://
| `XMAGE_MAIL_PASSWORD` | password of the used user to send the mail |
| `XMAGE_MAIL_FROM_ADDRESS` | sender address |

In addition to the above, you can specify java arguments using the `JAVA_EXTRA_ARGS` environment variable.
`JAVA_MAX_MEMORY` and `JAVA_MIN_MEMORY` set `-Xmx` and `-Xms` respectively.
Copy link

Copilot AI Feb 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider documenting the backward compatibility support for the deprecated MAX_MEMORY and MIN_MEMORY environment variables. Users upgrading from previous versions may still be using these variable names, and it would be helpful to explicitly mention that these are still supported but that JAVA_MAX_MEMORY and JAVA_MIN_MEMORY are the preferred names going forward.

Suggested change
`JAVA_MAX_MEMORY` and `JAVA_MIN_MEMORY` set `-Xmx` and `-Xms` respectively.
`JAVA_MAX_MEMORY` and `JAVA_MIN_MEMORY` (or the deprecated `MAX_MEMORY` and `MIN_MEMORY`, which are still supported for backward compatibility) set `-Xmx` and `-Xms` respectively. Prefer using the `JAVA_`-prefixed variables going forward.

Copilot uses AI. Check for mistakes.

## Development

### Pre-requisites
Expand Down
109 changes: 49 additions & 60 deletions entrypoint.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#!/bin/env bash
#!/usr/bin/env bash

JAVA_BIN="${JAVA_BIN:-$(which java)}"
SERVER_JAR="${SERVER_JAR:-$(find ~+ -name 'mage-server-*.jar')}"
Expand All @@ -7,74 +7,63 @@ SERVER_JAR="${SERVER_JAR:-$(find ~+ -name 'mage-server-*.jar')}"
DEFAULT_CONFIG='/opt/xmage/config/config.xml'
XMAGE_CONFIG_PATH="${XMAGE_CONFIG_PATH:-$DEFAULT_CONFIG}"

function apply_config () {
local KEY="$1"
local VALUE="$2"

sed -i -e "s#\($KEY=\)[\"].*[\"]#\1\"$VALUE\"#g" "${XMAGE_CONFIG_PATH}"
}

if [ "$XMAGE_CONFIG_PATH" == "$DEFAULT_CONFIG" ] && [ -f "$XMAGE_CONFIG_PATH" ]; then
# https://github.com/magefree/mage/blob/master/Mage.Server/release/config/config.xml
XMAGE_SERVER_ADDRESS="${XMAGE_SERVER_ADDRESS:-0.0.0.0}"
XMAGE_SERVER_NAME="${XMAGE_SERVER_NAME:-mage-server}"
XMAGE_PORT="${XMAGE_PORT:-17171}"
XMAGE_SECONDARY_BIND_PORT="${XMAGE_SECONDARY_BIND_PORT:--1}"
XMAGE_BACKLOG_SIZE="${XMAGE_BACKLOG_SIZE:-200}"
XMAGE_NUM_ACCEPT_THREADS="${XMAGE_NUM_ACCEPT_THREADS:-2}"
XMAGE_MAX_POOL_SIZE="${XMAGE_MAX_POOL_SIZE:-300}"
XMAGE_LEASE_PERIOD="${XMAGE_LEASE_PERIOD:-5000}"
XMAGE_SOCKET_WRITE_TIMEOUT="${XMAGE_SOCKET_WRITE_TIMEOUT:-10000}"
XMAGE_MAX_GAME_THREADS="${XMAGE_MAX_GAME_THREADS:-10}"
XMAGE_MAX_SECONDS_IDLE="${XMAGE_MAX_SECONDS_IDLE:-600}"
XMAGE_MIN_USER_NAME_LENGTH="${XMAGE_MIN_USER_NAME_LENGTH:-3}"
XMAGE_MAX_USER_NAME_LENGTH="${XMAGE_MAX_USER_NAME_LENGTH:-14}"
XMAGE_INVALID_USER_NAME_PATTERN="${XMAGE_INVALID_USER_NAME_PATTERN:-[^a-z0-9_]}"
XMAGE_MIN_PASSWORD_LENGTH="${XMAGE_MIN_PASSWORD_LENGTH:-8}"
XMAGE_MAX_PASSWORD_LENGTH="${XMAGE_MAX_PASSWORD_LENGTH:-100}"
XMAGE_MAX_AI_OPPONENTS="${XMAGE_MAX_AI_OPPONENTS:-15}"
XMAGE_SAVE_GAME_ACTIVATED="${XMAGE_SAVE_GAME_ACTIVATED:-false}"
XMAGE_AUTHENTICATION_ACTIVATED="${XMAGE_AUTHENTICATION_ACTIVATED:-false}"
XMAGE_GOOGLE_ACCOUNT="${XMAGE_GOOGLE_ACCOUNT:-}"
XMAGE_MAILGUN_API_KEY="${XMAGE_MAILGUN_API_KEY:-}"
XMAGE_MAILGUN_DOMAIN="${XMAGE_MAILGUN_DOMAIN:-}"
XMAGE_MAIL_SMTP_HOST="${XMAGE_MAIL_SMTP_HOST:-}"
XMAGE_MAIL_SMTP_PORT="${XMAGE_MAIL_SMTP_PORT:-}"
XMAGE_MAIL_USER="${XMAGE_MAIL_USER:-}"
XMAGE_MAIL_PASSWORD="${XMAGE_MAIL_PASSWORD:-}"
XMAGE_MAIL_FROM_ADDRESS="${XMAGE_MAIL_FROM_ADDRESS:-}"

echo "Applying configuration to ${XMAGE_CONFIG_PATH} from environment variables..."
sed -i -e "s#\(serverAddress=\)[\"].*[\"]#\1\"$XMAGE_SERVER_ADDRESS\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(serverName=\)[\"].*[\"]#\1\"$XMAGE_SERVER_NAME\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(port=\)[\"].*[\"]#\1\"$XMAGE_PORT\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(secondaryBindPort=\)[\"].*[\"]#\1\"$XMAGE_SECONDARY_BIND_PORT\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(backlogSize=\)[\"].*[\"]#\1\"$XMAGE_BACKLOG_SIZE\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(numAcceptThreads=\)[\"].*[\"]#\1\"$XMAGE_NUM_ACCEPT_THREADS\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(maxPoolSize=\)[\"].*[\"]#\1\"$XMAGE_MAX_POOL_SIZE\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(leasePeriod=\)[\"].*[\"]#\1\"$XMAGE_LEASE_PERIOD\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(socketWriteTimeout=\)[\"].*[\"]#\1\"$XMAGE_SOCKET_WRITE_TIMEOUT\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(maxGameThreads=\)[\"].*[\"]#\1\"$XMAGE_MAX_GAME_THREADS\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(maxSecondsIdle=\)[\"].*[\"]#\1\"$XMAGE_MAX_SECONDS_IDLE\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(minUserNameLength=\)[\"].*[\"]#\1\"$XMAGE_MIN_USER_NAME_LENGTH\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(maxUserNameLength=\)[\"].*[\"]#\1\"$XMAGE_MAX_USER_NAME_LENGTH\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(invalidUserNamePattern=\)[\"].*[\"]#\1\"$XMAGE_INVALID_USER_NAME_PATTERN\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(minPasswordLength=\)[\"].*[\"]#\1\"$XMAGE_MIN_PASSWORD_LENGTH\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(maxPasswordLength=\)[\"].*[\"]#\1\"$XMAGE_MAX_PASSWORD_LENGTH\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(maxAiOpponents=\)[\"].*[\"]#\1\"$XMAGE_MAX_AI_OPPONENTS\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(saveGameActivated=\)[\"].*[\"]#\1\"$XMAGE_SAVE_GAME_ACTIVATED\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(authenticationActivated=\)[\"].*[\"]#\1\"$XMAGE_AUTHENTICATION_ACTIVATED\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(googleAccount=\)[\"].*[\"]#\1\"$XMAGE_GOOGLE_ACCOUNT\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(mailgunApiKey=\)[\"].*[\"]#\1\"$XMAGE_MAILGUN_API_KEY\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(mailgunDomain=\)[\"].*[\"]#\1\"$XMAGE_MAILGUN_DOMAIN\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(mailSmtpHost=\)[\"].*[\"]#\1\"$XMAGE_MAIL_SMTP_HOST\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(mailSmtpPort=\)[\"].*[\"]#\1\"$XMAGE_MAIL_SMTP_PORT\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(mailUser=\)[\"].*[\"]#\1\"$XMAGE_MAIL_USER\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(mailPassword=\)[\"].*[\"]#\1\"$XMAGE_MAIL_PASSWORD\"#g" "${XMAGE_CONFIG_PATH}"
sed -i -e "s#\(mailFromAddress=\)[\"].*[\"]#\1\"$XMAGE_MAIL_FROM_ADDRESS\"#g" "${XMAGE_CONFIG_PATH}"
echo "Applying configuration from environment variables to ${XMAGE_CONFIG_PATH}"
apply_config "serverAddress" "${XMAGE_SERVER_ADDRESS:-0.0.0.0}"
apply_config "serverName" "${XMAGE_SERVER_NAME:-mage-server}"
apply_config "port" "${XMAGE_PORT:-17171}"
apply_config "secondaryBindPort" "${XMAGE_SECONDARY_BIND_PORT:--1}"
apply_config "backlogSize" "${XMAGE_BACKLOG_SIZE:-200}"
apply_config "numAcceptThreads" "${XMAGE_NUM_ACCEPT_THREADS:-2}"
apply_config "maxPoolSize" "${XMAGE_MAX_POOL_SIZE:-300}"
apply_config "leasePeriod" "${XMAGE_LEASE_PERIOD:-5000}"
apply_config "socketWriteTimeout" "${XMAGE_SOCKET_WRITE_TIMEOUT:-10000}"
apply_config "maxGameThreads" "${XMAGE_MAX_GAME_THREADS:-10}"
apply_config "maxSecondsIdle" "${XMAGE_MAX_SECONDS_IDLE:-600}"
apply_config "minUserNameLength" "${XMAGE_MIN_USER_NAME_LENGTH:-3}"
apply_config "maxUserNameLength" "${XMAGE_MAX_USER_NAME_LENGTH:-14}"
apply_config "invalidUserNamePattern" "${XMAGE_INVALID_USER_NAME_PATTERN:-[^a-z0-9_]}"
apply_config "minPasswordLength" "${XMAGE_MIN_PASSWORD_LENGTH:-8}"
apply_config "maxPasswordLength" "${XMAGE_MAX_PASSWORD_LENGTH:-100}"
apply_config "maxAiOpponents" "${XMAGE_MAX_AI_OPPONENTS:-15}"
apply_config "saveGameActivated" "${XMAGE_SAVE_GAME_ACTIVATED:-false}"
apply_config "authenticationActivated" "${XMAGE_AUTHENTICATION_ACTIVATED:-false}"
apply_config "googleAccount" "${XMAGE_GOOGLE_ACCOUNT:-}"
apply_config "mailgunApiKey" "${XMAGE_MAILGUN_API_KEY:-}"
apply_config "mailgunDomain" "${XMAGE_MAILGUN_DOMAIN:-}"
apply_config "mailSmtpHost" "${XMAGE_MAIL_SMTP_HOST:-}"
apply_config "mailSmtpPort" "${XMAGE_MAIL_SMTP_PORT:-}"
apply_config "mailUser" "${XMAGE_MAIL_USER:-}"
apply_config "mailPassword" "${XMAGE_MAIL_PASSWORD:-}"
apply_config "mailFromAddress" "${XMAGE_MAIL_FROM_ADDRESS:-}"
fi

# Backwards compatibility
JAVA_MAX_MEMORY=${JAVA_MAX_MEMORY:-$MAX_MEMORY}
JAVA_MIN_MEMORY=${JAVA_MIN_MEMORY:-$MIN_MEMORY}

declare -a JAVA_ARGS=(
"-Xmx${MAX_MEMORY:-1024m}"
"-Xmx${JAVA_MAX_MEMORY:-1024m}"
"-Dxmage.config.path=$XMAGE_CONFIG_PATH"
"-Djava.net.preferIPv4Stack=true"
)

if [ -n "$MIN_MEMORY" ]; then
JAVA_ARGS+=("-Xms$MIN_MEMORY")
if [ -n "$JAVA_MIN_MEMORY" ]; then
JAVA_ARGS+=("-Xms$JAVA_MIN_MEMORY")
fi

if [ -n "$JAVA_EXTRA_ARGS" ]; then
# Split JAVA_EXTRA_ARGS into separate arguments and append them to JAVA_ARGS
read -r -a EXTRA_ARGS <<< "$JAVA_EXTRA_ARGS"
JAVA_ARGS+=("${EXTRA_ARGS[@]}")
fi

cat <<EOF
Expand Down
Loading