diff --git a/Dockerfile b/Dockerfile index 58cab5af5a..5395c31911 100644 --- a/Dockerfile +++ b/Dockerfile @@ -40,7 +40,7 @@ ENTRYPOINT ["dotnet", "ACE.Server.dll"] # ports and volumes EXPOSE 9000-9001/udp -VOLUME /ace/Config /ace/Content /ace/Dats /ace/Logs +VOLUME /ace/Config /ace/Content /ace/Dats /ace/Logs /ace/Mods # health check HEALTHCHECK --start-period=5m --interval=1m --timeout=3s \ diff --git a/Dockerfile.arm64 b/Dockerfile.arm64 index 54e29189fb..df93729b44 100644 --- a/Dockerfile.arm64 +++ b/Dockerfile.arm64 @@ -40,7 +40,7 @@ ENTRYPOINT ["dotnet", "./ACE.Server.dll"] # ports and volumes EXPOSE 9000-9001/udp -VOLUME /ace/Config /ace/Content /ace/Dats /ace/Logs +VOLUME /ace/Config /ace/Content /ace/Dats /ace/Logs /ace/Mods # health check HEALTHCHECK --start-period=5m --interval=1m --timeout=3s \ diff --git a/Source/ACE.Server/Program_Setup.cs b/Source/ACE.Server/Program_Setup.cs index 4735d8f699..3105c77e02 100644 --- a/Source/ACE.Server/Program_Setup.cs +++ b/Source/ACE.Server/Program_Setup.cs @@ -48,9 +48,17 @@ private static void DoOutOfBoxSetup(string configFile) Console.WriteLine(); Console.WriteLine(); + var variable = string.Empty; + var nonInteractiveSetup = Convert.ToBoolean(Environment.GetEnvironmentVariable("ACE_NONINTERACTIVE_SETUP")); + Console.Write($"Enter the name for your World (default: \"{config.Server.WorldName}\"): "); - var variable = Console.ReadLine(); - if (IsRunningInContainer) variable = Environment.GetEnvironmentVariable("ACE_WORLD_NAME"); + if (!nonInteractiveSetup) + variable = Console.ReadLine(); + else + { + variable = Environment.GetEnvironmentVariable("ACE_WORLD_NAME"); + Console.WriteLine($"{variable}"); + } if (!string.IsNullOrWhiteSpace(variable)) config.Server.WorldName = variable.Trim(); Console.WriteLine(); @@ -61,13 +69,25 @@ private static void DoOutOfBoxSetup(string configFile) Console.WriteLine(); Console.WriteLine(); Console.Write($"Enter the Host address for your World (default: \"{config.Server.Network.Host}\"): "); - variable = Console.ReadLine(); + if (!nonInteractiveSetup) + variable = Console.ReadLine(); + else + { + variable = "0.0.0.0"; + Console.WriteLine($"{variable}"); + } if (!string.IsNullOrWhiteSpace(variable)) config.Server.Network.Host = variable.Trim(); Console.WriteLine(); Console.Write($"Enter the Port for your World (default: \"{config.Server.Network.Port}\"): "); - variable = Console.ReadLine(); + if (!nonInteractiveSetup) + variable = Console.ReadLine(); + else + { + variable = "9000"; + Console.WriteLine($"{variable}"); + } if (!string.IsNullOrWhiteSpace(variable)) config.Server.Network.Port = Convert.ToUInt32(variable.Trim()); Console.WriteLine(); @@ -76,8 +96,13 @@ private static void DoOutOfBoxSetup(string configFile) Console.WriteLine(); Console.Write($"Enter the directory location for your DAT files (default: \"{config.Server.DatFilesDirectory}\"): "); - variable = Console.ReadLine(); - if (IsRunningInContainer) variable = Environment.GetEnvironmentVariable("ACE_DAT_FILES_DIRECTORY"); + if (!nonInteractiveSetup) + variable = Console.ReadLine(); + else + { + variable = Environment.GetEnvironmentVariable("ACE_DAT_FILES_DIRECTORY"); + Console.WriteLine($"{variable}"); + } if (!string.IsNullOrWhiteSpace(variable)) { var path = Path.GetFullPath(variable.Trim()); @@ -99,22 +124,37 @@ private static void DoOutOfBoxSetup(string configFile) Console.WriteLine(); Console.Write($"Enter the database name for your authentication database (default: \"{config.MySql.Authentication.Database}\"): "); - variable = Console.ReadLine(); - if (IsRunningInContainer) variable = Environment.GetEnvironmentVariable("ACE_SQL_AUTH_DATABASE_NAME"); + if (!nonInteractiveSetup) + variable = Console.ReadLine(); + else + { + variable = Environment.GetEnvironmentVariable("ACE_SQL_AUTH_DATABASE_NAME"); + Console.WriteLine($"{variable}"); + } if (!string.IsNullOrWhiteSpace(variable)) config.MySql.Authentication.Database = variable.Trim(); Console.WriteLine(); Console.Write($"Enter the database name for your shard database (default: \"{config.MySql.Shard.Database}\"): "); - variable = Console.ReadLine(); - if (IsRunningInContainer) variable = Environment.GetEnvironmentVariable("ACE_SQL_SHARD_DATABASE_NAME"); + if (!nonInteractiveSetup) + variable = Console.ReadLine(); + else + { + variable = Environment.GetEnvironmentVariable("ACE_SQL_SHARD_DATABASE_NAME"); + Console.WriteLine($"{variable}"); + } if (!string.IsNullOrWhiteSpace(variable)) config.MySql.Shard.Database = variable.Trim(); Console.WriteLine(); Console.Write($"Enter the database name for your world database (default: \"{config.MySql.World.Database}\"): "); - variable = Console.ReadLine(); - if (IsRunningInContainer) variable = Environment.GetEnvironmentVariable("ACE_SQL_WORLD_DATABASE_NAME"); + if (!nonInteractiveSetup) + variable = Console.ReadLine(); + else + { + variable = Environment.GetEnvironmentVariable("ACE_SQL_WORLD_DATABASE_NAME"); + Console.WriteLine($"{variable}"); + } if (!string.IsNullOrWhiteSpace(variable)) config.MySql.World.Database = variable.Trim(); Console.WriteLine(); @@ -122,8 +162,13 @@ private static void DoOutOfBoxSetup(string configFile) Console.WriteLine(); Console.WriteLine(); Console.Write("Typically, all three databases will be on the same SQL server, is this how you want to proceed? (Y/n) "); - variable = Console.ReadLine(); - if (IsRunningInContainer) variable = "n"; + if (!nonInteractiveSetup) + variable = Console.ReadLine(); + else + { + variable = "n"; + Console.WriteLine($"{variable}"); + } if (!variable.Equals("n", StringComparison.OrdinalIgnoreCase) && !variable.Equals("no", StringComparison.OrdinalIgnoreCase)) { Console.Write($"Enter the Host address for your SQL server (default: \"{config.MySql.World.Host}\"): "); @@ -149,43 +194,73 @@ private static void DoOutOfBoxSetup(string configFile) else { Console.Write($"Enter the Host address for your authentication database (default: \"{config.MySql.Authentication.Host}\"): "); - variable = Console.ReadLine(); - if (IsRunningInContainer) variable = Environment.GetEnvironmentVariable("ACE_SQL_AUTH_DATABASE_HOST"); + if (!nonInteractiveSetup) + variable = Console.ReadLine(); + else + { + variable = Environment.GetEnvironmentVariable("ACE_SQL_AUTH_DATABASE_HOST"); + Console.WriteLine($"{variable}"); + } if (!string.IsNullOrWhiteSpace(variable)) config.MySql.Authentication.Host = variable.Trim(); Console.WriteLine(); Console.Write($"Enter the Port for your authentication database (default: \"{config.MySql.Authentication.Port}\"): "); - variable = Console.ReadLine(); - if (IsRunningInContainer) variable = Environment.GetEnvironmentVariable("ACE_SQL_AUTH_DATABASE_PORT"); + if (!nonInteractiveSetup) + variable = Console.ReadLine(); + else + { + variable = Environment.GetEnvironmentVariable("ACE_SQL_AUTH_DATABASE_PORT"); + Console.WriteLine($"{variable}"); + } if (!string.IsNullOrWhiteSpace(variable)) config.MySql.Authentication.Port = Convert.ToUInt32(variable.Trim()); Console.WriteLine(); Console.Write($"Enter the Host address for your shard database (default: \"{config.MySql.Shard.Host}\"): "); - variable = Console.ReadLine(); - if (IsRunningInContainer) variable = Environment.GetEnvironmentVariable("ACE_SQL_SHARD_DATABASE_HOST"); + if (!IsRunningInContainer) + variable = Console.ReadLine(); + else + { + variable = Environment.GetEnvironmentVariable("ACE_SQL_SHARD_DATABASE_HOST"); + Console.WriteLine($"{variable}"); + } if (!string.IsNullOrWhiteSpace(variable)) config.MySql.Shard.Host = variable.Trim(); Console.WriteLine(); Console.Write($"Enter the Port for your shard database (default: \"{config.MySql.Shard.Port}\"): "); - variable = Console.ReadLine(); - if (IsRunningInContainer) variable = Environment.GetEnvironmentVariable("ACE_SQL_SHARD_DATABASE_PORT"); + if (!nonInteractiveSetup) + variable = Console.ReadLine(); + else + { + variable = Environment.GetEnvironmentVariable("ACE_SQL_SHARD_DATABASE_PORT"); + Console.WriteLine($"{variable}"); + } if (!string.IsNullOrWhiteSpace(variable)) config.MySql.Shard.Port = Convert.ToUInt32(variable.Trim()); Console.WriteLine(); Console.Write($"Enter the Host address for your world database (default: \"{config.MySql.World.Host}\"): "); - variable = Console.ReadLine(); - if (IsRunningInContainer) variable = Environment.GetEnvironmentVariable("ACE_SQL_WORLD_DATABASE_HOST"); + if (!nonInteractiveSetup) + variable = Console.ReadLine(); + else + { + variable = Environment.GetEnvironmentVariable("ACE_SQL_WORLD_DATABASE_HOST"); + Console.WriteLine($"{variable}"); + } if (!string.IsNullOrWhiteSpace(variable)) config.MySql.World.Host = variable.Trim(); Console.WriteLine(); Console.Write($"Enter the Port for your world database (default: \"{config.MySql.World.Port}\"): "); - variable = Console.ReadLine(); - if (IsRunningInContainer) variable = Environment.GetEnvironmentVariable("ACE_SQL_WORLD_DATABASE_PORT"); + if (!nonInteractiveSetup) + variable = Console.ReadLine(); + else + { + variable = Environment.GetEnvironmentVariable("ACE_SQL_WORLD_DATABASE_PORT"); + Console.WriteLine($"{variable}"); + } if (!string.IsNullOrWhiteSpace(variable)) config.MySql.World.Port = Convert.ToUInt32(variable.Trim()); Console.WriteLine(); @@ -194,13 +269,23 @@ private static void DoOutOfBoxSetup(string configFile) Console.WriteLine(); Console.WriteLine(); Console.Write("Typically, all three databases will be on the using the same SQL server credentials, is this how you want to proceed? (Y/n) "); - variable = Console.ReadLine(); - if (IsRunningInContainer) variable = "y"; + if (!nonInteractiveSetup) + variable = Console.ReadLine(); + else + { + variable = "y"; + Console.WriteLine($"{variable}"); + } if (!variable.Equals("n", StringComparison.OrdinalIgnoreCase) && !variable.Equals("no", StringComparison.OrdinalIgnoreCase)) { Console.Write($"Enter the username for your SQL server (default: \"{config.MySql.World.Username}\"): "); - variable = Console.ReadLine(); - if (IsRunningInContainer) variable = Environment.GetEnvironmentVariable("MYSQL_USER"); + if (!nonInteractiveSetup) + variable = Console.ReadLine(); + else + { + variable = Environment.GetEnvironmentVariable("MYSQL_USER"); + Console.WriteLine($"{variable}"); + } if (!string.IsNullOrWhiteSpace(variable)) { config.MySql.Authentication.Username = variable.Trim(); @@ -210,8 +295,13 @@ private static void DoOutOfBoxSetup(string configFile) Console.WriteLine(); Console.Write($"Enter the password for your SQL server (default: \"{config.MySql.World.Password}\"): "); - variable = Console.ReadLine(); - if (IsRunningInContainer) variable = Environment.GetEnvironmentVariable("MYSQL_PASSWORD"); + if (!nonInteractiveSetup) + variable = Console.ReadLine(); + else + { + variable = Environment.GetEnvironmentVariable("MYSQL_PASSWORD"); + Console.WriteLine($"{variable}"); + } if (!string.IsNullOrWhiteSpace(variable)) { config.MySql.Authentication.Password = variable.Trim(); @@ -268,10 +358,15 @@ private static void DoOutOfBoxSetup(string configFile) Console.WriteLine(); Console.WriteLine(); Console.Write("Do you want to ACEmulator to attempt to initialize your SQL databases? This will erase any existing ACEmulator specific databases that may already exist on the server (Y/n): "); - variable = Console.ReadLine(); + if (!nonInteractiveSetup) + variable = Console.ReadLine(); var sqlConnectInfo = $"server={config.MySql.World.Host};port={config.MySql.World.Port};user={config.MySql.World.Username};password={config.MySql.World.Password};{config.MySql.World.ConnectionOptions}"; var sqlConnect = new MySqlConnector.MySqlConnection(sqlConnectInfo); - if (IsRunningInContainer) variable = Convert.ToBoolean(Environment.GetEnvironmentVariable("ACE_SQL_INITIALIZE_DATABASES")) ? "y" : "n"; + if (nonInteractiveSetup) + { + variable = Convert.ToBoolean(Environment.GetEnvironmentVariable("ACE_SQL_INITIALIZE_DATABASES")) ? "y" : "n"; + Console.WriteLine($"{variable}"); + } if (!variable.Equals("n", StringComparison.OrdinalIgnoreCase) && !variable.Equals("no", StringComparison.OrdinalIgnoreCase)) { Console.WriteLine(); @@ -299,8 +394,9 @@ private static void DoOutOfBoxSetup(string configFile) if (IsRunningInContainer) { + // if using our supplied docker compose file which includes mysql server, mysql is initialized with a test database called ace%, we will delete this database if it exists Console.Write("Clearing out temporary ace% database .... "); - var sqlDBFile = "DROP DATABASE `ace%`;"; + var sqlDBFile = "DROP DATABASE IF EXISTS `ace%`;"; var script = new MySqlConnector.MySqlCommand(sqlDBFile, sqlConnect); Console.Write($"Importing into SQL server at {config.MySql.World.Host}:{config.MySql.World.Port} .... "); @@ -365,8 +461,13 @@ private static void DoOutOfBoxSetup(string configFile) Console.WriteLine(); Console.WriteLine(); Console.Write("Do you want to download the latest world database and import it? (Y/n): "); - variable = Console.ReadLine(); - if (IsRunningInContainer) variable = Convert.ToBoolean(Environment.GetEnvironmentVariable("ACE_SQL_DOWNLOAD_LATEST_WORLD_RELEASE")) ? "y" : "n"; + if (!nonInteractiveSetup) + variable = Console.ReadLine(); + else + { + variable = Convert.ToBoolean(Environment.GetEnvironmentVariable("ACE_SQL_DOWNLOAD_LATEST_WORLD_RELEASE")) ? "y" : "n"; + Console.WriteLine($"{variable}"); + } if (!variable.Equals("n", StringComparison.OrdinalIgnoreCase) && !variable.Equals("no", StringComparison.OrdinalIgnoreCase)) { Console.WriteLine(); diff --git a/docker-compose.arm64 b/docker-compose.arm64 index 72789a36aa..380a74903a 100644 --- a/docker-compose.arm64 +++ b/docker-compose.arm64 @@ -31,7 +31,9 @@ services: - ./Content:/ace/Content - ./Dats:/ace/Dats - ./Logs:/ace/Logs + - ./Mods:/ace/Mods ports: - "9000-9001:9000-9001/udp" + stdin_open: true #restart: unless-stopped restart: on-failure diff --git a/docker-compose.yml b/docker-compose.yml index 671812ffdf..d49637b029 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -27,8 +27,9 @@ services: - ./Content:/ace/Content - ./Dats:/ace/Dats - ./Logs:/ace/Logs + - ./Mods:/ace/Mods ports: - "9000-9001:9000-9001/udp" + stdin_open: true #restart: unless-stopped restart: on-failure - diff --git a/docker.env b/docker.env index 71a3459216..c0275c34b2 100644 --- a/docker.env +++ b/docker.env @@ -31,4 +31,5 @@ ACE_SQL_WORLD_DATABASE_PORT=3306 ACE_SQL_INITIALIZE_DATABASES=true ACE_SQL_DOWNLOAD_LATEST_WORLD_RELEASE=true -ACE_NONINTERACTIVE_CONSOLE=true +#ACE_NONINTERACTIVE_CONSOLE=true +ACE_NONINTERACTIVE_SETUP=true