From addde1a0ead42b304fbb236fe62e92c3a23951a1 Mon Sep 17 00:00:00 2001
From: th-kim0823
Date: Mon, 27 Apr 2026 21:31:29 +0900
Subject: [PATCH] =?UTF-8?q?chore:=20repo=20=EC=A0=95=EB=A6=AC=20=E2=80=94?=
=?UTF-8?q?=20entrypoint.sh=20=EC=B6=94=EA=B0=80,=20runtime=20state=20giti?=
=?UTF-8?q?gnore?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- entrypoint.sh: 첫 부팅 시 assign_teams.py 자동 실행 (시드)
- Dockerfile: ENTRYPOINT 적용, DATA_PATH=/app/data/hackathon.json
- hackathon.json (root) 삭제 — data/ 디렉터리로 이전 (gitignore)
- teams.md 추적 해제 (assign_teams.py가 매번 재생성)
- results_*.json + data/ gitignore 추가
- .env.example 삭제 (compose에 ADMIN_TOKEN 박제, .env 불필요)
Co-Authored-By: Claude Opus 4.7 (1M context)
---
.env.example | 2 -
.gitignore | 6 +-
Dockerfile | 12 +--
entrypoint.sh | 21 +++++
hackathon.json | 248 -------------------------------------------------
teams.md | 15 ---
6 files changed, 30 insertions(+), 274 deletions(-)
delete mode 100644 .env.example
create mode 100644 entrypoint.sh
delete mode 100644 hackathon.json
delete mode 100644 teams.md
diff --git a/.env.example b/.env.example
deleted file mode 100644
index b3632e7..0000000
--- a/.env.example
+++ /dev/null
@@ -1,2 +0,0 @@
-ADMIN_TOKEN=강한-랜덤-토큰-여기-넣기
-PORT=8501
diff --git a/.gitignore b/.gitignore
index dd69be1..19c2e99 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,10 @@ venv/
*.db
*.sqlite
.env
-!.env.example
.streamlit/secrets.toml
.superpowers/
+
+# 행사 진행 중 생성되는 state (assign_teams.py가 entrypoint에서 자동 시드)
+data/
+results_*.json
+teams.md
diff --git a/Dockerfile b/Dockerfile
index e8aaf2a..10bc8d3 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -10,15 +10,11 @@ ENV TZ=Asia/Seoul
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
-COPY app.py assign_teams.py ./
-COPY hackathon.json ./
+COPY app.py assign_teams.py entrypoint.sh ./
+RUN chmod +x /app/entrypoint.sh
EXPOSE 8501
-ENV DATA_PATH=/app/hackathon.json
+ENV DATA_PATH=/app/data/hackathon.json
-CMD ["streamlit", "run", "app.py", \
- "--server.address=0.0.0.0", \
- "--server.port=8501", \
- "--server.headless=true", \
- "--browser.gatherUsageStats=false"]
+ENTRYPOINT ["/app/entrypoint.sh"]
diff --git a/entrypoint.sh b/entrypoint.sh
new file mode 100644
index 0000000..d765e50
--- /dev/null
+++ b/entrypoint.sh
@@ -0,0 +1,21 @@
+#!/bin/sh
+set -e
+
+# DATA_PATH 비어있으면 assign_teams.py로 부트스트랩.
+# 호스트 마운트(./data)에 처음 부팅 시 1회 실행.
+if [ ! -s "$DATA_PATH" ]; then
+ echo "[init] $DATA_PATH 없음/비어있음 → assign_teams.py 실행"
+ mkdir -p "$(dirname "$DATA_PATH")"
+ cd /app
+ python3 assign_teams.py
+ mv /app/hackathon.json "$DATA_PATH"
+ echo "[init] 시드 완료 → $DATA_PATH"
+else
+ echo "[init] 기존 $DATA_PATH 보존"
+fi
+
+exec streamlit run /app/app.py \
+ --server.address=0.0.0.0 \
+ --server.port=8501 \
+ --server.headless=true \
+ --browser.gatherUsageStats=false
diff --git a/hackathon.json b/hackathon.json
deleted file mode 100644
index 92189b8..0000000
--- a/hackathon.json
+++ /dev/null
@@ -1,248 +0,0 @@
-{
- "settings": {
- "voting_open": true
- },
- "titles": {},
- "tie_breaks": {},
- "votes": [],
- "people": [
- {
- "name": "김호승",
- "team": "팀1",
- "dept": "AI Efficiency Tech",
- "senior": false,
- "notes": ""
- },
- {
- "name": "유준희",
- "team": "팀1",
- "dept": "AI Efficiency Tech",
- "senior": false,
- "notes": ""
- },
- {
- "name": "이준석",
- "team": "팀1",
- "dept": "MLOps HPC",
- "senior": false,
- "notes": ""
- },
- {
- "name": "장다현",
- "team": "팀1",
- "dept": "MLOps System",
- "senior": false,
- "notes": ""
- },
- {
- "name": "강승형",
- "team": "팀1",
- "dept": "MLOps Data",
- "senior": true,
- "notes": ""
- },
- {
- "name": "서한배",
- "team": "팀2",
- "dept": "AI Efficiency Tech",
- "senior": false,
- "notes": ""
- },
- {
- "name": "김민섭",
- "team": "팀2",
- "dept": "AI Efficiency Tech",
- "senior": false,
- "notes": ""
- },
- {
- "name": "유용혁",
- "team": "팀2",
- "dept": "MLOps HPC",
- "senior": false,
- "notes": ""
- },
- {
- "name": "박영훈",
- "team": "팀2",
- "dept": "MLOps System",
- "senior": true,
- "notes": ""
- },
- {
- "name": "박재호",
- "team": "팀2",
- "dept": "MLOps Data",
- "senior": false,
- "notes": ""
- },
- {
- "name": "이성재",
- "team": "팀3",
- "dept": "AI Efficiency Tech",
- "senior": false,
- "notes": ""
- },
- {
- "name": "이재광",
- "team": "팀3",
- "dept": "AI Efficiency Tech",
- "senior": false,
- "notes": ""
- },
- {
- "name": "김영관",
- "team": "팀3",
- "dept": "MLOps HPC",
- "senior": true,
- "notes": ""
- },
- {
- "name": "정채윤",
- "team": "팀3",
- "dept": "MLOps System",
- "senior": false,
- "notes": ""
- },
- {
- "name": "변수민",
- "team": "팀3",
- "dept": "MLOps Data",
- "senior": true,
- "notes": ""
- },
- {
- "name": "심성환",
- "team": "팀4",
- "dept": "AI Efficiency Tech",
- "senior": false,
- "notes": ""
- },
- {
- "name": "유지원",
- "team": "팀4",
- "dept": "AI Efficiency Tech",
- "senior": false,
- "notes": ""
- },
- {
- "name": "오근현",
- "team": "팀4",
- "dept": "MLOps HPC",
- "senior": false,
- "notes": ""
- },
- {
- "name": "장혁진",
- "team": "팀4",
- "dept": "MLOps System",
- "senior": false,
- "notes": ""
- },
- {
- "name": "손현준",
- "team": "팀4",
- "dept": "MLOps Data",
- "senior": true,
- "notes": ""
- },
- {
- "name": "정현준",
- "team": "팀5",
- "dept": "AI Efficiency Tech",
- "senior": false,
- "notes": ""
- },
- {
- "name": "조민정",
- "team": "팀5",
- "dept": "AI Efficiency Tech",
- "senior": false,
- "notes": ""
- },
- {
- "name": "김재현",
- "team": "팀5",
- "dept": "MLOps HPC",
- "senior": false,
- "notes": "최주니어"
- },
- {
- "name": "김병훈",
- "team": "팀5",
- "dept": "MLOps System",
- "senior": true,
- "notes": ""
- },
- {
- "name": "한지승",
- "team": "팀5",
- "dept": "MLOps Platform",
- "senior": true,
- "notes": "지각 가능"
- },
- {
- "name": "이정태",
- "team": "팀6",
- "dept": "AI Efficiency Tech",
- "senior": false,
- "notes": ""
- },
- {
- "name": "최호진",
- "team": "팀6",
- "dept": "MLOps HPC",
- "senior": false,
- "notes": ""
- },
- {
- "name": "김정명",
- "team": "팀6",
- "dept": "MLOps HPC",
- "senior": true,
- "notes": ""
- },
- {
- "name": "길주현",
- "team": "팀6",
- "dept": "MLOps System",
- "senior": false,
- "notes": ""
- },
- {
- "name": "서희",
- "team": "팀6",
- "dept": "MLOps System",
- "senior": true,
- "notes": ""
- },
- {
- "name": "이준형",
- "team": "팀7",
- "dept": "AI Efficiency Tech",
- "senior": false,
- "notes": ""
- },
- {
- "name": "전효준",
- "team": "팀7",
- "dept": "MLOps HPC",
- "senior": true,
- "notes": ""
- },
- {
- "name": "이지환",
- "team": "팀7",
- "dept": "MLOps System",
- "senior": false,
- "notes": ""
- },
- {
- "name": "김동국",
- "team": "팀7",
- "dept": "MLOps Data",
- "senior": false,
- "notes": ""
- }
- ]
-}
\ No newline at end of file
diff --git a/teams.md b/teams.md
deleted file mode 100644
index 6c241a2..0000000
--- a/teams.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# 해커톤 팀 배정 (확정)
-- 시드: `20260435`
-- 총 34명, 7팀, 사이즈 [5, 5, 5, 5, 5, 5, 4]
-- 김태현: 진행요원 (참여 X)
-- ⭐ 시니어, 🌱 최주니어, ⏰ 지각 가능
-
-| 팀 | 인원 | 시니어 | 멤버 |
-|---|---|---|---|
-| 팀1 | 5 | 1 | 김호승, 유준희, 이준석, 장다현, 강승형⭐ |
-| 팀2 | 5 | 1 | 서한배, 김민섭, 유용혁, 박영훈⭐, 박재호 |
-| 팀3 | 5 | 2 | 이성재, 이재광, 김영관⭐, 정채윤, 변수민⭐ |
-| 팀4 | 5 | 1 | 심성환, 유지원, 오근현, 장혁진, 손현준⭐ |
-| 팀5 | 5 | 2 | 정현준, 조민정, 김재현🌱, 김병훈⭐, 한지승⭐⏰ |
-| 팀6 | 5 | 2 | 이정태, 최호진, 김정명⭐, 길주현, 서희⭐ |
-| 팀7 | 4 | 1 | 이준형, 전효준⭐, 이지환, 김동국 |