141 lines
3.8 KiB
Bash
Executable file
141 lines
3.8 KiB
Bash
Executable file
#!/bin/bash
|
|
# ntfy Migration Script
|
|
# Target: network-services (.121)
|
|
# Run this on the control server (CT 127)
|
|
|
|
set -e
|
|
|
|
COMPOSE_DIR=~/clustered-fucks/compose-files/network-services/ntfy
|
|
PLAYBOOK_DIR=~/clustered-fucks/playbooks
|
|
|
|
echo "=== ntfy Migration Script ==="
|
|
echo "Target: network-services (.121)"
|
|
echo "⚠️ CRITICAL: This is your notification hub - expect brief cluster-wide notification outage"
|
|
echo ""
|
|
|
|
# Create directories
|
|
mkdir -p "$COMPOSE_DIR"
|
|
mkdir -p "$PLAYBOOK_DIR"
|
|
|
|
# Create docker-compose.yml
|
|
cat > "$COMPOSE_DIR/docker-compose.yml" << 'EOF'
|
|
services:
|
|
ntfy:
|
|
image: binwiederhier/ntfy:latest
|
|
container_name: ntfy
|
|
command: serve
|
|
environment:
|
|
- NTFY_BASE_URL=https://ntfy.3ddbrewery.com
|
|
- NTFY_BEHIND_PROXY=true
|
|
volumes:
|
|
- ./data:/var/lib/ntfy
|
|
- ./cache:/var/cache/ntfy
|
|
ports:
|
|
- "6741:80"
|
|
restart: unless-stopped
|
|
networks:
|
|
- proxy
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
memory: 256M
|
|
cpus: '0.5'
|
|
labels:
|
|
- "autoheal=true"
|
|
- "com.centurylinklabs.watchtower.enable=true"
|
|
|
|
networks:
|
|
proxy:
|
|
external: true
|
|
EOF
|
|
|
|
echo "✅ Created $COMPOSE_DIR/docker-compose.yml"
|
|
|
|
# Create Ansible playbook
|
|
cat > "$PLAYBOOK_DIR/deploy-ntfy.yml" << 'EOF'
|
|
---
|
|
- name: Deploy ntfy to network-services
|
|
hosts: network-services
|
|
vars:
|
|
service_name: ntfy
|
|
service_dir: "{{ docker_appdata }}/{{ service_name }}"
|
|
compose_src: "{{ playbook_dir }}/../compose-files/network-services/{{ service_name }}"
|
|
|
|
tasks:
|
|
- name: Create service directory
|
|
ansible.builtin.file:
|
|
path: "{{ service_dir }}"
|
|
state: directory
|
|
mode: '0755'
|
|
|
|
- name: Create data subdirectory
|
|
ansible.builtin.file:
|
|
path: "{{ service_dir }}/data"
|
|
state: directory
|
|
mode: '0755'
|
|
|
|
- name: Create cache subdirectory
|
|
ansible.builtin.file:
|
|
path: "{{ service_dir }}/cache"
|
|
state: directory
|
|
mode: '0755'
|
|
|
|
- name: Copy docker-compose.yml
|
|
ansible.builtin.copy:
|
|
src: "{{ compose_src }}/docker-compose.yml"
|
|
dest: "{{ service_dir }}/docker-compose.yml"
|
|
mode: '0644'
|
|
|
|
- name: Pull latest image
|
|
community.docker.docker_image:
|
|
name: binwiederhier/ntfy:latest
|
|
source: pull
|
|
force_source: yes
|
|
|
|
- name: Deploy container
|
|
community.docker.docker_compose_v2:
|
|
project_src: "{{ service_dir }}"
|
|
state: present
|
|
pull: missing
|
|
EOF
|
|
|
|
echo "✅ Created $PLAYBOOK_DIR/deploy-ntfy.yml"
|
|
|
|
echo ""
|
|
echo "=== FILES CREATED ==="
|
|
echo " - $COMPOSE_DIR/docker-compose.yml"
|
|
echo " - $PLAYBOOK_DIR/deploy-ntfy.yml"
|
|
echo ""
|
|
echo "=== MIGRATION STEPS ==="
|
|
echo ""
|
|
echo "1. STOP OLD CONTAINER:"
|
|
echo " ssh alien 'docker stop ntfy'"
|
|
echo ""
|
|
echo "2. RSYNC DATA (run from network-services):"
|
|
echo " ssh network-services"
|
|
echo " sudo mkdir -p /home/docker/appdata/ntfy/{data,cache}"
|
|
echo " sudo rsync -avP maddox@alien:/home/maddox/docker/appdata/ntfy/ /home/docker/appdata/ntfy/data/"
|
|
echo " sudo rsync -avP maddox@alien:/home/maddox/docker/appdata/ntfy/cache/ /home/docker/appdata/ntfy/cache/"
|
|
echo " exit"
|
|
echo ""
|
|
echo "3. DEPLOY:"
|
|
echo " ansible-playbook playbooks/deploy-ntfy.yml"
|
|
echo ""
|
|
echo "4. VERIFY:"
|
|
echo " curl -s http://192.168.1.121:6741/v1/health"
|
|
echo " # Test notification:"
|
|
echo " curl -d 'Migration test' http://192.168.1.121:6741/test-migration"
|
|
echo ""
|
|
echo "5. UPDATE TRAEFIK (on alien):"
|
|
echo " # Change ntfy backend from 192.168.1.252:6741 to 192.168.1.121:6741"
|
|
echo ""
|
|
echo "6. VERIFY EXTERNAL ACCESS:"
|
|
echo " curl -d 'External test' https://ntfy.3ddbrewery.com/test-migration"
|
|
echo ""
|
|
echo "7. CLEANUP:"
|
|
echo " ssh alien 'docker rm ntfy'"
|
|
echo ""
|
|
echo "8. COMMIT:"
|
|
echo " git add -A && git commit -m 'Migrate ntfy to network-services (.121)' && git push"
|
|
echo ""
|
|
echo "=== DONE ==="
|