This commit is contained in:
2026-09-18 20:07:04 +02:00
parent 958e22734f
commit 442ddf8816
88 changed files with 2501 additions and 0 deletions
+5
View File
@@ -0,0 +1,5 @@
---
woodpecker_domain: "ci.poc.mehl.mx"
zot_domain: "registry.ci.poc.mehl.mx"
zot_port: 5000
letsencrypt_email: "dqdpoq@dwqiofiw.de"
+5
View File
@@ -0,0 +1,5 @@
---
- name: Restart nginx
ansible.builtin.systemd_service:
name: nginx
state: restarted
+32
View File
@@ -0,0 +1,32 @@
---
# Two-phase TLS setup: nginx first serves plain HTTP (for the certbot
# webroot challenge), then certbot obtains real certs, then the TLS
# vhosts (proxying to Woodpecker and Zot) are deployed and nginx reloaded.
- name: Ensure certbot webroot directory exists
ansible.builtin.file:
path: "{{ certbot_webroot }}"
state: directory
mode: "0755"
- name: Include geerlingguy.nginx role (HTTP-only vhosts for ACME challenge)
ansible.builtin.include_role:
name: geerlingguy.nginx
- name: Include geerlingguy.certbot role (obtain certificates)
ansible.builtin.include_role:
name: geerlingguy.certbot
- name: Deploy TLS vhost for Woodpecker
ansible.builtin.template:
src: woodpecker.conf.j2
dest: "/etc/nginx/sites-enabled/{{ woodpecker_domain }}.conf"
mode: "0644"
notify: Restart nginx
- name: Deploy TLS vhost for Zot
ansible.builtin.template:
src: zot.conf.j2
dest: "/etc/nginx/sites-enabled/{{ zot_domain }}.conf"
mode: "0644"
notify: Restart nginx
@@ -0,0 +1,36 @@
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name {{ woodpecker_domain }};
ssl_certificate /etc/letsencrypt/live/{{ woodpecker_domain }}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{{ woodpecker_domain }}/privkey.pem;
client_max_body_size 64m;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Required for Woodpecker's websocket-based log streaming.
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
server {
listen 80;
listen [::]:80;
server_name {{ woodpecker_domain }};
location /.well-known/acme-challenge/ {
root /var/www/letsencrypt;
}
location / {
return 301 https://$host$request_uri;
}
}
+36
View File
@@ -0,0 +1,36 @@
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name {{ zot_domain }};
ssl_certificate /etc/letsencrypt/live/{{ zot_domain }}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{{ zot_domain }}/privkey.pem;
# Large blob/layer uploads for container images and OCI artifacts.
client_max_body_size 0;
location / {
proxy_pass http://127.0.0.1:{{ zot_port }};
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Ensure a well-formed Content-Length reaches Zot instead of
# chunked transfer encoding, which Zot rejects on blob uploads.
proxy_request_buffering on;
}
}
server {
listen 80;
listen [::]:80;
server_name {{ zot_domain }};
location /.well-known/acme-challenge/ {
root /var/www/letsencrypt;
}
location / {
return 301 https://$host$request_uri;
}
}
+35
View File
@@ -0,0 +1,35 @@
---
# HTTP-only vhosts, used for the initial certbot webroot challenge and
# permanently for redirecting to HTTPS afterwards.
nginx_vhosts:
- server_name: "{{ woodpecker_domain }}"
filename: "{{ woodpecker_domain }}.conf"
root: "/var/www/letsencrypt"
extra_parameters: |
location /.well-known/acme-challenge/ {
root /var/www/letsencrypt;
}
location / {
return 301 https://$host$request_uri;
}
- server_name: "{{ zot_domain }}"
filename: "{{ zot_domain }}.conf"
root: "/var/www/letsencrypt"
extra_parameters: |
location /.well-known/acme-challenge/ {
root /var/www/letsencrypt;
}
location / {
return 301 https://$host$request_uri;
}
certbot_create_if_missing: true
certbot_create_method: webroot
certbot_webroot: /var/www/letsencrypt
certbot_admin_email: "{{ letsencrypt_email }}"
certbot_certs:
- domains:
- "{{ woodpecker_domain }}"
- domains:
- "{{ zot_domain }}"