#!/usr/bin/env bash # ProjectSS 배포 — 시놀로지 NAS(Web Station, 정적 웹사이트)로 빌드 결과물을 올린다. # # 구조: # client/dist --(scp over ssh)--> NAS:$REMOTE_DIR --(Web Station nginx)--> 공개 URL # # rsync가 아니라 scp인 이유: 이 NAS의 /usr/bin/rsync는 SSH 전송 모드에서도 # "rsync error: rsync service is no running (code 43)"로 막힌다. DSM의 # 제어판 → 파일 서비스 → rsync 활성화 + 사용자 애플리케이션 권한(rsync) 부여를 # 둘 다 했는데도 동일했다 — 시놀로지 쪽에 rsync-over-ssh용 별도 게이트(아마 # rsync daemon 설정 안의 사용자 화이트리스트)가 더 있는 것으로 보이는데, 이 # 프로젝트 빌드 결과물이 400KB 안팎이라 rsync의 증분 전송 이점이 없어서 원인을 # 더 파고들지 않고 scp(-O, 레거시 exec 프로토콜)로 우회했다. 이 NAS는 SFTP # 서브시스템도 안 열려 있어(-O 없는 최신 scp는 "subsystem request failed") # 반드시 -O가 필요하다. # # 사전 준비(각 1회): # 1) NAS에서 SSH 활성화 (제어판 → 터미널 및 SNMP) # 2) 비밀번호 없이 배포하려면 SSH 키 등록: # ssh-keygen -t ed25519 -C projectss-deploy # 키가 없을 때만 # ssh-copy-id -p 225 kyoung5@192.168.0.6 # 시놀로지는 키 인증이 홈 디렉터리 권한에 민감하다 — ssh-copy-id 직후에도 # 비밀번호를 계속 물으면 NAS에 비밀번호로 한 번 접속해 다음을 확인: # chmod 755 ~ && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys # # 사용법: # ./deploy.sh # 빌드 후 배포 # ./deploy.sh --no-build # 이미 빌드된 dist를 그대로 배포 # ./deploy.sh --dry-run # 실제로 올리지 않고 무엇을 보낼지만 확인 set -euo pipefail # ── 설정 ────────────────────────────────────────────────────────────────── SSH_USER="kyoung5" SSH_HOST="192.168.0.6" SSH_PORT="225" # Web Station 문서 루트가 web/web_games 이므로 그 하위 폴더에 올린다. # 여기를 바꾸면 공개 URL도 같이 바뀐다 (PUBLIC_URL도 함께 수정). REMOTE_DIR="/volume1/web/web_games/projectss" PUBLIC_URL="https://play.mint-grape.duckdns.org/projectss/" # ────────────────────────────────────────────────────────────────────────── cd "$(dirname "$0")" DO_BUILD=1 DRY_RUN=0 for arg in "$@"; do case "$arg" in --no-build) DO_BUILD=0 ;; --dry-run) DRY_RUN=1 ;; *) echo "알 수 없는 옵션: $arg" >&2; exit 1 ;; esac done if [[ $DO_BUILD -eq 1 ]]; then echo "▶ 빌드" (cd client && npm run build) fi if [[ ! -f client/dist/index.html ]]; then echo "✗ client/dist/index.html 이 없다. 먼저 빌드할 것." >&2 exit 1 fi if [[ $DRY_RUN -eq 1 ]]; then echo "▶ (dry-run) 아래 파일들을 ${SSH_USER}@${SSH_HOST}:${REMOTE_DIR} 로 보낼 예정 — 그 전에 원격 폴더를 비운다:" find client/dist -type f | sed 's/^client\/dist/ /' exit 0 fi echo "▶ 배포 → ${SSH_USER}@${SSH_HOST}:${REMOTE_DIR}" # 해시 붙은 옛 asset 파일이 남아 쌓이지 않게, 매번 원격 폴더를 비우고 새로 올린다 # (rsync --delete와 같은 효과). REMOTE_DIR 전용 폴더만 지우므로 다른 경로는 안 건드린다. ssh -p "${SSH_PORT}" "${SSH_USER}@${SSH_HOST}" \ "rm -rf '${REMOTE_DIR}' && mkdir -p '${REMOTE_DIR}'" scp -O -P "${SSH_PORT}" -r client/dist/* "${SSH_USER}@${SSH_HOST}:${REMOTE_DIR}/" echo echo "✓ 배포 완료" echo " $PUBLIC_URL"