diff --git a/src/Tgstation.Server.Host/Configuration/GeneralConfiguration.cs b/src/Tgstation.Server.Host/Configuration/GeneralConfiguration.cs
index 9b5f34f5f6..e20d5cb3df 100644
--- a/src/Tgstation.Server.Host/Configuration/GeneralConfiguration.cs
+++ b/src/Tgstation.Server.Host/Configuration/GeneralConfiguration.cs
@@ -14,6 +14,11 @@ namespace Tgstation.Server.Host.Configuration
///
public const string Section = "General";
+ ///
+ /// The default value of .
+ ///
+ public const ushort DefaultApiPort = 5000;
+
///
/// The default value for .
///
@@ -39,6 +44,11 @@ namespace Tgstation.Server.Host.Configuration
///
const int DefaultRestartTimeout = 10000;
+ ///
+ /// The port the TGS API listens on.
+ ///
+ public ushort ApiPort { get; set; }
+
///
/// A GitHub personal access token to use for bypassing rate limits on requests. Requires no scopes
///
diff --git a/src/Tgstation.Server.Host/Core/ServerPortProivder.cs b/src/Tgstation.Server.Host/Core/ServerPortProivder.cs
index a71dc72a29..04c009949d 100644
--- a/src/Tgstation.Server.Host/Core/ServerPortProivder.cs
+++ b/src/Tgstation.Server.Host/Core/ServerPortProivder.cs
@@ -1,6 +1,9 @@
using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
using System;
using System.Linq;
+using Tgstation.Server.Host.Configuration;
namespace Tgstation.Server.Host.Core
{
@@ -8,14 +11,25 @@ namespace Tgstation.Server.Host.Core
sealed class ServerPortProivder : IServerPortProvider
{
///
- public ushort HttpApiPort { get; }
+ public ushort HttpApiPort => generalConfiguration.ApiPort;
+
+ ///
+ /// The for the .
+ ///
+ readonly GeneralConfiguration generalConfiguration;
///
/// Initializes a new instance of the .
///
+ /// The containing the value of .
/// The to use.
- public ServerPortProivder(IConfiguration configuration)
+ /// The to use.
+ public ServerPortProivder(
+ IOptions generalConfigurationOptions,
+ IConfiguration configuration,
+ ILogger logger)
{
+ generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
if (configuration == null)
throw new ArgumentNullException(nameof(configuration));
@@ -26,8 +40,13 @@ namespace Tgstation.Server.Host.Core
.GetSection("Url")
.Value;
- if (httpEndpoint == null)
- throw new InvalidOperationException("Missing required configuration option Kestrel:EndPoints:Http:Url!");
+ if (generalConfiguration.ApiPort == default && httpEndpoint == null)
+ throw new InvalidOperationException("Missing required configuration option General:ApiPort!");
+
+ if (generalConfiguration.ApiPort != default)
+ return;
+
+ logger.LogWarning("The \"Kestrel\" configuration section is deprecated! Please set your API port using the \"General:ApiPort\" configuration option!");
var splits = httpEndpoint.Split(":", StringSplitOptions.RemoveEmptyEntries);
var portString = splits.Last();
@@ -36,7 +55,7 @@ namespace Tgstation.Server.Host.Core
if (!UInt16.TryParse(portString, out var result))
throw new InvalidOperationException($"Failed to parse HTTP EndPoint port: {httpEndpoint}");
- HttpApiPort = result;
+ generalConfiguration.ApiPort = result;
}
}
}
diff --git a/src/Tgstation.Server.Host/ServerFactory.cs b/src/Tgstation.Server.Host/ServerFactory.cs
index 32289426bc..6bb31a8948 100644
--- a/src/Tgstation.Server.Host/ServerFactory.cs
+++ b/src/Tgstation.Server.Host/ServerFactory.cs
@@ -1,10 +1,12 @@
using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Server.Kestrel.Core;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Threading;
using System.Threading.Tasks;
+using Tgstation.Server.Host.Core;
using Tgstation.Server.Host.Extensions;
using Tgstation.Server.Host.IO;
using Tgstation.Server.Host.Setup;
@@ -58,8 +60,17 @@ namespace Tgstation.Server.Host
}
var hostBuilder = CreateDefaultBuilder()
- .ConfigureWebHostDefaults(webHostBuilder =>
+ .ConfigureWebHost(webHostBuilder =>
webHostBuilder
+ .UseKestrel(kestrelOptions =>
+ {
+ var serverPortProvider = kestrelOptions.ApplicationServices.GetRequiredService();
+ kestrelOptions.ListenAnyIP(
+ serverPortProvider.HttpApiPort,
+ listenOptions => listenOptions.Protocols = HttpProtocols.Http1AndHttp2);
+ })
+ .UseIIS()
+ .UseIISIntegration()
.UseApplication(postSetupServices)
.SuppressStatusMessages(true)
.UseShutdownTimeout(TimeSpan.FromMinutes(1)));
diff --git a/src/Tgstation.Server.Host/Setup/SetupWizard.cs b/src/Tgstation.Server.Host/Setup/SetupWizard.cs
index 72eb7e3509..9e54ac8f00 100644
--- a/src/Tgstation.Server.Host/Setup/SetupWizard.cs
+++ b/src/Tgstation.Server.Host/Setup/SetupWizard.cs
@@ -141,7 +141,11 @@ namespace Tgstation.Server.Host.Setup
do
{
- await console.WriteAsync("API Port (leave blank for default): ", false, cancellationToken).ConfigureAwait(false);
+ await console.WriteAsync(
+ $"API Port (leave blank for default of {GeneralConfiguration.DefaultApiPort}): ",
+ false,
+ cancellationToken)
+ .ConfigureAwait(false);
var portString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
if (String.IsNullOrWhiteSpace(portString))
return null;
@@ -732,6 +736,7 @@ namespace Tgstation.Server.Host.Setup
{
await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Configuration complete! Saving to {0}", userConfigFileName), true, cancellationToken).ConfigureAwait(false);
+ newGeneralConfiguration.ApiPort = hostingPort ?? GeneralConfiguration.DefaultApiPort;
var map = new Dictionary()
{
{ DatabaseConfiguration.Section, databaseConfiguration },
@@ -740,18 +745,6 @@ namespace Tgstation.Server.Host.Setup
{ ControlPanelConfiguration.Section, controlPanelConfiguration }
};
- if (hostingPort.HasValue)
- map.Add("Kestrel", new
- {
- EndPoints = new
- {
- Http = new
- {
- Url = String.Format(CultureInfo.InvariantCulture, "http://0.0.0.0:{0}", hostingPort)
- }
- }
- });
-
var json = JsonConvert.SerializeObject(map, Formatting.Indented);
var configBytes = Encoding.UTF8.GetBytes(json);
diff --git a/src/Tgstation.Server.Host/appsettings.json b/src/Tgstation.Server.Host/appsettings.json
index 2457e64d56..e7f47e59b1 100644
--- a/src/Tgstation.Server.Host/appsettings.json
+++ b/src/Tgstation.Server.Host/appsettings.json
@@ -1,5 +1,6 @@
{
"General": {
+ "ApiPort": 5000,
"MinimumPasswordLength": 15,
"GitHubAccessToken": null,
"SetupWizardMode": "AutoDetect",
@@ -17,13 +18,6 @@
"LogLevel": "Debug",
"MicrosoftLogLevel": "Warning"
},
- "Kestrel": {
- "EndPoints": {
- "Http": {
- "Url": "http://0.0.0.0:5000"
- }
- }
- },
"Logging": {
"IncludeScopes": false,
"Debug": {