#!/bin/bash # ============================================================================= # Phase 3 Migration: Database Admin Tools # Target: databases (.81) # Services: phpmyadmin, phppgadmin # Run this on the control server (CT 127) # ============================================================================= set -e COMPOSE_DIR_PMA=~/clustered-fucks/compose-files/databases/phpmyadmin COMPOSE_DIR_PGA=~/clustered-fucks/compose-files/databases/phppgadmin PLAYBOOK_DIR=~/clustered-fucks/playbooks echo "========================================" echo "Phase 3: Database Admin Tools Migration" echo "Target: databases (192.168.1.81)" echo "========================================" echo "" # Create directories mkdir -p "$COMPOSE_DIR_PMA" mkdir -p "$COMPOSE_DIR_PGA" mkdir -p "$PLAYBOOK_DIR" # ============================================================================= # PHPMYADMIN # ============================================================================= echo "Creating phpMyAdmin compose file..." cat > "$COMPOSE_DIR_PMA/docker-compose.yml" << 'EOF' services: phpmyadmin: image: phpmyadmin:latest container_name: phpmyadmin hostname: phpmyadmin environment: # Multiple MySQL hosts: Hetzner (im), NAS (different ports) - PMA_HOSTS=192.168.12.3,192.168.1.251,192.168.1.251 - PMA_PORTS=3306,33306,3306 - MAX_EXECUTION_TIME=300 - MEMORY_LIMIT=512M - UPLOAD_LIMIT=2048K - TZ=America/Indiana/Indianapolis ports: - "2500:80" restart: unless-stopped networks: - proxy deploy: resources: limits: memory: 512M cpus: '1.0' labels: - "autoheal=true" - "com.centurylinklabs.watchtower.enable=true" - "homepage.group=Infrastructure" - "homepage.name=Phpmyadmin" - "homepage.icon=phpmyadmin.png" - "homepage.href=https://php.3ddbrewery.com" networks: proxy: external: true EOF echo "✅ Created $COMPOSE_DIR_PMA/docker-compose.yml" # ============================================================================= # PHPPGADMIN # ============================================================================= echo "Creating phpPgAdmin compose file..." cat > "$COMPOSE_DIR_PGA/docker-compose.yml" << 'EOF' services: phppgadmin: image: dockage/phppgadmin:latest container_name: phppgadmin hostname: phppgadmin environment: # PostgreSQL on Hetzner (im) - PHP_PG_ADMIN_SERVER_HOST=192.168.12.2 - PHP_PG_ADMIN_SERVER_PORT=55432 - PHP_PG_ADMIN_SERVER_SSL_MODE=allow ports: - "5183:80" - "4433:443" restart: unless-stopped volumes: - ./data:/data - ./logs:/var/log networks: - proxy deploy: resources: limits: memory: 256M cpus: '0.5' labels: - "autoheal=true" - "com.centurylinklabs.watchtower.enable=true" - "homepage.group=Infrastructure" - "homepage.name=PhpPGadmin" - "homepage.icon=postgres.png" - "homepage.href=https://phppgadmin.3ddbrewery.com" networks: proxy: external: true EOF echo "✅ Created $COMPOSE_DIR_PGA/docker-compose.yml" # ============================================================================= # ANSIBLE PLAYBOOK - Combined Deployment # ============================================================================= echo "Creating combined Ansible playbook..." cat > "$PLAYBOOK_DIR/deploy-db-admin-tools.yml" << 'EOF' --- # Deploy Database Admin Tools to databases VM # Deploys: phpmyadmin, phppgadmin # Target: databases (192.168.1.81) - name: Deploy Database Admin Tools hosts: databases vars: appdata_path: /home/docker/appdata compose_src: "{{ playbook_dir }}/../compose-files/databases" tasks: # ========================================================================= # PHPMYADMIN # ========================================================================= - name: Create phpmyadmin directory ansible.builtin.file: path: "{{ appdata_path }}/phpmyadmin" state: directory mode: '0755' - name: Copy phpmyadmin docker-compose.yml ansible.builtin.copy: src: "{{ compose_src }}/phpmyadmin/docker-compose.yml" dest: "{{ appdata_path }}/phpmyadmin/docker-compose.yml" mode: '0644' - name: Deploy phpmyadmin container community.docker.docker_compose_v2: project_src: "{{ appdata_path }}/phpmyadmin" state: present pull: always register: phpmyadmin_result - name: Show phpmyadmin status ansible.builtin.debug: msg: "phpMyAdmin deployed: {{ phpmyadmin_result.changed }}" # ========================================================================= # PHPPGADMIN # ========================================================================= - name: Create phppgadmin directory ansible.builtin.file: path: "{{ appdata_path }}/phppgadmin" state: directory mode: '0755' - name: Create phppgadmin data directory ansible.builtin.file: path: "{{ appdata_path }}/phppgadmin/data" state: directory mode: '0755' - name: Create phppgadmin logs directory ansible.builtin.file: path: "{{ appdata_path }}/phppgadmin/logs" state: directory mode: '0755' - name: Copy phppgadmin docker-compose.yml ansible.builtin.copy: src: "{{ compose_src }}/phppgadmin/docker-compose.yml" dest: "{{ appdata_path }}/phppgadmin/docker-compose.yml" mode: '0644' - name: Deploy phppgadmin container community.docker.docker_compose_v2: project_src: "{{ appdata_path }}/phppgadmin" state: present pull: always register: phppgadmin_result - name: Show phppgadmin status ansible.builtin.debug: msg: "phpPgAdmin deployed: {{ phppgadmin_result.changed }}" # ========================================================================= # VERIFICATION # ========================================================================= - name: Wait for phpmyadmin to be ready ansible.builtin.uri: url: "http://localhost:2500" status_code: 200 timeout: 5 register: pma_health retries: 10 delay: 5 until: pma_health.status == 200 - name: Wait for phppgadmin to be ready ansible.builtin.uri: url: "http://localhost:5183" status_code: [200, 302] timeout: 5 register: pga_health retries: 10 delay: 5 until: pga_health.status in [200, 302] - name: Summary ansible.builtin.debug: msg: - "✅ phpMyAdmin: http://192.168.1.81:2500" - "✅ phpPgAdmin: http://192.168.1.81:5183" EOF echo "✅ Created $PLAYBOOK_DIR/deploy-db-admin-tools.yml" echo "" echo "========================================" echo "FILES CREATED" echo "========================================" echo " $COMPOSE_DIR_PMA/docker-compose.yml" echo " $COMPOSE_DIR_PGA/docker-compose.yml" echo " $PLAYBOOK_DIR/deploy-db-admin-tools.yml" echo "" echo "========================================" echo "NEXT STEPS" echo "========================================" echo "" echo "1. STOP OLD CONTAINERS on alien:" echo " ssh alien 'docker stop phpmyadmin phppgadmin-phppgadmin-1'" echo "" echo "2. DEPLOY to databases:" echo " ansible-playbook playbooks/deploy-db-admin-tools.yml" echo "" echo "3. VERIFY services:" echo " curl -I http://192.168.1.81:2500 # phpMyAdmin" echo " curl -I http://192.168.1.81:5183 # phpPgAdmin" echo "" echo "4. UPDATE TRAEFIK config on Hetzner:" echo " Change backend IPs from alien (192.168.1.252) to databases (192.168.1.81)" echo " - phpmyadmin: port 2500" echo " - phppgadmin: port 5183" echo "" echo "5. CLEANUP alien:" echo " ssh alien 'docker rm phpmyadmin phppgadmin-phppgadmin-1'" echo "" echo "6. COMMIT changes:" echo " cd ~/clustered-fucks" echo " git add -A" echo " git commit -m 'Phase 3: Deploy phpmyadmin + phppgadmin to databases'" echo " git push" echo "" echo "========================================" echo "NOTES" echo "========================================" echo "- Both services are STATELESS (phpmyadmin has no mounts)" echo "- phppgadmin had anonymous Docker volumes on alien (not important)" echo "- phpMyAdmin connects to MySQL on: Hetzner (192.168.12.3:3306), NAS (192.168.1.251:33306 & :3306)" echo "- phpPgAdmin connects to PostgreSQL on: Hetzner (192.168.12.2:55432)" echo ""