soyailabs / DB_CONNECTION_CHECK.md
SOY NV AI
Fix Ollama communication error and update Railway PostgreSQL setup guide
ef22967

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ƒํƒœ ํ™•์ธ ๋ฐฉ๋ฒ•

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 ํƒญ์—์„œ ๋‹ค์Œ ๋ช…๋ น ์‹คํ–‰:
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 ์—ฐ๊ฒฐ์ด ์•ˆ ๋˜๋Š” ๊ฒฝ์šฐ

  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 ์Šคํฌ๋ฆฝํŠธ (๋กœ์ปฌ)

# 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']}")