์๊ธฐ๋ฅ #52
์งํ์ค์๊ธฐ๋ฅ #44: ๐ Mangement Cloud server FastAPI ํ๋ก์ ํธ
๐ฅ Epic 1 - Task (DB Init) ๐๏ธ PostgreSQL ์ด๊ธฐํ + User ํ ์ด๋ธ ์์ฑ
0%
์ค๋ช
๐ฅ Epic 1 โ Task (DB Init)¶
๐๏ธ PostgreSQL ์ด๊ธฐํ + User ํ ์ด๋ธ ์์ฑ¶
๐ ์์ ๊ฐ์¶
FastAPI ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ์ค์ ๋ก ๋์์ํค๊ธฐ ์ํด
PostgreSQL์ user ํ ์ด๋ธ์ ์์ฑํ๊ณ ,
์ด๊ธฐ ๊ด๋ฆฌ์ ๊ณ์ ์ ๋ฑ๋กํ ์ ์๋ DB ์ด๊ธฐํ ์คํฌ๋ฆฝํธ(.sh)๋ฅผ ๋ง๋ ๋ค.
์ด ์คํฌ๋ฆฝํธ๋ mgmt ์๋ฒ ๋ฐฐํฌ ์
-
DB ํ ์ด๋ธ ์๋ ์์ฑ
-
์ด๊ธฐ admin ๊ณ์ ์๋ ์์ฑ์ ๋ด๋นํ๋ ํต์ฌ ์ด์ ๋๊ตฌ๊ฐ ๋๋ค.
๐ ๏ธ 1. User ๋ชจ๋ธ ์์ฑ¶
๐ app/models/user.py
from sqlalchemy import Column, String, DateTime
from datetime import datetime
from app.db import Base
class User(Base):
__tablename__ = "user"
username = Column(String(50), primary_key=True)
password_hash = Column(String(200))
nickname = Column(String(100))
expire = Column(DateTime, nullable=True)
last_login_time = Column(DateTime, nullable=True)
last_login_ip = Column(String(50), nullable=True)
๐ ์ค๊ณ ํฌ์ธํธ
-
username PK
-
password_hash SHA256 ๋๋ bcrypt
-
expire โ ๊ณ์ ๋ง๋ฃ์ผ
-
last_login_time / last_login_ip โ ๋ณด์ ๋ก๊ทธ์ฉ
๐ ๏ธ 2. DB ์ด๊ธฐํ ์คํฌ๋ฆฝํธ ์์ฑ¶
๐ scripts/db_init.sh
์๋ ์คํฌ๋ฆฝํธ๋
-
๋ชจ๋ SQLAlchemy ๋ชจ๋ธ ํ ์ด๋ธ ์์ฑ
-
admin ๊ณ์ ์๋ ์์ฑ๊น์ง ํฌํจํ๋ค.
#!/bin/bash
echo "๐ง PostgreSQL DB ์ด๊ธฐํ ์์..."
# Python์ผ๋ก ํ
์ด๋ธ ์์ฑ
python3 - << 'EOF'
from app.db import Base, engine, SessionLocal
from app.models.user import User
from app.models.server_master import ServerMaster
from app.models.server_status import ServerStatus
from app.models.server_control import ServerControl
from app.models.server_detail import ServerDetail
from app.core.security import hash_password
# ํ
์ด๋ธ ์์ฑ
Base.metadata.create_all(bind=engine)
# ์ด๊ธฐ admin ๊ณ์ ์์ฑ
db = SessionLocal()
admin = db.query(User).filter(User.username == "admin").first()
if not admin:
admin = User(
username="admin",
password_hash=hash_password("1234"),
nickname="๊ด๋ฆฌ์",
expire=None,
last_login_time=None,
last_login_ip=None
)
db.add(admin)
db.commit()
print("โ
admin ๊ณ์ ์์ฑ ์๋ฃ (username=admin, password=1234)")
else:
print("โน๏ธ admin ๊ณ์ ์ด๋ฏธ ์กด์ฌํจ")
db.close()
EOF
echo "๐ DB ์ด๊ธฐํ ์๋ฃ!"
๐ ์คํ ๋ฐฉ๋ฒ
chmod +x scripts/db_init.sh
./scripts/db_init.sh
๐ ๏ธ 3. DB ์ฐ๊ฒฐ ํ ์คํธ API¶
๐ app/routers/auth.py ๋๋ health.py
@router.get("/db-check")
def db_check(db: Session = Depends(get_db)):
return {"status": "ok"}
๐งช 4. ๋ก๊ทธ์ธ ํ ์คํธ ํ๋ฆ¶
1)DB ์ด๊ธฐํ ์คํ
./scripts/db_init.sh
- FastAPI ์๋ฒ ์คํ
uvicorn app.main:app --reload
- test_main.http์์ ๋ก๊ทธ์ธ ํ ์คํธ
### Login Test
POST http://127.0.0.1:8000/login
Content-Type: application/json
{
"username": "admin",
"password": "1234"
}
- ํ ํฐ์ผ๋ก /me ํ ์คํธ
GET http://127.0.0.1:8000/me
Authorization: Bearer {{token}}
๐ ์ฐ์ถ๋ฌผ
-
user ํ ์ด๋ธ ์์ฑ
-
admin ๊ณ์ ์๋ ์์ฑ
-
PostgreSQL ์ด๊ธฐํ ์คํฌ๋ฆฝํธ ์์ฑ
-
๋ก๊ทธ์ธ ๊ธฐ๋ฅ ์ค์ DB ๊ธฐ๋ฐ์ผ๋ก ๋์
-
/me, /logout ํ ์คํธ ๊ฐ๋ฅ
ํ์ํ ๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค.