From dd7b052f4d3657b7d774d6006c9892592e71f2c1 Mon Sep 17 00:00:00 2001 From: okxlin Date: Thu, 6 Jul 2023 01:26:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0nginx-proxy-manager?= =?UTF-8?q?=E5=88=B0=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/nginx-proxy-manager/README.md | 122 ++++++++++++++++++ apps/nginx-proxy-manager/data.yml.bak | 20 +++ .../github-pr-3027/data.yml | 40 ++++++ .../github-pr-3027/docker-compose.yml | 21 +++ apps/nginx-proxy-manager/latest/data.yml | 40 ++++++ .../latest/docker-compose.yml | 21 +++ apps/nginx-proxy-manager/logo.png | Bin 0 -> 19892 bytes 7 files changed, 264 insertions(+) create mode 100644 apps/nginx-proxy-manager/README.md create mode 100644 apps/nginx-proxy-manager/data.yml.bak create mode 100644 apps/nginx-proxy-manager/github-pr-3027/data.yml create mode 100644 apps/nginx-proxy-manager/github-pr-3027/docker-compose.yml create mode 100644 apps/nginx-proxy-manager/latest/data.yml create mode 100644 apps/nginx-proxy-manager/latest/docker-compose.yml create mode 100644 apps/nginx-proxy-manager/logo.png diff --git a/apps/nginx-proxy-manager/README.md b/apps/nginx-proxy-manager/README.md new file mode 100644 index 00000000..20a6c792 --- /dev/null +++ b/apps/nginx-proxy-manager/README.md @@ -0,0 +1,122 @@ +# 使用说明 + +控制台默认账户密码 +``` +Email: admin@example.com +Password: changeme +``` + + +# 原始相关 + +

+ +

+ + + + + + + +

+ +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](https://nginxproxymanager.com/setup/) +- [Screenshots](https://nginxproxymanager.com/screenshots/) + +## Project Goal + +I created this project to fill a personal need to provide users with a 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. + +Buy Me A Coffee + + +## 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/install/) +- [Docker-Compose Install documentation](https://docs.docker.com/compose/install/) + +2. Create a docker-compose.yml file similar to this: + +```yml +version: '3.8' +services: + app: + image: 'jc21/nginx-proxy-manager:latest' + restart: unless-stopped + ports: + - '80:80' + - '81:81' + - '443:443' + volumes: + - ./data:/data + - ./letsencrypt:/etc/letsencrypt +``` + +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 + +# If using docker-compose-plugin +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. +Sometimes this can take a little bit because of the entropy of keys. + +[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. + + +## Contributors + +Special thanks to [all of our contributors](https://github.com/NginxProxyManager/nginx-proxy-manager/graphs/contributors). + + +## 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. [Development Gitter](https://gitter.im/nginx-proxy-manager/community) +4. [Reddit](https://reddit.com/r/nginxproxymanager) diff --git a/apps/nginx-proxy-manager/data.yml.bak b/apps/nginx-proxy-manager/data.yml.bak new file mode 100644 index 00000000..c0dbf64e --- /dev/null +++ b/apps/nginx-proxy-manager/data.yml.bak @@ -0,0 +1,20 @@ +name: NginxProxyManager +tags: + - 工具 +title: 使用简单、强大的界面管理 Nginx 代理主机 +type: 工具 +description: 使用简单、强大的界面管理 Nginx 代理主机 +additionalProperties: + key: nginx-proxy-manager + name: NginxProxyManager + tags: + - Tool + shortDescZh: 使用简单、强大的界面管理 Nginx 代理主机 + shortDescEn: managing Nginx proxy hosts with a simple, powerful interface + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://nginxproxymanager.com/ + github: https://github.com/NginxProxyManager/nginx-proxy-manager + document: https://nginxproxymanager.com/guide/ diff --git a/apps/nginx-proxy-manager/github-pr-3027/data.yml b/apps/nginx-proxy-manager/github-pr-3027/data.yml new file mode 100644 index 00000000..58677464 --- /dev/null +++ b/apps/nginx-proxy-manager/github-pr-3027/data.yml @@ -0,0 +1,40 @@ +additionalProperties: + formFields: + - default: 30080 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: HTTP Port + labelZh: HTTP端口 + required: true + rule: paramPort + type: number + - default: 30081 + edit: true + envKey: PANEL_APP_PORT_HTTP1 + labelEn: Console Port + labelZh: 控制台端口 + required: true + rule: paramPort + type: number + - default: 30443 + edit: true + envKey: PANEL_APP_PORT_HTTP2 + labelEn: HTTPS Port + labelZh: HTTPS端口 + required: true + rule: paramPort + type: number + - default: ./data/data + edit: true + envKey: DATA_PATH + labelEn: Data folder path + labelZh: 数据文件夹路径 + required: true + type: text + - default: ./data/ssl + edit: true + envKey: SSL_PATH + labelEn: SSL folder path + labelZh: 证书文件夹路径 + required: true + type: text diff --git a/apps/nginx-proxy-manager/github-pr-3027/docker-compose.yml b/apps/nginx-proxy-manager/github-pr-3027/docker-compose.yml new file mode 100644 index 00000000..7528ee1d --- /dev/null +++ b/apps/nginx-proxy-manager/github-pr-3027/docker-compose.yml @@ -0,0 +1,21 @@ +version: '3' +services: + nginxpm: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:80" + - "${PANEL_APP_PORT_HTTP1}:81" + - "${PANEL_APP_PORT_HTTP2}:443" + volumes: + - "${DATA_PATH}:/data" + - "${SSL_PATH}:/etc/letsencrypt" + image: jc21/nginx-proxy-manager:github-pr-3027 + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/nginx-proxy-manager/latest/data.yml b/apps/nginx-proxy-manager/latest/data.yml new file mode 100644 index 00000000..58677464 --- /dev/null +++ b/apps/nginx-proxy-manager/latest/data.yml @@ -0,0 +1,40 @@ +additionalProperties: + formFields: + - default: 30080 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: HTTP Port + labelZh: HTTP端口 + required: true + rule: paramPort + type: number + - default: 30081 + edit: true + envKey: PANEL_APP_PORT_HTTP1 + labelEn: Console Port + labelZh: 控制台端口 + required: true + rule: paramPort + type: number + - default: 30443 + edit: true + envKey: PANEL_APP_PORT_HTTP2 + labelEn: HTTPS Port + labelZh: HTTPS端口 + required: true + rule: paramPort + type: number + - default: ./data/data + edit: true + envKey: DATA_PATH + labelEn: Data folder path + labelZh: 数据文件夹路径 + required: true + type: text + - default: ./data/ssl + edit: true + envKey: SSL_PATH + labelEn: SSL folder path + labelZh: 证书文件夹路径 + required: true + type: text diff --git a/apps/nginx-proxy-manager/latest/docker-compose.yml b/apps/nginx-proxy-manager/latest/docker-compose.yml new file mode 100644 index 00000000..34952574 --- /dev/null +++ b/apps/nginx-proxy-manager/latest/docker-compose.yml @@ -0,0 +1,21 @@ +version: '3' +services: + nginxpm: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:80" + - "${PANEL_APP_PORT_HTTP1}:81" + - "${PANEL_APP_PORT_HTTP2}:443" + volumes: + - "${DATA_PATH}:/data" + - "${SSL_PATH}:/etc/letsencrypt" + image: jc21/nginx-proxy-manager:latest + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/nginx-proxy-manager/logo.png b/apps/nginx-proxy-manager/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e4678081a5329202118a04ab73fc94c2131e540f GIT binary patch literal 19892 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