# .env rendering helpers for setup.sh setup_write_env() { local ENV_OUT="$(dirname "$0")/.env" if [ -f "$ENV_OUT" ]; then say WARNING ".env already exists at $(realpath "$ENV_OUT" 2>/dev/null || echo "$ENV_OUT"). It will be overwritten." local cont if [ "$FORCE_OVERWRITE" = "1" ]; then cont=1 else cont=$(ask_yn "Continue and overwrite?" n) fi [ "$cont" = "1" ] || { say ERROR "Aborted"; exit 1; } fi DB_PLAYERBOTS_NAME=${DB_PLAYERBOTS_NAME:-$DEFAULT_DB_PLAYERBOTS_NAME} HOST_ZONEINFO_PATH=${HOST_ZONEINFO_PATH:-$DEFAULT_HOST_ZONEINFO_PATH} MYSQL_INNODB_REDO_LOG_CAPACITY=${MYSQL_INNODB_REDO_LOG_CAPACITY:-$DEFAULT_MYSQL_INNODB_REDO_LOG_CAPACITY} MYSQL_RUNTIME_TMPFS_SIZE=${MYSQL_RUNTIME_TMPFS_SIZE:-$DEFAULT_MYSQL_RUNTIME_TMPFS_SIZE} COMPOSE_OVERRIDE_MYSQL_EXPOSE_ENABLED=${COMPOSE_OVERRIDE_MYSQL_EXPOSE_ENABLED:-$DEFAULT_COMPOSE_OVERRIDE_MYSQL_EXPOSE_ENABLED} COMPOSE_OVERRIDE_WORLDSERVER_DEBUG_LOGGING_ENABLED=${COMPOSE_OVERRIDE_WORLDSERVER_DEBUG_LOGGING_ENABLED:-$DEFAULT_COMPOSE_OVERRIDE_WORLDSERVER_DEBUG_LOGGING_ENABLED} MYSQL_DISABLE_BINLOG=${MYSQL_DISABLE_BINLOG:-$DEFAULT_MYSQL_DISABLE_BINLOG} MYSQL_CONFIG_DIR=${MYSQL_CONFIG_DIR:-$DEFAULT_MYSQL_CONFIG_DIR} CLIENT_DATA_PATH=${CLIENT_DATA_PATH:-$DEFAULT_CLIENT_DATA_PATH} BACKUP_HEALTHCHECK_MAX_MINUTES=${BACKUP_HEALTHCHECK_MAX_MINUTES:-$DEFAULT_BACKUP_HEALTHCHECK_MAX_MINUTES} BACKUP_HEALTHCHECK_GRACE_SECONDS=${BACKUP_HEALTHCHECK_GRACE_SECONDS:-$DEFAULT_BACKUP_HEALTHCHECK_GRACE_SECONDS} DB_WAIT_RETRIES=${DB_WAIT_RETRIES:-$DEFAULT_DB_WAIT_RETRIES} DB_WAIT_SLEEP=${DB_WAIT_SLEEP:-$DEFAULT_DB_WAIT_SLEEP} DB_RECONNECT_SECONDS=${DB_RECONNECT_SECONDS:-$DEFAULT_DB_RECONNECT_SECONDS} DB_RECONNECT_ATTEMPTS=${DB_RECONNECT_ATTEMPTS:-$DEFAULT_DB_RECONNECT_ATTEMPTS} DB_UPDATES_ALLOWED_MODULES=${DB_UPDATES_ALLOWED_MODULES:-$DEFAULT_DB_UPDATES_ALLOWED_MODULES} DB_UPDATES_REDUNDANCY=${DB_UPDATES_REDUNDANCY:-$DEFAULT_DB_UPDATES_REDUNDANCY} DB_LOGIN_WORKER_THREADS=${DB_LOGIN_WORKER_THREADS:-$DEFAULT_DB_LOGIN_WORKER_THREADS} DB_WORLD_WORKER_THREADS=${DB_WORLD_WORKER_THREADS:-$DEFAULT_DB_WORLD_WORKER_THREADS} DB_CHARACTER_WORKER_THREADS=${DB_CHARACTER_WORKER_THREADS:-$DEFAULT_DB_CHARACTER_WORKER_THREADS} DB_LOGIN_SYNCH_THREADS=${DB_LOGIN_SYNCH_THREADS:-$DEFAULT_DB_LOGIN_SYNCH_THREADS} DB_WORLD_SYNCH_THREADS=${DB_WORLD_SYNCH_THREADS:-$DEFAULT_DB_WORLD_SYNCH_THREADS} DB_CHARACTER_SYNCH_THREADS=${DB_CHARACTER_SYNCH_THREADS:-$DEFAULT_DB_CHARACTER_SYNCH_THREADS} MYSQL_HEALTHCHECK_INTERVAL=${MYSQL_HEALTHCHECK_INTERVAL:-$DEFAULT_MYSQL_HEALTHCHECK_INTERVAL} MYSQL_HEALTHCHECK_TIMEOUT=${MYSQL_HEALTHCHECK_TIMEOUT:-$DEFAULT_MYSQL_HEALTHCHECK_TIMEOUT} MYSQL_HEALTHCHECK_RETRIES=${MYSQL_HEALTHCHECK_RETRIES:-$DEFAULT_MYSQL_HEALTHCHECK_RETRIES} MYSQL_HEALTHCHECK_START_PERIOD=${MYSQL_HEALTHCHECK_START_PERIOD:-$DEFAULT_MYSQL_HEALTHCHECK_START_PERIOD} AUTH_HEALTHCHECK_INTERVAL=${AUTH_HEALTHCHECK_INTERVAL:-$DEFAULT_AUTH_HEALTHCHECK_INTERVAL} AUTH_HEALTHCHECK_TIMEOUT=${AUTH_HEALTHCHECK_TIMEOUT:-$DEFAULT_AUTH_HEALTHCHECK_TIMEOUT} AUTH_HEALTHCHECK_RETRIES=${AUTH_HEALTHCHECK_RETRIES:-$DEFAULT_AUTH_HEALTHCHECK_RETRIES} AUTH_HEALTHCHECK_START_PERIOD=${AUTH_HEALTHCHECK_START_PERIOD:-$DEFAULT_AUTH_HEALTHCHECK_START_PERIOD} WORLD_HEALTHCHECK_INTERVAL=${WORLD_HEALTHCHECK_INTERVAL:-$DEFAULT_WORLD_HEALTHCHECK_INTERVAL} WORLD_HEALTHCHECK_TIMEOUT=${WORLD_HEALTHCHECK_TIMEOUT:-$DEFAULT_WORLD_HEALTHCHECK_TIMEOUT} WORLD_HEALTHCHECK_RETRIES=${WORLD_HEALTHCHECK_RETRIES:-$DEFAULT_WORLD_HEALTHCHECK_RETRIES} WORLD_HEALTHCHECK_START_PERIOD=${WORLD_HEALTHCHECK_START_PERIOD:-$DEFAULT_WORLD_HEALTHCHECK_START_PERIOD} for hc_key in "${HEALTHCHECK_KEYS[@]}"; do default_var="DEFAULT_${hc_key}" printf -v "$hc_key" '%s' "${!hc_key:-${!default_var}}" done unset hc_key default_var MODULE_ELUNA=${MODULE_ELUNA:-$DEFAULT_MODULE_ELUNA} BACKUP_PATH=${BACKUP_PATH:-$DEFAULT_BACKUP_PATH} local project_image_prefix project_image_prefix="$(sanitize_project_name "$DEFAULT_PROJECT_NAME")" if [ "$STACK_IMAGE_MODE" = "playerbots" ]; then AC_AUTHSERVER_IMAGE_PLAYERBOTS_VALUE="$(resolve_project_image_tag "$project_image_prefix" "authserver-playerbots")" AC_WORLDSERVER_IMAGE_PLAYERBOTS_VALUE="$(resolve_project_image_tag "$project_image_prefix" "worldserver-playerbots")" AC_DB_IMPORT_IMAGE_VALUE="$(resolve_project_image_tag "$project_image_prefix" "db-import-playerbots")" AC_CLIENT_DATA_IMAGE_PLAYERBOTS_VALUE="$(resolve_project_image_tag "$project_image_prefix" "client-data-playerbots")" else AC_AUTHSERVER_IMAGE_PLAYERBOTS_VALUE="$DEFAULT_AUTH_IMAGE_PLAYERBOTS" AC_WORLDSERVER_IMAGE_PLAYERBOTS_VALUE="$DEFAULT_WORLD_IMAGE_PLAYERBOTS" AC_DB_IMPORT_IMAGE_VALUE="$DEFAULT_AC_DB_IMPORT_IMAGE" AC_CLIENT_DATA_IMAGE_PLAYERBOTS_VALUE="$DEFAULT_CLIENT_DATA_IMAGE_PLAYERBOTS" fi AC_AUTHSERVER_IMAGE_MODULES_VALUE="$(resolve_project_image_tag "$project_image_prefix" "authserver-modules-latest")" AC_WORLDSERVER_IMAGE_MODULES_VALUE="$(resolve_project_image_tag "$project_image_prefix" "worldserver-modules-latest")" { cat < exposes MySQL externally via COMPOSE_OVERRIDE_MYSQL_EXPOSE_ENABLED # worldserver-debug-logging.yml -> raises log verbosity via COMPOSE_OVERRIDE_WORLDSERVER_DEBUG_LOGGING_ENABLED COMPOSE_OVERRIDE_MYSQL_EXPOSE_ENABLED=$COMPOSE_OVERRIDE_MYSQL_EXPOSE_ENABLED COMPOSE_OVERRIDE_WORLDSERVER_DEBUG_LOGGING_ENABLED=$COMPOSE_OVERRIDE_WORLDSERVER_DEBUG_LOGGING_ENABLED COMPOSE_PROJECT_NAME=$DEFAULT_PROJECT_NAME STORAGE_PATH=$STORAGE_PATH STORAGE_PATH_LOCAL=$LOCAL_STORAGE_ROOT STORAGE_CONFIG_PATH=$(get_template_value "STORAGE_CONFIG_PATH") STORAGE_LOGS_PATH=$(get_template_value "STORAGE_LOGS_PATH") STORAGE_MODULES_PATH=$(get_template_value "STORAGE_MODULES_PATH") STORAGE_LUA_SCRIPTS_PATH=$(get_template_value "STORAGE_LUA_SCRIPTS_PATH") STORAGE_MODULES_META_PATH=$(get_template_value "STORAGE_MODULES_META_PATH") STORAGE_MODULE_SQL_PATH=$(get_template_value "STORAGE_MODULE_SQL_PATH") STORAGE_INSTALL_MARKERS_PATH=$(get_template_value "STORAGE_INSTALL_MARKERS_PATH") STORAGE_CLIENT_DATA_PATH=$(get_template_value "STORAGE_CLIENT_DATA_PATH") STORAGE_LOCAL_SOURCE_PATH=$(get_template_value "STORAGE_LOCAL_SOURCE_PATH") BACKUP_PATH=$BACKUP_PATH TZ=$DEFAULT_TZ # Database MYSQL_IMAGE=$DEFAULT_MYSQL_IMAGE MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD MYSQL_ROOT_HOST=$DEFAULT_MYSQL_ROOT_HOST MYSQL_USER=$DEFAULT_MYSQL_USER MYSQL_PORT=$DEFAULT_MYSQL_INTERNAL_PORT MYSQL_EXTERNAL_PORT=$MYSQL_EXTERNAL_PORT MYSQL_DISABLE_BINLOG=${MYSQL_DISABLE_BINLOG:-$DEFAULT_MYSQL_DISABLE_BINLOG} MYSQL_CONFIG_DIR=${MYSQL_CONFIG_DIR:-$DEFAULT_MYSQL_CONFIG_DIR} MYSQL_CHARACTER_SET=$DEFAULT_MYSQL_CHARACTER_SET MYSQL_COLLATION=$DEFAULT_MYSQL_COLLATION MYSQL_MAX_CONNECTIONS=$DEFAULT_MYSQL_MAX_CONNECTIONS MYSQL_INNODB_BUFFER_POOL_SIZE=$DEFAULT_MYSQL_INNODB_BUFFER_POOL_SIZE MYSQL_INNODB_LOG_FILE_SIZE=$DEFAULT_MYSQL_INNODB_LOG_FILE_SIZE MYSQL_INNODB_REDO_LOG_CAPACITY=${MYSQL_INNODB_REDO_LOG_CAPACITY:-$DEFAULT_MYSQL_INNODB_REDO_LOG_CAPACITY} MYSQL_RUNTIME_TMPFS_SIZE=${MYSQL_RUNTIME_TMPFS_SIZE:-$DEFAULT_MYSQL_RUNTIME_TMPFS_SIZE} MYSQL_HOST=$DEFAULT_MYSQL_HOST DB_WAIT_RETRIES=$DB_WAIT_RETRIES DB_WAIT_SLEEP=$DB_WAIT_SLEEP DB_AUTH_NAME=$DEFAULT_DB_AUTH_NAME DB_WORLD_NAME=$DEFAULT_DB_WORLD_NAME DB_CHARACTERS_NAME=$DEFAULT_DB_CHARACTERS_NAME DB_PLAYERBOTS_NAME=${DB_PLAYERBOTS_NAME:-$DEFAULT_DB_PLAYERBOTS_NAME} AC_DB_IMPORT_IMAGE=$AC_DB_IMPORT_IMAGE_VALUE # Database Import Settings DB_RECONNECT_SECONDS=$DB_RECONNECT_SECONDS DB_RECONNECT_ATTEMPTS=$DB_RECONNECT_ATTEMPTS DB_UPDATES_ALLOWED_MODULES=$DB_UPDATES_ALLOWED_MODULES DB_UPDATES_REDUNDANCY=$DB_UPDATES_REDUNDANCY DB_LOGIN_WORKER_THREADS=$DB_LOGIN_WORKER_THREADS DB_WORLD_WORKER_THREADS=$DB_WORLD_WORKER_THREADS DB_CHARACTER_WORKER_THREADS=$DB_CHARACTER_WORKER_THREADS DB_LOGIN_SYNCH_THREADS=$DB_LOGIN_SYNCH_THREADS DB_WORLD_SYNCH_THREADS=$DB_WORLD_SYNCH_THREADS DB_CHARACTER_SYNCH_THREADS=$DB_CHARACTER_SYNCH_THREADS # Services (images) AC_AUTHSERVER_IMAGE=$DEFAULT_AC_AUTHSERVER_IMAGE AC_WORLDSERVER_IMAGE=$DEFAULT_AC_WORLDSERVER_IMAGE AC_AUTHSERVER_IMAGE_PLAYERBOTS=${AC_AUTHSERVER_IMAGE_PLAYERBOTS_VALUE} AC_WORLDSERVER_IMAGE_PLAYERBOTS=${AC_WORLDSERVER_IMAGE_PLAYERBOTS_VALUE} AC_AUTHSERVER_IMAGE_MODULES=${AC_AUTHSERVER_IMAGE_MODULES_VALUE} AC_WORLDSERVER_IMAGE_MODULES=${AC_WORLDSERVER_IMAGE_MODULES_VALUE} # Client data images AC_CLIENT_DATA_IMAGE=$DEFAULT_AC_CLIENT_DATA_IMAGE AC_CLIENT_DATA_IMAGE_PLAYERBOTS=$AC_CLIENT_DATA_IMAGE_PLAYERBOTS_VALUE CLIENT_DATA_CACHE_PATH=$DEFAULT_CLIENT_DATA_CACHE_PATH CLIENT_DATA_PATH=$CLIENT_DATA_PATH # Build artifacts DOCKER_IMAGE_TAG=$DEFAULT_DOCKER_IMAGE_TAG AC_AUTHSERVER_IMAGE_BASE=$DEFAULT_AUTHSERVER_IMAGE_BASE AC_WORLDSERVER_IMAGE_BASE=$DEFAULT_WORLDSERVER_IMAGE_BASE AC_DB_IMPORT_IMAGE_BASE=$DEFAULT_DB_IMPORT_IMAGE_BASE AC_CLIENT_DATA_IMAGE_BASE=$DEFAULT_CLIENT_DATA_IMAGE_BASE # Container user CONTAINER_USER=$CONTAINER_USER # Containers CONTAINER_MYSQL=$DEFAULT_CONTAINER_MYSQL CONTAINER_DB_IMPORT=$DEFAULT_CONTAINER_DB_IMPORT CONTAINER_DB_INIT=$DEFAULT_CONTAINER_DB_INIT CONTAINER_DB_GUARD=$(get_template_value "CONTAINER_DB_GUARD") CONTAINER_BACKUP=$DEFAULT_CONTAINER_BACKUP CONTAINER_MODULES=$DEFAULT_CONTAINER_MODULES CONTAINER_POST_INSTALL=$DEFAULT_CONTAINER_POST_INSTALL # Database Guard Defaults DB_GUARD_RECHECK_SECONDS=$(get_template_value "DB_GUARD_RECHECK_SECONDS") DB_GUARD_RETRY_SECONDS=$(get_template_value "DB_GUARD_RETRY_SECONDS") DB_GUARD_WAIT_ATTEMPTS=$(get_template_value "DB_GUARD_WAIT_ATTEMPTS") DB_GUARD_HEALTH_MAX_AGE=$(get_template_value "DB_GUARD_HEALTH_MAX_AGE") DB_GUARD_HEALTHCHECK_INTERVAL=$(get_template_value "DB_GUARD_HEALTHCHECK_INTERVAL") DB_GUARD_HEALTHCHECK_TIMEOUT=$(get_template_value "DB_GUARD_HEALTHCHECK_TIMEOUT") DB_GUARD_HEALTHCHECK_RETRIES=$(get_template_value "DB_GUARD_HEALTHCHECK_RETRIES") DB_GUARD_VERIFY_INTERVAL_SECONDS=$(get_template_value "DB_GUARD_VERIFY_INTERVAL_SECONDS") # Module SQL staging STAGE_PATH_MODULE_SQL=$(get_template_value "STAGE_PATH_MODULE_SQL") # Modules rebuild source path MODULES_REBUILD_SOURCE_PATH=$MODULES_REBUILD_SOURCE_PATH # SQL Source Overlay SOURCE_DIR=$(get_template_value "SOURCE_DIR") AC_SQL_SOURCE_PATH=$(get_template_value "AC_SQL_SOURCE_PATH") # Ports AUTH_EXTERNAL_PORT=$AUTH_EXTERNAL_PORT AUTH_PORT=$DEFAULT_AUTH_INTERNAL_PORT WORLD_EXTERNAL_PORT=$REALM_PORT WORLD_PORT=$DEFAULT_WORLD_INTERNAL_PORT SOAP_EXTERNAL_PORT=$SOAP_EXTERNAL_PORT SOAP_PORT=$DEFAULT_SOAP_INTERNAL_PORT # Realm SERVER_ADDRESS=$SERVER_ADDRESS REALM_PORT=$REALM_PORT # Backups BACKUP_RETENTION_DAYS=$BACKUP_RETENTION_DAYS BACKUP_RETENTION_HOURS=$BACKUP_RETENTION_HOURS BACKUP_DAILY_TIME=$BACKUP_DAILY_TIME BACKUP_INTERVAL_MINUTES=$(get_template_value "BACKUP_INTERVAL_MINUTES") BACKUP_EXTRA_DATABASES=$(get_template_value "BACKUP_EXTRA_DATABASES") BACKUP_HEALTHCHECK_MAX_MINUTES=$BACKUP_HEALTHCHECK_MAX_MINUTES BACKUP_HEALTHCHECK_GRACE_SECONDS=$BACKUP_HEALTHCHECK_GRACE_SECONDS EOF echo echo "# Modules" for module_key in "${MODULE_KEYS[@]}"; do local module_value="${!module_key:-0}" # Only write enabled modules (value=1) to .env if [ "$module_value" = "1" ]; then printf "%s=%s\n" "$module_key" "$module_value" fi done cat < "$ENV_OUT" local staging_modules_dir="${LOCAL_STORAGE_ROOT_ABS}/modules" mkdir -p "$staging_modules_dir" local module_state_string="" for module_state_var in "${MODULE_KEYS[@]}"; do local module_value="${!module_state_var:-0}" module_state_string+="${module_state_var}=${module_value}|" done printf '%s' "$module_state_string" > "${staging_modules_dir}/.modules_state" if [ "$NEEDS_CXX_REBUILD" != "1" ]; then rm -f "${staging_modules_dir}/.requires_rebuild" 2>/dev/null || true fi say SUCCESS ".env written to $ENV_OUT" }