#!/bin/bash # Homepage Migration Script # Target: replicant (.80) # Run this on the control server (CT 127) set -e COMPOSE_DIR=~/clustered-fucks/compose-files/replicant/homepage PLAYBOOK_DIR=~/clustered-fucks/playbooks echo "=== Homepage Migration Script ===" echo "Target: replicant (.80)" echo "" # Create directories mkdir -p "$COMPOSE_DIR" mkdir -p "$PLAYBOOK_DIR" # Create docker-compose.yml cat > "$COMPOSE_DIR/docker-compose.yml" << 'EOF' services: homepage: image: ghcr.io/gethomepage/homepage:latest container_name: homepage environment: - PUID=1000 - PGID=1000 - HOMEPAGE_ALLOWED_HOSTS=192.168.1.80:3305,home.3ddbrewery.com,* volumes: - ./config:/app/config ports: - "3305:3000" restart: unless-stopped networks: - proxy deploy: resources: limits: memory: 512M cpus: '1.0' 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-homepage.yml" << 'EOF' --- - name: Deploy Homepage to replicant hosts: replicant vars: service_name: homepage service_dir: "{{ 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: Copy docker-compose.yml ansible.builtin.copy: src: "{{ compose_src }}/docker-compose.yml" dest: "{{ service_dir }}/docker-compose.yml" mode: '0644' - name: Create config directory ansible.builtin.file: path: "{{ service_dir }}/config" state: directory mode: '0755' - name: Pull latest image community.docker.docker_image: name: ghcr.io/gethomepage/homepage:latest source: pull force_source: yes - name: Deploy Homepage community.docker.docker_compose_v2: project_src: "{{ service_dir }}" state: present pull: missing register: deploy_result - name: Show deployment result ansible.builtin.debug: msg: "Homepage deployed: {{ deploy_result.changed }}" - name: Wait for container to be healthy ansible.builtin.shell: | for i in {1..30}; do status=$(docker inspect --format='{{ "{{" }}.State.Health.Status{{ "}}" }}' homepage 2>/dev/null || echo "starting") if [ "$status" = "healthy" ]; then echo "Container is healthy" exit 0 fi sleep 2 done echo "Warning: Container not healthy after 60s" docker logs homepage 2>&1 | tail -20 register: health_check changed_when: false - name: Display health status ansible.builtin.debug: msg: "{{ health_check.stdout }}" EOF echo "✅ Created $PLAYBOOK_DIR/deploy-homepage.yml" echo "" echo "=== Files Created ===" echo " $COMPOSE_DIR/docker-compose.yml" echo " $PLAYBOOK_DIR/deploy-homepage.yml" echo "" echo "=== Next Steps ===" echo "" echo "1. RSYNC CONFIG FROM ALIEN (do this first!):" echo " ssh alien 'docker stop homepage'" echo " rsync -avP maddox@alien:/home/maddox/docker/appdata/homepage/config/ \\" echo " maddox@replicant:/home/maddox/docker/appdata/homepage/config/" echo "" echo "2. DEPLOY TO REPLICANT:" echo " cd ~/clustered-fucks" echo " ansible-playbook playbooks/deploy-homepage.yml" echo "" echo "3. VERIFY:" echo " curl -s http://192.168.1.80:3305/api/healthcheck" echo " # or visit http://192.168.1.80:3305 in browser" echo "" echo "4. UPDATE TRAEFIK (on alien - update IP from .252 to .80):" echo " # Edit /home/maddox/docker/appdata/traefik/config/config.yml" echo " # Change homepage URL from 192.168.1.252:3305 to 192.168.1.80:3305" echo "" echo "5. CLEANUP ALIEN (after verification):" echo " ssh alien 'docker rm homepage'" echo "" echo "6. COMMIT TO GIT:" echo " cd ~/clustered-fucks" echo " git add -A && git commit -m 'Deploy homepage to replicant' && git push" echo ""