v2.2.0 New Brand (#319)

* Tweaks and backend vscode settings

* Version bump

* Updated Icon to be more vibrant

* New logo and new login screen layout, version bump

* New documentation!

* Use CI to update package versions

because I was sick of changing it everywhere

* Generate docs

* Docs upload

* Fix pipeline

* Fix pipeline

* Update readme version before generating docs

* Testing docs deploy

* Fix pipeline

* Updated CI link

* Fix docs upload

* Docs upload fixes

* Fix s3 upload grrr

* Docs tweaks

* Updated readme

* Updated screenshots

Co-authored-by: Jamie Curnow <jamiec@benon.com>
This commit is contained in:
jc21 2020-03-11 16:54:10 +10:00 committed by GitHub
parent 1b6993ee70
commit 256bd2336f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
52 changed files with 9245 additions and 192 deletions

View File

@ -1 +1 @@
2.1.2
2.2.0

62
Jenkinsfile vendored
View File

@ -42,6 +42,15 @@ pipeline {
}
}
}
stage('Versions') {
steps {
sh 'cat frontend/package.json | jq --arg BUILD_VERSION "${BUILD_VERSION}" \'.version = $BUILD_VERSION\' | sponge frontend/package.json'
sh 'echo -e "\\E[1;36mFrontend Version is:\\E[1;33m $(cat frontend/package.json | jq -r .version)\\E[0m"'
sh 'cat backend/package.json | jq --arg BUILD_VERSION "${BUILD_VERSION}" \'.version = $BUILD_VERSION\' | sponge backend/package.json'
sh 'echo -e "\\E[1;36mBackend Version is:\\E[1;33m $(cat backend/package.json | jq -r .version)\\E[0m"'
sh 'sed -i -E "s/(version-)[0-9]+\\.[0-9]+\\.[0-9]+(-green)/\\1${BUILD_VERSION}\\2/" README.md'
}
}
}
}
stage('Frontend') {
@ -105,6 +114,27 @@ pipeline {
}
}
}
stage('Docs') {
when {
not {
equals expected: 'UNSTABLE', actual: currentBuild.result
}
}
steps {
ansiColor('xterm') {
dir(path: 'docs') {
sh 'yarn install'
sh 'yarn build'
}
dir(path: 'docs/.vuepress/dist') {
sh 'tar -czf ../../docs.tgz *'
}
archiveArtifacts(artifacts: 'docs/docs.tgz', allowEmptyArchive: false)
}
}
}
stage('MultiArch Build') {
when {
not {
@ -121,6 +151,38 @@ pipeline {
}
}
}
stage('Docs Deploy') {
when {
allOf {
branch 'master'
not {
equals expected: 'UNSTABLE', actual: currentBuild.result
}
}
}
steps {
withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', accessKeyVariable: 'AWS_ACCESS_KEY_ID', credentialsId: 'npm-s3-docs', secretKeyVariable: 'AWS_SECRET_ACCESS_KEY']]) {
sh """docker run --rm \\
--name \${COMPOSE_PROJECT_NAME}-docs-upload \\
-e S3_BUCKET=jc21-npm-site \\
-e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \\
-e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \\
-v \$(pwd):/app \\
-w /app \\
jc21/ci-tools \\
scripts/docs-upload /app/docs/.vuepress/dist/
"""
sh """docker run --rm \\
--name \${COMPOSE_PROJECT_NAME}-docs-invalidate \\
-e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \\
-e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \\
jc21/ci-tools \\
aws cloudfront create-invalidation --distribution-id EYAMDX2I8TPDZ --paths '/*'
"""
}
}
}
stage('PR Comment') {
when {
allOf {

View File

@ -1,15 +1,16 @@
![Nginx Proxy Manager](https://public.jc21.com/nginx-proxy-manager/github.png "Nginx Proxy Manager")
# Nginx Proxy Manager
![Version](https://img.shields.io/badge/version-2.1.2-green.svg?style=for-the-badge)
![Stars](https://img.shields.io/docker/stars/jc21/nginx-proxy-manager.svg?style=for-the-badge)
![Pulls](https://img.shields.io/docker/pulls/jc21/nginx-proxy-manager.svg?style=for-the-badge)
![Jenkins](https://img.shields.io/jenkins/build?jobUrl=https%3A%2F%2Fci.nginxproxymanager.com%2Fjob%2Fnginx-proxy-manager%2Fjob%2Fmaster&style=for-the-badge)
![Version](https://img.shields.io/badge/version-2.2.0-green.svg?style=for-the-badge)
[![Stars](https://img.shields.io/docker/stars/jc21/nginx-proxy-manager.svg?style=for-the-badge)](https://hub.docker.com/repository/docker/jc21/nginx-proxy-manager)
[![Pulls](https://img.shields.io/docker/pulls/jc21/nginx-proxy-manager.svg?style=for-the-badge)](https://hub.docker.com/repository/docker/jc21/nginx-proxy-manager)
[![Jenkins](https://img.shields.io/jenkins/build?jobUrl=https%3A%2F%2Fci.nginxproxymanager.com%2Fjob%2Fnginx-proxy-manager%2Fjob%2Fmaster&style=for-the-badge)](https://ci.nginxproxymanager.com/blue/organizations/jenkins/nginx-proxy-manager/branches/)
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](https://nginxproxymanager.com#quick-setup)
- [Full Setup](https://nginxproxymanager.com/setup/)
- [Screenshots](https://nginxproxymanager.com/screenshots/)
## Project Goal
@ -31,54 +32,6 @@ so that the barrier for entry here is low.
- User management, permissions and audit log
## Screenshots
[![Login](https://public.jc21.com/nginx-proxy-manager/v2/small/login.jpg "Login")](https://public.jc21.com/nginx-proxy-manager/v2/large/login.jpg)
[![Dashboard](https://public.jc21.com/nginx-proxy-manager/v2/small/dashboard.jpg "Dashboard")](https://public.jc21.com/nginx-proxy-manager/v2/large/dashboard.jpg)
[![Proxy Hosts](https://public.jc21.com/nginx-proxy-manager/v2/small/proxy-hosts.jpg "Proxy Hosts")](https://public.jc21.com/nginx-proxy-manager/v2/large/proxy-hosts.jpg)
[![Proxy Host Settings](https://public.jc21.com/nginx-proxy-manager/v2/small/proxy-hosts-new1.jpg "Proxy Host Settings")](https://public.jc21.com/nginx-proxy-manager/v2/large/proxy-hosts-new1.jpg)
[![Proxy Host SSL](https://public.jc21.com/nginx-proxy-manager/v2/small/proxy-hosts-new2.jpg "Proxy Host SSL")](https://public.jc21.com/nginx-proxy-manager/v2/large/proxy-hosts-new2.jpg)
[![Redirection Hosts](https://public.jc21.com/nginx-proxy-manager/v2/small/redirection-hosts.jpg "Redirection Hosts")](https://public.jc21.com/nginx-proxy-manager/v2/large/redirection-hosts.jpg)
[![Redirection Host Settings](https://public.jc21.com/nginx-proxy-manager/v2/small/redirection-hosts-new1.jpg "Redirection Host Settings")](https://public.jc21.com/nginx-proxy-manager/v2/large/redirection-hosts-new1.jpg)
[![Streams](https://public.jc21.com/nginx-proxy-manager/v2/small/streams.jpg "Streams")](https://public.jc21.com/nginx-proxy-manager/v2/large/streams.jpg)
[![Stream Settings](https://public.jc21.com/nginx-proxy-manager/v2/small/streams-new1.jpg "Stream Settings")](https://public.jc21.com/nginx-proxy-manager/v2/large/streams-new1.jpg)
[![404 Hosts](https://public.jc21.com/nginx-proxy-manager/v2/small/dead-hosts.jpg "404 Hosts")](https://public.jc21.com/nginx-proxy-manager/v2/large/dead-hosts.jpg)
[![404 Host Settings](https://public.jc21.com/nginx-proxy-manager/v2/small/dead-hosts-new1.jpg "404 Host Settings")](https://public.jc21.com/nginx-proxy-manager/v2/large/dead-hosts-new1.jpg)
[![Certificates](https://public.jc21.com/nginx-proxy-manager/v2/small/certificates.jpg "Certificates")](https://public.jc21.com/nginx-proxy-manager/v2/large/certificates.jpg)
[![Lets Encrypt Certificates](https://public.jc21.com/nginx-proxy-manager/v2/small/certificates-new1.jpg "Lets Encrypt Certificates")](https://public.jc21.com/nginx-proxy-manager/v2/large/certificates-new1.jpg)
[![Custom Certificates](https://public.jc21.com/nginx-proxy-manager/v2/small/certificates-new2.jpg "Custom Certificates")](https://public.jc21.com/nginx-proxy-manager/v2/large/certificates-new2.jpg)
[![Access Lists](https://public.jc21.com/nginx-proxy-manager/v2/small/access-lists.jpg "Access Lists")](https://public.jc21.com/nginx-proxy-manager/v2/large/access-lists.jpg)
[![Access List Users](https://public.jc21.com/nginx-proxy-manager/v2/small/access-lists-new1.jpg "Access List Users")](https://public.jc21.com/nginx-proxy-manager/v2/large/access-lists-new1.jpg)
[![Users](https://public.jc21.com/nginx-proxy-manager/v2/small/users.jpg "Users")](https://public.jc21.com/nginx-proxy-manager/v2/large/users.jpg)
[![User Permissions](https://public.jc21.com/nginx-proxy-manager/v2/small/users-permissions.jpg "User Permissions")](https://public.jc21.com/nginx-proxy-manager/v2/large/users-permissions.jpg)
[![Audit Log](https://public.jc21.com/nginx-proxy-manager/v2/small/audit-log.jpg "Audit Log")](https://public.jc21.com/nginx-proxy-manager/v2/large/audit-log.jpg)
## Getting started
Please consult the [installation instructions](doc/INSTALL.md) for a complete guide or
if you just want to get up and running in the quickest time possible, grab all the files in the `doc/example/` folder and run `docker-compose up -d`
## Administration
When your docker container is running, connect to it on port `81` for the admin interface.
[http://localhost:81](http://localhost:81)
Note: Requesting SSL Certificates won't work until this project is accessible from the outside world, as explained below.
### Default Administrator User
```
Email: admin@example.com
Password: changeme
```
Immediately after logging in with this default user you will be asked to modify your details and change your password.
## 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.
@ -87,14 +40,3 @@ I won't go in to too much detail here but here are the basics for someone new to
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
## Nginx Proxy Manager in the wild
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
integrations, they are *not supported* by me and any donation links on the pages of those integrations will not come to me even though it looks like it.
Known integrations:
- [HomeAssistant Hass.io plugin](https://github.com/hassio-addons/addon-nginx-proxy-manager)
- [UnRaid / Synology](https://github.com/jlesage/docker-nginx-proxy-manager)

View File

@ -1,6 +1,6 @@
{
"name": "nginx-proxy-manager",
"version": "2.1.2",
"version": "0.0.0",
"description": "A beautiful interface for creating Nginx endpoints",
"main": "js/index.js",
"dependencies": {

View File

@ -1,10 +0,0 @@
{
"database": {
"engine": "mysql",
"host": "db",
"name": "npm",
"user": "npm",
"password": "npm",
"port": 3306
}
}

View File

@ -1,28 +0,0 @@
version: "3"
services:
app:
image: jc21/nginx-proxy-manager:latest
restart: always
ports:
- 80:80
- 81:81
- 443:443
volumes:
- ./config.json:/app/config/production.json
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
depends_on:
- db
environment:
# if you want pretty colors in your docker logs:
- FORCE_COLOR=1
db:
image: jc21/mariadb-aria:latest
restart: always
environment:
MYSQL_ROOT_PASSWORD: "npm"
MYSQL_DATABASE: "npm"
MYSQL_USER: "npm"
MYSQL_PASSWORD: "npm"
volumes:
- ./data/mysql:/var/lib/mysql

3
docs/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
.vuepress/dist
node_modules
ts

80
docs/.vuepress/config.js Normal file
View File

@ -0,0 +1,80 @@
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/" }],
// Custom sidebar values
sidebar: [
"/",
["/guide/", "Guide"],
["/screenshots/", "Screenshots"],
["/setup/", "Setup Instructions"],
["/advanced-config/", "Advanced Configuration"],
["/third-party/", "Third Party"]
]
}
}
},
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,
},
},
],
]
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

View File

@ -0,0 +1,2 @@
User-agent: *
Disallow:

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

View File

@ -0,0 +1,23 @@
.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;

View File

@ -0,0 +1,4 @@
$accentColor = #f15833
$textColor = #663015
$borderColor = #eaecef
$codeBgColor = #282c34

93
docs/README.md Normal file
View File

@ -0,0 +1,93 @@
---
home: true
heroImage: /logo.png
actionText: Get Started →
actionLink: /guide/
footer: MIT Licensed | Copyright © 2016-present jc21.com
---
<div class="features">
<div class="feature">
<h2>Get Connected</h2>
<p>
Expose web services on your network &middot;
Free SSL with Let's Encrypt &middot;
Designed with security in mind &middot;
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 Lets 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:latest'
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./config.json:/app/config/production.json
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
db:
image: 'jc21/mariadb-aria:10.4'
environment:
MYSQL_ROOT_PASSWORD: 'npm'
MYSQL_DATABASE: 'npm'
MYSQL_USER: 'npm'
MYSQL_PASSWORD: 'npm'
volumes:
- ./data/mysql:/var/lib/mysql
```
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)
Default Admin User:
```
Email: admin@example.com
Password: changeme
```
Immediately after logging in with this default user you will be asked to modify your details and change your password.

View File

@ -1,4 +1,6 @@
## Advanced Nginx Configuration
# Advanced Configuration
### Custom Nginx Configurations
If you are a more advanced user, you might be itching for extra Nginx customizability.
@ -15,3 +17,16 @@ You can add your custom configuration snippet files at `/data/nginx/custom` as f
`/data/nginx/custom/server_stream_udp.conf`: Included at the end of every UDP stream server block
Every file is optional.
### 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`.
```yml
...
environment:
X_FRAME_OPTIONS: "sameorigin"
...
```

1
docs/guide/README.md Symbolic link
View File

@ -0,0 +1 @@
../../README.md

777
docs/package.json Normal file
View File

@ -0,0 +1,777 @@
{
"name": "docs",
"version": "1.0.0",
"description": "",
"main": "index.js",
"dependencies": {
"@vuepress/plugin-google-analytics": "^1.3.1",
"abbrev": "^1.1.1",
"accepts": "^1.3.7",
"acorn": "^6.4.0",
"agentkeepalive": "^2.2.0",
"ajv": "^6.11.0",
"ajv-errors": "^1.0.1",
"ajv-keywords": "^3.4.1",
"algoliasearch": "^3.35.1",
"alphanum-sort": "^1.0.2",
"ansi-colors": "^3.2.4",
"ansi-escapes": "^4.3.0",
"ansi-html": "^0.0.7",
"ansi-regex": "^2.1.1",
"ansi-styles": "^3.2.1",
"anymatch": "^2.0.0",
"aproba": "^1.2.0",
"argparse": "^1.0.10",
"arr-diff": "^4.0.0",
"arr-flatten": "^1.1.0",
"arr-union": "^3.1.0",
"array-flatten": "^1.1.1",
"array-union": "^1.0.2",
"array-uniq": "^1.0.3",
"array-unique": "^0.3.2",
"asn1": "^0.2.4",
"asn1.js": "^4.10.1",
"assert": "^1.5.0",
"assert-plus": "^1.0.0",
"assign-symbols": "^1.0.0",
"async": "^2.6.3",
"async-each": "^1.0.3",
"async-limiter": "^1.0.1",
"asynckit": "^0.4.0",
"atob": "^2.1.2",
"autocomplete.js": "^0.36.0",
"autoprefixer": "^9.7.4",
"aws-sign2": "^0.7.0",
"aws4": "^1.9.1",
"babel-loader": "^8.0.6",
"babel-plugin-dynamic-import-node": "^2.3.0",
"babel-plugin-module-resolver": "^3.2.0",
"balanced-match": "^1.0.0",
"base": "^0.11.2",
"base64-js": "^1.3.1",
"batch": "^0.6.1",
"bcrypt-pbkdf": "^1.0.2",
"big.js": "^5.2.2",
"binary-extensions": "^1.13.1",
"bluebird": "^3.7.2",
"bn.js": "^4.11.8",
"body-parser": "^1.19.0",
"bonjour": "^3.5.0",
"boolbase": "^1.0.0",
"brace-expansion": "^1.1.11",
"braces": "^2.3.2",
"brorand": "^1.1.0",
"browserify-aes": "^1.2.0",
"browserify-cipher": "^1.0.1",
"browserify-des": "^1.0.2",
"browserify-rsa": "^4.0.1",
"browserify-sign": "^4.0.4",
"browserify-zlib": "^0.2.0",
"browserslist": "^4.8.5",
"buffer": "^4.9.2",
"buffer-from": "^1.1.1",
"buffer-indexof": "^1.1.1",
"buffer-json": "^2.0.0",
"buffer-xor": "^1.0.3",
"builtin-status-codes": "^3.0.0",
"bytes": "^3.1.0",
"cac": "^6.5.5",
"cacache": "^12.0.3",
"cache-base": "^1.0.1",
"cache-loader": "^3.0.1",
"call-me-maybe": "^1.0.1",
"caller-callsite": "^2.0.0",
"caller-path": "^2.0.0",
"callsites": "^2.0.0",
"camel-case": "^3.0.0",
"camelcase": "^5.3.1",
"caniuse-api": "^3.0.0",
"caniuse-lite": "^1.0.30001022",
"caseless": "^0.12.0",
"chalk": "^2.4.2",
"chokidar": "^2.1.8",
"chownr": "^1.1.3",
"chrome-trace-event": "^1.0.2",
"ci-info": "^1.6.0",
"cipher-base": "^1.0.4",
"class-utils": "^0.3.6",
"clean-css": "^4.2.1",
"clipboard": "^2.0.4",
"cliui": "^4.1.0",
"coa": "^2.0.2",
"code-point-at": "^1.1.0",
"collection-visit": "^1.0.0",
"color": "^3.1.2",
"color-convert": "^1.9.3",
"color-name": "^1.1.3",
"color-string": "^1.5.3",
"combined-stream": "^1.0.8",
"commander": "^2.17.1",
"commondir": "^1.0.1",
"component-emitter": "^1.3.0",
"compressible": "^2.0.18",
"compression": "^1.7.4",
"concat-map": "^0.0.1",
"concat-stream": "^1.6.2",
"connect-history-api-fallback": "^1.6.0",
"consola": "^2.11.3",
"console-browserify": "^1.2.0",
"consolidate": "^0.15.1",
"constants-browserify": "^1.0.0",
"content-disposition": "^0.5.3",
"content-type": "^1.0.4",
"convert-source-map": "^1.7.0",
"cookie": "^0.4.0",
"cookie-signature": "^1.0.6",
"copy-concurrently": "^1.0.5",
"copy-descriptor": "^0.1.1",
"copy-webpack-plugin": "^5.1.1",
"core-js": "^2.6.11",
"core-util-is": "^1.0.2",
"cosmiconfig": "^5.2.1",
"create-ecdh": "^4.0.3",
"create-hash": "^1.2.0",
"create-hmac": "^1.1.7",
"cross-spawn": "^6.0.5",
"crypto-browserify": "^3.12.0",
"css": "^2.2.4",
"css-color-names": "^0.0.4",
"css-declaration-sorter": "^4.0.1",
"css-loader": "^2.1.1",
"css-parse": "^2.0.0",
"css-select": "^1.2.0",
"css-select-base-adapter": "^0.1.1",
"css-tree": "^1.0.0-alpha.37",
"css-unit-converter": "^1.1.1",
"css-what": "^2.1.3",
"cssesc": "^3.0.0",
"cssnano": "^4.1.10",
"cssnano-preset-default": "^4.0.7",
"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": "^4.0.2",
"cyclist": "^1.0.1",
"dashdash": "^1.14.1",
"de-indent": "^1.0.2",
"debug": "^2.6.9",
"decamelize": "^1.2.0",
"decode-uri-component": "^0.2.0",
"deep-equal": "^1.1.1",
"deepmerge": "^1.5.2",
"default-gateway": "^4.2.0",
"define-properties": "^1.1.3",
"define-property": "^0.2.5",
"del": "^4.1.1",
"delayed-stream": "^1.0.0",
"delegate": "^3.2.0",
"depd": "^1.1.2",
"des.js": "^1.0.1",
"destroy": "^1.0.4",
"detect-node": "^2.0.4",
"diacritics": "^1.3.0",
"diffie-hellman": "^5.0.3",
"dir-glob": "^2.2.2",
"dns-equal": "^1.0.0",
"dns-packet": "^1.3.1",
"dns-txt": "^2.0.2",
"docsearch.js": "^2.6.3",
"dom-converter": "^0.2.0",
"dom-serializer": "^0.2.2",
"dom-walk": "^0.1.1",
"domain-browser": "^1.2.0",
"domelementtype": "^1.3.1",
"domhandler": "^2.4.2",
"domutils": "^1.7.0",
"dot-prop": "^4.2.0",
"duplexify": "^3.7.1",
"ecc-jsbn": "^0.1.2",
"ee-first": "^1.1.1",
"electron-to-chromium": "^1.3.338",
"elliptic": "^6.5.2",
"emoji-regex": "^7.0.3",
"emojis-list": "^2.1.0",
"encodeurl": "^1.0.2",
"end-of-stream": "^1.4.4",
"enhanced-resolve": "^4.1.1",
"entities": "^1.1.2",
"envify": "^4.1.0",
"envinfo": "^7.5.0",
"errno": "^0.1.7",
"error-ex": "^1.3.2",
"es-abstract": "^1.17.4",
"es-to-primitive": "^1.2.1",
"es6-promise": "^4.2.8",
"escape-html": "^1.0.3",
"escape-string-regexp": "^1.0.5",
"eslint-scope": "^4.0.3",
"esprima": "^4.0.1",
"esrecurse": "^4.2.1",
"estraverse": "^4.3.0",
"esutils": "^2.0.3",
"etag": "^1.8.1",
"eventemitter3": "^4.0.0",
"events": "^1.1.1",
"eventsource": "^1.0.7",
"evp_bytestokey": "^1.0.3",
"execa": "^1.0.0",
"expand-brackets": "^2.1.4",
"express": "^4.17.1",
"extend": "^3.0.2",
"extend-shallow": "^2.0.1",
"extglob": "^2.0.4",
"extsprintf": "^1.3.0",
"fast-deep-equal": "^3.1.1",
"fast-glob": "^2.2.7",
"fast-json-stable-stringify": "^2.1.0",
"faye-websocket": "^0.10.0",
"figgy-pudding": "^3.5.1",
"figures": "^3.1.0",
"file-loader": "^3.0.1",
"fill-range": "^4.0.0",
"finalhandler": "^1.1.2",
"find-babel-config": "^1.2.0",
"find-cache-dir": "^2.1.0",
"find-up": "^3.0.0",
"flush-write-stream": "^1.1.1",
"follow-redirects": "^1.9.0",
"for-in": "^1.0.2",
"foreach": "^2.0.5",
"forever-agent": "^0.6.1",
"form-data": "^2.3.3",
"forwarded": "^0.1.2",
"fragment-cache": "^0.2.1",
"fresh": "^0.5.2",
"from2": "^2.3.0",
"fs-extra": "^7.0.1",
"fs-write-stream-atomic": "^1.0.10",
"fs.realpath": "^1.0.0",
"function-bind": "^1.1.1",
"gensync": "^1.0.0-beta.1",
"get-caller-file": "^1.0.3",
"get-stream": "^4.1.0",
"get-value": "^2.0.6",
"getpass": "^0.1.7",
"glob": "^7.1.6",
"glob-parent": "^3.1.0",
"glob-to-regexp": "^0.3.0",
"global": "^4.4.0",
"globals": "^11.12.0",
"globby": "^7.1.1",
"good-listener": "^1.2.2",
"graceful-fs": "^4.2.3",
"gray-matter": "^4.0.2",
"handle-thing": "^2.0.0",
"har-schema": "^2.0.0",
"har-validator": "^5.1.3",
"has": "^1.0.3",
"has-ansi": "^2.0.0",
"has-flag": "^3.0.0",
"has-symbols": "^1.0.1",
"has-value": "^1.0.0",
"has-values": "^1.0.0",
"hash-base": "^3.0.4",
"hash-sum": "^1.0.2",
"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": "^1.2.1",
"html-minifier": "^3.5.21",
"html-tags": "^2.0.0",
"htmlparser2": "^3.10.1",
"http-deceiver": "^1.2.7",
"http-errors": "^1.7.2",
"http-parser-js": "^0.4.10",
"http-proxy": "^1.18.0",
"http-proxy-middleware": "^0.19.1",
"http-signature": "^1.2.0",
"https-browserify": "^1.0.0",
"iconv-lite": "^0.4.24",
"icss-replace-symbols": "^1.1.0",
"icss-utils": "^4.1.1",
"ieee754": "^1.1.13",
"iferr": "^0.1.5",
"ignore": "^3.3.10",
"immediate": "^3.2.3",
"import-cwd": "^2.1.0",
"import-fresh": "^2.0.0",
"import-from": "^2.1.0",
"import-local": "^2.0.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": "^4.3.0",
"invariant": "^2.2.4",
"invert-kv": "^2.0.0",
"ip": "^1.1.5",
"ip-regex": "^2.1.0",
"ipaddr.js": "^1.9.1",
"is-absolute-url": "^3.0.3",
"is-accessor-descriptor": "^1.0.0",
"is-arguments": "^1.0.4",
"is-arrayish": "^0.2.1",
"is-binary-path": "^1.0.1",
"is-buffer": "^1.1.6",
"is-callable": "^1.1.5",
"is-color-stop": "^1.1.0",
"is-data-descriptor": "^1.0.0",
"is-date-object": "^1.0.2",
"is-descriptor": "^1.0.2",
"is-directory": "^0.3.1",
"is-extendable": "^0.1.1",
"is-extglob": "^2.1.1",
"is-fullwidth-code-point": "^2.0.0",
"is-glob": "^4.0.1",
"is-number": "^3.0.0",
"is-obj": "^1.0.1",
"is-path-cwd": "^2.2.0",
"is-path-in-cwd": "^2.1.0",
"is-path-inside": "^2.1.0",
"is-plain-obj": "^1.1.0",
"is-plain-object": "^2.0.4",
"is-regex": "^1.0.5",
"is-resolvable": "^1.1.0",
"is-stream": "^1.1.0",
"is-svg": "^3.0.0",
"is-symbol": "^1.0.3",
"is-typedarray": "^1.0.0",
"is-windows": "^1.0.2",
"is-wsl": "^1.1.0",
"isarray": "^1.0.0",
"isexe": "^2.0.0",
"isobject": "^3.0.1",
"isstream": "^0.1.2",
"javascript-stringify": "^1.6.0",
"js-levenshtein": "^1.1.6",
"js-tokens": "^4.0.0",
"js-yaml": "^3.13.1",
"jsbn": "^0.1.1",
"jsesc": "^2.5.2",
"json-parse-better-errors": "^1.0.2",
"json-schema": "^0.2.3",
"json-schema-traverse": "^0.4.1",
"json-stringify-safe": "^5.0.1",
"json3": "^3.3.3",
"json5": "^0.5.1",
"jsonfile": "^4.0.0",
"jsprim": "^1.4.1",
"killable": "^1.0.1",
"kind-of": "^6.0.3",
"last-call-webpack-plugin": "^3.0.0",
"lcid": "^2.0.0",
"linkify-it": "^2.2.0",
"load-script": "^1.0.0",
"loader-runner": "^2.4.0",
"loader-utils": "^1.2.3",
"locate-path": "^3.0.0",
"lodash": "^4.17.15",
"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.6.6",
"loose-envify": "^1.4.0",
"lower-case": "^1.1.4",
"lru-cache": "^5.1.1",
"make-dir": "^2.1.0",
"mamacro": "^0.0.3",
"map-age-cleaner": "^0.1.3",
"map-cache": "^0.2.2",
"map-visit": "^1.0.0",
"markdown-it": "^8.4.2",
"markdown-it-anchor": "^5.2.5",
"markdown-it-chain": "^1.3.0",
"markdown-it-container": "^2.0.0",
"markdown-it-emoji": "^1.4.0",
"markdown-it-table-of-contents": "^0.4.4",
"md5.js": "^1.3.5",
"mdn-data": "^2.0.4",
"mdurl": "^1.0.1",
"media-typer": "^0.3.0",
"mem": "^4.3.0",
"memory-fs": "^0.4.1",
"merge-descriptors": "^1.0.1",
"merge-source-map": "^1.1.0",
"merge2": "^1.3.0",
"methods": "^1.1.2",
"micromatch": "^3.1.10",
"miller-rabin": "^4.0.1",
"mime": "^2.4.4",
"mime-db": "^1.43.0",
"mime-types": "^2.1.26",
"mimic-fn": "^2.1.0",
"min-document": "^2.19.0",
"mini-css-extract-plugin": "^0.6.0",
"minimalistic-assert": "^1.0.1",
"minimalistic-crypto-utils": "^1.0.1",
"minimatch": "^3.0.4",
"minimist": "^1.2.0",
"mississippi": "^3.0.0",
"mixin-deep": "^1.3.2",
"mkdirp": "^0.5.1",
"move-concurrently": "^1.0.1",
"ms": "^2.0.0",
"multicast-dns": "^6.2.3",
"multicast-dns-service-types": "^1.1.0",
"nanomatch": "^1.2.13",
"negotiator": "^0.6.2",
"neo-async": "^2.6.1",
"nice-try": "^1.0.5",
"no-case": "^2.3.2",
"node-forge": "^0.9.0",
"node-libs-browser": "^2.2.1",
"node-releases": "^1.1.47",
"nopt": "^1.0.10",
"normalize-path": "^3.0.0",
"normalize-range": "^0.1.2",
"normalize-url": "^2.0.1",
"npm-run-path": "^2.0.2",
"nprogress": "^0.2.0",
"nth-check": "^1.0.2",
"num2fraction": "^1.2.2",
"number-is-nan": "^1.0.1",
"oauth-sign": "^0.9.0",
"object-assign": "^4.1.1",
"object-copy": "^0.1.0",
"object-inspect": "^1.7.0",
"object-is": "^1.0.2",
"object-keys": "^1.1.1",
"object-visit": "^1.0.1",
"object.assign": "^4.1.0",
"object.getownpropertydescriptors": "^2.1.0",
"object.pick": "^1.3.0",
"object.values": "^1.1.1",
"obuf": "^1.1.2",
"on-finished": "^2.3.0",
"on-headers": "^1.0.2",
"once": "^1.4.0",
"opencollective-postinstall": "^2.0.2",
"opn": "^5.5.0",
"optimize-css-assets-webpack-plugin": "^5.0.3",
"original": "^1.0.2",
"os-browserify": "^0.3.0",
"os-locale": "^3.1.0",
"p-defer": "^1.0.0",
"p-finally": "^1.0.0",
"p-is-promise": "^2.1.0",
"p-limit": "^2.2.2",
"p-locate": "^3.0.0",
"p-map": "^2.1.0",
"p-retry": "^3.0.1",
"p-try": "^2.2.0",
"pako": "^1.0.10",
"parallel-transform": "^1.2.0",
"param-case": "^2.1.1",
"parse-asn1": "^5.1.5",
"parse-json": "^4.0.0",
"parseurl": "^1.3.3",
"pascalcase": "^0.1.1",
"path-browserify": "^0.0.1",
"path-dirname": "^1.0.2",
"path-exists": "^3.0.0",
"path-is-absolute": "^1.0.1",
"path-is-inside": "^1.0.2",
"path-key": "^2.0.1",
"path-parse": "^1.0.6",
"path-to-regexp": "^0.1.7",
"path-type": "^3.0.0",
"pbkdf2": "^3.0.17",
"performance-now": "^2.1.0",
"pify": "^4.0.1",
"pinkie": "^2.0.4",
"pinkie-promise": "^2.0.1",
"pkg-dir": "^3.0.0",
"pkg-up": "^2.0.0",
"portfinder": "^1.0.25",
"posix-character-classes": "^0.1.1",
"postcss": "^7.0.26",
"postcss-calc": "^7.0.1",
"postcss-colormin": "^4.0.3",
"postcss-convert-values": "^4.0.1",
"postcss-discard-comments": "^4.0.2",
"postcss-discard-duplicates": "^4.0.2",
"postcss-discard-empty": "^4.0.1",
"postcss-discard-overridden": "^4.0.1",
"postcss-load-config": "^2.1.0",
"postcss-loader": "^3.0.0",
"postcss-merge-longhand": "^4.0.11",
"postcss-merge-rules": "^4.0.3",
"postcss-minify-font-values": "^4.0.2",
"postcss-minify-gradients": "^4.0.2",
"postcss-minify-params": "^4.0.2",
"postcss-minify-selectors": "^4.0.2",
"postcss-modules-extract-imports": "^2.0.0",
"postcss-modules-local-by-default": "^2.0.6",
"postcss-modules-scope": "^2.1.1",
"postcss-modules-values": "^2.0.0",
"postcss-normalize-charset": "^4.0.1",
"postcss-normalize-display-values": "^4.0.2",
"postcss-normalize-positions": "^4.0.2",
"postcss-normalize-repeat-style": "^4.0.2",
"postcss-normalize-string": "^4.0.2",
"postcss-normalize-timing-functions": "^4.0.2",
"postcss-normalize-unicode": "^4.0.1",
"postcss-normalize-url": "^4.0.1",
"postcss-normalize-whitespace": "^4.0.2",
"postcss-ordered-values": "^4.1.2",
"postcss-reduce-initial": "^4.0.3",
"postcss-reduce-transforms": "^4.0.2",
"postcss-safe-parser": "^4.0.1",
"postcss-selector-parser": "^3.1.1",
"postcss-svgo": "^4.0.2",
"postcss-unique-selectors": "^4.0.1",
"postcss-value-parser": "^3.3.1",
"prepend-http": "^2.0.0",
"prettier": "^1.19.1",
"pretty-error": "^2.1.1",
"pretty-time": "^1.1.0",
"prismjs": "^1.19.0",
"private": "^0.1.8",
"process": "^0.11.10",
"process-nextick-args": "^2.0.1",
"promise-inflight": "^1.0.1",
"proxy-addr": "^2.0.5",
"prr": "^1.0.1",
"pseudomap": "^1.0.2",
"psl": "^1.7.0",
"public-encrypt": "^4.0.3",
"pump": "^3.0.0",
"pumpify": "^1.5.1",
"punycode": "^1.4.1",
"q": "^1.5.1",
"qs": "^6.7.0",
"query-string": "^5.1.1",
"querystring": "^0.2.0",
"querystring-es3": "^0.2.1",
"querystringify": "^2.1.1",
"randombytes": "^2.1.0",
"randomfill": "^1.0.4",
"range-parser": "^1.2.1",
"raw-body": "^2.4.0",
"readable-stream": "^2.3.7",
"readdirp": "^2.2.1",
"reduce": "^1.0.2",
"regenerate": "^1.4.0",
"regenerate-unicode-properties": "^8.1.0",
"regenerator-runtime": "^0.13.3",
"regenerator-transform": "^0.14.1",
"regex-not": "^1.0.2",
"regexp.prototype.flags": "^1.3.0",
"regexpu-core": "^4.6.0",
"regjsgen": "^0.5.1",
"regjsparser": "^0.6.2",
"relateurl": "^0.2.7",
"remove-trailing-separator": "^1.1.0",
"renderkid": "^2.0.3",
"repeat-element": "^1.1.3",
"repeat-string": "^1.6.1",
"request": "^2.88.0",
"require-directory": "^2.1.1",
"require-main-filename": "^1.0.1",
"requires-port": "^1.0.0",
"reselect": "^3.0.1",
"resolve": "^1.14.2",
"resolve-cwd": "^2.0.0",
"resolve-from": "^3.0.0",
"resolve-url": "^0.2.1",
"ret": "^0.1.15",
"retry": "^0.12.0",
"rgb-regex": "^1.0.1",
"rgba-regex": "^1.0.0",
"rimraf": "^2.7.1",
"ripemd160": "^2.0.2",
"run-queue": "^1.0.3",
"safe-buffer": "^5.2.0",
"safe-regex": "^1.1.0",
"safer-buffer": "^2.1.2",
"sax": "^1.2.4",
"schema-utils": "^1.0.0",
"section-matter": "^1.0.0",
"select": "^1.1.2",
"select-hose": "^2.0.0",
"selfsigned": "^1.10.7",
"semver": "^5.7.1",
"send": "^0.17.1",
"serialize-javascript": "^2.1.2",
"serve-index": "^1.9.1",
"serve-static": "^1.14.1",
"set-blocking": "^2.0.0",
"set-value": "^2.0.1",
"setimmediate": "^1.0.5",
"setprototypeof": "^1.1.1",
"sha.js": "^2.4.11",
"shebang-command": "^1.2.0",
"shebang-regex": "^1.0.0",
"signal-exit": "^3.0.2",
"simple-swizzle": "^0.2.2",
"sitemap": "^3.2.2",
"slash": "^1.0.0",
"smoothscroll-polyfill": "^0.4.4",
"snapdragon": "^0.8.2",
"snapdragon-node": "^2.1.1",
"snapdragon-util": "^3.0.1",
"sockjs": "^0.3.19",
"sockjs-client": "^1.4.0",
"sort-keys": "^2.0.0",
"source-list-map": "^2.0.1",
"source-map": "^0.6.1",
"source-map-resolve": "^0.5.3",
"source-map-support": "^0.5.16",
"source-map-url": "^0.4.0",
"spdy": "^4.0.1",
"spdy-transport": "^3.0.0",
"split-string": "^3.1.0",
"sprintf-js": "^1.0.3",
"sshpk": "^1.16.1",
"ssri": "^6.0.1",
"stable": "^0.1.8",
"stack-utils": "^1.0.2",
"static-extend": "^0.1.2",
"statuses": "^1.5.0",
"std-env": "^2.2.1",
"stream-browserify": "^2.0.2",
"stream-each": "^1.2.3",
"stream-http": "^2.8.3",
"stream-shift": "^1.0.1",
"strict-uri-encode": "^1.1.0",
"string-width": "^2.1.1",
"string.prototype.trimleft": "^2.1.1",
"string.prototype.trimright": "^2.1.1",
"string_decoder": "^1.3.0",
"strip-ansi": "^3.0.1",
"strip-bom-string": "^1.0.0",
"strip-eof": "^1.0.0",
"stylehacks": "^4.0.3",
"stylus": "^0.54.7",
"stylus-loader": "^3.0.2",
"supports-color": "^6.1.0",
"svg-tags": "^1.0.0",
"svgo": "^1.3.2",
"tapable": "^1.1.3",
"terser": "^4.6.3",
"terser-webpack-plugin": "^1.4.3",
"text-table": "^0.2.0",
"through": "^2.3.8",
"through2": "^2.0.5",
"thunky": "^1.1.0",
"timers-browserify": "^2.0.11",
"timsort": "^0.3.0",
"tiny-emitter": "^2.1.0",
"to-arraybuffer": "^1.0.1",
"to-factory": "^1.0.0",
"to-fast-properties": "^2.0.0",
"to-object-path": "^0.3.0",
"to-regex": "^3.0.2",
"to-regex-range": "^2.1.1",
"toidentifier": "^1.0.0",
"toml": "^3.0.0",
"toposort": "^1.0.7",
"tough-cookie": "^2.4.3",
"tr46": "^1.0.1",
"tslib": "^1.10.0",
"tty-browserify": "^0.0.0",
"tunnel-agent": "^0.6.0",
"tweetnacl": "^0.14.5",
"type-fest": "^0.8.1",
"type-is": "^1.6.18",
"typedarray": "^0.0.6",
"uc.micro": "^1.0.6",
"uglify-js": "^3.4.10",
"unicode-canonical-property-names-ecmascript": "^1.0.4",
"unicode-match-property-ecmascript": "^1.0.4",
"unicode-match-property-value-ecmascript": "^1.1.0",
"unicode-property-aliases-ecmascript": "^1.0.5",
"union-value": "^1.0.1",
"uniq": "^1.0.1",
"uniqs": "^2.0.0",
"unique-filename": "^1.1.1",
"unique-slug": "^2.0.2",
"universalify": "^0.1.2",
"unpipe": "^1.0.0",
"unquote": "^1.1.1",
"unset-value": "^1.0.0",
"upath": "^1.2.0",
"upper-case": "^1.1.3",
"uri-js": "^4.2.2",
"urix": "^0.1.0",
"url": "^0.11.0",
"url-loader": "^1.1.2",
"url-parse": "^1.4.7",
"use": "^3.1.1",
"util": "^0.11.1",
"util-deprecate": "^1.0.2",
"util.promisify": "^1.0.0",
"utila": "^0.4.0",
"utils-merge": "^1.0.1",
"uuid": "^3.4.0",
"vary": "^1.1.2",
"vendors": "^1.0.3",
"verror": "^1.10.0",
"vm-browserify": "^1.1.2",
"vue": "^2.6.11",
"vue-hot-reload-api": "^2.3.4",
"vue-loader": "^15.8.3",
"vue-router": "^3.1.5",
"vue-server-renderer": "^2.6.11",
"vue-style-loader": "^4.1.2",
"vue-template-compiler": "^2.6.11",
"vue-template-es2015-compiler": "^1.9.1",
"vuepress": "^1.3.1",
"vuepress-html-webpack-plugin": "^3.2.0",
"vuepress-plugin-container": "^2.1.2",
"vuepress-plugin-sitemap": "^2.3.1",
"vuepress-plugin-smooth-scroll": "^0.0.3",
"vuepress-plugin-zooming": "^1.1.7",
"watchpack": "^1.6.0",
"wbuf": "^1.7.3",
"webidl-conversions": "^4.0.2",
"webpack": "^4.41.5",
"webpack-chain": "^4.12.1",
"webpack-dev-middleware": "^3.7.2",
"webpack-dev-server": "^3.10.1",
"webpack-log": "^2.0.0",
"webpack-merge": "^4.2.2",
"webpack-sources": "^1.4.3",
"webpackbar": "^3.2.0",
"websocket-driver": "^0.7.3",
"websocket-extensions": "^0.1.3",
"whatwg-url": "^7.1.0",
"when": "^3.6.4",
"which": "^1.3.1",
"which-module": "^2.0.0",
"worker-farm": "^1.7.0",
"wrap-ansi": "^5.1.0",
"wrappy": "^1.0.2",
"ws": "^6.2.1",
"xmlbuilder": "^13.0.2",
"xtend": "^4.0.2",
"y18n": "^4.0.0",
"yallist": "^3.1.1",
"yargs": "^12.0.5",
"yargs-parser": "^11.1.1",
"zepto": "^1.2.0"
},
"devDependencies": {},
"scripts": {
"dev": "vuepress dev",
"build": "vuepress build"
},
"author": "",
"license": "ISC"
}

View File

@ -0,0 +1,12 @@
# 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"/>

View File

@ -1,13 +1,4 @@
## Installation and Configuration
If you just want to get up and running in the quickest time possible, grab all the files in
the [doc/example/](https://github.com/jc21/nginx-proxy-manager/tree/master/doc/example)
folder and run:
```bash
docker-compose up -d
```
# Full Setup Instructions
### Configuration File
@ -48,6 +39,12 @@ This app doesn't come with a database, you have to provide one yourself. Current
It's easy to use another docker container for your database also and link it as part of the docker stack, so that's what the following examples
are going to use.
::: warning
When using a `mariadb` database, the NPM configuration file should still use the `mysql` engine!
:::
### Running the App
@ -61,11 +58,11 @@ services:
restart: always
ports:
# Public HTTP Port:
- 80:80
- '80:80'
# Public HTTPS Port:
- 443:443
- '443:443'
# Admin Web Port:
- 81:81
- '81:81'
volumes:
# Make sure this config.json file exists as per instructions above:
- ./config.json:/app/config/production.json
@ -74,7 +71,7 @@ services:
depends_on:
- db
db:
image: jc21/mariadb-aria:latest
image: jc21/mariadb-aria:10.4
restart: always
environment:
MYSQL_ROOT_PASSWORD: "npm"
@ -114,9 +111,9 @@ on Raspbian.
After the app is running for the first time, the following will happen:
- The database will initialize with table structures
- GPG keys will be generated and saved in the configuration file
- A default admin user will be created
1. The database will initialize with table structures
2. GPG keys will be generated and saved in the configuration file
3. A default admin user will be created
This process can take a couple of minutes depending on your machine.
@ -129,22 +126,3 @@ Password: changeme
```
Immediately after logging in with this default user you will be asked to modify your details and change your password.
### Advanced Options
#### 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`.
```yml
...
environment:
X_FRAME_OPTIONS: "sameorigin"
...
```
```
... -e "X_FRAME_OPTIONS=sameorigin" ...
```

12
docs/third-party/README.md vendored Normal file
View File

@ -0,0 +1,12 @@
# 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
integrations, they are *not supported* by me.
Known integrations:
- [HomeAssistant Hass.io plugin](https://github.com/hassio-addons/addon-nginx-proxy-manager)
- [UnRaid / Synology](https://github.com/jlesage/docker-nginx-proxy-manager)
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=)

7964
docs/yarn.lock Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -2,8 +2,8 @@
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="/images/favicon/mstile-150x150.png"/>
<TileColor>#f0ad00</TileColor>
<square150x150logo src="/images/favicons/mstile-150x150.png"/>
<TileColor>#333333</TileColor>
</tile>
</msapplication>
</browserconfig>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 958 B

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -9,24 +9,77 @@ Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M2384 5110 c-1036 -74 -1922 -761 -2248 -1743 -146 -437 -170 -915
-70 -1367 193 -869 838 -1582 1687 -1864 437 -146 915 -170 1367 -70 632 141
1204 533 1564 1074 222 333 358 697 412 1100 22 167 22 473 0 640 -96 722
-473 1348 -1062 1767 -472 335 -1074 504 -1650 463z m1514 -1050 c173 -18 201
-52 210 -250 8 -190 -30 -414 -110 -655 -112 -338 -282 -619 -509 -842 -131
-130 -233 -203 -384 -278 -211 -105 -410 -162 -663 -188 l-114 -12 -97 -109
c-201 -228 -505 -449 -846 -616 -210 -102 -316 -133 -338 -98 -25 39 106 345
248 578 166 275 296 430 548 657 36 32 47 49 47 72 l0 30 -137 -66 c-229 -109
-615 -273 -644 -273 -15 0 -35 7 -43 16 -24 24 -20 109 8 169 38 82 425 784
473 860 88 136 163 193 292 221 71 15 247 18 324 5 l48 -8 49 61 c305 381 900
682 1434 726 50 4 96 8 101 8 6 1 52 -3 103 -8z m-558 -2245 c-21 -148 -73
-226 -214 -319 -97 -64 -842 -472 -899 -492 -47 -17 -110 -18 -138 -4 -13 7
-19 21 -19 44 0 29 102 278 230 563 36 81 28 76 165 88 273 25 602 139 810
283 l70 48 3 -65 c2 -36 -2 -102 -8 -146z"/>
<path d="M3580 3711 c-72 -23 -112 -76 -112 -151 0 -88 62 -152 150 -153 194
-3 214 278 22 307 -19 3 -46 1 -60 -3z"/>
<path d="M3035 3392 c-68 -33 -128 -93 -158 -161 -31 -69 -29 -178 5 -252 54
-117 159 -184 288 -184 96 1 169 33 234 106 60 66 80 129 74 228 -7 118 -59
201 -160 256 -44 24 -67 30 -138 33 -77 3 -90 1 -145 -26z"/>
<path d="M2348 4766 c-109 -63 -203 -116 -210 -120 -7 -3 -20 -10 -28 -16 -19
-12 -114 -68 -410 -238 -481 -276 -1017 -586 -1087 -628 -39 -23 -73 -40 -76
-38 -3 3 -5 -519 -5 -1160 l0 -1165 292 -169 c293 -170 727 -421 801 -462 22
-12 99 -56 170 -98 167 -96 690 -399 732 -423 l32 -18 207 120 c114 66 226
131 248 143 23 13 214 124 426 246 212 122 401 231 420 242 19 11 127 73 240
138 213 123 225 130 383 220 61 35 95 60 92 68 -3 7 0 10 5 7 11 -7 7 36 -4
54 -4 5 -2 13 4 16 8 5 7 12 -2 23 -10 12 -10 14 0 8 6 -4 12 -2 12 3 0 6 -6
11 -12 11 -10 0 -9 3 1 9 10 6 10 10 1 16 -9 6 -9 9 0 15 9 6 9 12 0 30 -9 17
-9 21 0 15 14 -9 10 27 -5 37 -6 5 -6 8 2 8 11 0 10 30 -2 49 -3 5 -1 13 5 16
8 5 7 11 -1 22 -10 11 -10 16 0 22 10 7 11 13 1 31 -8 15 -8 20 -1 16 6 -4 11
-3 11 3 0 5 -5 13 -11 17 -8 5 -8 9 1 14 9 6 9 12 0 30 -8 15 -8 20 -1 16 15
-10 14 7 -1 22 -9 9 -9 12 0 12 12 0 12 26 -1 46 -3 6 -3 14 0 18 10 10 11
256 1 262 -4 3 -4 13 2 23 6 12 5 22 -3 31 -9 10 -9 11 1 6 6 -4 12 -2 12 3 0
6 -5 11 -10 11 -7 0 -7 6 0 20 6 11 7 20 1 20 -12 0 -9 33 4 43 6 6 5 10 -3
14 -10 4 -10 8 0 21 10 12 10 14 1 8 -7 -4 -13 -2 -13 3 0 6 6 11 13 11 9 0 8
3 -2 9 -11 7 -11 10 0 15 11 5 11 7 1 12 -10 5 -10 9 0 22 10 12 10 14 1 8 -7
-4 -13 -2 -13 3 0 6 6 11 13 11 9 0 8 3 -2 9 -11 7 -11 10 0 15 11 5 11 7 1
12 -10 5 -10 9 0 22 10 12 10 14 1 8 -7 -4 -13 -2 -13 3 0 6 6 11 13 11 9 0 8
3 -2 9 -11 7 -11 10 0 15 11 5 11 7 1 12 -10 5 -10 9 0 22 10 12 10 14 1 8 -7
-4 -13 -3 -13 3 0 5 6 12 13 15 9 5 9 7 0 12 -9 4 -10 11 -3 25 7 13 7 19 1
19 -7 0 -7 8 -1 24 6 16 5 27 -3 35 -8 8 -8 14 -2 19 15 10 17 32 5 46 -5 7
-7 16 -3 20 12 12 10 190 -2 198 -7 5 -7 8 1 8 12 0 12 29 -1 49 -5 10 -4 12
3 7 7 -4 12 -3 12 3 0 5 -5 13 -11 17 -8 5 -8 9 1 14 9 6 9 12 0 30 -8 15 -8
20 -1 16 6 -4 11 -3 11 3 0 5 -5 13 -11 17 -8 5 -8 9 1 14 9 6 9 12 0 30 -8
16 -9 20 -1 15 12 -7 9 34 -3 54 -4 5 -2 13 4 16 8 5 7 12 -2 23 -10 12 -10
14 0 8 6 -4 12 -2 12 3 0 6 -6 11 -12 11 -10 0 -9 3 1 9 10 6 10 10 1 16 -9 6
-9 9 0 15 9 6 9 12 0 30 -9 17 -9 21 0 15 14 -9 10 27 -5 37 -6 5 -6 8 2 8 11
0 10 36 -2 48 -2 3 0 11 6 18 7 8 7 14 -1 19 -5 3 -10 12 -10 18 0 7 4 6 10
-3 8 -12 9 -9 8 12 -2 24 -34 45 -313 206 -458 265 -1024 592 -1070 617 -22
13 -174 100 -338 194 -165 94 -304 171 -310 171 -7 0 -101 -52 -209 -114z
m347 -191 c33 -19 85 -49 116 -66 l56 -32 0 -174 -1 -174 -68 -40 c-80 -47
-184 -105 -214 -120 -18 -9 -43 1 -165 71 -79 46 -146 84 -148 86 -2 2 -4 17
-4 34 0 36 -6 36 -102 11 -204 -54 -409 -148 -565 -259 -164 -116 -329 -287
-433 -447 -105 -163 -197 -382 -232 -554 -16 -78 -20 -102 -30 -191 -7 -50 -6
-247 0 -300 3 -25 7 -69 10 -99 3 -29 8 -57 10 -61 7 -11 -5 -40 -16 -40 -4 0
-35 -16 -68 -35 -64 -38 -77 -42 -78 -22 -1 19 -14 91 -18 105 -25 73 -25 511
0 584 2 7 6 27 8 43 12 77 66 267 97 340 116 269 219 425 399 606 173 172 297
262 506 364 144 71 261 112 412 146 l101 23 -2 50 -1 50 149 88 150 87 35 -20
c20 -10 63 -35 96 -54z m512 -300 c296 -108 565 -305 798 -586 96 -115 237
-374 288 -529 100 -300 129 -643 77 -900 -6 -30 -13 -68 -16 -85 -4 -28 -23
-98 -57 -207 l-15 -48 47 -25 46 -25 0 -175 0 -174 -110 -62 c-60 -35 -127
-74 -148 -88 -45 -29 -21 -38 -253 97 l-91 53 1 174 c1 95 3 175 6 177 3 3 69
41 148 86 141 80 144 81 173 67 16 -9 29 -13 29 -10 0 3 0 7 0 10 0 3 7 22 14
42 21 55 55 211 63 290 9 85 10 330 0 403 -21 171 -95 421 -159 534 -5 11 -22
40 -36 65 -140 253 -346 467 -597 621 -75 46 -204 108 -270 131 -22 7 -43 16
-48 19 -6 5 -12 143 -8 173 2 12 16 9 118 -28z m-231 -776 c645 -372 604 -346
605 -377 0 -15 1 -278 1 -586 l1 -558 -29 -24 c-16 -13 -32 -23 -35 -24 -4 0
-421 -236 -529 -300 -8 -4 -109 -63 -223 -129 l-208 -121 -132 76 c-73 42
-148 85 -167 96 -28 16 -222 127 -473 271 -18 11 -82 48 -142 83 l-111 64 1
589 c0 324 2 591 5 594 3 2 145 84 315 182 171 98 378 217 461 265 83 48 157
90 165 93 11 6 41 24 75 46 1 1 190 -108 420 -240z m-1788 -1533 c71 -41 138
-80 149 -87 19 -11 20 -23 20 -186 l0 -174 -29 -15 c-15 -8 -28 -18 -28 -23 0
-13 167 -174 235 -227 125 -97 270 -180 406 -235 74 -29 194 -67 233 -73 18
-3 39 -8 47 -10 73 -26 352 -39 514 -24 95 8 261 43 354 74 163 55 413 195
535 302 15 12 32 22 38 22 7 0 45 -19 85 -42 l74 -42 -23 -21 c-260 -239 -658
-426 -983 -460 -27 -3 -63 -8 -79 -11 -32 -7 -285 -7 -361 0 -200 18 -437 87
-633 184 -194 96 -315 185 -487 355 l-120 118 -38 -21 -38 -22 -137 78 c-75
42 -144 83 -152 90 -12 10 -15 43 -14 178 0 99 4 170 10 176 8 8 283 168 291
170 1 0 60 -33 131 -74z"/>
<path d="M2475 4451 l-80 -47 -3 -84 c-3 -111 0 -122 46 -147 21 -11 59 -32
83 -46 l44 -26 80 46 c44 25 83 51 87 56 3 6 6 53 5 106 l-2 94 -72 43 c-39
23 -80 44 -90 47 -10 3 -51 -15 -98 -42z"/>
<path d="M3978 1843 l-78 -45 0 -102 0 -102 83 -47 c46 -26 87 -47 92 -47 4 0
44 21 89 47 l83 46 -1 101 -1 101 -80 47 c-44 27 -87 47 -95 47 -8 -1 -50 -22
-92 -46z"/>
<path d="M2307 3015 c-137 -80 -253 -145 -258 -145 -11 0 -10 21 -12 -318 -2
-241 0 -285 13 -296 14 -11 435 -258 487 -285 20 -10 50 4 275 135 139 80 256
151 260 157 3 6 6 142 6 303 l0 293 -132 77 c-72 42 -147 86 -166 96 -19 11
-76 45 -127 74 -50 30 -93 54 -95 54 -1 -1 -115 -66 -251 -145z"/>
<path d="M971 1846 c-40 -24 -76 -48 -80 -54 -5 -8 -6 -160 -2 -194 1 -8 156
-98 169 -98 5 0 46 21 90 47 l81 47 3 70 c6 126 4 131 -60 168 -90 51 -104 58
-116 58 -6 -1 -44 -20 -85 -44z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -1,13 +1,14 @@
{
"name": "",
"short_name": "",
"icons": [
{
"src": "/images/favicon/android-chrome-192x192.png",
"src": "/images/favicons/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/images/favicon/android-chrome-512x512.png",
"src": "/images/favicons/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -5,22 +5,20 @@
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta http-equiv="Content-Language" content="en">
<meta name="msapplication-TileColor" content="#2d89ef">
<meta name="theme-color" content="#4188c9">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="mobile-web-app-capable" content="yes">
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<title><%- title %></title>
<link rel="apple-touch-icon" sizes="180x180" href="/images/favicons/apple-touch-icon.png?v=<%= version %>">
<link rel="icon" type="image/png" sizes="32x32" href="/images/favicons/favicon-32x32.png?v=<%= version %>">
<link rel="icon" type="image/png" sizes="16x16" href="/images/favicons/favicon-16x16.png?v=<%= version %>">
<link rel="manifest" href="/images/favicons/site.webmanifest?v=<%= version %>">
<link rel="mask-icon" href="/images/favicons/safari-pinned-tab.svg?v=<%= version %>" color="#5bbad5">
<link rel="shortcut icon" href="/images/favicons/favicon.ico?v=<%= version %>">
<meta name="msapplication-TileColor" content="#f5f5f5">
<meta name="msapplication-config" content="/images/favicons/browserconfig.xml?v=<%= version %>">
<link rel="apple-touch-icon" sizes="180x180" href="/images/favicons/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/images/favicons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/images/favicons/favicon-16x16.png">
<link rel="manifest" href="/images/favicons/site.webmanifest">
<link rel="mask-icon" href="/images/favicons/safari-pinned-tab.svg" color="#5bbad5">
<link rel="shortcut icon" href="/images/favicons/favicon.ico">
<meta name="msapplication-TileColor" content="#333333">
<meta name="msapplication-config" content="/images/favicons/browserconfig.xml">
<meta name="theme-color" content="#ffffff">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,300i,400,400i,500,500i,600,600i,700,700i&amp;subset=latin-ext">
<link href="/css/main.css?v=<%= version %>" rel="stylesheet">

View File

@ -3,24 +3,35 @@
<div class="col col-login mx-auto">
<form class="card" action="" method="post">
<div class="card-body p-6">
<div class="card-title"><%- i18n('login', 'title') %></div>
<div class="form-group">
<label class="form-label"><%- i18n('str', 'email-address') %></label>
<input name="identity" type="email" class="form-control" placeholder="<%- i18n('str', 'email-address') %>" required>
</div>
<div class="form-group">
<label class="form-label"><%- i18n('str', 'password') %></label>
<input name="secret" type="password" class="form-control" placeholder="<%- i18n('str', 'password') %>" required>
<div class="invalid-feedback secret-error"></div>
</div>
<div class="form-footer">
<button type="submit" class="btn btn-teal btn-block"><%- i18n('str', 'sign-in') %></button>
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-6">
<div class="text-center p-6">
<img src="/images/logo-text-vertical-grey.png" alt="Logo" />
<div class="text-center text-muted mt-5">
<%- i18n('main', 'version', {version: getVersion()}) %>
</div>
</div>
</div>
<div class="col-sm-12 col-md-6">
<div class="card-title"><%- i18n('login', 'title') %></div>
<div class="form-group">
<label class="form-label"><%- i18n('str', 'email-address') %></label>
<input name="identity" type="email" class="form-control" placeholder="<%- i18n('str', 'email-address') %>" required>
</div>
<div class="form-group">
<label class="form-label"><%- i18n('str', 'password') %></label>
<input name="secret" type="password" class="form-control" placeholder="<%- i18n('str', 'password') %>" required>
<div class="invalid-feedback secret-error"></div>
</div>
<div class="form-footer">
<button type="submit" class="btn btn-teal btn-block"><%- i18n('str', 'sign-in') %></button>
</div>
</div>
</div>
</div>
</div>
</form>
<div class="text-center text-muted">
<%- i18n('main', 'app') %> <%- i18n('main', 'version', {version: getVersion()}) %>
</div>
</div>
</div>
</div>

View File

@ -1,6 +1,6 @@
{
"name": "nginx-proxy-manager",
"version": "2.1.2",
"version": "0.0.0",
"description": "A beautiful interface for creating Nginx endpoints",
"main": "js/index.js",
"devDependencies": {

View File

@ -32,3 +32,7 @@ a:hover {
display: flex;
flex-wrap: wrap;
}
.col-login {
max-width: 48rem;
}

55
scripts/docs-upload Executable file
View File

@ -0,0 +1,55 @@
#!/bin/bash
# Note: This script is designed to be run inside CI builds
CYAN='\E[1;36m'
YELLOW='\E[1;33m'
BLUE='\E[1;34m'
GREEN='\E[1;32m'
RESET='\E[0m'
echo -e "${BLUE} ${CYAN}Uploading docs in: ${YELLOW}$1${RESET}"
cd "$1" || exit 1
ALL_FILES=$(find . -follow)
for FILE in $ALL_FILES
do
# remove preceeding ./
FILE=$(echo "$FILE" | sed -E "s/\.\///g")
echo '======================================='
echo "FILE: $FILE"
if [[ -d $FILE ]]; then
echo "Skipping $FILE because it's a directory"
elif [[ -f $FILE ]]; then
PARAM_STRING="--guess-mime-type"
EXT="${FILE##*.}"
if [ "$EXT" == "css" ]; then
PARAM_STRING="-mtext/css"
elif [ "$EXT" == "js" ]; then
PARAM_STRING="-mapplication/javascript"
elif [[ "$EXT" == "html" ]]; then
PARAM_STRING="-mtext/html"
elif [[ "$EXT" == "png" ]]; then
PARAM_STRING="-mimage/png"
elif [[ "$EXT" == "jpg" ]]; then
PARAM_STRING="-mimage/jpg"
elif [[ "$EXT" == "svg" ]]; then
PARAM_STRING="-mimage/svg+xml"
fi
DEST_FOLDER=$(dirname "$FILE")
if [ "$DEST_FOLDER" == "." ]; then
DEST_FOLDER=
else
DEST_FOLDER="${DEST_FOLDER}/"
fi
echo s3cmd -v -f -P "$PARAM_STRING" --add-header="Cache-Control:public,max-age=604800" sync "$FILE" "s3://$S3_BUCKET/$DEST_FOLDER"
s3cmd -v -f -P "$PARAM_STRING" --add-header="Cache-Control:public,max-age=604800" sync "$FILE" "s3://$S3_BUCKET/$DEST_FOLDER"
rc=$?; if [ $rc != 0 ]; then exit $rc; fi
fi
done
echo -e "${BLUE} ${GREEN}Upload Complete${RESET}"