diff --git a/deploy-production.sh b/deploy-production.sh index cfa2c73..04218f8 100755 --- a/deploy-production.sh +++ b/deploy-production.sh @@ -357,34 +357,67 @@ if ! command -v pm2 &> /dev/null; then exit 1 fi -# Prüfe, ob der Prozess existiert -if ! pm2 describe harheimertc &> /dev/null; then - echo "WARNING: PM2-Prozess 'harheimertc' existiert nicht." - echo "Versuche, den Prozess zu starten..." - pm2 start harheimertc.config.cjs --update-env || pm2 start harheimertc.simple.cjs --update-env || { - echo "ERROR: Konnte PM2-Prozess nicht starten." - echo "Bitte manuell starten: pm2 start harheimertc.config.cjs" - exit 1 - } - echo " ✓ PM2-Prozess gestartet" -else - # Restart mit --update-env, um Umgebungsvariablen zu aktualisieren - echo " Restarting harheimertc with --update-env..." - if pm2 restart harheimertc --update-env; then - echo " ✓ PM2-Prozess neu gestartet" +# Funktion zum Starten/Neustarten einer PM2-Instanz +restart_pm2_instance() { + local instance_name=$1 + if ! pm2 describe "$instance_name" &> /dev/null; then + echo " WARNING: PM2-Prozess '$instance_name' existiert nicht." + echo " Versuche, den Prozess zu starten..." + if pm2 start harheimertc.config.cjs --only "$instance_name" --update-env; then + echo " ✓ PM2-Prozess '$instance_name' gestartet" + return 0 + else + echo " ERROR: Konnte PM2-Prozess '$instance_name' nicht starten." + return 1 + fi else - echo "ERROR: PM2-Restart fehlgeschlagen!" - echo "Bitte manuell prüfen: pm2 logs harheimertc" - exit 1 + echo " Restarting $instance_name with --update-env..." + if pm2 restart "$instance_name" --update-env; then + echo " ✓ PM2-Prozess '$instance_name' neu gestartet" + return 0 + else + echo " ERROR: PM2-Restart für '$instance_name' fehlgeschlagen!" + return 1 + fi fi +} + +# Starte/Neustarte beide Instanzen +INSTANCE_ERRORS=0 + +if ! restart_pm2_instance "harheimertc"; then + INSTANCE_ERRORS=$((INSTANCE_ERRORS + 1)) fi -# Prüfe, ob der Prozess läuft +if ! restart_pm2_instance "harheimertc-3102"; then + INSTANCE_ERRORS=$((INSTANCE_ERRORS + 1)) +fi + +# Prüfe, ob beide Prozesse laufen sleep 2 +echo "" +echo " Checking PM2 instances status..." + if pm2 describe harheimertc | grep -q "online"; then - echo " ✓ PM2-Prozess läuft (online)" + echo " ✓ PM2-Prozess 'harheimertc' läuft (online)" else - echo "WARNING: PM2-Prozess ist nicht online. Prüfe Logs: pm2 logs harheimertc" + echo " WARNING: PM2-Prozess 'harheimertc' ist nicht online. Prüfe Logs: pm2 logs harheimertc" + INSTANCE_ERRORS=$((INSTANCE_ERRORS + 1)) +fi + +if pm2 describe harheimertc-3102 | grep -q "online"; then + echo " ✓ PM2-Prozess 'harheimertc-3102' läuft (online)" +else + echo " WARNING: PM2-Prozess 'harheimertc-3102' ist nicht online. Prüfe Logs: pm2 logs harheimertc-3102" + INSTANCE_ERRORS=$((INSTANCE_ERRORS + 1)) +fi + +if [ "$INSTANCE_ERRORS" -gt 0 ]; then + echo "" + echo "WARNING: Einige PM2-Instanzen haben Probleme. Bitte manuell prüfen:" + echo " pm2 status" + echo " pm2 logs harheimertc" + echo " pm2 logs harheimertc-3102" fi echo "" @@ -392,7 +425,10 @@ echo "=== Deployment completed successfully! ===" echo "The application is now running with the latest code and your production data preserved." echo "" echo "Useful commands:" -echo " pm2 logs harheimertc # View logs" +echo " pm2 logs harheimertc # View logs (Port 3100)" +echo " pm2 logs harheimertc-3102 # View logs (Port 3102)" echo " pm2 status # View status" -echo " pm2 restart harheimertc # Restart manually" +echo " pm2 restart harheimertc # Restart instance on port 3100" +echo " pm2 restart harheimertc-3102 # Restart instance on port 3102" +echo " pm2 restart all # Restart all instances" diff --git a/harheimertc.config.cjs b/harheimertc.config.cjs index 71b7b99..8b723bf 100644 --- a/harheimertc.config.cjs +++ b/harheimertc.config.cjs @@ -6,49 +6,72 @@ try { // If dotenv isn't available or .env missing, continue (process.env may be set elsewhere) } -module.exports = { - apps: [{ - name: 'harheimertc', - // Nuxt 4 production build: direkt den Node-Server starten (kein "preview mode") - script: 'node', - args: '.output/server/index.mjs', - cwd: '/var/www/harheimertc', - instances: 1, - autorestart: true, - watch: false, - max_memory_restart: '1G', - env: { - NODE_ENV: 'production', - PORT: 3100, - // Secrets/Config (loaded from .env above, if present) - ENCRYPTION_KEY: process.env.ENCRYPTION_KEY, - JWT_SECRET: process.env.JWT_SECRET, - SMTP_HOST: process.env.SMTP_HOST, - SMTP_PORT: process.env.SMTP_PORT, - SMTP_USER: process.env.SMTP_USER, - SMTP_PASS: process.env.SMTP_PASS, - SMTP_FROM: process.env.SMTP_FROM, - SMTP_ADMIN: process.env.SMTP_ADMIN, - NUXT_PUBLIC_BASE_URL: process.env.NUXT_PUBLIC_BASE_URL, - COOKIE_SECURE: process.env.COOKIE_SECURE, - COOKIE_SAMESITE: process.env.COOKIE_SAMESITE, - CSP_ENABLED: process.env.CSP_ENABLED, - CSP_REPORT_ONLY: process.env.CSP_REPORT_ONLY, - CSP_VALUE: process.env.CSP_VALUE, - HIBP_ENABLED: process.env.HIBP_ENABLED, - HIBP_USER_AGENT: process.env.HIBP_USER_AGENT, - HIBP_TIMEOUT_MS: process.env.HIBP_TIMEOUT_MS, - HIBP_CACHE_TTL_MS: process.env.HIBP_CACHE_TTL_MS, - HIBP_FAIL_CLOSED: process.env.HIBP_FAIL_CLOSED, - AUDIT_LOG_ENABLED: process.env.AUDIT_LOG_ENABLED, - WEBAUTHN_ORIGIN: process.env.WEBAUTHN_ORIGIN, - WEBAUTHN_RP_ID: process.env.WEBAUTHN_RP_ID, - WEBAUTHN_RP_NAME: process.env.WEBAUTHN_RP_NAME, - WEBAUTHN_REQUIRE_UV: process.env.WEBAUTHN_REQUIRE_UV - }, - error_file: '/var/log/pm2/harheimertc-error.log', - out_file: '/var/log/pm2/harheimertc-out.log', - log_file: '/var/log/pm2/harheimertc-combined.log', - time: true - }] +// Helper function to create env object +function createEnv(port) { + return { + NODE_ENV: 'production', + PORT: port, + // Secrets/Config (loaded from .env above, if present) + ENCRYPTION_KEY: process.env.ENCRYPTION_KEY, + JWT_SECRET: process.env.JWT_SECRET, + SMTP_HOST: process.env.SMTP_HOST, + SMTP_PORT: process.env.SMTP_PORT, + SMTP_USER: process.env.SMTP_USER, + SMTP_PASS: process.env.SMTP_PASS, + SMTP_FROM: process.env.SMTP_FROM, + SMTP_ADMIN: process.env.SMTP_ADMIN, + NUXT_PUBLIC_BASE_URL: process.env.NUXT_PUBLIC_BASE_URL, + COOKIE_SECURE: process.env.COOKIE_SECURE, + COOKIE_SAMESITE: process.env.COOKIE_SAMESITE, + CSP_ENABLED: process.env.CSP_ENABLED, + CSP_REPORT_ONLY: process.env.CSP_REPORT_ONLY, + CSP_VALUE: process.env.CSP_VALUE, + HIBP_ENABLED: process.env.HIBP_ENABLED, + HIBP_USER_AGENT: process.env.HIBP_USER_AGENT, + HIBP_TIMEOUT_MS: process.env.HIBP_TIMEOUT_MS, + HIBP_CACHE_TTL_MS: process.env.HIBP_CACHE_TTL_MS, + HIBP_FAIL_CLOSED: process.env.HIBP_FAIL_CLOSED, + AUDIT_LOG_ENABLED: process.env.AUDIT_LOG_ENABLED, + WEBAUTHN_ORIGIN: process.env.WEBAUTHN_ORIGIN, + WEBAUTHN_RP_ID: process.env.WEBAUTHN_RP_ID, + WEBAUTHN_RP_NAME: process.env.WEBAUTHN_RP_NAME, + WEBAUTHN_REQUIRE_UV: process.env.WEBAUTHN_REQUIRE_UV + } +} + +module.exports = { + apps: [ + { + name: 'harheimertc', + // Nuxt 4 production build: direkt den Node-Server starten (kein "preview mode") + script: 'node', + args: '.output/server/index.mjs', + cwd: '/var/www/harheimertc', + instances: 1, + autorestart: true, + watch: false, + max_memory_restart: '1G', + env: createEnv(3100), + error_file: '/var/log/pm2/harheimertc-error.log', + out_file: '/var/log/pm2/harheimertc-out.log', + log_file: '/var/log/pm2/harheimertc-combined.log', + time: true + }, + { + name: 'harheimertc-3102', + // Zweite Instanz auf Port 3102 + script: 'node', + args: '.output/server/index.mjs', + cwd: '/var/www/harheimertc', + instances: 1, + autorestart: true, + watch: false, + max_memory_restart: '1G', + env: createEnv(3102), + error_file: '/var/log/pm2/harheimertc-3102-error.log', + out_file: '/var/log/pm2/harheimertc-3102-out.log', + log_file: '/var/log/pm2/harheimertc-3102-combined.log', + time: true + } + ] }