Add some of caddy to ansible
This commit is contained in:
parent
c1ec46aed5
commit
297325cce5
13 changed files with 156 additions and 37 deletions
7
.pre-commit-config.yaml
Normal file
7
.pre-commit-config.yaml
Normal file
|
@ -0,0 +1,7 @@
|
|||
repos:
|
||||
- repo: https://github.com/ansible/ansible-lint
|
||||
rev: v6.22.1
|
||||
hooks:
|
||||
- id: ansible-lint
|
||||
args:
|
||||
- _ansible/serguzim.net.yml
|
|
@ -2,7 +2,15 @@
|
|||
- name: Run roles for node002
|
||||
hosts: node002
|
||||
roles:
|
||||
- common
|
||||
- role: common
|
||||
tags: [always]
|
||||
- role: caddy
|
||||
tags: [caddy, reverse-proxy, webserver]
|
||||
vars:
|
||||
caddy_ports_extra:
|
||||
- 8008:8008
|
||||
- 8448:8448
|
||||
|
||||
|
||||
- role: acme_dns
|
||||
tags: [acme-dns, certificates]
|
||||
|
|
|
@ -2,7 +2,10 @@
|
|||
- name: Run roles for node003
|
||||
hosts: node003
|
||||
roles:
|
||||
- common
|
||||
- role: common
|
||||
tags: [always]
|
||||
- role: caddy
|
||||
tags: [caddy, reverse-proxy, webserver]
|
||||
|
||||
- role: minio
|
||||
tags: [minio, storage]
|
||||
|
|
1
_ansible/roles/caddy/defaults/main.yml
Normal file
1
_ansible/roles/caddy/defaults/main.yml
Normal file
|
@ -0,0 +1 @@
|
|||
caddy_ports_extra: []
|
8
_ansible/roles/caddy/files/Dockerfile
Normal file
8
_ansible/roles/caddy/files/Dockerfile
Normal file
|
@ -0,0 +1,8 @@
|
|||
FROM caddy:2-builder AS builder
|
||||
|
||||
RUN xcaddy build \
|
||||
--with github.com/caddy-dns/acmedns@main
|
||||
|
||||
FROM caddy:2-alpine
|
||||
|
||||
COPY --from=builder /usr/bin/caddy /usr/bin/caddy
|
37
_ansible/roles/caddy/files/snippets
Normal file
37
_ansible/roles/caddy/files/snippets
Normal file
|
@ -0,0 +1,37 @@
|
|||
(auth_serguzim_me) {
|
||||
# always forward outpost path to actual outpost
|
||||
reverse_proxy /outpost.goauthentik.io/* authentik:9000
|
||||
|
||||
# forward authentication to outpost
|
||||
forward_auth authentik:9000 {
|
||||
uri /outpost.goauthentik.io/auth/caddy
|
||||
|
||||
# capitalization of the headers is important, otherwise they will be empty
|
||||
copy_headers X-Authentik-Username X-Authentik-Groups X-Authentik-Email X-Authentik-Name X-Authentik-Uid X-Authentik-Jwt X-Authentik-Meta-Jwks X-Authentik-Meta-Outpost X-Authentik-Meta-Provider X-Authentik-Meta-App X-Authentik-Meta-Version
|
||||
|
||||
# optional, in this config trust all private ranges, should probably be set to the outposts IP
|
||||
trusted_proxies private_ranges
|
||||
}
|
||||
}
|
||||
|
||||
(default) {
|
||||
encode zstd gzip
|
||||
}
|
||||
|
||||
(acmedns) {
|
||||
tls {
|
||||
dns acmedns {
|
||||
username "{$ACMEDNS_USER}"
|
||||
password "{$ACMEDNS_PASS}"
|
||||
subdomain "{$ACMEDNS_SUBD}"
|
||||
server_url "{$ACMEDNS_URL}"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
(faas) {
|
||||
rewrite * /function/{args[0]}{uri}
|
||||
reverse_proxy https://faas.serguzim.me {
|
||||
header_up Host {http.reverse_proxy.upstream.hostport}
|
||||
}
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
- name: Find caddy site configs, but exclude managed sites
|
||||
ansible.builtin.find:
|
||||
paths: "{{ caddy_config_path }}"
|
||||
excludes: "{{ managed_sites | default([]) }}"
|
||||
register: files_to_delete
|
||||
|
||||
- name: Remove unmanaged sites
|
||||
file:
|
||||
path: "{{ item.path }}"
|
||||
state: absent
|
||||
with_items: "{{ files_to_delete.files }}"
|
|
@ -7,12 +7,37 @@
|
|||
svc: "{{ caddy_svc }}"
|
||||
env: "{{ caddy_env }}"
|
||||
compose: "{{ caddy_compose }}"
|
||||
- name: Deploy {{ svc.name }}
|
||||
block:
|
||||
- name: Import tasks to deploy common service
|
||||
ansible.builtin.import_tasks: tasks/deploy-common-service.yml
|
||||
- name: Import prepare tasks for common service
|
||||
ansible.builtin.import_tasks: tasks/prepare-common-service.yml
|
||||
|
||||
- name: Import tasks for cleaning sites
|
||||
ansible.builtin.import_tasks: tasks/clean-sites.yml
|
||||
- name: Import tasks to reload caddy
|
||||
ansible.builtin.import_tasks: tasks/reload-caddy.yml
|
||||
- name: Set caddy config path
|
||||
ansible.builtin.set_fact:
|
||||
config_path: "{{ (service_path, 'config') | path_join }}"
|
||||
|
||||
- name: Create config directory
|
||||
ansible.builtin.file:
|
||||
path: "{{ config_path }}"
|
||||
state: directory
|
||||
mode: "0755"
|
||||
|
||||
- name: Template caddyfile
|
||||
ansible.builtin.template:
|
||||
src: Caddyfile.j2
|
||||
dest: "{{ (config_path, 'Caddyfile') | path_join }}"
|
||||
mode: "0644"
|
||||
|
||||
- name: Copy snippets file
|
||||
ansible.builtin.copy:
|
||||
src: snippets
|
||||
dest: "{{ (config_path, 'snippets') | path_join }}"
|
||||
mode: "0644"
|
||||
|
||||
- name: Create sites-config directory
|
||||
ansible.builtin.file:
|
||||
path: "{{ caddy_config_path }}"
|
||||
state: directory
|
||||
mode: "0755"
|
||||
|
||||
- name: Import start tasks for common service
|
||||
ansible.builtin.import_tasks: tasks/start-common-service.yml
|
||||
|
|
|
@ -1,16 +0,0 @@
|
|||
- name: Check caddy configuration
|
||||
ansible.builtin.command:
|
||||
cmd: docker compose exec app sh -c "caddy validate --config /etc/caddy/Caddyfile"
|
||||
chdir: "{{ service_path }}"
|
||||
when: "'local-dev' != inventory_hostname"
|
||||
register: cmd_result
|
||||
changed_when: false
|
||||
|
||||
- name: Reload caddy configuration
|
||||
ansible.builtin.command:
|
||||
cmd: docker compose exec app sh -c "caddy reload --config /etc/caddy/Caddyfile"
|
||||
chdir: "{{ service_path }}"
|
||||
when:
|
||||
- "'local-dev' != inventory_hostname"
|
||||
- cmd_result.rc == 0
|
||||
changed_when: true # TODO find a way to detect changes
|
11
_ansible/roles/caddy/templates/Caddyfile.j2
Normal file
11
_ansible/roles/caddy/templates/Caddyfile.j2
Normal file
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
email {{ admin_email }}
|
||||
|
||||
servers {
|
||||
strict_sni_host on
|
||||
}
|
||||
}
|
||||
|
||||
import /etc/caddy/snippets
|
||||
import /etc/caddy/conf.d/*.conf
|
||||
import /etc/caddy/conf-hidden.d/*.conf
|
37
_ansible/roles/caddy/vars/main.yml
Normal file
37
_ansible/roles/caddy/vars/main.yml
Normal file
|
@ -0,0 +1,37 @@
|
|||
---
|
||||
caddy_acmedns_user: "{{ vault_caddy.acmedns.user }}"
|
||||
caddy_acmedns_pass: "{{ vault_caddy.acmedns.pass }}"
|
||||
caddy_acmedns_subd: "{{ vault_caddy.acmedns.subd }}"
|
||||
caddy_acmedns_url: "https://acme.serguzim.me"
|
||||
|
||||
caddy_ports_default:
|
||||
- 80:80
|
||||
- 443:443
|
||||
- 443:443/udp
|
||||
caddy_ports: "{{ caddy_ports_default | union(caddy_ports_extra) }}"
|
||||
|
||||
caddy_svc:
|
||||
name: caddy
|
||||
|
||||
caddy_env:
|
||||
ACMEDNS_USER: "{{ caddy_acmedns_user }}"
|
||||
ACMEDNS_PASS: "{{ caddy_acmedns_pass }}"
|
||||
ACMEDNS_SUBD: "{{ caddy_acmedns_subd }}"
|
||||
ACMEDNS_URL: "{{ caddy_acmedns_url }}"
|
||||
|
||||
caddy_compose:
|
||||
watchtower: false
|
||||
image: caddy-custom:2-alpine
|
||||
volumes:
|
||||
- "./config:/etc/caddy/"
|
||||
- data:/data
|
||||
file:
|
||||
services:
|
||||
app:
|
||||
build:
|
||||
context: .
|
||||
ports: "{{ caddy_ports }}"
|
||||
extra_hosts:
|
||||
- host.docker.internal:host-gateway
|
||||
volumes:
|
||||
data:
|
|
@ -104,7 +104,7 @@ synapse_yml:
|
|||
|
||||
synapse_compose:
|
||||
watchtower: true
|
||||
image: ghcr.io/matrix-org/synapse:v1.98.0
|
||||
image: ghcr.io/element-hq/synapse:latest
|
||||
volumes:
|
||||
- ./config:/config
|
||||
- media_store:/media_store
|
||||
|
|
9
_ansible/serguzim.net.yml
Normal file
9
_ansible/serguzim.net.yml
Normal file
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
- name: Run playbook for node001
|
||||
import_playbook: node001.yml
|
||||
|
||||
- name: Run playbook for node002
|
||||
import_playbook: node002.yml
|
||||
|
||||
- name: Run playbook for node003
|
||||
import_playbook: node003.yml
|
Reference in a new issue