mirror of
https://github.com/complexcaresolutions/cms.c2sgmbh.git
synced 2026-03-17 16:14:12 +00:00
- Add GitHub Actions workflow for automatic staging deployment on develop branch - Add manual deploy script with --skip-build and --skip-migrations options - Update CLAUDE.md with deployment documentation - Mark staging-deployment TODO as complete Deployment target: pl.c2sgmbh.de (37.24.237.181) Triggers: push to develop, manual workflow_dispatch 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
165 lines
4.4 KiB
Bash
Executable file
165 lines
4.4 KiB
Bash
Executable file
#!/bin/bash
|
|
# =============================================================================
|
|
# Staging Deployment Script
|
|
# =============================================================================
|
|
# Usage: ./scripts/deploy-staging.sh [--skip-build] [--skip-migrations]
|
|
#
|
|
# This script deploys the current develop branch to the staging environment.
|
|
# Run this on the staging server (pl.c2sgmbh.de) or via SSH.
|
|
# =============================================================================
|
|
|
|
set -e
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Configuration
|
|
PROJECT_DIR="/home/payload/payload-cms"
|
|
BRANCH="${DEPLOY_BRANCH:-develop}" # Use env var or default to develop
|
|
LOG_FILE="/home/payload/logs/deploy-staging.log"
|
|
|
|
# Parse arguments
|
|
SKIP_BUILD=false
|
|
SKIP_MIGRATIONS=false
|
|
for arg in "$@"; do
|
|
case $arg in
|
|
--skip-build)
|
|
SKIP_BUILD=true
|
|
shift
|
|
;;
|
|
--skip-migrations)
|
|
SKIP_MIGRATIONS=true
|
|
shift
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Functions
|
|
log() {
|
|
echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1" | tee -a "$LOG_FILE"
|
|
}
|
|
|
|
success() {
|
|
echo -e "${GREEN}[SUCCESS]${NC} $1" | tee -a "$LOG_FILE"
|
|
}
|
|
|
|
warn() {
|
|
echo -e "${YELLOW}[WARNING]${NC} $1" | tee -a "$LOG_FILE"
|
|
}
|
|
|
|
error() {
|
|
echo -e "${RED}[ERROR]${NC} $1" | tee -a "$LOG_FILE"
|
|
exit 1
|
|
}
|
|
|
|
# Ensure log directory exists
|
|
mkdir -p "$(dirname "$LOG_FILE")"
|
|
|
|
echo "=============================================="
|
|
echo " Staging Deployment Script"
|
|
echo " Environment: pl.c2sgmbh.de"
|
|
echo "=============================================="
|
|
echo ""
|
|
|
|
log "Starting staging deployment..."
|
|
log "Branch: $BRANCH"
|
|
log "Skip build: $SKIP_BUILD"
|
|
log "Skip migrations: $SKIP_MIGRATIONS"
|
|
|
|
# Change to project directory
|
|
cd "$PROJECT_DIR" || error "Could not change to project directory: $PROJECT_DIR"
|
|
log "Working directory: $(pwd)"
|
|
|
|
# Check current branch and stash changes
|
|
log "Checking git status..."
|
|
CURRENT_BRANCH=$(git branch --show-current)
|
|
if [ "$CURRENT_BRANCH" != "$BRANCH" ]; then
|
|
warn "Currently on branch '$CURRENT_BRANCH', switching to '$BRANCH'"
|
|
fi
|
|
|
|
# Stash any local changes
|
|
if [ -n "$(git status --porcelain)" ]; then
|
|
warn "Stashing local changes..."
|
|
git stash --include-untracked
|
|
fi
|
|
|
|
# Fetch and reset to origin
|
|
log "Fetching latest code from origin/$BRANCH..."
|
|
git fetch origin "$BRANCH"
|
|
git checkout "$BRANCH"
|
|
git reset --hard "origin/$BRANCH"
|
|
success "Code updated to latest origin/$BRANCH"
|
|
|
|
# Show current commit
|
|
COMMIT_SHA=$(git rev-parse --short HEAD)
|
|
COMMIT_MSG=$(git log -1 --pretty=%s)
|
|
log "Current commit: $COMMIT_SHA - $COMMIT_MSG"
|
|
|
|
# Install dependencies
|
|
log "Installing dependencies..."
|
|
pnpm install --frozen-lockfile
|
|
success "Dependencies installed"
|
|
|
|
# Run migrations (unless skipped)
|
|
if [ "$SKIP_MIGRATIONS" = false ]; then
|
|
log "Running database migrations..."
|
|
pnpm payload migrate || warn "No migrations to run or migration failed"
|
|
else
|
|
warn "Skipping migrations (--skip-migrations flag)"
|
|
fi
|
|
|
|
# Build (unless skipped)
|
|
if [ "$SKIP_BUILD" = false ]; then
|
|
log "Building application..."
|
|
|
|
# Stop PM2 to free memory for build
|
|
pm2 stop payload 2>/dev/null || true
|
|
pm2 stop queue-worker 2>/dev/null || true
|
|
|
|
# Build with memory limit
|
|
NODE_OPTIONS="--max-old-space-size=2048" pnpm build
|
|
success "Build completed"
|
|
else
|
|
warn "Skipping build (--skip-build flag)"
|
|
fi
|
|
|
|
# Restart services
|
|
log "Restarting PM2 services..."
|
|
pm2 restart payload --update-env 2>/dev/null || pm2 start ecosystem.config.cjs --only payload
|
|
pm2 restart queue-worker --update-env 2>/dev/null || pm2 start ecosystem.config.cjs --only queue-worker
|
|
success "Services restarted"
|
|
|
|
# Wait for service to start
|
|
log "Waiting for service to start..."
|
|
sleep 5
|
|
|
|
# Health check
|
|
log "Running health check..."
|
|
HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:3000/admin 2>/dev/null || echo "000")
|
|
if [ "$HTTP_STATUS" -ge 200 ] && [ "$HTTP_STATUS" -lt 400 ]; then
|
|
success "Health check passed (HTTP $HTTP_STATUS)"
|
|
else
|
|
warn "Health check returned HTTP $HTTP_STATUS"
|
|
fi
|
|
|
|
# Show PM2 status
|
|
echo ""
|
|
log "PM2 Status:"
|
|
pm2 status
|
|
|
|
# Summary
|
|
echo ""
|
|
echo "=============================================="
|
|
echo -e "${GREEN} Staging Deployment Complete!${NC}"
|
|
echo "=============================================="
|
|
echo " URL: https://pl.c2sgmbh.de"
|
|
echo " Admin: https://pl.c2sgmbh.de/admin"
|
|
echo " Commit: $COMMIT_SHA"
|
|
echo " Time: $(date)"
|
|
echo "=============================================="
|
|
|
|
log "Deployment finished successfully"
|