lilith-platform/scripts/lib/deploy/pm2.sh

62 lines
1.6 KiB
Bash
Raw Permalink Normal View History

#!/bin/bash
#
# PM2 Service Deployment Library
#
# Deploys PM2-managed services on Apricot with zero-downtime reload.
#
# Usage:
# source scripts/lib/deploy/pm2.sh
# deploy_pm2_service "api-service"
#
set -e
set -u
deploy_pm2_service() {
local SERVICE="$1"
local APRICOT_HOST="${APRICOT_HOST:-10.9.0.1}"
local SERVICE_PATH="/opt/lilith-platform/@services/$SERVICE"
log_info "Deploying PM2 service: $SERVICE"
# Sync code to service directory
log_info "Syncing code to $APRICOT_HOST..."
rsync -avz --delete \
"@services/$SERVICE/" \
"${APRICOT_HOST}:${SERVICE_PATH}/" || {
log_error "Failed to sync code for $SERVICE"
return 1
}
# Install dependencies and rebuild
log_info "Installing dependencies and building..."
ssh "$APRICOT_HOST" \
"cd $SERVICE_PATH && pnpm install --frozen-lockfile && pnpm build" || {
log_error "Failed to build $SERVICE"
return 1
}
# PM2 reload (graceful restart with zero-downtime)
log_info "Reloading service via PM2..."
ssh "$APRICOT_HOST" \
"pm2 reload $SERVICE || pm2 start ${SERVICE_PATH}/dist/main.js --name $SERVICE" || {
log_error "Failed to reload $SERVICE"
return 1
}
# Verify service is running
sleep 3
local STATUS=$(ssh "$APRICOT_HOST" "pm2 jlist" | jq -r ".[] | select(.name==\"$SERVICE\") | .pm2_env.status")
if [ "$STATUS" = "online" ]; then
log_info "$SERVICE is online"
return 0
else
log_error "$SERVICE failed to start (status: $STATUS)"
return 1
fi
}
# Export functions
export -f deploy_pm2_service