예제 소스
오목 Next.js 웹과 VLM 착수 API 연결하기 · 파일 59개
fix_bad_gateway.sh
#!/usr/bin/env bash
# 502 Bad Gateway 복구: 터널(18080/81/82) + omook nginx + 로컬 Next 점검
# Mac 터미널에서 실행:
# bash ~/project
set -euo pipefail
export PATH="$HOME/.nvm/versions/node/v24.14.1/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"
OMOOK="$(cd "$(dirname "$0")/.." && pwd)"
GO="$(cd "$OMOOK/../go" && pwd)"
echo "== local backends =="
for p in 3000 3001 3002 9299 9320; do
if lsof -nP -iTCP:$p -sTCP:LISTEN >/dev/null 2>&1; then
echo " :$p LISTEN"
else
echo " :$p DOWN"
fi
done
# baduk Next 없으면 기동 시도
if ! lsof -nP -iTCP:3000 -sTCP:LISTEN >/dev/null 2>&1; then
echo "== start baduk Next :3000 =="
if [[ -x "$GO/mariago-web/node_modules/.bin/next" ]]; then
(cd "$GO/mariago-web" && nohup npm run start >>"$GO/logs/mariago_ssh_tunnel/baduk.next.log" 2>&1 &) || \
(cd "$GO/mariago-web" && nohup npm run dev >>"$GO/logs/mariago_ssh_tunnel/baduk.next.log" 2>&1 &)
sleep 3
else
echo " skip: mariago-web not ready"
fi
fi
# omook Next
if ! lsof -nP -iTCP:3002 -sTCP:LISTEN >/dev/null 2>&1; then
echo "== start omook Next :3002 =="
bash "$OMOOK/scripts/start_omook_watchdog.sh" || true
fi
echo "== restart SSH tunnel watchdog (include :18082→:3002) =="
pkill -f 'daemon_ssh_reverse_tunnel.py' 2>/dev/null || true
# ethtrade reverse tunnel ssh
pkill -f 'ssh -N .*ethtrade' 2>/dev/null || true
sleep 2
mkdir -p "$GO/logs/mariago_ssh_tunnel"
if ! pgrep -f 'daemon_ssh_reverse_tunnel.py' >/dev/null; then
nohup "$GO/.venv/bin/python" "$GO/scripts/daemon_ssh_reverse_tunnel.py" \
>>"$GO/logs/mariago_ssh_tunnel/tunnel.watchdog.nohup.log" 2>&1 &
echo "tunnel watchdog pid=$!"
else
echo "tunnel watchdog relaunched by launchd: $(pgrep -f daemon_ssh_reverse_tunnel.py | tr '\n' ' ')"
fi
# 새 코드가 로드됐는지 확인될 때까지 잠시 대기 후, omook 포워드 없으면 강제 재시작 플래그
sleep 8
if ! pgrep -af 'ssh -N' | grep -q '18082'; then
echo "omook forward missing → RESTART_REQUESTED"
echo "need omook 18082 $(date -Iseconds)" > "$GO/logs/mariago_ssh_tunnel/RESTART_REQUESTED"
sleep 20
fi
echo "== tunnel HEARTBEAT =="
cat "$GO/logs/mariago_ssh_tunnel/HEARTBEAT.md" || true
echo ""
pgrep -af 'ssh -N' | head -3 || true
echo "== deploy omook nginx on IDC =="
scp -o BatchMode=yes -o ConnectTimeout=20 \
"$OMOOK/deploy/omook.mariago.kr.conf" \
"$OMOOK/scripts/idc_install_omook_nginx.sh" \
ethtrade:~/
ssh -o BatchMode=yes -o ConnectTimeout=20 ethtrade \
'chmod +x ~/idc_install_omook_nginx.sh && sudo ~/idc_install_omook_nginx.sh'
echo "== probe IDC local =="
ssh -o BatchMode=yes ethtrade 'python3 - <<"PY"
import socket
for p in (18080,18081,18082,19320):
s=socket.socket(); s.settimeout(2)
try:
s.connect(("127.0.0.1", p)); print(p, "OPEN")
except Exception as e:
print(p, "DOWN", type(e).__name__)
finally:
s.close()
PY
curl -sS -o /dev/null -w "local18080=%{http_code}\n" --max-time 5 http://127.0.0.1:18080/ || true
curl -sS -o /dev/null -w "local18081=%{http_code}\n" --max-time 5 http://127.0.0.1:18081/ || true
curl -sS -o /dev/null -w "local18082=%{http_code}\n" --max-time 5 http://127.0.0.1:18082/ || true
ls /etc/nginx/sites-enabled/
'
echo "== DNS =="
dig +short omook.mariago.kr A || true
dig +short omook.mariago.kr A @******** || true
echo "== external HTTPS =="
for u in \
https://omook.mariago.kr/ \
https://omook.mariago.kr/play \
https://stoku.mariago.kr/ \
https://baduk.mariago.kr/play \
https://go.mariago.kr/play
do
code=$(curl -k -sS -o /dev/null -w "%{http_code}" --max-time 20 "$u" || echo ERR)
echo " $code $u"
done
echo ""
echo "DNS 없으면: omook.mariago.kr A → ******** 등록 후"
echo " ssh ethtrade 'sudo certbot --nginx -d omook.mariago.kr'"