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 | 이준형, 전효준⭐, 이지환, 김동국 |