Enhance deployment script with PM2 process checks and error handling
Some checks failed
Code Analysis (JS/Vue) / analyze (push) Failing after 49s

Update deploy-production.sh to include checks for PM2 installation and process existence before restarting. Implement error messages for failed starts and restarts, improving robustness and user guidance during deployment. Additionally, add useful commands for managing the PM2 process post-deployment.
This commit is contained in:
Torsten Schulz (local)
2026-01-08 11:24:38 +01:00
parent 34968742f0
commit 0deddeca51
5 changed files with 115 additions and 18 deletions

View File

@@ -311,9 +311,50 @@ echo "7. Keeping backups in $BACKUP_ROOT (no git stash used)."
# 8. Restart PM2
echo ""
echo "8. Restarting PM2..."
pm2 restart harheimertc
# Prüfe, ob PM2 installiert ist
if ! command -v pm2 &> /dev/null; then
echo "ERROR: PM2 ist nicht installiert oder nicht im PATH!"
echo "Bitte installieren Sie PM2: npm install -g pm2"
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 || pm2 start harheimertc.simple.cjs || {
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"
else
echo "ERROR: PM2-Restart fehlgeschlagen!"
echo "Bitte manuell prüfen: pm2 logs harheimertc"
exit 1
fi
fi
# Prüfe, ob der Prozess läuft
sleep 2
if pm2 describe harheimertc | grep -q "online"; then
echo " ✓ PM2-Prozess läuft (online)"
else
echo "WARNING: PM2-Prozess ist nicht online. Prüfe Logs: pm2 logs harheimertc"
fi
echo ""
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 status # View status"
echo " pm2 restart harheimertc # Restart manually"

View File

@@ -0,0 +1,32 @@
import { getWebAuthnConfig } from '../../utils/webauthn-config.js'
export default defineEventHandler(async (event) => {
const requestOrigin = getHeader(event, 'origin')
const { origin: webauthnOrigin } = getWebAuthnConfig()
console.log('[DEBUG] OPTIONS preflight request received', {
origin: requestOrigin,
webauthnOrigin,
timestamp: new Date().toISOString()
})
// CORS-Header für Cross-Device Authentication
const allowedOrigin = requestOrigin || webauthnOrigin
if (allowedOrigin) {
setHeader(event, 'Access-Control-Allow-Origin', allowedOrigin)
setHeader(event, 'Access-Control-Allow-Credentials', 'true')
setHeader(event, 'Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
setHeader(event, 'Access-Control-Allow-Headers', 'Content-Type, Authorization, Origin, X-Requested-With')
setHeader(event, 'Access-Control-Max-Age', '86400') // 24 Stunden Cache für Preflight
console.log('[DEBUG] CORS headers set for OPTIONS', {
origin: allowedOrigin,
requestOrigin,
webauthnOrigin
})
}
// OPTIONS Preflight-Request: 204 No Content
setResponseStatus(event, 204)
return null
})

View File

@@ -126,6 +126,7 @@ export default defineEventHandler(async (event) => {
// CORS-Header für Cross-Device Authentication
// WICHTIG: Für Cross-Device muss CORS korrekt konfiguriert sein
// OPTIONS-Requests werden von .options.js behandelt
const allowedOrigin = requestOrigin || webauthnOrigin
if (allowedOrigin) {
@@ -134,21 +135,13 @@ export default defineEventHandler(async (event) => {
setHeader(event, 'Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
setHeader(event, 'Access-Control-Allow-Headers', 'Content-Type, Authorization, Origin, X-Requested-With')
setHeader(event, 'Access-Control-Max-Age', '86400') // 24 Stunden Cache für Preflight
console.log('[DEBUG] CORS headers set', {
console.log('[DEBUG] CORS headers set for POST', {
origin: allowedOrigin,
requestOrigin,
webauthnOrigin,
method: getMethod(event)
webauthnOrigin
})
}
// OPTIONS Preflight-Request für Cross-Device
if (getMethod(event) === 'OPTIONS') {
console.log('[DEBUG] OPTIONS preflight request, returning 204')
setResponseStatus(event, 204)
return null
}
// Stelle sicher, dass die Options korrekt serialisiert werden
const serializedOptions = {
...options,

View File

@@ -0,0 +1,32 @@
import { getWebAuthnConfig } from '../../utils/webauthn-config.js'
export default defineEventHandler(async (event) => {
const requestOrigin = getHeader(event, 'origin')
const { origin: webauthnOrigin } = getWebAuthnConfig()
console.log('[DEBUG] OPTIONS preflight request received (register-passkey)', {
origin: requestOrigin,
webauthnOrigin,
timestamp: new Date().toISOString()
})
// CORS-Header für Cross-Device Authentication
const allowedOrigin = requestOrigin || webauthnOrigin
if (allowedOrigin) {
setHeader(event, 'Access-Control-Allow-Origin', allowedOrigin)
setHeader(event, 'Access-Control-Allow-Credentials', 'true')
setHeader(event, 'Access-Control-Allow-Methods', 'POST, OPTIONS')
setHeader(event, 'Access-Control-Allow-Headers', 'Content-Type, Authorization, Origin, X-Requested-With')
setHeader(event, 'Access-Control-Max-Age', '86400') // 24 Stunden Cache für Preflight
console.log('[DEBUG] CORS headers set for OPTIONS', {
origin: allowedOrigin,
requestOrigin,
webauthnOrigin
})
}
// OPTIONS Preflight-Request: 204 No Content
setResponseStatus(event, 204)
return null
})

View File

@@ -20,19 +20,18 @@ export default defineEventHandler(async (event) => {
})
// CORS-Header für Cross-Device Authentication
// OPTIONS-Requests werden von .options.js behandelt
const allowedOrigin = requestOrigin || webauthnOrigin
if (allowedOrigin) {
setHeader(event, 'Access-Control-Allow-Origin', allowedOrigin)
setHeader(event, 'Access-Control-Allow-Credentials', 'true')
setHeader(event, 'Access-Control-Allow-Methods', 'POST, OPTIONS')
setHeader(event, 'Access-Control-Allow-Headers', 'Content-Type, Authorization, Origin, X-Requested-With')
}
// OPTIONS Preflight-Request
if (getMethod(event) === 'OPTIONS') {
console.log('[DEBUG] OPTIONS preflight request, returning 204')
setResponseStatus(event, 204)
return null
console.log('[DEBUG] CORS headers set for POST', {
origin: allowedOrigin,
requestOrigin,
webauthnOrigin
})
}
const body = await readBody(event)