60 lines
2.0 KiB
Markdown
60 lines
2.0 KiB
Markdown
(Fejlesztői kézikönyv.)
|
|
# 👨💻 DEVELOPER RUNBOOK
|
|
|
|
## 🚀 Indítás
|
|
```bash
|
|
cd /opt/docker/dev/service_finder
|
|
docker compose up -d
|
|
|
|
🔍 Logok és Debug
|
|
|
|
API log: docker logs -f service_finder_api
|
|
|
|
Frontend log: docker logs -f service_finder_frontend
|
|
|
|
DB Console: docker exec -it shared-postgres psql -U kincses -d service_finder
|
|
|
|
⚠️ Known Pitfalls (Hibaelhárítás)
|
|
|
|
API URL: A frontend .env fájljában a VITE_API_BASE_URL nem lehet localhost, ha konténerben fut. Használd a belső IP-t vagy domain-t.
|
|
|
|
Login 404: A /api/v1/users/me végpontot a backend routerben regisztrálni kell (jelenleg hiányzik vagy path mismatch van).
|
|
|
|
OpenAPI 404: A helyes cím /api/v2/openapi.json.
|
|
|
|
# 03. Development Environment Runbook
|
|
|
|
## 3.1. System Initialization (Bootstrap)
|
|
Ha az adatbázis üres (vagy törölve lett), az első SuperAdmin felhasználót manuálisan kell létrehozni, mivel a regisztrációs végpontok védettek vagy nem adnak admin jogot.
|
|
|
|
### 3.1.1. SuperAdmin Létrehozása (Recommended)
|
|
A jelszó hash-elési eltérések elkerülése érdekében használjuk a Python scriptet a konténeren belül:
|
|
|
|
```bash
|
|
docker exec -it service_finder_api python3 -c "
|
|
import bcrypt
|
|
import asyncio
|
|
from sqlalchemy import text
|
|
from app.db.session import SessionLocal
|
|
|
|
async def bootstrap_admin():
|
|
# 1. Jelszó generálás
|
|
password = 'InitialPassword123'.encode('utf-8')
|
|
hashed = bcrypt.hashpw(password, bcrypt.gensalt()).decode('utf-8')
|
|
|
|
async with SessionLocal() as db:
|
|
# 2. Person és User létrehozása/Frissítése
|
|
# (A script feltételezi, hogy a Person rekord már létezik vagy itt hozod létre)
|
|
sql = text(\"\"\"
|
|
UPDATE data.users
|
|
SET hashed_password = :h, role = 'superadmin', is_active = true, preferred_language = 'hu'
|
|
WHERE email = 'admin@servicefinder.hu'
|
|
\"\"\")
|
|
await db.execute(sql, {'h': hashed})
|
|
await db.commit()
|
|
print('✅ SuperAdmin Ready')
|
|
|
|
if __name__ == '__main__':
|
|
asyncio.run(bootstrap_admin())
|
|
"
|