#!/bin/bash # SSL-Setup-Script für Stargirlnails Kiel # Erstellt Let's Encrypt-Zertifikate und startet die Produktionsumgebung set -e # Farben für Output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color echo -e "${BLUE}🔧 Stargirlnails Kiel - SSL-Setup${NC}" echo "==================================" # Prüfe ob .env-Datei existiert if [ ! -f .env ]; then echo -e "${RED}❌ .env-Datei nicht gefunden!${NC}" echo "Bitte erstelle eine .env-Datei mit DOMAIN und ADMIN_EMAIL" exit 1 fi # DOMAIN und ADMIN_EMAIL robust aus .env lesen (ohne source) # - ignoriert kommentierte Zeilen # - entfernt umschließende Anführungszeichen DOMAIN=$(grep -E '^[[:space:]]*DOMAIN[[:space:]]*=' .env | tail -n1 | sed -E 's/^[[:space:]]*DOMAIN[[:space:]]*=[[:space:]]*//; s/^"//; s/"$//') ADMIN_EMAIL=$(grep -E '^[[:space:]]*ADMIN_EMAIL[[:space:]]*=' .env | tail -n1 | sed -E 's/^[[:space:]]*ADMIN_EMAIL[[:space:]]*=[[:space:]]*//; s/^"//; s/"$//') # Prüfe erforderliche Variablen if [ -z "$DOMAIN" ]; then echo -e "${RED}❌ DOMAIN nicht in .env definiert!${NC}" exit 1 fi if [ -z "$ADMIN_EMAIL" ]; then echo -e "${RED}❌ ADMIN_EMAIL nicht in .env definiert!${NC}" exit 1 fi echo -e "${GREEN}✅ Domain: $DOMAIN${NC}" echo -e "${GREEN}✅ Admin E-Mail: $ADMIN_EMAIL${NC}" echo "" # Prüfe, ob Docker Root-Rechte braucht und setze optional sudo if docker info >/dev/null 2>&1; then SUDO="" elif command -v sudo >/dev/null 2>&1; then SUDO="sudo " else echo -e "${RED}❌ Keine Berechtigung für Docker und 'sudo' nicht verfügbar.${NC}" echo "Bitte als Root ausführen oder Benutzer in die 'docker'-Gruppe aufnehmen." exit 1 fi # Erkenne Docker Compose-Version (docker-compose vs docker compose) if command -v docker-compose >/dev/null 2>&1; then DOCKER_COMPOSE="${SUDO}docker-compose" elif docker compose version >/dev/null 2>&1; then DOCKER_COMPOSE="${SUDO}docker compose" else echo -e "${RED}❌ Docker Compose nicht gefunden!${NC}" echo "Bitte installiere Docker Compose" exit 1 fi echo -e "${GREEN}✅ Verwende: $DOCKER_COMPOSE${NC}" # Erstelle nginx.conf mit korrekter Domain echo -e "${YELLOW}📝 Erstelle Nginx-Konfiguration...${NC}" sed "s/\${DOMAIN}/$DOMAIN/g" nginx/nginx.conf > nginx/nginx.conf.tmp mv nginx/nginx.conf.tmp nginx/nginx.conf # Erstelle Docker Volumes echo -e "${YELLOW}📦 Erstelle Docker Volumes...${NC}" ${SUDO}docker volume create certbot-certs 2>/dev/null || true ${SUDO}docker volume create certbot-webroot 2>/dev/null || true # Starte temporären HTTP-Server für Domain-Validierung echo -e "${YELLOW}🌐 Starte temporären HTTP-Server...${NC}" ${DOCKER_COMPOSE} -f docker-compose-prod.yml up -d nginx # Warte bis Nginx läuft echo -e "${YELLOW}⏳ Warte auf Nginx...${NC}" sleep 10 # Erstelle SSL-Zertifikat echo -e "${YELLOW}🔐 Erstelle SSL-Zertifikat für $DOMAIN...${NC}" ${DOCKER_COMPOSE} -f docker-compose-prod.yml run --rm certbot certbot certonly \ --webroot \ --webroot-path=/var/www/certbot \ --email $ADMIN_EMAIL \ --agree-tos \ --no-eff-email \ --force-renewal \ -d $DOMAIN if [ $? -eq 0 ]; then echo -e "${GREEN}✅ SSL-Zertifikat erfolgreich erstellt!${NC}" else echo -e "${RED}❌ SSL-Zertifikat-Erstellung fehlgeschlagen!${NC}" echo "Mögliche Ursachen:" echo "- Domain ist nicht erreichbar" echo "- Port 80 ist blockiert" echo "- DNS-Einträge sind nicht korrekt" exit 1 fi # Starte alle Services echo -e "${YELLOW}🚀 Starte alle Services...${NC}" ${DOCKER_COMPOSE} -f docker-compose-prod.yml up -d # Prüfe Status echo -e "${YELLOW}🔍 Prüfe Service-Status...${NC}" sleep 5 if ${DOCKER_COMPOSE} -f docker-compose-prod.yml ps | grep -q "Up"; then echo -e "${GREEN}✅ Alle Services laufen!${NC}" echo "" echo -e "${BLUE}🌐 Deine Anwendung ist jetzt verfügbar unter:${NC}" echo -e "${GREEN} https://$DOMAIN${NC}" echo "" echo -e "${BLUE}📋 Nützliche Befehle:${NC}" echo " Status anzeigen: ${DOCKER_COMPOSE} -f docker-compose-prod.yml ps" echo " Logs anzeigen: ${DOCKER_COMPOSE} -f docker-compose-prod.yml logs -f" echo " Services stoppen: ${DOCKER_COMPOSE} -f docker-compose-prod.yml down" echo " Zertifikat erneuern: ${DOCKER_COMPOSE} -f docker-compose-prod.yml run --rm certbot certbot renew" echo "" echo -e "${YELLOW}⚠️ Wichtig:${NC}" echo " - SSL-Zertifikate werden automatisch alle 12 Stunden erneuert" echo " - Überwache die Logs regelmäßig" echo " - Stelle sicher, dass Port 80 und 443 erreichbar sind" else echo -e "${RED}❌ Einige Services sind nicht gestartet!${NC}" echo "Prüfe die Logs: ${DOCKER_COMPOSE} -f docker-compose-prod.yml logs" exit 1 fi