mirror of
https://github.com/rubenhensen/k8scd.git
synced 2026-09-16 18:02:55 +02:00
Point rubenhensen.nl to mailserver for reverse proxy
This commit is contained in:
@@ -2,3 +2,4 @@
|
|||||||
stalwart_fallback_admin_password: "{{ vault_stalwart_fallback_admin_password }}"
|
stalwart_fallback_admin_password: "{{ vault_stalwart_fallback_admin_password }}"
|
||||||
stalwart_db_password: "{{ vault_stalwart_db_password }}"
|
stalwart_db_password: "{{ vault_stalwart_db_password }}"
|
||||||
sogo_db_password: "{{ vault_sogo_db_password }}"
|
sogo_db_password: "{{ vault_sogo_db_password }}"
|
||||||
|
nginx_k8s_updater_ssh_pubkey: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII5cMc73rlUCn3mS5FXlu3nO+AUeW2L28jRh22VYIPY4 k8s-ip-updater"
|
||||||
|
|||||||
@@ -5,3 +5,8 @@ nginx_tls_cert: "/etc/letsencrypt/live/mail.rubenhensen.nl/fullchain.pem"
|
|||||||
nginx_tls_key: "/etc/letsencrypt/live/mail.rubenhensen.nl/privkey.pem"
|
nginx_tls_key: "/etc/letsencrypt/live/mail.rubenhensen.nl/privkey.pem"
|
||||||
nginx_stalwart_backend: "127.0.0.1:8443"
|
nginx_stalwart_backend: "127.0.0.1:8443"
|
||||||
nginx_sogo_backend: "127.0.0.1:20000"
|
nginx_sogo_backend: "127.0.0.1:20000"
|
||||||
|
|
||||||
|
nginx_local_tls_domains:
|
||||||
|
- mail.rubenhensen.nl
|
||||||
|
- stalwart.rubenhensen.nl
|
||||||
|
nginx_k8s_upstream_conf: "/etc/nginx/stream.d/k8s-upstream.conf"
|
||||||
|
|||||||
@@ -4,6 +4,24 @@
|
|||||||
name: nginx
|
name: nginx
|
||||||
state: present
|
state: present
|
||||||
|
|
||||||
|
- name: Install nginx stream modules
|
||||||
|
ansible.builtin.apt:
|
||||||
|
name: libnginx-mod-stream
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: Create stream.d directory
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /etc/nginx/stream.d
|
||||||
|
state: directory
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
- name: Deploy nginx.conf
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: nginx.conf.j2
|
||||||
|
dest: /etc/nginx/nginx.conf
|
||||||
|
mode: "0644"
|
||||||
|
notify: reload nginx
|
||||||
|
|
||||||
- name: Remove default site
|
- name: Remove default site
|
||||||
ansible.builtin.file:
|
ansible.builtin.file:
|
||||||
path: /etc/nginx/sites-enabled/default
|
path: /etc/nginx/sites-enabled/default
|
||||||
@@ -24,6 +42,76 @@
|
|||||||
state: link
|
state: link
|
||||||
notify: reload nginx
|
notify: reload nginx
|
||||||
|
|
||||||
|
- name: Deploy K8s upstream config (initial only)
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: k8s-upstream.conf.j2
|
||||||
|
dest: "{{ nginx_k8s_upstream_conf }}"
|
||||||
|
mode: "0644"
|
||||||
|
force: false
|
||||||
|
notify: reload nginx
|
||||||
|
|
||||||
|
- name: Deploy K8s backend IP config (initial only)
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: k8s-backend-ip.conf.j2
|
||||||
|
dest: /etc/nginx/k8s-backend-ip.conf
|
||||||
|
mode: "0644"
|
||||||
|
force: false
|
||||||
|
notify: reload nginx
|
||||||
|
|
||||||
|
- name: Deploy K8s HTTP proxy config
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: k8s-proxy.conf.j2
|
||||||
|
dest: /etc/nginx/sites-available/k8s-proxy.conf
|
||||||
|
mode: "0644"
|
||||||
|
notify: reload nginx
|
||||||
|
|
||||||
|
- name: Enable K8s proxy site
|
||||||
|
ansible.builtin.file:
|
||||||
|
src: /etc/nginx/sites-available/k8s-proxy.conf
|
||||||
|
dest: /etc/nginx/sites-enabled/k8s-proxy.conf
|
||||||
|
state: link
|
||||||
|
notify: reload nginx
|
||||||
|
|
||||||
|
- name: Deploy K8s IP update script
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /usr/local/bin/update-k8s-ip
|
||||||
|
content: |
|
||||||
|
#!/bin/bash
|
||||||
|
NEW_IP="$SSH_ORIGINAL_COMMAND"
|
||||||
|
|
||||||
|
if ! echo "$NEW_IP" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$'; then
|
||||||
|
echo "Invalid IP: $NEW_IP"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
CONF="{{ nginx_k8s_upstream_conf }}"
|
||||||
|
CURRENT_IP=$(grep -oP 'server \K[0-9.]+' "$CONF" 2>/dev/null)
|
||||||
|
|
||||||
|
if [ "$CURRENT_IP" = "$NEW_IP" ]; then
|
||||||
|
echo "IP unchanged: $NEW_IP"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf 'upstream k8s_tls {\n server %s:443;\n}\n' "$NEW_IP" > "$CONF"
|
||||||
|
printf 'set $k8s_ip %s;\n' "$NEW_IP" > /etc/nginx/k8s-backend-ip.conf
|
||||||
|
|
||||||
|
nginx -t && systemctl reload nginx
|
||||||
|
echo "Updated K8s backend IP to $NEW_IP"
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
- name: Ensure .ssh directory exists for root
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /root/.ssh
|
||||||
|
state: directory
|
||||||
|
mode: "0700"
|
||||||
|
|
||||||
|
- name: Deploy SSH authorized key for K8s IP updater
|
||||||
|
ansible.builtin.authorized_key:
|
||||||
|
user: root
|
||||||
|
key: "{{ nginx_k8s_updater_ssh_pubkey }}"
|
||||||
|
key_options: 'command="/usr/local/bin/update-k8s-ip",no-port-forwarding,no-X11-forwarding,no-agent-forwarding'
|
||||||
|
when: nginx_k8s_updater_ssh_pubkey is defined
|
||||||
|
|
||||||
- name: Enable and start Nginx
|
- name: Enable and start Nginx
|
||||||
ansible.builtin.systemd:
|
ansible.builtin.systemd:
|
||||||
name: nginx
|
name: nginx
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
set $k8s_ip 127.0.0.1;
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
# Catch-all for any domain not handled by mail.conf
|
||||||
|
# Proxies ACME challenges to K8s for cert-manager, redirects rest to HTTPS
|
||||||
|
server {
|
||||||
|
listen 80 default_server;
|
||||||
|
listen [::]:80 default_server;
|
||||||
|
server_name _;
|
||||||
|
|
||||||
|
location /.well-known/acme-challenge/ {
|
||||||
|
include /etc/nginx/k8s-backend-ip.conf;
|
||||||
|
proxy_pass http://$k8s_ip:80;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
}
|
||||||
|
|
||||||
|
location / {
|
||||||
|
return 301 https://$host$request_uri;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
upstream k8s_tls {
|
||||||
|
server 127.0.0.1:443;
|
||||||
|
}
|
||||||
@@ -15,8 +15,7 @@ server {
|
|||||||
}
|
}
|
||||||
|
|
||||||
server {
|
server {
|
||||||
listen 443 ssl http2;
|
listen 127.0.0.1:8443 ssl http2;
|
||||||
listen [::]:443 ssl http2;
|
|
||||||
server_name {{ nginx_server_name }};
|
server_name {{ nginx_server_name }};
|
||||||
|
|
||||||
ssl_certificate {{ nginx_tls_cert }};
|
ssl_certificate {{ nginx_tls_cert }};
|
||||||
@@ -94,8 +93,7 @@ server {
|
|||||||
}
|
}
|
||||||
|
|
||||||
server {
|
server {
|
||||||
listen 443 ssl http2;
|
listen 127.0.0.1:8443 ssl http2;
|
||||||
listen [::]:443 ssl http2;
|
|
||||||
server_name {{ nginx_stalwart_server_name }};
|
server_name {{ nginx_stalwart_server_name }};
|
||||||
|
|
||||||
ssl_certificate {{ nginx_tls_cert }};
|
ssl_certificate {{ nginx_tls_cert }};
|
||||||
|
|||||||
@@ -0,0 +1,54 @@
|
|||||||
|
user www-data;
|
||||||
|
worker_processes auto;
|
||||||
|
pid /run/nginx.pid;
|
||||||
|
include /etc/nginx/modules-enabled/*.conf;
|
||||||
|
|
||||||
|
events {
|
||||||
|
worker_connections 768;
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
sendfile on;
|
||||||
|
tcp_nopush on;
|
||||||
|
types_hash_max_size 2048;
|
||||||
|
|
||||||
|
include /etc/nginx/mime.types;
|
||||||
|
default_type application/octet-stream;
|
||||||
|
|
||||||
|
ssl_protocols TLSv1.2 TLSv1.3;
|
||||||
|
ssl_prefer_server_ciphers on;
|
||||||
|
|
||||||
|
access_log /var/log/nginx/access.log;
|
||||||
|
error_log /var/log/nginx/error.log;
|
||||||
|
|
||||||
|
gzip on;
|
||||||
|
|
||||||
|
include /etc/nginx/sites-enabled/*;
|
||||||
|
}
|
||||||
|
|
||||||
|
stream {
|
||||||
|
log_format stream '$remote_addr [$time_local] '
|
||||||
|
'$protocol $status $bytes_sent $bytes_received '
|
||||||
|
'$session_time "$ssl_preread_server_name"';
|
||||||
|
access_log /var/log/nginx/stream.log stream;
|
||||||
|
|
||||||
|
map $ssl_preread_server_name $tls_backend {
|
||||||
|
{% for domain in nginx_local_tls_domains %}
|
||||||
|
{{ domain }} local_tls;
|
||||||
|
{% endfor %}
|
||||||
|
default k8s_tls;
|
||||||
|
}
|
||||||
|
|
||||||
|
upstream local_tls {
|
||||||
|
server 127.0.0.1:8443;
|
||||||
|
}
|
||||||
|
|
||||||
|
include /etc/nginx/stream.d/*.conf;
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443;
|
||||||
|
listen [::]:443;
|
||||||
|
ssl_preread on;
|
||||||
|
proxy_pass $tls_backend;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@ records:
|
|||||||
- name: "@"
|
- name: "@"
|
||||||
expire: 86400
|
expire: 86400
|
||||||
type: A
|
type: A
|
||||||
content: "62.41.87.114"
|
content: "46.224.26.65"
|
||||||
- name: mail
|
- name: mail
|
||||||
expire: 86400
|
expire: 86400
|
||||||
type: A
|
type: A
|
||||||
|
|||||||
@@ -19,8 +19,6 @@ spec:
|
|||||||
apk add --no-cache openssh-client curl > /dev/null 2>&1
|
apk add --no-cache openssh-client curl > /dev/null 2>&1
|
||||||
cp /ssh-key/private_key /tmp/ssh_key
|
cp /ssh-key/private_key /tmp/ssh_key
|
||||||
chmod 600 /tmp/ssh_key
|
chmod 600 /tmp/ssh_key
|
||||||
echo "Key starts with: $(head -1 /tmp/ssh_key)"
|
|
||||||
wc -c /tmp/ssh_key
|
|
||||||
IP=$(curl -s --max-time 10 https://api.ipify.org)
|
IP=$(curl -s --max-time 10 https://api.ipify.org)
|
||||||
if [ -z "$IP" ]; then
|
if [ -z "$IP" ]; then
|
||||||
echo "Failed to get external IP"
|
echo "Failed to get external IP"
|
||||||
|
|||||||
Reference in New Issue
Block a user