Files
michaelschiemer/deploy-git.sh
Michael Schiemer 55a330b223 Enable Discovery debug logging for production troubleshooting
- Add DISCOVERY_LOG_LEVEL=debug
- Add DISCOVERY_SHOW_PROGRESS=true
- Temporary changes for debugging InitializerProcessor fixes on production
2025-08-11 20:13:26 +02:00

213 lines
5.6 KiB
Bash
Executable File

#!/bin/bash
# Git-basiertes Deployment für Custom PHP Framework
# Verwendet Gitea statt GitHub/externe Services
# Konfiguration
SERVER_USER="deploy"
SERVER_IP="94.16.110.151"
REMOTE_PATH="/var/www/michaelschiemer"
GITEA_REPO_URL="git@gitea.example.com:user/michaelschiemer.git" # Anpassen an deine Gitea-URL
SSH_OPTS="-o StrictHostKeyChecking=no"
# Farben für Output
GREEN="\e[32m"
YELLOW="\e[33m"
RED="\e[31m"
BLUE="\e[34m"
RESET="\e[0m"
# Logging
log() {
echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${RESET} $1"
}
success() {
echo -e "${GREEN}$1${RESET}"
}
warning() {
echo -e "${YELLOW}⚠️ $1${RESET}"
}
error() {
echo -e "${RED}$1${RESET}"
exit 1
}
# Validierung der lokalen Umgebung
validate_local() {
log "Validiere lokale Umgebung..."
# Git Status prüfen
if [[ -n $(git status --porcelain) ]]; then
error "Working directory nicht clean. Bitte committen oder stashen."
fi
# Auf main branch?
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [[ "$CURRENT_BRANCH" != "main" ]]; then
warning "Aktueller Branch: $CURRENT_BRANCH (nicht main)"
read -p "Fortfahren? (y/n): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
error "Deployment abgebrochen"
fi
fi
success "Lokale Validierung erfolgreich"
}
# Pre-Deployment Tests
run_local_tests() {
log "Führe lokale Tests aus..."
# Framework-Tests
if ! ./vendor/bin/pest --bail; then
error "Pest Tests fehlgeschlagen"
fi
# Code Style
if ! composer cs --dry-run; then
error "Code Style Violations gefunden. Führe 'composer cs-fix' aus."
fi
# Static Analysis (optional, kann lange dauern)
read -p "PHPStan ausführen? (empfohlen) (y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
if ! make phpstan; then
warning "PHPStan Warnungen gefunden, aber Deployment wird fortgesetzt"
fi
fi
success "Lokale Tests erfolgreich"
}
# Frontend Assets bauen
build_assets() {
log "Baue Frontend-Assets..."
if ! npm ci; then
error "NPM Install fehlgeschlagen"
fi
if ! npm run build; then
error "Asset Build fehlgeschlagen"
fi
success "Assets erfolgreich gebaut"
}
# Git Tag für Deployment erstellen
create_deployment_tag() {
log "Erstelle Deployment-Tag..."
TIMESTAMP=$(date +"%Y%m%d-%H%M%S")
COMMIT_HASH=$(git rev-parse --short HEAD)
DEPLOY_TAG="deploy-${TIMESTAMP}-${COMMIT_HASH}"
git tag -a "$DEPLOY_TAG" -m "Deployment $(date): $(git log -1 --pretty=%B | head -n1)"
# Push zu Gitea
log "Push zu Gitea..."
git push origin main
git push origin "$DEPLOY_TAG"
echo "$DEPLOY_TAG" > .deploy-tag
success "Deployment-Tag erstellt: $DEPLOY_TAG"
}
# Server-Deployment ausführen
deploy_to_server() {
local DEPLOY_TAG="$1"
log "Deploye zu Server mit Tag: $DEPLOY_TAG"
# Deployment-Script auf Server übertragen und ausführen
scp $SSH_OPTS ./scripts/server-deploy.sh "$SERVER_USER@$SERVER_IP:/tmp/server-deploy.sh"
ssh $SSH_OPTS "$SERVER_USER@$SERVER_IP" "chmod +x /tmp/server-deploy.sh && /tmp/server-deploy.sh '$DEPLOY_TAG' '$REMOTE_PATH'"
if [[ $? -eq 0 ]]; then
success "Server-Deployment erfolgreich"
else
error "Server-Deployment fehlgeschlagen"
fi
}
# Post-Deployment Validierung
validate_deployment() {
log "Validiere Deployment..."
# Framework Health Check
if ssh $SSH_OPTS "$SERVER_USER@$SERVER_IP" "cd $REMOTE_PATH && php console.php health:check"; then
success "Framework Health Check erfolgreich"
else
error "Framework Health Check fehlgeschlagen"
fi
# MCP Server Test
if ssh $SSH_OPTS "$SERVER_USER@$SERVER_IP" "cd $REMOTE_PATH && timeout 5 php console.php mcp:server --test 2>/dev/null"; then
success "MCP Server funktionsfähig"
else
warning "MCP Server Test fehlgeschlagen (nicht kritisch)"
fi
# HTTP Test
sleep 5 # Warte bis Services hochgefahren sind
if curl -f -s -H "User-Agent: Mozilla/5.0 (Deployment Test)" "https://$SERVER_IP" > /dev/null; then
success "HTTP-Zugriff erfolgreich"
else
warning "HTTP-Test fehlgeschlagen - prüfe SSL/nginx Konfiguration"
fi
}
# Rollback-Funktion
rollback() {
local PREVIOUS_TAG="${1:-$(git describe --tags --abbrev=0 HEAD^)}"
warning "Führe Rollback zu $PREVIOUS_TAG durch..."
ssh $SSH_OPTS "$SERVER_USER@$SERVER_IP" "cd $REMOTE_PATH && git checkout '$PREVIOUS_TAG' && docker compose restart"
if [[ $? -eq 0 ]]; then
success "Rollback zu $PREVIOUS_TAG erfolgreich"
else
error "Rollback fehlgeschlagen - manuelle Intervention erforderlich"
fi
}
# Hauptprogramm
main() {
echo -e "${BLUE}"
echo "🚀 Git-basiertes Framework Deployment"
echo "📦 Custom PHP Framework → Production"
echo "🔗 Gitea-Repository → $SERVER_IP"
echo -e "${RESET}"
# Rollback-Option
if [[ "$1" == "--rollback" ]]; then
rollback "$2"
exit 0
fi
# Deployment-Pipeline
validate_local
run_local_tests
build_assets
create_deployment_tag
DEPLOY_TAG=$(cat .deploy-tag)
deploy_to_server "$DEPLOY_TAG"
validate_deployment
echo -e "${GREEN}"
echo "🎉 Deployment erfolgreich abgeschlossen!"
echo "📋 Tag: $DEPLOY_TAG"
echo "🔗 URL: https://$SERVER_IP"
echo "📊 Logs: ssh $SERVER_USER@$SERVER_IP 'cd $REMOTE_PATH && docker compose logs'"
echo "🔄 Rollback: ./deploy-git.sh --rollback"
echo -e "${RESET}"
}
# Script ausführen
main "$@"