#!/usr/bin/env bash set -euo pipefail PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$PROJECT_ROOT" resolve_default_branch() { local current current="$(git branch --show-current 2>/dev/null || true)" if [[ -n "$current" ]]; then echo "$current" return fi local remote_head remote_head="$(git symbolic-ref --short refs/remotes/origin/HEAD 2>/dev/null || true)" if [[ -n "$remote_head" ]]; then echo "${remote_head#origin/}" return fi echo "main" } TARGET_BRANCH="${1:-$(resolve_default_branch)}" echo "==> Deploy directory: $PROJECT_ROOT" echo "==> Target branch: $TARGET_BRANCH" if [[ -n "$(git status --porcelain)" ]]; then STASH_NAME="auto-deploy-$(date +%Y%m%d-%H%M%S)" echo "==> Working tree is not clean, auto stashing: $STASH_NAME" git stash push -u -m "$STASH_NAME" >/dev/null fi echo "==> Fetching remote updates..." git fetch --all --prune echo "==> Checking out branch: $TARGET_BRANCH" git checkout "$TARGET_BRANCH" echo "==> Pulling latest code from origin/$TARGET_BRANCH" git pull --ff-only origin "$TARGET_BRANCH" if [[ ! -f ".env" && -f ".env.example" ]]; then cp ".env.example" ".env" echo "==> Created .env from .env.example" fi if docker compose version >/dev/null 2>&1; then COMPOSE_CMD="docker compose" elif command -v docker-compose >/dev/null 2>&1; then COMPOSE_CMD="docker-compose" else COMPOSE_CMD="" fi if [[ -n "$COMPOSE_CMD" ]]; then echo "==> Restarting service with $COMPOSE_CMD" $COMPOSE_CMD down $COMPOSE_CMD up -d --build echo "==> Deployment finished. Service: http://localhost:18000" else echo "==> Docker Compose not found, fallback to ./start.sh" chmod +x ./start.sh ./start.sh fi