Repository files navigation

NodeHoster

A .NET solution aimed to simplify and provide the possibility to use IIS capabilities while hosting NodeJS applications on Windows Server.

Originally created by Hallbergs and later modified by jesade-vbg to include AD group lookup and a user cache etc.

Why?

I wanted to provide a way to host a NodeJS application on Windows server, without the hassle of dealing with setting up PM2 as a service etc. I also wanted to use the provided Windows Authentication from IIS, and pass the logged on user to the NodeJS application.

.NET Version and Visual Studio

Supported by .Net 9.0 and Visual Studio 2022 (17.13.3)

Tested with

nodejs v22.14.0

ASP.NET Core Runtime 9.0.3 (Hosting Bundle)

Application structure

The application contains three parts:

  • A reverse proxy (YARP)
  • A middleware adding name of the authenticated user to a header key of choice
  • The middleware can also lookup AD groups for the user and add them to a header key of choice
  • A service running a NodeJS application as a separate process

When the application is deployed to IIS, it will make sure that a proper version of Node is installed on the server, it will then start the NodeJS application and proxy all requests there.

The application listens to changes to the .env file in the node_directory (the directory set in appSettings.json that should contain the NodeJs application), and will restart the NodeJS application on changes to that file.

Deploying the application

The solution is to be deployed to IIS on Windows server. Publish the solution, and review the settings in appSettings.json:

{
"AllowedHosts": "*",
"ReverseProxy": {
"Routes": {
"noderoute": {
"ClusterId": "nodecluster",
"Match": {
"Path": "{**catch-all}"
}
}
},
"Clusters": {
"nodecluster": {
"Destinations": {
"node": {
"Address": "http://localhost:3002"<--- Adress of the NodeJS application
}
}
}
}
},
"Serilog": {
"Using": [],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"Yarp": "Warning"
}
},
"Enrich": [ "FromLogContext" ],
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "Logs\\log.txt"
}
}
]
},
"ActiveDirectory": {
"IsActive": true,
"TrustedUserHeader": "X-Control-Header", <--- Key in which logged on user is sent"OverrideUserWithValue": "", <--- Override value for logged on user"TrustedGroupHeader": "X-Control-Group-Header", <--- Key in which logged on users groups is sent"OverrideGroupsWithValue": "", <--- Override value for users groups, comma separated."TrustedEmailHeader": "X-Control-Email-Header", <--- Key in which logged on users email is sent"OverrideEmailWithValue": ""<--- Override value for users email.
},
"UserCache": {
"TimeOut": 7200<--- Seconds. The timeout for cached users and groups. Timeout is per user. (7200s = 2 hours)
},
"NodeHost": {
"Enabled": "true", <--- Should the application host the NodeJS-application?"MinimumVersion": "20", <--- Minimum Node version required"EntryPoint": "index.js", <--- Which script should be ran to start the app?"FolderName": "node_server", <--- Folder containing the NodeJs-application"InstallNodeModules": "false"<--- Should the app try to install node_modules?"Environment": { <--- Environment variables injected into both node and npm ci processes"NODE_USE_SYSTEM_CA": "1"
}
}
}

When you've made sure to check all the settings, you'll have to set up a new site in IIS and enable Windows Authentication. If the site fails to start, make sure to have a look at the log-directory in the project root.

TODO

This solution was thrown together, and there are probably several bugs etc. One known bug is that the installation of node_modules will sometimes fail. This is probably due to insufficient folder permissions. My suggestion would be to install the node_modules manually before deploying the solution to IIS.

Potential additions:

  • Instead of just listening for changes in .env, adding a setting for which file types should be monitored would be good.
  • TLS Support (Currently using DirectorySearcher which probably not have support for it)

About

A dotnet solution aimed to simplify and provide the possibility to use IIS capabilities while hosting NodeJS-applications on Windows Server.

Resources

Stars

0 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

NodeHoster

A .NET solution aimed to simplify and provide the possibility to use IIS capabilities while hosting NodeJS applications on Windows Server.

Originally created by Hallbergs and later modified by jesade-vbg to include AD group lookup and a user cache etc.

Why?

I wanted to provide a way to host a NodeJS application on Windows server, without the hassle of dealing with setting up PM2 as a service etc. I also wanted to use the provided Windows Authentication from IIS, and pass the logged on user to the NodeJS application.

.NET Version and Visual Studio

Supported by .Net 9.0 and Visual Studio 2022 (17.13.3)

Tested with

nodejs v22.14.0

ASP.NET Core Runtime 9.0.3 (Hosting Bundle)

Application structure

The application contains three parts:

  • A reverse proxy (YARP)
  • A middleware adding name of the authenticated user to a header key of choice
  • The middleware can also lookup AD groups for the user and add them to a header key of choice
  • A service running a NodeJS application as a separate process

When the application is deployed to IIS, it will make sure that a proper version of Node is installed on the server, it will then start the NodeJS application and proxy all requests there.

The application listens to changes to the .env file in the node_directory (the directory set in appSettings.json that should contain the NodeJs application), and will restart the NodeJS application on changes to that file.

Deploying the application

The solution is to be deployed to IIS on Windows server. Publish the solution, and review the settings in appSettings.json:

{
"AllowedHosts": "*",
"ReverseProxy": {
"Routes": {
"noderoute": {
"ClusterId": "nodecluster",
"Match": {
"Path": "{**catch-all}"
}
}
},
"Clusters": {
"nodecluster": {
"Destinations": {
"node": {
"Address": "http://localhost:3002"<--- Adress of the NodeJS application
}
}
}
}
},
"Serilog": {
"Using": [],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"Yarp": "Warning"
}
},
"Enrich": [ "FromLogContext" ],
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "Logs\\log.txt"
}
}
]
},
"ActiveDirectory": {
"IsActive": true,
"TrustedUserHeader": "X-Control-Header", <--- Key in which logged on user is sent"OverrideUserWithValue": "", <--- Override value for logged on user"TrustedGroupHeader": "X-Control-Group-Header", <--- Key in which logged on users groups is sent"OverrideGroupsWithValue": "", <--- Override value for users groups, comma separated."TrustedEmailHeader": "X-Control-Email-Header", <--- Key in which logged on users email is sent"OverrideEmailWithValue": ""<--- Override value for users email.
},
"UserCache": {
"TimeOut": 7200<--- Seconds. The timeout for cached users and groups. Timeout is per user. (7200s = 2 hours)
},
"NodeHost": {
"Enabled": "true", <--- Should the application host the NodeJS-application?"MinimumVersion": "20", <--- Minimum Node version required"EntryPoint": "index.js", <--- Which script should be ran to start the app?"FolderName": "node_server", <--- Folder containing the NodeJs-application"InstallNodeModules": "false"<--- Should the app try to install node_modules?"Environment": { <--- Environment variables injected into both node and npm ci processes"NODE_USE_SYSTEM_CA": "1"
}
}
}

When you've made sure to check all the settings, you'll have to set up a new site in IIS and enable Windows Authentication. If the site fails to start, make sure to have a look at the log-directory in the project root.

TODO

This solution was thrown together, and there are probably several bugs etc. One known bug is that the installation of node_modules will sometimes fail. This is probably due to insufficient folder permissions. My suggestion would be to install the node_modules manually before deploying the solution to IIS.

Potential additions:

  • Instead of just listening for changes in .env, adding a setting for which file types should be monitored would be good.
  • TLS Support (Currently using DirectorySearcher which probably not have support for it)

About

A dotnet solution aimed to simplify and provide the possibility to use IIS capabilities while hosting NodeJS-applications on Windows Server.

Resources

Stars

0 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

NodeHoster

A .NET solution aimed to simplify and provide the possibility to use IIS capabilities while hosting NodeJS applications on Windows Server.

Originally created by Hallbergs and later modified by jesade-vbg to include AD group lookup and a user cache etc.

Why?

I wanted to provide a way to host a NodeJS application on Windows server, without the hassle of dealing with setting up PM2 as a service etc. I also wanted to use the provided Windows Authentication from IIS, and pass the logged on user to the NodeJS application.

.NET Version and Visual Studio

Supported by .Net 9.0 and Visual Studio 2022 (17.13.3)

Tested with

nodejs v22.14.0

ASP.NET Core Runtime 9.0.3 (Hosting Bundle)

Application structure

The application contains three parts:

  • A reverse proxy (YARP)
  • A middleware adding name of the authenticated user to a header key of choice
  • The middleware can also lookup AD groups for the user and add them to a header key of choice
  • A service running a NodeJS application as a separate process

When the application is deployed to IIS, it will make sure that a proper version of Node is installed on the server, it will then start the NodeJS application and proxy all requests there.

The application listens to changes to the .env file in the node_directory (the directory set in appSettings.json that should contain the NodeJs application), and will restart the NodeJS application on changes to that file.

Deploying the application

The solution is to be deployed to IIS on Windows server. Publish the solution, and review the settings in appSettings.json:

{
"AllowedHosts": "*",
"ReverseProxy": {
"Routes": {
"noderoute": {
"ClusterId": "nodecluster",
"Match": {
"Path": "{**catch-all}"
}
}
},
"Clusters": {
"nodecluster": {
"Destinations": {
"node": {
"Address": "http://localhost:3002"<--- Adress of the NodeJS application
}
}
}
}
},
"Serilog": {
"Using": [],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"Yarp": "Warning"
}
},
"Enrich": [ "FromLogContext" ],
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "Logs\\log.txt"
}
}
]
},
"ActiveDirectory": {
"IsActive": true,
"TrustedUserHeader": "X-Control-Header", <--- Key in which logged on user is sent"OverrideUserWithValue": "", <--- Override value for logged on user"TrustedGroupHeader": "X-Control-Group-Header", <--- Key in which logged on users groups is sent"OverrideGroupsWithValue": "", <--- Override value for users groups, comma separated."TrustedEmailHeader": "X-Control-Email-Header", <--- Key in which logged on users email is sent"OverrideEmailWithValue": ""<--- Override value for users email.
},
"UserCache": {
"TimeOut": 7200<--- Seconds. The timeout for cached users and groups. Timeout is per user. (7200s = 2 hours)
},
"NodeHost": {
"Enabled": "true", <--- Should the application host the NodeJS-application?"MinimumVersion": "20", <--- Minimum Node version required"EntryPoint": "index.js", <--- Which script should be ran to start the app?"FolderName": "node_server", <--- Folder containing the NodeJs-application"InstallNodeModules": "false"<--- Should the app try to install node_modules?"Environment": { <--- Environment variables injected into both node and npm ci processes"NODE_USE_SYSTEM_CA": "1"
}
}
}

When you've made sure to check all the settings, you'll have to set up a new site in IIS and enable Windows Authentication. If the site fails to start, make sure to have a look at the log-directory in the project root.

TODO

This solution was thrown together, and there are probably several bugs etc. One known bug is that the installation of node_modules will sometimes fail. This is probably due to insufficient folder permissions. My suggestion would be to install the node_modules manually before deploying the solution to IIS.

Potential additions:

  • Instead of just listening for changes in .env, adding a setting for which file types should be monitored would be good.
  • TLS Support (Currently using DirectorySearcher which probably not have support for it)

About

A dotnet solution aimed to simplify and provide the possibility to use IIS capabilities while hosting NodeJS-applications on Windows Server.

Resources

Stars

0 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

NodeHoster

A .NET solution aimed to simplify and provide the possibility to use IIS capabilities while hosting NodeJS applications on Windows Server.

Originally created by Hallbergs and later modified by jesade-vbg to include AD group lookup and a user cache etc.

Why?

I wanted to provide a way to host a NodeJS application on Windows server, without the hassle of dealing with setting up PM2 as a service etc. I also wanted to use the provided Windows Authentication from IIS, and pass the logged on user to the NodeJS application.

.NET Version and Visual Studio

Supported by .Net 9.0 and Visual Studio 2022 (17.13.3)

Tested with

nodejs v22.14.0

ASP.NET Core Runtime 9.0.3 (Hosting Bundle)

Application structure

The application contains three parts:

  • A reverse proxy (YARP)
  • A middleware adding name of the authenticated user to a header key of choice
  • The middleware can also lookup AD groups for the user and add them to a header key of choice
  • A service running a NodeJS application as a separate process

When the application is deployed to IIS, it will make sure that a proper version of Node is installed on the server, it will then start the NodeJS application and proxy all requests there.

The application listens to changes to the .env file in the node_directory (the directory set in appSettings.json that should contain the NodeJs application), and will restart the NodeJS application on changes to that file.

Deploying the application

The solution is to be deployed to IIS on Windows server. Publish the solution, and review the settings in appSettings.json:

{
"AllowedHosts": "*",
"ReverseProxy": {
"Routes": {
"noderoute": {
"ClusterId": "nodecluster",
"Match": {
"Path": "{**catch-all}"
}
}
},
"Clusters": {
"nodecluster": {
"Destinations": {
"node": {
"Address": "http://localhost:3002"<--- Adress of the NodeJS application
}
}
}
}
},
"Serilog": {
"Using": [],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"Yarp": "Warning"
}
},
"Enrich": [ "FromLogContext" ],
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "Logs\\log.txt"
}
}
]
},
"ActiveDirectory": {
"IsActive": true,
"TrustedUserHeader": "X-Control-Header", <--- Key in which logged on user is sent"OverrideUserWithValue": "", <--- Override value for logged on user"TrustedGroupHeader": "X-Control-Group-Header", <--- Key in which logged on users groups is sent"OverrideGroupsWithValue": "", <--- Override value for users groups, comma separated."TrustedEmailHeader": "X-Control-Email-Header", <--- Key in which logged on users email is sent"OverrideEmailWithValue": ""<--- Override value for users email.
},
"UserCache": {
"TimeOut": 7200<--- Seconds. The timeout for cached users and groups. Timeout is per user. (7200s = 2 hours)
},
"NodeHost": {
"Enabled": "true", <--- Should the application host the NodeJS-application?"MinimumVersion": "20", <--- Minimum Node version required"EntryPoint": "index.js", <--- Which script should be ran to start the app?"FolderName": "node_server", <--- Folder containing the NodeJs-application"InstallNodeModules": "false"<--- Should the app try to install node_modules?"Environment": { <--- Environment variables injected into both node and npm ci processes"NODE_USE_SYSTEM_CA": "1"
}
}
}

When you've made sure to check all the settings, you'll have to set up a new site in IIS and enable Windows Authentication. If the site fails to start, make sure to have a look at the log-directory in the project root.

TODO

This solution was thrown together, and there are probably several bugs etc. One known bug is that the installation of node_modules will sometimes fail. This is probably due to insufficient folder permissions. My suggestion would be to install the node_modules manually before deploying the solution to IIS.

Potential additions:

  • Instead of just listening for changes in .env, adding a setting for which file types should be monitored would be good.
  • TLS Support (Currently using DirectorySearcher which probably not have support for it)

About

A dotnet solution aimed to simplify and provide the possibility to use IIS capabilities while hosting NodeJS-applications on Windows Server.

Resources

Stars

0 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

NodeHoster

A .NET solution aimed to simplify and provide the possibility to use IIS capabilities while hosting NodeJS applications on Windows Server.

Originally created by Hallbergs and later modified by jesade-vbg to include AD group lookup and a user cache etc.

Why?

I wanted to provide a way to host a NodeJS application on Windows server, without the hassle of dealing with setting up PM2 as a service etc. I also wanted to use the provided Windows Authentication from IIS, and pass the logged on user to the NodeJS application.

.NET Version and Visual Studio

Supported by .Net 9.0 and Visual Studio 2022 (17.13.3)

Tested with

nodejs v22.14.0

ASP.NET Core Runtime 9.0.3 (Hosting Bundle)

Application structure

The application contains three parts:

  • A reverse proxy (YARP)
  • A middleware adding name of the authenticated user to a header key of choice
  • The middleware can also lookup AD groups for the user and add them to a header key of choice
  • A service running a NodeJS application as a separate process

When the application is deployed to IIS, it will make sure that a proper version of Node is installed on the server, it will then start the NodeJS application and proxy all requests there.

The application listens to changes to the .env file in the node_directory (the directory set in appSettings.json that should contain the NodeJs application), and will restart the NodeJS application on changes to that file.

Deploying the application

The solution is to be deployed to IIS on Windows server. Publish the solution, and review the settings in appSettings.json:

{
"AllowedHosts": "*",
"ReverseProxy": {
"Routes": {
"noderoute": {
"ClusterId": "nodecluster",
"Match": {
"Path": "{**catch-all}"
}
}
},
"Clusters": {
"nodecluster": {
"Destinations": {
"node": {
"Address": "http://localhost:3002"<--- Adress of the NodeJS application
}
}
}
}
},
"Serilog": {
"Using": [],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"Yarp": "Warning"
}
},
"Enrich": [ "FromLogContext" ],
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "Logs\\log.txt"
}
}
]
},
"ActiveDirectory": {
"IsActive": true,
"TrustedUserHeader": "X-Control-Header", <--- Key in which logged on user is sent"OverrideUserWithValue": "", <--- Override value for logged on user"TrustedGroupHeader": "X-Control-Group-Header", <--- Key in which logged on users groups is sent"OverrideGroupsWithValue": "", <--- Override value for users groups, comma separated."TrustedEmailHeader": "X-Control-Email-Header", <--- Key in which logged on users email is sent"OverrideEmailWithValue": ""<--- Override value for users email.
},
"UserCache": {
"TimeOut": 7200<--- Seconds. The timeout for cached users and groups. Timeout is per user. (7200s = 2 hours)
},
"NodeHost": {
"Enabled": "true", <--- Should the application host the NodeJS-application?"MinimumVersion": "20", <--- Minimum Node version required"EntryPoint": "index.js", <--- Which script should be ran to start the app?"FolderName": "node_server", <--- Folder containing the NodeJs-application"InstallNodeModules": "false"<--- Should the app try to install node_modules?"Environment": { <--- Environment variables injected into both node and npm ci processes"NODE_USE_SYSTEM_CA": "1"
}
}
}

When you've made sure to check all the settings, you'll have to set up a new site in IIS and enable Windows Authentication. If the site fails to start, make sure to have a look at the log-directory in the project root.

TODO

This solution was thrown together, and there are probably several bugs etc. One known bug is that the installation of node_modules will sometimes fail. This is probably due to insufficient folder permissions. My suggestion would be to install the node_modules manually before deploying the solution to IIS.

Potential additions:

  • Instead of just listening for changes in .env, adding a setting for which file types should be monitored would be good.
  • TLS Support (Currently using DirectorySearcher which probably not have support for it)

About

A dotnet solution aimed to simplify and provide the possibility to use IIS capabilities while hosting NodeJS-applications on Windows Server.

Resources

Stars

0 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

NodeHoster

A .NET solution aimed to simplify and provide the possibility to use IIS capabilities while hosting NodeJS applications on Windows Server.

Originally created by Hallbergs and later modified by jesade-vbg to include AD group lookup and a user cache etc.

Why?

I wanted to provide a way to host a NodeJS application on Windows server, without the hassle of dealing with setting up PM2 as a service etc. I also wanted to use the provided Windows Authentication from IIS, and pass the logged on user to the NodeJS application.

.NET Version and Visual Studio

Supported by .Net 9.0 and Visual Studio 2022 (17.13.3)

Tested with

nodejs v22.14.0

ASP.NET Core Runtime 9.0.3 (Hosting Bundle)

Application structure

The application contains three parts:

  • A reverse proxy (YARP)
  • A middleware adding name of the authenticated user to a header key of choice
  • The middleware can also lookup AD groups for the user and add them to a header key of choice
  • A service running a NodeJS application as a separate process

When the application is deployed to IIS, it will make sure that a proper version of Node is installed on the server, it will then start the NodeJS application and proxy all requests there.

The application listens to changes to the .env file in the node_directory (the directory set in appSettings.json that should contain the NodeJs application), and will restart the NodeJS application on changes to that file.

Deploying the application

The solution is to be deployed to IIS on Windows server. Publish the solution, and review the settings in appSettings.json:

{
"AllowedHosts": "*",
"ReverseProxy": {
"Routes": {
"noderoute": {
"ClusterId": "nodecluster",
"Match": {
"Path": "{**catch-all}"
}
}
},
"Clusters": {
"nodecluster": {
"Destinations": {
"node": {
"Address": "http://localhost:3002"<--- Adress of the NodeJS application
}
}
}
}
},
"Serilog": {
"Using": [],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"Yarp": "Warning"
}
},
"Enrich": [ "FromLogContext" ],
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "Logs\\log.txt"
}
}
]
},
"ActiveDirectory": {
"IsActive": true,
"TrustedUserHeader": "X-Control-Header", <--- Key in which logged on user is sent"OverrideUserWithValue": "", <--- Override value for logged on user"TrustedGroupHeader": "X-Control-Group-Header", <--- Key in which logged on users groups is sent"OverrideGroupsWithValue": "", <--- Override value for users groups, comma separated."TrustedEmailHeader": "X-Control-Email-Header", <--- Key in which logged on users email is sent"OverrideEmailWithValue": ""<--- Override value for users email.
},
"UserCache": {
"TimeOut": 7200<--- Seconds. The timeout for cached users and groups. Timeout is per user. (7200s = 2 hours)
},
"NodeHost": {
"Enabled": "true", <--- Should the application host the NodeJS-application?"MinimumVersion": "20", <--- Minimum Node version required"EntryPoint": "index.js", <--- Which script should be ran to start the app?"FolderName": "node_server", <--- Folder containing the NodeJs-application"InstallNodeModules": "false"<--- Should the app try to install node_modules?"Environment": { <--- Environment variables injected into both node and npm ci processes"NODE_USE_SYSTEM_CA": "1"
}
}
}

When you've made sure to check all the settings, you'll have to set up a new site in IIS and enable Windows Authentication. If the site fails to start, make sure to have a look at the log-directory in the project root.

TODO

This solution was thrown together, and there are probably several bugs etc. One known bug is that the installation of node_modules will sometimes fail. This is probably due to insufficient folder permissions. My suggestion would be to install the node_modules manually before deploying the solution to IIS.

Potential additions:

  • Instead of just listening for changes in .env, adding a setting for which file types should be monitored would be good.
  • TLS Support (Currently using DirectorySearcher which probably not have support for it)

About

A dotnet solution aimed to simplify and provide the possibility to use IIS capabilities while hosting NodeJS-applications on Windows Server.

Resources

Stars

0 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

NodeHoster

A .NET solution aimed to simplify and provide the possibility to use IIS capabilities while hosting NodeJS applications on Windows Server.

Originally created by Hallbergs and later modified by jesade-vbg to include AD group lookup and a user cache etc.

Why?

I wanted to provide a way to host a NodeJS application on Windows server, without the hassle of dealing with setting up PM2 as a service etc. I also wanted to use the provided Windows Authentication from IIS, and pass the logged on user to the NodeJS application.

.NET Version and Visual Studio

Supported by .Net 9.0 and Visual Studio 2022 (17.13.3)

Tested with

nodejs v22.14.0

ASP.NET Core Runtime 9.0.3 (Hosting Bundle)

Application structure

The application contains three parts:

  • A reverse proxy (YARP)
  • A middleware adding name of the authenticated user to a header key of choice
  • The middleware can also lookup AD groups for the user and add them to a header key of choice
  • A service running a NodeJS application as a separate process

When the application is deployed to IIS, it will make sure that a proper version of Node is installed on the server, it will then start the NodeJS application and proxy all requests there.

The application listens to changes to the .env file in the node_directory (the directory set in appSettings.json that should contain the NodeJs application), and will restart the NodeJS application on changes to that file.

Deploying the application

The solution is to be deployed to IIS on Windows server. Publish the solution, and review the settings in appSettings.json:

{
"AllowedHosts": "*",
"ReverseProxy": {
"Routes": {
"noderoute": {
"ClusterId": "nodecluster",
"Match": {
"Path": "{**catch-all}"
}
}
},
"Clusters": {
"nodecluster": {
"Destinations": {
"node": {
"Address": "http://localhost:3002"<--- Adress of the NodeJS application
}
}
}
}
},
"Serilog": {
"Using": [],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"Yarp": "Warning"
}
},
"Enrich": [ "FromLogContext" ],
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "Logs\\log.txt"
}
}
]
},
"ActiveDirectory": {
"IsActive": true,
"TrustedUserHeader": "X-Control-Header", <--- Key in which logged on user is sent"OverrideUserWithValue": "", <--- Override value for logged on user"TrustedGroupHeader": "X-Control-Group-Header", <--- Key in which logged on users groups is sent"OverrideGroupsWithValue": "", <--- Override value for users groups, comma separated."TrustedEmailHeader": "X-Control-Email-Header", <--- Key in which logged on users email is sent"OverrideEmailWithValue": ""<--- Override value for users email.
},
"UserCache": {
"TimeOut": 7200<--- Seconds. The timeout for cached users and groups. Timeout is per user. (7200s = 2 hours)
},
"NodeHost": {
"Enabled": "true", <--- Should the application host the NodeJS-application?"MinimumVersion": "20", <--- Minimum Node version required"EntryPoint": "index.js", <--- Which script should be ran to start the app?"FolderName": "node_server", <--- Folder containing the NodeJs-application"InstallNodeModules": "false"<--- Should the app try to install node_modules?"Environment": { <--- Environment variables injected into both node and npm ci processes"NODE_USE_SYSTEM_CA": "1"
}
}
}

When you've made sure to check all the settings, you'll have to set up a new site in IIS and enable Windows Authentication. If the site fails to start, make sure to have a look at the log-directory in the project root.

TODO

This solution was thrown together, and there are probably several bugs etc. One known bug is that the installation of node_modules will sometimes fail. This is probably due to insufficient folder permissions. My suggestion would be to install the node_modules manually before deploying the solution to IIS.

Potential additions:

  • Instead of just listening for changes in .env, adding a setting for which file types should be monitored would be good.
  • TLS Support (Currently using DirectorySearcher which probably not have support for it)

About

A dotnet solution aimed to simplify and provide the possibility to use IIS capabilities while hosting NodeJS-applications on Windows Server.

Resources

Stars

0 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

NodeHoster

A .NET solution aimed to simplify and provide the possibility to use IIS capabilities while hosting NodeJS applications on Windows Server.

Originally created by Hallbergs and later modified by jesade-vbg to include AD group lookup and a user cache etc.

Why?

I wanted to provide a way to host a NodeJS application on Windows server, without the hassle of dealing with setting up PM2 as a service etc. I also wanted to use the provided Windows Authentication from IIS, and pass the logged on user to the NodeJS application.

.NET Version and Visual Studio

Supported by .Net 9.0 and Visual Studio 2022 (17.13.3)

Tested with

nodejs v22.14.0

ASP.NET Core Runtime 9.0.3 (Hosting Bundle)

Application structure

The application contains three parts:

  • A reverse proxy (YARP)
  • A middleware adding name of the authenticated user to a header key of choice
  • The middleware can also lookup AD groups for the user and add them to a header key of choice
  • A service running a NodeJS application as a separate process

When the application is deployed to IIS, it will make sure that a proper version of Node is installed on the server, it will then start the NodeJS application and proxy all requests there.

The application listens to changes to the .env file in the node_directory (the directory set in appSettings.json that should contain the NodeJs application), and will restart the NodeJS application on changes to that file.

Deploying the application

The solution is to be deployed to IIS on Windows server. Publish the solution, and review the settings in appSettings.json:

{
"AllowedHosts": "*",
"ReverseProxy": {
"Routes": {
"noderoute": {
"ClusterId": "nodecluster",
"Match": {
"Path": "{**catch-all}"
}
}
},
"Clusters": {
"nodecluster": {
"Destinations": {
"node": {
"Address": "http://localhost:3002"<--- Adress of the NodeJS application
}
}
}
}
},
"Serilog": {
"Using": [],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"Yarp": "Warning"
}
},
"Enrich": [ "FromLogContext" ],
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "Logs\\log.txt"
}
}
]
},
"ActiveDirectory": {
"IsActive": true,
"TrustedUserHeader": "X-Control-Header", <--- Key in which logged on user is sent"OverrideUserWithValue": "", <--- Override value for logged on user"TrustedGroupHeader": "X-Control-Group-Header", <--- Key in which logged on users groups is sent"OverrideGroupsWithValue": "", <--- Override value for users groups, comma separated."TrustedEmailHeader": "X-Control-Email-Header", <--- Key in which logged on users email is sent"OverrideEmailWithValue": ""<--- Override value for users email.
},
"UserCache": {
"TimeOut": 7200<--- Seconds. The timeout for cached users and groups. Timeout is per user. (7200s = 2 hours)
},
"NodeHost": {
"Enabled": "true", <--- Should the application host the NodeJS-application?"MinimumVersion": "20", <--- Minimum Node version required"EntryPoint": "index.js", <--- Which script should be ran to start the app?"FolderName": "node_server", <--- Folder containing the NodeJs-application"InstallNodeModules": "false"<--- Should the app try to install node_modules?"Environment": { <--- Environment variables injected into both node and npm ci processes"NODE_USE_SYSTEM_CA": "1"
}
}
}

When you've made sure to check all the settings, you'll have to set up a new site in IIS and enable Windows Authentication. If the site fails to start, make sure to have a look at the log-directory in the project root.

TODO

This solution was thrown together, and there are probably several bugs etc. One known bug is that the installation of node_modules will sometimes fail. This is probably due to insufficient folder permissions. My suggestion would be to install the node_modules manually before deploying the solution to IIS.

Potential additions:

  • Instead of just listening for changes in .env, adding a setting for which file types should be monitored would be good.
  • TLS Support (Currently using DirectorySearcher which probably not have support for it)

About

A dotnet solution aimed to simplify and provide the possibility to use IIS capabilities while hosting NodeJS-applications on Windows Server.

Resources

Stars

0 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages