diff --git a/terraform/modules/apps/nginx-reverse-proxy/config.tf b/terraform/modules/apps/nginx-reverse-proxy/config.tf index fbe4ed0..afaff0c 100644 --- a/terraform/modules/apps/nginx-reverse-proxy/config.tf +++ b/terraform/modules/apps/nginx-reverse-proxy/config.tf @@ -24,6 +24,7 @@ locals { services_config = { for k, v in var.services : "${k}.conf" => coalesce(v.config, templatefile("${path.module}/resources/nginx/conf.d/default.conf.tpl", { + errors = local.error_codes http_port = v.http_port https_port = v.https_port upstream = v.upstream @@ -46,5 +47,12 @@ locals { auth_script = file("${path.module}/resources/auth/auth_server.py") auth_script_checksum = sha256(local.auth_script) + + error_codes = [for f in fileset("${path.module}/resources/errors", "*.html") : split(".", f)[0]] + errors_pages = { + for f in local.error_codes : + "${f}.html" => file("${path.module}/resources/errors/${f}.html") + } + errors_pages_checksum = sha256(jsonencode(local.errors_pages)) } diff --git a/terraform/modules/apps/nginx-reverse-proxy/main.tf b/terraform/modules/apps/nginx-reverse-proxy/main.tf index 9934180..b151465 100644 --- a/terraform/modules/apps/nginx-reverse-proxy/main.tf +++ b/terraform/modules/apps/nginx-reverse-proxy/main.tf @@ -102,6 +102,19 @@ resource "kubernetes_config_map" "nginx_default_config" { data = local.services_config } +resource "kubernetes_config_map" "nginx_custom_50x_page" { + + metadata { + name = "nginx-errors" + namespace = kubernetes_namespace.reverse_proxy.metadata[0].name + } + + data = { + for k, v in local.errors_pages : k => v + } + +} + resource "kubernetes_config_map" "auth_script" { metadata { name = "auth-script" @@ -203,6 +216,7 @@ resource "kubernetes_deployment" "reverse_proxy" { "checksum/services" = local.services_config_checksum "checksum/wireguard" = local.wireguard_config_checksum "checksum/auth_server" = local.auth_script_checksum + "checksum/custom_50x" = local.errors_pages_checksum } } spec { @@ -360,6 +374,12 @@ resource "kubernetes_deployment" "reverse_proxy" { read_only = true } + volume_mount { + name = "nginx-errors" + mount_path = "/usr/share/nginx/html/errors" + read_only = true + } + dynamic "volume_mount" { for_each = length([for v in var.services : v.tls if v.tls == true]) > 0 ? [1] : [] content { @@ -411,6 +431,13 @@ resource "kubernetes_deployment" "reverse_proxy" { } } + volume { + name = "nginx-errors" + config_map { + name = kubernetes_config_map.nginx_custom_50x_page.metadata[0].name + } + } + dynamic "volume" { for_each = length([for v in var.services : v.tls if v.tls == true]) > 0 ? [1] : [] content { diff --git a/terraform/modules/apps/nginx-reverse-proxy/resources/errors/.gitignore b/terraform/modules/apps/nginx-reverse-proxy/resources/errors/.gitignore new file mode 100644 index 0000000..1e33d3a --- /dev/null +++ b/terraform/modules/apps/nginx-reverse-proxy/resources/errors/.gitignore @@ -0,0 +1 @@ +!*.html \ No newline at end of file diff --git a/terraform/modules/apps/nginx-reverse-proxy/resources/errors/400.html b/terraform/modules/apps/nginx-reverse-proxy/resources/errors/400.html new file mode 100644 index 0000000..358d589 --- /dev/null +++ b/terraform/modules/apps/nginx-reverse-proxy/resources/errors/400.html @@ -0,0 +1,40 @@ + + + + + + 400 - Bad Request + + + +
+
+

400 - Bad Request

+

Oops! The server couldn't understand your request.

+
+ + diff --git a/terraform/modules/apps/nginx-reverse-proxy/resources/errors/401.html b/terraform/modules/apps/nginx-reverse-proxy/resources/errors/401.html new file mode 100644 index 0000000..a90d413 --- /dev/null +++ b/terraform/modules/apps/nginx-reverse-proxy/resources/errors/401.html @@ -0,0 +1,40 @@ + + + + + + 401 - Unauthorized + + + +
+
🔒
+

401 - Unauthorized

+

You need to log in to access this resource.

+
+ + diff --git a/terraform/modules/apps/nginx-reverse-proxy/resources/errors/403.html b/terraform/modules/apps/nginx-reverse-proxy/resources/errors/403.html new file mode 100644 index 0000000..c7d16fa --- /dev/null +++ b/terraform/modules/apps/nginx-reverse-proxy/resources/errors/403.html @@ -0,0 +1,40 @@ + + + + + + 403 - Forbidden + + + +
+
🚫
+

403 - Forbidden

+

You don't have permission to view this page.

+
+ + diff --git a/terraform/modules/apps/nginx-reverse-proxy/resources/errors/404.html b/terraform/modules/apps/nginx-reverse-proxy/resources/errors/404.html new file mode 100644 index 0000000..b8e8d98 --- /dev/null +++ b/terraform/modules/apps/nginx-reverse-proxy/resources/errors/404.html @@ -0,0 +1,40 @@ + + + + + + 404 - Page Not Found + + + +
+
🔍
+

404 - Page Not Found

+

We couldn't find the page you're looking for.

+
+ + diff --git a/terraform/modules/apps/nginx-reverse-proxy/resources/errors/408.html b/terraform/modules/apps/nginx-reverse-proxy/resources/errors/408.html new file mode 100644 index 0000000..5be0f5e --- /dev/null +++ b/terraform/modules/apps/nginx-reverse-proxy/resources/errors/408.html @@ -0,0 +1,40 @@ + + + + + + 408 - Request Timeout + + + +
+
+

408 - Request Timeout

+

The server took too long to respond. Try again later.

+
+ + diff --git a/terraform/modules/apps/nginx-reverse-proxy/resources/errors/429.html b/terraform/modules/apps/nginx-reverse-proxy/resources/errors/429.html new file mode 100644 index 0000000..63c1ac5 --- /dev/null +++ b/terraform/modules/apps/nginx-reverse-proxy/resources/errors/429.html @@ -0,0 +1,40 @@ + + + + + + 429 - Too Many Requests + + + +
+
🚦
+

429 - Too Many Requests

+

You're making too many requests. Please slow down.

+
+ + diff --git a/terraform/modules/apps/nginx-reverse-proxy/resources/errors/500.html b/terraform/modules/apps/nginx-reverse-proxy/resources/errors/500.html new file mode 100644 index 0000000..d2dabaf --- /dev/null +++ b/terraform/modules/apps/nginx-reverse-proxy/resources/errors/500.html @@ -0,0 +1,40 @@ + + + + + + 500 - Internal Server Error + + + +
+
⚠️
+

500 - Internal Server Error

+

Something went wrong on our end. We're working on it.

+
+ + diff --git a/terraform/modules/apps/nginx-reverse-proxy/resources/errors/502.html b/terraform/modules/apps/nginx-reverse-proxy/resources/errors/502.html new file mode 100644 index 0000000..c06fa2c --- /dev/null +++ b/terraform/modules/apps/nginx-reverse-proxy/resources/errors/502.html @@ -0,0 +1,40 @@ + + + + + + 502 - Bad Gateway + + + +
+
🔌
+

502 - Bad Gateway

+

The server received an invalid response from upstream.

+
+ + diff --git a/terraform/modules/apps/nginx-reverse-proxy/resources/errors/503.html b/terraform/modules/apps/nginx-reverse-proxy/resources/errors/503.html new file mode 100644 index 0000000..ff29fa8 --- /dev/null +++ b/terraform/modules/apps/nginx-reverse-proxy/resources/errors/503.html @@ -0,0 +1,40 @@ + + + + + + 503 - Service Unavailable + + + +
+
🛠️
+

503 - Service Unavailable

+

We're doing some maintenance. Please check back soon.

+
+ + diff --git a/terraform/modules/apps/nginx-reverse-proxy/resources/errors/504.html b/terraform/modules/apps/nginx-reverse-proxy/resources/errors/504.html new file mode 100644 index 0000000..9b41589 --- /dev/null +++ b/terraform/modules/apps/nginx-reverse-proxy/resources/errors/504.html @@ -0,0 +1,40 @@ + + + + + + 504 - Gateway Timeout + + + +
+
📡
+

504 - Gateway Timeout

+

The upstream server didn't respond in time.

+
+ + diff --git a/terraform/modules/apps/nginx-reverse-proxy/resources/nginx/conf.d/default.conf.tpl b/terraform/modules/apps/nginx-reverse-proxy/resources/nginx/conf.d/default.conf.tpl index 3071c9b..0e24a64 100644 --- a/terraform/modules/apps/nginx-reverse-proxy/resources/nginx/conf.d/default.conf.tpl +++ b/terraform/modules/apps/nginx-reverse-proxy/resources/nginx/conf.d/default.conf.tpl @@ -7,6 +7,14 @@ server { ssl_protocols TLSv1.2 TLSv1.3; %{ endif ~} server_name ${fqdn}; + # Custom error page for upstream errors +%{ for e in errors ~} + error_page ${e} /errors/${e}.html; + location = /errors/${e}.html { + root /usr/share/nginx/html; + internal; + } +%{ endfor ~} %{ if custom_snippet != "" ~} ${custom_snippet} %{ endif ~} @@ -40,6 +48,7 @@ location = /auth { %{ for k,v in l.headers ~} proxy_set_header ${k} ${v}; %{ endfor ~} + proxy_intercept_errors on; } %{ endfor ~} }