acme_forward: send services' ACME challenges to Traefik on ops
All checks were successful
deploy / ansible (push) Successful in 6m25s
All checks were successful
deploy / ansible (push) Successful in 6m25s
The XMPP certificate covers xmpp.asxp.io and conference.asxp.io, which point at asxpio-services, so Let's Encrypt validates them there. A small nginx on port 80 passes /.well-known/acme-challenge/ over the VPC to Traefik, which holds all certificates, and answers 404 to the rest. Assisted-by: Claude:opus-5-5
This commit is contained in:
parent
700161ffd0
commit
4865efd078
5 changed files with 50 additions and 0 deletions
8
ansible/inventory/group_vars/all/xmpp_cert.yaml
Normal file
8
ansible/inventory/group_vars/all/xmpp_cert.yaml
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
---
|
||||||
|
# The XMPP certificate is issued by Traefik on asxpio-ops (HTTP challenge;
|
||||||
|
# services forwards its challenges there, role acme_forward) and pushed to
|
||||||
|
# ejabberd on asxpio-services on every renewal (role xmpp_cert_sync).
|
||||||
|
xmpp_cert_main: xmpp.asxp.io
|
||||||
|
xmpp_cert_sans: [asxp.io, conference.asxp.io]
|
||||||
|
# renovate: datasource=docker depName=nginx
|
||||||
|
acme_forward_nginx_version: "1.31.8-alpine-slim"
|
||||||
14
ansible/roles/acme_forward/tasks/main.yaml
Normal file
14
ansible/roles/acme_forward/tasks/main.yaml
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
---
|
||||||
|
# Port 80 on asxpio-services exists only for Let's Encrypt: HTTP challenges
|
||||||
|
# for names pointing here (xmpp., conference.) go to Traefik on ops, which
|
||||||
|
# holds the certificates. Anything else gets a 404.
|
||||||
|
- name: Deploy the ACME challenge forwarder
|
||||||
|
ansible.builtin.include_role:
|
||||||
|
name: docker_service
|
||||||
|
vars:
|
||||||
|
service_name: acme-forward
|
||||||
|
service_base_path: "{{ services_base_path }}/acme-forward"
|
||||||
|
service_templates:
|
||||||
|
- { src: docker-compose.yml.j2, dest: docker-compose.yml }
|
||||||
|
- { src: nginx.conf.j2, dest: nginx.conf }
|
||||||
|
health_check_port: 80
|
||||||
11
ansible/roles/acme_forward/templates/docker-compose.yml.j2
Normal file
11
ansible/roles/acme_forward/templates/docker-compose.yml.j2
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
# Managed by Ansible (role acme_forward).
|
||||||
|
services:
|
||||||
|
acme-forward:
|
||||||
|
image: nginx:{{ acme_forward_nginx_version }}
|
||||||
|
container_name: acme-forward
|
||||||
|
ports:
|
||||||
|
- "80:80"
|
||||||
|
volumes:
|
||||||
|
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
|
||||||
|
restart: unless-stopped
|
||||||
|
mem_limit: 32m
|
||||||
16
ansible/roles/acme_forward/templates/nginx.conf.j2
Normal file
16
ansible/roles/acme_forward/templates/nginx.conf.j2
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
# Managed by Ansible (role acme_forward).
|
||||||
|
server {
|
||||||
|
listen 80 default_server;
|
||||||
|
listen [::]:80 default_server;
|
||||||
|
server_tokens off;
|
||||||
|
access_log off;
|
||||||
|
|
||||||
|
location /.well-known/acme-challenge/ {
|
||||||
|
proxy_pass http://{{ asxpio_ops_vpc_ip }};
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
}
|
||||||
|
|
||||||
|
location / {
|
||||||
|
return 404;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -35,6 +35,7 @@
|
||||||
- { role: sillytavern, tags: [sillytavern] }
|
- { role: sillytavern, tags: [sillytavern] }
|
||||||
- { role: minecraft, tags: [minecraft] }
|
- { role: minecraft, tags: [minecraft] }
|
||||||
- { role: xmpp, tags: [xmpp] }
|
- { role: xmpp, tags: [xmpp] }
|
||||||
|
- { role: acme_forward, tags: [acme_forward, xmpp] }
|
||||||
- { role: xray, tags: [xray] }
|
- { role: xray, tags: [xray] }
|
||||||
|
|
||||||
# Late: restarting Forgejo briefly cuts the runner off from its job log
|
# Late: restarting Forgejo briefly cuts the runner off from its job log
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue