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 ~}
}