#!/usr/bin/env bash set -euo pipefail if [[ $# -lt 2 ]]; then echo "Usage: $0 [target_dir]" exit 1 fi HOST="$1" USER="$2" TARGET_DIR="${3:-/opt/pmflow}" PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" SSH_KEY="${SSH_KEY:-}" SKIP_BUILD="${SKIP_BUILD:-0}" ssh_opts=() if [[ -n "$SSH_KEY" ]]; then ssh_opts=(-i "$SSH_KEY") fi rsync_ssh=(ssh) if [[ ${#ssh_opts[@]} -gt 0 ]]; then rsync_ssh+=( "${ssh_opts[@]}" ) fi echo "[1/4] Prepare remote dir" ssh "${ssh_opts[@]}" "${USER}@${HOST}" "mkdir -p '${TARGET_DIR}'" echo "[2/4] Sync project files" rsync -az --delete \ --exclude ".git/" \ --exclude "venv/" \ --exclude "node_modules/" \ --exclude "logs/" \ --exclude ".DS_Store" \ --exclude "__pycache__/" \ -e "${rsync_ssh[*]}" \ "${PROJECT_DIR}/" "${USER}@${HOST}:${TARGET_DIR}/" echo "[3/4] Bootstrap env" ssh "${ssh_opts[@]}" "${USER}@${HOST}" "cd '${TARGET_DIR}' && [ -f .env ] || cp .env.example .env" echo "[4/4] Deploy docker compose" if [[ "$SKIP_BUILD" == "1" ]]; then ssh "${ssh_opts[@]}" "${USER}@${HOST}" "cd '${TARGET_DIR}' && docker compose up -d && docker compose ps" else ssh "${ssh_opts[@]}" "${USER}@${HOST}" "cd '${TARGET_DIR}' && docker compose build && docker compose up -d && docker compose ps" fi echo "[DONE] Remote deploy finished: ${USER}@${HOST}:${TARGET_DIR}"