Skip to content

Commit 32d6bf8

Browse files
committed
Merge branch 'v2' of github.com:jc21/nginx-proxy-manager
2 parents 2226359 + a4b918e commit 32d6bf8

File tree

378 files changed

+18580
-7534
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

378 files changed

+18580
-7534
lines changed

.babelrc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"presets": [
3+
["env", {
4+
"targets": {
5+
"browsers": ["Chrome >= 65"]
6+
},
7+
"debug": false,
8+
"modules": false,
9+
"useBuiltIns": "usage"
10+
}]
11+
]
12+
}

.gitignore

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
.DS_Store
22
.idea
33
._*
4-
manager/node_modules
5-
manager/core*
6-
manager/dist
7-
manager/webpack_stats.html
8-
config/*
9-
letsencrypt/*
4+
node_modules
5+
core*
6+
config/development.json
7+
dist
8+
webpack_stats.html
9+
data/*
10+
yarn-error.log
11+
yarn.lock
12+
tmp
13+
certbot.log
14+

Dockerfile

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM jc21/nginx-proxy-manager-base
1+
FROM jc21/nginx-proxy-manager-base:latest
22

33
MAINTAINER Jamie Curnow <[email protected]>
44
LABEL maintainer="Jamie Curnow <[email protected]>"
@@ -7,6 +7,8 @@ ENV SUPPRESS_NO_CONFIG_WARNING=1
77
ENV S6_FIX_ATTRS_HIDDEN=1
88
RUN echo "fs.file-max = 65535" > /etc/sysctl.conf
99

10+
# Nginx, Node and required packages should already be installed from the base image
11+
1012
# root filesystem
1113
COPY rootfs /
1214

@@ -17,13 +19,14 @@ RUN curl -L -o /tmp/s6-overlay-amd64.tar.gz "https://github.com/just-containers/
1719
# App
1820
ENV NODE_ENV=production
1921

20-
ADD manager/dist /srv/manager/dist
21-
ADD manager/node_modules /srv/manager/node_modules
22-
ADD manager/src/backend /srv/manager/src/backend
23-
ADD manager/package.json /srv/manager/package.json
22+
ADD dist /app/dist
23+
ADD node_modules /app/node_modules
24+
ADD src/backend /app/src/backend
25+
ADD package.json /app/package.json
26+
ADD knexfile.js /app/knexfile.js
2427

2528
# Volumes
26-
VOLUME [ "/config", "/etc/letsencrypt" ]
29+
VOLUME [ "/data", "/etc/letsencrypt" ]
2730
CMD [ "/init" ]
2831

2932
HEALTHCHECK --interval=15s --timeout=3s CMD curl -f http://localhost:9876/health || exit 1

Dockerfile.armhf

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ ENV SUPPRESS_NO_CONFIG_WARNING=1
77
ENV S6_FIX_ATTRS_HIDDEN=1
88
RUN echo "fs.file-max = 65535" > /etc/sysctl.conf
99

10+
# Nginx, Node and required packages should already be installed from the base image
11+
1012
# root filesystem
1113
COPY rootfs /
1214

@@ -17,13 +19,14 @@ RUN curl -L -o /tmp/s6-overlay-armhf.tar.gz "https://github.com/just-containers/
1719
# App
1820
ENV NODE_ENV=production
1921

20-
ADD manager/dist /srv/manager/dist
21-
ADD manager/node_modules /srv/manager/node_modules
22-
ADD manager/src/backend /srv/manager/src/backend
23-
ADD manager/package.json /srv/manager/package.json
22+
ADD dist /app/dist
23+
ADD node_modules /app/node_modules
24+
ADD src/backend /app/src/backend
25+
ADD package.json /app/package.json
26+
ADD knexfile.js /app/knexfile.js
2427

2528
# Volumes
26-
VOLUME [ "/config", "/etc/letsencrypt" ]
29+
VOLUME [ "/data", "/etc/letsencrypt" ]
2730
CMD [ "/init" ]
2831

2932
HEALTHCHECK --interval=15s --timeout=3s CMD curl -f http://localhost:9876/health || exit 1

Jenkinsfile

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,18 @@ pipeline {
66
agent any
77
environment {
88
IMAGE_NAME = "nginx-proxy-manager"
9+
BASE_IMAGE_NAME = "jc21/nginx-proxy-manager-base:v2"
910
TEMP_IMAGE_NAME = "nginx-proxy-manager-build_${BUILD_NUMBER}"
10-
TEMP_IMAGE_NAME_ARM = "nginx-proxy-manager-armhf-build_${BUILD_NUMBER}"
11+
TEMP_IMAGE_NAME_ARM = "nginx-proxy-manager-arm-build_${BUILD_NUMBER}"
1112
TAG_VERSION = getPackageVersion()
12-
MAJOR_VERSION = "1"
13+
MAJOR_VERSION = "2"
1314
}
1415
stages {
16+
stage('Prepare') {
17+
steps {
18+
sh 'docker pull $DOCKER_CI_TOOLS'
19+
}
20+
}
1521
stage('Build') {
1622
parallel {
1723
stage('x86_64') {
@@ -21,34 +27,33 @@ pipeline {
2127
steps {
2228
ansiColor('xterm') {
2329
// Codebase
24-
sh 'docker pull jc21/$IMAGE_NAME-base'
25-
sh 'docker run --rm -v $(pwd)/manager:/srv/manager -w /srv/manager jc21/$IMAGE_NAME-base yarn --registry=$NPM_REGISTRY install'
26-
sh 'docker run --rm -v $(pwd)/manager:/srv/manager -w /srv/manager jc21/$IMAGE_NAME-base gulp build'
30+
sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME yarn --registry=$NPM_REGISTRY install'
31+
sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME npm run-script build'
2732
sh 'rm -rf node_modules'
28-
sh 'docker run --rm -v $(pwd)/manager:/srv/manager -w /srv/manager jc21/$IMAGE_NAME-base yarn --registry=$NPM_REGISTRY install --prod'
29-
sh 'docker run --rm -v $(pwd)/manager:/data $DOCKER_CI_TOOLS node-prune'
33+
sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME yarn --registry=$NPM_REGISTRY install --prod'
34+
sh 'docker run --rm -v $(pwd):/data $DOCKER_CI_TOOLS node-prune'
3035

3136
// Docker Build
3237
sh 'docker build --pull --no-cache --squash --compress -t $TEMP_IMAGE_NAME .'
3338

3439
// Private Registry
40+
sh 'docker tag $TEMP_IMAGE_NAME $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$TAG_VERSION'
41+
sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$TAG_VERSION'
42+
sh 'docker tag $TEMP_IMAGE_NAME $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$MAJOR_VERSION'
43+
sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$MAJOR_VERSION'
3544
sh 'docker tag $TEMP_IMAGE_NAME $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:latest'
3645
sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:latest'
37-
sh 'docker tag $TEMP_IMAGE_NAME ${DOCKER_PRIVATE_REGISTRY}/$IMAGE_NAME:$TAG_VERSION'
38-
sh 'docker push ${DOCKER_PRIVATE_REGISTRY}/$IMAGE_NAME:$TAG_VERSION'
39-
sh 'docker tag $TEMP_IMAGE_NAME ${DOCKER_PRIVATE_REGISTRY}/$IMAGE_NAME:$MAJOR_VERSION'
40-
sh 'docker push ${DOCKER_PRIVATE_REGISTRY}/$IMAGE_NAME:$MAJOR_VERSION'
4146

4247
// Dockerhub
43-
sh 'docker tag $TEMP_IMAGE_NAME docker.io/jc21/$IMAGE_NAME:latest'
4448
sh 'docker tag $TEMP_IMAGE_NAME docker.io/jc21/$IMAGE_NAME:$TAG_VERSION'
4549
sh 'docker tag $TEMP_IMAGE_NAME docker.io/jc21/$IMAGE_NAME:$MAJOR_VERSION'
50+
sh 'docker tag $TEMP_IMAGE_NAME docker.io/jc21/$IMAGE_NAME:latest'
4651

4752
withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) {
4853
sh "docker login -u '${duser}' -p '$dpass'"
49-
sh 'docker push docker.io/jc21/$IMAGE_NAME:latest'
5054
sh 'docker push docker.io/jc21/$IMAGE_NAME:$TAG_VERSION'
5155
sh 'docker push docker.io/jc21/$IMAGE_NAME:$MAJOR_VERSION'
56+
sh 'docker push docker.io/jc21/$IMAGE_NAME:latest'
5257
}
5358

5459
sh 'docker rmi $TEMP_IMAGE_NAME'
@@ -65,32 +70,32 @@ pipeline {
6570
steps {
6671
ansiColor('xterm') {
6772
// Codebase
68-
sh 'docker pull jc21/$IMAGE_NAME-base:armhf'
69-
sh 'docker run --rm -v $(pwd)/manager:/srv/manager -w /srv/manager jc21/$IMAGE_NAME-base:armhf yarn --registry=$NPM_REGISTRY install'
70-
sh 'docker run --rm -v $(pwd)/manager:/srv/manager -w /srv/manager jc21/$IMAGE_NAME-base:armhf gulp build'
71-
sh 'docker run --rm -v $(pwd)/manager:/srv/manager -w /srv/manager jc21/$IMAGE_NAME-base:armhf yarn --registry=$NPM_REGISTRY install --prod'
73+
sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME-armhf yarn --registry=$NPM_REGISTRY install'
74+
sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME-armhf npm run-script build'
75+
sh 'rm -rf node_modules'
76+
sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME-armhf yarn --registry=$NPM_REGISTRY install --prod'
7277

7378
// Docker Build
74-
sh 'docker build --pull --no-cache --squash --compress -f Dockerfile.armhf -t $TEMP_IMAGE_NAME_ARM .'
79+
sh 'docker build --pull --no-cache --squash --compress -t $TEMP_IMAGE_NAME_ARM -f Dockerfile.armhf .'
7580

7681
// Private Registry
82+
sh 'docker tag $TEMP_IMAGE_NAME_ARM $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$TAG_VERSION-armhf'
83+
sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$TAG_VERSION-armhf'
84+
sh 'docker tag $TEMP_IMAGE_NAME_ARM $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$MAJOR_VERSION-armhf'
85+
sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$MAJOR_VERSION-armhf'
7786
sh 'docker tag $TEMP_IMAGE_NAME_ARM $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:latest-armhf'
7887
sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:latest-armhf'
79-
sh 'docker tag $TEMP_IMAGE_NAME_ARM ${DOCKER_PRIVATE_REGISTRY}/$IMAGE_NAME:$TAG_VERSION-armhf'
80-
sh 'docker push ${DOCKER_PRIVATE_REGISTRY}/$IMAGE_NAME:$TAG_VERSION-armhf'
81-
sh 'docker tag $TEMP_IMAGE_NAME_ARM ${DOCKER_PRIVATE_REGISTRY}/$IMAGE_NAME:$MAJOR_VERSION-armhf'
82-
sh 'docker push ${DOCKER_PRIVATE_REGISTRY}/$IMAGE_NAME:$MAJOR_VERSION-armhf'
8388

8489
// Dockerhub
85-
sh 'docker tag $TEMP_IMAGE_NAME_ARM docker.io/jc21/$IMAGE_NAME:latest-armhf'
8690
sh 'docker tag $TEMP_IMAGE_NAME_ARM docker.io/jc21/$IMAGE_NAME:$TAG_VERSION-armhf'
8791
sh 'docker tag $TEMP_IMAGE_NAME_ARM docker.io/jc21/$IMAGE_NAME:$MAJOR_VERSION-armhf'
92+
sh 'docker tag $TEMP_IMAGE_NAME_ARM docker.io/jc21/$IMAGE_NAME:latest-armhf'
8893

8994
withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) {
9095
sh "docker login -u '${duser}' -p '$dpass'"
91-
sh 'docker push docker.io/jc21/$IMAGE_NAME:latest-armhf'
9296
sh 'docker push docker.io/jc21/$IMAGE_NAME:$TAG_VERSION-armhf'
9397
sh 'docker push docker.io/jc21/$IMAGE_NAME:$MAJOR_VERSION-armhf'
98+
sh 'docker push docker.io/jc21/$IMAGE_NAME:latest-armhf'
9499
}
95100

96101
sh 'docker rmi $TEMP_IMAGE_NAME_ARM'
@@ -113,7 +118,7 @@ pipeline {
113118
}
114119

115120
def getPackageVersion() {
116-
ver = sh(script: 'docker run --rm -v $(pwd)/manager:/data $DOCKER_CI_TOOLS bash -c "cat /data/package.json|jq -r \'.version\'"', returnStdout: true)
121+
ver = sh(script: 'docker run --rm -v $(pwd):/data $DOCKER_CI_TOOLS bash -c "cat /data/package.json|jq -r \'.version\'"', returnStdout: true)
117122
return ver.trim()
118123
}
119124

README.md

Lines changed: 58 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -2,72 +2,75 @@
22

33
# Nginx Proxy Manager
44

5-
![Version](https://img.shields.io/badge/version-1.1.2-green.svg?style=for-the-badge)
5+
![Version](https://img.shields.io/badge/version-2.0.0-green.svg?style=for-the-badge)
66
![Stars](https://img.shields.io/docker/stars/jc21/nginx-proxy-manager.svg?style=for-the-badge)
77
![Pulls](https://img.shields.io/docker/pulls/jc21/nginx-proxy-manager.svg?style=for-the-badge)
88

99
This project comes as a pre-built docker image that enables you to easily forward to your websites
1010
running at home or otherwise, including free SSL, without having to know too much about Nginx or Letsencrypt.
1111

12+
----------
13+
14+
**WARNING: Version 2 a complete rewrite!** If you are using the `latest` docker tag and update to version 2
15+
without preparation, horrible things might happen. Refer to the [Importing Documentation](doc/IMPORTING.md).
16+
17+
----------
1218

1319
## Features
1420

15-
- Clean and simple interface
16-
- Create an unlimited number of hosts and forward them to any IPv4/Port combination running HTTP
17-
- Secure your sites with SSL and optionally force SSL
18-
- Secure your sites with Basic HTTP Authentication Access Lists
19-
- Advanced Nginx config option for super users
20-
- 3 ___domain uses:
21-
- Proxy requests to upstream server
22-
- Redirect requests to another ___domain
23-
- Return immediate 404's
21+
- Beautiful and Secure Admin Interface based on [Tabler](https://tabler.github.io/)
22+
- Easily create forwarding domains, redirections, streams and 404 hosts without knowing anything about Nginx
23+
- Free SSL using Let's Encrypt or provide your own custom SSL certificates
24+
- Access Lists and basic HTTP Authentication for your hosts
25+
- Advanced Nginx configuration available for super users
26+
- User management, permissions and audit log
2427

2528

26-
## Using [Rancher](https://rancher.com)?
29+
## Screenshots
2730

28-
Easily start an Nginx Proxy Manager Stack by adding [my template catalog](https://github.com/jc21/rancher-templates).
31+
[![Login](https://public.jc21.com/nginx-proxy-manager/v2/small/login.jpg "Login")](https://public.jc21.com/nginx-proxy-manager/v2/large/login.jpg)
32+
[![Dashboard](https://public.jc21.com/nginx-proxy-manager/v2/small/dashboard.jpg "Dashboard")](https://public.jc21.com/nginx-proxy-manager/v2/large/dashboard.jpg)
33+
[![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)
34+
[![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)
35+
[![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)
36+
[![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)
37+
[![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)
38+
[![Streams](https://public.jc21.com/nginx-proxy-manager/v2/small/streams.jpg "Streams")](https://public.jc21.com/nginx-proxy-manager/v2/large/streams.jpg)
39+
[![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)
40+
[![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)
41+
[![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)
42+
[![Certificates](https://public.jc21.com/nginx-proxy-manager/v2/small/certificates.jpg "Certificates")](https://public.jc21.com/nginx-proxy-manager/v2/large/certificates.jpg)
43+
[![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)
44+
[![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)
45+
[![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)
46+
[![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)
47+
[![Users](https://public.jc21.com/nginx-proxy-manager/v2/small/users.jpg "Users")](https://public.jc21.com/nginx-proxy-manager/v2/large/users.jpg)
48+
[![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)
49+
[![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)
2950

3051

3152
## Getting started
3253

33-
### Method 1: Using docker-compose
34-
35-
By far the easiest way to get up and running. Create this `docker-compose.yml`
36-
37-
```yml
38-
version: "2"
39-
services:
40-
app:
41-
image: jc21/nginx-proxy-manager
42-
restart: always
43-
ports:
44-
- 80:80
45-
- 81:81
46-
- 443:443
47-
volumes:
48-
- ./config:/config
49-
- ./letsencrypt:/etc/letsencrypt
50-
```
54+
Please consult the [installation instructions](doc/INSTALL.md) for a complete guide or
55+
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`
5156

52-
Then:
5357

54-
```bash
55-
docker-compose up -d
56-
```
58+
## Importing from Version 1?
5759

60+
Here's a [guide for you to migrate your configuration](doc/IMPORTING.md). You should definitely read the [installation instructions](doc/INSTALL.md) first though.
5861

59-
### Method 2: Using vanilla docker
62+
**Why should I?**
6063

61-
```bash
62-
docker run -d \
63-
-p 80:80 \
64-
-p 81:81 \
65-
-p 443:443 \
66-
-v /path/to/config:/config \
67-
-v /path/to/letsencrypt:/etc/letsencrypt \
68-
--restart always \
69-
jc21/nginx-proxy-manager
70-
```
64+
Version 2 has the following improvements:
65+
66+
- Management security and multiple user access
67+
- User permissions and visibility
68+
- Custom SSL certificate support
69+
- Audit log of changes
70+
- Broken nginx config detection
71+
- Multiple domains in Let's Encrypt certificates
72+
- Wildcard ___domain name support (not available with a Let's Encrypt certificate though)
73+
- It's super sexy
7174

7275

7376
### Raspberry Pi / ARMHF
@@ -87,16 +90,21 @@ docker run -d \
8790

8891
## Administration
8992

90-
Now that your docker container is running, connect to it on port `81` for the admin interface.
93+
When your docker container is running, connect to it on port `81` for the admin interface.
9194

9295
[http://localhost:81](http://localhost:81)
9396

94-
There is no authentication on this interface to keep things simple. It is expected that you would not
95-
expose port 81 to the outside world.
97+
Note: Requesting SSL Certificates won't work until this project is accessible from the outside world, as explained below.
9698

97-
From here, the rest should be self explanatory.
9899

99-
Note: Requesting SSL Certificates won't work until this project is accessible from the outside world, as explained below.
100+
### Default Administrator User
101+
102+
```
103+
104+
Password: changeme
105+
```
106+
107+
Immediately after logging in with this default user you will be asked to modify your details and change your password.
100108

101109

102110
## Hosting your home network
@@ -108,18 +116,3 @@ I won't go in to too much detail here but here are the basics for someone new to
108116
3. Configure your ___domain name details to point to your home, either with a static ip or a service like DuckDNS
109117
4. Use the Nginx Proxy Manager here as your gateway to forward to your other web based services
110118

111-
112-
## Screenshots
113-
114-
[![Screenshot](https://public.jc21.com/nginx-proxy-manager/npm-1-sm.jpg "Screenshot")](https://public.jc21.com/nginx-proxy-manager/npm-1.jpg)
115-
[![Screenshot](https://public.jc21.com/nginx-proxy-manager/npm-2-sm.jpg "Screenshot")](https://public.jc21.com/nginx-proxy-manager/npm-2.jpg)
116-
[![Screenshot](https://public.jc21.com/nginx-proxy-manager/npm-3-sm.jpg "Screenshot")](https://public.jc21.com/nginx-proxy-manager/npm-3.jpg)
117-
[![Screenshot](https://public.jc21.com/nginx-proxy-manager/npm-4-sm.jpg "Screenshot")](https://public.jc21.com/nginx-proxy-manager/npm-4.jpg)
118-
119-
## TODO
120-
121-
- Pass on human readable ssl cert errors to the ui
122-
- UI: Allow column sorting on tables
123-
- UI: Allow filtering hosts by types
124-
- Advanced option to overwrite the default ___location block (or regex to do it automatically)
125-
- Add nice upstream error pages

0 commit comments

Comments
 (0)