certbot cannot issue for internal hostnames (*.nas.local), which made nginx-enabled services with internal names fail on deploy. Add a <service>_nginx_letsencrypt flag (default false) and computed <service>_nginx_ssl_certificate/_key paths: when off the vhost uses the shared self-signed cert (nginx_default_ssl_cert), when on it uses the Let's Encrypt lineage. Gate the certbot include on the flag and apply the pattern to all service roles (deluge, fdroid, gitea, grafana, immich, metabase, ntfy, prowlarr, radarr, seerr, static_web, uptime_kuma).
168 lines
5.1 KiB
YAML
168 lines
5.1 KiB
YAML
---
|
|
- name: Validate required passwords are set
|
|
ansible.builtin.assert:
|
|
that:
|
|
- ntfy_admin_password is defined
|
|
- ntfy_admin_password | length >= 12
|
|
fail_msg: |
|
|
ntfy_admin_password is required (min 12 chars).
|
|
See roles/ntfy/defaults/main.yml for configuration instructions.
|
|
success_msg: "Password validation passed"
|
|
|
|
- name: Create ntfy project directory
|
|
ansible.builtin.file:
|
|
path: "{{ podman_projects_dir | default('/opt/podman') }}/ntfy"
|
|
state: directory
|
|
owner: "{{ ansible_user }}"
|
|
group: "{{ ansible_user }}"
|
|
mode: "0755"
|
|
|
|
- name: Create ntfy data directories
|
|
ansible.builtin.file:
|
|
path: "{{ item }}"
|
|
state: directory
|
|
owner: "{{ ansible_user }}"
|
|
group: "{{ ansible_user }}"
|
|
mode: "0755"
|
|
loop:
|
|
- "{{ ntfy_data_dir }}"
|
|
- "{{ ntfy_cache_dir }}"
|
|
|
|
- name: Deploy ntfy server configuration
|
|
ansible.builtin.template:
|
|
src: server.yml.j2
|
|
dest: "{{ podman_projects_dir | default('/opt/podman') }}/ntfy/server.yml"
|
|
owner: "{{ ansible_user }}"
|
|
group: "{{ ansible_user }}"
|
|
mode: "0644"
|
|
notify: Restart ntfy
|
|
|
|
- name: Get current ntfy image ID
|
|
ansible.builtin.command: "podman image inspect --format {% raw %}{{.Id}}{% endraw %} {{ ntfy_image }}:{{ ntfy_version }}"
|
|
register: ntfy_image_id_before
|
|
failed_when: false # image may not exist yet on first deploy
|
|
changed_when: false
|
|
become: false
|
|
become_user: "{{ ansible_user }}"
|
|
|
|
- name: Pull ntfy container image
|
|
ansible.builtin.command: "podman pull --quiet {{ ntfy_image }}:{{ ntfy_version }}"
|
|
register: pull_result
|
|
changed_when: pull_result.stdout != ntfy_image_id_before.stdout
|
|
become: false
|
|
become_user: "{{ ansible_user }}"
|
|
notify: Restart ntfy
|
|
|
|
- name: Deploy Kubernetes YAML for ntfy
|
|
ansible.builtin.template:
|
|
src: ntfy.yaml.j2
|
|
dest: "{{ podman_projects_dir | default('/opt/podman') }}/ntfy/ntfy.yaml"
|
|
owner: "{{ ansible_user }}"
|
|
group: "{{ ansible_user }}"
|
|
mode: "0644"
|
|
notify: Restart ntfy
|
|
|
|
- name: Get home directory for {{ ansible_user }}
|
|
ansible.builtin.getent:
|
|
database: passwd
|
|
key: "{{ ansible_user }}"
|
|
|
|
- name: Set user home directory fact
|
|
ansible.builtin.set_fact:
|
|
user_home_dir: "{{ ansible_facts['getent_passwd'][ansible_user][4] }}"
|
|
|
|
- name: Create systemd user directory for ntfy
|
|
ansible.builtin.file:
|
|
path: "{{ user_home_dir }}/.config/systemd/user"
|
|
state: directory
|
|
owner: "{{ ansible_user }}"
|
|
group: "{{ ansible_user }}"
|
|
mode: "0755"
|
|
|
|
- name: Create systemd service for ntfy (user scope)
|
|
ansible.builtin.template:
|
|
src: ntfy.service.j2
|
|
dest: "{{ user_home_dir }}/.config/systemd/user/ntfy.service"
|
|
owner: "{{ ansible_user }}"
|
|
group: "{{ ansible_user }}"
|
|
mode: "0644"
|
|
notify: Reload systemd user
|
|
|
|
- name: Check if lingering is enabled for {{ ansible_user }}
|
|
ansible.builtin.stat:
|
|
path: "/var/lib/systemd/linger/{{ ansible_user }}"
|
|
register: linger_file
|
|
|
|
- name: Enable lingering for user {{ ansible_user }}
|
|
ansible.builtin.command: "loginctl enable-linger {{ ansible_user }}"
|
|
changed_when: true
|
|
when:
|
|
- ansible_user != 'root'
|
|
- not linger_file.stat.exists
|
|
|
|
- name: Enable and start ntfy service (user scope)
|
|
ansible.builtin.systemd:
|
|
name: ntfy.service
|
|
enabled: true
|
|
state: started
|
|
scope: user
|
|
become: false
|
|
become_user: "{{ ansible_user }}"
|
|
|
|
- name: Wait for ntfy to be ready
|
|
ansible.builtin.wait_for:
|
|
port: "{{ ntfy_port }}"
|
|
host: 127.0.0.1
|
|
timeout: 60
|
|
|
|
- name: Check if admin user already exists
|
|
ansible.builtin.command:
|
|
cmd: podman exec ntfy-server ntfy user list
|
|
register: ntfy_user_list
|
|
changed_when: false
|
|
failed_when: false
|
|
become: false
|
|
become_user: "{{ ansible_user }}"
|
|
|
|
- name: Create admin user in ntfy
|
|
ansible.builtin.shell: |
|
|
set -o pipefail
|
|
printf '%s\n%s\n' '{{ ntfy_admin_password }}' '{{ ntfy_admin_password }}' | podman exec -i ntfy-server ntfy user add --role=admin {{ ntfy_admin_user }}
|
|
when: ntfy_admin_user not in ntfy_user_list.stdout
|
|
register: ntfy_user_create
|
|
changed_when: ntfy_user_create.rc == 0
|
|
become: false
|
|
become_user: "{{ ansible_user }}"
|
|
|
|
- name: Set admin user password
|
|
ansible.builtin.shell: |
|
|
set -o pipefail
|
|
printf '%s\n%s\n' '{{ ntfy_admin_password }}' '{{ ntfy_admin_password }}' | podman exec -i ntfy-server ntfy user change-pass {{ ntfy_admin_user }}
|
|
when: ntfy_admin_user in ntfy_user_list.stdout
|
|
changed_when: false
|
|
become: false
|
|
become_user: "{{ ansible_user }}"
|
|
|
|
- name: Provision TLS certificate for ntfy
|
|
ansible.builtin.include_tasks: "{{ role_path }}/../nginx/tasks/certbot.yml"
|
|
vars:
|
|
certbot_hostname: "{{ ntfy_nginx_hostname }}"
|
|
when: ntfy_nginx_enabled and ntfy_nginx_letsencrypt
|
|
|
|
- name: Deploy nginx vhost configuration for ntfy
|
|
ansible.builtin.template:
|
|
src: nginx-vhost.conf.j2
|
|
dest: "{{ nginx_conf_dir | default('/etc/nginx/conf.d') }}/ntfy.conf"
|
|
owner: root
|
|
group: root
|
|
mode: "0644"
|
|
when: ntfy_nginx_enabled
|
|
notify: Reload nginx
|
|
|
|
- name: Remove nginx vhost configuration for ntfy
|
|
ansible.builtin.file:
|
|
path: "{{ nginx_conf_dir | default('/etc/nginx/conf.d') }}/ntfy.conf"
|
|
state: absent
|
|
when: not ntfy_nginx_enabled
|
|
notify: Reload nginx
|