Replace docs vuepress with vitepress
15
docs/.gitignore
vendored
@ -1,5 +1,14 @@
|
|||||||
.vuepress/dist
|
dist
|
||||||
node_modules
|
node_modules
|
||||||
ts
|
ts
|
||||||
api.md
|
.temp
|
||||||
api/
|
.cache
|
||||||
|
.vitepress/cache
|
||||||
|
|
||||||
|
.yarn/*
|
||||||
|
!.yarn/releases
|
||||||
|
!.yarn/plugins
|
||||||
|
!.yarn/sdks
|
||||||
|
!.yarn/versions
|
||||||
|
*.gz
|
||||||
|
*.tgz
|
||||||
|
62
docs/.vitepress/config.mts
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
import { defineConfig, type DefaultTheme } from 'vitepress';
|
||||||
|
|
||||||
|
// https://vitepress.dev/reference/site-config
|
||||||
|
export default defineConfig({
|
||||||
|
title: "Nginx Proxy Manager",
|
||||||
|
description: "Expose your services easily and securely",
|
||||||
|
head: [
|
||||||
|
["link", { rel: "icon", href: "/icon.png" }],
|
||||||
|
["meta", { name: "description", content: "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt" }],
|
||||||
|
["meta", { property: "og:title", content: "Nginx Proxy Manager" }],
|
||||||
|
["meta", { property: "og:description", content: "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt"}],
|
||||||
|
["meta", { property: "og:type", content: "website" }],
|
||||||
|
["meta", { property: "og:url", content: "https://nginxproxymanager.com/" }],
|
||||||
|
["meta", { property: "og:image", content: "https://nginxproxymanager.com/icon.png" }],
|
||||||
|
["meta", { name: "twitter:card", content: "summary"}],
|
||||||
|
["meta", { name: "twitter:title", content: "Nginx Proxy Manager"}],
|
||||||
|
["meta", { name: "twitter:description", content: "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt"}],
|
||||||
|
["meta", { name: "twitter:image", content: "https://nginxproxymanager.com/icon.png"}],
|
||||||
|
["meta", { name: "twitter:alt", content: "Nginx Proxy Manager"}],
|
||||||
|
// GA
|
||||||
|
['script', { async: 'true', src: 'https://www.googletagmanager.com/gtag/js?id=G-TXT8F5WY5B'}],
|
||||||
|
['script', {}, "window.dataLayer = window.dataLayer || [];\nfunction gtag(){dataLayer.push(arguments);}\ngtag('js', new Date());\ngtag('config', 'G-TXT8F5WY5B');"],
|
||||||
|
],
|
||||||
|
sitemap: {
|
||||||
|
hostname: 'https://nginxproxymanager.com'
|
||||||
|
},
|
||||||
|
metaChunk: true,
|
||||||
|
srcDir: './src',
|
||||||
|
outDir: './dist',
|
||||||
|
themeConfig: {
|
||||||
|
// https://vitepress.dev/reference/default-theme-config
|
||||||
|
logo: { src: '/logo.svg', width: 24, height: 24 },
|
||||||
|
nav: [
|
||||||
|
{ text: 'Setup', link: '/setup/' },
|
||||||
|
],
|
||||||
|
sidebar: [
|
||||||
|
{
|
||||||
|
items: [
|
||||||
|
// { text: 'Home', link: '/' },
|
||||||
|
{ text: 'Guide', link: '/guide/' },
|
||||||
|
{ text: 'Screenshots', link: '/screenshots/' },
|
||||||
|
{ text: 'Setup Instructions', link: '/setup/' },
|
||||||
|
{ text: 'Advanced Configuration', link: '/advanced-config/' },
|
||||||
|
{ text: 'Upgrading', link: '/upgrading/' },
|
||||||
|
{ text: 'Frequently Asked Questions', link: '/faq/' },
|
||||||
|
{ text: 'Third Party', link: '/third-party/' },
|
||||||
|
{ text: 'Development', link: '/development/' },
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
socialLinks: [
|
||||||
|
{ icon: 'github', link: 'https://github.com/NginxProxyManager/nginx-proxy-manager' }
|
||||||
|
],
|
||||||
|
search: {
|
||||||
|
provider: 'local'
|
||||||
|
},
|
||||||
|
footer: {
|
||||||
|
message: 'Released under the MIT License.',
|
||||||
|
copyright: 'Copyright © 2016-present jc21.com'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
27
docs/.vitepress/theme/custom.css
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
:root {
|
||||||
|
--vp-home-hero-name-color: transparent;
|
||||||
|
--vp-home-hero-name-background: -webkit-linear-gradient(120deg, #f15833 30%, #FAA42F);
|
||||||
|
|
||||||
|
--vp-home-hero-image-background-image: linear-gradient(-45deg, #aaaaaa 50%, #777777 50%);
|
||||||
|
--vp-home-hero-image-filter: blur(44px);
|
||||||
|
|
||||||
|
--vp-c-brand-1: #f15833;
|
||||||
|
--vp-c-brand-2: #FAA42F;
|
||||||
|
--vp-c-brand-3: #f15833;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 640px) {
|
||||||
|
:root {
|
||||||
|
--vp-home-hero-image-filter: blur(56px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 960px) {
|
||||||
|
:root {
|
||||||
|
--vp-home-hero-image-filter: blur(68px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.inline-img img {
|
||||||
|
display: inline;
|
||||||
|
}
|
4
docs/.vitepress/theme/index.ts
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
import DefaultTheme from 'vitepress/theme'
|
||||||
|
import './custom.css'
|
||||||
|
|
||||||
|
export default DefaultTheme
|
@ -1,83 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
locales: {
|
|
||||||
"/": {
|
|
||||||
lang: "en-US",
|
|
||||||
title: "Nginx Proxy Manager",
|
|
||||||
description: "Expose your services easily and securely"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
head: [
|
|
||||||
["link", { rel: "icon", href: "/icon.png" }],
|
|
||||||
["meta", { name: "description", content: "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt" }],
|
|
||||||
["meta", { property: "og:title", content: "Nginx Proxy Manager" }],
|
|
||||||
["meta", { property: "og:description", content: "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt"}],
|
|
||||||
["meta", { property: "og:type", content: "website" }],
|
|
||||||
["meta", { property: "og:url", content: "https://nginxproxymanager.com/" }],
|
|
||||||
["meta", { property: "og:image", content: "https://nginxproxymanager.com/icon.png" }],
|
|
||||||
["meta", { name: "twitter:card", content: "summary"}],
|
|
||||||
["meta", { name: "twitter:title", content: "Nginx Proxy Manager"}],
|
|
||||||
["meta", { name: "twitter:description", content: "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt"}],
|
|
||||||
["meta", { name: "twitter:image", content: "https://nginxproxymanager.com/icon.png"}],
|
|
||||||
["meta", { name: "twitter:alt", content: "Nginx Proxy Manager"}],
|
|
||||||
],
|
|
||||||
themeConfig: {
|
|
||||||
logo: "/icon.png",
|
|
||||||
// the GitHub repo path
|
|
||||||
repo: "jc21/nginx-proxy-manager",
|
|
||||||
// the label linking to the repo
|
|
||||||
repoLabel: "GitHub",
|
|
||||||
// if your docs are not at the root of the repo:
|
|
||||||
docsDir: "docs",
|
|
||||||
// defaults to false, set to true to enable
|
|
||||||
editLinks: true,
|
|
||||||
locales: {
|
|
||||||
"/": {
|
|
||||||
// text for the language dropdown
|
|
||||||
selectText: "Languages",
|
|
||||||
// label for this locale in the language dropdown
|
|
||||||
label: "English",
|
|
||||||
// Custom text for edit link. Defaults to "Edit this page"
|
|
||||||
editLinkText: "Edit this page on GitHub",
|
|
||||||
// Custom navbar values
|
|
||||||
nav: [{ text: "Setup", link: "/setup/" }, { text: "API", link: "/api/index.html" }],
|
|
||||||
// Custom sidebar values
|
|
||||||
sidebar: [
|
|
||||||
"/",
|
|
||||||
["/guide/", "Guide"],
|
|
||||||
["/screenshots/", "Screenshots"],
|
|
||||||
["/setup/", "Setup Instructions"],
|
|
||||||
["/advanced-config/", "Advanced Configuration"],
|
|
||||||
["/upgrading/", "Upgrading"],
|
|
||||||
["/faq/", "Frequently Asked Questions"],
|
|
||||||
["/third-party/", "Third Party"],
|
|
||||||
["/dev-notes/", "Development Notes"]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
plugins: [
|
|
||||||
[
|
|
||||||
"@vuepress/google-analytics",
|
|
||||||
{
|
|
||||||
ga: "UA-99675467-4"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"sitemap",
|
|
||||||
{
|
|
||||||
hostname: "https://nginxproxymanager.com"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'vuepress-plugin-zooming',
|
|
||||||
{
|
|
||||||
selector: '.zooming',
|
|
||||||
delay: 1000,
|
|
||||||
options: {
|
|
||||||
bgColor: 'black',
|
|
||||||
zIndex: 10000,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
]
|
|
||||||
};
|
|
Before Width: | Height: | Size: 57 KiB |
@ -1,23 +0,0 @@
|
|||||||
.home .hero img
|
|
||||||
max-width: 500px !important
|
|
||||||
min-width: 300px
|
|
||||||
width: 100%
|
|
||||||
|
|
||||||
.center
|
|
||||||
margin 0 auto;
|
|
||||||
width: 80%
|
|
||||||
|
|
||||||
#main-title
|
|
||||||
display: none
|
|
||||||
|
|
||||||
.hero
|
|
||||||
margin: 150px 25px 70px
|
|
||||||
|
|
||||||
@font-face
|
|
||||||
font-family: 'Nerd Font';
|
|
||||||
src: url("/nerd-font.woff2") format("woff2");
|
|
||||||
font-weight: 400;
|
|
||||||
font-style: normal
|
|
||||||
|
|
||||||
code
|
|
||||||
font-family: 'Nerd Font', source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace;
|
|
@ -1,4 +0,0 @@
|
|||||||
$accentColor = #f15833
|
|
||||||
$textColor = #663015
|
|
||||||
$borderColor = #eaecef
|
|
||||||
$codeBgColor = #282c34
|
|
@ -1,73 +0,0 @@
|
|||||||
---
|
|
||||||
home: true
|
|
||||||
heroImage: /logo.png
|
|
||||||
actionText: Get Started →
|
|
||||||
actionLink: /guide/
|
|
||||||
footer: MIT Licensed | Copyright © 2016-2021 jc21.com
|
|
||||||
---
|
|
||||||
|
|
||||||
<div class="features">
|
|
||||||
<div class="feature">
|
|
||||||
<h2>Get Connected</h2>
|
|
||||||
<p>
|
|
||||||
Expose web services on your network ·
|
|
||||||
Free SSL with Let's Encrypt ·
|
|
||||||
Designed with security in mind ·
|
|
||||||
Perfect for home networks
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="feature">
|
|
||||||
<h2>Proxy Hosts</h2>
|
|
||||||
<p>Expose your private network Web services and get connected anywhere.</p>
|
|
||||||
</div>
|
|
||||||
<div class="feature">
|
|
||||||
<h2>Beautiful UI</h2>
|
|
||||||
<p>Based on Tabler, the interface is a pleasure to use. Configuring a server has never been so fun.</p>
|
|
||||||
</div>
|
|
||||||
<div class="feature">
|
|
||||||
<h2>Free SSL</h2>
|
|
||||||
<p>Built in Let’s Encrypt support allows you to secure your Web services at no cost to you. The certificates even renew themselves!</p>
|
|
||||||
</div>
|
|
||||||
<div class="feature">
|
|
||||||
<h2>Docker FTW</h2>
|
|
||||||
<p>Built as a Docker Image, Nginx Proxy Manager only requires a database.</p>
|
|
||||||
</div>
|
|
||||||
<div class="feature">
|
|
||||||
<h2>Multiple Users</h2>
|
|
||||||
<p>Configure other users to either view or manage their own hosts. Full access permissions are available.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
### Quick Setup
|
|
||||||
|
|
||||||
1. Install Docker and Docker-Compose
|
|
||||||
|
|
||||||
- [Docker Install documentation](https://docs.docker.com/install/)
|
|
||||||
- [Docker-Compose Install documentation](https://docs.docker.com/compose/install/)
|
|
||||||
|
|
||||||
2. Create a docker-compose.yml file similar to this:
|
|
||||||
|
|
||||||
```yml
|
|
||||||
version: '3'
|
|
||||||
services:
|
|
||||||
app:
|
|
||||||
image: 'jc21/nginx-proxy-manager:3'
|
|
||||||
ports:
|
|
||||||
- '80:80'
|
|
||||||
- '81:81'
|
|
||||||
- '443:443'
|
|
||||||
volumes:
|
|
||||||
- ./data:/data
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Bring up your stack
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
4. Log in to the Admin UI
|
|
||||||
|
|
||||||
When your docker container is running, connect to it on port `81` for the admin interface.
|
|
||||||
|
|
||||||
[http://127.0.0.1:81](http://127.0.0.1:81)
|
|
@ -1,48 +0,0 @@
|
|||||||
# Development Notes
|
|
||||||
|
|
||||||
Requesting a SSL Certificate is a complicated process to understand.
|
|
||||||
|
|
||||||
This is an explanation of how the ACME standard of certificates works.
|
|
||||||
|
|
||||||
## Certificate Request via HTTP validation
|
|
||||||
|
|
||||||
1. You define `website.example.com` DNS record to point to `123.45.67.89`
|
|
||||||
2. You ask a Certificate Authority to give you a Certificate and initiate validation from their side
|
|
||||||
3. The CA gives you a token, and you should be running a http-only webserver on `123.45.67.89` that returns this token
|
|
||||||
4. The CA makes a request to your domain `http://website.example.com/.well-known/acme-challenge/` and gets the token
|
|
||||||
5. If the CA thinks the token matches, they issue you the certificates.
|
|
||||||
|
|
||||||
## Certificate Request via DNS validation
|
|
||||||
|
|
||||||
1. You ask a Certificate Authority to give you a Certificate and initiate validation from their side
|
|
||||||
2. The CA gives you a token, and you update the DNS records on your domain with this token
|
|
||||||
3. The CA checks the DNS record, with a timeout waiting for propagation
|
|
||||||
4. If the CA thinks the token matches, they issue you the certificates.
|
|
||||||
|
|
||||||
## ACME DNS in an isolated test environment
|
|
||||||
|
|
||||||
### Local CA
|
|
||||||
|
|
||||||
In order to have a local ACME compatible CA that you can control, you have 2 options:
|
|
||||||
|
|
||||||
- pebble by Letsencrypt
|
|
||||||
- stepca by Step
|
|
||||||
|
|
||||||
stepca is better as it has better DNS Acme validation support.
|
|
||||||
|
|
||||||
### Local DNS Provider
|
|
||||||
|
|
||||||
PowerDNS is a really good, free DNS server and acme.sh has support for it.
|
|
||||||
|
|
||||||
### Getting things to work together
|
|
||||||
|
|
||||||
Since your don't really own `website.example.com` and if you hit it with your system DNS
|
|
||||||
it will fail, you'll need to use a custom DNS responder to return an A record for this
|
|
||||||
that points to your running NPM gateway. My [dnsrouter](https://github.com/jc21/dnsrouter)
|
|
||||||
project accomplishes this nicely. After this is setup, as long as the resolv.conf points
|
|
||||||
to this dns responder, the resolution should work locally.
|
|
||||||
|
|
||||||
1. You ask the stepca CA to give you a Certificate and initiate validation
|
|
||||||
2. The CA returns a token, and you update the PDNS records on your domain with this token
|
|
||||||
3. The CA checks the DNS record, with a timeout waiting for propagation
|
|
||||||
4. If the CA thinks the token matches, they issue you the certificates.
|
|
@ -1,23 +0,0 @@
|
|||||||
# FAQ
|
|
||||||
|
|
||||||
## Do I have to use Docker?
|
|
||||||
|
|
||||||
Yes, that's how this project is packaged.
|
|
||||||
|
|
||||||
This makes it easier to support the project when I have control over the version of Nginx and NodeJS
|
|
||||||
being used. In future this could change if the backend was no longer using NodeJS and it's long list
|
|
||||||
of dependencies.
|
|
||||||
|
|
||||||
|
|
||||||
## Can I run it on a Raspberry Pi?
|
|
||||||
|
|
||||||
Yes! The docker image is multi-arch and is built for a variety of architectures. If yours is
|
|
||||||
[not listed](https://hub.docker.com/r/jc21/nginx-proxy-manager/tags) please open a
|
|
||||||
[GitHub issue](https://github.com/jc21/nginx-proxy-manager/issues/new?assignees=&labels=enhancement&template=feature_request.md&title=).
|
|
||||||
|
|
||||||
## I can't get my service to proxy properly?
|
|
||||||
|
|
||||||
Your best bet is to ask the [Reddit community for support](https://www.reddit.com/r/nginxproxymanager/). There's safety in numbers.
|
|
||||||
|
|
||||||
Gitter is best left for anyone contributing to the project to ask for help about internals, code reviews etc.
|
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
../../README.md
|
|
@ -1,777 +1,11 @@
|
|||||||
{
|
{
|
||||||
"name": "docs",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"description": "",
|
|
||||||
"main": "index.js",
|
|
||||||
"dependencies": {
|
|
||||||
"@vuepress/plugin-google-analytics": "^1.9.10",
|
|
||||||
"abbrev": "^2.0.0",
|
|
||||||
"accepts": "^1.3.8",
|
|
||||||
"acorn": "^8.11.3",
|
|
||||||
"agentkeepalive": "^4.5.0",
|
|
||||||
"ajv": "^8.13.0",
|
|
||||||
"ajv-errors": "^3.0.0",
|
|
||||||
"ajv-keywords": "^5.1.0",
|
|
||||||
"algoliasearch": "^4.23.3",
|
|
||||||
"alphanum-sort": "^1.0.2",
|
|
||||||
"ansi-colors": "^4.1.3",
|
|
||||||
"ansi-escapes": "^7.0.0",
|
|
||||||
"ansi-html": "^0.0.9",
|
|
||||||
"ansi-regex": "^6.0.1",
|
|
||||||
"ansi-styles": "^6.2.1",
|
|
||||||
"anymatch": "^3.1.3",
|
|
||||||
"aproba": "^2.0.0",
|
|
||||||
"argparse": "^2.0.1",
|
|
||||||
"arr-diff": "^4.0.0",
|
|
||||||
"arr-flatten": "^1.1.0",
|
|
||||||
"arr-union": "^3.1.0",
|
|
||||||
"array-flatten": "^3.0.0",
|
|
||||||
"array-union": "^3.0.1",
|
|
||||||
"array-uniq": "^3.0.0",
|
|
||||||
"array-unique": "^0.3.2",
|
|
||||||
"asn1": "^0.2.6",
|
|
||||||
"asn1.js": "^5.4.1",
|
|
||||||
"assert": "^2.1.0",
|
|
||||||
"assert-plus": "^1.0.0",
|
|
||||||
"assign-symbols": "^2.0.2",
|
|
||||||
"async": "^3.2.5",
|
|
||||||
"async-each": "^1.0.6",
|
|
||||||
"async-limiter": "^2.0.0",
|
|
||||||
"asynckit": "^0.4.0",
|
|
||||||
"atob": "^2.1.2",
|
|
||||||
"autocomplete.js": "^0.38.1",
|
|
||||||
"autoprefixer": "^10.4.19",
|
|
||||||
"aws-sign2": "^0.7.0",
|
|
||||||
"aws4": "^1.12.0",
|
|
||||||
"babel-loader": "^9.1.3",
|
|
||||||
"babel-plugin-dynamic-import-node": "^2.3.3",
|
|
||||||
"babel-plugin-module-resolver": "^5.0.2",
|
|
||||||
"balanced-match": "^3.0.1",
|
|
||||||
"base": "^3.0.0",
|
|
||||||
"base64-js": "^1.5.1",
|
|
||||||
"batch": "^0.6.1",
|
|
||||||
"bcrypt-pbkdf": "^1.0.2",
|
|
||||||
"big.js": "^6.2.1",
|
|
||||||
"binary-extensions": "^3.0.0",
|
|
||||||
"bluebird": "^3.7.2",
|
|
||||||
"bn.js": "^5.2.1",
|
|
||||||
"body-parser": "^1.20.2",
|
|
||||||
"bonjour": "^3.5.0",
|
|
||||||
"boolbase": "^1.0.0",
|
|
||||||
"brace-expansion": "^4.0.0",
|
|
||||||
"braces": "^3.0.2",
|
|
||||||
"brorand": "^1.1.0",
|
|
||||||
"browserify-aes": "^1.2.0",
|
|
||||||
"browserify-cipher": "^1.0.1",
|
|
||||||
"browserify-des": "^1.0.2",
|
|
||||||
"browserify-rsa": "^4.1.0",
|
|
||||||
"browserify-sign": "^4.2.3",
|
|
||||||
"browserify-zlib": "^0.2.0",
|
|
||||||
"browserslist": "^4.23.0",
|
|
||||||
"buffer": "^6.0.3",
|
|
||||||
"buffer-from": "^1.1.2",
|
|
||||||
"buffer-indexof": "^1.1.1",
|
|
||||||
"buffer-json": "^2.0.0",
|
|
||||||
"buffer-xor": "^2.0.2",
|
|
||||||
"builtin-status-codes": "^3.0.0",
|
|
||||||
"bytes": "^3.1.2",
|
|
||||||
"cac": "^6.7.14",
|
|
||||||
"cacache": "^18.0.3",
|
|
||||||
"cache-base": "^4.0.2",
|
|
||||||
"cache-loader": "^4.1.0",
|
|
||||||
"call-me-maybe": "^1.0.2",
|
|
||||||
"caller-callsite": "^5.0.0",
|
|
||||||
"caller-path": "^4.0.0",
|
|
||||||
"callsites": "^4.1.0",
|
|
||||||
"camel-case": "^4.1.2",
|
|
||||||
"camelcase": "^8.0.0",
|
|
||||||
"caniuse-api": "^3.0.0",
|
|
||||||
"caniuse-lite": "^1.0.30001616",
|
|
||||||
"caseless": "^0.12.0",
|
|
||||||
"chalk": "^5.3.0",
|
|
||||||
"chokidar": "^3.6.0",
|
|
||||||
"chownr": "^3.0.0",
|
|
||||||
"chrome-trace-event": "^1.0.3",
|
|
||||||
"ci-info": "^4.0.0",
|
|
||||||
"cipher-base": "^1.0.4",
|
|
||||||
"class-utils": "^0.3.6",
|
|
||||||
"clean-css": "^5.3.3",
|
|
||||||
"clipboard": "^2.0.11",
|
|
||||||
"cliui": "^8.0.1",
|
|
||||||
"coa": "^2.0.2",
|
|
||||||
"code-point-at": "^1.1.0",
|
|
||||||
"collection-visit": "^1.0.0",
|
|
||||||
"color": "^4.2.3",
|
|
||||||
"color-convert": "^2.0.1",
|
|
||||||
"color-name": "^2.0.0",
|
|
||||||
"color-string": "^1.9.1",
|
|
||||||
"combined-stream": "^1.0.8",
|
|
||||||
"commander": "^12.0.0",
|
|
||||||
"commondir": "^1.0.1",
|
|
||||||
"component-emitter": "^2.0.0",
|
|
||||||
"compressible": "^2.0.18",
|
|
||||||
"compression": "^1.7.4",
|
|
||||||
"concat-map": "^0.0.2",
|
|
||||||
"concat-stream": "^2.0.0",
|
|
||||||
"connect-history-api-fallback": "^2.0.0",
|
|
||||||
"consola": "^3.2.3",
|
|
||||||
"console-browserify": "^1.2.0",
|
|
||||||
"consolidate": "^1.0.3",
|
|
||||||
"constants-browserify": "^1.0.0",
|
|
||||||
"content-disposition": "^0.5.4",
|
|
||||||
"content-type": "^1.0.5",
|
|
||||||
"convert-source-map": "^2.0.0",
|
|
||||||
"cookie": "^0.6.0",
|
|
||||||
"cookie-signature": "^1.2.1",
|
|
||||||
"copy-concurrently": "^1.0.5",
|
|
||||||
"copy-descriptor": "^0.1.1",
|
|
||||||
"copy-webpack-plugin": "^12.0.2",
|
|
||||||
"core-js": "^3.37.0",
|
|
||||||
"core-util-is": "^1.0.3",
|
|
||||||
"cosmiconfig": "^9.0.0",
|
|
||||||
"create-ecdh": "^4.0.4",
|
|
||||||
"create-hash": "^1.2.0",
|
|
||||||
"create-hmac": "^1.1.7",
|
|
||||||
"cross-spawn": "^7.0.3",
|
|
||||||
"crypto-browserify": "^3.12.0",
|
|
||||||
"css": "^3.0.0",
|
|
||||||
"css-color-names": "^1.0.1",
|
|
||||||
"css-declaration-sorter": "^7.2.0",
|
|
||||||
"css-loader": "^7.1.1",
|
|
||||||
"css-parse": "^2.0.0",
|
|
||||||
"css-select": "^5.1.0",
|
|
||||||
"css-select-base-adapter": "^0.1.1",
|
|
||||||
"css-tree": "^2.3.1",
|
|
||||||
"css-unit-converter": "^1.1.2",
|
|
||||||
"css-what": "^6.1.0",
|
|
||||||
"cssesc": "^3.0.0",
|
|
||||||
"cssnano": "^7.0.1",
|
|
||||||
"cssnano-preset-default": "^7.0.1",
|
|
||||||
"cssnano-util-get-arguments": "^4.0.0",
|
|
||||||
"cssnano-util-get-match": "^4.0.0",
|
|
||||||
"cssnano-util-raw-cache": "^4.0.1",
|
|
||||||
"cssnano-util-same-parent": "^4.0.1",
|
|
||||||
"csso": "^5.0.5",
|
|
||||||
"cyclist": "^1.0.2",
|
|
||||||
"dashdash": "^2.0.0",
|
|
||||||
"de-indent": "^1.0.2",
|
|
||||||
"debug": "^4.3.4",
|
|
||||||
"decamelize": "^6.0.0",
|
|
||||||
"decode-uri-component": "^0.4.1",
|
|
||||||
"deep-equal": "^2.2.3",
|
|
||||||
"deepmerge": "^4.3.1",
|
|
||||||
"default-gateway": "^7.2.2",
|
|
||||||
"define-properties": "^1.2.1",
|
|
||||||
"define-property": "^2.0.2",
|
|
||||||
"del": "^7.1.0",
|
|
||||||
"delayed-stream": "^1.0.0",
|
|
||||||
"delegate": "^3.2.0",
|
|
||||||
"depd": "^2.0.0",
|
|
||||||
"des.js": "^1.1.0",
|
|
||||||
"destroy": "^1.2.0",
|
|
||||||
"detect-node": "^2.1.0",
|
|
||||||
"diacritics": "^1.3.0",
|
|
||||||
"diffie-hellman": "^5.0.3",
|
|
||||||
"dir-glob": "^3.0.1",
|
|
||||||
"dns-equal": "^1.0.0",
|
|
||||||
"dns-packet": "^5.6.1",
|
|
||||||
"dns-txt": "^2.0.2",
|
|
||||||
"docsearch.js": "^2.6.3",
|
|
||||||
"dom-converter": "^0.2.0",
|
|
||||||
"dom-serializer": "^2.0.0",
|
|
||||||
"dom-walk": "^0.1.2",
|
|
||||||
"domain-browser": "^5.7.0",
|
|
||||||
"domelementtype": "^2.3.0",
|
|
||||||
"domhandler": "^5.0.3",
|
|
||||||
"domutils": "^3.1.0",
|
|
||||||
"dot-prop": "^8.0.2",
|
|
||||||
"duplexify": "^4.1.3",
|
|
||||||
"ecc-jsbn": "^0.2.0",
|
|
||||||
"ee-first": "^1.1.1",
|
|
||||||
"electron-to-chromium": "^1.4.758",
|
|
||||||
"elliptic": "^6.5.5",
|
|
||||||
"emoji-regex": "^10.3.0",
|
|
||||||
"emojis-list": "^3.0.0",
|
|
||||||
"encodeurl": "^2.0.0",
|
|
||||||
"end-of-stream": "^1.4.4",
|
|
||||||
"enhanced-resolve": "^5.16.1",
|
|
||||||
"entities": "^4.5.0",
|
|
||||||
"envify": "^4.1.0",
|
|
||||||
"envinfo": "^7.13.0",
|
|
||||||
"errno": "^1.0.0",
|
|
||||||
"error-ex": "^1.3.2",
|
|
||||||
"es-abstract": "^1.23.3",
|
|
||||||
"es-to-primitive": "^1.2.1",
|
|
||||||
"es6-promise": "^4.2.8",
|
|
||||||
"escape-html": "^1.0.3",
|
|
||||||
"escape-string-regexp": "^5.0.0",
|
|
||||||
"eslint-scope": "^8.0.1",
|
|
||||||
"esprima": "^4.0.1",
|
|
||||||
"esrecurse": "^4.3.0",
|
|
||||||
"estraverse": "^5.3.0",
|
|
||||||
"esutils": "^2.0.3",
|
|
||||||
"etag": "^1.8.1",
|
|
||||||
"eventemitter3": "^5.0.1",
|
|
||||||
"events": "^3.3.0",
|
|
||||||
"eventsource": "^2.0.2",
|
|
||||||
"evp_bytestokey": "^1.0.3",
|
|
||||||
"execa": "^8.0.1",
|
|
||||||
"expand-brackets": "^4.0.0",
|
|
||||||
"express": "^4.19.2",
|
|
||||||
"extend": "^3.0.2",
|
|
||||||
"extend-shallow": "^3.0.2",
|
|
||||||
"extglob": "^3.0.0",
|
|
||||||
"extsprintf": "^1.4.1",
|
|
||||||
"fast-deep-equal": "^3.1.3",
|
|
||||||
"fast-glob": "^3.3.2",
|
|
||||||
"fast-json-stable-stringify": "^2.1.0",
|
|
||||||
"faye-websocket": "^0.11.4",
|
|
||||||
"figgy-pudding": "^3.5.2",
|
|
||||||
"figures": "^6.1.0",
|
|
||||||
"file-loader": "^6.2.0",
|
|
||||||
"fill-range": "^7.0.1",
|
|
||||||
"finalhandler": "^1.2.0",
|
|
||||||
"find-babel-config": "^2.1.1",
|
|
||||||
"find-cache-dir": "^5.0.0",
|
|
||||||
"find-up": "^7.0.0",
|
|
||||||
"flush-write-stream": "^2.0.0",
|
|
||||||
"follow-redirects": "^1.15.6",
|
|
||||||
"for-in": "^1.0.2",
|
|
||||||
"foreach": "^2.0.6",
|
|
||||||
"forever-agent": "^0.6.1",
|
|
||||||
"form-data": "^4.0.0",
|
|
||||||
"forwarded": "^0.2.0",
|
|
||||||
"fragment-cache": "^0.2.1",
|
|
||||||
"fresh": "^0.5.2",
|
|
||||||
"from2": "^2.3.0",
|
|
||||||
"fs-extra": "^11.2.0",
|
|
||||||
"fs-write-stream-atomic": "^1.0.10",
|
|
||||||
"fs.realpath": "^1.0.0",
|
|
||||||
"function-bind": "^1.1.2",
|
|
||||||
"gensync": "^1.0.0-beta.2",
|
|
||||||
"get-caller-file": "^2.0.5",
|
|
||||||
"get-stream": "^9.0.1",
|
|
||||||
"get-value": "^3.0.1",
|
|
||||||
"getpass": "^0.1.7",
|
|
||||||
"glob": "^10.3.12",
|
|
||||||
"glob-parent": "^6.0.2",
|
|
||||||
"glob-to-regexp": "^0.4.1",
|
|
||||||
"global": "^4.4.0",
|
|
||||||
"globals": "^15.1.0",
|
|
||||||
"globby": "^14.0.1",
|
|
||||||
"good-listener": "^1.2.2",
|
|
||||||
"graceful-fs": "^4.2.11",
|
|
||||||
"gray-matter": "^4.0.3",
|
|
||||||
"handle-thing": "^2.0.1",
|
|
||||||
"har-schema": "^2.0.0",
|
|
||||||
"har-validator": "^5.1.5",
|
|
||||||
"has": "^1.0.4",
|
|
||||||
"has-ansi": "^5.0.1",
|
|
||||||
"has-flag": "^5.0.1",
|
|
||||||
"has-symbols": "^1.0.3",
|
|
||||||
"has-value": "^2.0.2",
|
|
||||||
"has-values": "^2.0.1",
|
|
||||||
"hash-base": "^3.1.0",
|
|
||||||
"hash-sum": "^2.0.0",
|
|
||||||
"hash.js": "^1.1.7",
|
|
||||||
"he": "^1.2.0",
|
|
||||||
"hex-color-regex": "^1.1.0",
|
|
||||||
"hmac-drbg": "^1.0.1",
|
|
||||||
"hogan.js": "^3.0.2",
|
|
||||||
"hpack.js": "^2.1.6",
|
|
||||||
"hsl-regex": "^1.0.0",
|
|
||||||
"hsla-regex": "^1.0.0",
|
|
||||||
"html-comment-regex": "^1.1.2",
|
|
||||||
"html-entities": "^2.5.2",
|
|
||||||
"html-minifier": "^4.0.0",
|
|
||||||
"html-tags": "^4.0.0",
|
|
||||||
"htmlparser2": "^9.1.0",
|
|
||||||
"http-deceiver": "^1.2.7",
|
|
||||||
"http-errors": "^2.0.0",
|
|
||||||
"http-parser-js": "^0.5.8",
|
|
||||||
"http-proxy": "^1.18.1",
|
|
||||||
"http-proxy-middleware": "^3.0.0",
|
|
||||||
"http-signature": "^1.4.0",
|
|
||||||
"https-browserify": "^1.0.0",
|
|
||||||
"iconv-lite": "^0.6.3",
|
|
||||||
"icss-replace-symbols": "^1.1.0",
|
|
||||||
"icss-utils": "^5.1.0",
|
|
||||||
"ieee754": "^1.2.1",
|
|
||||||
"iferr": "^1.0.2",
|
|
||||||
"ignore": "^5.3.1",
|
|
||||||
"immediate": "^3.3.0",
|
|
||||||
"import-cwd": "^3.0.0",
|
|
||||||
"import-fresh": "^3.3.0",
|
|
||||||
"import-from": "^4.0.0",
|
|
||||||
"import-local": "^3.1.0",
|
|
||||||
"imurmurhash": "^0.1.4",
|
|
||||||
"indexes-of": "^1.0.1",
|
|
||||||
"infer-owner": "^1.0.4",
|
|
||||||
"inflight": "^1.0.6",
|
|
||||||
"inherits": "^2.0.4",
|
|
||||||
"internal-ip": "^8.0.0",
|
|
||||||
"invariant": "^2.2.4",
|
|
||||||
"invert-kv": "^4.2.0",
|
|
||||||
"ip": "^2.0.1",
|
|
||||||
"ip-regex": "^5.0.0",
|
|
||||||
"ipaddr.js": "^2.2.0",
|
|
||||||
"is-absolute-url": "^4.0.1",
|
|
||||||
"is-accessor-descriptor": "^3.0.5",
|
|
||||||
"is-arguments": "^1.1.1",
|
|
||||||
"is-arrayish": "^0.3.2",
|
|
||||||
"is-binary-path": "^3.0.0",
|
|
||||||
"is-buffer": "^2.0.5",
|
|
||||||
"is-callable": "^1.2.7",
|
|
||||||
"is-color-stop": "^1.1.0",
|
|
||||||
"is-data-descriptor": "^2.1.3",
|
|
||||||
"is-date-object": "^1.0.5",
|
|
||||||
"is-descriptor": "^3.1.1",
|
|
||||||
"is-directory": "^0.3.1",
|
|
||||||
"is-extendable": "^1.0.1",
|
|
||||||
"is-extglob": "^2.1.1",
|
|
||||||
"is-fullwidth-code-point": "^5.0.0",
|
|
||||||
"is-glob": "^4.0.3",
|
|
||||||
"is-number": "^7.0.0",
|
|
||||||
"is-obj": "^3.0.0",
|
|
||||||
"is-path-cwd": "^3.0.0",
|
|
||||||
"is-path-in-cwd": "^4.0.0",
|
|
||||||
"is-path-inside": "^4.0.0",
|
|
||||||
"is-plain-obj": "^4.1.0",
|
|
||||||
"is-plain-object": "^5.0.0",
|
|
||||||
"is-regex": "^1.1.4",
|
|
||||||
"is-resolvable": "^1.1.0",
|
|
||||||
"is-stream": "^4.0.1",
|
|
||||||
"is-svg": "^5.0.0",
|
|
||||||
"is-symbol": "^1.0.4",
|
|
||||||
"is-typedarray": "^1.0.0",
|
|
||||||
"is-windows": "^1.0.2",
|
|
||||||
"is-wsl": "^3.1.0",
|
|
||||||
"isarray": "^2.0.5",
|
|
||||||
"isexe": "^3.1.1",
|
|
||||||
"isobject": "^4.0.0",
|
|
||||||
"isstream": "^0.1.2",
|
|
||||||
"javascript-stringify": "^2.1.0",
|
|
||||||
"js-levenshtein": "^1.1.6",
|
|
||||||
"js-tokens": "^9.0.0",
|
|
||||||
"js-yaml": "^4.1.0",
|
|
||||||
"jsbn": "^1.1.0",
|
|
||||||
"jsesc": "^3.0.2",
|
|
||||||
"json-parse-better-errors": "^1.0.2",
|
|
||||||
"json-schema": "^0.4.0",
|
|
||||||
"json-schema-traverse": "^1.0.0",
|
|
||||||
"json-stringify-safe": "^5.0.1",
|
|
||||||
"json3": "^3.3.3",
|
|
||||||
"json5": "^2.2.3",
|
|
||||||
"jsonfile": "^6.1.0",
|
|
||||||
"jsprim": "^2.0.2",
|
|
||||||
"killable": "^1.0.1",
|
|
||||||
"kind-of": "^6.0.3",
|
|
||||||
"last-call-webpack-plugin": "^3.0.0",
|
|
||||||
"lcid": "^5.0.0",
|
|
||||||
"linkify-it": "^5.0.0",
|
|
||||||
"load-script": "^2.0.0",
|
|
||||||
"loader-runner": "^4.3.0",
|
|
||||||
"loader-utils": "^3.2.1",
|
|
||||||
"locate-path": "^7.2.0",
|
|
||||||
"lodash": "^4.17.21",
|
|
||||||
"lodash._reinterpolate": "^3.0.0",
|
|
||||||
"lodash.chunk": "^4.2.0",
|
|
||||||
"lodash.clonedeep": "^4.5.0",
|
|
||||||
"lodash.debounce": "^4.0.8",
|
|
||||||
"lodash.kebabcase": "^4.1.1",
|
|
||||||
"lodash.memoize": "^4.1.2",
|
|
||||||
"lodash.padstart": "^4.6.1",
|
|
||||||
"lodash.sortby": "^4.7.0",
|
|
||||||
"lodash.template": "^4.5.0",
|
|
||||||
"lodash.templatesettings": "^4.2.0",
|
|
||||||
"lodash.uniq": "^4.5.0",
|
|
||||||
"loglevel": "^1.9.1",
|
|
||||||
"loose-envify": "^1.4.0",
|
|
||||||
"lower-case": "^2.0.2",
|
|
||||||
"lru-cache": "^10.2.2",
|
|
||||||
"make-dir": "^5.0.0",
|
|
||||||
"mamacro": "^0.0.7",
|
|
||||||
"map-age-cleaner": "^0.2.0",
|
|
||||||
"map-cache": "^0.2.2",
|
|
||||||
"map-visit": "^1.0.0",
|
|
||||||
"markdown-it": "^14.1.0",
|
|
||||||
"markdown-it-anchor": "^8.6.7",
|
|
||||||
"markdown-it-chain": "^1.3.0",
|
|
||||||
"markdown-it-container": "^4.0.0",
|
|
||||||
"markdown-it-emoji": "^3.0.0",
|
|
||||||
"markdown-it-table-of-contents": "^0.6.0",
|
|
||||||
"md5.js": "^1.3.5",
|
|
||||||
"mdn-data": "^2.6.1",
|
|
||||||
"mdurl": "^2.0.0",
|
|
||||||
"media-typer": "^1.1.0",
|
|
||||||
"mem": "^9.0.2",
|
|
||||||
"memory-fs": "^0.5.0",
|
|
||||||
"merge-descriptors": "^2.0.0",
|
|
||||||
"merge-source-map": "^1.1.0",
|
|
||||||
"merge2": "^1.4.1",
|
|
||||||
"methods": "^1.1.2",
|
|
||||||
"micromatch": "^4.0.5",
|
|
||||||
"miller-rabin": "^4.0.1",
|
|
||||||
"mime": "^4.0.3",
|
|
||||||
"mime-db": "^1.52.0",
|
|
||||||
"mime-types": "^2.1.35",
|
|
||||||
"mimic-fn": "^4.0.0",
|
|
||||||
"min-document": "^2.19.0",
|
|
||||||
"mini-css-extract-plugin": "^2.9.0",
|
|
||||||
"minimalistic-assert": "^1.0.1",
|
|
||||||
"minimalistic-crypto-utils": "^1.0.1",
|
|
||||||
"minimatch": "^9.0.4",
|
|
||||||
"minimist": "^1.2.8",
|
|
||||||
"mississippi": "^4.0.0",
|
|
||||||
"mixin-deep": "^2.0.1",
|
|
||||||
"mkdirp": "^3.0.1",
|
|
||||||
"move-concurrently": "^1.0.1",
|
|
||||||
"ms": "^2.1.3",
|
|
||||||
"multicast-dns": "^7.2.5",
|
|
||||||
"multicast-dns-service-types": "^1.1.0",
|
|
||||||
"nanomatch": "^1.2.13",
|
|
||||||
"negotiator": "^0.6.3",
|
|
||||||
"neo-async": "^2.6.2",
|
|
||||||
"nice-try": "^3.0.1",
|
|
||||||
"no-case": "^3.0.4",
|
|
||||||
"node-forge": "^1.3.1",
|
|
||||||
"node-libs-browser": "^2.2.1",
|
|
||||||
"node-releases": "^2.0.14",
|
|
||||||
"nopt": "^7.2.1",
|
|
||||||
"normalize-path": "^3.0.0",
|
|
||||||
"normalize-range": "^0.1.2",
|
|
||||||
"normalize-url": "^8.0.1",
|
|
||||||
"npm-run-path": "^5.3.0",
|
|
||||||
"nprogress": "^0.2.0",
|
|
||||||
"nth-check": "^2.1.1",
|
|
||||||
"num2fraction": "^1.2.2",
|
|
||||||
"number-is-nan": "^2.0.0",
|
|
||||||
"oauth-sign": "^0.9.0",
|
|
||||||
"object-assign": "^4.1.1",
|
|
||||||
"object-copy": "^1.0.0",
|
|
||||||
"object-inspect": "^1.13.1",
|
|
||||||
"object-is": "^1.1.6",
|
|
||||||
"object-keys": "^1.1.1",
|
|
||||||
"object-visit": "^1.0.1",
|
|
||||||
"object.assign": "^4.1.5",
|
|
||||||
"object.getownpropertydescriptors": "^2.1.8",
|
|
||||||
"object.pick": "^1.3.0",
|
|
||||||
"object.values": "^1.2.0",
|
|
||||||
"obuf": "^1.1.2",
|
|
||||||
"on-finished": "^2.4.1",
|
|
||||||
"on-headers": "^1.0.2",
|
|
||||||
"once": "^1.4.0",
|
|
||||||
"opencollective-postinstall": "^2.0.3",
|
|
||||||
"opn": "^6.0.0",
|
|
||||||
"optimize-css-assets-webpack-plugin": "^6.0.1",
|
|
||||||
"original": "^1.0.2",
|
|
||||||
"os-browserify": "^0.3.0",
|
|
||||||
"os-locale": "^6.0.2",
|
|
||||||
"p-defer": "^4.0.1",
|
|
||||||
"p-finally": "^2.0.1",
|
|
||||||
"p-is-promise": "^4.0.0",
|
|
||||||
"p-limit": "^5.0.0",
|
|
||||||
"p-locate": "^6.0.0",
|
|
||||||
"p-map": "^7.0.2",
|
|
||||||
"p-retry": "^6.2.0",
|
|
||||||
"p-try": "^3.0.0",
|
|
||||||
"pako": "^2.1.0",
|
|
||||||
"parallel-transform": "^1.2.0",
|
|
||||||
"param-case": "^3.0.4",
|
|
||||||
"parse-asn1": "^5.1.7",
|
|
||||||
"parse-json": "^8.1.0",
|
|
||||||
"parseurl": "^1.3.3",
|
|
||||||
"pascalcase": "^2.0.0",
|
|
||||||
"path-browserify": "^1.0.1",
|
|
||||||
"path-dirname": "^1.0.2",
|
|
||||||
"path-exists": "^5.0.0",
|
|
||||||
"path-is-absolute": "^2.0.0",
|
|
||||||
"path-is-inside": "^1.0.2",
|
|
||||||
"path-key": "^4.0.0",
|
|
||||||
"path-parse": "^1.0.7",
|
|
||||||
"path-to-regexp": "^6.2.2",
|
|
||||||
"path-type": "^5.0.0",
|
|
||||||
"pbkdf2": "^3.1.2",
|
|
||||||
"performance-now": "^2.1.0",
|
|
||||||
"pify": "^6.1.0",
|
|
||||||
"pinkie": "^2.0.4",
|
|
||||||
"pinkie-promise": "^2.0.1",
|
|
||||||
"pkg-dir": "^8.0.0",
|
|
||||||
"pkg-up": "^4.0.0",
|
|
||||||
"portfinder": "^1.0.32",
|
|
||||||
"posix-character-classes": "^1.0.0",
|
|
||||||
"postcss": "^8.4.38",
|
|
||||||
"postcss-calc": "^10.0.0",
|
|
||||||
"postcss-colormin": "^7.0.0",
|
|
||||||
"postcss-convert-values": "^7.0.0",
|
|
||||||
"postcss-discard-comments": "^7.0.0",
|
|
||||||
"postcss-discard-duplicates": "^7.0.0",
|
|
||||||
"postcss-discard-empty": "^7.0.0",
|
|
||||||
"postcss-discard-overridden": "^7.0.0",
|
|
||||||
"postcss-load-config": "^5.1.0",
|
|
||||||
"postcss-loader": "^8.1.1",
|
|
||||||
"postcss-merge-longhand": "^7.0.0",
|
|
||||||
"postcss-merge-rules": "^7.0.0",
|
|
||||||
"postcss-minify-font-values": "^7.0.0",
|
|
||||||
"postcss-minify-gradients": "^7.0.0",
|
|
||||||
"postcss-minify-params": "^7.0.0",
|
|
||||||
"postcss-minify-selectors": "^7.0.0",
|
|
||||||
"postcss-modules-extract-imports": "^3.1.0",
|
|
||||||
"postcss-modules-local-by-default": "^4.0.5",
|
|
||||||
"postcss-modules-scope": "^3.2.0",
|
|
||||||
"postcss-modules-values": "^4.0.0",
|
|
||||||
"postcss-normalize-charset": "^7.0.0",
|
|
||||||
"postcss-normalize-display-values": "^7.0.0",
|
|
||||||
"postcss-normalize-positions": "^7.0.0",
|
|
||||||
"postcss-normalize-repeat-style": "^7.0.0",
|
|
||||||
"postcss-normalize-string": "^7.0.0",
|
|
||||||
"postcss-normalize-timing-functions": "^7.0.0",
|
|
||||||
"postcss-normalize-unicode": "^7.0.0",
|
|
||||||
"postcss-normalize-url": "^7.0.0",
|
|
||||||
"postcss-normalize-whitespace": "^7.0.0",
|
|
||||||
"postcss-ordered-values": "^7.0.0",
|
|
||||||
"postcss-reduce-initial": "^7.0.0",
|
|
||||||
"postcss-reduce-transforms": "^7.0.0",
|
|
||||||
"postcss-safe-parser": "^7.0.0",
|
|
||||||
"postcss-selector-parser": "^6.0.16",
|
|
||||||
"postcss-svgo": "^7.0.0",
|
|
||||||
"postcss-unique-selectors": "^7.0.0",
|
|
||||||
"postcss-value-parser": "^4.2.0",
|
|
||||||
"prepend-http": "^4.0.0",
|
|
||||||
"prettier": "^3.2.5",
|
|
||||||
"pretty-error": "^4.0.0",
|
|
||||||
"pretty-time": "^1.1.0",
|
|
||||||
"prismjs": "^1.29.0",
|
|
||||||
"private": "^0.1.8",
|
|
||||||
"process": "^0.11.10",
|
|
||||||
"process-nextick-args": "^2.0.1",
|
|
||||||
"promise-inflight": "^1.0.1",
|
|
||||||
"proxy-addr": "^2.0.7",
|
|
||||||
"prr": "^1.0.1",
|
|
||||||
"pseudomap": "^1.0.2",
|
|
||||||
"psl": "^1.9.0",
|
|
||||||
"public-encrypt": "^4.0.3",
|
|
||||||
"pump": "^3.0.0",
|
|
||||||
"pumpify": "^2.0.1",
|
|
||||||
"punycode": "^2.3.1",
|
|
||||||
"q": "^1.5.1",
|
|
||||||
"qs": "^6.12.1",
|
|
||||||
"query-string": "^9.0.0",
|
|
||||||
"querystring": "^0.2.0",
|
|
||||||
"querystring-es3": "^0.2.1",
|
|
||||||
"querystringify": "^2.2.0",
|
|
||||||
"randombytes": "^2.1.0",
|
|
||||||
"randomfill": "^1.0.4",
|
|
||||||
"range-parser": "^1.2.1",
|
|
||||||
"raw-body": "^2.5.2",
|
|
||||||
"readable-stream": "^4.5.2",
|
|
||||||
"readdirp": "^3.6.0",
|
|
||||||
"reduce": "^1.0.2",
|
|
||||||
"regenerate": "^1.4.2",
|
|
||||||
"regenerate-unicode-properties": "^10.1.1",
|
|
||||||
"regenerator-runtime": "^0.14.1",
|
|
||||||
"regenerator-transform": "^0.15.2",
|
|
||||||
"regex-not": "^1.0.2",
|
|
||||||
"regexp.prototype.flags": "^1.5.2",
|
|
||||||
"regexpu-core": "^6.0.0",
|
|
||||||
"regjsgen": "^0.8.0",
|
|
||||||
"regjsparser": "^0.10.0",
|
|
||||||
"relateurl": "^0.2.7",
|
|
||||||
"remove-trailing-separator": "^1.1.0",
|
|
||||||
"renderkid": "^3.0.0",
|
|
||||||
"repeat-element": "^1.1.4",
|
|
||||||
"repeat-string": "^1.6.1",
|
|
||||||
"request": "^2.88.2",
|
|
||||||
"require-directory": "^2.1.1",
|
|
||||||
"require-main-filename": "^2.0.0",
|
|
||||||
"requires-port": "^1.0.0",
|
|
||||||
"reselect": "^5.1.0",
|
|
||||||
"resolve": "^1.22.8",
|
|
||||||
"resolve-cwd": "^3.0.0",
|
|
||||||
"resolve-from": "^5.0.0",
|
|
||||||
"resolve-url": "^0.2.1",
|
|
||||||
"ret": "^0.5.0",
|
|
||||||
"retry": "^0.13.1",
|
|
||||||
"rgb-regex": "^1.0.1",
|
|
||||||
"rgba-regex": "^1.0.0",
|
|
||||||
"rimraf": "^5.0.5",
|
|
||||||
"ripemd160": "^2.0.2",
|
|
||||||
"run-queue": "^2.0.1",
|
|
||||||
"safe-buffer": "^5.2.1",
|
|
||||||
"safe-regex": "^2.1.1",
|
|
||||||
"safer-buffer": "^2.1.2",
|
|
||||||
"sax": "^1.3.0",
|
|
||||||
"schema-utils": "^4.2.0",
|
|
||||||
"section-matter": "^1.0.0",
|
|
||||||
"select": "^1.1.2",
|
|
||||||
"select-hose": "^2.0.0",
|
|
||||||
"selfsigned": "^2.4.1",
|
|
||||||
"semver": "^7.6.1",
|
|
||||||
"send": "^0.18.0",
|
|
||||||
"serialize-javascript": "^6.0.2",
|
|
||||||
"serve-index": "^1.9.1",
|
|
||||||
"serve-static": "^1.15.0",
|
|
||||||
"set-blocking": "^2.0.0",
|
|
||||||
"set-value": "^4.1.0",
|
|
||||||
"setimmediate": "^1.0.5",
|
|
||||||
"setprototypeof": "^1.2.0",
|
|
||||||
"sha.js": "^2.4.11",
|
|
||||||
"shebang-command": "^2.0.0",
|
|
||||||
"shebang-regex": "^4.0.0",
|
|
||||||
"signal-exit": "^4.1.0",
|
|
||||||
"simple-swizzle": "^0.2.2",
|
|
||||||
"sitemap": "^7.1.1",
|
|
||||||
"slash": "^5.1.0",
|
|
||||||
"smoothscroll-polyfill": "^0.4.4",
|
|
||||||
"snapdragon": "^0.12.1",
|
|
||||||
"snapdragon-node": "^3.0.0",
|
|
||||||
"snapdragon-util": "^5.0.1",
|
|
||||||
"sockjs": "^0.3.24",
|
|
||||||
"sockjs-client": "^1.6.1",
|
|
||||||
"sort-keys": "^5.0.0",
|
|
||||||
"source-list-map": "^2.0.1",
|
|
||||||
"source-map": "^0.7.4",
|
|
||||||
"source-map-resolve": "^0.6.0",
|
|
||||||
"source-map-support": "^0.5.21",
|
|
||||||
"source-map-url": "^0.4.0",
|
|
||||||
"spdy": "^4.0.2",
|
|
||||||
"spdy-transport": "^3.0.0",
|
|
||||||
"split-string": "^6.1.0",
|
|
||||||
"sprintf-js": "^1.1.3",
|
|
||||||
"sshpk": "^1.18.0",
|
|
||||||
"ssri": "^10.0.6",
|
|
||||||
"stable": "^0.1.8",
|
|
||||||
"stack-utils": "^2.0.6",
|
|
||||||
"static-extend": "^0.1.2",
|
|
||||||
"statuses": "^2.0.1",
|
|
||||||
"std-env": "^3.7.0",
|
|
||||||
"stream-browserify": "^3.0.0",
|
|
||||||
"stream-each": "^1.2.3",
|
|
||||||
"stream-http": "^3.2.0",
|
|
||||||
"stream-shift": "^1.0.3",
|
|
||||||
"strict-uri-encode": "^2.0.0",
|
|
||||||
"string-width": "^7.1.0",
|
|
||||||
"string.prototype.trimleft": "^2.1.3",
|
|
||||||
"string.prototype.trimright": "^2.1.3",
|
|
||||||
"string_decoder": "^1.3.0",
|
|
||||||
"strip-ansi": "^7.1.0",
|
|
||||||
"strip-bom-string": "^1.0.0",
|
|
||||||
"strip-eof": "^2.0.0",
|
|
||||||
"stylehacks": "^7.0.0",
|
|
||||||
"stylus": "^0.63.0",
|
|
||||||
"stylus-loader": "^8.1.0",
|
|
||||||
"supports-color": "^9.4.0",
|
|
||||||
"svg-tags": "^1.0.0",
|
|
||||||
"svgo": "^3.2.0",
|
|
||||||
"tapable": "^2.2.1",
|
|
||||||
"terser": "^5.31.0",
|
|
||||||
"terser-webpack-plugin": "^5.3.10",
|
|
||||||
"text-table": "^0.2.0",
|
|
||||||
"through": "^2.3.8",
|
|
||||||
"through2": "^4.0.2",
|
|
||||||
"thunky": "^1.1.0",
|
|
||||||
"timers-browserify": "^2.0.12",
|
|
||||||
"timsort": "^0.3.0",
|
|
||||||
"tiny-emitter": "^2.1.0",
|
|
||||||
"to-arraybuffer": "^1.0.1",
|
|
||||||
"to-factory": "^1.0.0",
|
|
||||||
"to-fast-properties": "^4.0.0",
|
|
||||||
"to-object-path": "^0.3.0",
|
|
||||||
"to-regex": "^3.0.2",
|
|
||||||
"to-regex-range": "^5.0.1",
|
|
||||||
"toidentifier": "^1.0.1",
|
|
||||||
"toml": "^3.0.0",
|
|
||||||
"toposort": "^2.0.2",
|
|
||||||
"tough-cookie": "^4.1.4",
|
|
||||||
"tr46": "^5.0.0",
|
|
||||||
"tslib": "^2.6.2",
|
|
||||||
"tty-browserify": "^0.0.1",
|
|
||||||
"tunnel-agent": "^0.6.0",
|
|
||||||
"tweetnacl": "^1.0.3",
|
|
||||||
"type-fest": "^4.18.2",
|
|
||||||
"type-is": "^1.6.18",
|
|
||||||
"typedarray": "^0.0.7",
|
|
||||||
"uc.micro": "^2.1.0",
|
|
||||||
"uglify-js": "^3.17.4",
|
|
||||||
"unicode-canonical-property-names-ecmascript": "^2.0.0",
|
|
||||||
"unicode-match-property-ecmascript": "^2.0.0",
|
|
||||||
"unicode-match-property-value-ecmascript": "^2.1.0",
|
|
||||||
"unicode-property-aliases-ecmascript": "^2.1.0",
|
|
||||||
"union-value": "^2.0.1",
|
|
||||||
"uniq": "^1.0.1",
|
|
||||||
"uniqs": "^2.0.0",
|
|
||||||
"unique-filename": "^3.0.0",
|
|
||||||
"unique-slug": "^4.0.0",
|
|
||||||
"universalify": "^2.0.1",
|
|
||||||
"unpipe": "^1.0.0",
|
|
||||||
"unquote": "^1.1.1",
|
|
||||||
"unset-value": "^2.0.1",
|
|
||||||
"upath": "^2.0.1",
|
|
||||||
"upper-case": "^2.0.2",
|
|
||||||
"uri-js": "^4.4.1",
|
|
||||||
"urix": "^0.1.0",
|
|
||||||
"url": "^0.11.3",
|
|
||||||
"url-loader": "^4.1.1",
|
|
||||||
"url-parse": "^1.5.10",
|
|
||||||
"use": "^3.1.1",
|
|
||||||
"util": "^0.12.5",
|
|
||||||
"util-deprecate": "^1.0.2",
|
|
||||||
"util.promisify": "^1.1.2",
|
|
||||||
"utila": "^0.4.0",
|
|
||||||
"utils-merge": "^1.0.1",
|
|
||||||
"uuid": "^9.0.1",
|
|
||||||
"vary": "^1.1.2",
|
|
||||||
"vendors": "^2.0.1",
|
|
||||||
"verror": "^1.10.1",
|
|
||||||
"vm-browserify": "^1.1.2",
|
|
||||||
"vue": "^3.4.27",
|
|
||||||
"vue-hot-reload-api": "^2.3.4",
|
|
||||||
"vue-loader": "^17.4.2",
|
|
||||||
"vue-router": "^4.3.2",
|
|
||||||
"vue-server-renderer": "^2.7.16",
|
|
||||||
"vue-style-loader": "^4.1.3",
|
|
||||||
"vue-template-compiler": "^2.7.16",
|
|
||||||
"vue-template-es2015-compiler": "^1.9.1",
|
|
||||||
"vuepress": "^1.9.10",
|
|
||||||
"vuepress-html-webpack-plugin": "^3.2.0",
|
|
||||||
"vuepress-plugin-container": "^2.1.5",
|
|
||||||
"vuepress-plugin-sitemap": "^2.3.1",
|
|
||||||
"vuepress-plugin-smooth-scroll": "^0.0.10",
|
|
||||||
"vuepress-plugin-zooming": "^1.1.8",
|
|
||||||
"watchpack": "^2.4.1",
|
|
||||||
"wbuf": "^1.7.3",
|
|
||||||
"webidl-conversions": "^7.0.0",
|
|
||||||
"webpack": "^5.91.0",
|
|
||||||
"webpack-chain": "^6.5.1",
|
|
||||||
"webpack-dev-middleware": "^7.2.1",
|
|
||||||
"webpack-dev-server": "^5.0.4",
|
|
||||||
"webpack-log": "^3.0.2",
|
|
||||||
"webpack-merge": "^5.10.0",
|
|
||||||
"webpack-sources": "^3.2.3",
|
|
||||||
"webpackbar": "^6.0.1",
|
|
||||||
"websocket-driver": "^0.7.4",
|
|
||||||
"websocket-extensions": "^0.1.4",
|
|
||||||
"whatwg-url": "^14.0.0",
|
|
||||||
"when": "^3.7.8",
|
|
||||||
"which": "^4.0.0",
|
|
||||||
"which-module": "^2.0.1",
|
|
||||||
"worker-farm": "^1.7.0",
|
|
||||||
"wrap-ansi": "^9.0.0",
|
|
||||||
"wrappy": "^1.0.2",
|
|
||||||
"ws": "^8.17.0",
|
|
||||||
"xmlbuilder": "^15.1.1",
|
|
||||||
"xtend": "^4.0.2",
|
|
||||||
"y18n": "^5.0.8",
|
|
||||||
"yallist": "^5.0.0",
|
|
||||||
"yargs": "^17.7.2",
|
|
||||||
"yargs-parser": "^21.1.1",
|
|
||||||
"zepto": "^1.2.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {},
|
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vuepress dev",
|
"dev": "vitepress dev --host",
|
||||||
"build": "vuepress build"
|
"build": "vitepress build",
|
||||||
|
"preview": "vitepress preview"
|
||||||
},
|
},
|
||||||
"author": "",
|
"devDependencies": {
|
||||||
"license": "ISC"
|
"vitepress": "^1.1.4"
|
||||||
|
},
|
||||||
|
"dependencies": {}
|
||||||
}
|
}
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
# Screenshots
|
|
||||||
|
|
||||||
<img class="no-medium-zoom zooming" src="/screenshots/login.png" alt="Login" title="Login" width="200"/>
|
|
||||||
<img class="no-medium-zoom zooming" src="/screenshots/dashboard.png" alt="Dashboard" title="Dashboard" width="200"/>
|
|
||||||
<img class="no-medium-zoom zooming" src="/screenshots/proxy-hosts.png" alt="Proxy Hosts" title="Proxy Hosts" width="200"/>
|
|
||||||
<img class="no-medium-zoom zooming" src="/screenshots/proxy-hosts-add.png" alt="Add Proxy Host" title="Add Proxy Host" width="200"/>
|
|
||||||
<img class="no-medium-zoom zooming" src="/screenshots/redirection-hosts.png" alt="Redirection Hosts" title="Redirection Hosts" width="200"/>
|
|
||||||
<img class="no-medium-zoom zooming" src="/screenshots/dead-hosts.png" alt="404 Hosts" title="404 Hosts" width="200"/>
|
|
||||||
<img class="no-medium-zoom zooming" src="/screenshots/permissions.png" alt="User Permissions" title="User Permissions" width="200"/>
|
|
||||||
<img class="no-medium-zoom zooming" src="/screenshots/certificates.png" alt="Certificates" title="Certificates" width="200"/>
|
|
||||||
<img class="no-medium-zoom zooming" src="/screenshots/audit-log.png" alt="Audit Log" title="Audit Log" width="200"/>
|
|
||||||
<img class="no-medium-zoom zooming" src="/screenshots/custom-settings.png" alt="Custom Settings" title="Custom Settings" width="200"/>
|
|
@ -1,31 +1,52 @@
|
|||||||
|
---
|
||||||
|
outline: deep
|
||||||
|
---
|
||||||
|
|
||||||
# Advanced Configuration
|
# Advanced Configuration
|
||||||
|
|
||||||
## Best Practice: Use a docker network
|
## Running processes as a user/group
|
||||||
|
|
||||||
For those who have a few of their upstream services running in docker on the same docker
|
By default, the services (nginx etc) will run as `root` user inside the docker container.
|
||||||
host as NPM, here's a trick to secure things a bit better. By creating a custom docker network,
|
You can change this behaviour by setting the following environment variables.
|
||||||
you don't need to publish ports for your upstream services to all of the docker host's interfaces.
|
Not only will they run the services as this user/group, they will change the ownership
|
||||||
|
on the `data` folder at startup.
|
||||||
|
|
||||||
Create a network, ie "scoobydoo":
|
```yml
|
||||||
|
services:
|
||||||
|
npm:
|
||||||
|
image: 'jc21/nginx-proxy-manager:3'
|
||||||
|
environment:
|
||||||
|
PUID: 1000
|
||||||
|
PGID: 1000
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Best Practice: Use a Docker network
|
||||||
|
|
||||||
|
For those who have a few of their upstream services running in Docker on the same Docker
|
||||||
|
host as NPM, here's a trick to secure things a bit better. By creating a custom Docker network,
|
||||||
|
you don't need to publish ports for your upstream services to all of the Docker host's interfaces.
|
||||||
|
|
||||||
|
Create a network, ie `scoobydoo`:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker network create scoobydoo
|
docker network create scoobydoo
|
||||||
```
|
```
|
||||||
|
|
||||||
Then add the following to the `docker-compose.yml` file for both NPM and any other
|
Then add the following to the `docker-compose.yml` file for both NPM and any other
|
||||||
services running on this docker host:
|
services running on this Docker host:
|
||||||
|
|
||||||
```yml
|
```yml
|
||||||
networks:
|
networks:
|
||||||
default:
|
default:
|
||||||
external:
|
external: true
|
||||||
name: scoobydoo
|
name: scoobydoo
|
||||||
```
|
```
|
||||||
|
|
||||||
Let's look at a Portainer example:
|
Let's look at a Portainer example:
|
||||||
|
|
||||||
```yml
|
```yml
|
||||||
version: '3'
|
|
||||||
services:
|
services:
|
||||||
|
|
||||||
portainer:
|
portainer:
|
||||||
@ -38,25 +59,28 @@ services:
|
|||||||
|
|
||||||
networks:
|
networks:
|
||||||
default:
|
default:
|
||||||
external:
|
external: true
|
||||||
name: scoobydoo
|
name: scoobydoo
|
||||||
```
|
```
|
||||||
|
|
||||||
Now in the NPM UI you can create a proxy host with `portainer` as the hostname,
|
Now in the NPM UI you can create a proxy host with `portainer` as the hostname,
|
||||||
and port `9000` as the port. Even though this port isn't listed in the docker-compose
|
and port `9000` as the port. Even though this port isn't listed in the docker-compose
|
||||||
file, it's "exposed" by the portainer docker image for you and not available on
|
file, it's _exposed_ by the Portainer Docker image for you and not available on
|
||||||
the docker host outside of this docker network. The service name is used as the
|
the Docker host outside of this Docker network. The service name is used as the
|
||||||
hostname, so make sure your service names are unique when using the same network.
|
hostname, so make sure your service names are unique when using the same network.
|
||||||
|
|
||||||
## Docker Secrets
|
|
||||||
|
|
||||||
This image supports the use of Docker secrets to import from file and keep sensitive usernames or passwords from being passed or preserved in plaintext.
|
## Docker File Secrets
|
||||||
|
|
||||||
|
::: warning
|
||||||
|
This section needs to be reviewed!
|
||||||
|
:::
|
||||||
|
|
||||||
|
This image supports the use of Docker secrets to import from files and keep sensitive usernames or passwords from being passed or preserved in plaintext.
|
||||||
|
|
||||||
You can set any environment variable from a file by appending `__FILE` (double-underscore FILE) to the environmental variable name.
|
You can set any environment variable from a file by appending `__FILE` (double-underscore FILE) to the environmental variable name.
|
||||||
|
|
||||||
```yml
|
```yml
|
||||||
version: "3.7"
|
|
||||||
|
|
||||||
secrets:
|
secrets:
|
||||||
# Secrets are single-line text files where the sole content is the secret
|
# Secrets are single-line text files where the sole content is the secret
|
||||||
# Paths in this example assume that secrets are kept in local folder called ".secrets"
|
# Paths in this example assume that secrets are kept in local folder called ".secrets"
|
||||||
@ -71,11 +95,11 @@ services:
|
|||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
# Public HTTP Port:
|
# Public HTTP Port:
|
||||||
- '80:80'
|
- '80:8080'
|
||||||
# Public HTTPS Port:
|
# Public HTTPS Port:
|
||||||
- '443:443'
|
- '443:8443'
|
||||||
# Admin Web Port:
|
# Admin Web Port:
|
||||||
- '81:81'
|
- '81:8081'
|
||||||
environment:
|
environment:
|
||||||
# These are the settings to access your db
|
# These are the settings to access your db
|
||||||
DB_MYSQL_HOST: "db"
|
DB_MYSQL_HOST: "db"
|
||||||
@ -84,11 +108,9 @@ services:
|
|||||||
# DB_MYSQL_PASSWORD: "npm" # use secret instead
|
# DB_MYSQL_PASSWORD: "npm" # use secret instead
|
||||||
DB_MYSQL_PASSWORD__FILE: /run/secrets/MYSQL_PWD
|
DB_MYSQL_PASSWORD__FILE: /run/secrets/MYSQL_PWD
|
||||||
DB_MYSQL_NAME: "npm"
|
DB_MYSQL_NAME: "npm"
|
||||||
# If you would rather use Sqlite uncomment this
|
# If you would rather use Sqlite, remove all DB_MYSQL_* lines above
|
||||||
# and remove all DB_MYSQL_* lines above
|
|
||||||
# DB_SQLITE_FILE: "/data/database.sqlite"
|
|
||||||
# Uncomment this if IPv6 is not enabled on your host
|
# Uncomment this if IPv6 is not enabled on your host
|
||||||
# NPM_DISABLE_IPV6: 'true'
|
# DISABLE_IPV6: 'true'
|
||||||
volumes:
|
volumes:
|
||||||
- ./data:/data
|
- ./data:/data
|
||||||
- ./letsencrypt:/etc/letsencrypt
|
- ./letsencrypt:/etc/letsencrypt
|
||||||
@ -96,6 +118,7 @@ services:
|
|||||||
- MYSQL_PWD
|
- MYSQL_PWD
|
||||||
depends_on:
|
depends_on:
|
||||||
- db
|
- db
|
||||||
|
|
||||||
db:
|
db:
|
||||||
image: jc21/mariadb-aria
|
image: jc21/mariadb-aria
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
@ -106,8 +129,9 @@ services:
|
|||||||
MYSQL_USER: "npm"
|
MYSQL_USER: "npm"
|
||||||
# MYSQL_PASSWORD: "npm" # use secret instead
|
# MYSQL_PASSWORD: "npm" # use secret instead
|
||||||
MYSQL_PASSWORD__FILE: /run/secrets/MYSQL_PWD
|
MYSQL_PASSWORD__FILE: /run/secrets/MYSQL_PWD
|
||||||
|
MARIADB_AUTO_UPGRADE: '1'
|
||||||
volumes:
|
volumes:
|
||||||
- ./data/mysql:/var/lib/mysql
|
- ./mysql:/var/lib/mysql
|
||||||
secrets:
|
secrets:
|
||||||
- DB_ROOT_PWD
|
- DB_ROOT_PWD
|
||||||
- MYSQL_PWD
|
- MYSQL_PWD
|
||||||
@ -116,11 +140,13 @@ services:
|
|||||||
|
|
||||||
## Disabling IPv6
|
## Disabling IPv6
|
||||||
|
|
||||||
On some docker hosts IPv6 may not be enabled. In these cases, the following message may be seen in the log:
|
On some Docker hosts IPv6 may not be enabled. In these cases, the
|
||||||
|
following message may be seen in the log:
|
||||||
|
|
||||||
> Address family not supported by protocol
|
> Address family not supported by protocol
|
||||||
|
|
||||||
The easy fix is to add a Docker environment variable to the Nginx Proxy Manager stack:
|
The easy fix is to add a Docker environment variable to the
|
||||||
|
Nginx Proxy Manager stack:
|
||||||
|
|
||||||
```yml
|
```yml
|
||||||
environment:
|
environment:
|
||||||
@ -130,6 +156,10 @@ The easy fix is to add a Docker environment variable to the Nginx Proxy Manager
|
|||||||
|
|
||||||
## Custom Nginx Configurations
|
## Custom Nginx Configurations
|
||||||
|
|
||||||
|
::: warning
|
||||||
|
This section needs to be reviewed!
|
||||||
|
:::
|
||||||
|
|
||||||
If you are a more advanced user, you might be itching for extra Nginx customizability.
|
If you are a more advanced user, you might be itching for extra Nginx customizability.
|
||||||
|
|
||||||
NPM has the ability to include different custom configuration snippets in different places.
|
NPM has the ability to include different custom configuration snippets in different places.
|
||||||
@ -139,6 +169,7 @@ You can add your custom configuration snippet files at `/data/nginx/custom` as f
|
|||||||
- `/data/nginx/custom/root.conf`: Included at the very end of nginx.conf
|
- `/data/nginx/custom/root.conf`: Included at the very end of nginx.conf
|
||||||
- `/data/nginx/custom/http_top.conf`: Included at the top of the main http block
|
- `/data/nginx/custom/http_top.conf`: Included at the top of the main http block
|
||||||
- `/data/nginx/custom/http.conf`: Included at the end of the main http block
|
- `/data/nginx/custom/http.conf`: Included at the end of the main http block
|
||||||
|
- `/data/nginx/custom/events.conf`: Included at the end of the events block
|
||||||
- `/data/nginx/custom/stream.conf`: Included at the end of the main stream block
|
- `/data/nginx/custom/stream.conf`: Included at the end of the main stream block
|
||||||
- `/data/nginx/custom/server_proxy.conf`: Included at the end of every proxy server block
|
- `/data/nginx/custom/server_proxy.conf`: Included at the end of every proxy server block
|
||||||
- `/data/nginx/custom/server_redirect.conf`: Included at the end of every redirection server block
|
- `/data/nginx/custom/server_redirect.conf`: Included at the end of every redirection server block
|
||||||
@ -151,6 +182,10 @@ Every file is optional.
|
|||||||
|
|
||||||
## X-FRAME-OPTIONS Header
|
## X-FRAME-OPTIONS Header
|
||||||
|
|
||||||
|
::: warning
|
||||||
|
This section needs to be reviewed!
|
||||||
|
:::
|
||||||
|
|
||||||
You can configure the [`X-FRAME-OPTIONS`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options) header
|
You can configure the [`X-FRAME-OPTIONS`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options) header
|
||||||
value by specifying it as a Docker environment variable. The default if not specified is `deny`.
|
value by specifying it as a Docker environment variable. The default if not specified is `deny`.
|
||||||
|
|
||||||
@ -160,3 +195,21 @@ value by specifying it as a Docker environment variable. The default if not spec
|
|||||||
X_FRAME_OPTIONS: "sameorigin"
|
X_FRAME_OPTIONS: "sameorigin"
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Customising logrotate settings
|
||||||
|
|
||||||
|
::: warning
|
||||||
|
This section needs to be reviewed!
|
||||||
|
:::
|
||||||
|
|
||||||
|
By default, NPM rotates the access- and error logs weekly and keeps 4 and 10 log files respectively.
|
||||||
|
Depending on the usage, this can lead to large log files, especially access logs.
|
||||||
|
You can customise the logrotate configuration through a mount (if your custom config is `logrotate.custom`):
|
||||||
|
|
||||||
|
```yml
|
||||||
|
volumes:
|
||||||
|
...
|
||||||
|
- ./logrotate.custom:/etc/logrotate.d/nginx-proxy-manager
|
||||||
|
```
|
||||||
|
|
||||||
|
For reference, the default configuration can be found [here](https://github.com/NginxProxyManager/nginx-proxy-manager/blob/develop/docker/rootfs/etc/logrotate.d/nginx-proxy-manager).
|
@ -1,3 +1,7 @@
|
|||||||
|
---
|
||||||
|
outline: deep
|
||||||
|
---
|
||||||
|
|
||||||
# Development
|
# Development
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@ -91,3 +95,52 @@ curl --request POST \
|
|||||||
"max_domains": 2
|
"max_domains": 2
|
||||||
}'
|
}'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Development Notes
|
||||||
|
|
||||||
|
Requesting a SSL Certificate is a complicated process to understand.
|
||||||
|
|
||||||
|
This is an explanation of how the ACME standard of certificates works.
|
||||||
|
|
||||||
|
### Certificate Request via HTTP validation
|
||||||
|
|
||||||
|
1. You define `website.example.com` DNS record to point to `123.45.67.89`
|
||||||
|
2. You ask a Certificate Authority to give you a Certificate and initiate validation from their side
|
||||||
|
3. The CA gives you a token, and you should be running a http-only webserver on `123.45.67.89` that returns this token
|
||||||
|
4. The CA makes a request to your domain `http://website.example.com/.well-known/acme-challenge/` and gets the token
|
||||||
|
5. If the CA thinks the token matches, they issue you the certificates.
|
||||||
|
|
||||||
|
### Certificate Request via DNS validation
|
||||||
|
|
||||||
|
1. You ask a Certificate Authority to give you a Certificate and initiate validation from their side
|
||||||
|
2. The CA gives you a token, and you update the DNS records on your domain with this token
|
||||||
|
3. The CA checks the DNS record, with a timeout waiting for propagation
|
||||||
|
4. If the CA thinks the token matches, they issue you the certificates.
|
||||||
|
|
||||||
|
### ACME DNS in an isolated test environment
|
||||||
|
|
||||||
|
#### Local CA
|
||||||
|
|
||||||
|
In order to have a local ACME compatible CA that you can control, you have 2 options:
|
||||||
|
|
||||||
|
- pebble by Letsencrypt
|
||||||
|
- stepca by Step
|
||||||
|
|
||||||
|
stepca has better DNS Acme validation support.
|
||||||
|
|
||||||
|
#### Local DNS Provider
|
||||||
|
|
||||||
|
PowerDNS is a really good, free DNS server and acme.sh has support for it.
|
||||||
|
|
||||||
|
#### Getting things to work together
|
||||||
|
|
||||||
|
Since your don't really own `website.example.com` and if you hit it with your system DNS
|
||||||
|
it will fail, you'll need to use a custom DNS responder to return an A record for this
|
||||||
|
that points to your running NPM gateway. My [dnsrouter](https://github.com/jc21/dnsrouter)
|
||||||
|
project accomplishes this nicely. After this is setup, as long as the resolv.conf points
|
||||||
|
to this dns responder, the resolution should work locally.
|
||||||
|
|
||||||
|
1. You ask the stepca CA to give you a Certificate and initiate validation
|
||||||
|
2. The CA returns a token, and you update the PDNS records on your domain with this token
|
||||||
|
3. The CA checks the DNS record, with a timeout waiting for propagation
|
||||||
|
4. If the CA thinks the token matches, they issue you the certificates.
|
26
docs/src/faq/index.md
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
outline: deep
|
||||||
|
---
|
||||||
|
|
||||||
|
# FAQ
|
||||||
|
|
||||||
|
## Do I have to use Docker?
|
||||||
|
|
||||||
|
Yes, that's how this project is packaged.
|
||||||
|
|
||||||
|
This makes it easier to support the project when we have control over the version of Nginx other packages
|
||||||
|
use by the project.
|
||||||
|
|
||||||
|
## Can I run it on a Raspberry Pi?
|
||||||
|
|
||||||
|
Yes! The docker image is multi-arch and is built for a variety of architectures. If yours is
|
||||||
|
[not listed](https://hub.docker.com/r/jc21/nginx-proxy-manager/tags) please open a
|
||||||
|
[GitHub issue](https://github.com/NginxProxyManager/nginx-proxy-manager/issues/new?assignees=&labels=enhancement&template=feature_request.md&title=).
|
||||||
|
|
||||||
|
## I can't get my service to proxy properly?
|
||||||
|
|
||||||
|
Your best bet is to ask the [Reddit community for support](https://www.reddit.com/r/nginxproxymanager/). There's safety in numbers.
|
||||||
|
|
||||||
|
## When adding username and password access control to a proxy host, I can no longer login into the app.
|
||||||
|
|
||||||
|
Having an Access Control List (ACL) with username and password requires the browser to always send this username and password in the `Authorization` header on each request. If your proxied app also requires authentication (like Nginx Proxy Manager itself), most likely the app will also use the `Authorization` header to transmit this information, as this is the standardized header meant for this kind of information. However having multiples of the same headers is not allowed in the [internet standard](https://www.rfc-editor.org/rfc/rfc7230#section-3.2.2) and almost all apps do not support multiple values in the `Authorization` header. Hence one of the two logins will be broken. This can only be fixed by either removing one of the logins or by changing the app to use other non-standard headers for authorization.
|
117
docs/src/guide/index.md
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
---
|
||||||
|
outline: deep
|
||||||
|
---
|
||||||
|
|
||||||
|
# Guide
|
||||||
|
|
||||||
|
::: raw
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://hub.docker.com/repository/docker/jc21/nginx-proxy-manager" style="display:inline;margin-right:5px;">
|
||||||
|
<img src="https://img.shields.io/docker/stars/jc21/nginx-proxy-manager.svg?style=for-the-badge" style="display:inline;">
|
||||||
|
</a>
|
||||||
|
<a href="https://hub.docker.com/repository/docker/jc21/nginx-proxy-manager" style="display:inline;margin-right:5px;">
|
||||||
|
<img src="https://img.shields.io/docker/pulls/jc21/nginx-proxy-manager.svg?style=for-the-badge" style="display:inline;">
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
:::
|
||||||
|
|
||||||
|
This project comes as a pre-built docker image that enables you to easily forward to your websites
|
||||||
|
running at home or otherwise, including free SSL, without having to know too much about Nginx or Letsencrypt.
|
||||||
|
|
||||||
|
- [Quick Setup](#quick-setup)
|
||||||
|
- [Full Setup](/setup/)
|
||||||
|
- [Screenshots](/screenshots/)
|
||||||
|
|
||||||
|
## Project Goal
|
||||||
|
|
||||||
|
I created this project to fill a personal need to provide users with an easy way to accomplish reverse
|
||||||
|
proxying hosts with SSL termination and it had to be so easy that a monkey could do it. This goal hasn't changed.
|
||||||
|
While there might be advanced options they are optional and the project should be as simple as possible
|
||||||
|
so that the barrier for entry here is low.
|
||||||
|
|
||||||
|
::: raw
|
||||||
|
<a href="https://www.buymeacoffee.com/jc21" target="_blank"><img src="http://public.jc21.com/github/by-me-a-coffee.png" alt="Buy Me A Coffee" style="height: 51px !important;width: 217px !important;" ></a>
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Beautiful and Secure Admin Interface based on [Tabler](https://tabler.github.io/)
|
||||||
|
- Easily create forwarding domains, redirections, streams and 404 hosts without knowing anything about Nginx
|
||||||
|
- Free SSL using Let's Encrypt or provide your own custom SSL certificates
|
||||||
|
- Access Lists and basic HTTP Authentication for your hosts
|
||||||
|
- Advanced Nginx configuration available for super users
|
||||||
|
- User management, permissions and audit log
|
||||||
|
|
||||||
|
|
||||||
|
## Hosting your home network
|
||||||
|
|
||||||
|
I won't go in to too much detail here but here are the basics for someone new to this self-hosted world.
|
||||||
|
|
||||||
|
1. Your home router will have a Port Forwarding section somewhere. Log in and find it
|
||||||
|
2. Add port forwarding for port 80 and 443 to the server hosting this project
|
||||||
|
3. Configure your domain name details to point to your home, either with a static ip or a service like DuckDNS or [Amazon Route53](https://github.com/jc21/route53-ddns)
|
||||||
|
4. Use the Nginx Proxy Manager as your gateway to forward to your other web based services
|
||||||
|
|
||||||
|
## Quick Setup
|
||||||
|
|
||||||
|
1. Install Docker and Docker-Compose
|
||||||
|
|
||||||
|
- [Docker Install documentation](https://docs.docker.com/get-docker/)
|
||||||
|
- [Docker-Compose Install documentation](https://docs.docker.com/compose/install/)
|
||||||
|
|
||||||
|
2. Create a docker-compose.yml file similar to this:
|
||||||
|
|
||||||
|
```yml
|
||||||
|
services:
|
||||||
|
npm:
|
||||||
|
image: 'jc21/nginx-proxy-manager:3'
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- '80:8080'
|
||||||
|
- '81:8081'
|
||||||
|
- '443:8443'
|
||||||
|
volumes:
|
||||||
|
- ./data:/data
|
||||||
|
```
|
||||||
|
|
||||||
|
This is the bare minimum configuration required. See the [documentation](https://nginxproxymanager.com/setup/) for more.
|
||||||
|
|
||||||
|
3. Bring up your stack by running
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Log in to the Admin UI
|
||||||
|
|
||||||
|
When your docker container is running, connect to it on port 81 for the admin interface.
|
||||||
|
|
||||||
|
[http://127.0.0.1:81](http://127.0.0.1:81)
|
||||||
|
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
All are welcome to create pull requests for this project, against the `develop` branch. Official releases are created from the `master` branch.
|
||||||
|
|
||||||
|
CI is used in this project. All PR's must pass before being considered. After passing,
|
||||||
|
docker builds for PR's are available on dockerhub for manual verifications.
|
||||||
|
|
||||||
|
Documentation within the `develop` branch is available for preview at
|
||||||
|
[https://develop.nginxproxymanager.com](https://develop.nginxproxymanager.com)
|
||||||
|
|
||||||
|
|
||||||
|
### Contributors
|
||||||
|
|
||||||
|
Special thanks to [all of our contributors](https://github.com/NginxProxyManager/nginx-proxy-manager/graphs/contributors).
|
||||||
|
|
||||||
|
|
||||||
|
### Become a Contributor
|
||||||
|
|
||||||
|
A guide to setting up your own development environment
|
||||||
|
[is found here](/development/).
|
||||||
|
|
||||||
|
## Getting Support
|
||||||
|
|
||||||
|
1. [Found a bug?](https://github.com/NginxProxyManager/nginx-proxy-manager/issues)
|
||||||
|
2. [Discussions](https://github.com/NginxProxyManager/nginx-proxy-manager/discussions)
|
||||||
|
3. [Reddit](https://reddit.com/r/nginxproxymanager)
|
32
docs/src/index.md
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
---
|
||||||
|
# https://vitepress.dev/reference/default-theme-home-page
|
||||||
|
layout: home
|
||||||
|
|
||||||
|
hero:
|
||||||
|
name: "Nginx Proxy Manager"
|
||||||
|
tagline: Expose your services easily and securely
|
||||||
|
image:
|
||||||
|
src: /logo.svg
|
||||||
|
alt: NPM Logo
|
||||||
|
actions:
|
||||||
|
- theme: brand
|
||||||
|
text: Get Started
|
||||||
|
link: /guide/
|
||||||
|
- theme: alt
|
||||||
|
text: GitHub
|
||||||
|
link: https://github.com/NginxProxyManager/nginx-proxy-manager
|
||||||
|
|
||||||
|
features:
|
||||||
|
- title: Get Connected
|
||||||
|
details: Expose web services on your network · Free SSL with Let's Encrypt · Designed with security in mind · Perfect for home networks
|
||||||
|
- title: Proxy Hosts
|
||||||
|
details: Expose your private network Web services and get connected anywhere.
|
||||||
|
- title: Beautiful UI
|
||||||
|
details: Based on Tabler, the interface is a pleasure to use. Configuring a server has never been so fun.
|
||||||
|
- title: Free SSL
|
||||||
|
details: Built in Let’s Encrypt support allows you to secure your Web services at no cost to you. The certificates even renew themselves!
|
||||||
|
- title: Docker FTW
|
||||||
|
details: Built as a Docker Image, Nginx Proxy Manager only requires a database.
|
||||||
|
- title: Multiple Users
|
||||||
|
details: Configure other users to either view or manage their own hosts. Full access permissions are available.
|
||||||
|
---
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 106 KiB |
Before Width: | Height: | Size: 178 KiB After Width: | Height: | Size: 178 KiB |
Before Width: | Height: | Size: 173 KiB After Width: | Height: | Size: 173 KiB |
Before Width: | Height: | Size: 141 KiB After Width: | Height: | Size: 141 KiB |
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 102 KiB |
Before Width: | Height: | Size: 150 KiB After Width: | Height: | Size: 150 KiB |
Before Width: | Height: | Size: 92 KiB After Width: | Height: | Size: 92 KiB |
Before Width: | Height: | Size: 151 KiB After Width: | Height: | Size: 151 KiB |
Before Width: | Height: | Size: 207 KiB After Width: | Height: | Size: 207 KiB |
Before Width: | Height: | Size: 181 KiB After Width: | Height: | Size: 181 KiB |
Before Width: | Height: | Size: 162 KiB After Width: | Height: | Size: 162 KiB |
9
docs/src/screenshots/index.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
outline: deep
|
||||||
|
---
|
||||||
|
|
||||||
|
# Screenshots
|
||||||
|
|
||||||
|
::: info
|
||||||
|
Screenshots for v3 will be added at official release time.
|
||||||
|
:::
|
@ -1,22 +1,25 @@
|
|||||||
|
---
|
||||||
|
outline: deep
|
||||||
|
---
|
||||||
|
|
||||||
# Full Setup Instructions
|
# Full Setup Instructions
|
||||||
|
|
||||||
### Running the App
|
## Running the App
|
||||||
|
|
||||||
Via `docker-compose`:
|
Create a `docker-compose.yml` file:
|
||||||
|
|
||||||
```yml
|
```yml
|
||||||
version: "3"
|
|
||||||
services:
|
services:
|
||||||
app:
|
npm:
|
||||||
image: 'jc21/nginx-proxy-manager:v3-develop'
|
image: 'jc21/nginx-proxy-manager:3'
|
||||||
restart: always
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
# Public HTTP Port:
|
# Public HTTP Port:
|
||||||
- '80:80'
|
- '80:8080'
|
||||||
# Public HTTPS Port:
|
# Public HTTPS Port:
|
||||||
- '443:443'
|
- '443:8443'
|
||||||
# Admin Web Port:
|
# Admin Web Port:
|
||||||
- '81:81'
|
- '81:8081'
|
||||||
environment:
|
environment:
|
||||||
# These run the processes and own the files
|
# These run the processes and own the files
|
||||||
# for a specific user/group
|
# for a specific user/group
|
||||||
@ -31,10 +34,10 @@ services:
|
|||||||
Then:
|
Then:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker-compose up -d
|
docker compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
### Running on Raspberry PI / ARM devices
|
## Running on Raspberry PI / ARM devices
|
||||||
|
|
||||||
The docker images support the following architectures:
|
The docker images support the following architectures:
|
||||||
- amd64
|
- amd64
|
||||||
@ -46,10 +49,7 @@ you don't have to worry about doing anything special and you can follow the comm
|
|||||||
|
|
||||||
Check out the [dockerhub tags](https://hub.docker.com/r/jc21/nginx-proxy-manager/tags)
|
Check out the [dockerhub tags](https://hub.docker.com/r/jc21/nginx-proxy-manager/tags)
|
||||||
for a list of supported architectures and if you want one that doesn't exist,
|
for a list of supported architectures and if you want one that doesn't exist,
|
||||||
[create a feature request](https://github.com/jc21/nginx-proxy-manager/issues/new?assignees=&labels=enhancement&template=feature_request.md&title=).
|
[create a feature request](https://github.com/NginxProxyManager/nginx-proxy-manager/issues/new?assignees=&labels=enhancement&template=feature_request.md&title=).
|
||||||
|
|
||||||
Also, if you don't know how to already, follow [this guide to install docker and docker-compose](https://manre-universe.net/how-to-run-docker-and-docker-compose-on-raspbian/)
|
|
||||||
on Raspbian.
|
|
||||||
|
|
||||||
|
|
||||||
### Initial Run
|
### Initial Run
|
@ -1,16 +1,19 @@
|
|||||||
|
---
|
||||||
|
outline: deep
|
||||||
|
---
|
||||||
|
|
||||||
# Third Party
|
# Third Party
|
||||||
|
|
||||||
As this software gains popularity it's common to see it integrated with other platforms. Please be aware that unless specifically mentioned in the documenation of those
|
As this software gains popularity it's common to see it integrated with other platforms. Please be aware that unless specifically mentioned in the documentation of those
|
||||||
integrations, they are *not supported* by me.
|
integrations, they are *not supported* by me.
|
||||||
|
|
||||||
Known integrations:
|
Known integrations:
|
||||||
|
|
||||||
- [HomeAssistant Hass.io plugin](https://github.com/hassio-addons/addon-nginx-proxy-manager)
|
- [HomeAssistant Hass.io plugin](https://github.com/hassio-addons/addon-nginx-proxy-manager)
|
||||||
- [UnRaid / Synology](https://github.com/jlesage/docker-nginx-proxy-manager)
|
- [UnRaid / Synology](https://github.com/jlesage/docker-nginx-proxy-manager)
|
||||||
- [Proxmox Scripts](https://github.com/ej52/proxmox-scripts/tree/main/lxc/nginx-proxy-manager)
|
- [Proxmox Scripts](https://github.com/ej52/proxmox-scripts/tree/main/apps/nginx-proxy-manager)
|
||||||
- [nginxproxymanagerGraf](https://github.com/ma-karai/nginxproxymanagerGraf)
|
- [nginxproxymanagerGraf](https://github.com/ma-karai/nginxproxymanagerGraf)
|
||||||
|
|
||||||
|
|
||||||
If you would like your integration of NPM listed, please open a
|
If you would like your integration of NPM listed, please open a
|
||||||
[Github issue](https://github.com/jc21/nginx-proxy-manager/issues/new?assignees=&labels=enhancement&template=feature_request.md&title=)
|
[Github issue](https://github.com/NginxProxyManager/nginx-proxy-manager/issues/new?assignees=&labels=enhancement&template=feature_request.md&title=)
|
||||||
|
|
@ -1,11 +1,16 @@
|
|||||||
|
---
|
||||||
|
outline: deep
|
||||||
|
---
|
||||||
|
|
||||||
# Upgrading
|
# Upgrading
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker-compose pull
|
docker compose pull
|
||||||
docker-compose up -d
|
docker compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
This project will automatically update any databases or other requirements so you don't have to follow
|
This project will automatically update any databases or other requirements so you don't have to follow
|
||||||
any crazy instructions. These steps above will pull the latest updates and recreate the docker
|
any crazy instructions. These steps above will pull the latest updates and recreate the docker
|
||||||
containers.
|
containers.
|
||||||
|
|
||||||
|
See the [list of releases](https://github.com/NginxProxyManager/nginx-proxy-manager/releases) for any upgrade steps specific to each release.
|