ํ”„๋กœ์ ํŠธ

์ผ๋ฐ˜

์‚ฌ์šฉ์ž์ •๋ณด

Actions

์ƒˆ๊ธฐ๋Šฅ #52

์ง„ํ–‰์ค‘

์ƒˆ๊ธฐ๋Šฅ #44: ๐Ÿ“˜ Mangement Cloud server FastAPI ํ”„๋กœ์ ํŠธ

๐ŸŸฅ Epic 1 - Task (DB Init) ๐Ÿ—„๏ธ PostgreSQL ์ดˆ๊ธฐํ™” + User ํ…Œ์ด๋ธ” ์ƒ์„ฑ

minkyu park์ด(๊ฐ€) 20์ผ ์ „์— ์ถ”๊ฐ€ํ•จ.

์ƒํƒœ:
์‹ ๊ทœ
์šฐ์„ ์ˆœ์œ„:
๋ณดํ†ต
๋‹ด๋‹น์ž:
์‹œ์ž‘์ผ:
2026/10/01
์™„๋ฃŒ์ผ:
์ง„์ฒ™๋„:

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
  1. FastAPI ์„œ๋ฒ„ ์‹คํ–‰
uvicorn app.main:app --reload
  1. test_main.http์—์„œ ๋กœ๊ทธ์ธ ํ…Œ์ŠคํŠธ
### Login Test
POST http://127.0.0.1:8000/login
Content-Type: application/json

{
  "username": "admin",
  "password": "1234"
}
  1. ํ† ํฐ์œผ๋กœ /me ํ…Œ์ŠคํŠธ
GET http://127.0.0.1:8000/me
Authorization: Bearer {{token}}

๐Ÿ“Œ ์‚ฐ์ถœ๋ฌผ

  • user ํ…Œ์ด๋ธ” ์ƒ์„ฑ

  • admin ๊ณ„์ • ์ž๋™ ์ƒ์„ฑ

  • PostgreSQL ์ดˆ๊ธฐํ™” ์Šคํฌ๋ฆฝํŠธ ์™„์„ฑ

  • ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ์‹ค์ œ DB ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘

  • /me, /logout ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ

ํ‘œ์‹œํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Actions

๋‚ด๋ณด๋‚ด๊ธฐ Atom PDF