#!/bin/bash # Deploy tracked web files from repo -> /var/www/html (ไม่ลบ node_modules บนเซิร์ฟเวอร์) # ใช้ทุกครั้งหลังแก้ www/html ใน repo แล้วต้องการให้เว็บจริงตรงกับ repo set -euo pipefail REPO="$(cd "$(dirname "$0")/.." && pwd)" SRC="$REPO/www/html/" DST="/var/www/html/" GAME_SERVER_JS="$DST/Game/server.js" if [[ "$(id -u)" -ne 0 ]]; then echo "Run as root: sudo $0" >&2 exit 1 fi # ถ้า Game/server.js เปลี่ยนหลัง deploy — Node ต้องรีโหลดโค้ด (systemd: game-zep.service) hash_game_server_js() { local f="$1" [[ -f "$f" ]] || { echo ""; return 0; } sha256sum "$f" | awk '{print $1}' } GAME_SRV_HASH_BEFORE="$(hash_game_server_js "$GAME_SERVER_JS")" # ไม่ rsync ทับ Game/data/maps — ฉากที่สร้าง/บันทึกบนเซิร์ฟ (Node saveMap) มักใหม่กว่าใน repo # หลัง deploy คัดลอกเฉพาะ *.json ที่มีใน repo แต่ยังไม่มีบนเซิร์ฟ (seed รหัสใหม่) ไม่แตะไฟล์ที่มีอยู่แล้ว MAPS_SRC="$SRC/Game/data/maps" MAPS_DST="$DST/Game/data/maps" rsync -a \ --checksum \ --exclude 'node_modules' \ --exclude 'Game/data/maps/' \ "$SRC" "$DST" chown -R www-data:www-data "$DST" if [[ -d "$MAPS_SRC" ]]; then mkdir -p "$MAPS_DST" shopt -s nullglob for f in "$MAPS_SRC"/*.json; do base=$(basename "$f") if [[ ! -f "$MAPS_DST/$base" ]]; then cp -a "$f" "$MAPS_DST/$base" echo "OK: seeded map (missing on server) $base" fi done shopt -u nullglob chown -R www-data:www-data "$MAPS_DST" fi # รูปป้าย quiz_carry — ให้เขียน/ลบได้ชัดเจน (FTP/Node); setgid ให้ไฟล์ใหม่ได้กลุ่ม www-data PLAQUE="$DST/Game/public/img/quiz-carry-plaque-assets" mkdir -p "$PLAQUE" chown www-data:www-data "$PLAQUE" chmod 2775 "$PLAQUE" GA="$DST/Game/public/img/gauntlet-assets" mkdir -p "$GA" chown www-data:www-data "$GA" chmod 2775 "$GA" # Jump Survival (Jumper) — โฟลเดอร์รูป; FTP มัก MKD ไม่ได้ถ้ายังไม่มีบนเซิร์ฟ JUMPER="$DST/Game/public/img/Jumper" mkdir -p "$JUMPER" chown www-data:www-data "$JUMPER" chmod 2775 "$JUMPER" # Space shooter / Violent Crime — ชื่อโฟลเดอร์ไม่มีช่องว่าง (FTP MKD "Violent Crime" มัก 550) VIOLENT_CRIME="$DST/Game/public/img/ViolentCrime" mkdir -p "$VIOLENT_CRIME" chown www-data:www-data "$VIOLENT_CRIME" chmod 2775 "$VIOLENT_CRIME" # Editor / เกม — รูปคำถามหรือ asset ชื่อ QUESTION (FTP MKD มัก 550 ถ้ายังไม่มีบนเซิร์ฟ) QUESTION_IMG="$DST/Game/public/img/QUESTION" mkdir -p "$QUESTION_IMG" chown www-data:www-data "$QUESTION_IMG" chmod 2775 "$QUESTION_IMG" # Stack (Tower block) — ชื่อโฟลเดอร์ไม่มีช่องว่าง (FTP MKD "Tower block" มัก 550) TOWER_BLOCK_IMG="$DST/Game/public/img/TowerBlock" mkdir -p "$TOWER_BLOCK_IMG" chown www-data:www-data "$TOWER_BLOCK_IMG" chmod 2775 "$TOWER_BLOCK_IMG" # balloon_boss (Mega Virus) — อย่าใช้ "Mega Virus" มี space (FTP MKD มัก 550) MEGA_VIRUS_IMG="$DST/Game/public/img/MegaVirus" mkdir -p "$MEGA_VIRUS_IMG" chown www-data:www-data "$MEGA_VIRUS_IMG" chmod 2775 "$MEGA_VIRUS_IMG" GAME_SRV_HASH_AFTER="$(hash_game_server_js "$GAME_SERVER_JS")" if [[ -n "$GAME_SRV_HASH_AFTER" && "$GAME_SRV_HASH_BEFORE" != "$GAME_SRV_HASH_AFTER" ]]; then if systemctl cat game-zep.service &>/dev/null; then systemctl restart game-zep.service echo "OK: restarted game-zep.service (Game/server.js changed)" else echo "WARN: Game/server.js changed but no game-zep.service — restart Node manually" >&2 fi fi echo "OK: deployed $SRC -> $DST (node_modules on server untouched)"