Files
web-page-backend/scripts/deploy-nas.sh
gahusb aec0fdcd31 fix(packs-lab): tier 디렉토리 제거(평면 구조) + deployer SERVICES에 packs-lab 추가
문제 1: deploy-nas.sh의 SERVICES 화이트리스트에 packs-lab이 빠져 있어
NAS 운영 디렉토리에 소스 sync가 안 됐고 docker compose가 packs-lab을
빌드 못해 컨테이너가 안 떠 있었다.

문제 2: routes.py가 PACK_BASE_DIR/{tier}/{filename} 트리 구조로 저장 →
사용자 요청에 따라 평면 구조(PACK_BASE_DIR/{filename})로 변경. tier 구분은
filename 규칙(prefix 등)으로 admin이 관리.

- scripts/deploy-nas.sh: SERVICES에 packs-lab 추가 (10개 → 11개)
- routes.py: tier 디렉토리 제거 (target = PACK_BASE_DIR / filename, host_path = PACK_HOST_DIR / filename)
- tests: tier 분기 사용처 평면 구조로 보정 (size_mismatch / host_path_check)
- 25/25 passing

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 02:54:25 +09:00

71 lines
2.2 KiB
Bash

#!/bin/bash
set -euo pipefail
# ── 서비스 목록 (한 곳에서만 관리) ──
SERVICES="lotto travel-proxy deployer stock-lab music-lab blog-lab realestate-lab agent-office personal packs-lab nginx scripts"
# 1. 자동 감지: Docker 컨테이너 내부인가?
if [ -d "/repo" ] && [ -d "/runtime" ]; then
echo "Detected Docker Container environment."
SRC="/repo"
DST="/runtime"
else
# 2. Host 환경: .env 로드 시도
if [ -f ".env" ]; then
echo "Loading .env file..."
set -a; source .env; set +a
fi
# 환경변수가 없으면 현재 디렉토리를 SRC로
SRC="${REPO_PATH:-$(pwd)}"
DST="${RUNTIME_PATH:-}"
if [ -z "$DST" ]; then
echo "Error: RUNTIME_PATH is not set. Please create .env file with RUNTIME_PATH defined."
exit 1
fi
fi
echo "Source: $SRC"
echo "Target: $DST"
cd "$SRC"
# 레포에서 운영으로 반영할 항목들만 복사/동기화
RSYNC_OPTS="-rl --delete --no-owner --no-group --exclude .git --exclude __pycache__ --exclude *.pyc --exclude data/"
# 파일 권한 설정값 (numeric UID/GID 사용 — 컨테이너에 username 없을 수 있음)
DEPLOY_UID="${PUID:-1026}"
DEPLOY_GID="${PGID:-100}"
DEPLOY_MODE="755"
for dir in $SERVICES; do
# rsync 전 대상 디렉토리 권한 확보 (Docker root 소유 파일 대응)
if [ -d "$DST/$dir" ]; then
chmod -R u+rwX "$DST/$dir/" 2>/dev/null || true
fi
rsync $RSYNC_OPTS "$SRC/$dir/" "$DST/$dir/" || {
rc=$?
if [ $rc -ne 23 ]; then
echo "rsync failed for $dir with exit code $rc"
exit $rc
fi
}
done
# compose 파일만 동기화 (.env는 절대 동기화하지 않음 — 운영 시크릿 보호)
rsync -rl --no-owner --no-group "$SRC/docker-compose.yml" "$DST/docker-compose.yml" || {
rc=$?
if [ $rc -ne 23 ]; then
echo "rsync failed for docker-compose.yml with exit code $rc"
exit $rc
fi
}
# 파일 권한 설정 — 전체 런타임 디렉토리에 일괄 적용
echo "Setting ownership ${DEPLOY_UID}:${DEPLOY_GID} and mode ${DEPLOY_MODE} on $DST ..."
chown -R "${DEPLOY_UID}:${DEPLOY_GID}" "$DST" 2>/dev/null || true
chmod -R "$DEPLOY_MODE" "$DST" 2>/dev/null || true
echo "SYNC_OK"