#!/bin/bash # Skrift Backend - Deployment Script für Server # Dieses Script automatisiert das Deployment auf dem Server set -e # Exit bei Fehler echo "=========================================" echo "Skrift Backend - Deployment Script" echo "=========================================" echo "" # Konfiguration DEPLOY_USER="root" DEPLOY_HOST="" DEPLOY_PATH="/opt/skrift-backend" DOCKER_IMAGE_NAME="skrift-backend" DOCKER_HUB_USER="" # Funktion: Hilfe anzeigen show_help() { echo "Verwendung: ./deploy.sh [OPTION]" echo "" echo "Optionen:" echo " local - Docker Image lokal bauen und testen" echo " push - Image zu Docker Hub pushen" echo " server-scp - Backend per SCP zum Server kopieren" echo " server-deploy - Auf Server deployen (via Docker Hub)" echo " server-ssh - SSH-Verbindung zum Server öffnen" echo " help - Diese Hilfe anzeigen" echo "" echo "Beispiele:" echo " ./deploy.sh local # Lokal testen" echo " ./deploy.sh push # Image hochladen" echo " ./deploy.sh server-deploy # Auf Server deployen" } # Funktion: Konfiguration prüfen check_config() { if [ -z "$DEPLOY_HOST" ]; then echo "ERROR: DEPLOY_HOST ist nicht gesetzt!" echo "Bitte in diesem Script DEPLOY_HOST='dein-server.de' setzen" exit 1 fi if [ "$1" == "push" ] && [ -z "$DOCKER_HUB_USER" ]; then echo "ERROR: DOCKER_HUB_USER ist nicht gesetzt!" echo "Bitte in diesem Script DOCKER_HUB_USER='deinusername' setzen" exit 1 fi } # Funktion: Lokal bauen und testen build_local() { echo "Building Docker Image lokal..." docker build -t $DOCKER_IMAGE_NAME:latest . echo "" echo "Image erfolgreich gebaut!" echo "" echo "Zum Testen:" echo " docker run -p 4000:4000 --env-file .env -v \$(pwd)/fonts:/app/fonts:ro $DOCKER_IMAGE_NAME:latest" echo "" echo "Dann im Browser: http://localhost:4000/health" } # Funktion: Image zu Docker Hub pushen push_dockerhub() { check_config "push" echo "Logging in to Docker Hub..." docker login echo "Tagging image..." docker tag $DOCKER_IMAGE_NAME:latest $DOCKER_HUB_USER/$DOCKER_IMAGE_NAME:latest echo "Pushing to Docker Hub..." docker push $DOCKER_HUB_USER/$DOCKER_IMAGE_NAME:latest echo "" echo "Image erfolgreich gepusht: $DOCKER_HUB_USER/$DOCKER_IMAGE_NAME:latest" } # Funktion: Backend per SCP zum Server kopieren deploy_scp() { check_config echo "Kopiere Backend-Dateien zum Server..." # Temporäres Verzeichnis für saubere Dateien erstellen echo "Erstelle sauberes Deployment-Package..." rm -rf ./deploy-temp mkdir -p ./deploy-temp # Nur notwendige Dateien kopieren rsync -av \ --exclude 'node_modules' \ --exclude 'output' \ --exclude 'cache' \ --exclude '.git' \ --exclude 'deploy-temp' \ --exclude '*.md' \ --exclude 'bruno-tests' \ --exclude 'test-*.js' \ --exclude 'generate-*.js' \ ./ ./deploy-temp/ # Zum Server kopieren echo "Uploading to $DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH..." ssh $DEPLOY_USER@$DEPLOY_HOST "mkdir -p $DEPLOY_PATH" rsync -avz ./deploy-temp/ $DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH/ # Fonts extra kopieren echo "Uploading fonts..." scp ./fonts/*.svg $DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH/fonts/ # Cleanup rm -rf ./deploy-temp echo "" echo "Dateien erfolgreich hochgeladen!" echo "" echo "Nächste Schritte auf dem Server:" echo " ssh $DEPLOY_USER@$DEPLOY_HOST" echo " cd $DEPLOY_PATH" echo " nano .env # .env Datei erstellen!" echo " mkdir -p /var/skrift-output" echo " docker-compose up -d --build" } # Funktion: Auf Server deployen (via Docker Hub) deploy_server() { check_config "push" echo "Deploying to server via Docker Hub..." # SSH Befehle auf Server ausführen ssh $DEPLOY_USER@$DEPLOY_HOST << ENDSSH set -e echo "Creating directories..." mkdir -p $DEPLOY_PATH mkdir -p /var/skrift-output chmod 755 /var/skrift-output cd $DEPLOY_PATH echo "Checking if .env exists..." if [ ! -f .env ]; then echo "ERROR: .env Datei fehlt!" echo "Bitte zuerst .env erstellen mit:" echo " SCRIPTALIZER_LICENSE_KEY=..." echo " SCRIPTALIZER_ERR_FREQUENCY=0" exit 1 fi echo "Checking if docker-compose.yml exists..." if [ ! -f docker-compose.yml ]; then echo "Creating docker-compose.yml..." cat > docker-compose.yml << 'EOF' version: '3.8' services: skrift-backend: image: $DOCKER_HUB_USER/$DOCKER_IMAGE_NAME:latest container_name: skrift-backend restart: unless-stopped ports: - "4000:4000" environment: - NODE_ENV=production - PORT=4000 - SCRIPTALIZER_LICENSE_KEY=\${SCRIPTALIZER_LICENSE_KEY} - SCRIPTALIZER_ERR_FREQUENCY=0 - BATCH_SIZE=30 - CACHE_LIFETIME_HOURS=2 - RATE_LIMIT_PER_MINUTE=2 volumes: - ./fonts:/app/fonts:ro - skrift-cache:/app/cache - /var/skrift-output:/app/output networks: - skrift-network volumes: skrift-cache: driver: local networks: skrift-network: driver: bridge EOF fi echo "Pulling latest image..." docker-compose pull echo "Starting containers..." docker-compose up -d echo "Waiting for container to be healthy..." sleep 5 echo "Checking health..." docker-compose ps echo "" echo "Deployment complete!" echo "Check logs with: docker-compose logs -f" ENDSSH echo "" echo "Deployment auf Server abgeschlossen!" echo "" echo "Health-Check:" echo " curl http://$DEPLOY_HOST:4000/health" } # Funktion: SSH zum Server ssh_server() { check_config echo "Connecting to $DEPLOY_USER@$DEPLOY_HOST..." ssh $DEPLOY_USER@$DEPLOY_HOST } # Main Script case "$1" in local) build_local ;; push) push_dockerhub ;; server-scp) deploy_scp ;; server-deploy) deploy_server ;; server-ssh) ssh_server ;; help|--help|-h|"") show_help ;; *) echo "Unbekannte Option: $1" echo "" show_help exit 1 ;; esac