#!/bin/bash # Script de deploy para servidor remoto # Uso: ./deploy.sh [production|staging] set -e # ============================================ # CONFIGURACIÓN # ============================================ ENV=${1:-production} REGISTRY="${REGISTRY:-ghcr.io}" PROJECT="${PROJECT:-myapp}" VERSION="${VERSION:-latest}" # Servidor remoto REMOTE_USER="${REMOTE_USER:-deploy}" REMOTE_HOST="${REMOTE_HOST:-server.example.com}" REMOTE_PATH="${REMOTE_PATH:-/opt/$PROJECT}" # Colores RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' log() { echo -e "${GREEN}[INFO]${NC} $1"; } warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } error() { echo -e "${RED}[ERROR]${NC} $1"; exit 1; } # ============================================ # VALIDACIONES # ============================================ log "Validando configuración..." if ! command -v docker &> /dev/null; then error "Docker no está instalado" fi if [ -z "$REMOTE_HOST" ] || [ "$REMOTE_HOST" = "server.example.com" ]; then error "Configura REMOTE_HOST antes de ejecutar" fi # ============================================ # BUILD # ============================================ log "Building imágenes para $ENV..." # Build con buildkit para mejor cache export DOCKER_BUILDKIT=1 docker build -t $REGISTRY/$PROJECT-frontend:$VERSION ./frontend docker build -t $REGISTRY/$PROJECT-backend:$VERSION ./backend log "Imágenes construidas:" docker images | grep $PROJECT # ============================================ # PUSH A REGISTRY # ============================================ log "Pushing imágenes a $REGISTRY..." docker push $REGISTRY/$PROJECT-frontend:$VERSION docker push $REGISTRY/$PROJECT-backend:$VERSION log "Imágenes subidas correctamente" # ============================================ # DEPLOY A SERVIDOR # ============================================ log "Desplegando a $REMOTE_HOST..." # Copiar docker-compose si no existe ssh $REMOTE_USER@$REMOTE_HOST "mkdir -p $REMOTE_PATH" scp docker-compose.yml $REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH/ # Copiar .env si existe if [ -f ".env.$ENV" ]; then scp .env.$ENV $REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH/.env fi # Deploy remoto ssh $REMOTE_USER@$REMOTE_HOST << EOF cd $REMOTE_PATH # Pull nuevas imágenes docker compose pull # Restart servicios docker compose up -d --remove-orphans # Limpiar imágenes antiguas docker image prune -f # Verificar estado docker compose ps EOF # ============================================ # VERIFICACIÓN # ============================================ log "Verificando deploy..." sleep 5 # Healthcheck HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" https://$REMOTE_HOST/health || echo "000") if [ "$HTTP_STATUS" = "200" ]; then log "Deploy exitoso! Servidor respondiendo correctamente." else warn "Servidor respondió con código: $HTTP_STATUS" warn "Verifica los logs: ssh $REMOTE_USER@$REMOTE_HOST 'docker compose -f $REMOTE_PATH/docker-compose.yml logs'" fi log "Deploy completado para $ENV"