| # ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ํ ํ์ธ ๋ฐฉ๋ฒ | |
| ## 1. Hugging Face Spaces์์ ํ์ธ | |
| ### ๋ฐฉ๋ฒ 1: Logs ํญ ํ์ธ | |
| 1. Hugging Face Spaces ํ์ด์ง๋ก ์ด๋ | |
| 2. **Logs** ํญ ํด๋ฆญ | |
| 3. ๋ค์ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ํ์ธ: | |
| **PostgreSQL ์ฐ๊ฒฐ ์ฑ๊ณต ์:** | |
| ``` | |
| [๋ฐ์ดํฐ๋ฒ ์ด์ค] PostgreSQL ์ฐ๊ฒฐ ์๋: postgresql://***@... | |
| [๋ฐ์ดํฐ๋ฒ ์ด์ค] PostgreSQL ์ฐ๊ฒฐ ์ฑ๊ณต! ๋ฒ์ : PostgreSQL 15.x... | |
| [๋ฐ์ดํฐ๋ฒ ์ด์ค] ํ ์ด๋ธ ์์ฑ ์๋ฃ | |
| ``` | |
| **SQLite ์ฌ์ฉ ์:** | |
| ``` | |
| [๋ฐ์ดํฐ๋ฒ ์ด์ค] SQLite ์ฌ์ฉ: sqlite:///... | |
| [๋ฐ์ดํฐ๋ฒ ์ด์ค] ํ ์ด๋ธ ์์ฑ ์๋ฃ | |
| ``` | |
| **PostgreSQL ์ฐ๊ฒฐ ์คํจ ์:** | |
| ``` | |
| [๋ฐ์ดํฐ๋ฒ ์ด์ค] PostgreSQL ์ฐ๊ฒฐ ์คํจ: ... | |
| [๋ฐ์ดํฐ๋ฒ ์ด์ค] SQLite๋ก ํด๋ฐฑํฉ๋๋ค. | |
| ``` | |
| ### ๋ฐฉ๋ฒ 2: API ์๋ํฌ์ธํธ ์ฌ์ฉ (๊ถ์ฅ) | |
| 1. ๊ด๋ฆฌ์๋ก ๋ก๊ทธ์ธ | |
| 2. ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ(F12) ์ด๊ธฐ | |
| 3. Console ํญ์์ ๋ค์ ๋ช ๋ น ์คํ: | |
| ```javascript | |
| fetch('/api/admin/database/status', { | |
| credentials: 'include' | |
| }) | |
| .then(res => res.json()) | |
| .then(data => { | |
| console.log('DB ์ฐ๊ฒฐ ์ํ:', data); | |
| console.log('์ฐ๊ฒฐ๋จ:', data.connected); | |
| console.log('DB ํ์ :', data.type); | |
| console.log('ํ ์ด๋ธ ๊ฐ์:', data.table_count); | |
| console.log('์ฌ์ฉ์ ๊ฐ์:', data.user_count); | |
| console.log('์ค์ ๊ฐ์:', data.config_count); | |
| }); | |
| ``` | |
| ๋๋ ๋ธ๋ผ์ฐ์ ์ฃผ์์ฐฝ์ ์ง์ ์ ๋ ฅ: | |
| ``` | |
| https://wiizm-soyailabs.hf.space/api/admin/database/status | |
| ``` | |
| **์๋ต ์์ (PostgreSQL ์ฐ๊ฒฐ ์ฑ๊ณต):** | |
| ```json | |
| { | |
| "connected": true, | |
| "type": "PostgreSQL", | |
| "uri_masked": "postgresql://***@host:port/database", | |
| "version": "PostgreSQL 15.3...", | |
| "test_query": "ํ์ฌ ์๊ฐ: 2025-01-08 12:34:56", | |
| "table_count": 10, | |
| "user_count": 1, | |
| "config_count": 2 | |
| } | |
| ``` | |
| **์๋ต ์์ (SQLite ์ฌ์ฉ):** | |
| ```json | |
| { | |
| "connected": true, | |
| "type": "SQLite", | |
| "uri_masked": "sqlite:///instance/finance_analysis.db", | |
| "version": "SQLite 3.42.0", | |
| "test_query": "ํ์ฌ ์๊ฐ: 2025-01-08 12:34:56", | |
| "table_count": 10, | |
| "user_count": 1, | |
| "config_count": 2 | |
| } | |
| ``` | |
| ## 2. ๋ก์ปฌ ์๋ฒ์์ ํ์ธ | |
| ### ๋ฐฉ๋ฒ 1: ๋ก๊ทธ ํ์ผ ํ์ธ | |
| ```powershell | |
| # ์ต๊ทผ ๋ก๊ทธ ํ์ธ | |
| Get-Content logs\server.log -Tail 50 | Select-String "๋ฐ์ดํฐ๋ฒ ์ด์ค" | |
| ``` | |
| ### ๋ฐฉ๋ฒ 2: API ์๋ํฌ์ธํธ ์ฌ์ฉ | |
| ๋ธ๋ผ์ฐ์ ์์: | |
| ``` | |
| http://localhost:5001/api/admin/database/status | |
| ``` | |
| ๋๋ PowerShell์์: | |
| ```powershell | |
| Invoke-RestMethod -Uri "http://localhost:5001/api/admin/database/status" -Method GET -SessionVariable session | |
| ``` | |
| ### ๋ฐฉ๋ฒ 3: Python ์คํฌ๋ฆฝํธ๋ก ํ์ธ | |
| ```python | |
| import requests | |
| # ๋ก๊ทธ์ธ (์ธ์ ์ ์ง) | |
| session = requests.Session() | |
| login_response = session.post('http://localhost:5001/login', data={ | |
| 'username': 'soymedia', | |
| 'password': 'your_password' | |
| }) | |
| # DB ์ํ ํ์ธ | |
| db_status = session.get('http://localhost:5001/api/admin/database/status') | |
| print(db_status.json()) | |
| ``` | |
| ## 3. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ง์ ํ์ธ | |
| ### PostgreSQL์ธ ๊ฒฝ์ฐ | |
| ```sql | |
| -- ์ฐ๊ฒฐ ํ์ธ | |
| SELECT version(); | |
| -- ํ ์ด๋ธ ๋ชฉ๋ก | |
| SELECT table_name | |
| FROM information_schema.tables | |
| WHERE table_schema = 'public'; | |
| -- ์ฌ์ฉ์ ๊ฐ์ | |
| SELECT COUNT(*) FROM "user"; | |
| -- ์ค์ ๊ฐ์ | |
| SELECT COUNT(*) FROM system_config; | |
| -- Gemini API ํค ํ์ธ (๋ง์คํน) | |
| SELECT key, | |
| CASE | |
| WHEN value IS NOT NULL THEN LEFT(value, 8) || '...' | |
| ELSE NULL | |
| END as masked_value | |
| FROM system_config | |
| WHERE key = 'gemini_api_key'; | |
| ``` | |
| ### SQLite์ธ ๊ฒฝ์ฐ | |
| ```bash | |
| # SQLite CLI ์คํ | |
| sqlite3 instance/finance_analysis.db | |
| # ํ ์ด๋ธ ๋ชฉ๋ก | |
| .tables | |
| # ์ฌ์ฉ์ ๊ฐ์ | |
| SELECT COUNT(*) FROM user; | |
| # ์ค์ ๊ฐ์ | |
| SELECT COUNT(*) FROM system_config; | |
| # Gemini API ํค ํ์ธ (๋ง์คํน) | |
| SELECT key, | |
| CASE | |
| WHEN value IS NOT NULL THEN substr(value, 1, 8) || '...' | |
| ELSE NULL | |
| END as masked_value | |
| FROM system_config | |
| WHERE key = 'gemini_api_key'; | |
| ``` | |
| ## 4. ๋ฌธ์ ํด๊ฒฐ | |
| ### PostgreSQL ์ฐ๊ฒฐ์ด ์ ๋๋ ๊ฒฝ์ฐ | |
| 1. **ํ๊ฒฝ ๋ณ์ ํ์ธ** | |
| - Hugging Face Spaces > Settings > Repository secrets | |
| - `DATABASE_URL`์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์ด ์๋์ง ํ์ธ | |
| - ํ์: `postgresql://user:password@host:port/database` | |
| 2. **์ฐ๊ฒฐ ์ ๋ณด ํ์ธ** | |
| - ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ์คํธ, ํฌํธ, ์ฌ์ฉ์๋ช , ๋น๋ฐ๋ฒํธ๊ฐ ์ฌ๋ฐ๋ฅธ์ง ํ์ธ | |
| - ๋ฐฉํ๋ฒฝ ์ค์ ํ์ธ | |
| 3. **๋ก๊ทธ ํ์ธ** | |
| - Logs ํญ์์ ์ ํํ ์ค๋ฅ ๋ฉ์์ง ํ์ธ | |
| - ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฌธ์ ํด๊ฒฐ | |
| ### SQLite๋ก ํด๋ฐฑ๋ ๊ฒฝ์ฐ | |
| - PostgreSQL ์ฐ๊ฒฐ์ด ์คํจํ๋ฉด ์๋์ผ๋ก SQLite๋ก ํด๋ฐฑ๋ฉ๋๋ค | |
| - ์ด ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ ์ปจํ ์ด๋ ๋ด๋ถ์ ์ ์ฅ๋์ด ์ ๋ฐ์ดํธ ์ ์ญ์ ๋ฉ๋๋ค | |
| - PostgreSQL ์ฐ๊ฒฐ์ ์์ ํด์ผ ๋ฐ์ดํฐ๊ฐ ์๊ตฌ์ ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค | |
| ### ์ค์ ์ด ์ฌ๋ผ์ง๋ ๊ฒฝ์ฐ | |
| 1. **๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ ํ์ธ** | |
| - SQLite๋ฅผ ์ฌ์ฉ ์ค์ด๋ฉด ์ ๋ฐ์ดํธ ์ ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋ฉ๋๋ค | |
| - PostgreSQL์ ์ฌ์ฉํด์ผ ๋ฐ์ดํฐ๊ฐ ์๊ตฌ์ ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค | |
| 2. **์ค์ ์ ์ฅ ํ์ธ** | |
| - ๊ด๋ฆฌ์ ํ์ด์ง์์ ์ค์ ์ ์ ์ฅํ ํ | |
| - `/api/admin/database/status`๋ก `config_count` ํ์ธ | |
| - ์ ์ฅ ํ์๋ ๊ฐ์๊ฐ ์ฆ๊ฐํ์ง ์์ผ๋ฉด ์ ์ฅ ๋ก์ง์ ๋ฌธ์ ๊ฐ ์์ ์ ์์ต๋๋ค | |
| ## 5. ์๋ ํ์ธ ์คํฌ๋ฆฝํธ | |
| ### PowerShell ์คํฌ๋ฆฝํธ (๋ก์ปฌ) | |
| ```powershell | |
| # check_db.ps1 | |
| $baseUrl = "http://localhost:5001" | |
| $username = "soymedia" | |
| $password = "your_password" | |
| # ๋ก๊ทธ์ธ | |
| $loginData = @{ | |
| username = $username | |
| password = $password | |
| } | ConvertTo-Json | |
| $session = New-Object Microsoft.PowerShell.Commands.WebRequestSession | |
| $loginResponse = Invoke-WebRequest -Uri "$baseUrl/login" ` | |
| -Method POST ` | |
| -Body $loginData ` | |
| -ContentType "application/json" ` | |
| -WebSession $session | |
| # DB ์ํ ํ์ธ | |
| $dbStatus = Invoke-RestMethod -Uri "$baseUrl/api/admin/database/status" ` | |
| -WebSession $session | |
| Write-Host "DB ์ฐ๊ฒฐ ์ํ:" -ForegroundColor Cyan | |
| Write-Host " ์ฐ๊ฒฐ๋จ: $($dbStatus.connected)" -ForegroundColor $(if ($dbStatus.connected) { "Green" } else { "Red" }) | |
| Write-Host " ํ์ : $($dbStatus.type)" | |
| Write-Host " ํ ์ด๋ธ ๊ฐ์: $($dbStatus.table_count)" | |
| Write-Host " ์ฌ์ฉ์ ๊ฐ์: $($dbStatus.user_count)" | |
| Write-Host " ์ค์ ๊ฐ์: $($dbStatus.config_count)" | |
| if ($dbStatus.error) { | |
| Write-Host " ์ค๋ฅ: $($dbStatus.error)" -ForegroundColor Red | |
| } | |
| ``` | |
| ### Python ์คํฌ๋ฆฝํธ | |
| ```python | |
| # check_db.py | |
| import requests | |
| BASE_URL = "http://localhost:5001" | |
| USERNAME = "soymedia" | |
| PASSWORD = "your_password" | |
| session = requests.Session() | |
| # ๋ก๊ทธ์ธ | |
| login_response = session.post( | |
| f"{BASE_URL}/login", | |
| json={"username": USERNAME, "password": PASSWORD} | |
| ) | |
| # DB ์ํ ํ์ธ | |
| db_status = session.get(f"{BASE_URL}/api/admin/database/status").json() | |
| print(f"DB ์ฐ๊ฒฐ ์ํ: {'โ ์ฐ๊ฒฐ๋จ' if db_status['connected'] else 'โ ์ฐ๊ฒฐ ์คํจ'}") | |
| print(f"DB ํ์ : {db_status['type']}") | |
| print(f"ํ ์ด๋ธ ๊ฐ์: {db_status['table_count']}") | |
| print(f"์ฌ์ฉ์ ๊ฐ์: {db_status['user_count']}") | |
| print(f"์ค์ ๊ฐ์: {db_status['config_count']}") | |
| if db_status.get('error'): | |
| print(f"์ค๋ฅ: {db_status['error']}") | |
| ``` | |