feat: payload cms

This commit is contained in:
2026-02-26 01:32:22 +01:00
parent 1963a93123
commit 7d65237ee9
67 changed files with 3179 additions and 760 deletions

View File

@@ -11,6 +11,28 @@
# ────────────────────────────────────────────────────────────────────────────
set -euo pipefail
SYNC_SUCCESS="false"
LOCAL_BACKUP_FILE=""
REMOTE_BACKUP_FILE=""
cleanup_on_exit() {
local exit_code=$?
if [ "$SYNC_SUCCESS" != "true" ] && [ $exit_code -ne 0 ]; then
echo ""
echo "❌ Sync aborted or failed! (Exit code: $exit_code)"
if [ "${DIRECTION:-}" = "push" ] && [ -n "${REMOTE_BACKUP_FILE:-}" ]; then
echo "🔄 Rolling back $TARGET database..."
ssh "$SSH_HOST" "gunzip -c $REMOTE_BACKUP_FILE | docker exec -i $REMOTE_DB_CONTAINER psql -U $REMOTE_DB_USER -d $REMOTE_DB_NAME --quiet" || echo "⚠️ Rollback failed"
echo "✅ Rollback complete."
elif [ "${DIRECTION:-}" = "pull" ] && [ -n "${LOCAL_BACKUP_FILE:-}" ]; then
echo "🔄 Rolling back local database..."
gunzip -c "$LOCAL_BACKUP_FILE" | docker exec -i "$LOCAL_DB_CONTAINER" psql -U "$LOCAL_DB_USER" -d "$LOCAL_DB_NAME" --quiet || echo "⚠️ Rollback failed"
echo "✅ Rollback complete."
fi
fi
}
trap 'cleanup_on_exit' EXIT
# Load environment variables
if [ -f .env ]; then
set -a; source .env; set +a
@@ -48,6 +70,13 @@ resolve_target() {
REMOTE_MEDIA_VOLUME="/var/lib/docker/volumes/klz-testing_klz_media_data/_data"
REMOTE_SITE_DIR="/home/deploy/sites/testing.klz-cables.com"
;;
staging)
REMOTE_PROJECT="klz-staging"
REMOTE_DB_CONTAINER="klz-staging-klz-db-1"
REMOTE_APP_CONTAINER="klz-staging-klz-app-1"
REMOTE_MEDIA_VOLUME="/var/lib/docker/volumes/klz-staging_klz_media_data/_data"
REMOTE_SITE_DIR="/home/deploy/sites/staging.klz-cables.com"
;;
prod|production)
REMOTE_PROJECT="klz-cablescom"
REMOTE_DB_CONTAINER="klz-cablescom-klz-db-1"
@@ -57,7 +86,7 @@ resolve_target() {
;;
*)
echo "❌ Unknown target: $TARGET"
echo " Valid targets: testing, prod"
echo " Valid targets: testing, staging, prod"
exit 1
;;
esac
@@ -118,6 +147,7 @@ backup_local_db() {
echo "📦 Creating safety backup of local DB → $file"
docker exec "$LOCAL_DB_CONTAINER" pg_dump -U "$LOCAL_DB_USER" -d "$LOCAL_DB_NAME" --clean --if-exists | gzip > "$file"
echo "✅ Backup: $file ($(du -h "$file" | cut -f1))"
LOCAL_BACKUP_FILE="$file"
}
backup_remote_db() {
@@ -125,6 +155,7 @@ backup_remote_db() {
echo "📦 Creating safety backup of $TARGET DB → $SSH_HOST:$file"
ssh "$SSH_HOST" "docker exec $REMOTE_DB_CONTAINER pg_dump -U $REMOTE_DB_USER -d $REMOTE_DB_NAME --clean --if-exists | gzip > $file"
echo "✅ Remote backup: $file"
REMOTE_BACKUP_FILE="$file"
}
# ── PUSH: local → remote ──────────────────────────────────────────────────
@@ -177,6 +208,7 @@ do_push() {
rm -f "$dump"
ssh "$SSH_HOST" "rm -f /tmp/payload_push.sql.gz"
SYNC_SUCCESS="true"
echo ""
echo "✅ Push to $TARGET complete!"
}
@@ -214,12 +246,13 @@ do_pull() {
# 4. Sync media
echo "🖼️ Syncing media files..."
mkdir -p "$LOCAL_MEDIA_DIR"
rsync -az --delete --info=progress2 "$SSH_HOST:$REMOTE_MEDIA_VOLUME/" "$LOCAL_MEDIA_DIR/"
rsync -az --delete --progress "$SSH_HOST:$REMOTE_MEDIA_VOLUME/" "$LOCAL_MEDIA_DIR/"
# Cleanup
rm -f "/tmp/payload_pull.sql.gz"
ssh "$SSH_HOST" "rm -f /tmp/payload_pull.sql.gz"
SYNC_SUCCESS="true"
echo ""
echo "✅ Pull from $TARGET complete! Restart dev server to see changes."
}
@@ -230,8 +263,10 @@ if [ -z "$DIRECTION" ] || [ -z "$TARGET" ]; then
echo ""
echo "Usage:"
echo " pnpm cms:push:testing Push local DB + media → testing"
echo " pnpm cms:push:staging Push local DB + media → staging"
echo " pnpm cms:push:prod Push local DB + media → production"
echo " pnpm cms:pull:testing Pull testing DB + media → local"
echo " pnpm cms:pull:staging Pull staging DB + media → local"
echo " pnpm cms:pull:prod Pull production DB + media → local"
echo ""
echo "Safety: A backup is always created before overwriting."