From 067e25116a65140d24382afb746caae3bcec723f Mon Sep 17 00:00:00 2001
From: th-kim0823
Date: Sun, 26 Apr 2026 18:35:15 +0900
Subject: [PATCH] =?UTF-8?q?feat:=20admin=20URL=20=EC=89=BD=EA=B2=8C=20?=
=?UTF-8?q?=EC=A0=91=EA=B7=BC=20-=20show-urls.sh=20+=20admin=20=EB=82=B4?=
=?UTF-8?q?=EB=B6=80=20=EB=A7=81=ED=81=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- show-urls.sh: localhost + LAN IP 포함 모든 URL 출력 (참가자/어드민/시상식)
- admin 페이지에 다른 페이지 URL expander 추가 (ceremony 링크 클릭 가능)
- README에 사용법 추가
Co-Authored-By: Claude Opus 4.7 (1M context)
---
README.md | 10 ++++++++++
app.py | 13 +++++++++++++
show-urls.sh | 37 +++++++++++++++++++++++++++++++++++++
3 files changed, 60 insertions(+)
create mode 100755 show-urls.sh
diff --git a/README.md b/README.md
index fb65ba3..14a1a14 100644
--- a/README.md
+++ b/README.md
@@ -30,10 +30,20 @@ docker compose down
## URL
+```bash
+./show-urls.sh # localhost + LAN IP 포함 모든 URL 출력
+```
+
- 투표: `http://<서버>:8501/`
- 어드민: `http://<서버>:8501/?mode=admin&token=`
- 시상식: `http://<서버>:8501/?mode=ceremony&token=`
+macOS 빠른 열기:
+```bash
+TOKEN=$(grep ADMIN_TOKEN .env | cut -d= -f2)
+open "http://localhost:8501/?mode=admin&token=${TOKEN}"
+```
+
## 데이터 파일 — `hackathon.json`
```json
diff --git a/app.py b/app.py
index 2e1e7da..dada87b 100644
--- a/app.py
+++ b/app.py
@@ -355,6 +355,19 @@ def render_admin():
st.title("🔐 진행자 콘솔")
+ with st.expander("🔗 다른 페이지 URL"):
+ st.markdown(
+ f"""
+- 👥 **참가자 투표**: [/](/)
+- 🎉 **시상식 (큰 화면)**: [/?mode=ceremony&token=...](?mode=ceremony&token={ADMIN_TOKEN})
+
+호스트에서 LAN IP 포함 모든 URL 보기:
+```bash
+./show-urls.sh
+```
+ """
+ )
+
voting_open = is_voting_open()
cur_label = "🟢 투표 진행 중" if voting_open else "🔴 투표 마감됨"
st.markdown(f"### 투표 상태: {cur_label}")
diff --git a/show-urls.sh b/show-urls.sh
new file mode 100755
index 0000000..d6ad853
--- /dev/null
+++ b/show-urls.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+# 해커톤 투표 URL 출력 (호스트에서 실행)
+set -euo pipefail
+cd "$(dirname "$0")"
+
+if [[ ! -f .env ]]; then
+ echo "❌ .env 파일 없음. 먼저 'cp .env.example .env' 후 ADMIN_TOKEN 설정."
+ exit 1
+fi
+
+TOKEN=$(grep -E "^ADMIN_TOKEN=" .env | head -1 | cut -d= -f2- | tr -d '"')
+PORT=$(grep -E "^PORT=" .env 2>/dev/null | head -1 | cut -d= -f2- | tr -d '"' || echo "")
+PORT=${PORT:-8501}
+
+# LAN IP 자동 감지 (macOS/Linux)
+LAN_IP=$(ipconfig getifaddr en0 2>/dev/null || ip -4 addr show 2>/dev/null | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | grep -v '^127\.' | head -1 || echo "")
+
+echo "============================================"
+echo " 해커톤 투표 URL"
+echo "============================================"
+echo
+echo "👥 참가자 투표:"
+echo " http://localhost:${PORT}/"
+[[ -n "$LAN_IP" ]] && echo " http://${LAN_IP}:${PORT}/ (LAN)"
+echo
+echo "🔐 진행자 어드민:"
+echo " http://localhost:${PORT}/?mode=admin&token=${TOKEN}"
+[[ -n "$LAN_IP" ]] && echo " http://${LAN_IP}:${PORT}/?mode=admin&token=${TOKEN}"
+echo
+echo "🎉 시상식 (큰 화면):"
+echo " http://localhost:${PORT}/?mode=ceremony&token=${TOKEN}"
+[[ -n "$LAN_IP" ]] && echo " http://${LAN_IP}:${PORT}/?mode=ceremony&token=${TOKEN}"
+echo
+echo "============================================"
+echo " 팁: 'open' 으로 바로 브라우저 열기 (macOS)"
+echo " open \"http://localhost:${PORT}/?mode=admin&token=${TOKEN}\""
+echo "============================================"