Files
rsmsn_blog/public/posts/npm_to_nginx_tutorial.html

658 lines
54 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en" dir="auto">
<head><meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="robots" content="index, follow">
<title>Tutorial: Move from NginxProxyManager to Nginx | Norm-working Packets 💾</title>
<meta name="keywords" content="git, backups, commandline">
<meta name="description" content="Learn one way to push your git changes to multiple remote repositories.">
<meta name="author" content="Me">
<link rel="canonical" href="../posts/npm_to_nginx_tutorial.html">
<link crossorigin="anonymous" href="../assets/css/stylesheet.b609c58d5c11bb90b1a54e04005d74ad1ddf22165eb79f5533967e57df9c3b50.css" integrity="sha256-tgnFjVwRu5CxpU4EAF10rR3fIhZet59VM5Z&#43;V9&#43;cO1A=" rel="preload stylesheet" as="style">
<link rel="icon" href="../favicon.ico">
<link rel="icon" type="image/png" sizes="16x16" href="../favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="../rsmsncircles.ico">
<link rel="apple-touch-icon" href="../apple-touch-icon.png">
<link rel="mask-icon" href="../safari-pinned-tab.svg">
<meta name="theme-color" content="#2e2e33">
<meta name="msapplication-TileColor" content="#2e2e33">
<link rel="alternate" hreflang="en" href="../posts/npm_to_nginx_tutorial.html">
<noscript>
<style>
#theme-toggle,
.top-link {
display: none;
}
</style>
</noscript><meta property="og:title" content="Tutorial: Move from NginxProxyManager to Nginx" />
<meta property="og:description" content="Learn one way to push your git changes to multiple remote repositories." />
<meta property="og:type" content="article" />
<meta property="og:url" content="/posts/npm_to_nginx_tutorial.html" />
<meta property="og:image" content="/npm_to_nginx.png" /><meta property="article:section" content="posts" />
<meta property="article:published_time" content="2023-08-05T15:23:51-05:00" />
<meta property="article:modified_time" content="2023-08-05T15:23:51-05:00" /><meta property="og:site_name" content="Norm-working Packets" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:image" content="/npm_to_nginx.png" />
<meta name="twitter:title" content="Tutorial: Move from NginxProxyManager to Nginx"/>
<meta name="twitter:description" content="Learn one way to push your git changes to multiple remote repositories."/>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1 ,
"name": "Posts",
"item": "/posts.html"
}
{
"@type": "ListItem",
"position": 1 ,
"name": "Tutorial: Move from NginxProxyManager to Nginx",
"item": "/posts/npm_to_nginx_tutorial.html"
}
]
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "Tutorial: Move from NginxProxyManager to Nginx",
"name": "Tutorial: Move from NginxProxyManager to Nginx",
"description": "Learn one way to push your git changes to multiple remote repositories.",
"keywords": [
"git", "backups", "commandline"
],
"articleBody": "Goal A Tutorial Repo for migrating your Nginx Proxy Manager proxy setup to Nginx. I wrote this originally for this reddit post and to post this my Github profile. Thought my website would also be a good place to share it for any passers-by.\nTo give clear instructions to help users migrate from using Nginx Proxy Manager (NPM) to standard Nginx. This tutorial is not exhaustive and there are many other implementations of this transition. I would recommend checking out the many Nginx Documentation Sites and tutorials to learn more.\nIntroduction If youre anything like me and you got into the self-hosted/homelab/diy game sometime within the last 5 years, youve likely been recommended to use Nginx Proxy Manager as one of the choice Reverse Proxy services. If youve also been paying attention to various self-hosted communities, you may have also come across Christian Lempas Video on trusting smaller self hosted projects and tools.\nSpoilers: He roasts NPM in his video and towards the end says he wont be using NPM anymore. He also, perhaps purposely, doesnt share which tool he will be migrating to.\nWhether you follow Christian away from NPM or not, it dawned on me that while NPM is using a very trusted web server and reverse proxy under the hood, I hadnt taken the time to understand how an Nginx Config actually worked. Since NPM was already creating most of the files for Nginx, I got to reading through all the files and reworking them so that I could begin using Nginx without the NPM gui.\nContributing: This is not all encompassing of Nginx possibilities. Including instructions for various installation methods, using OpenResty, and any other migrations or use cases would help the community. If youd like to add in additional information on how to migrate from NPM to Nginx, that is welcome. Simply submit a PR with your steps.\nTL;DR - Quick Steps Copy the following contents (including sub-directories) from the NPM /data/nginx directory to the Nginx /etc/nginx folder:\nproxy_hosts \u003e sites-available conf.d \u003e conf.d snippets \u003e snippets custom_ssl \u003e custom_ssl (if applicable) Edit each file in your sites-available directory and update the paths. Most will change from /data/nginx/ to /etc/nginx.\nEdit your nginx.conf file and ensure the following two paths are there:\ninclude /etc/nginx/conf.d/*.conf; and include /etc/nginx/sites-enabled/*; Symlink the proxy host files in sites-available to sites-enabled\nln -s * ./sites-enabled Test your changes with nginx -t. Make appropriate changes if there are error messages.\nPre-requisites \u0026 Assumptions I am using an Ubuntu VM with NPM and its db as a Docker Container while Nginx is installed natively on the machine. You dont have to use this setup exactly, but I am making a few assumptions as to what you should have access to before you begin. I am also using custom SSL certs, but theoretically, the transition should be the same when using Lets Encrypt.\nIve added some example files to show before and after changes to this repo and outlined file trees below.\nYou understand the basics of what a Reverse Proxy is doing and are sticking with some stock settings (like exposing port 80 an 443). Youve installed NPM and Nginx using your preferred method. You have access to both NPMs file tree and Nginxs. If using NPM in docker, make sure youve mapped a local volume on the host to the container. My setup using docker-compose is the following: /user/nginx/data:/data. Know where your Nginx files are. If using docker, same as above, make sure your container directories are mapped to the host. For a linux install, they should be accessible at /etc/nginx. You know how to edit files at the command line using nano, vi, vim, neovim, emacs, or something else. Nginx Files Nginx uses the nginx.conf file and within that file, it will include your proxy files. These exist under ./nginx/sites-enabled/. In the main nginx.conf file, the line include /etc/nginx/sites-enabled/*; will bring in those files to the config file, making the proxies accessible.\nHow to Transition - Detailed Version Since NPM uses Nginx under the hood, they are both, by default, going to try and use ports 80 and 443 to serve up your apps and content. Turn off both systems.\nDocker: docker stop [app_container, db_container] Systemd: systemctl stop nginx Copy your proxy_host (NPM) files to the sites-available (Nginx) folder. cp -r /user/nginx/data/nginx/proxy_hosts/* /etc/nginx/sites-available/\nNginx doesnt really care what the files are called, but NPM numbers them based on the order in which you added them in the GUI. I find it better to rename them to what service they actually serve up for easier identification later.\nCopy your custom_ssl folder from NPM to the custom_ssl folder in Nginx. See the following step for the various default paths in both systems.\ncp -r /user/nginx/data/custom_ssl/* /etc/nginx/custom_ssl/ Copy the conf.d folder from NPM to the conf.d folder in Nginx. Note: For some reason, not all of the files in the proxy files were actually in my conf.d directory. If youre missing any files, please download and/or copy and paste them from the NPM Repo\ncp -r /user/nginx/data/nginx/conf.d /etc/nginx/ If you had any additional files included in the Advanced section of an NPM Proxy Host, make sure you copy them over. For my setup and this tutorial, they were all located in the snippets directory.\ncp -r /user/nginx/data/nginx/snippets/* /etc/nginx/snippets/ There are a number of lines that need to be updated in each proxy configuration file to make them work with Nginx. Ive placed additional comments in ./proxy_host/npm_proxy.conf file. The line changes are the following:\nCustom SSL path:\nNPM path: /data/custom_ssl... Nginx path: /etc/nginx/custom_ssl... conf.d:\nThe paths should remain the same. However, if you changed the path for conf.d in Nginx and differed in step 5, above, make sure you use the correct path. Access \u0026 Error Logs\nNPM path: /data/logs/... Nginx path: /var/log/nginx/... Double Check all your paths! If this is your first time using Nginx, make sure every directory is correct! Save your work.\nNavigate to the nginx.conf file which is located at /etc/nginx/. You can see the one I am using in this repo.\nMake sure that you have the following two lines in the main conf file and that they are pointing to the appropriate directories in the nginx directory path.\ninclude /etc/nginx/conf.d/*.conf; and include /etc/nginx/sites-enabled/*; Youll notice that you ensured there was a sites-enabled directory in the configuration file, but you changed all your proxy host config files in sites-available! Good eye, all thats left is to symlink the files to sites-enabled so that nginx can start using them.\nTo symlink the available proxy files run the following command within the sites-available directory:\nln -s * ./sites-enabled Once youre confident that youve done all the above correctly, you can test your setup using nginx command and flags. While in the directory with your nginx.conf file - usually /etc/nginx - run the following command: nginx -t.\nIf all is working as expected you should see the below output. If it returns any errors, fix them appropriately. It will usually tell you what line is throwing the error. In this case, theres a high likelihood that it will be path error.\nnginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful And thats it! You can now restart your nginx service on the host and access all your sites just as if you were using Nginx Proxy Manager! Make sure you take a look at your logs and systems status should nginx fail to start.\nAdditional Information/Appendix File Trees for NPM (in container) and Nginx (on host) I did not expand every directory in these trees. Only the ones that are pertinent for reference in this tutorial.\nNGINX ├── conf.d │ └── include │ ├── assets.conf │ ├── block-exploits.conf │ ├── force-ssl.conf │ ├── ip_ranges.conf │ ├── proxy.conf │ └── resolvers.conf ├── custom_ssl │ ├── npm-1 │ │ ├── fullchain.pem │ │ └── privkey.pem │ ├── npm-2 │ │ ├── fullchain.pem │ │ └── privkey.pem │ └── npm-3 │ ├── fullchain.pem │ └── privkey.pem ├── fastcgi.conf ├── fastcgi_params ├── koi-utf ├── koi-win ├── mime.types ├── modules-available ├── modules-enabled ├── nginx.conf ├── proxy_params ├── scgi_params ├── sites-available │ ├── auth.conf │ ├── bitwarden.conf │ ├── codehub.conf │ ├── default.backup │ ├── files.conf │ ├── notes.conf │ ├── photos.conf │ ├── rsmsn-root.conf │ ├── wordle.conf │ └── wordle-it.conf ├── sites-enabled │ ├── auth.conf -\u003e /etc/nginx/sites-available/auth.conf │ ├── bitwarden.conf -\u003e /etc/nginx/sites-available/bitwarden.conf │ ├── codehub.conf -\u003e /etc/nginx/sites-available/codehub.conf │ ├── files.conf -\u003e /etc/nginx/sites-available/files.conf │ ├── notes.conf -\u003e /etc/nginx/sites-available/notes.conf │ ├── photos.conf -\u003e /etc/nginx/sites-available/photos.conf │ ├── wordle.conf -\u003e /etc/nginx/sites-available/wordle.conf │ └── wordle-it.conf -\u003e /etc/nginx/sites-available/wordle-it.conf ├── snippets │ ├── authelia-authrequest-basic.conf │ ├── authelia-authrequest.conf │ ├── authelia-authrequest-detect.conf │ ├── authelia-location-basic.conf │ ├── authelia-location.conf │ ├── authelia-location-detect.conf │ ├── fastcgi-php.conf │ ├── proxy.conf │ └── snakeoil.conf ├── uwsgi_params └── win-utf NPM ├── data │ ├── access │ ├── custom_ssl │ │ ├── npm-1 │ │ │ ├── fullchain.pem │ │ │ └── privkey.pem │ │ ├── npm-2 │ │ │ ├── fullchain.pem │ │ │ └── privkey.pem │ │ └── npm-3 │ │ ├── fullchain.pem │ │ └── privkey.pem │ ├── keys.json │ ├── letsencrypt-acme-challenge │ ├── logs │ ├── mysql │ └── nginx │ ├── custom │ ├── dead_host │ ├── default_host │ ├── default_www │ ├── dummycert.pem │ ├── dummykey.pem │ ├── proxy_host │ │ ├── 10.conf │ │ ├── 11.conf │ │ ├── 12.conf │ │ ├── 13.conf │ │ ├── 15.conf │ │ ├── 1.conf │ │ ├── 2.conf │ │ ├── 4.conf │ │ ├── 5.conf │ │ └── 6.conf │ ├── redirection_host │ ├── snippets │ │ ├── authelia-authrequest-basic.conf │ │ ├── authelia-authrequest.conf │ │ ├── authelia-authrequest-detect.conf │ │ ├── authelia-location-basic.conf │ │ ├── authelia-location.conf │ │ ├── authelia-location-detect.conf │ │ └── proxy.conf │ ├── stream │ └── temp ├── docker-compose.yml └── letsencrypt └── renewal-hooks ",
"wordCount" : "1635",
"inLanguage": "en",
"image":"/npm_to_nginx.png","datePublished": "2023-08-05T15:23:51-05:00",
"dateModified": "2023-08-05T15:23:51-05:00",
"author":{
"@type": "Person",
"name": "Me"
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "/posts/npm_to_nginx_tutorial.html"
},
"publisher": {
"@type": "Organization",
"name": "Norm-working Packets 💾",
"logo": {
"@type": "ImageObject",
"url": "/favicon.ico"
}
}
}
</script>
</head>
<body class=" dark" id="top">
<script>
if (localStorage.getItem("pref-theme") === "light") {
document.body.classList.remove('dark')
}
</script>
<header class="header">
<nav class="nav">
<div class="logo">
<a href="../" accesskey="h" title="Norm-working Packets 💾 (Alt + H)">Norm-working Packets 💾</a>
<div class="logo-switches">
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round">
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
</svg>
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</button>
<ul class="lang-switch"><li>|</li>
</ul>
</div>
</div>
<ul id="menu">
<li>
<a href="../posts.html" title="Posts">
<span>Posts</span>
</a>
</li>
</ul>
</nav>
</header>
<main class="main">
<article class="post-single">
<header class="post-header">
<div class="breadcrumbs"><a href="../">Home</a>&nbsp;»&nbsp;<a href="../posts.html">Posts</a></div>
<h1 class="post-title entry-hint-parent">
Tutorial: Move from NginxProxyManager to Nginx
</h1>
<div class="post-description">
Learn one way to push your git changes to multiple remote repositories.
</div>
<div class="post-meta"><span title='2023-08-05 15:23:51 -0500 -0500'>August 5, 2023</span>&nbsp;·&nbsp;8 min&nbsp;·&nbsp;1635 words&nbsp;·&nbsp;Me
</div>
</header> <div class="toc">
<details >
<summary accesskey="c" title="(Alt + C)">
<span class="details">Table of Contents</span>
</summary>
<div class="inner"><nav id="TableOfContents">
<ul>
<li><a href="#goal">Goal</a></li>
<li><a href="#introduction">Introduction</a></li>
<li><a href="#tldr---quick-steps">TL;DR - Quick Steps</a></li>
<li><a href="#pre-requisites--assumptions">Pre-requisites &amp; Assumptions</a></li>
<li><a href="#nginx-files">Nginx Files</a></li>
<li><a href="#how-to-transition---detailed-version">How to Transition - Detailed Version</a></li>
<li><a href="#additional-informationappendix">Additional Information/Appendix</a>
<ul>
<li><a href="#file-trees-for-npm-in-container-and-nginx-on-host">File Trees for NPM (in container) and Nginx (on host)</a></li>
<li><a href="#nginx">NGINX</a></li>
<li><a href="#npm">NPM</a></li>
</ul>
</li>
</ul>
</nav>
</div>
</details>
</div>
<div class="post-content"><h2 id="goal">Goal<a hidden class="anchor" aria-hidden="true" href="#goal">#</a></h2>
<p>A Tutorial Repo for migrating your Nginx Proxy Manager proxy setup to Nginx. I wrote this originally for <a href="https://www.reddit.com/r/selfhosted/comments/15j4v80/minitutorial_migrating_from_nginx_proxy_manager/">this reddit
post</a> and to post this <a href="https://github.com/Normanras/Npm_to_Nginx">my Github profile</a>. Thought my website would also be a good place to share it for any passers-by.</p>
<p>To give clear instructions to help users migrate from using <a href="https://nginxproxymanager.com/">Nginx Proxy Manager</a> (NPM) to standard <a href="https://docs.nginx.com/">Nginx</a>. This tutorial is not exhaustive and there are many other implementations of this transition. I would recommend checking out the many Nginx <a href="http://nginx.org/en/docs/">Documentation Sites</a> and tutorials to learn more.</p>
<h2 id="introduction">Introduction<a hidden class="anchor" aria-hidden="true" href="#introduction">#</a></h2>
<p>If you&rsquo;re anything like me and you got into the self-hosted/homelab/diy game sometime within the last 5 years, you&rsquo;ve likely been recommended to use Nginx Proxy Manager as one of the choice Reverse Proxy services. If you&rsquo;ve also been paying attention to various self-hosted communities, you may have also come across Christian Lempa&rsquo;s Video on <a href="https://youtu.be/uaixCKTaqY0">trusting smaller self hosted projects and tools</a>.</p>
<p><em>Spoilers:</em> He roasts NPM in his video and towards the end says he won&rsquo;t be using NPM anymore. He also, perhaps purposely, doesn&rsquo;t share which tool he will be migrating to.</p>
<p>Whether you follow Christian away from NPM or not, it dawned on me that while NPM is using a very trusted web server and reverse proxy under the hood, I hadn&rsquo;t taken the time to understand how an Nginx Config actually worked. Since NPM was already creating most of the files for Nginx, I got to reading through all the files and reworking them so that I could begin using Nginx without the NPM gui.</p>
<p><em>Contributing: This is not all encompassing of Nginx possibilities. Including instructions for various installation methods, using OpenResty, and any other migrations or use cases would help the community. If you&rsquo;d like to add in additional information on how to migrate from NPM to Nginx, that is welcome. Simply submit a PR with your steps.</em></p>
<h2 id="tldr---quick-steps">TL;DR - Quick Steps<a hidden class="anchor" aria-hidden="true" href="#tldr---quick-steps">#</a></h2>
<ol>
<li>
<p>Copy the following contents (including sub-directories) from the NPM <code>/data/nginx</code> directory to the Nginx <code>/etc/nginx</code> folder:</p>
<ul>
<li><code>proxy_hosts</code> &gt; <code>sites-available</code></li>
<li><code>conf.d</code> &gt; <code>conf.d</code></li>
<li><code>snippets</code> &gt; <code>snippets</code></li>
<li><code>custom_ssl</code> &gt; <code>custom_ssl</code> (if applicable)</li>
</ul>
</li>
<li>
<p>Edit each file in your <code>sites-available</code> directory and update the paths. Most will change from <code>/data/nginx/</code> to <code>/etc/nginx</code>.</p>
</li>
<li>
<p>Edit your <code>nginx.conf</code> file and ensure the following two paths are there:</p>
<ul>
<li><code>include /etc/nginx/conf.d/*.conf;</code> and <code>include /etc/nginx/sites-enabled/*;</code></li>
</ul>
</li>
<li>
<p>Symlink the proxy host files in <code>sites-available</code> to <code>sites-enabled</code></p>
<ul>
<li><code>ln -s * ./sites-enabled</code></li>
</ul>
</li>
<li>
<p>Test your changes with <code>nginx -t</code>. Make appropriate changes if there are error messages.</p>
</li>
</ol>
<h2 id="pre-requisites--assumptions">Pre-requisites &amp; Assumptions<a hidden class="anchor" aria-hidden="true" href="#pre-requisites--assumptions">#</a></h2>
<p>I am using an Ubuntu VM with NPM and it&rsquo;s db as a Docker Container while Nginx is installed natively on the machine. You don&rsquo;t have to use this setup exactly, but I am making a few assumptions as to what you should have access to before you begin. I am also using custom SSL certs, but theoretically, the transition should be the same when using Lets Encrypt.</p>
<p>I&rsquo;ve added some example files to show before and after changes to this repo and outlined file trees below.</p>
<ul>
<li>You understand the basics of what a Reverse Proxy is doing and are sticking with some stock settings (like exposing port 80 an 443).</li>
<li>You&rsquo;ve installed <a href="https://nginxproxymanager.com/setup/">NPM</a> and <a href="https://www.nginx.com/resources/wiki/start/topics/tutorials/install/">Nginx</a> using your preferred method.</li>
<li>You have access to both NPMs file tree and Nginx&rsquo;s.</li>
<li>If using NPM in docker, make sure you&rsquo;ve mapped a local volume on the host to the container.</li>
<li>My setup using docker-compose is the following: <code>/user/nginx/data:/data</code>.</li>
<li>Know where your Nginx files are. If using docker, same as above, make sure your container directories are mapped to the host.</li>
<li>For a linux install, they should be accessible at <code>/etc/nginx</code>.</li>
<li>You know how to edit files at the command line using <code>nano</code>, <code>vi</code>, <code>vim</code>, <code>neovim</code>, <code>emacs</code>, or something else.</li>
</ul>
<h2 id="nginx-files">Nginx Files<a hidden class="anchor" aria-hidden="true" href="#nginx-files">#</a></h2>
<p>Nginx uses the <code>nginx.conf</code> file and within that file, it will include your proxy files. These exist under <code>./nginx/sites-enabled/</code>. In the main <code>nginx.conf</code> file, the line <code>include /etc/nginx/sites-enabled/*;</code> will bring in those files to the config file, making the proxies accessible.</p>
<h2 id="how-to-transition---detailed-version">How to Transition - Detailed Version<a hidden class="anchor" aria-hidden="true" href="#how-to-transition---detailed-version">#</a></h2>
<ol>
<li>
<p>Since NPM uses Nginx under the hood, they are both, by default, going to try and use ports 80 and 443 to serve up your apps and content. Turn off both systems.</p>
<ul>
<li>Docker: <code>docker stop [app_container, db_container]</code></li>
<li>Systemd: <code>systemctl stop nginx</code></li>
</ul>
</li>
<li>
<p>Copy your <code>proxy_host</code> (NPM) files to the <code>sites-available</code> (Nginx) folder.
<code>cp -r /user/nginx/data/nginx/proxy_hosts/* /etc/nginx/sites-available/</code></p>
</li>
<li>
<p>Nginx doesn&rsquo;t really care what the files are called, but NPM numbers them based on the order in which you added them in the GUI. I find it better to rename them to what service they actually serve up for easier identification later.</p>
</li>
<li>
<p>Copy your <code>custom_ssl</code> folder from NPM to the <code>custom_ssl</code> folder in Nginx. See the following step for the various default paths in both systems.</p>
<ul>
<li><code>cp -r /user/nginx/data/custom_ssl/* /etc/nginx/custom_ssl/</code></li>
</ul>
</li>
<li>
<p>Copy the <code>conf.d</code> folder from NPM to the <code>conf.d</code> folder in Nginx. <em>Note: For some reason, not all of the files in
the proxy files were actually in my <code>conf.d</code> directory. If you&rsquo;re missing any files, please download and/or copy and
paste them from the <a href="https://github.com/NginxProxyManager/nginx-proxy-manager/tree/fa851b61da3fe3726d1a04c25e69d36e79edea2d/docker/rootfs/etc/nginx/conf.d/include">NPM Repo</a></em></p>
<ul>
<li><code>cp -r /user/nginx/data/nginx/conf.d /etc/nginx/</code></li>
</ul>
</li>
<li>
<p>If you had any additional files included in the Advanced section of an NPM Proxy Host, make sure you copy them over. For my setup and this tutorial, they were all located in the <code>snippets</code> directory.</p>
<ul>
<li><code>cp -r /user/nginx/data/nginx/snippets/* /etc/nginx/snippets/</code></li>
</ul>
</li>
<li>
<p>There are a number of lines that need to be updated in each proxy configuration file to make them work with Nginx. I&rsquo;ve placed additional comments in <a href="./proxy_host/npm_proxy.conf"><code>./proxy_host/npm_proxy.conf</code></a> file. The line changes are the following:</p>
<ol>
<li>
<p>Custom SSL path:</p>
<ul>
<li>NPM path: <code>/data/custom_ssl...</code></li>
<li>Nginx path: <code>/etc/nginx/custom_ssl...</code></li>
</ul>
</li>
<li>
<p>conf.d:</p>
<ul>
<li>The paths should remain the same. However, if you changed the path for <code>conf.d</code> in Nginx and differed in step 5, above, make sure you use the correct path.</li>
</ul>
</li>
<li>
<p>Access &amp; Error Logs</p>
<ul>
<li>NPM path: <code>/data/logs/...</code></li>
<li>Nginx path: <code>/var/log/nginx/...</code></li>
</ul>
</li>
</ol>
</li>
<li>
<p>Double Check all your paths! If this is your first time using Nginx, make sure every directory is correct! Save your work.</p>
</li>
<li>
<p>Navigate to the <code>nginx.conf</code> file which is located at <code>/etc/nginx/</code>. You can see the one I am using in this repo.</p>
</li>
<li>
<p>Make sure that you have the following two lines in the main conf file and that they are pointing to the appropriate directories in the nginx directory path.</p>
<ul>
<li><code>include /etc/nginx/conf.d/*.conf;</code> and <code>include /etc/nginx/sites-enabled/*;</code></li>
</ul>
</li>
<li>
<p>You&rsquo;ll notice that you ensured there was a <code>sites-enabled</code> directory in the configuration file, but you changed all your proxy host config files in <code>sites-available</code>! Good eye, all that&rsquo;s left is to symlink the files to <code>sites-enabled</code> so that nginx can start using them.</p>
</li>
<li>
<p>To symlink the available proxy files run the following command within the <code>sites-available</code> directory:</p>
<ul>
<li><code>ln -s * ./sites-enabled</code></li>
</ul>
</li>
<li>
<p>Once you&rsquo;re confident that you&rsquo;ve done all the above correctly, you can test your setup using nginx command and flags. While in the directory with your <code>nginx.conf</code> file - usually <code>/etc/nginx</code> - run the following command: <code>nginx -t</code>.</p>
</li>
<li>
<p>If all is working as expected you should see the below output. If it returns any errors, fix them appropriately. It will usually tell you what line is throwing the error. In this case, there&rsquo;s a high likelihood that it will be path error.</p>
</li>
</ol>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
</span></span><span style="display:flex;"><span>nginx: configuration file /etc/nginx/nginx.conf test is successful
</span></span></code></pre></div><p>And that&rsquo;s it! You can now restart your nginx service on the host and access all your sites just as if you were using Nginx Proxy Manager! Make sure you take a look at your logs and system&rsquo;s status should nginx fail to start.</p>
<h2 id="additional-informationappendix">Additional Information/Appendix<a hidden class="anchor" aria-hidden="true" href="#additional-informationappendix">#</a></h2>
<h3 id="file-trees-for-npm-in-container-and-nginx-on-host">File Trees for NPM (in container) and Nginx (on host)<a hidden class="anchor" aria-hidden="true" href="#file-trees-for-npm-in-container-and-nginx-on-host">#</a></h3>
<p><em>I did not expand every directory in these trees. Only the ones that are pertinent for reference in this tutorial.</em></p>
<h3 id="nginx">NGINX<a hidden class="anchor" aria-hidden="true" href="#nginx">#</a></h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>├── conf.d
</span></span><span style="display:flex;"><span>│   └── include
</span></span><span style="display:flex;"><span>│   ├── assets.conf
</span></span><span style="display:flex;"><span>│   ├── block-exploits.conf
</span></span><span style="display:flex;"><span>│   ├── force-ssl.conf
</span></span><span style="display:flex;"><span>│   ├── ip_ranges.conf
</span></span><span style="display:flex;"><span>│   ├── proxy.conf
</span></span><span style="display:flex;"><span>│   └── resolvers.conf
</span></span><span style="display:flex;"><span>├── custom_ssl
</span></span><span style="display:flex;"><span>│   ├── npm-1
</span></span><span style="display:flex;"><span>│   │   ├── fullchain.pem
</span></span><span style="display:flex;"><span>│   │   └── privkey.pem
</span></span><span style="display:flex;"><span>│   ├── npm-2
</span></span><span style="display:flex;"><span>│   │   ├── fullchain.pem
</span></span><span style="display:flex;"><span>│   │   └── privkey.pem
</span></span><span style="display:flex;"><span>│   └── npm-3
</span></span><span style="display:flex;"><span>│   ├── fullchain.pem
</span></span><span style="display:flex;"><span>│   └── privkey.pem
</span></span><span style="display:flex;"><span>├── fastcgi.conf
</span></span><span style="display:flex;"><span>├── fastcgi_params
</span></span><span style="display:flex;"><span>├── koi-utf
</span></span><span style="display:flex;"><span>├── koi-win
</span></span><span style="display:flex;"><span>├── mime.types
</span></span><span style="display:flex;"><span>├── modules-available
</span></span><span style="display:flex;"><span>├── modules-enabled
</span></span><span style="display:flex;"><span>├── nginx.conf
</span></span><span style="display:flex;"><span>├── proxy_params
</span></span><span style="display:flex;"><span>├── scgi_params
</span></span><span style="display:flex;"><span>├── sites-available
</span></span><span style="display:flex;"><span>│   ├── auth.conf
</span></span><span style="display:flex;"><span>│   ├── bitwarden.conf
</span></span><span style="display:flex;"><span>│   ├── codehub.conf
</span></span><span style="display:flex;"><span>│   ├── default.backup
</span></span><span style="display:flex;"><span>│   ├── files.conf
</span></span><span style="display:flex;"><span>│   ├── notes.conf
</span></span><span style="display:flex;"><span>│   ├── photos.conf
</span></span><span style="display:flex;"><span>│   ├── rsmsn-root.conf
</span></span><span style="display:flex;"><span>│   ├── wordle.conf
</span></span><span style="display:flex;"><span>│   └── wordle-it.conf
</span></span><span style="display:flex;"><span>├── sites-enabled
</span></span><span style="display:flex;"><span>│   ├── auth.conf -&gt; /etc/nginx/sites-available/auth.conf
</span></span><span style="display:flex;"><span>│   ├── bitwarden.conf -&gt; /etc/nginx/sites-available/bitwarden.conf
</span></span><span style="display:flex;"><span>│   ├── codehub.conf -&gt; /etc/nginx/sites-available/codehub.conf
</span></span><span style="display:flex;"><span>│   ├── files.conf -&gt; /etc/nginx/sites-available/files.conf
</span></span><span style="display:flex;"><span>│   ├── notes.conf -&gt; /etc/nginx/sites-available/notes.conf
</span></span><span style="display:flex;"><span>│   ├── photos.conf -&gt; /etc/nginx/sites-available/photos.conf
</span></span><span style="display:flex;"><span>│   ├── wordle.conf -&gt; /etc/nginx/sites-available/wordle.conf
</span></span><span style="display:flex;"><span>│   └── wordle-it.conf -&gt; /etc/nginx/sites-available/wordle-it.conf
</span></span><span style="display:flex;"><span>├── snippets
</span></span><span style="display:flex;"><span>│   ├── authelia-authrequest-basic.conf
</span></span><span style="display:flex;"><span>│   ├── authelia-authrequest.conf
</span></span><span style="display:flex;"><span>│   ├── authelia-authrequest-detect.conf
</span></span><span style="display:flex;"><span>│   ├── authelia-location-basic.conf
</span></span><span style="display:flex;"><span>│   ├── authelia-location.conf
</span></span><span style="display:flex;"><span>│   ├── authelia-location-detect.conf
</span></span><span style="display:flex;"><span>│   ├── fastcgi-php.conf
</span></span><span style="display:flex;"><span>│   ├── proxy.conf
</span></span><span style="display:flex;"><span>│   └── snakeoil.conf
</span></span><span style="display:flex;"><span>├── uwsgi_params
</span></span><span style="display:flex;"><span>└── win-utf
</span></span></code></pre></div><h3 id="npm">NPM<a hidden class="anchor" aria-hidden="true" href="#npm">#</a></h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>├── data
</span></span><span style="display:flex;"><span>│   ├── access
</span></span><span style="display:flex;"><span>│   ├── custom_ssl
</span></span><span style="display:flex;"><span>│   │   ├── npm-1
</span></span><span style="display:flex;"><span>│   │   │   ├── fullchain.pem
</span></span><span style="display:flex;"><span>│   │   │   └── privkey.pem
</span></span><span style="display:flex;"><span>│   │   ├── npm-2
</span></span><span style="display:flex;"><span>│   │   │   ├── fullchain.pem
</span></span><span style="display:flex;"><span>│   │   │   └── privkey.pem
</span></span><span style="display:flex;"><span>│   │   └── npm-3
</span></span><span style="display:flex;"><span>│   │   ├── fullchain.pem
</span></span><span style="display:flex;"><span>│   │   └── privkey.pem
</span></span><span style="display:flex;"><span>│   ├── keys.json
</span></span><span style="display:flex;"><span>│   ├── letsencrypt-acme-challenge
</span></span><span style="display:flex;"><span>│   ├── logs
</span></span><span style="display:flex;"><span>│   ├── mysql
</span></span><span style="display:flex;"><span>│   └── nginx
</span></span><span style="display:flex;"><span>│   ├── custom
</span></span><span style="display:flex;"><span>│   ├── dead_host
</span></span><span style="display:flex;"><span>│   ├── default_host
</span></span><span style="display:flex;"><span>│   ├── default_www
</span></span><span style="display:flex;"><span>│   ├── dummycert.pem
</span></span><span style="display:flex;"><span>│   ├── dummykey.pem
</span></span><span style="display:flex;"><span>│   ├── proxy_host
</span></span><span style="display:flex;"><span>│   │   ├── 10.conf
</span></span><span style="display:flex;"><span>│   │   ├── 11.conf
</span></span><span style="display:flex;"><span>│   │   ├── 12.conf
</span></span><span style="display:flex;"><span>│   │   ├── 13.conf
</span></span><span style="display:flex;"><span>│   │   ├── 15.conf
</span></span><span style="display:flex;"><span>│   │   ├── 1.conf
</span></span><span style="display:flex;"><span>│   │   ├── 2.conf
</span></span><span style="display:flex;"><span>│   │   ├── 4.conf
</span></span><span style="display:flex;"><span>│   │   ├── 5.conf
</span></span><span style="display:flex;"><span>│   │   └── 6.conf
</span></span><span style="display:flex;"><span>│   ├── redirection_host
</span></span><span style="display:flex;"><span>│   ├── snippets
</span></span><span style="display:flex;"><span>│   │   ├── authelia-authrequest-basic.conf
</span></span><span style="display:flex;"><span>│   │   ├── authelia-authrequest.conf
</span></span><span style="display:flex;"><span>│   │   ├── authelia-authrequest-detect.conf
</span></span><span style="display:flex;"><span>│   │   ├── authelia-location-basic.conf
</span></span><span style="display:flex;"><span>│   │   ├── authelia-location.conf
</span></span><span style="display:flex;"><span>│   │   ├── authelia-location-detect.conf
</span></span><span style="display:flex;"><span>│   │   └── proxy.conf
</span></span><span style="display:flex;"><span>│   ├── stream
</span></span><span style="display:flex;"><span>│   └── temp
</span></span><span style="display:flex;"><span>├── docker-compose.yml
</span></span><span style="display:flex;"><span>└── letsencrypt
</span></span><span style="display:flex;"><span>└── renewal-hooks
</span></span></code></pre></div>
</div>
<footer class="post-footer">
<ul class="post-tags">
<li><a href="../tags/git.html">Git</a></li>
<li><a href="../tags/backups.html">Backups</a></li>
<li><a href="../tags/commandline.html">Commandline</a></li>
</ul>
<nav class="paginav">
<a class="prev" href="../posts/hosting_hugo_troubles.html">
<span class="title">« Prev</span>
<br>
<span>Trouble Hosting Hugo with Nginx</span>
</a>
<a class="next" href="../posts/whiptail-first-merged-pr.html">
<span class="title">Next »</span>
<br>
<span>My First Merged PR!</span>
</a>
</nav>
<ul class="share-buttons">
<li>
<a target="_blank" rel="noopener noreferrer" aria-label="share Tutorial: Move from NginxProxyManager to Nginx on x"
href="https://x.com/intent/tweet/?text=Tutorial%3a%20Move%20from%20NginxProxyManager%20to%20Nginx&amp;url=%2fposts%2fnpm_to_nginx_tutorial.html&amp;hashtags=git%2cbackups%2ccommandline">
<svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor">
<path
d="M512 62.554 L 512 449.446 C 512 483.97 483.97 512 449.446 512 L 62.554 512 C 28.03 512 0 483.97 0 449.446 L 0 62.554 C 0 28.03 28.029 0 62.554 0 L 449.446 0 C 483.971 0 512 28.03 512 62.554 Z M 269.951 190.75 L 182.567 75.216 L 56 75.216 L 207.216 272.95 L 63.9 436.783 L 125.266 436.783 L 235.9 310.383 L 332.567 436.783 L 456 436.783 L 298.367 228.367 L 432.367 75.216 L 371.033 75.216 Z M 127.633 110 L 164.101 110 L 383.481 400.065 L 349.5 400.065 Z" />
</svg>
</a>
</li>
<li>
<a target="_blank" rel="noopener noreferrer" aria-label="share Tutorial: Move from NginxProxyManager to Nginx on linkedin"
href="https://www.linkedin.com/shareArticle?mini=true&amp;url=%2fposts%2fnpm_to_nginx_tutorial.html&amp;title=Tutorial%3a%20Move%20from%20NginxProxyManager%20to%20Nginx&amp;summary=Tutorial%3a%20Move%20from%20NginxProxyManager%20to%20Nginx&amp;source=%2fposts%2fnpm_to_nginx_tutorial.html">
<svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor">
<path
d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-386.892,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Zm-288.985,423.278l0,-225.717l-75.04,0l0,225.717l75.04,0Zm270.539,0l0,-129.439c0,-69.333 -37.018,-101.586 -86.381,-101.586c-39.804,0 -57.634,21.891 -67.617,37.266l0,-31.958l-75.021,0c0.995,21.181 0,225.717 0,225.717l75.02,0l0,-126.056c0,-6.748 0.486,-13.492 2.474,-18.315c5.414,-13.475 17.767,-27.434 38.494,-27.434c27.135,0 38.007,20.707 38.007,51.037l0,120.768l75.024,0Zm-307.552,-334.556c-25.674,0 -42.448,16.879 -42.448,39.002c0,21.658 16.264,39.002 41.455,39.002l0.484,0c26.165,0 42.452,-17.344 42.452,-39.002c-0.485,-22.092 -16.241,-38.954 -41.943,-39.002Z" />
</svg>
</a>
</li>
<li>
<a target="_blank" rel="noopener noreferrer" aria-label="share Tutorial: Move from NginxProxyManager to Nginx on reddit"
href="https://reddit.com/submit?url=%2fposts%2fnpm_to_nginx_tutorial.html&title=Tutorial%3a%20Move%20from%20NginxProxyManager%20to%20Nginx">
<svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor">
<path
d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-386.892,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Zm-3.446,265.638c0,-22.964 -18.616,-41.58 -41.58,-41.58c-11.211,0 -21.361,4.457 -28.841,11.666c-28.424,-20.508 -67.586,-33.757 -111.204,-35.278l18.941,-89.121l61.884,13.157c0.756,15.734 13.642,28.29 29.56,28.29c16.407,0 29.706,-13.299 29.706,-29.701c0,-16.403 -13.299,-29.702 -29.706,-29.702c-11.666,0 -21.657,6.792 -26.515,16.578l-69.105,-14.69c-1.922,-0.418 -3.939,-0.042 -5.585,1.036c-1.658,1.073 -2.811,2.761 -3.224,4.686l-21.152,99.438c-44.258,1.228 -84.046,14.494 -112.837,35.232c-7.468,-7.164 -17.589,-11.591 -28.757,-11.591c-22.965,0 -41.585,18.616 -41.585,41.58c0,16.896 10.095,31.41 24.568,37.918c-0.639,4.135 -0.99,8.328 -0.99,12.576c0,63.977 74.469,115.836 166.33,115.836c91.861,0 166.334,-51.859 166.334,-115.836c0,-4.218 -0.347,-8.387 -0.977,-12.493c14.564,-6.47 24.735,-21.034 24.735,-38.001Zm-119.474,108.193c-20.27,20.241 -59.115,21.816 -70.534,21.816c-11.428,0 -50.277,-1.575 -70.522,-21.82c-3.007,-3.008 -3.007,-7.882 0,-10.889c3.003,-2.999 7.882,-3.003 10.885,0c12.777,12.781 40.11,17.317 59.637,17.317c19.522,0 46.86,-4.536 59.657,-17.321c3.016,-2.999 7.886,-2.995 10.885,0.008c3.008,3.011 3.003,7.882 -0.008,10.889Zm-5.23,-48.781c-16.373,0 -29.701,-13.324 -29.701,-29.698c0,-16.381 13.328,-29.714 29.701,-29.714c16.378,0 29.706,13.333 29.706,29.714c0,16.374 -13.328,29.698 -29.706,29.698Zm-160.386,-29.702c0,-16.381 13.328,-29.71 29.714,-29.71c16.369,0 29.689,13.329 29.689,29.71c0,16.373 -13.32,29.693 -29.689,29.693c-16.386,0 -29.714,-13.32 -29.714,-29.693Z" />
</svg>
</a>
</li>
<li>
<a target="_blank" rel="noopener noreferrer" aria-label="share Tutorial: Move from NginxProxyManager to Nginx on facebook"
href="https://facebook.com/sharer/sharer.php?u=%2fposts%2fnpm_to_nginx_tutorial.html">
<svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor">
<path
d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-106.468,0l0,-192.915l66.6,0l12.672,-82.621l-79.272,0l0,-53.617c0,-22.603 11.073,-44.636 46.58,-44.636l36.042,0l0,-70.34c0,0 -32.71,-5.582 -63.982,-5.582c-65.288,0 -107.96,39.569 -107.96,111.204l0,62.971l-72.573,0l0,82.621l72.573,0l0,192.915l-191.104,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Z" />
</svg>
</a>
</li>
<li>
<a target="_blank" rel="noopener noreferrer" aria-label="share Tutorial: Move from NginxProxyManager to Nginx on whatsapp"
href="https://api.whatsapp.com/send?text=Tutorial%3a%20Move%20from%20NginxProxyManager%20to%20Nginx%20-%20%2fposts%2fnpm_to_nginx_tutorial.html">
<svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor">
<path
d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-386.892,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Zm-58.673,127.703c-33.842,-33.881 -78.847,-52.548 -126.798,-52.568c-98.799,0 -179.21,80.405 -179.249,179.234c-0.013,31.593 8.241,62.428 23.927,89.612l-25.429,92.884l95.021,-24.925c26.181,14.28 55.659,21.807 85.658,21.816l0.074,0c98.789,0 179.206,-80.413 179.247,-179.243c0.018,-47.895 -18.61,-92.93 -52.451,-126.81Zm-126.797,275.782l-0.06,0c-26.734,-0.01 -52.954,-7.193 -75.828,-20.767l-5.441,-3.229l-56.386,14.792l15.05,-54.977l-3.542,-5.637c-14.913,-23.72 -22.791,-51.136 -22.779,-79.287c0.033,-82.142 66.867,-148.971 149.046,-148.971c39.793,0.014 77.199,15.531 105.329,43.692c28.128,28.16 43.609,65.592 43.594,105.4c-0.034,82.149 -66.866,148.983 -148.983,148.984Zm81.721,-111.581c-4.479,-2.242 -26.499,-13.075 -30.604,-14.571c-4.105,-1.495 -7.091,-2.241 -10.077,2.241c-2.986,4.483 -11.569,14.572 -14.182,17.562c-2.612,2.988 -5.225,3.364 -9.703,1.12c-4.479,-2.241 -18.91,-6.97 -36.017,-22.23c-13.314,-11.876 -22.304,-26.542 -24.916,-31.026c-2.612,-4.484 -0.279,-6.908 1.963,-9.14c2.016,-2.007 4.48,-5.232 6.719,-7.847c2.24,-2.615 2.986,-4.484 4.479,-7.472c1.493,-2.99 0.747,-5.604 -0.374,-7.846c-1.119,-2.241 -10.077,-24.288 -13.809,-33.256c-3.635,-8.733 -7.327,-7.55 -10.077,-7.688c-2.609,-0.13 -5.598,-0.158 -8.583,-0.158c-2.986,0 -7.839,1.121 -11.944,5.604c-4.105,4.484 -15.675,15.32 -15.675,37.364c0,22.046 16.048,43.342 18.287,46.332c2.24,2.99 31.582,48.227 76.511,67.627c10.685,4.615 19.028,7.371 25.533,9.434c10.728,3.41 20.492,2.929 28.209,1.775c8.605,-1.285 26.499,-10.833 30.231,-21.295c3.732,-10.464 3.732,-19.431 2.612,-21.298c-1.119,-1.869 -4.105,-2.99 -8.583,-5.232Z" />
</svg>
</a>
</li>
<li>
<a target="_blank" rel="noopener noreferrer" aria-label="share Tutorial: Move from NginxProxyManager to Nginx on telegram"
href="https://telegram.me/share/url?text=Tutorial%3a%20Move%20from%20NginxProxyManager%20to%20Nginx&amp;url=%2fposts%2fnpm_to_nginx_tutorial.html">
<svg version="1.1" xml:space="preserve" viewBox="2 2 28 28" height="30px" width="30px" fill="currentColor">
<path
d="M26.49,29.86H5.5a3.37,3.37,0,0,1-2.47-1,3.35,3.35,0,0,1-1-2.47V5.48A3.36,3.36,0,0,1,3,3,3.37,3.37,0,0,1,5.5,2h21A3.38,3.38,0,0,1,29,3a3.36,3.36,0,0,1,1,2.46V26.37a3.35,3.35,0,0,1-1,2.47A3.38,3.38,0,0,1,26.49,29.86Zm-5.38-6.71a.79.79,0,0,0,.85-.66L24.73,9.24a.55.55,0,0,0-.18-.46.62.62,0,0,0-.41-.17q-.08,0-16.53,6.11a.59.59,0,0,0-.41.59.57.57,0,0,0,.43.52l4,1.24,1.61,4.83a.62.62,0,0,0,.63.43.56.56,0,0,0,.4-.17L16.54,20l4.09,3A.9.9,0,0,0,21.11,23.15ZM13.8,20.71l-1.21-4q8.72-5.55,8.78-5.55c.15,0,.23,0,.23.16a.18.18,0,0,1,0,.06s-2.51,2.3-7.52,6.8Z" />
</svg>
</a>
</li>
<li>
<a target="_blank" rel="noopener noreferrer" aria-label="share Tutorial: Move from NginxProxyManager to Nginx on ycombinator"
href="https://news.ycombinator.com/submitlink?t=Tutorial%3a%20Move%20from%20NginxProxyManager%20to%20Nginx&u=%2fposts%2fnpm_to_nginx_tutorial.html">
<svg version="1.1" xml:space="preserve" width="30px" height="30px" viewBox="0 0 512 512" fill="currentColor"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
<path
d="M449.446 0C483.971 0 512 28.03 512 62.554L512 449.446C512 483.97 483.97 512 449.446 512L62.554 512C28.03 512 0 483.97 0 449.446L0 62.554C0 28.03 28.029 0 62.554 0L449.446 0ZM183.8767 87.9921H121.8427L230.6673 292.4508V424.0079H281.3328V292.4508L390.1575 87.9921H328.1233L256 238.2489z" />
</svg>
</a>
</li>
</ul>
</footer>
</article>
</main>
<footer class="footer">
<span>&copy; 2024 <a href="../">Norm-working Packets 💾</a></span>
<span>
Powered by
<a href="https://gohugo.io/" rel="noopener noreferrer" target="_blank">Hugo</a> &
<a href="https://github.com/adityatelange/hugo-PaperMod/" rel="noopener" target="_blank">PaperMod</a>
</span>
</footer>
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
<path d="M12 6H0l6-6z" />
</svg>
</a>
<script>
let menu = document.getElementById('menu')
if (menu) {
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
menu.onscroll = function () {
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
}
}
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener("click", function (e) {
e.preventDefault();
var id = this.getAttribute("href").substr(1);
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
behavior: "smooth"
});
} else {
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
}
if (id === "top") {
history.replaceState(null, null, " ");
} else {
history.pushState(null, null, `#${id}`);
}
});
});
</script>
<script>
var mybutton = document.getElementById("top-link");
window.onscroll = function () {
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
mybutton.style.visibility = "visible";
mybutton.style.opacity = "1";
} else {
mybutton.style.visibility = "hidden";
mybutton.style.opacity = "0";
}
};
</script>
<script>
document.getElementById("theme-toggle").addEventListener("click", () => {
if (document.body.className.includes("dark")) {
document.body.classList.remove('dark');
localStorage.setItem("pref-theme", 'light');
} else {
document.body.classList.add('dark');
localStorage.setItem("pref-theme", 'dark');
}
})
</script>
<script>
document.querySelectorAll('pre > code').forEach((codeblock) => {
const container = codeblock.parentNode.parentNode;
const copybutton = document.createElement('button');
copybutton.classList.add('copy-code');
copybutton.innerHTML = 'copy';
function copyingDone() {
copybutton.innerHTML = 'copied!';
setTimeout(() => {
copybutton.innerHTML = 'copy';
}, 2000);
}
copybutton.addEventListener('click', (cb) => {
if ('clipboard' in navigator) {
navigator.clipboard.writeText(codeblock.textContent);
copyingDone();
return;
}
const range = document.createRange();
range.selectNodeContents(codeblock);
const selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
try {
document.execCommand('copy');
copyingDone();
} catch (e) { };
selection.removeRange(range);
});
if (container.classList.contains("highlight")) {
container.appendChild(copybutton);
} else if (container.parentNode.firstChild == container) {
} else if (codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.nodeName == "TABLE") {
codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.appendChild(copybutton);
} else {
codeblock.parentNode.appendChild(copybutton);
}
});
</script>
</body>
</html>