🗑️ Remove gateway got replaced by turbine one
This commit is contained in:
@@ -1,12 +0,0 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
|
|
||||||
[ApiController]
|
|
||||||
[Route("config")]
|
|
||||||
public class ConfigurationController(IConfiguration configuration) : ControllerBase
|
|
||||||
{
|
|
||||||
[HttpGet]
|
|
||||||
public IActionResult Get() => Ok(configuration.GetSection("Client").Get<Dictionary<string, object>>());
|
|
||||||
|
|
||||||
[HttpGet("site")]
|
|
||||||
public IActionResult GetSiteUrl() => Ok(configuration["SiteUrl"]);
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base
|
|
||||||
USER $APP_UID
|
|
||||||
WORKDIR /app
|
|
||||||
EXPOSE 8080
|
|
||||||
EXPOSE 8081
|
|
||||||
|
|
||||||
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
|
|
||||||
ARG BUILD_CONFIGURATION=Release
|
|
||||||
WORKDIR /src
|
|
||||||
COPY ["DysonNetwork.Gateway/DysonNetwork.Gateway.csproj", "DysonNetwork.Gateway/"]
|
|
||||||
RUN dotnet restore "DysonNetwork.Gateway/DysonNetwork.Gateway.csproj"
|
|
||||||
COPY . .
|
|
||||||
WORKDIR "/src/DysonNetwork.Gateway"
|
|
||||||
RUN dotnet build "./DysonNetwork.Gateway.csproj" -c $BUILD_CONFIGURATION -o /app/build
|
|
||||||
|
|
||||||
FROM build AS publish
|
|
||||||
ARG BUILD_CONFIGURATION=Release
|
|
||||||
RUN dotnet publish "./DysonNetwork.Gateway.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
|
|
||||||
|
|
||||||
FROM base AS final
|
|
||||||
WORKDIR /app
|
|
||||||
COPY --from=publish /app/publish .
|
|
||||||
ENTRYPOINT ["dotnet", "DysonNetwork.Gateway.dll"]
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>net10.0</TargetFramework>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.Extensions.ServiceDiscovery.Yarp" Version="10.0.0" />
|
|
||||||
<PackageReference Include="Nerdbank.GitVersioning" Version="3.9.50">
|
|
||||||
<PrivateAssets>all</PrivateAssets>
|
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
||||||
</PackageReference>
|
|
||||||
<PackageReference Include="Yarp.ReverseProxy" Version="2.3.0" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\DysonNetwork.Shared\DysonNetwork.Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -1,168 +0,0 @@
|
|||||||
using System.Threading.RateLimiting;
|
|
||||||
using DysonNetwork.Shared.Http;
|
|
||||||
using Yarp.ReverseProxy.Configuration;
|
|
||||||
using Microsoft.AspNetCore.HttpOverrides;
|
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
|
||||||
|
|
||||||
builder.AddServiceDefaults("gateway");
|
|
||||||
|
|
||||||
builder.ConfigureAppKestrel(builder.Configuration, maxRequestBodySize: long.MaxValue, enableGrpc: false);
|
|
||||||
|
|
||||||
builder.Services.AddCors(options =>
|
|
||||||
{
|
|
||||||
options.AddDefaultPolicy(
|
|
||||||
policy =>
|
|
||||||
{
|
|
||||||
policy.SetIsOriginAllowed(origin => true)
|
|
||||||
.AllowAnyMethod()
|
|
||||||
.AllowAnyHeader()
|
|
||||||
.AllowCredentials()
|
|
||||||
.WithExposedHeaders("X-Total");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
builder.Services.AddRateLimiter(options =>
|
|
||||||
{
|
|
||||||
options.AddPolicy("fixed", context =>
|
|
||||||
{
|
|
||||||
var ip = context.Connection.RemoteIpAddress?.ToString() ?? "unknown";
|
|
||||||
|
|
||||||
return RateLimitPartition.GetFixedWindowLimiter(
|
|
||||||
partitionKey: ip,
|
|
||||||
factory: _ => new FixedWindowRateLimiterOptions
|
|
||||||
{
|
|
||||||
PermitLimit = 120, // 120 requests...
|
|
||||||
Window = TimeSpan.FromMinutes(1), // ...per minute per IP
|
|
||||||
QueueProcessingOrder = QueueProcessingOrder.OldestFirst,
|
|
||||||
QueueLimit = 10 // allow short bursts instead of instant 503s
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
options.OnRejected = async (context, token) =>
|
|
||||||
{
|
|
||||||
// Log the rejected IP
|
|
||||||
var logger = context.HttpContext.RequestServices
|
|
||||||
.GetRequiredService<ILoggerFactory>()
|
|
||||||
.CreateLogger("RateLimiter");
|
|
||||||
|
|
||||||
var ip = context.HttpContext.Connection.RemoteIpAddress?.ToString() ?? "unknown";
|
|
||||||
logger.LogWarning("Rate limit exceeded for IP: {IP}", ip);
|
|
||||||
|
|
||||||
// Respond to the client
|
|
||||||
context.HttpContext.Response.StatusCode = StatusCodes.Status429TooManyRequests;
|
|
||||||
await context.HttpContext.Response.WriteAsync(
|
|
||||||
"Rate limit exceeded. Try again later.", token);
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
var serviceNames = new[] { "ring", "pass", "drive", "sphere", "develop", "insight", "zone" };
|
|
||||||
|
|
||||||
var specialRoutes = new[]
|
|
||||||
{
|
|
||||||
new RouteConfig
|
|
||||||
{
|
|
||||||
RouteId = "ring-ws",
|
|
||||||
ClusterId = "ring",
|
|
||||||
Match = new RouteMatch { Path = "/ws" }
|
|
||||||
},
|
|
||||||
new RouteConfig
|
|
||||||
{
|
|
||||||
RouteId = "pass-openid",
|
|
||||||
ClusterId = "pass",
|
|
||||||
Match = new RouteMatch { Path = "/.well-known/openid-configuration" }
|
|
||||||
},
|
|
||||||
new RouteConfig
|
|
||||||
{
|
|
||||||
RouteId = "pass-jwks",
|
|
||||||
ClusterId = "pass",
|
|
||||||
Match = new RouteMatch { Path = "/.well-known/jwks" }
|
|
||||||
},
|
|
||||||
new RouteConfig
|
|
||||||
{
|
|
||||||
RouteId = "drive-tus",
|
|
||||||
ClusterId = "drive",
|
|
||||||
Match = new RouteMatch { Path = "/api/tus" }
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
var apiRoutes = serviceNames.Select(serviceName =>
|
|
||||||
{
|
|
||||||
var apiPath = serviceName switch
|
|
||||||
{
|
|
||||||
_ => $"/{serviceName}"
|
|
||||||
};
|
|
||||||
return new RouteConfig
|
|
||||||
{
|
|
||||||
RouteId = $"{serviceName}-api",
|
|
||||||
ClusterId = serviceName,
|
|
||||||
Match = new RouteMatch { Path = $"{apiPath}/{{**catch-all}}" },
|
|
||||||
Transforms =
|
|
||||||
[
|
|
||||||
new Dictionary<string, string> { { "PathRemovePrefix", apiPath } },
|
|
||||||
new Dictionary<string, string> { { "PathPrefix", "/api" } }
|
|
||||||
]
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
var swaggerRoutes = serviceNames.Select(serviceName => new RouteConfig
|
|
||||||
{
|
|
||||||
RouteId = $"{serviceName}-swagger",
|
|
||||||
ClusterId = serviceName,
|
|
||||||
Match = new RouteMatch { Path = $"/swagger/{serviceName}/{{**catch-all}}" },
|
|
||||||
Transforms =
|
|
||||||
[
|
|
||||||
new Dictionary<string, string> { { "PathRemovePrefix", $"/swagger/{serviceName}" } },
|
|
||||||
new Dictionary<string, string> { { "PathPrefix", "/swagger" } }
|
|
||||||
]
|
|
||||||
});
|
|
||||||
|
|
||||||
var routes = specialRoutes.Concat(apiRoutes).Concat(swaggerRoutes).ToArray();
|
|
||||||
|
|
||||||
var clusters = serviceNames.Select(serviceName => new ClusterConfig
|
|
||||||
{
|
|
||||||
ClusterId = serviceName,
|
|
||||||
HealthCheck = new HealthCheckConfig
|
|
||||||
{
|
|
||||||
Active = new ActiveHealthCheckConfig
|
|
||||||
{
|
|
||||||
Enabled = true,
|
|
||||||
Interval = TimeSpan.FromSeconds(10),
|
|
||||||
Timeout = TimeSpan.FromSeconds(5),
|
|
||||||
Path = "/health"
|
|
||||||
},
|
|
||||||
Passive = new()
|
|
||||||
{
|
|
||||||
Enabled = true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
Destinations = new Dictionary<string, DestinationConfig>
|
|
||||||
{
|
|
||||||
{ "destination1", new DestinationConfig { Address = $"http://{serviceName}" } }
|
|
||||||
}
|
|
||||||
}).ToArray();
|
|
||||||
|
|
||||||
builder.Services
|
|
||||||
.AddReverseProxy()
|
|
||||||
.LoadFromMemory(routes, clusters)
|
|
||||||
.AddServiceDiscoveryDestinationResolver();
|
|
||||||
|
|
||||||
builder.Services.AddControllers();
|
|
||||||
|
|
||||||
var app = builder.Build();
|
|
||||||
|
|
||||||
var forwardedHeadersOptions = new ForwardedHeadersOptions
|
|
||||||
{
|
|
||||||
ForwardedHeaders = ForwardedHeaders.All
|
|
||||||
};
|
|
||||||
forwardedHeadersOptions.KnownNetworks.Clear();
|
|
||||||
forwardedHeadersOptions.KnownProxies.Clear();
|
|
||||||
app.UseForwardedHeaders(forwardedHeadersOptions);
|
|
||||||
|
|
||||||
app.UseCors();
|
|
||||||
|
|
||||||
app.MapReverseProxy().RequireRateLimiting("fixed");
|
|
||||||
|
|
||||||
app.MapControllers();
|
|
||||||
|
|
||||||
app.Run();
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
{
|
|
||||||
"$schema": "https://json.schemastore.org/launchsettings.json",
|
|
||||||
"profiles": {
|
|
||||||
"http": {
|
|
||||||
"commandName": "Project",
|
|
||||||
"dotnetRunMessages": true,
|
|
||||||
"launchBrowser": true,
|
|
||||||
"environmentVariables": {
|
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"https": {
|
|
||||||
"commandName": "Project",
|
|
||||||
"dotnetRunMessages": true,
|
|
||||||
"launchBrowser": true,
|
|
||||||
"environmentVariables": {
|
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
using DysonNetwork.Shared.Data;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
|
|
||||||
namespace DysonNetwork.Gateway;
|
|
||||||
|
|
||||||
[ApiController]
|
|
||||||
[Route("/version")]
|
|
||||||
public class VersionController : ControllerBase
|
|
||||||
{
|
|
||||||
[HttpGet]
|
|
||||||
public IActionResult Get()
|
|
||||||
{
|
|
||||||
return Ok(new AppVersion
|
|
||||||
{
|
|
||||||
Version = ThisAssembly.AssemblyVersion,
|
|
||||||
Commit = ThisAssembly.GitCommitId,
|
|
||||||
UpdateDate = ThisAssembly.GitCommitDate
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
"Logging": {
|
|
||||||
"LogLevel": {
|
|
||||||
"Default": "Information",
|
|
||||||
"Microsoft.AspNetCore": "Warning"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Cache": {
|
|
||||||
"Serializer": "MessagePack"
|
|
||||||
},
|
|
||||||
"AllowedHosts": "*",
|
|
||||||
"SiteUrl": "http://localhost:3000",
|
|
||||||
"Client": {
|
|
||||||
"SomeSetting": "SomeValue"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"version": "1.0",
|
|
||||||
"publicReleaseRefSpec": ["^refs/heads/main$"],
|
|
||||||
"cloudBuild": {
|
|
||||||
"setVersionVariables": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -17,8 +17,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DysonNetwork.Drive", "Dyson
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DysonNetwork.Develop", "DysonNetwork.Develop\DysonNetwork.Develop.csproj", "{C577AA78-B11D-4076-89A6-1C7F0ECC04E2}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DysonNetwork.Develop", "DysonNetwork.Develop\DysonNetwork.Develop.csproj", "{C577AA78-B11D-4076-89A6-1C7F0ECC04E2}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DysonNetwork.Gateway", "DysonNetwork.Gateway\DysonNetwork.Gateway.csproj", "{AA4D244C-6C3A-4CD0-9DA4-5CAFFBB55085}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DysonNetwork.Insight", "DysonNetwork.Insight\DysonNetwork.Insight.csproj", "{E603CDF2-8BA0-49AE-A1F9-BD2DA5CB983D}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DysonNetwork.Insight", "DysonNetwork.Insight\DysonNetwork.Insight.csproj", "{E603CDF2-8BA0-49AE-A1F9-BD2DA5CB983D}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DysonNetwork.Zone", "DysonNetwork.Zone\DysonNetwork.Zone.csproj", "{E255B723-CAC9-4AC8-AA3B-116CC256E63C}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DysonNetwork.Zone", "DysonNetwork.Zone\DysonNetwork.Zone.csproj", "{E255B723-CAC9-4AC8-AA3B-116CC256E63C}"
|
||||||
@@ -105,18 +103,6 @@ Global
|
|||||||
{C577AA78-B11D-4076-89A6-1C7F0ECC04E2}.Release|x64.Build.0 = Release|Any CPU
|
{C577AA78-B11D-4076-89A6-1C7F0ECC04E2}.Release|x64.Build.0 = Release|Any CPU
|
||||||
{C577AA78-B11D-4076-89A6-1C7F0ECC04E2}.Release|x86.ActiveCfg = Release|Any CPU
|
{C577AA78-B11D-4076-89A6-1C7F0ECC04E2}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{C577AA78-B11D-4076-89A6-1C7F0ECC04E2}.Release|x86.Build.0 = Release|Any CPU
|
{C577AA78-B11D-4076-89A6-1C7F0ECC04E2}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{AA4D244C-6C3A-4CD0-9DA4-5CAFFBB55085}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{AA4D244C-6C3A-4CD0-9DA4-5CAFFBB55085}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{AA4D244C-6C3A-4CD0-9DA4-5CAFFBB55085}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{AA4D244C-6C3A-4CD0-9DA4-5CAFFBB55085}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{AA4D244C-6C3A-4CD0-9DA4-5CAFFBB55085}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{AA4D244C-6C3A-4CD0-9DA4-5CAFFBB55085}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{AA4D244C-6C3A-4CD0-9DA4-5CAFFBB55085}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{AA4D244C-6C3A-4CD0-9DA4-5CAFFBB55085}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{AA4D244C-6C3A-4CD0-9DA4-5CAFFBB55085}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{AA4D244C-6C3A-4CD0-9DA4-5CAFFBB55085}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{AA4D244C-6C3A-4CD0-9DA4-5CAFFBB55085}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{AA4D244C-6C3A-4CD0-9DA4-5CAFFBB55085}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{E603CDF2-8BA0-49AE-A1F9-BD2DA5CB983D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{E603CDF2-8BA0-49AE-A1F9-BD2DA5CB983D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{E603CDF2-8BA0-49AE-A1F9-BD2DA5CB983D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{E603CDF2-8BA0-49AE-A1F9-BD2DA5CB983D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{E603CDF2-8BA0-49AE-A1F9-BD2DA5CB983D}.Debug|x64.ActiveCfg = Debug|Any CPU
|
{E603CDF2-8BA0-49AE-A1F9-BD2DA5CB983D}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
|||||||
Reference in New Issue
Block a user