PMFlow/scripts/deploy_remote_docker.sh

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}"