플레이 피드백 4건(주목도 미차감, 상점 빈 상품, 상점 UX 오해, 재화 명칭)을 검토해 방향이 확정된 항목만 반영하고, 외부 테스터에게 링크를 공유할 수 있게 시놀로지 NAS 배포까지 준비했다. ## 게임 로직 - 라운드 접수량 크리티컬 버그 수정: 합본을 반복하면 라운드가 안 끝나던 문제. deskCards에서 파생시키던 값을 순수 누적 카운터(roundIntake)로 교체 — 결정 노트: 2026-09-18-라운드-접수량-누적카운터 - DeskBar/CoreSwipeCard 정보 역할 분리: "이번 라운드 접수량/한도"는 결재 화면 전담, DeskBar는 책상에 쌓인 것(총 주목도·축별 분포)만 표시 - 토큰 → 코인 용어 일괄 변경: core/ 전체(식별자·CSS·주석·UI)와 기획서 SSOT 동기화, lucide Coins 아이콘 추가 ## 배포 - vite base를 상대 경로로 변경 (Web Station 서브패스 서빙 시 asset 404 방지) - 모바일 100vh → 100dvh (주소창 노출 시 하단 버튼 가림 방지) - 빌드 식별자 표시, 타이틀/테마색/description 정리 - deploy.sh + npm run deploy — SSH 키 권한 문제(777 → StrictModes 거부)와 NAS rsync 게이트를 scp -O로 우회해 실제 배포까지 검증 완료 → https://play.mint-grape.duckdns.org/projectss/ Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
84 lines
3.7 KiB
Bash
Executable File
84 lines
3.7 KiB
Bash
Executable File
#!/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"
|