#!/usr/bin/env bash # push → Gitea Webhook → 本脚本:仅部署 dev 到本机 Docker Compose set -euo pipefail APP_DIR="${APP_DIR:-/opt/AirShelf}" BRANCH="${BRANCH:-dev}" COMPOSE_FILE="${COMPOSE_FILE:-docker-compose.yml}" ENV_FILE="${ENV_FILE:-core/backend/.env}" LOG_DIR="${LOG_DIR:-/var/log/airshelf}" LOCK_FILE="${LOCK_FILE:-/tmp/airshelf-deploy-dev.lock}" mkdir -p "$LOG_DIR" LOG_FILE="${LOG_DIR}/deploy-dev.log" exec 9>"$LOCK_FILE" if ! flock -n 9; then echo "$(date '+%F %T') another deploy is running, skip" | tee -a "$LOG_FILE" exit 0 fi { echo "======== $(date '+%F %T') deploy start ========" cd "$APP_DIR" if [[ ! -d .git ]]; then echo "ERROR: $APP_DIR is not a git repo. Clone from your Gitea first." exit 1 fi # .env 在仓库里被跟踪,pull 会覆盖服务器上的生产配置;先备份再还原 ENV_BACKUP="" if [[ -f "$ENV_FILE" ]]; then ENV_BACKUP="$(mktemp)" cp -a "$ENV_FILE" "$ENV_BACKUP" echo "backed up $ENV_FILE" fi git fetch --prune origin git checkout "$BRANCH" git reset --hard "origin/$BRANCH" if [[ -n "$ENV_BACKUP" ]]; then cp -a "$ENV_BACKUP" "$ENV_FILE" rm -f "$ENV_BACKUP" echo "restored $ENV_FILE" fi docker compose -f "$COMPOSE_FILE" up -d --build echo "======== $(date '+%F %T') deploy ok ========" } >>"$LOG_FILE" 2>&1