Files
2026-02-07 13:04:04 +01:00

253 lines
6.1 KiB
Bash

#!/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