acme_forward: send services' ACME challenges to Traefik on ops
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:
Sergei Poljanski 2026-11-13 08:07:36 +04:00
commit 4865efd078
Signed by: asxpi
GPG key ID: 4F8851660FA4121B
5 changed files with 50 additions and 0 deletions

View 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"

View 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

View 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

View 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;
}
}

View file

@ -35,6 +35,7 @@
- { role: sillytavern, tags: [sillytavern] }
- { role: minecraft, tags: [minecraft] }
- { role: xmpp, tags: [xmpp] }
- { role: acme_forward, tags: [acme_forward, xmpp] }
- { role: xray, tags: [xray] }
# Late: restarting Forgejo briefly cuts the runner off from its job log