diff --git a/www/caddy/Makefile b/www/caddy/Makefile index f8fe5bf0d..d1427802e 100644 --- a/www/caddy/Makefile +++ b/www/caddy/Makefile @@ -1,8 +1,7 @@ PLUGIN_NAME= caddy -PLUGIN_VERSION= 1.6.3 -PLUGIN_REVISION= 1 +PLUGIN_VERSION= 1.7.0 PLUGIN_DEPENDS= caddy-custom -PLUGIN_COMMENT= Easy to configure Reverse Proxy with Automatic HTTPS and Dynamic DNS +PLUGIN_COMMENT= Modern Reverse Proxy with Automatic HTTPS, Dynamic DNS and Layer4 Routing PLUGIN_MAINTAINER= cedrik@pischem.com .include "../../Mk/plugins.mk" diff --git a/www/caddy/pkg-descr b/www/caddy/pkg-descr index edcee0664..650aa8ef9 100644 --- a/www/caddy/pkg-descr +++ b/www/caddy/pkg-descr @@ -1,33 +1,28 @@ Caddy - The Ultimate Server - makes your sites more secure, more reliable, and more scalable than any other solution. -By default, Caddy automatically obtains and renews TLS certificates for all your sites. +By default, Caddy automatically obtains and renews TLS certificates (Let's Encrypt and ZeroSSL) for all your sites. It's the most advanced HTTPS server in the world. -Reverse Proxy HTTP, HTTPS, FastCGI, WebSockets, gRPC, FastCGI (usually PHP), and more! +* Reverse Proxy HTTP, HTTPS and WebSockets +* Route UDP/TCP traffic with the included Layer4 module: https://github.com/mholt/caddy-l4 +* Dynamic DNS module included: https://github.com/mholt/caddy-dynamicdns +* Large selection of DNS Providers available: https://github.com/caddy-dns WWW: https://caddyserver.com/ - -Main features of this plugin: - -* Easy to configure and reliable! Reverse Proxy any HTTP/HTTPS or WebSocket application in minutes. -* Automatic Let's Encrypt and ZeroSSL certificates with HTTP-01 and TLS-ALPN-01 challenge -* DNS-01 challenge and Dynamic DNS with supported DNS Providers built right in -* Use custom certificates from OPNsense certificate store -* Wildcard Domain and Subdomain support -* Access Lists to restrict access based on static networks -* Basic Auth to restrict access by username and password -* Forward Auth with Authelia -* Syslog-ng integration and HTTP Access Log -* NTLM Transport -* Header manipulation -* Simple load balancing with passive health check -* Widgets for OPNsense Dashboard (24.7 and later) -* Layer4 SNI based routing of TCP/UDP - DOC: https://docs.opnsense.org/manual/how-tos/caddy.html Plugin Changelog ================ +1.7.0 + +* Add: Layer4 protocols: DNS +* Add: DNS Providers: Hetzner +* Change: DNS Providers: Route53 field "max_retries" has been renamed to "hosted_zone_id" +* Cleanup: Refactor "general.volt" from "layout_partials/base_form" to "layout_partials/base_tabs" +* Cleanup: Refactor "general.volt", "reverse_proxy.volt" and "diagnostics.volt" to imported ajaxGet() and ajaxCall() +* Cleanup: Adjust style of all views +* Cleanup: Restructure "general.xml" to include tabs, add new "Advanced Settings" Tab + 1.6.3 * Add: Disable Propagation Timeout in DNS Provider Tab. This can help if the DNS Challenge fails due to DNS Propagation being too slow. diff --git a/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/GeneralController.php b/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/GeneralController.php index 7cc6639f6..0986a01df 100644 --- a/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/GeneralController.php +++ b/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/GeneralController.php @@ -40,9 +40,5 @@ class GeneralController extends IndexController // Assign the general settings form to the view $this->view->pick('OPNsense/Caddy/general'); $this->view->generalForm = $this->getForm("general"); - $this->view->dnsproviderForm = $this->getForm("dnsprovider"); - $this->view->dynamicdnsForm = $this->getForm("dynamicdns"); - $this->view->authproviderForm = $this->getForm("authprovider"); - $this->view->logsettingsForm = $this->getForm("logsettings"); } } diff --git a/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/authprovider.xml b/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/authprovider.xml deleted file mode 100644 index 29527af13..000000000 --- a/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/authprovider.xml +++ /dev/null @@ -1,32 +0,0 @@ -
- - caddy.general.AuthProvider - - dropdown - - - - caddy.general.AuthToDomain - - text - - - - caddy.general.AuthToPort - - text - - - - caddy.general.AuthToTls - - checkbox - - - - caddy.general.AuthToUri - - text - - -
diff --git a/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/dnsprovider.xml b/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/dnsprovider.xml deleted file mode 100644 index b296f9117..000000000 --- a/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/dnsprovider.xml +++ /dev/null @@ -1,66 +0,0 @@ -
- - caddy.general.TlsDnsProvider - - dropdown - - - - caddy.general.TlsDnsApiKey - - text - - - - header - - true - - - caddy.general.TlsDnsSecretApiKey - - text - - - - caddy.general.TlsDnsOptionalField1 - - text - - - - caddy.general.TlsDnsOptionalField2 - - text - - - - caddy.general.TlsDnsOptionalField3 - - text - - - - caddy.general.TlsDnsOptionalField4 - - text - - - - header - - true - - - caddy.general.TlsDnsPropagationResolvers - - text - - - - caddy.general.TlsDnsPropagationTimeout - - checkbox - - -
diff --git a/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/dynamicdns.xml b/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/dynamicdns.xml deleted file mode 100644 index e465103ba..000000000 --- a/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/dynamicdns.xml +++ /dev/null @@ -1,44 +0,0 @@ -
- - caddy.general.DynDnsIpVersions - - dropdown - - - - caddy.general.DynDnsUpdateOnly - - checkbox - - - - caddy.general.DynDnsInterval - - text - 1800 - - - - caddy.general.DynDnsTtl - - text - - - - header - - true - - - caddy.general.DynDnsSimpleHttp - - text - - - - caddy.general.DynDnsInterface - - dropdown - - -
diff --git a/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/general.xml b/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/general.xml index 36e3a2c58..e76e34a2c 100644 --- a/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/general.xml +++ b/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/general.xml @@ -1,72 +1,234 @@
- - caddy.general.enabled - - checkbox - - - - caddy.general.EnableLayer4 - - checkbox - - true - - - caddy.general.HttpPort - - text - 80 - - true - - - caddy.general.HttpsPort - - text - 443 - - true - - - caddy.general.DisableSuperuser - - checkbox - - true - - - caddy.general.TlsEmail - - text - info@example.com - - - - caddy.general.TlsAutoHttps - - dropdown - - - - caddy.general.accesslist - - dropdown - - true - - - caddy.general.abort - - checkbox - - - - caddy.general.GracePeriod - - text - 10 - - true - + + + caddy.general.enabled + + checkbox + + + + caddy.general.TlsEmail + + text + info@example.com + + + + caddy.general.TlsAutoHttps + + dropdown + + + + + + caddy.general.EnableLayer4 + + checkbox + + + + caddy.general.DisableSuperuser + + checkbox + + + + caddy.general.HttpPort + + text + 80 + + + + caddy.general.HttpsPort + + text + 443 + + + + caddy.general.accesslist + + dropdown + + + + caddy.general.abort + + checkbox + + + + caddy.general.GracePeriod + + text + 10 + + + + + + caddy.general.LogLevel + + dropdown + + + + caddy.general.LogCredentials + + checkbox + + + + caddy.general.LogAccessPlain + + checkbox + + + + caddy.general.LogAccessPlainKeep + + 10 + text + + + + + + caddy.general.TlsDnsProvider + + dropdown + + + + caddy.general.TlsDnsApiKey + + text + + + + header + + true + + + caddy.general.TlsDnsSecretApiKey + + text + + + + caddy.general.TlsDnsOptionalField1 + + text + + + + caddy.general.TlsDnsOptionalField2 + + text + + + + caddy.general.TlsDnsOptionalField3 + + text + + + + caddy.general.TlsDnsOptionalField4 + + text + + + + header + + + + caddy.general.TlsDnsPropagationResolvers + + text + + + + caddy.general.TlsDnsPropagationTimeout + + checkbox + + + + + + caddy.general.DynDnsIpVersions + + dropdown + + + + caddy.general.DynDnsUpdateOnly + + checkbox + + + + caddy.general.DynDnsInterval + + text + 1800 + + + + caddy.general.DynDnsTtl + + text + + + + caddy.general.DynDnsSimpleHttp + + text + + + + caddy.general.DynDnsInterface + + dropdown + + + + + + caddy.general.AuthProvider + + dropdown + + + + caddy.general.AuthToDomain + + text + + + + caddy.general.AuthToPort + + text + + + + caddy.general.AuthToTls + + checkbox + + + + caddy.general.AuthToUri + + text + + + + general-settings
diff --git a/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/logsettings.xml b/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/logsettings.xml deleted file mode 100644 index 7c0f1a5ac..000000000 --- a/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/logsettings.xml +++ /dev/null @@ -1,27 +0,0 @@ -
- - caddy.general.LogLevel - - dropdown - - - - caddy.general.LogCredentials - - checkbox - - - - caddy.general.LogAccessPlain - - checkbox - - - - caddy.general.LogAccessPlainKeep - - 10 - text - - -
diff --git a/www/caddy/src/opnsense/mvc/app/models/OPNsense/Caddy/Caddy.xml b/www/caddy/src/opnsense/mvc/app/models/OPNsense/Caddy/Caddy.xml index 4b3e91a56..324e6069e 100644 --- a/www/caddy/src/opnsense/mvc/app/models/OPNsense/Caddy/Caddy.xml +++ b/www/caddy/src/opnsense/mvc/app/models/OPNsense/Caddy/Caddy.xml @@ -61,6 +61,7 @@ DirectAdmin Hosttech Vultr + Hetzner @@ -409,6 +410,7 @@ Y tlssni + DNS HTTP (Host Header) Postgres Proxy Protocol diff --git a/www/caddy/src/opnsense/mvc/app/views/OPNsense/Caddy/diagnostics.volt b/www/caddy/src/opnsense/mvc/app/views/OPNsense/Caddy/diagnostics.volt index 40ac5e0fd..259c6e141 100644 --- a/www/caddy/src/opnsense/mvc/app/views/OPNsense/Caddy/diagnostics.volt +++ b/www/caddy/src/opnsense/mvc/app/views/OPNsense/Caddy/diagnostics.volt @@ -35,29 +35,24 @@ * @param {string} displaySelector - jQuery selector for the element where data should be displayed. */ function fetchAndDisplay(url, displaySelector) { - $.ajax({ - url: url, - type: "GET", - success: function(response) { - if (response.status === "success") { - let formattedContent; - if (typeof response.content === 'object') { - // If the content is an object, stringify and format it - formattedContent = JSON.stringify(response.content, null, 2); - } else { - // If the content is plain text (as with the Caddyfile), just use it directly - formattedContent = response.content; - } - $(displaySelector).text(formattedContent); + ajaxGet(url, null, function(response, status) { + if (status === "success" && response.status === "success") { + let formattedContent; + if (typeof response.content === 'object') { + // If the content is an object, stringify and format it + formattedContent = JSON.stringify(response.content, null, 2); } else { - // If the response status is not 'success', display an error message - $(displaySelector).text("{{ lang._('Failed to load content: ') }}" + response.message || "{{ lang._('Unknown error') }}"); + // If the content is plain text (as with the Caddyfile), just use it directly + formattedContent = response.content; } - }, - error: function(xhr, status, error) { - // Handle errors from the AJAX request itself - $(displaySelector).text("{{ lang._('AJAX error accessing the API: ') }}" + error); + $(displaySelector).text(formattedContent); + } else { + // If the response status is not 'success', display an error message + $(displaySelector).text("{{ lang._('Failed to load content: ') }}" + (response.message || "{{ lang._('Unknown error') }}")); } + }).fail(function(xhr, status, error) { + // Handle errors from the AJAX request itself + $(displaySelector).text("{{ lang._('AJAX error accessing the API: ') }}" + error); }); } @@ -123,20 +118,14 @@ // Event handler for the Validate Caddyfile button $('#validateCaddyfile').click(function() { - $.ajax({ - url: '/api/caddy/service/validate', - type: 'GET', - dataType: 'json', - success: function(data) { - if (data && data['status'].toLowerCase() === 'ok') { - showDialogAlert(BootstrapDialog.TYPE_SUCCESS, "{{ lang._('Validation Successful') }}", data['message']); - } else { - showDialogAlert(BootstrapDialog.TYPE_WARNING, "{{ lang._('Validation Error') }}", data['message']); // Show error message from the API - } - }, - error: function(xhr, status, error) { - showDialogAlert(BootstrapDialog.TYPE_DANGER, "{{ lang._('Validation Request Failed') }}", error); // Show AJAX error + ajaxGet('/api/caddy/service/validate', null, function(data, status) { + if (status === "success" && data && data['status'].toLowerCase() === 'ok') { + showDialogAlert(BootstrapDialog.TYPE_SUCCESS, "{{ lang._('Validation Successful') }}", data['message']); + } else { + showDialogAlert(BootstrapDialog.TYPE_WARNING, "{{ lang._('Validation Error') }}", data['message']); // Show error message from the API } + }).fail(function(xhr, status, error) { + showDialogAlert(BootstrapDialog.TYPE_DANGER, "{{ lang._('Validation Request Failed') }}", error); // Show AJAX error }); }); @@ -144,23 +133,24 @@ @@ -176,7 +166,6 @@

-            

{{ lang._("This is the generated configuration located at %sCaddyfile%s. It's the main configuration file to get support with. The validation button triggers a manual check for any configuration errors, which is the same check that is triggered by the Apply buttons automatically.") | format('/usr/local/etc/caddy/', '') }}



@@ -186,7 +175,6 @@

-            

{{ lang._("Shows the running Caddy configuration located in %sautosave.json%s. It is automatically adapted from the Caddyfile and also includes any custom imported configurations from %scaddy.d%s.") | format('/var/db/caddy/config/caddy/', '', '/usr/local/etc/caddy/', '') }}



diff --git a/www/caddy/src/opnsense/mvc/app/views/OPNsense/Caddy/general.volt b/www/caddy/src/opnsense/mvc/app/views/OPNsense/Caddy/general.volt index e226a83e3..ef58bada0 100644 --- a/www/caddy/src/opnsense/mvc/app/views/OPNsense/Caddy/general.volt +++ b/www/caddy/src/opnsense/mvc/app/views/OPNsense/Caddy/general.volt @@ -24,254 +24,107 @@ # POSSIBILITY OF SUCH DAMAGE. #} - - - - -