51 lines
1.3 KiB
Bash
Executable File
51 lines
1.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
if [[ $# -lt 2 ]]; then
|
|
echo "Usage: $0 <host> <user> [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}"
|