Skip to content

s6ptember/fastapi-shop

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

18 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ›๏ธ FastAPI Shop - ะŸะพะปะฝะพั„ัƒะฝะบั†ะธะพะฝะฐะปัŒะฝั‹ะน ะธะฝั‚ะตั€ะฝะตั‚-ะผะฐะณะฐะทะธะฝ

Python FastAPI Vue.js Docker

ะกะพะฒั€ะตะผะตะฝะฝั‹ะน, ะผะฐััˆั‚ะฐะฑะธั€ัƒะตะผั‹ะน ะธะฝั‚ะตั€ะฝะตั‚-ะผะฐะณะฐะทะธะฝ ั REST API ะฝะฐ FastAPI ะธ SPA frontend ะฝะฐ Vue.js 3


๐Ÿ“‹ ะกะพะดะตั€ะถะฐะฝะธะต


๐ŸŽฏ ะž ะฟั€ะพะตะบั‚ะต

FastAPI Shop - ัั‚ะพ ัะพะฒั€ะตะผะตะฝะฝะพะต ะฒะตะฑ-ะฟั€ะธะปะพะถะตะฝะธะต ะดะปั ัะปะตะบั‚ั€ะพะฝะฝะพะน ะบะพะผะผะตั€ั†ะธะธ. ะŸั€ะพะตะบั‚ ะดะตะผะพะฝัั‚ั€ะธั€ัƒะตั‚ best practices ั€ะฐะทั€ะฐะฑะพั‚ะบะธ full-stack ะฟั€ะธะปะพะถะตะฝะธะน ั ั€ะฐะทะดะตะปะตะฝะธะตะผ backend ะธ frontend.

โœจ ะšะปัŽั‡ะตะฒั‹ะต ะฒะพะทะผะพะถะฝะพัั‚ะธ

  • ๐Ÿ›’ ะฃะฟั€ะฐะฒะปะตะฝะธะต ะบะพั€ะทะธะฝะพะน - ะดะพะฑะฐะฒะปะตะฝะธะต, ัƒะดะฐะปะตะฝะธะต, ะธะทะผะตะฝะตะฝะธะต ะบะพะปะธั‡ะตัั‚ะฒะฐ ั‚ะพะฒะฐั€ะพะฒ
  • ๐Ÿ“ฆ ะšะฐั‚ะฐะปะพะณ ั‚ะพะฒะฐั€ะพะฒ - ะฟั€ะพัะผะพั‚ั€ ั‚ะพะฒะฐั€ะพะฒ ั ั„ะธะปัŒั‚ั€ะฐั†ะธะตะน ะฟะพ ะบะฐั‚ะตะณะพั€ะธัะผ
  • ๐Ÿ” ะ”ะตั‚ะฐะปัŒะฝะฐั ะธะฝั„ะพั€ะผะฐั†ะธั - ะฟะพะดั€ะพะฑะฝั‹ะต ัั‚ั€ะฐะฝะธั†ั‹ ั‚ะพะฒะฐั€ะพะฒ
  • ๐Ÿ’พ ะŸะตั€ัะธัั‚ะตะฝั‚ะฝะพัั‚ัŒ ะดะฐะฝะฝั‹ั… - ัะพั…ั€ะฐะฝะตะฝะธะต ะบะพั€ะทะธะฝั‹ ะฒ localStorage
  • ๐ŸŽจ ะกะพะฒั€ะตะผะตะฝะฝั‹ะน UI - ะฐะดะฐะฟั‚ะธะฒะฝั‹ะน ะดะธะทะฐะนะฝ ะฝะฐ Tailwind CSS
  • ๐Ÿš€ Production-ready - ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธะน ะดะตะฟะปะพะน ั SSL ัะตั€ั‚ะธั„ะธะบะฐั‚ะฐะผะธ

๐Ÿ“ ะกั‚ั€ัƒะบั‚ัƒั€ะฐ ะฟั€ะพะตะบั‚ะฐ

fastapi-shop/
โ”‚
โ”œโ”€โ”€ backend/                      # Backend ั‡ะฐัั‚ัŒ (FastAPI)
โ”‚   โ”œโ”€โ”€ app/
โ”‚   โ”‚   โ”œโ”€โ”€ models/              # SQLAlchemy ะผะพะดะตะปะธ ะ‘ะ”
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ category.py     # ะœะพะดะตะปัŒ ะบะฐั‚ะตะณะพั€ะธะน
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ product.py      # ะœะพะดะตะปัŒ ั‚ะพะฒะฐั€ะพะฒ
โ”‚   โ”‚   โ”‚
โ”‚   โ”‚   โ”œโ”€โ”€ schemas/             # Pydantic ัั…ะตะผั‹ ะดะปั ะฒะฐะปะธะดะฐั†ะธะธ
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ cart.py         # ะกั…ะตะผั‹ ะบะพั€ะทะธะฝั‹
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ category.py     # ะกั…ะตะผั‹ ะบะฐั‚ะตะณะพั€ะธะน
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ product.py      # ะกั…ะตะผั‹ ั‚ะพะฒะฐั€ะพะฒ
โ”‚   โ”‚   โ”‚
โ”‚   โ”‚   โ”œโ”€โ”€ repositories/        # ะกะปะพะน ั€ะฐะฑะพั‚ั‹ ั ะ‘ะ” (Repository Pattern)
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ category_repository.py
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ product_repository.py
โ”‚   โ”‚   โ”‚
โ”‚   โ”‚   โ”œโ”€โ”€ services/            # ะ‘ะธะทะฝะตั-ะปะพะณะธะบะฐ ะฟั€ะธะปะพะถะตะฝะธั
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ cart_service.py
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ category_service.py
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ product_service.py
โ”‚   โ”‚   โ”‚
โ”‚   โ”‚   โ”œโ”€โ”€ routes/              # API endpoints (Controllers)
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ cart.py         # ะญะฝะดะฟะพะธะฝั‚ั‹ ะบะพั€ะทะธะฝั‹
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ categories.py   # ะญะฝะดะฟะพะธะฝั‚ั‹ ะบะฐั‚ะตะณะพั€ะธะน
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ products.py     # ะญะฝะดะฟะพะธะฝั‚ั‹ ั‚ะพะฒะฐั€ะพะฒ
โ”‚   โ”‚   โ”‚
โ”‚   โ”‚   โ”œโ”€โ”€ config.py            # ะšะพะฝั„ะธะณัƒั€ะฐั†ะธั ะฟั€ะธะปะพะถะตะฝะธั
โ”‚   โ”‚   โ”œโ”€โ”€ database.py          # ะะฐัั‚ั€ะพะนะบะฐ SQLAlchemy
โ”‚   โ”‚   โ””โ”€โ”€ main.py              # ะขะพั‡ะบะฐ ะฒั…ะพะดะฐ FastAPI
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ static/images/           # ะกั‚ะฐั‚ะธั‡ะตัะบะธะต ั„ะฐะนะปั‹ (ะธะทะพะฑั€ะฐะถะตะฝะธั)
โ”‚   โ”œโ”€โ”€ Dockerfile               # Docker ะพะฑั€ะฐะท backend
โ”‚   โ”œโ”€โ”€ requirements.txt         # Python ะทะฐะฒะธัะธะผะพัั‚ะธ
โ”‚   โ”œโ”€โ”€ run.py                   # ะกะบั€ะธะฟั‚ ะทะฐะฟัƒัะบะฐ ัะตั€ะฒะตั€ะฐ
โ”‚   โ””โ”€โ”€ seed_data.py            # ะ—ะฐะฟะพะปะฝะตะฝะธะต ะ‘ะ” ั‚ะตัั‚ะพะฒั‹ะผะธ ะดะฐะฝะฝั‹ะผะธ
โ”‚
โ”œโ”€โ”€ frontend/                     # Frontend ั‡ะฐัั‚ัŒ (Vue.js 3)
โ”‚   โ”œโ”€โ”€ src/
โ”‚   โ”‚   โ”œโ”€โ”€ components/          # Vue ะบะพะผะฟะพะฝะตะฝั‚ั‹
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ CartItem.vue    # ะญะปะตะผะตะฝั‚ ะบะพั€ะทะธะฝั‹
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ CategoryFilter.vue  # ะคะธะปัŒั‚ั€ ะบะฐั‚ะตะณะพั€ะธะน
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Header.vue      # ะจะฐะฟะบะฐ ัะฐะนั‚ะฐ
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ ProductCard.vue # ะšะฐั€ั‚ะพั‡ะบะฐ ั‚ะพะฒะฐั€ะฐ
โ”‚   โ”‚   โ”‚
โ”‚   โ”‚   โ”œโ”€โ”€ views/               # ะกั‚ั€ะฐะฝะธั†ั‹ ะฟั€ะธะปะพะถะตะฝะธั
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ HomePage.vue    # ะ“ะปะฐะฒะฝะฐั (ะบะฐั‚ะฐะปะพะณ)
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ProductDetailPage.vue  # ะ”ะตั‚ะฐะปะธ ั‚ะพะฒะฐั€ะฐ
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ CartPage.vue    # ะกั‚ั€ะฐะฝะธั†ะฐ ะบะพั€ะทะธะฝั‹
โ”‚   โ”‚   โ”‚
โ”‚   โ”‚   โ”œโ”€โ”€ stores/              # Pinia stores (State Management)
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ cart.js         # Store ะบะพั€ะทะธะฝั‹
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ products.js     # Store ั‚ะพะฒะฐั€ะพะฒ
โ”‚   โ”‚   โ”‚
โ”‚   โ”‚   โ”œโ”€โ”€ services/            # API ะบะปะธะตะฝั‚ั‹
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ api.js          # Axios ะบะพะฝั„ะธะณัƒั€ะฐั†ะธั ะธ ะผะตั‚ะพะดั‹
โ”‚   โ”‚   โ”‚
โ”‚   โ”‚   โ”œโ”€โ”€ router/              # Vue Router ะบะพะฝั„ะธะณัƒั€ะฐั†ะธั
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.js        # ะžะฟั€ะตะดะตะปะตะฝะธะต ะผะฐั€ัˆั€ัƒั‚ะพะฒ
โ”‚   โ”‚   โ”‚
โ”‚   โ”‚   โ”œโ”€โ”€ assets/              # ะกั‚ะฐั‚ะธั‡ะตัะบะธะต ั€ะตััƒั€ัั‹
โ”‚   โ”‚   โ”œโ”€โ”€ App.vue              # ะšะพั€ะฝะตะฒะพะน ะบะพะผะฟะพะฝะตะฝั‚
โ”‚   โ”‚   โ””โ”€โ”€ main.js              # ะขะพั‡ะบะฐ ะฒั…ะพะดะฐ ะฟั€ะธะปะพะถะตะฝะธั
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ Dockerfile               # Docker ะพะฑั€ะฐะท frontend
โ”‚   โ”œโ”€โ”€ nginx.conf               # ะšะพะฝั„ะธะณัƒั€ะฐั†ะธั Nginx ะดะปั SPA
โ”‚   โ”œโ”€โ”€ package.json             # NPM ะทะฐะฒะธัะธะผะพัั‚ะธ
โ”‚   โ””โ”€โ”€ vite.config.js          # ะšะพะฝั„ะธะณัƒั€ะฐั†ะธั Vite
โ”‚
โ”œโ”€โ”€ nginx/                        # Reverse proxy ะบะพะฝั„ะธะณัƒั€ะฐั†ะธั
โ”‚   โ””โ”€โ”€ nginx.conf               # ะ“ะปะฐะฒะฝะฐั ะบะพะฝั„ะธะณัƒั€ะฐั†ะธั Nginx
โ”‚
โ”œโ”€โ”€ docker-compose.yml            # ะžั€ะบะตัั‚ั€ะฐั†ะธั Docker ะบะพะฝั‚ะตะนะฝะตั€ะพะฒ
โ”œโ”€โ”€ deploy.sh                     # ะกะบั€ะธะฟั‚ ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะพะณะพ ะดะตะฟะปะพั
โ””โ”€โ”€ README.md                     # ะ”ะพะบัƒะผะตะฝั‚ะฐั†ะธั ะฟั€ะพะตะบั‚ะฐ

๐Ÿ” ะะฐะทะฝะฐั‡ะตะฝะธะต ะบะพะผะฟะพะฝะตะฝั‚ะพะฒ

Backend (FastAPI)

ะšะพะผะฟะพะฝะตะฝั‚ ะะฐะทะฝะฐั‡ะตะฝะธะต
models/ SQLAlchemy ะผะพะดะตะปะธ ะดะปั ั€ะฐะฑะพั‚ั‹ ั ะ‘ะ” (ORM)
schemas/ Pydantic ัั…ะตะผั‹ ะดะปั ะฒะฐะปะธะดะฐั†ะธะธ ะฒั…ะพะดัั‰ะธั…/ะธัั…ะพะดัั‰ะธั… ะดะฐะฝะฝั‹ั…
repositories/ ะ˜ะฝะบะฐะฟััƒะปัั†ะธั ะปะพะณะธะบะธ ั€ะฐะฑะพั‚ั‹ ั ะ‘ะ” (Repository Pattern)
services/ ะ‘ะธะทะฝะตั-ะปะพะณะธะบะฐ ะฟั€ะธะปะพะถะตะฝะธั (Service Layer)
routes/ HTTP endpoints ะธ ะผะฐั€ัˆั€ัƒั‚ะธะทะฐั†ะธั (Controllers)
config.py ะะฐัั‚ั€ะพะนะบะธ ะฟั€ะธะปะพะถะตะฝะธั (CORS, DB, ะฟัƒั‚ะธ)
database.py ะšะพะฝั„ะธะณัƒั€ะฐั†ะธั SQLAlchemy ะธ ัƒะฟั€ะฐะฒะปะตะฝะธะต ัะตััะธัะผะธ
main.py ะ˜ะฝะธั†ะธะฐะปะธะทะฐั†ะธั FastAPI, ะฟะพะดะบะปัŽั‡ะตะฝะธะต middleware ะธ ั€ะพัƒั‚ะตั€ะพะฒ

Frontend (Vue.js 3)

ะšะพะผะฟะพะฝะตะฝั‚ ะะฐะทะฝะฐั‡ะตะฝะธะต
components/ ะŸะตั€ะตะธัะฟะพะปัŒะทัƒะตะผั‹ะต UI ะบะพะผะฟะพะฝะตะฝั‚ั‹
views/ ะกั‚ั€ะฐะฝะธั†ั‹ ะฟั€ะธะปะพะถะตะฝะธั (ั€ะพัƒั‚ะธะฝะณ)
stores/ ะ“ะปะพะฑะฐะปัŒะฝะพะต ัะพัั‚ะพัะฝะธะต ะฟั€ะธะปะพะถะตะฝะธั (Pinia)
services/ HTTP ะบะปะธะตะฝั‚ ะดะปั ะฒะทะฐะธะผะพะดะตะนัั‚ะฒะธั ั API
router/ ะšะพะฝั„ะธะณัƒั€ะฐั†ะธั ะผะฐั€ัˆั€ัƒั‚ะธะทะฐั†ะธะธ (Vue Router)

๐Ÿ›  ะขะตั…ะฝะพะปะพะณะธั‡ะตัะบะธะน ัั‚ะตะบ

Backend

  • FastAPI 0.119.0 - ัะพะฒั€ะตะผะตะฝะฝั‹ะน, ะฑั‹ัั‚ั€ั‹ะน web-framework
  • SQLAlchemy 2.0.44 - ORM ะดะปั ั€ะฐะฑะพั‚ั‹ ั ะฑะฐะทะพะน ะดะฐะฝะฝั‹ั…
  • Pydantic 2.12.1 - ะฒะฐะปะธะดะฐั†ะธั ะดะฐะฝะฝั‹ั… ะธ ะฝะฐัั‚ั€ะพะตะบ
  • SQLite - ะปะตะณะบะพะฒะตัะฝะฐั ั€ะตะปัั†ะธะพะฝะฝะฐั ะกะฃะ‘ะ”
  • Uvicorn - ASGI ัะตั€ะฒะตั€ ะดะปั production

Frontend

  • Vue.js 3.5.22 - ะฟั€ะพะณั€ะตััะธะฒะฝั‹ะน JavaScript ั„ั€ะตะนะผะฒะพั€ะบ
  • Pinia 3.0.3 - ะพั„ะธั†ะธะฐะปัŒะฝั‹ะน state management ะดะปั Vue 3
  • Vue Router 4.5.1 - ั€ะพัƒั‚ะธะฝะณ ะดะปั SPA
  • Axios 1.12.2 - HTTP ะบะปะธะตะฝั‚
  • Tailwind CSS - utility-first CSS ั„ั€ะตะนะผะฒะพั€ะบ
  • Vite 7.1.7 - ะฑั‹ัั‚ั€ั‹ะน build tool

DevOps

  • Docker - ะบะพะฝั‚ะตะนะฝะตั€ะธะทะฐั†ะธั ะฟั€ะธะปะพะถะตะฝะธะน
  • Docker Compose - ะพั€ะบะตัั‚ั€ะฐั†ะธั multi-container ะฟั€ะธะปะพะถะตะฝะธะน
  • Nginx - reverse proxy ะธ ะฒะตะฑ-ัะตั€ะฒะตั€
  • Let's Encrypt - ะฑะตัะฟะปะฐั‚ะฝั‹ะต SSL ัะตั€ั‚ะธั„ะธะบะฐั‚ั‹
  • Certbot - ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะพะต ะพะฑะฝะพะฒะปะตะฝะธะต ัะตั€ั‚ะธั„ะธะบะฐั‚ะพะฒ

๐Ÿš€ ะ‘ั‹ัั‚ั€ั‹ะน ัั‚ะฐั€ั‚

ะŸั€ะตะดะฒะฐั€ะธั‚ะตะปัŒะฝั‹ะต ั‚ั€ะตะฑะพะฒะฐะฝะธั

  • Python 3.11+
  • Node.js 20+
  • npm/yarn
  • Git

ะ›ะพะบะฐะปัŒะฝะฐั ั€ะฐะทั€ะฐะฑะพั‚ะบะฐ

1๏ธโƒฃ ะšะปะพะฝะธั€ะพะฒะฐะฝะธะต ั€ะตะฟะพะทะธั‚ะพั€ะธั

git clone https://github.com/yourusername/fastapi-shop.git
cd fastapi-shop

2๏ธโƒฃ ะ—ะฐะฟัƒัะบ Backend

# ะŸะตั€ะตั…ะพะด ะฒ ะดะธั€ะตะบั‚ะพั€ะธัŽ backend
cd backend

# ะกะพะทะดะฐะฝะธะต ะฒะธั€ั‚ัƒะฐะปัŒะฝะพะณะพ ะพะบั€ัƒะถะตะฝะธั
python -m venv venv
source venv/bin/activate  # Linux/Mac
# ะธะปะธ
venv\Scripts\activate  # Windows

# ะฃัั‚ะฐะฝะพะฒะบะฐ ะทะฐะฒะธัะธะผะพัั‚ะตะน
pip install -r requirements.txt

# ะ—ะฐะฟะพะปะฝะตะฝะธะต ะฑะฐะทั‹ ะดะฐะฝะฝั‹ั… ั‚ะตัั‚ะพะฒั‹ะผะธ ะดะฐะฝะฝั‹ะผะธ
python seed_data.py

# ะ—ะฐะฟัƒัะบ ัะตั€ะฒะตั€ะฐ ั€ะฐะทั€ะฐะฑะพั‚ะบะธ
python run.py

Backend ะฑัƒะดะตั‚ ะดะพัั‚ัƒะฟะตะฝ ะฟะพ ะฐะดั€ะตััƒ: http://localhost:8000 API ะดะพะบัƒะผะตะฝั‚ะฐั†ะธั (Swagger UI): http://localhost:8000/api/docs

3๏ธโƒฃ ะ—ะฐะฟัƒัะบ Frontend

# ะŸะตั€ะตั…ะพะด ะฒ ะดะธั€ะตะบั‚ะพั€ะธัŽ frontend (ะฝะพะฒั‹ะน ั‚ะตั€ะผะธะฝะฐะป)
cd frontend

# ะฃัั‚ะฐะฝะพะฒะบะฐ ะทะฐะฒะธัะธะผะพัั‚ะตะน
npm install

# ะ—ะฐะฟัƒัะบ dev ัะตั€ะฒะตั€ะฐ
npm run dev

Frontend ะฑัƒะดะตั‚ ะดะพัั‚ัƒะฟะตะฝ ะฟะพ ะฐะดั€ะตััƒ: http://localhost:5173


๐ŸŒ ะ ะฐะทะฒะตั€ั‚ั‹ะฒะฐะฝะธะต

ะŸั€ะพะตะบั‚ ะฒะบะปัŽั‡ะฐะตั‚ ะฟะพะปะฝะพัั‚ัŒัŽ ะฐะฒั‚ะพะผะฐั‚ะธะทะธั€ะพะฒะฐะฝะฝั‹ะน ัะบั€ะธะฟั‚ ั€ะฐะทะฒะตั€ั‚ั‹ะฒะฐะฝะธั ะฝะฐ production ัะตั€ะฒะตั€ ั Ubuntu.

ะงั‚ะพ ะดะตะปะฐะตั‚ ัะบั€ะธะฟั‚ deploy.sh:

โœ… ะžะฑะฝะพะฒะปัะตั‚ ัะธัั‚ะตะผัƒ Ubuntu โœ… ะฃัั‚ะฐะฝะฐะฒะปะธะฒะฐะตั‚ Docker ะธ Docker Compose โœ… ะฃัั‚ะฐะฝะฐะฒะปะธะฒะฐะตั‚ Certbot ะดะปั SSL โœ… ะŸะพะปัƒั‡ะฐะตั‚ SSL ัะตั€ั‚ะธั„ะธะบะฐั‚ั‹ ะพั‚ Let's Encrypt โœ… ะะฐัั‚ั€ะฐะธะฒะฐะตั‚ Nginx ะบะฐะบ reverse proxy โœ… ะกะพะฑะธั€ะฐะตั‚ ะธ ะทะฐะฟัƒัะบะฐะตั‚ Docker ะบะพะฝั‚ะตะนะฝะตั€ั‹ โœ… ะ—ะฐะฟะพะปะฝัะตั‚ ะฑะฐะทัƒ ะดะฐะฝะฝั‹ั… ั‚ะตัั‚ะพะฒั‹ะผะธ ะดะฐะฝะฝั‹ะผะธ โœ… ะะฐัั‚ั€ะฐะธะฒะฐะตั‚ ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะพะต ะพะฑะฝะพะฒะปะตะฝะธะต SSL ัะตั€ั‚ะธั„ะธะบะฐั‚ะพะฒ

๐Ÿ“ฆ ะ˜ะฝัั‚ั€ัƒะบั†ะธั ะฟะพ ั€ะฐะทะฒะตั€ั‚ั‹ะฒะฐะฝะธัŽ

ะจะฐะณ 1: ะŸะพะดะณะพั‚ะพะฒะบะฐ ัะตั€ะฒะตั€ะฐ

# ะŸะพะดะบะปัŽั‡ะตะฝะธะต ะบ VPS ัะตั€ะฒะตั€ัƒ
ssh root@your-server-ip

# ะšะปะพะฝะธั€ะพะฒะฐะฝะธะต ั€ะตะฟะพะทะธั‚ะพั€ะธั
git clone https://github.com/yourusername/fastapi-shop.git
cd fastapi-shop

ะจะฐะณ 2: ะะฐัั‚ั€ะพะนะบะฐ DNS

ะŸะตั€ะตะด ะทะฐะฟัƒัะบะพะผ ัะบั€ะธะฟั‚ะฐ ัƒะฑะตะดะธั‚ะตััŒ, ั‡ั‚ะพ DNS ะทะฐะฟะธัะธ ะฒะฐัˆะตะณะพ ะดะพะผะตะฝะฐ ัƒะบะฐะทั‹ะฒะฐัŽั‚ ะฝะฐ IP ะฐะดั€ะตั ัะตั€ะฒะตั€ะฐ:

A ะทะฐะฟะธััŒ:     yourdomain.com    โ†’  SERVER_IP
A ะทะฐะฟะธััŒ:     www.yourdomain.com โ†’  SERVER_IP

ะŸั€ะพะฒะตั€ะธั‚ัŒ ะผะพะถะฝะพ ะบะพะผะฐะฝะดะพะน:

dig yourdomain.com +short
dig www.yourdomain.com +short

ะจะฐะณ 3: ะ—ะฐะฟัƒัะบ ัะบั€ะธะฟั‚ะฐ ะดะตะฟะปะพั

# ะกะดะตะปะฐั‚ัŒ ัะบั€ะธะฟั‚ ะธัะฟะพะปะฝัะตะผั‹ะผ
chmod +x deploy.sh

# ะ—ะฐะฟัƒัั‚ะธั‚ัŒ ั ะฟั€ะฐะฒะฐะผะธ root
sudo ./deploy.sh

ะจะฐะณ 4: ะ˜ะฝั‚ะตั€ะฐะบั‚ะธะฒะฝะฐั ะฝะฐัั‚ั€ะพะนะบะฐ

ะกะบั€ะธะฟั‚ ะทะฐะฟั€ะพัะธั‚ ัƒ ะฒะฐั:

  1. ะ”ะพะผะตะฝ (ะฝะฐะฟั€ะธะผะตั€: myshop.com)
  2. Email ะดะปั SSL (ะฝะฐะฟั€ะธะผะตั€: admin@myshop.com)
  3. ะะฐะทะฒะฐะฝะธะต ะผะฐะณะฐะทะธะฝะฐ (ะฝะฐะฟั€ะธะผะตั€: My Awesome Shop)

ะŸะพัะปะต ะฒะฒะพะดะฐ ะดะฐะฝะฝั‹ั… ัะบั€ะธะฟั‚:

  • ะกะพะทะดะฐัั‚ ะบะพะฝั„ะธะณัƒั€ะฐั†ะธะพะฝะฝั‹ะต ั„ะฐะนะปั‹
  • ะŸะพะปัƒั‡ะธั‚ SSL ัะตั€ั‚ะธั„ะธะบะฐั‚ั‹
  • ะกะพะฑะตั€ะตั‚ ะธ ะทะฐะฟัƒัั‚ะธั‚ ะฒัะต ัะตั€ะฒะธัั‹

ะจะฐะณ 5: ะŸั€ะพะฒะตั€ะบะฐ ั€ะฐะฑะพั‚ะพัะฟะพัะพะฑะฝะพัั‚ะธ

ะŸะพัะปะต ะทะฐะฒะตั€ัˆะตะฝะธั ัะบั€ะธะฟั‚ะฐ ะฒะฐัˆ ะผะฐะณะฐะทะธะฝ ะฑัƒะดะตั‚ ะดะพัั‚ัƒะฟะตะฝ ะฟะพ ะฐะดั€ะตัะฐะผ:

  • ๐ŸŒ ะœะฐะณะฐะทะธะฝ: https://yourdomain.com
  • ๐ŸŒ API ะดะพะบัƒะผะตะฝั‚ะฐั†ะธั: https://yourdomain.com/api/docs
  • โœ… Health check: https://yourdomain.com/health

๐Ÿ”ง ะฃะฟั€ะฐะฒะปะตะฝะธะต ะฟะพัะปะต ะดะตะฟะปะพั

ะŸั€ะพัะผะพั‚ั€ ะปะพะณะพะฒ

# ะ’ัะต ัะตั€ะฒะธัั‹
docker compose logs -f

# ะขะพะปัŒะบะพ backend
docker compose logs -f backend

# ะขะพะปัŒะบะพ frontend
docker compose logs -f frontend

# Nginx
docker compose logs -f nginx

ะŸะตั€ะตะทะฐะฟัƒัะบ ัะตั€ะฒะธัะพะฒ

# ะŸะตั€ะตะทะฐะฟัƒัะบ ะฒัะตั… ะบะพะฝั‚ะตะนะฝะตั€ะพะฒ
docker compose restart

# ะŸะตั€ะตะทะฐะฟัƒัะบ ะบะพะฝะบั€ะตั‚ะฝะพะณะพ ัะตั€ะฒะธัะฐ
docker compose restart backend

ะžัั‚ะฐะฝะพะฒะบะฐ ะฟั€ะธะปะพะถะตะฝะธั

# ะžัั‚ะฐะฝะพะฒะธั‚ัŒ ะฒัะต ะบะพะฝั‚ะตะนะฝะตั€ั‹
docker compose down

# ะžัั‚ะฐะฝะพะฒะธั‚ัŒ ะธ ัƒะดะฐะปะธั‚ัŒ volumes (ะ‘ะ” ะฑัƒะดะตั‚ ัƒะดะฐะปะตะฝะฐ!)
docker compose down -v

ะžะฑะฝะพะฒะปะตะฝะธะต ะฟั€ะธะปะพะถะตะฝะธั

# ะŸะพะปัƒั‡ะธั‚ัŒ ะฟะพัะปะตะดะฝะธะต ะธะทะผะตะฝะตะฝะธั
git pull

# ะŸะตั€ะตัะพะฑั€ะฐั‚ัŒ ะธ ะฟะตั€ะตะทะฐะฟัƒัั‚ะธั‚ัŒ ะบะพะฝั‚ะตะนะฝะตั€ั‹
docker compose up -d --build

ะ ะตะทะตั€ะฒะฝะพะต ะบะพะฟะธั€ะพะฒะฐะฝะธะต ะ‘ะ”

# ะกะพะทะดะฐั‚ัŒ backup ะฑะฐะทั‹ ะดะฐะฝะฝั‹ั…
docker compose exec backend cp /app/shop.db /app/backup_shop.db

# ะกะบะพะฟะธั€ะพะฒะฐั‚ัŒ ะฝะฐ ั…ะพัั‚ ะผะฐัˆะธะฝัƒ
docker cp fashop_backend:/app/backup_shop.db ./backup_shop.db

๐Ÿ” SSL ัะตั€ั‚ะธั„ะธะบะฐั‚ั‹

ะกะตั€ั‚ะธั„ะธะบะฐั‚ั‹ ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ะพะฑะฝะพะฒะปััŽั‚ัั ั‡ะตั€ะตะท ะบะพะฝั‚ะตะนะฝะตั€ certbot ะบะฐะถะดั‹ะต 12 ั‡ะฐัะพะฒ.

ะ ัƒั‡ะฝะพะต ะพะฑะฝะพะฒะปะตะฝะธะต:

docker compose restart certbot

ะŸั€ะพะฒะตั€ะบะฐ ัั€ะพะบะฐ ะดะตะนัั‚ะฒะธั:

sudo certbot certificates

๐Ÿ“š API ะดะพะบัƒะผะตะฝั‚ะฐั†ะธั

ะžัะฝะพะฒะฝั‹ะต endpoints

Products (ะขะพะฒะฐั€ั‹)

ะœะตั‚ะพะด Endpoint ะžะฟะธัะฐะฝะธะต
GET /api/products ะŸะพะปัƒั‡ะธั‚ัŒ ะฒัะต ั‚ะพะฒะฐั€ั‹
GET /api/products/{id} ะŸะพะปัƒั‡ะธั‚ัŒ ั‚ะพะฒะฐั€ ะฟะพ ID
GET /api/products/category/{category_id} ะขะพะฒะฐั€ั‹ ะฟะพ ะบะฐั‚ะตะณะพั€ะธะธ

Categories (ะšะฐั‚ะตะณะพั€ะธะธ)

ะœะตั‚ะพะด Endpoint ะžะฟะธัะฐะฝะธะต
GET /api/categories ะŸะพะปัƒั‡ะธั‚ัŒ ะฒัะต ะบะฐั‚ะตะณะพั€ะธะธ
GET /api/categories/{id} ะŸะพะปัƒั‡ะธั‚ัŒ ะบะฐั‚ะตะณะพั€ะธัŽ ะฟะพ ID

Cart (ะšะพั€ะทะธะฝะฐ)

ะœะตั‚ะพะด Endpoint ะžะฟะธัะฐะฝะธะต
POST /api/cart/add ะ”ะพะฑะฐะฒะธั‚ัŒ ั‚ะพะฒะฐั€ ะฒ ะบะพั€ะทะธะฝัƒ
POST /api/cart ะŸะพะปัƒั‡ะธั‚ัŒ ัะพะดะตั€ะถะธะผะพะต ะบะพั€ะทะธะฝั‹
PUT /api/cart/update ะžะฑะฝะพะฒะธั‚ัŒ ะบะพะปะธั‡ะตัั‚ะฒะพ ั‚ะพะฒะฐั€ะฐ
DELETE /api/cart/remove/{id} ะฃะดะฐะปะธั‚ัŒ ั‚ะพะฒะฐั€ ะธะท ะบะพั€ะทะธะฝั‹

ะŸั€ะธะผะตั€ั‹ ะทะฐะฟั€ะพัะพะฒ

ะŸะพะปัƒั‡ะธั‚ัŒ ะฒัะต ั‚ะพะฒะฐั€ั‹

curl -X GET "http://localhost:8000/api/products"

ะžั‚ะฒะตั‚:

{
  "products": [
    {
      "id": 1,
      "name": "Wireless Headphones",
      "description": "High-quality wireless headphones...",
      "price": 299.99,
      "category_id": 1,
      "image_url": "https://...",
      "created_at": "2024-01-15T10:30:00",
      "category": {
        "id": 1,
        "name": "Electronics",
        "slug": "electronics"
      }
    }
  ],
  "total": 13
}

ะ”ะพะฑะฐะฒะธั‚ัŒ ั‚ะพะฒะฐั€ ะฒ ะบะพั€ะทะธะฝัƒ

curl -X POST "http://localhost:8000/api/cart/add" \
  -H "Content-Type: application/json" \
  -d '{
    "product_id": 1,
    "quantity": 2,
    "cart": {}
  }'

ะžั‚ะฒะตั‚:

{
  "cart": {
    "1": 2
  }
}

ะŸะพะปะฝะฐั ะดะพะบัƒะผะตะฝั‚ะฐั†ะธั API ั ะธะฝั‚ะตั€ะฐะบั‚ะธะฒะฝั‹ะผะธ ะฟั€ะธะผะตั€ะฐะผะธ ะดะพัั‚ัƒะฟะฝะฐ ะฟะพ ะฐะดั€ะตััƒ: http://localhost:8000/api/docs (Swagger UI)


๐Ÿ— ะั€ั…ะธั‚ะตะบั‚ัƒั€ะฐ

Backend Architecture (Layered Architecture)

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚           API Layer (Routes)            โ”‚  โ† HTTP Endpoints
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚        Service Layer (Services)         โ”‚  โ† Business Logic
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    Repository Layer (Repositories)      โ”‚  โ† Data Access
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚      Database Layer (SQLAlchemy)        โ”‚  โ† ORM
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ะŸั€ะตะธะผัƒั‰ะตัั‚ะฒะฐ ะฟะพะดั…ะพะดะฐ:

  • โœ… ะ ะฐะทะดะตะปะตะฝะธะต ะพั‚ะฒะตั‚ัั‚ะฒะตะฝะฝะพัั‚ะธ (Separation of Concerns)
  • โœ… ะ›ะตะณะบะพะต ั‚ะตัั‚ะธั€ะพะฒะฐะฝะธะต ะบะฐะถะดะพะณะพ ัะปะพั
  • โœ… ะ’ะพะทะผะพะถะฝะพัั‚ัŒ ะทะฐะผะตะฝั‹ ะบะพะผะฟะพะฝะตะฝั‚ะพะฒ ะฑะตะท ะธะทะผะตะฝะตะฝะธั ะดั€ัƒะณะธั… ัะปะพะตะฒ
  • โœ… ะœะฐััˆั‚ะฐะฑะธั€ัƒะตะผะพัั‚ัŒ ะบะพะดะฐ

Frontend Architecture (Component-Based)

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚         Views (Pages)                   โ”‚  โ† Route Components
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚         Components                       โ”‚  โ† Reusable UI
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚         Stores (Pinia)                  โ”‚  โ† State Management
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚         Services (API)                  โ”‚  โ† HTTP Client
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Data Flow (Client-Server)

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Vue.js  โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€> โ”‚  Nginx  โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€> โ”‚  FastAPI โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€> โ”‚  SQLite  โ”‚
โ”‚ Frontend โ”‚ <โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚  Proxy  โ”‚ <โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚  Backend โ”‚ <โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚    DB    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  HTTPS  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   HTTP  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   SQL   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Docker Architecture

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    Docker Host                          โ”‚
โ”‚                                                         โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚   Nginx      โ”‚  โ”‚   Frontend   โ”‚  โ”‚   Backend   โ”‚ โ”‚
โ”‚  โ”‚ (Port 80/443)โ”‚  โ”‚  (Vue.js)    โ”‚  โ”‚  (FastAPI)  โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚         โ”‚                 โ”‚                  โ”‚         โ”‚
โ”‚         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ”‚
โ”‚                                                         โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚           Docker Network (fashop_network)        โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚                                                         โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                     โ”‚
โ”‚  โ”‚   Certbot    โ”‚  (SSL Certificate Renewal)          โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿงช ะขะตัั‚ะธั€ะพะฒะฐะฝะธะต

Backend ั‚ะตัั‚ั‹ (pytest)

cd backend
pytest

Frontend ั‚ะตัั‚ั‹ (Vitest)

cd frontend
npm run test

API ั‚ะตัั‚ะธั€ะพะฒะฐะฝะธะต (Postman)

ะ˜ะผะฟะพั€ั‚ะธั€ัƒะนั‚ะต ะบะพะปะปะตะบั†ะธัŽ ะธะท ั„ะฐะนะปะฐ backend/test_commands.md


GitHub

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors