Start setting up caddy

This commit is contained in:
Javier Feliz 2025-07-06 17:51:48 -04:00
parent 172d49be25
commit a3983ddfcb
16 changed files with 286 additions and 2 deletions

View File

@ -1,4 +1,8 @@
---
# Homelab IP addressing scheme/convention
# 10.89.0.1x-2x for low level hosts (proxmox servers, NAS, etc)
# 10.89.0.3x for proxies (caddy-proxy-external, caddy-proxy-internal, etc)
# 10.89.0.1xx for VMs running the actual apps I host
all:
children:
servers:
@ -9,6 +13,12 @@ all:
ansible_host: 10.89.0.12
nas:
ansible_host: 10.89.0.15
proxies:
hosts:
caddy_internal:
ansible_host: 10.89.0.30
caddy_external:
ansible_host: 10.89.0.31
vms:
hosts:
portainer_main:

View File

@ -17,4 +17,15 @@
port: 7073
- role: apps/tianji
vars:
port: 7074
port: 7074
- role: apps/stirling-pdf
vars:
port: 7075
- role: apps/dumbware-todo
vars:
port: 7076
pin: 8989
- role: apps/dumbware-drop
vars:
port: 7077
pin: "8989"

View File

@ -0,0 +1,33 @@
---
- name: Set up the reverse proxy for internal only services
hosts: caddy_external
become: true
roles:
- role: caddy/install
- role: caddy/proxy
vars:
domains:
- name: "thatshit.live"
sites:
- name: "whale"
host: 10.89.0.101
port: 9443
https: true
transport_opts:
- tls_insecure_skip_verify
- name: "blinker.club"
sites:
- name: "whale"
host: 10.89.0.101
port: 9443
https: true
transport_opts:
- tls_insecure_skip_verify
- name: "thegrind.dev"
sites:
- name: "whale"
host: 10.89.0.101
port: 9443
https: true
transport_opts:
- tls_insecure_skip_verify

View File

@ -0,0 +1,45 @@
---
- name: Set up the reverse proxy for internal only services
hosts: caddy_internal
become: true
roles:
- role: caddy/install
- role: caddy/proxy
vars:
domains:
- name: "lan.thegrind.dev"
sites:
- name: "whale"
host: 10.89.0.101
port: 9443
https: true
transport_opts:
- tls_insecure_skip_verify
- name: "router"
host: 10.89.0.1
port: 8989
- name: "adguard"
host: 10.89.0.1
port: 3000
- name: "nas"
host: 10.89.0.15
port: 80
- name: "streaming"
host: 10.89.0.106
port: 10000
https: true
transport_opts:
- tls_insecure_skip_verify
- name: "stash"
host: 10.89.0.106
port: 6969
- name: "node1"
host: 10.89.0.13
port: 8006
transport_opts:
- tls_insecure_skip_verify
- name: "node3"
host: 10.89.0.12
port: 8006
transport_opts:
- tls_insecure_skip_verify

View File

@ -1,5 +1,5 @@
---
- name: Set up a new virtual machine
- name: set up a new virtual machine
hosts: vms
become: true
roles:

View File

@ -0,0 +1,22 @@
- name: Create the data dir on network drive
ansible.builtin.include_role:
role: docker/container-data
vars:
dir_name: "dw-drop"
- name: Create dumbware-drop container
community.docker.docker_container:
name: dw-drop
image: dumbwareio/dumbdrop:latest
pull: true
state: started
restart_policy: always
ports:
- "{{ port }}:3000"
volumes:
- /home/docker/container-data/dw-drop:/app/uploads
env:
DUMBDROP_TITLE: "Share a file with Javi"
DUMBDROP_PIN: "{{ pin }}"
MAX_FILE_SIZE: "10240" # 10GB
LOCAL_UPLOAD_DIR: /app/uploads

View File

@ -0,0 +1,20 @@
- name: Create data folder
ansible.builtin.file:
path: /home/docker/dw-todo
state: directory
mode: '0777'
- name: Create dw-todo container
community.docker.docker_container:
name: dw-todo
image: dumbwareio/dumbdo:latest
pull: true
state: started
restart_policy: unless-stopped
ports:
- "{{ port }}:3000"
volumes:
- /home/docker/dw-todo:/app/data
env:
DUMBDO_SITE_TITLE="Javi's Daily TO-DO"
DUMBDO_PIN="{{ pin }}"

View File

@ -0,0 +1,21 @@
- name: Create the data dir on network drive
ansible.builtin.include_role:
role: docker/container-data
vars:
dir_name: "stirlingpdf-data"
- name: Make stirlingPDF container
community.docker.docker_container:
name: stirling-pdf
image: docker.stirlingpdf.com/stirlingtools/stirling-pdf:latest
ports:
- "{{ port }}:8080"
volumes:
- /home/docker/container-data/stirlingpdf-data/trainingData:/usr/share/tessdata # Required for extra OCR languages
- /home/docker/container-data/stirlingpdf-data/extraConfigs:/configs
- /home/docker/container-data/stirlingpdf-data/customFiles:/customFiles/
- /home/docker/container-data/stirlingpdf-data/logs:/logs/
- /home/docker/container-data/stirlingpdf-data/pipeline:/pipeline/
env:
DOCKER_ENABLE_SECURITY=false
LANGS=en_GB

View File

@ -0,0 +1 @@

View File

@ -0,0 +1,78 @@
- name: Install dependencies
apt:
name: apt-transport-https
state: present
update_cache: true
- name: Download and install XCaddy GPG key
ansible.builtin.shell:
cmd: >
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/xcaddy/gpg.key' |
gpg --dearmor -o /usr/share/keyrings/caddy-xcaddy-archive-keyring.gpg
args:
creates: /usr/share/keyrings/caddy-xcaddy-archive-keyring.gpg
become: true
- name: Add XCaddy repository list
ansible.builtin.get_url:
url: https://dl.cloudsmith.io/public/caddy/xcaddy/debian.deb.txt
dest: /etc/apt/sources.list.d/caddy-xcaddy.list
mode: '0644'
force: true
- name: Update apt cache
ansible.builtin.apt:
update_cache: true
- name: Install xcaddy
ansible.builtin.apt:
name: xcaddy
state: present
- name: Build Caddy with Cloudflare DNS plugin
ansible.builtin.shell: |
xcaddy build \
--with github.com/caddy-dns/cloudflare \
--output /usr/local/bin/caddy
args:
creates: /usr/local/bin/caddy
- name: Create systemd service for custom Caddy binary
ansible.builtin.copy:
dest: /etc/systemd/system/caddy.service
owner: root
group: root
mode: '0644'
content: |
[Unit]
Description=Caddy
[Service]
User=root
Group=root
ExecStart=/usr/local/bin/caddy run --environ --config /etc/caddy/Caddyfile
ExecReload=/usr/local/bin/caddy reload --config /etc/caddy/Caddyfile
TimeoutStopSec=5s
LimitNOFILE=1048576
Restart=on-failure
[Install]
WantedBy=multi-user.target
- name: Unmask Caddy service
ansible.builtin.systemd:
name: caddy
masked: false
- name: Allow Caddy to bind to ports <1024
command: setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy
- name: Reload systemd to pick up caddy.service changes
ansible.builtin.systemd:
daemon_reload: true
- name: Enable and start Caddy service
ansible.builtin.systemd:
name: caddy
enabled: true
state: started

View File

@ -0,0 +1,8 @@
cloudflare_api_key: !vault |
$ANSIBLE_VAULT;1.1;AES256
34356665643335356136633736363963383562366164613637363437636435343835303966356331
3463343766623264393037333638386534306164393430610a396533613235313030623834646466
31313662653435656663663361646261626130376632323163626232616331663239623236366264
6632626166623131380a333935646530396362363833383164386234653834323462386563373132
66643138663062346237646236333934306434633837643738343137623934626132376230316138
3237633130343862376332633565373631313736366431316232

View File

@ -0,0 +1,12 @@
- name: Generate Caddyfile from template
template:
src: Caddyfile.j2
dest: /etc/caddy/Caddyfile
owner: root
group: root
mode: '0644'
- name: Reload Caddy
ansible.builtin.systemd:
name: caddy
state: reloaded

View File

@ -0,0 +1,23 @@
{% for domain in domains %}
{% set base_domain = domain.name.lstrip('*.') %}
*.{{ base_domain }} {
tls {
issuer acme {
dns cloudflare {{ cloudflare_api_key }}
}
}
{% for site in domain.sites %}
@{{ site.name }} host {{ site.name }}.{{ base_domain }}
handle @{{ site.name }} {
reverse_proxy {{ site.host }}:{{ site.port }} {
transport http {
{% for opt in (site.transport_opts | default([])) %}
{{ opt }}
{% endfor %}
}
}
}
{% endfor %}
}
{% endfor %}