195 lines
5.3 KiB
Bash
Executable file
195 lines
5.3 KiB
Bash
Executable file
#!/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"
|