#!/usr/bin/env bash # 서버 변경과 꺼진 admin을 보존한다. 렌더러 배포도 기존 사이트를 재굽지 않는다. set -euo pipefail cd "$(dirname "$0")" PULL=1 ONLY=0 TARGETS=() for arg in "$@"; do case "$arg" in --no-pull) PULL=0 ;; --only) ONLY=1 ;; -h|--help) echo "사용법: ./deploy.sh [--no-pull] [--only] [서비스...]"; exit 0 ;; -*) echo "모르는 옵션: $arg" >&2; exit 2 ;; *) TARGETS+=("${arg#o2o-web4ai-}") ;; esac done if [ "$PULL" = 1 ]; then git diff --quiet && git diff --cached --quiet || { echo "서버 변경을 먼저 정리하세요" >&2; exit 1; } git pull --ff-only origin "${DEPLOY_BRANCH:-main}" fi [ ${#TARGETS[@]} -gt 0 ] || TARGETS=(solution-backend solution-worker solution-site) RUNNING=$(docker compose ps --services --status running) if [ "$ONLY" = 0 ]; then case " ${TARGETS[*]} " in *" solution-backend "*|*" solution-worker "*) TARGETS+=(solution-backend solution-worker) if grep -qx admin-backend <<<"$RUNNING"; then TARGETS+=(admin-backend); fi ;; esac fi SERVICES=() for target in "${TARGETS[@]}"; do case " ${SERVICES[*]-} " in *" $target "*) ;; *) SERVICES+=("$target");; esac done # site의 렌더러도 worker 이미지에 들어간다. case " ${SERVICES[*]} " in *" solution-site "*) case " ${SERVICES[*]} " in *" solution-worker "*) ;; *) SERVICES+=(solution-worker);; esac ;; esac docker compose build "${SERVICES[@]}" docker compose up -d --no-deps --force-recreate "${SERVICES[@]}" docker compose ps