feat: add Gotify notification server with iGotify iOS support
Add comprehensive push notification infrastructure with: - Gotify server for push notifications with admin password configuration - iGotify Assistant service for iOS notification relay via Apple Push Notifications - Dual subdomain setup (gotify.* and gotify-assistant.*) - Proper service dependencies and container communication via hairpinning - Caddy reverse proxy configuration for both services - DNS A records for both subdomains - Added to monitoring services category - Tested with successful notification delivery Services accessible at: - https://gotify.thesatelliteoflove.com (main server) - https://gotify-assistant.thesatelliteoflove.com (iOS assistant) 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
4
dns.yml
4
dns.yml
@ -45,6 +45,10 @@
|
|||||||
ip: "152.53.36.98"
|
ip: "152.53.36.98"
|
||||||
- name: bookmarks
|
- name: bookmarks
|
||||||
ip: "152.53.36.98"
|
ip: "152.53.36.98"
|
||||||
|
- name: gotify
|
||||||
|
ip: "152.53.36.98"
|
||||||
|
- name: gotify-assistant
|
||||||
|
ip: "152.53.36.98"
|
||||||
- name: nerder.land
|
- name: nerder.land
|
||||||
dns_records:
|
dns_records:
|
||||||
- name: "forms"
|
- name: "forms"
|
||||||
|
@ -29,6 +29,8 @@ subdomains:
|
|||||||
appriseapi: "appriseapi.{{ primary_domain }}"
|
appriseapi: "appriseapi.{{ primary_domain }}"
|
||||||
dockge: "dockge.{{ primary_domain }}"
|
dockge: "dockge.{{ primary_domain }}"
|
||||||
code: "code.{{ primary_domain }}" # Code Server
|
code: "code.{{ primary_domain }}" # Code Server
|
||||||
|
gotify: "gotify.{{ primary_domain }}" # Gotify notifications
|
||||||
|
gotify_assistant: "gotify-assistant.{{ primary_domain }}" # iGotify iOS assistant
|
||||||
|
|
||||||
# Email domains for notifications
|
# Email domains for notifications
|
||||||
email_domains:
|
email_domains:
|
||||||
|
@ -7,7 +7,7 @@ service_categories:
|
|||||||
media: ["audiobookshelf", "calibre", "ghost", "pinchflat", "pinry", "hoarder", "manyfold"]
|
media: ["audiobookshelf", "calibre", "ghost", "pinchflat", "pinry", "hoarder", "manyfold"]
|
||||||
productivity: ["paperlessngx", "baikal", "syncthing", "mmdl", "heyform", "dawarich", "pingvin"]
|
productivity: ["paperlessngx", "baikal", "syncthing", "mmdl", "heyform", "dawarich", "pingvin"]
|
||||||
communication: ["gotosocial", "postiz"]
|
communication: ["gotosocial", "postiz"]
|
||||||
monitoring: ["glance", "changedetection", "appriseapi"]
|
monitoring: ["glance", "changedetection", "appriseapi", "gotify"]
|
||||||
|
|
||||||
# Common service configuration
|
# Common service configuration
|
||||||
services:
|
services:
|
||||||
|
@ -83,6 +83,14 @@ home.thesatelliteoflove.com {
|
|||||||
reverse_proxy authentik-server-1:9000
|
reverse_proxy authentik-server-1:9000
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gotify.thesatelliteoflove.com {
|
||||||
|
reverse_proxy gotify-gotify-1:80
|
||||||
|
}
|
||||||
|
|
||||||
|
gotify-assistant.thesatelliteoflove.com {
|
||||||
|
reverse_proxy gotify-igotify-assistant-1:8080
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
repair.nerder.land {
|
repair.nerder.land {
|
||||||
root * /srv/repair
|
root * /srv/repair
|
||||||
|
19
roles/docker/tasks/monitoring/gotify.yml
Normal file
19
roles/docker/tasks/monitoring/gotify.yml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
- name: Create gotify directories
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ item }}"
|
||||||
|
state: directory
|
||||||
|
loop:
|
||||||
|
- /opt/stacks/gotify
|
||||||
|
|
||||||
|
- name: Template out the gotify compose file
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: gotify-compose.yml.j2
|
||||||
|
dest: /opt/stacks/gotify/compose.yml
|
||||||
|
owner: root
|
||||||
|
mode: 644
|
||||||
|
|
||||||
|
- name: Deploy gotify stack
|
||||||
|
community.docker.docker_compose_v2:
|
||||||
|
project_src: /opt/stacks/gotify
|
||||||
|
files:
|
||||||
|
- compose.yml
|
@ -12,3 +12,7 @@
|
|||||||
- name: Install appriseapi
|
- name: Install appriseapi
|
||||||
import_tasks: appriseapi.yml
|
import_tasks: appriseapi.yml
|
||||||
tags: appriseapi
|
tags: appriseapi
|
||||||
|
|
||||||
|
- name: Install gotify
|
||||||
|
import_tasks: gotify.yml
|
||||||
|
tags: gotify
|
44
roles/docker/templates/gotify-compose.yml.j2
Normal file
44
roles/docker/templates/gotify-compose.yml.j2
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
services:
|
||||||
|
gotify:
|
||||||
|
image: gotify/server:latest
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- gotify_data:/app/data
|
||||||
|
environment:
|
||||||
|
- GOTIFY_DEFAULTUSER_PASS={{ vault_gotify.admin_password }}
|
||||||
|
- TZ=America/Denver
|
||||||
|
labels:
|
||||||
|
glance.name: Gotify
|
||||||
|
glance.icon: si:gotify
|
||||||
|
glance.url: "https://{{ subdomains.gotify }}/"
|
||||||
|
glance.description: Push notification server
|
||||||
|
extra_hosts:
|
||||||
|
- "{{ subdomains.auth }}:{{ docker.hairpin_ip }}"
|
||||||
|
- "{{ subdomains.gotify_assistant }}:{{ docker.hairpin_ip }}"
|
||||||
|
|
||||||
|
igotify-assistant:
|
||||||
|
image: ghcr.io/androidseb25/igotify-notification-assist:latest
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- igotify_data:/app/data
|
||||||
|
environment:
|
||||||
|
- TZ=America/Denver
|
||||||
|
depends_on:
|
||||||
|
- gotify
|
||||||
|
labels:
|
||||||
|
glance.name: iGotify Assistant
|
||||||
|
glance.icon: si:apple
|
||||||
|
glance.url: "https://{{ subdomains.gotify_assistant }}/"
|
||||||
|
glance.description: iOS notification assistant
|
||||||
|
extra_hosts:
|
||||||
|
- "{{ subdomains.auth }}:{{ docker.hairpin_ip }}"
|
||||||
|
- "{{ subdomains.gotify }}:{{ docker.hairpin_ip }}"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
gotify_data:
|
||||||
|
igotify_data:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
default:
|
||||||
|
external: true
|
||||||
|
name: "{{ docker.network_name }}"
|
Reference in New Issue
Block a user