soyailabs / DB_CONNECTION_CHECK.md
SOY NV AI
Fix Ollama communication error and update Railway PostgreSQL setup guide
ef22967
|
raw
history blame
7.12 kB
# ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ƒํƒœ ํ™•์ธ ๋ฐฉ๋ฒ•
## 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']}")
```