netgescon-day0/scripts/ops/netgescon-sync-prod-update.sh

123 lines
2.8 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
# Safe sync: development -> production code, plus optional archive transfer.
#
# Example:
# scripts/ops/netgescon-sync-prod-update.sh \
# --src /home/michele/netgescon/netgescon-laravel \
# --dst /var/www/netgescon \
# --archive-src /home/michele/backup-completo \
# --archive-dst /mnt/nas-backup-produzione \
# --post-deploy
SRC_DIR="/home/michele/netgescon/netgescon-laravel"
DST_DIR="/var/www/netgescon"
ARCHIVE_SRC=""
ARCHIVE_DST=""
POST_DEPLOY="no"
DRY_RUN="no"
while [[ $# -gt 0 ]]; do
case "$1" in
--src)
SRC_DIR="$2"
shift 2
;;
--dst)
DST_DIR="$2"
shift 2
;;
--archive-src)
ARCHIVE_SRC="$2"
shift 2
;;
--archive-dst)
ARCHIVE_DST="$2"
shift 2
;;
--post-deploy)
POST_DEPLOY="yes"
shift 1
;;
--dry-run)
DRY_RUN="yes"
shift 1
;;
*)
echo "Unknown option: $1"
echo "Usage: $0 [--src <dir>] [--dst <dir>] [--archive-src <dir>] [--archive-dst <dir>] [--post-deploy] [--dry-run]"
exit 1
;;
esac
done
if [[ ! -d "$SRC_DIR" || ! -f "$SRC_DIR/artisan" ]]; then
echo "Error: source app not valid: $SRC_DIR"
exit 1
fi
if [[ ! -d "$DST_DIR" || ! -f "$DST_DIR/artisan" ]]; then
echo "Error: destination app not valid: $DST_DIR"
exit 1
fi
RSYNC_ARGS=(
-rlvh
--checksum
--no-perms
--no-owner
--no-group
--omit-dir-times
--no-times
--exclude=.git/
--exclude=.env
--exclude=storage/
--exclude=node_modules/
--exclude=vendor/
--exclude=bootstrap/cache/
--exclude=public/build/
)
if [[ "$DRY_RUN" == "yes" ]]; then
RSYNC_ARGS+=(--dry-run)
fi
echo "Syncing app updates: $SRC_DIR -> $DST_DIR"
rsync "${RSYNC_ARGS[@]}" "$SRC_DIR/" "$DST_DIR/"
if [[ -n "$ARCHIVE_SRC" || -n "$ARCHIVE_DST" ]]; then
if [[ -z "$ARCHIVE_SRC" || -z "$ARCHIVE_DST" ]]; then
echo "Error: use both --archive-src and --archive-dst together"
exit 1
fi
if [[ ! -d "$ARCHIVE_SRC" ]]; then
echo "Error: archive source does not exist: $ARCHIVE_SRC"
exit 1
fi
mkdir -p "$ARCHIVE_DST"
echo "Syncing archives (non-destructive): $ARCHIVE_SRC -> $ARCHIVE_DST"
ARCHIVE_ARGS=(-avh --ignore-existing)
if [[ "$DRY_RUN" == "yes" ]]; then
ARCHIVE_ARGS+=(--dry-run)
fi
rsync "${ARCHIVE_ARGS[@]}" "$ARCHIVE_SRC/" "$ARCHIVE_DST/"
fi
if [[ "$POST_DEPLOY" == "yes" && "$DRY_RUN" == "no" ]]; then
echo "Running post-deploy commands in $DST_DIR"
pushd "$DST_DIR" >/dev/null
composer install --no-dev --optimize-autoloader
php artisan optimize:clear
php artisan config:cache || true
php artisan event:cache || true
php artisan view:cache || true
popd >/dev/null
fi
echo "Sync completed."
if [[ "$DRY_RUN" == "yes" ]]; then
echo "Dry-run mode: no file changed."
fi