Merry99 commited on
Commit
1c094f3
ยท
1 Parent(s): cb442f8

add local test

Browse files
HF_SECRETS_์„ค์ •.md DELETED
@@ -1,65 +0,0 @@
1
- # ๐Ÿ” Hugging Face Secrets ์„ค์ • ๊ฐ€์ด๋“œ
2
-
3
- ## ๐Ÿ“‹ ์„ค์ •ํ•  5๊ฐœ Secrets
4
-
5
- Hugging Face Space โ†’ Settings โ†’ Repository secrets โ†’ New secret
6
-
7
- ### 1๏ธโƒฃ DB_USER
8
- ```
9
- Value: ADMIN
10
- ```
11
-
12
- ### 2๏ธโƒฃ DB_PASSWORD
13
- ```
14
- Value: Oracle_DB_๋น„๋ฐ€๋ฒˆํ˜ธ
15
- ```
16
- (Oracle Cloud Console์—์„œ ํ™•์ธ ๋˜๋Š” ์žฌ์„ค์ •)
17
-
18
- ### 3๏ธโƒฃ DB_TNS_ALIAS
19
- ```
20
- Value: musclecare_high
21
- ```
22
- (wallet/tnsnames.ora์—์„œ ํ™•์ธํ•œ ์ด๋ฆ„)
23
-
24
- ### 4๏ธโƒฃ WALLET_ZIP_B64 โญ ๊ฐ€์žฅ ์ค‘์š”!
25
- ```
26
- Value: (wallet_base64.txt ํŒŒ์ผ ์ „์ฒด ๋‚ด์šฉ)
27
- ```
28
-
29
- **์ƒ์„ฑ ๋ฐฉ๋ฒ•:**
30
- ```bash
31
- # Wallet zip ํŒŒ์ผ์„ Base64๋กœ ์ธ์ฝ”๋”ฉ
32
- base64 -i ~/Downloads/Wallet_musclecare.zip -o wallet_base64.txt
33
-
34
- # wallet_base64.txt ํŒŒ์ผ ์—ด์–ด์„œ ์ „์ฒด ๋ณต์‚ฌ
35
- cat wallet_base64.txt | pbcopy # Mac
36
- ```
37
-
38
- ### 5๏ธโƒฃ WALLET_PASSWORD
39
- ```
40
- Value: Wallet_๋‹ค์šด๋กœ๋“œ์‹œ_์„ค์ •ํ•œ_๋น„๋ฐ€๋ฒˆํ˜ธ
41
- ```
42
-
43
- ---
44
-
45
- ## โœ… ์„ค์ • ์™„๋ฃŒ ํ›„
46
-
47
- ```bash
48
- git push
49
- ```
50
-
51
- ์ž๋™์œผ๋กœ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค!
52
-
53
- ---
54
-
55
- ## ๐Ÿงช ๋ฐฐํฌ ํ™•์ธ
56
-
57
- ```bash
58
- curl https://[username]-musclecare-api.hf.space/health
59
- ```
60
-
61
- **์„ฑ๊ณต ์‘๋‹ต:**
62
- ```json
63
- {"ok": true, "db": 1}
64
- ```
65
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
README.md CHANGED
@@ -1,93 +1,11 @@
1
- # ๐Ÿ‹๏ธ MuscleCare FastAPI
2
-
3
- Oracle Autonomous Database ์—ฐ๋™ FastAPI ์„œ๋ฒ„ (Wallet ๊ธฐ๋ฐ˜ mTLS)
4
-
5
- ## ๐Ÿš€ ์ฃผ์š” ๊ธฐ๋Šฅ
6
-
7
- - ๐Ÿ” **Wallet ๊ธฐ๋ฐ˜ mTLS ์—ฐ๊ฒฐ** - ์ตœ๊ณ  ๋ณด์•ˆ ์ˆ˜์ค€
8
- - ๐Ÿ“ค **์‚ฌ์šฉ์ž ์ƒํƒœ ์—…๋กœ๋“œ/๋‹ค์šด๋กœ๋“œ** - baseline + user_emb
9
- - ๐Ÿ“Š **ํ”ผ๋กœ๋„ ๋กœ๊ทธ ์ €์žฅ** - Oracle DB์— ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅ
10
-
11
  ---
12
-
13
- ## ๐Ÿ“ก API ์—”๋“œํฌ์ธํŠธ
14
-
15
- | ์—”๋“œํฌ์ธํŠธ | ๋ฉ”์†Œ๋“œ | ์„ค๋ช… |
16
- |-----------|--------|------|
17
- | `/health` | GET | DB ์—ฐ๊ฒฐ ์ƒํƒœ ํ™•์ธ |
18
- | `/upload_state` | POST | ์‚ฌ์šฉ์ž ์ƒํƒœ ์—…๋กœ๋“œ |
19
- | `/upload_logs` | POST | ํ”ผ๋กœ๋„ ๋กœ๊ทธ ์—…๋กœ๋“œ |
20
-
21
  ---
22
-
23
- ## ๐ŸŒ Hugging Face Space ๋ฐฐํฌ
24
-
25
- ### 1. Wallet Base64 ์ธ์ฝ”๋”ฉ
26
-
27
- ```bash
28
- base64 -i ~/Downloads/Wallet_musclecare.zip -o wallet_base64.txt
29
- ```
30
-
31
- ### 2. Hugging Face Secrets ์„ค์ • (5๊ฐœ)
32
-
33
- **Settings โ†’ Repository secrets**
34
-
35
- | Secret | Value |
36
- |--------|-------|
37
- | `DB_USER` | `ADMIN` |
38
- | `DB_PASSWORD` | Oracle DB ๋น„๋ฐ€๋ฒˆํ˜ธ |
39
- | `DB_TNS_ALIAS` | `musclecare_high` |
40
- | `WALLET_ZIP_B64` | wallet_base64.txt ์ „์ฒด ๋‚ด์šฉ |
41
- | `WALLET_PASSWORD` | Wallet ๋น„๋ฐ€๋ฒˆํ˜ธ |
42
-
43
- ### 3. Git Push
44
-
45
- ```bash
46
- git push
47
- ```
48
-
49
- **์ž๋™ ๋ฐฐํฌ!** `start.py`๊ฐ€ Wallet์„ ์ž๋™์œผ๋กœ ๋””์ฝ”๋”ฉํ•˜๊ณ  ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
50
-
51
- ---
52
-
53
- ## ๐Ÿงช ํ…Œ์ŠคํŠธ
54
-
55
- ### ๋ฐฐํฌ ํ›„:
56
-
57
- ```bash
58
- # ํ—ฌ์Šค ์ฒดํฌ
59
- curl https://[username]-musclecare-api.hf.space/health
60
-
61
- # API ๋ฌธ์„œ
62
- https://[username]-musclecare-api.hf.space/docs
63
- ```
64
-
65
- ### ๋กœ์ปฌ ํ…Œ์ŠคํŠธ:
66
-
67
- ```bash
68
- # .env ํŒŒ์ผ ์ƒ์„ฑ
69
- cp env_example.txt .env
70
- nano .env # ์‹ค์ œ ๊ฐ’ ์ž…๋ ฅ
71
-
72
- # ์„œ๋ฒ„ ์‹คํ–‰
73
- python app.py
74
- ```
75
-
76
- ---
77
-
78
- ## ๐Ÿ“– ์ƒ์„ธ ๊ฐ€์ด๋“œ
79
-
80
- - **HF_SECRETS_์„ค์ •.md** - Secrets ์„ค์ • ๋ฐฉ๋ฒ•
81
- - **DATA_ARCHITECTURE.md** - ์ „์ฒด ์•„ํ‚คํ…์ฒ˜
82
-
83
- ---
84
-
85
- ## ๐Ÿ” ๋ณด์•ˆ
86
-
87
- - โœ… `.gitignore` - .env, wallet/ ์ œ์™ธ
88
- - โœ… Wallet Base64๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐฐํฌ
89
- - โœ… Secrets๋กœ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ด€๋ฆฌ
90
-
91
- ---
92
-
93
- Made with โค๏ธ for MuscleCare
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: MuscleCare API
3
+ emoji: ๐Ÿ‹๏ธ
4
+ colorFrom: blue
5
+ colorTo: purple
6
+ sdk: docker
7
+ sdk_version: "3.10"
8
+ app_file: start.py
9
+ pinned: false
10
+ license: apache-2.0
11
  ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app.py CHANGED
@@ -2,8 +2,13 @@ import os
2
  import json
3
  from typing import List, Optional
4
  from fastapi import FastAPI, HTTPException
5
- from pydantic import BaseModel, Field, conlist
 
6
  import oracledb
 
 
 
 
7
 
8
  # ----- ํ™˜๊ฒฝ ๋ณ€์ˆ˜ -----
9
  DB_USER = os.environ["DB_USER"]
@@ -33,6 +38,8 @@ app = FastAPI(title="MuscleCare Hybrid Server (mTLS)")
33
 
34
  # ----- ๋ชจ๋ธ -----
35
  class StatePayload(BaseModel):
 
 
36
  user_id: str
37
  rms_base: Optional[float] = None
38
  freq_base: Optional[float] = None
@@ -50,7 +57,7 @@ class LogItem(BaseModel):
50
  window_count: Optional[int] = None
51
 
52
  class LogsPayload(BaseModel):
53
- items: conlist(LogItem, min_items=1)
54
 
55
  # ----- ์œ ํ‹ธ -----
56
  def clob_json(obj) -> str:
 
2
  import json
3
  from typing import List, Optional
4
  from fastapi import FastAPI, HTTPException
5
+ from pydantic import BaseModel, Field, ConfigDict
6
+ from typing import List
7
  import oracledb
8
+ from dotenv import load_dotenv
9
+
10
+ # ๋กœ์ปฌ ๊ฐœ๋ฐœ: .env ํŒŒ์ผ ๋กœ๋“œ (์žˆ์œผ๋ฉด)
11
+ load_dotenv()
12
 
13
  # ----- ํ™˜๊ฒฝ ๋ณ€์ˆ˜ -----
14
  DB_USER = os.environ["DB_USER"]
 
38
 
39
  # ----- ๋ชจ๋ธ -----
40
  class StatePayload(BaseModel):
41
+ model_config = ConfigDict(protected_namespaces=())
42
+
43
  user_id: str
44
  rms_base: Optional[float] = None
45
  freq_base: Optional[float] = None
 
57
  window_count: Optional[int] = None
58
 
59
  class LogsPayload(BaseModel):
60
+ items: List[LogItem] = Field(..., min_length=1)
61
 
62
  # ----- ์œ ํ‹ธ -----
63
  def clob_json(obj) -> str:
env_example.txt DELETED
@@ -1,10 +0,0 @@
1
- # ๋กœ์ปฌ ๊ฐœ๋ฐœ์šฉ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์˜ˆ์‹œ
2
- # ์ด ํŒŒ์ผ์„ .env๋กœ ๋ณต์‚ฌํ•˜๊ณ  ์‹ค์ œ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•˜์„ธ์š”
3
- # cp env_example.txt .env
4
-
5
- DB_USER=ADMIN
6
- DB_PASSWORD=your_db_password_here
7
- DB_TNS_ALIAS=musclecare_high
8
- WALLET_DIR=/Users/gimhyeon-u/workspace/MuscleCare-FastAPI/wallet
9
- WALLET_PASSWORD=your_wallet_password_here
10
-
 
 
 
 
 
 
 
 
 
 
 
requirements.txt CHANGED
@@ -3,3 +3,4 @@ uvicorn
3
  python-multipart
4
  oracledb>=2.3
5
  pydantic
 
 
3
  python-multipart
4
  oracledb>=2.3
5
  pydantic
6
+ python-dotenv
start.py CHANGED
@@ -1,23 +1,69 @@
1
  import os, base64, zipfile, io, sys, tempfile, subprocess
 
 
 
 
 
2
 
3
  def prepare_wallet_dir():
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  b64 = os.environ["WALLET_ZIP_B64"]
5
  wallet_password = os.environ["WALLET_PASSWORD"]
 
6
  # wallet์„ ๋ฉ”๋ชจ๋ฆฌ->์ž„์‹œ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ณต์›
7
  wallet_dir = tempfile.mkdtemp(prefix="wallet_")
 
 
8
  zip_bytes = base64.b64decode(b64)
9
  with zipfile.ZipFile(io.BytesIO(zip_bytes)) as z:
10
  z.extractall(wallet_dir)
 
11
  # ์•ˆ์ „์„ ์œ„ํ•ด ๊ถŒํ•œ ์ถ•์†Œ
12
  for root, _, files in os.walk(wallet_dir):
13
  for f in files:
14
  os.chmod(os.path.join(root, f), 0o600)
 
 
 
15
  # ์ง€๊ฐ‘ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” oracledb์—์„œ ์‚ฌ์šฉ
16
  os.environ["WALLET_DIR"] = wallet_dir
17
  os.environ["WALLET_PASSWORD"] = wallet_password
 
18
  return wallet_dir
19
 
20
  if __name__ == "__main__":
21
- prepare_wallet_dir()
 
 
 
 
 
 
 
 
 
 
22
  # Uvicorn ๊ธฐ๋™
 
 
23
  subprocess.run([sys.executable, "-m", "uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"])
 
1
  import os, base64, zipfile, io, sys, tempfile, subprocess
2
+ from pathlib import Path
3
+ from dotenv import load_dotenv
4
+
5
+ # .env ํŒŒ์ผ ๋กœ๋“œ (๋กœ์ปฌ ๊ฐœ๋ฐœ์šฉ)
6
+ load_dotenv()
7
 
8
  def prepare_wallet_dir():
9
+ """
10
+ Wallet ์ค€๋น„:
11
+ - ๋ฐฐํฌ ํ™˜๊ฒฝ: WALLET_ZIP_B64์—์„œ ๋””์ฝ”๋”ฉ
12
+ - ๋กœ์ปฌ ํ™˜๊ฒฝ: WALLET_DIR ๊ฒฝ๋กœ ์‚ฌ์šฉ
13
+ """
14
+ # ๋กœ์ปฌ ๊ฐœ๋ฐœ: WALLET_DIR์ด ์ด๋ฏธ ์„ค์ •๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ
15
+ if "WALLET_DIR" in os.environ:
16
+ wallet_dir = os.environ["WALLET_DIR"]
17
+ if Path(wallet_dir).exists():
18
+ print(f"๐Ÿ“ ๋กœ์ปฌ Wallet ์‚ฌ์šฉ: {wallet_dir}")
19
+ return wallet_dir
20
+
21
+ # ๋ฐฐํฌ ํ™˜๊ฒฝ: WALLET_ZIP_B64์—์„œ ๋””์ฝ”๋”ฉ
22
+ if "WALLET_ZIP_B64" not in os.environ:
23
+ raise RuntimeError(
24
+ "โŒ WALLET_ZIP_B64 ๋˜๋Š” WALLET_DIR ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.\n"
25
+ " ๋กœ์ปฌ: .env ํŒŒ์ผ์— WALLET_DIR ์„ค์ •\n"
26
+ " ๋ฐฐํฌ: Hugging Face Secrets์— WALLET_ZIP_B64 ์„ค์ •"
27
+ )
28
+
29
+ print("๐Ÿ” Wallet Base64 ๋””์ฝ”๋”ฉ ์‹œ์ž‘...")
30
  b64 = os.environ["WALLET_ZIP_B64"]
31
  wallet_password = os.environ["WALLET_PASSWORD"]
32
+
33
  # wallet์„ ๋ฉ”๋ชจ๋ฆฌ->์ž„์‹œ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ณต์›
34
  wallet_dir = tempfile.mkdtemp(prefix="wallet_")
35
+ print(f"๐Ÿ“ ์ž„์‹œ ๋””๋ ‰ํ† ๋ฆฌ: {wallet_dir}")
36
+
37
  zip_bytes = base64.b64decode(b64)
38
  with zipfile.ZipFile(io.BytesIO(zip_bytes)) as z:
39
  z.extractall(wallet_dir)
40
+
41
  # ์•ˆ์ „์„ ์œ„ํ•ด ๊ถŒํ•œ ์ถ•์†Œ
42
  for root, _, files in os.walk(wallet_dir):
43
  for f in files:
44
  os.chmod(os.path.join(root, f), 0o600)
45
+
46
+ print("โœ… Wallet ์••์ถ• ํ•ด์ œ ์™„๋ฃŒ")
47
+
48
  # ์ง€๊ฐ‘ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” oracledb์—์„œ ์‚ฌ์šฉ
49
  os.environ["WALLET_DIR"] = wallet_dir
50
  os.environ["WALLET_PASSWORD"] = wallet_password
51
+
52
  return wallet_dir
53
 
54
  if __name__ == "__main__":
55
+ print("=" * 60)
56
+ print("๐Ÿš€ MuscleCare FastAPI ์„œ๋ฒ„ ์‹œ์ž‘")
57
+ print("=" * 60)
58
+
59
+ # Wallet ์ค€๋น„
60
+ try:
61
+ prepare_wallet_dir()
62
+ except Exception as e:
63
+ print(f"โŒ Wallet ์ค€๋น„ ์‹คํŒจ: {e}")
64
+ sys.exit(1)
65
+
66
  # Uvicorn ๊ธฐ๋™
67
+ print("\n๐ŸŒ FastAPI ์„œ๋ฒ„ ์‹คํ–‰...")
68
+ print("=" * 60)
69
  subprocess.run([sys.executable, "-m", "uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"])
test_api.sh ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # MuscleCare API ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ
4
+
5
+ # ์„œ๋ฒ„ URL ์„ค์ •
6
+ # ๋กœ์ปฌ: http://localhost:7860
7
+ # ๋ฐฐํฌ: https://[username]-musclecare-api.hf.space
8
+ BASE_URL="${1:-http://localhost:7860}"
9
+
10
+ echo "======================================"
11
+ echo "๐Ÿงช MuscleCare API ํ…Œ์ŠคํŠธ"
12
+ echo "======================================"
13
+ echo "์„œ๋ฒ„: $BASE_URL"
14
+ echo ""
15
+
16
+ # 1. Health ์ฒดํฌ
17
+ echo "1๏ธโƒฃ Health ์ฒดํฌ"
18
+ echo "--------------------------------------"
19
+ curl -X GET "$BASE_URL/health" \
20
+ -H "accept: application/json" | jq .
21
+ echo ""
22
+ echo ""
23
+
24
+ # 2. ์‚ฌ์šฉ์ž ์ƒํƒœ ์—…๋กœ๋“œ
25
+ echo "2๏ธโƒฃ ์‚ฌ์šฉ์ž ์ƒํƒœ ์—…๋กœ๋“œ"
26
+ echo "--------------------------------------"
27
+ curl -X POST "$BASE_URL/upload_state" \
28
+ -H "Content-Type: application/json" \
29
+ -H "accept: application/json" \
30
+ -d '{
31
+ "user_id": "test_user_001",
32
+ "rms_base": 0.11,
33
+ "freq_base": 50.1,
34
+ "user_emb": [0.135, 0.012, 49.3, 0.8, 0.84, 0.02, 0.11, 0.0021, 0.35, 0.71, 0.92, 0.88],
35
+ "model_version": "v1.0.0"
36
+ }' | jq .
37
+ echo ""
38
+ echo ""
39
+
40
+ # 3. ํ”ผ๋กœ๋„ ๋กœ๊ทธ ์—…๋กœ๋“œ
41
+ echo "3๏ธโƒฃ ํ”ผ๋กœ๋„ ๋กœ๊ทธ ์—…๋กœ๋“œ"
42
+ echo "--------------------------------------"
43
+ curl -X POST "$BASE_URL/upload_logs" \
44
+ -H "Content-Type: application/json" \
45
+ -H "accept: application/json" \
46
+ -d '{
47
+ "items": [
48
+ {
49
+ "user_id": "test_user_001",
50
+ "session_id": "session_001",
51
+ "measure_date": "2025-10-22",
52
+ "rms": 0.12,
53
+ "freq": 49.8,
54
+ "fatigue": 0.83,
55
+ "mode": "Hybrid",
56
+ "window_count": 100
57
+ },
58
+ {
59
+ "user_id": "test_user_001",
60
+ "session_id": "session_002",
61
+ "measure_date": "2025-10-22",
62
+ "rms": 0.15,
63
+ "freq": 48.5,
64
+ "fatigue": 0.91,
65
+ "mode": "E2E",
66
+ "window_count": 120
67
+ }
68
+ ]
69
+ }' | jq .
70
+ echo ""
71
+ echo ""
72
+
73
+ echo "======================================"
74
+ echo "โœ… ํ…Œ์ŠคํŠธ ์™„๋ฃŒ"
75
+ echo "======================================"
76
+
๊ฒ€์ˆ˜_๊ฒฐ๊ณผ.md DELETED
@@ -1,237 +0,0 @@
1
- # โœ… ์ „์ฒด ๊ฒ€์ˆ˜ ๊ฒฐ๊ณผ
2
-
3
- ## ๐Ÿ“Š ๊ฒ€์ˆ˜ ์™„๋ฃŒ - ๋ฐฐํฌ ์ค€๋น„ ์™„๋ฃŒ!
4
-
5
- ---
6
-
7
- ## ๐ŸŽฏ ํ•ต์‹ฌ ํŒŒ์ผ ๊ตฌ์กฐ
8
-
9
- ```
10
- MuscleCare-FastAPI/
11
- โ”œโ”€โ”€ start.py โœ… Wallet ๋””์ฝ”๋”ฉ + ์„œ๋ฒ„ ๋ถ€ํŒ…
12
- โ”œโ”€โ”€ app.py โœ… FastAPI ์•ฑ (๊ฐ„์†Œํ™”๋จ)
13
- โ”œโ”€โ”€ Dockerfile โœ… start.py ์‹คํ–‰
14
- โ”œโ”€โ”€ requirements.txt โœ… ์˜์กด์„ฑ
15
- โ”œโ”€โ”€ .gitignore โœ… ๋ณด์•ˆ ํŒŒ์ผ ์ œ์™ธ
16
- โ”œโ”€โ”€ README.md โœ… ํ”„๋กœ์ ํŠธ ์„ค๋ช…
17
- โ””โ”€โ”€ env_example.txt โœ… ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์˜ˆ์‹œ
18
- ```
19
-
20
- ---
21
-
22
- ## โœ… ์ฝ”๋“œ ๊ฒ€์ˆ˜ ๊ฒฐ๊ณผ
23
-
24
- ### 1. start.py โœ…
25
- ```python
26
- โœ… WALLET_ZIP_B64 ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ฝ๊ธฐ
27
- โœ… Base64 ๋””์ฝ”๋”ฉ
28
- โœ… zipfile๋กœ ์••์ถ• ํ•ด์ œ
29
- โœ… ์ž„์‹œ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ (/tmp/wallet_)
30
- โœ… ํŒŒ์ผ ๊ถŒํ•œ ์„ค์ • (0o600)
31
- โœ… WALLET_DIR, WALLET_PASSWORD ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
32
- โœ… uvicorn subprocess ์‹คํ–‰
33
- ```
34
-
35
- **์ž‘๋™ ํ๋ฆ„:**
36
- ```
37
- start.py ์‹คํ–‰
38
- โ†“
39
- prepare_wallet_dir()
40
- โ†“
41
- ํ™˜๊ฒฝ ๋ณ€์ˆ˜: WALLET_DIR, WALLET_PASSWORD ์„ค์ •
42
- โ†“
43
- uvicorn app:app ์‹คํ–‰
44
- โ†“
45
- app.py๊ฐ€ WALLET_DIR ์‚ฌ์šฉ
46
- ```
47
-
48
- ### 2. app.py โœ…
49
- ```python
50
- โœ… ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ฝ๊ธฐ:
51
- - DB_USER
52
- - DB_PASSWORD
53
- - WALLET_DIR (start.py๊ฐ€ ์„ค์ •)
54
- - WALLET_PASSWORD (start.py๊ฐ€ ์„ค์ •)
55
- - DB_TNS_ALIAS
56
-
57
- โœ… oracledb.create_pool():
58
- - user, password
59
- - dsn=TNS_ALIAS
60
- - config_dir=WALLET_DIR
61
- - wallet_location=WALLET_DIR
62
- - wallet_password=WALLET_PASSWORD
63
-
64
- โœ… ์—”๋“œํฌ์ธํŠธ:
65
- - GET /health โ†’ DB ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ
66
- - POST /upload_state โ†’ user_state ํ…Œ์ด๋ธ” UPSERT
67
- - POST /upload_logs โ†’ fatigue_logs ํ…Œ์ด๋ธ” INSERT
68
- ```
69
-
70
- ### 3. Dockerfile โœ…
71
- ```dockerfile
72
- โœ… Python 3.10-slim
73
- โœ… requirements.txt ์„ค์น˜
74
- โœ… ์ฝ”๋“œ ๋ณต์‚ฌ
75
- โœ… CMD ["python", "start.py"] โ† ์ค‘์š”!
76
- ```
77
-
78
- ### 4. requirements.txt โœ…
79
- ```
80
- โœ… fastapi
81
- โœ… uvicorn
82
- โœ… python-multipart
83
- โœ… oracledb>=2.3
84
- โœ… pydantic
85
- ```
86
-
87
- ### 5. .gitignore โœ…
88
- ```
89
- โœ… .env
90
- โœ… wallet/
91
- โœ… *.zip
92
- โœ… wallet_base64.txt
93
- โœ… __pycache__/
94
- ```
95
-
96
- ---
97
-
98
- ## ๐Ÿ” ๋ณด์•ˆ ๊ฒ€์ˆ˜
99
-
100
- ### โœ… Git ์ œ์™ธ ํŒŒ์ผ
101
- ```bash
102
- git status | grep -E "(\.env|wallet/)"
103
- ```
104
- **๊ฒฐ๊ณผ:** `.gitignore` ํ™•์ธ โ†’ ์ œ์™ธ๋จ โœ…
105
-
106
- ### โœ… ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์‚ฌ์šฉ
107
- - ๋ชจ๋“  ๋ฏผ๊ฐ ์ •๋ณด๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌ
108
- - ์ฝ”๋“œ์— ํ•˜๋“œ์ฝ”๋”ฉ ์—†์Œ
109
-
110
- ### โœ… Wallet ๋ณดํ˜ธ
111
- - Git์— ํฌํ•จ ์•ˆ ๋จ
112
- - Base64๋กœ Secrets์— ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅ
113
-
114
- ---
115
-
116
- ## ๐Ÿ“ก API ๊ฒ€์ˆ˜
117
-
118
- ### ์—”๋“œํฌ์ธํŠธ ๊ตฌ์กฐ
119
-
120
- #### GET /health
121
- ```python
122
- โœ… pool.acquire() ์‚ฌ์šฉ
123
- โœ… SELECT 1 FROM DUAL
124
- โœ… ์—ฐ๊ฒฐ ์ƒํƒœ ๋ฐ˜ํ™˜
125
- ```
126
-
127
- #### POST /upload_state
128
- ```python
129
- โœ… StatePayload ๊ฒ€์ฆ
130
- โœ… user_emb ๊ธธ์ด ์ฒดํฌ (12)
131
- โœ… MERGE INTO MuscleCare.user_state
132
- โœ… CLOB JSON ์ €์žฅ
133
- โœ… ํŠธ๋žœ์žญ์…˜ commit
134
- ```
135
-
136
- #### POST /upload_logs
137
- ```python
138
- โœ… LogsPayload ๊ฒ€์ฆ
139
- โœ… executemany๋กœ ๋ฐฐ์น˜ INSERT
140
- โœ… MuscleCare.fatigue_logs ํ…Œ์ด๋ธ”
141
- โœ… ํŠธ๋žœ์žญ์…˜ commit
142
- ```
143
-
144
- ---
145
-
146
- ## ๐ŸŒ ๋ฐฐํฌ ํ”Œ๋กœ์šฐ ๊ฒ€์ˆ˜
147
-
148
- ### Hugging Face Space ์‹คํ–‰ ์ˆœ์„œ:
149
-
150
- ```
151
- 1. Docker ๋นŒ๋“œ
152
- โ†“
153
- 2. start.py ์‹คํ–‰
154
- โ†“
155
- 3. prepare_wallet_dir()
156
- - WALLET_ZIP_B64 ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ฝ๊ธฐ (Secrets)
157
- - Base64 ๋””์ฝ”๋”ฉ
158
- - /tmp/wallet_xxxxx์— ์••์ถ• ํ•ด์ œ
159
- - WALLET_DIR ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
160
- โ†“
161
- 4. uvicorn ์‹คํ–‰
162
- - app:app ๋กœ๋“œ
163
- โ†“
164
- 5. app.py ์ดˆ๊ธฐํ™”
165
- - ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ฝ๊ธฐ
166
- - oracledb.create_pool() (WALLET_DIR ์‚ฌ์šฉ)
167
- โ†“
168
- 6. โœ… ์„œ๋ฒ„ ์‹คํ–‰ ์™„๋ฃŒ
169
- ```
170
-
171
- ---
172
-
173
- ## ๐Ÿงช ํ…Œ์ŠคํŠธ ์ฒดํฌ๋ฆฌ์ŠคํŠธ
174
-
175
- ### ๋กœ์ปฌ ํ…Œ์ŠคํŠธ (์„ ํƒ):
176
- - [ ] wallet/ ๋””๋ ‰ํ† ๋ฆฌ ์ค€๋น„
177
- - [ ] ํ™˜๊ฒฝ ๋ณ€์ˆ˜ export
178
- - [ ] `python app.py` ์‹คํ–‰
179
- - [ ] `curl http://localhost:7860/health` ์„ฑ๊ณต
180
-
181
- ### ๋ฐฐํฌ ํ›„ ํ…Œ์ŠคํŠธ (ํ•„์ˆ˜):
182
- - [ ] Logs์— "โœ… Wallet ์••์ถ• ํ•ด์ œ ์™„๋ฃŒ"
183
- - [ ] Logs์— "Uvicorn running"
184
- - [ ] `curl https://[username]-xxx.hf.space/health`
185
- - [ ] ์‘๋‹ต: `{"ok": true, "db": 1}`
186
- - [ ] `/docs` ํŽ˜์ด์ง€ ์ ‘๊ทผ ๊ฐ€๋Šฅ
187
-
188
- ---
189
-
190
- ## โŒ ๋ฐœ๊ฒฌ๋œ ๋ฌธ์ œ์ 
191
-
192
- ### ์—†์Œ! โœ…
193
-
194
- ๋ชจ๋“  ํŒŒ์ผ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
195
-
196
- ---
197
-
198
- ## ๐ŸŽฏ ๋‹ค์Œ ๋‹จ๊ณ„
199
-
200
- ### 1. Hugging Face Secrets ์„ค์ • (5๊ฐœ)
201
-
202
- `HF_SECRETS_์„ค์ •.md` ์ฐธ์กฐ
203
-
204
- ### 2. Git Push
205
-
206
- ```bash
207
- git add .
208
- git commit -m "Ready for deployment"
209
- git push
210
- ```
211
-
212
- ### 3. ๋ฐฐํฌ ํ™•์ธ
213
-
214
- - Logs ํ™•์ธ
215
- - API ํ…Œ์ŠคํŠธ
216
- - ๋ฌธ์„œ ํ™•์ธ
217
-
218
- ---
219
-
220
- ## ๐Ÿ“ ์ตœ์ข… ์š”์•ฝ
221
-
222
- | ํ•ญ๋ชฉ | ์ƒํƒœ |
223
- |------|------|
224
- | **์ฝ”๋“œ ๊ตฌ์กฐ** | โœ… ์™„๋ฒฝ |
225
- | **๋ณด์•ˆ** | โœ… .gitignore ์„ค์ •๋จ |
226
- | **Wallet ์ฒ˜๋ฆฌ** | โœ… start.py๋กœ ์ž๋™ํ™” |
227
- | **Docker ์„ค์ •** | โœ… start.py ์‹คํ–‰ |
228
- | **ํ™˜๊ฒฝ ๋ณ€์ˆ˜** | โœ… Secrets๋กœ ๊ด€๋ฆฌ |
229
- | **API ๊ตฌ์กฐ** | โœ… ๊ฐ„๊ฒฐํ•˜๊ณ  ํšจ์œจ์  |
230
- | **๋ฐฐํฌ ์ค€๋น„** | โœ… ์™„๋ฃŒ |
231
-
232
- ---
233
-
234
- **๊ฒ€์ˆ˜ ๊ฒฐ๊ณผ: ๋ฐฐํฌ ๊ฐ€๋Šฅ! ๐Ÿš€**
235
-
236
- Git push๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค!
237
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
๋ฐฐํฌ_์ฒดํฌ๋ฆฌ์ŠคํŠธ.md DELETED
@@ -1,191 +0,0 @@
1
- # โœ… ๋ฐฐํฌ ์ตœ์ข… ์ฒดํฌ๋ฆฌ์ŠคํŠธ
2
-
3
- ## ๐Ÿ“‹ ํŒŒ์ผ ๊ตฌ์กฐ ๊ฒ€์ˆ˜
4
-
5
- ### โœ… ํ•„์ˆ˜ ํŒŒ์ผ (Git์— ํฌํ•จ)
6
- - [x] `start.py` - Wallet ๋””์ฝ”๋”ฉ ๋ฐ ์„œ๋ฒ„ ๋ถ€ํŒ…
7
- - [x] `app.py` - FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
8
- - [x] `Dockerfile` - start.py ์‹คํ–‰
9
- - [x] `requirements.txt` - ์˜์กด์„ฑ
10
- - [x] `.gitignore` - ๋ณด์•ˆ ํŒŒ์ผ ์ œ์™ธ
11
- - [x] `README.md` - ํ”„๋กœ์ ํŠธ ์„ค๋ช…
12
- - [x] `env_example.txt` - ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์˜ˆ์‹œ
13
-
14
- ### โŒ ์ œ์™ธ ํŒŒ์ผ (Git์— ํฌํ•จ ์•ˆ ๋จ)
15
- - [ ] `.env` - ๋กœ์ปฌ ํ™˜๊ฒฝ ๋ณ€์ˆ˜
16
- - [ ] `wallet/` - Wallet ํŒŒ์ผ๋“ค
17
- - [ ] `wallet_base64.txt` - Base64 ์ธ์ฝ”๋”ฉ ํŒŒ์ผ
18
- - [ ] `*.zip` - Wallet ์••์ถ• ํŒŒ์ผ
19
-
20
- ---
21
-
22
- ## ๐Ÿ” Hugging Face Secrets (5๊ฐœ)
23
-
24
- ### ํ•„์ˆ˜ Secrets:
25
-
26
- | Secret Name | ์„ค์ •๋จ? | Value ์˜ˆ์‹œ |
27
- |-------------|---------|-----------|
28
- | `DB_USER` | [ ] | `ADMIN` |
29
- | `DB_PASSWORD` | [ ] | Oracle DB ๋น„๋ฐ€๋ฒˆํ˜ธ |
30
- | `DB_TNS_ALIAS` | [ ] | `musclecare_high` |
31
- | `WALLET_ZIP_B64` | [ ] | Base64 ์ธ์ฝ”๋”ฉ๋œ Wallet |
32
- | `WALLET_PASSWORD` | [ ] | Wallet ๋น„๋ฐ€๋ฒˆํ˜ธ |
33
-
34
- ---
35
-
36
- ## ๐Ÿ” ์ฝ”๋“œ ๊ฒ€์ˆ˜
37
-
38
- ### start.py
39
- ```python
40
- โœ… WALLET_ZIP_B64 ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ฝ๊ธฐ
41
- โœ… Base64 ๋””์ฝ”๋”ฉ
42
- โœ… ์ž„์‹œ ๋””๋ ‰ํ† ๋ฆฌ์— ์••์ถ• ํ•ด์ œ
43
- โœ… WALLET_DIR, WALLET_PASSWORD ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
44
- โœ… uvicorn์œผ๋กœ FastAPI ์‹คํ–‰
45
- ```
46
-
47
- ### app.py
48
- ```python
49
- โœ… ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ DB ์„ค์ • ์ฝ๊ธฐ
50
- โœ… Wallet ๊ฒฝ๋กœ ์‚ฌ์šฉ
51
- โœ… ์—ฐ๊ฒฐ ํ’€ ์ƒ์„ฑ (Thin mode + mTLS)
52
- โœ… /health ์—”๋“œํฌ์ธํŠธ
53
- โœ… /upload_state ์—”๋“œํฌ์ธํŠธ (MERGE INTO)
54
- โœ… /upload_logs ์—”๋“œํฌ์ธํŠธ (executemany)
55
- ```
56
-
57
- ### Dockerfile
58
- ```dockerfile
59
- โœ… Python 3.10-slim
60
- โœ… requirements.txt ์„ค์น˜
61
- โœ… start.py๋กœ ์‹คํ–‰
62
- โœ… ํฌํŠธ 7860 ๋…ธ์ถœ
63
- ```
64
-
65
- ### requirements.txt
66
- ```
67
- โœ… fastapi
68
- โœ… uvicorn
69
- โœ… python-multipart
70
- โœ… oracledb>=2.3
71
- โœ… pydantic
72
- ```
73
-
74
- ---
75
-
76
- ## ๐Ÿงช ๋ฐฐํฌ ์ „ ๋กœ์ปฌ ํ…Œ์ŠคํŠธ
77
-
78
- ### ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ • (๋กœ์ปฌ)
79
-
80
- ```bash
81
- export DB_USER="ADMIN"
82
- export DB_PASSWORD="your_db_password"
83
- export DB_TNS_ALIAS="musclecare_high"
84
- export WALLET_DIR="/Users/gimhyeon-u/workspace/MuscleCare-FastAPI/wallet"
85
- export WALLET_PASSWORD="your_wallet_password"
86
- ```
87
-
88
- ### ์„œ๋ฒ„ ์‹คํ–‰
89
-
90
- ```bash
91
- python app.py
92
- ```
93
-
94
- ๋˜๋Š” start.py๋กœ:
95
-
96
- ```bash
97
- # Wallet zip ํŒŒ์ผ ์ค€๋น„ ํ•„์š”
98
- python start.py
99
- ```
100
-
101
- ---
102
-
103
- ## ๐Ÿš€ ๋ฐฐํฌ ๋ช…๋ น์–ด
104
-
105
- ### 1. Git ์ƒํƒœ ํ™•์ธ
106
-
107
- ```bash
108
- git status
109
- ```
110
-
111
- **ํ™•์ธ:**
112
- - โŒ `.env` ์—†์–ด์•ผ ํ•จ
113
- - โŒ `wallet/` ์—†์–ด์•ผ ํ•จ
114
- - โŒ `wallet_base64.txt` ์—†์–ด์•ผ ํ•จ
115
-
116
- ### 2. Git ์ปค๋ฐ‹ ๋ฐ ํ‘ธ์‹œ
117
-
118
- ```bash
119
- git add .
120
- git commit -m "Deploy to HF with Wallet mTLS"
121
- git push
122
- ```
123
-
124
- ---
125
-
126
- ## ๐Ÿ”„ ๋ฐฐํฌ ํ›„ ํ™•์ธ
127
-
128
- ### 1. Logs ํ™•์ธ
129
-
130
- Hugging Face Space โ†’ **Logs** ํƒญ
131
-
132
- **์„ฑ๊ณต ๋ฉ”์‹œ์ง€:**
133
- ```
134
- ๐Ÿ” Wallet ๋””์ฝ”๋”ฉ ์‹œ์ž‘...
135
- ๐Ÿ“ ์ž„์‹œ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ: /tmp/wallet_xxxxx
136
- โœ… Wallet ์••์ถ• ํ•ด์ œ ์™„๋ฃŒ
137
- โœ… tnsnames.ora ํ™•์ธ
138
- INFO: Uvicorn running on http://0.0.0.0:7860
139
- ```
140
-
141
- ### 2. API ํ…Œ์ŠคํŠธ
142
-
143
- ```bash
144
- curl https://[username]-musclecare-api.hf.space/health
145
- ```
146
-
147
- **๊ธฐ๋Œ€ ์‘๋‹ต:**
148
- ```json
149
- {"ok": true, "db": 1}
150
- ```
151
-
152
- ### 3. API ๋ฌธ์„œ
153
-
154
- ```
155
- https://[username]-musclecare-api.hf.space/docs
156
- ```
157
-
158
- ---
159
-
160
- ## ๐Ÿ”ง ๋ฌธ์ œ ํ•ด๊ฒฐ
161
-
162
- ### "WALLET_ZIP_B64 ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค"
163
-
164
- - [ ] Secrets ์ด๋ฆ„ ํ™•์ธ: `WALLET_ZIP_B64` (์ •ํ™•ํžˆ)
165
- - [ ] Secret ๊ฐ’ ํ™•์ธ: wallet_base64.txt ์ „์ฒด ๋‚ด์šฉ
166
- - [ ] Space ์žฌ์‹œ์ž‘
167
-
168
- ### "Wallet ์••์ถ• ํ•ด์ œ ์‹คํŒจ"
169
-
170
- - [ ] Base64 ์ธ์ฝ”๋”ฉ ์žฌ์‹œ๋„
171
- - [ ] Wallet zip ํŒŒ์ผ์ด ์†์ƒ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธ
172
-
173
- ### "DB ์—ฐ๊ฒฐ ์‹คํŒจ"
174
-
175
- - [ ] Oracle DB ์ƒํƒœ AVAILABLE ํ™•์ธ
176
- - [ ] `DB_PASSWORD` ํ™•์ธ
177
- - [ ] `DB_TNS_ALIAS` ํ™•์ธ
178
-
179
- ---
180
-
181
- ## โœ… ์ตœ์ข… ์ฒดํฌ
182
-
183
- - [ ] Dockerfile์ด start.py ์‹คํ–‰ํ•˜๋„๋ก ์ˆ˜์ •๋จ
184
- - [ ] .gitignore ์ƒ์„ฑ๋จ
185
- - [ ] README.md ์—…๋ฐ์ดํŠธ๋จ
186
- - [ ] env_example.txt ์ƒ์„ฑ๋จ
187
- - [ ] Git์— ๋ฏผ๊ฐ ํŒŒ์ผ ์ œ์™ธ ํ™•์ธ
188
- - [ ] 5๊ฐœ Secrets ์„ค์ • ์ค€๋น„๋จ
189
-
190
- **๋ชจ๋“  ์ค€๋น„ ์™„๋ฃŒ!** ๐ŸŽ‰
191
-