๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ํ ํ์ธ ๋ฐฉ๋ฒ
1. Hugging Face Spaces์์ ํ์ธ
๋ฐฉ๋ฒ 1: Logs ํญ ํ์ธ
- Hugging Face Spaces ํ์ด์ง๋ก ์ด๋
- Logs ํญ ํด๋ฆญ
- ๋ค์ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ํ์ธ:
PostgreSQL ์ฐ๊ฒฐ ์ฑ๊ณต ์:
[๋ฐ์ดํฐ๋ฒ ์ด์ค] PostgreSQL ์ฐ๊ฒฐ ์๋: postgresql://***@...
[๋ฐ์ดํฐ๋ฒ ์ด์ค] PostgreSQL ์ฐ๊ฒฐ ์ฑ๊ณต! ๋ฒ์ : PostgreSQL 15.x...
[๋ฐ์ดํฐ๋ฒ ์ด์ค] ํ
์ด๋ธ ์์ฑ ์๋ฃ
SQLite ์ฌ์ฉ ์:
[๋ฐ์ดํฐ๋ฒ ์ด์ค] SQLite ์ฌ์ฉ: sqlite:///...
[๋ฐ์ดํฐ๋ฒ ์ด์ค] ํ
์ด๋ธ ์์ฑ ์๋ฃ
PostgreSQL ์ฐ๊ฒฐ ์คํจ ์:
[๋ฐ์ดํฐ๋ฒ ์ด์ค] PostgreSQL ์ฐ๊ฒฐ ์คํจ: ...
[๋ฐ์ดํฐ๋ฒ ์ด์ค] SQLite๋ก ํด๋ฐฑํฉ๋๋ค.
๋ฐฉ๋ฒ 2: API ์๋ํฌ์ธํธ ์ฌ์ฉ (๊ถ์ฅ)
- ๊ด๋ฆฌ์๋ก ๋ก๊ทธ์ธ
- ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ(F12) ์ด๊ธฐ
- Console ํญ์์ ๋ค์ ๋ช ๋ น ์คํ:
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 ์ฐ๊ฒฐ ์ฑ๊ณต):
{
"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 ์ฌ์ฉ):
{
"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: ๋ก๊ทธ ํ์ผ ํ์ธ
# ์ต๊ทผ ๋ก๊ทธ ํ์ธ
Get-Content logs\server.log -Tail 50 | Select-String "๋ฐ์ดํฐ๋ฒ ์ด์ค"
๋ฐฉ๋ฒ 2: API ์๋ํฌ์ธํธ ์ฌ์ฉ
๋ธ๋ผ์ฐ์ ์์:
http://localhost:5001/api/admin/database/status
๋๋ PowerShell์์:
Invoke-RestMethod -Uri "http://localhost:5001/api/admin/database/status" -Method GET -SessionVariable session
๋ฐฉ๋ฒ 3: 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์ธ ๊ฒฝ์ฐ
-- ์ฐ๊ฒฐ ํ์ธ
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์ธ ๊ฒฝ์ฐ
# 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 ์ฐ๊ฒฐ์ด ์ ๋๋ ๊ฒฝ์ฐ
ํ๊ฒฝ ๋ณ์ ํ์ธ
- Hugging Face Spaces > Settings > Repository secrets
DATABASE_URL์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์ด ์๋์ง ํ์ธ- ํ์:
postgresql://user:password@host:port/database
์ฐ๊ฒฐ ์ ๋ณด ํ์ธ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ์คํธ, ํฌํธ, ์ฌ์ฉ์๋ช , ๋น๋ฐ๋ฒํธ๊ฐ ์ฌ๋ฐ๋ฅธ์ง ํ์ธ
- ๋ฐฉํ๋ฒฝ ์ค์ ํ์ธ
๋ก๊ทธ ํ์ธ
- Logs ํญ์์ ์ ํํ ์ค๋ฅ ๋ฉ์์ง ํ์ธ
- ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฌธ์ ํด๊ฒฐ
SQLite๋ก ํด๋ฐฑ๋ ๊ฒฝ์ฐ
- PostgreSQL ์ฐ๊ฒฐ์ด ์คํจํ๋ฉด ์๋์ผ๋ก SQLite๋ก ํด๋ฐฑ๋ฉ๋๋ค
- ์ด ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ ์ปจํ ์ด๋ ๋ด๋ถ์ ์ ์ฅ๋์ด ์ ๋ฐ์ดํธ ์ ์ญ์ ๋ฉ๋๋ค
- PostgreSQL ์ฐ๊ฒฐ์ ์์ ํด์ผ ๋ฐ์ดํฐ๊ฐ ์๊ตฌ์ ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค
์ค์ ์ด ์ฌ๋ผ์ง๋ ๊ฒฝ์ฐ
๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ ํ์ธ
- SQLite๋ฅผ ์ฌ์ฉ ์ค์ด๋ฉด ์ ๋ฐ์ดํธ ์ ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋ฉ๋๋ค
- PostgreSQL์ ์ฌ์ฉํด์ผ ๋ฐ์ดํฐ๊ฐ ์๊ตฌ์ ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค
์ค์ ์ ์ฅ ํ์ธ
- ๊ด๋ฆฌ์ ํ์ด์ง์์ ์ค์ ์ ์ ์ฅํ ํ
/api/admin/database/status๋กconfig_countํ์ธ- ์ ์ฅ ํ์๋ ๊ฐ์๊ฐ ์ฆ๊ฐํ์ง ์์ผ๋ฉด ์ ์ฅ ๋ก์ง์ ๋ฌธ์ ๊ฐ ์์ ์ ์์ต๋๋ค
5. ์๋ ํ์ธ ์คํฌ๋ฆฝํธ
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 ์คํฌ๋ฆฝํธ
# 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']}")