#!/bin/bash # Watchstate + Jellyseerr Migration Script # Target: replicant (.80) # Run this on the control server (CT 127) set -e echo "=== Watchstate + Jellyseerr Migration Script ===" echo "Target: replicant (192.168.1.80)" echo "" # ============================================ # WATCHSTATE # ============================================ WATCHSTATE_COMPOSE_DIR=~/clustered-fucks/compose-files/replicant/watchstate PLAYBOOK_DIR=~/clustered-fucks/playbooks mkdir -p "$WATCHSTATE_COMPOSE_DIR" mkdir -p "$PLAYBOOK_DIR" cat > "$WATCHSTATE_COMPOSE_DIR/docker-compose.yml" << 'EOF' services: watchstate: image: ghcr.io/arabcoders/watchstate:latest container_name: watchstate user: "1000:1000" environment: - TZ=America/Indiana/Indianapolis volumes: - ./config:/config:rw ports: - "8585:8080" restart: unless-stopped networks: - proxy deploy: resources: limits: memory: 512M cpus: '1.0' labels: - "autoheal=true" - "com.centurylinklabs.watchtower.enable=true" healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:8080/v1/api/system/healthcheck || exit 1"] interval: 30s timeout: 10s retries: 3 networks: proxy: external: true EOF echo "✅ Created $WATCHSTATE_COMPOSE_DIR/docker-compose.yml" cat > "$PLAYBOOK_DIR/deploy-watchstate.yml" << 'EOF' --- - name: Deploy Watchstate to replicant hosts: replicant vars: service_name: watchstate service_dir: /home/maddox/docker/appdata/{{ service_name }} compose_src: "{{ playbook_dir }}/../compose-files/replicant/{{ service_name }}" tasks: - name: Create service directory ansible.builtin.file: path: "{{ service_dir }}" state: directory mode: '0755' - name: Create config subdirectory ansible.builtin.file: path: "{{ service_dir }}/config" state: directory owner: "1000" group: "1000" 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: Deploy container community.docker.docker_compose_v2: project_src: "{{ service_dir }}" state: present pull: always EOF echo "✅ Created $PLAYBOOK_DIR/deploy-watchstate.yml" # ============================================ # JELLYSEERR # ============================================ JELLYSEERR_COMPOSE_DIR=~/clustered-fucks/compose-files/replicant/jellyseerr mkdir -p "$JELLYSEERR_COMPOSE_DIR" cat > "$JELLYSEERR_COMPOSE_DIR/docker-compose.yml" << 'EOF' services: jellyseerr: image: fallenbagel/jellyseerr:latest container_name: jellyseerr environment: - LOG_LEVEL=info - TZ=America/Indiana/Indianapolis volumes: - ./config:/app/config ports: - "5055:5055" restart: unless-stopped networks: - proxy deploy: resources: limits: memory: 1G cpus: '1.0' labels: - "autoheal=true" - "com.centurylinklabs.watchtower.enable=true" networks: proxy: external: true EOF echo "✅ Created $JELLYSEERR_COMPOSE_DIR/docker-compose.yml" cat > "$PLAYBOOK_DIR/deploy-jellyseerr.yml" << 'EOF' --- - name: Deploy Jellyseerr to replicant hosts: replicant vars: service_name: jellyseerr service_dir: /home/maddox/docker/appdata/{{ service_name }} compose_src: "{{ playbook_dir }}/../compose-files/replicant/{{ service_name }}" tasks: - name: Create service directory ansible.builtin.file: path: "{{ service_dir }}" state: directory mode: '0755' - name: Create config subdirectory ansible.builtin.file: path: "{{ service_dir }}/config" 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: Deploy container community.docker.docker_compose_v2: project_src: "{{ service_dir }}" state: present pull: always EOF echo "✅ Created $PLAYBOOK_DIR/deploy-jellyseerr.yml" echo "" echo "==========================================" echo "=== MIGRATION STEPS ===" echo "==========================================" echo "" echo "--- WATCHSTATE ---" echo "1. STOP: ssh alien 'docker stop watchstate'" echo "2. RSYNC: ssh replicant" echo " rsync -avP maddox@alien:/home/maddox/docker/appdata/watchstate/ /home/maddox/docker/appdata/watchstate/config/" echo "3. DEPLOY: ansible-playbook playbooks/deploy-watchstate.yml" echo "4. VERIFY: curl http://192.168.1.80:8585/v1/api/system/healthcheck" echo "" echo "--- JELLYSEERR ---" echo "5. STOP: ssh alien 'docker stop jellyseerr'" echo "6. RSYNC: ssh replicant" echo " rsync -avP maddox@alien:/home/maddox/docker/appdata/jellyseerr/ /home/maddox/docker/appdata/jellyseerr/config/" echo "7. DEPLOY: ansible-playbook playbooks/deploy-jellyseerr.yml" echo "8. VERIFY: curl -I http://192.168.1.80:5055" echo "" echo "--- CLEANUP ---" echo "9. UPDATE TRAEFIK: Change backend IPs to 192.168.1.80" echo "10. CLEANUP: ssh alien 'docker rm watchstate jellyseerr'" echo "11. COMMIT: git add -A && git commit -m 'Migrate watchstate + jellyseerr to replicant' && git push"