setup Datei erstellt für andere Kunden

This commit is contained in:
cay 2026-03-28 09:58:03 +00:00
parent 9dc8f554b9
commit 98e80beacd

210
setup-kunde.sh Normal file
View File

@ -0,0 +1,210 @@
#!/bin/bash
# ============================================
# PlusFit24 Neuen Kunden einrichten
# Verwendung: ./setup-kunde.sh <kundenname>
# Beispiel: ./setup-kunde.sh fitnessstudio-berlin
# ============================================
set -e
# ---- Parameter prüfen ----
if [ -z "$1" ]; then
echo "❌ Verwendung: ./setup-kunde.sh <kundenname>"
echo " Beispiel: ./setup-kunde.sh fitnessstudio-berlin"
exit 1
fi
KUNDE=$1
APP_DIR="/opt/apps/$KUNDE"
DB_NAME=$(echo $KUNDE | tr '-' '_' | tr '.' '_')
SERVICE_NAME=$KUNDE
# ---- Nächsten freien Port finden ----
START_PORT=3100
PORT=$START_PORT
echo "🔍 Suche freien Port ab $START_PORT..."
while true; do
# Prüfen ob Port in einer .env Datei schon verwendet wird
PORT_IN_USE=$(grep -r "^PORT=$PORT$" /opt/apps/*/env 2>/dev/null || \
grep -r "^PORT=$PORT$" /opt/apps/*/.env 2>/dev/null || true)
# Prüfen ob Port wirklich offen ist
if [ -z "$PORT_IN_USE" ] && ! ss -tlnp | grep -q ":$PORT "; then
echo "✅ Freier Port gefunden: $PORT"
break
fi
PORT=$((PORT + 1))
if [ $PORT -gt 3200 ]; then
echo "❌ Kein freier Port zwischen 3100 und 3200 gefunden!"
exit 1
fi
done
echo ""
echo "================================================"
echo " PlusFit24 Kunde einrichten"
echo " Kunde: $KUNDE"
echo " Port: $PORT (automatisch gewählt)"
echo " Ordner: $APP_DIR"
echo " DB: $DB_NAME"
echo "================================================"
echo ""
# ---- Prüfen ob Kunde bereits existiert ----
if [ -d "$APP_DIR" ]; then
echo "❌ Ordner $APP_DIR existiert bereits!"
exit 1
fi
# ---- Zugangsdaten abfragen ----
read -p "DB Root Passwort (MariaDB): " DB_ROOT_PW
read -p "DB User Passwort (wird neu erstellt): " DB_USER_PW
read -p "Admin Benutzername: " ADMIN_USER
read -p "Admin Passwort: " ADMIN_PW
read -p "E-Mail Absender (Ionos): " MAIL_USER
read -p "E-Mail Passwort: " MAIL_PW
read -p "Domain (z.B. kunde.software-joksch.com): " DOMAIN
read -p "Studio-Name (für E-Mails): " STUDIO_NAME
echo ""
echo "▶ Starte Einrichtung für '$KUNDE' auf Port $PORT..."
echo ""
# ---- 1. App-Ordner kopieren ----
echo "[1/7] 📁 Kopiere App-Dateien..."
cp -r /opt/apps/Vertragsverwaltung_Plusfit24 $APP_DIR
rm -f $APP_DIR/.env
rm -f $APP_DIR/setup-kunde.sh
# ---- 2. Datenbank erstellen ----
echo "[2/7] 🗄️ Erstelle Datenbank und User..."
mysql -h 85.215.63.122 -u root -p"$DB_ROOT_PW" << SQL
CREATE DATABASE IF NOT EXISTS \`$DB_NAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS '${DB_NAME}'@'192.168.0.163' IDENTIFIED BY '${DB_USER_PW}';
GRANT ALL PRIVILEGES ON \`${DB_NAME}\`.* TO '${DB_NAME}'@'192.168.0.163';
FLUSH PRIVILEGES;
SQL
echo "[3/7] 📋 Erstelle Tabellen..."
mysql -h 85.215.63.122 -u root -p"$DB_ROOT_PW" $DB_NAME < $APP_DIR/database/schema.sql
for f in billing_migration finance_migration nfc_migration renewal_migration \
agreed_price_migration startpackage_migration confirmation_migration; do
mysql -h 85.215.63.122 -u root -p"$DB_ROOT_PW" $DB_NAME < $APP_DIR/database/${f}.sql 2>/dev/null || true
done
# ---- 3. .env erstellen ----
echo "[4/7] ⚙️ Erstelle Konfiguration..."
SESSION_SECRET=$(node -e "console.log(require('crypto').randomBytes(48).toString('hex'))")
cat > $APP_DIR/.env << ENV
# Datenbank
DB_HOST=85.215.63.122
DB_PORT=3306
DB_USER=${DB_NAME}
DB_PASSWORD=${DB_USER_PW}
DB_NAME=${DB_NAME}
# Session
SESSION_SECRET=${SESSION_SECRET}
# Admin
ADMIN_USER=${ADMIN_USER}
ADMIN_PASSWORD=${ADMIN_PW}
# App
PORT=${PORT}
APP_URL=https://${DOMAIN}
# E-Mail (Ionos)
MAIL_HOST=smtp.ionos.de
MAIL_PORT=587
MAIL_SECURE=false
MAIL_USER=${MAIL_USER}
MAIL_PASSWORD=${MAIL_PW}
MAIL_FROM=${STUDIO_NAME} <${MAIL_USER}>
ENV
# ---- 4. npm install ----
echo "[5/7] 📦 Installiere Abhängigkeiten..."
cd $APP_DIR && npm install --silent
# ---- 5. Systemd Service erstellen ----
echo "[6/7] 🔧 Erstelle und starte Service..."
cat > /etc/systemd/system/${SERVICE_NAME}.service << SERVICE
[Unit]
Description=${STUDIO_NAME} PlusFit24 App
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=${APP_DIR}
ExecStart=/usr/bin/node ${APP_DIR}/app.js
Restart=always
RestartSec=10
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
SERVICE
systemctl daemon-reload
systemctl enable $SERVICE_NAME
systemctl start $SERVICE_NAME
# ---- 6. NGINX Config erstellen ----
echo "[7/7] 🌐 Erstelle NGINX Konfiguration..."
NGINX_CONF="/etc/nginx/sites-available/$DOMAIN"
cat > $NGINX_CONF << NGINX
server {
listen 443 ssl http2;
server_name ${DOMAIN};
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/software-joksch.com.key;
client_max_body_size 10M;
location / {
proxy_pass http://192.168.0.163:${PORT};
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
proxy_read_timeout 3600;
}
}
NGINX
# ---- 7. Ergebnis ----
sleep 3
echo ""
if systemctl is-active --quiet $SERVICE_NAME; then
STATUS="✅ LÄUFT"
else
STATUS="❌ FEHLER"
fi
echo "================================================"
echo " $STATUS $STUDIO_NAME"
echo "================================================"
echo " 🌐 URL: https://$DOMAIN"
echo " 🔑 Admin: https://$DOMAIN/admin/login"
echo " 👤 Benutzer: $ADMIN_USER"
echo " 🔌 Port: $PORT"
echo " 🗄️ Datenbank: $DB_NAME"
echo " 📁 Ordner: $APP_DIR"
echo "================================================"
echo ""
echo "⚠️ Noch auf dem NGINX-Server ausführen:"
echo " ssh user@192.168.0.157"
echo " ln -s $NGINX_CONF /etc/nginx/sites-enabled/"
echo " nginx -t && systemctl reload nginx"
echo ""
# Port-Übersicht speichern
echo "$PORT $KUNDE $DOMAIN" >> /opt/apps/ports.txt
echo "📋 Port-Übersicht gespeichert in /opt/apps/ports.txt"