diff --git a/extra/admin-api/Spacebar.Cdn.Worker/Program.cs b/extra/admin-api/Spacebar.Cdn.Worker/Program.cs
index fc3aaf93..c75151b5 100644
--- a/extra/admin-api/Spacebar.Cdn.Worker/Program.cs
+++ b/extra/admin-api/Spacebar.Cdn.Worker/Program.cs
@@ -5,6 +5,7 @@ using ArcaneLibs;
using ImageMagick;
using Spacebar.AdminApi.TestClient.Services.Helpers;
using Spacebar.Cdn.Worker;
+using Spacebar.Interop.Cdn.Abstractions;
var builder = WebApplication.CreateBuilder(args);
@@ -56,6 +57,9 @@ MagickNET.Initialize();
// builder.WebHost.ConfigureKestrel(opts => opts.ListenUnixSocket(Environment.GetEnvironmentVariable("SOCKET_PATH")!));
+builder.Services.AddSingleton<IFileSource>(new FilesystemFileSource(Environment.GetEnvironmentVariable("STORAGE_PATH") ?? throw new InvalidOperationException("STORAGE_PATH not set!")));
+// builder.Services.AddSingleton<DiscordImageResizeService>();
+
builder.Services.AddControllers();
var app = builder.Build();
app.MapControllers();
diff --git a/extra/admin-api/Spacebar.Cdn.Worker/deps.Q16-HDRI.AnyCPU.json b/extra/admin-api/Spacebar.Cdn.Worker/deps.Q16-HDRI.AnyCPU.json
new file mode 100644
index 00000000..e9ba726c
--- /dev/null
+++ b/extra/admin-api/Spacebar.Cdn.Worker/deps.Q16-HDRI.AnyCPU.json
@@ -0,0 +1,17 @@
+[
+ {
+ "pname": "ArcaneLibs",
+ "version": "1.0.1-preview.20260126-091403",
+ "hash": "sha256-CSmNE16nDi05qyDAcJR+8SqQQ2ReAeX0+/dRP3WpNsg="
+ },
+ {
+ "pname": "Magick.NET-Q16-HDRI-AnyCPU",
+ "version": "14.11.1",
+ "hash": "sha256-WH7GgpQtkk9FpEz3xwcERrVYq6Bz5SrtjakjFRgHuII="
+ },
+ {
+ "pname": "Magick.NET.Core",
+ "version": "14.11.1",
+ "hash": "sha256-984jXKS/y2602DgaXsfDh9TFOhpyAF/gHZG8BGQXljA="
+ }
+]
diff --git a/extra/admin-api/Spacebar.Cdn.Worker/deps.Q16-HDRI.aarch64.json b/extra/admin-api/Spacebar.Cdn.Worker/deps.Q16-HDRI.aarch64.json
new file mode 100644
index 00000000..fca9d589
--- /dev/null
+++ b/extra/admin-api/Spacebar.Cdn.Worker/deps.Q16-HDRI.aarch64.json
@@ -0,0 +1,17 @@
+[
+ {
+ "pname": "ArcaneLibs",
+ "version": "1.0.1-preview.20260126-091403",
+ "hash": "sha256-CSmNE16nDi05qyDAcJR+8SqQQ2ReAeX0+/dRP3WpNsg="
+ },
+ {
+ "pname": "Magick.NET-Q16-HDRI-OpenMP-arm64",
+ "version": "14.11.1",
+ "hash": "sha256-kN/hpOiLTOD5jKUaWXz8nCoOTwP4lB9JczdodZZIvyc="
+ },
+ {
+ "pname": "Magick.NET.Core",
+ "version": "14.11.1",
+ "hash": "sha256-984jXKS/y2602DgaXsfDh9TFOhpyAF/gHZG8BGQXljA="
+ }
+]
diff --git a/extra/admin-api/Spacebar.Cdn.Worker/deps.Q16-HDRI.x86_64.json b/extra/admin-api/Spacebar.Cdn.Worker/deps.Q16-HDRI.x86_64.json
new file mode 100644
index 00000000..cb3b08fc
--- /dev/null
+++ b/extra/admin-api/Spacebar.Cdn.Worker/deps.Q16-HDRI.x86_64.json
@@ -0,0 +1,17 @@
+[
+ {
+ "pname": "ArcaneLibs",
+ "version": "1.0.1-preview.20260126-091403",
+ "hash": "sha256-CSmNE16nDi05qyDAcJR+8SqQQ2ReAeX0+/dRP3WpNsg="
+ },
+ {
+ "pname": "Magick.NET-Q16-HDRI-OpenMP-x64",
+ "version": "14.11.1",
+ "hash": "sha256-mf/bRfdiQi96AZKDDBvbSMFA2YSQDMdmhcrF0Vlvs/8="
+ },
+ {
+ "pname": "Magick.NET.Core",
+ "version": "14.11.1",
+ "hash": "sha256-984jXKS/y2602DgaXsfDh9TFOhpyAF/gHZG8BGQXljA="
+ }
+]
diff --git a/extra/admin-api/Spacebar.Cdn.Worker/deps.Q16.AnyCPU.json b/extra/admin-api/Spacebar.Cdn.Worker/deps.Q16.AnyCPU.json
new file mode 100644
index 00000000..17a219a0
--- /dev/null
+++ b/extra/admin-api/Spacebar.Cdn.Worker/deps.Q16.AnyCPU.json
@@ -0,0 +1,17 @@
+[
+ {
+ "pname": "ArcaneLibs",
+ "version": "1.0.1-preview.20260126-091403",
+ "hash": "sha256-CSmNE16nDi05qyDAcJR+8SqQQ2ReAeX0+/dRP3WpNsg="
+ },
+ {
+ "pname": "Magick.NET-Q16-AnyCPU",
+ "version": "14.11.1",
+ "hash": "sha256-GbCGSCB9iB9YA9Xmht0vPAlfJMY/tgGpNajorQv1fl4="
+ },
+ {
+ "pname": "Magick.NET.Core",
+ "version": "14.11.1",
+ "hash": "sha256-984jXKS/y2602DgaXsfDh9TFOhpyAF/gHZG8BGQXljA="
+ }
+]
diff --git a/extra/admin-api/Spacebar.Cdn.Worker/deps.Q16.aarch64.json b/extra/admin-api/Spacebar.Cdn.Worker/deps.Q16.aarch64.json
new file mode 100644
index 00000000..5e07d713
--- /dev/null
+++ b/extra/admin-api/Spacebar.Cdn.Worker/deps.Q16.aarch64.json
@@ -0,0 +1,17 @@
+[
+ {
+ "pname": "ArcaneLibs",
+ "version": "1.0.1-preview.20260126-091403",
+ "hash": "sha256-CSmNE16nDi05qyDAcJR+8SqQQ2ReAeX0+/dRP3WpNsg="
+ },
+ {
+ "pname": "Magick.NET-Q16-OpenMP-arm64",
+ "version": "14.11.1",
+ "hash": "sha256-T6KmNQhLxiLtb+10A6cpXl5G0+mKhtOiqjyF0T94fs0="
+ },
+ {
+ "pname": "Magick.NET.Core",
+ "version": "14.11.1",
+ "hash": "sha256-984jXKS/y2602DgaXsfDh9TFOhpyAF/gHZG8BGQXljA="
+ }
+]
diff --git a/extra/admin-api/Spacebar.Cdn.Worker/deps.Q16.x86_64.json b/extra/admin-api/Spacebar.Cdn.Worker/deps.Q16.x86_64.json
new file mode 100644
index 00000000..f0f7c52f
--- /dev/null
+++ b/extra/admin-api/Spacebar.Cdn.Worker/deps.Q16.x86_64.json
@@ -0,0 +1,17 @@
+[
+ {
+ "pname": "ArcaneLibs",
+ "version": "1.0.1-preview.20260126-091403",
+ "hash": "sha256-CSmNE16nDi05qyDAcJR+8SqQQ2ReAeX0+/dRP3WpNsg="
+ },
+ {
+ "pname": "Magick.NET-Q16-OpenMP-x64",
+ "version": "14.11.1",
+ "hash": "sha256-5VCBrKTGedHkJWJOp8w4B5uiPfT/ZsYlVrC3FYbHHbA="
+ },
+ {
+ "pname": "Magick.NET.Core",
+ "version": "14.11.1",
+ "hash": "sha256-984jXKS/y2602DgaXsfDh9TFOhpyAF/gHZG8BGQXljA="
+ }
+]
diff --git a/extra/admin-api/Spacebar.Cdn.Worker/deps.Q8.AnyCPU.json b/extra/admin-api/Spacebar.Cdn.Worker/deps.Q8.AnyCPU.json
new file mode 100644
index 00000000..84191717
--- /dev/null
+++ b/extra/admin-api/Spacebar.Cdn.Worker/deps.Q8.AnyCPU.json
@@ -0,0 +1,17 @@
+[
+ {
+ "pname": "ArcaneLibs",
+ "version": "1.0.1-preview.20260126-091403",
+ "hash": "sha256-CSmNE16nDi05qyDAcJR+8SqQQ2ReAeX0+/dRP3WpNsg="
+ },
+ {
+ "pname": "Magick.NET-Q8-AnyCPU",
+ "version": "14.11.1",
+ "hash": "sha256-yRecBHZiMcJHR3dkvfGqthvMo9qlvvcxF6hIdXs/wAM="
+ },
+ {
+ "pname": "Magick.NET.Core",
+ "version": "14.11.1",
+ "hash": "sha256-984jXKS/y2602DgaXsfDh9TFOhpyAF/gHZG8BGQXljA="
+ }
+]
diff --git a/extra/admin-api/Spacebar.Cdn.Worker/deps.Q8.aarch64.json b/extra/admin-api/Spacebar.Cdn.Worker/deps.Q8.aarch64.json
new file mode 100644
index 00000000..4799b2af
--- /dev/null
+++ b/extra/admin-api/Spacebar.Cdn.Worker/deps.Q8.aarch64.json
@@ -0,0 +1,17 @@
+[
+ {
+ "pname": "ArcaneLibs",
+ "version": "1.0.1-preview.20260126-091403",
+ "hash": "sha256-CSmNE16nDi05qyDAcJR+8SqQQ2ReAeX0+/dRP3WpNsg="
+ },
+ {
+ "pname": "Magick.NET-Q8-OpenMP-arm64",
+ "version": "14.11.1",
+ "hash": "sha256-Nt9RNaLpx+VYK+TgdB/GaIEYfBstWJKZQas8ixGfmtM="
+ },
+ {
+ "pname": "Magick.NET.Core",
+ "version": "14.11.1",
+ "hash": "sha256-984jXKS/y2602DgaXsfDh9TFOhpyAF/gHZG8BGQXljA="
+ }
+]
diff --git a/extra/admin-api/Spacebar.Cdn.Worker/deps.Q8.x86_64.json b/extra/admin-api/Spacebar.Cdn.Worker/deps.Q8.x86_64.json
new file mode 100644
index 00000000..08c7fe68
--- /dev/null
+++ b/extra/admin-api/Spacebar.Cdn.Worker/deps.Q8.x86_64.json
@@ -0,0 +1,17 @@
+[
+ {
+ "pname": "ArcaneLibs",
+ "version": "1.0.1-preview.20260126-091403",
+ "hash": "sha256-CSmNE16nDi05qyDAcJR+8SqQQ2ReAeX0+/dRP3WpNsg="
+ },
+ {
+ "pname": "Magick.NET-Q8-OpenMP-x64",
+ "version": "14.11.1",
+ "hash": "sha256-OHuPBwGFCz8nOsPc1NgUHAieCf8FE1ZjdAVpTfAo5X8="
+ },
+ {
+ "pname": "Magick.NET.Core",
+ "version": "14.11.1",
+ "hash": "sha256-984jXKS/y2602DgaXsfDh9TFOhpyAF/gHZG8BGQXljA="
+ }
+]
diff --git a/extra/admin-api/Spacebar.Cdn.Worker/outputs.nix b/extra/admin-api/Spacebar.Cdn.Worker/outputs.nix
new file mode 100644
index 00000000..48f89737
--- /dev/null
+++ b/extra/admin-api/Spacebar.Cdn.Worker/outputs.nix
@@ -0,0 +1,101 @@
+{
+ self,
+ nixpkgs,
+ flake-utils,
+}:
+let
+ rVersion =
+ let
+ rev = self.sourceInfo.shortRev or self.sourceInfo.dirtyShortRev;
+ date = builtins.substring 0 8 self.sourceInfo.lastModifiedDate;
+ time = builtins.substring 8 6 self.sourceInfo.lastModifiedDate;
+ in
+ "preview.${date}-${time}"; # +${rev}";
+in
+flake-utils.lib.eachSystem flake-utils.lib.allSystems (
+ system:
+ let
+ pkgs = import nixpkgs {
+ inherit system;
+ };
+ lib = pkgs.lib;
+ buildSpacebarDotnetModule = import ../../../nix/lib/buildSpacebarDotnetModule.nix { inherit pkgs rVersion; };
+ in
+ {
+ packages =
+ let
+ proj = self.packages.${system};
+ sysArch = (lib.systems.elaborate system).linuxArch;
+ cdnCsWorkerArch =
+ if sysArch == "x86_64" then
+ "x86_64"
+ else if sysArch == "aarch64" then
+ "aarch64"
+ else
+ "AnyCPU";
+ makeWorkerPackage =
+ arch: variant:
+ buildSpacebarDotnetModule {
+ name = "Spacebar.Cdn.Worker-${variant}.${arch}";
+ nugetDeps = ./deps.${variant}.${arch}.json;
+ projectFile = "Spacebar.Cdn.Worker.${variant}.${arch}.csproj";
+ srcRoot = ./.;
+ packNupkg = false;
+ projectReferences = [
+ proj.Spacebar-Interop-Cdn-Abstractions
+ ];
+ }
+ // {
+ __extraProjectPrefix = "Spacebar.Cdn.Worker";
+ };
+ in
+ {
+ Spacebar-Cdn-Worker-x86_64-Q16-HDRI = makeWorkerPackage "x86_64" "Q16-HDRI";
+ Spacebar-Cdn-Worker-x86_64-Q16 = makeWorkerPackage "x86_64" "Q16";
+ Spacebar-Cdn-Worker-x86_64-Q8 = makeWorkerPackage "x86_64" "Q8";
+
+ Spacebar-Cdn-Worker-aarch64-Q16-HDRI = makeWorkerPackage "aarch64" "Q16-HDRI";
+ Spacebar-Cdn-Worker-aarch64-Q16 = makeWorkerPackage "aarch64" "Q16";
+ Spacebar-Cdn-Worker-aarch64-Q8 = makeWorkerPackage "aarch64" "Q8";
+
+ Spacebar-Cdn-Worker-AnyCPU-Q16-HDRI = makeWorkerPackage "AnyCPU" "Q16-HDRI";
+ Spacebar-Cdn-Worker-AnyCPU-Q16 = makeWorkerPackage "AnyCPU" "Q16";
+ Spacebar-Cdn-Worker-AnyCPU-Q8 = makeWorkerPackage "AnyCPU" "Q8";
+ };
+
+ containers.docker =
+ let
+ makeContainer =
+ variant:
+ (pkgs.dockerTools.buildLayeredImage {
+ name = "spacebar-server-cdn-cs-worker-${lib.toLower variant}";
+ tag = builtins.replaceStrings [ "+" ] [ "_" ] self.packages.${system}."Spacebar-Cdn-Worker-${variant}".version;
+ contents = [ self.packages.${system}."Spacebar-Cdn-Worker-${variant}" ];
+ config = {
+ Cmd = [ "${self.packages.${system}."Spacebar-Cdn-Worker-${variant}"}/bin/Spacebar.Cdn.Worker" ];
+ Expose = [ "5000" ];
+ };
+ });
+ in
+ {
+ Spacebar-Cdn-Worker-Q16-HDRI = makeContainer "Q16-HDRI";
+ Spacebar-Cdn-Worker-Q16 = makeContainer "Q16";
+ Spacebar-Cdn-Worker-Q8 = makeContainer "Q8";
+ };
+ }
+)
+#// {
+# # nixosModules.default = import ./nix/modules/default self;
+# checks =
+# let
+# pkgs = import nixpkgs { system = "x86_64-linux"; };
+# in
+# pkgs.lib.recursiveUpdate (pkgs.lib.attrsets.unionOfDisjoint { } self.packages) {
+# x86_64-linux = {
+# # spacebar-server-tests = self.packages.x86_64-linux.default.passthru.tests;
+# docker-admin-api = self.containers.x86_64-linux.docker.admin-api;
+# docker-offload = self.containers.x86_64-linux.docker.offload;
+# docker-cdn-cs = self.containers.x86_64-linux.docker.cdn-cs;
+# };
+# };
+#}
diff --git a/extra/admin-api/Spacebar.Cdn/CdnConfiguration.cs b/extra/admin-api/Spacebar.Cdn/CdnConfiguration.cs
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/extra/admin-api/Spacebar.Cdn/CdnConfiguration.cs
diff --git a/nix/lib/buildSpacebarDotnetModule.nix b/nix/lib/buildSpacebarDotnetModule.nix
new file mode 100644
index 00000000..edbd7680
--- /dev/null
+++ b/nix/lib/buildSpacebarDotnetModule.nix
@@ -0,0 +1,44 @@
+{ pkgs }:
+{
+ name,
+ nugetDeps ? null,
+ projectReferences ? [ ],
+ projectFile ? "${name}/${name}.csproj",
+ runtimeId ? null,
+ useAppHost ? null,
+ packNupkg ? true,
+ srcRoot ? ./.,
+}@args:
+pkgs.buildDotnetModule rec {
+ inherit
+ projectReferences
+ nugetDeps
+ projectFile
+ runtimeId
+ useAppHost
+ srcRoot
+ packNupkg
+ ;
+
+ pname = "${name}";
+ version = "1.0.0-" + rVersion;
+ dotnetPackFlags = [
+ "--include-symbols"
+ "--include-source"
+ "--version-suffix ${rVersion}"
+ ];
+ # dotnetFlags = [ "-v:n" ]; # diag
+ dotnet-sdk = pkgs.dotnet-sdk_10;
+ dotnet-runtime = pkgs.dotnet-aspnetcore_10;
+ src = pkgs.lib.cleanSource srcRoot;
+ meta = with pkgs.lib; {
+ description = "Spacebar Server, Typescript Edition (C# extensions)";
+ homepage = "https://github.com/spacebarchat/server";
+ license = licenses.agpl3Plus;
+ maintainers = with maintainers; [ RorySys ];
+ mainProgram = name;
+ };
+}
+// {
+ __nugetDeps = args.nugetDeps;
+}
|