ai

Medusa Commerce Remote Work Setup —

Medusa Commerce Remote Work Setup —

Medusa Commerce

Medusa Commerce Remote Work Setup —

Medusa Commerce Headless Open Source Node.js TypeScript API-first E-commerce Multi-currency Multi-region Plugin Remote Work Self-hosted Stripe PayPal Next.js

PlatformTypeSelf-hostedราคาเหมาะกับ
MedusaHeadless OSSใช่ฟรีDev Team
ShopifySaaSไม่$29+/moNon-tech
WooCommerceWordPress Pluginใช่ฟรีWordPress
SaleorHeadless OSSใช่ฟรีGraphQL
Commerce.jsHeadless SaaSไม่Free/PaidJAMstack

Medusa Setup

=== Medusa Installation ===

Quick Start

npx create-medusa-app@latest my-store

cd my-store

Backend Structure

my-store/

├── backend/

│ ├── src/

│ │ ├── api/ # Custom API routes

│ │ ├── services/ # Custom services

│ │ ├── subscribers/ # Event handlers

│ │ └── models/ # Custom models

│ ├── medusa-config.js

│ ├── package.json

│ └── .env

└── storefront/ # Next.js frontend

.env Configuration

DATABASE_URL=postgres://user:pass@localhost:5432/medusa

REDIS_URL=redis://localhost:6379

JWT_SECRET=your-super-secret-jwt

COOKIE_SECRET=your-cookie-secret

STRIPE_API_KEY=sk_test_xxx

STORE_CORS=http://localhost:8000

ADMIN_CORS=http://localhost:7001

medusa-config.js

module.exports = {

projectConfig: {

redis_url: process.env.REDIS_URL,

database_url: process.env.DATABASE_URL,

store_cors: process.env.STORE_CORS,

admin_cors: process.env.ADMIN_CORS,

},

plugins: [

`medusa-fulfillment-manual`,

เนื้อหาเกี่ยวข้อง — ทำความเข้าใจ พิริยะสัมพันธารักษ์ประวัติ

`medusa-payment-manual`,

{

resolve: `medusa-payment-stripe`,

options: {

api_key: process.env.STRIPE_API_KEY,

},

},

{

resolve: `medusa-file-s3`,

options: {

แนะนำเพิ่มเติม — เรียนเทรดกับ iCafeForex

s3_url: process.env.S3_URL,

bucket: process.env.S3_BUCKET,

region: process.env.S3_REGION,

access_key_id: process.env.S3_ACCESS_KEY,

secret_access_key: process.env.S3_SECRET_KEY,

},

},

],

};

Run Development

cd backend && medusa develop

cd storefront && npm run dev

from dataclasses import dataclass

@dataclass

class MedusaFeature:

feature: str

description: str

plugin: str

status: str

features = [

MedusaFeature("Products", "จัดการสินค้า Variants Options", "Built-in", "GA"),

MedusaFeature("Orders", "สั่งซื้อ Fulfillment Returns", "Built-in", "GA"),

MedusaFeature("Payments", "Stripe PayPal Manual", "medusa-payment-stripe", "GA"),

MedusaFeature("Shipping", "Flat Rate Manual Custom", "medusa-fulfillment-manual", "GA"),

MedusaFeature("Multi-currency", "หลายสกุลเงิน THB USD EUR", "Built-in", "GA"),

MedusaFeature("Multi-region", "หลายภูมิภาค Tax ต่างกัน", "Built-in", "GA"),

เนื้อหาเกี่ยวข้อง — อ่านต่อ: C# Blazor Multi-tenant Design

MedusaFeature("File Storage", "S3 MinIO Local", "medusa-file-s3", "GA"),

MedusaFeature("Search", "MeiliSearch Algolia", "medusa-plugin-meilisearch", "GA"),

]

print("=== Medusa Features ===")

for f in features:

print(f" [{f.status}] {f.feature}")

print(f" {f.description} | Plugin: {f.plugin}")

API และ Storefront

=== Medusa API & Next.js Storefront ===

REST API Examples

GET /store/products — List products

GET /store/products/:id — Get product

POST /store/carts — Create cart

POST /store/carts/:id/line-items — Add item

POST /store/carts/:id/payment-sessions — Init payment

POST /store/carts/:id/complete — Complete order

Next.js Storefront — Product Page

pages/products/[handle].tsx

import { medusaClient } from "@lib/medusa"

export async function getStaticProps({ params }) {

แนะนำเพิ่มเติม — คู่มือเทรดจาก SiamCafeBook

const { product } = await medusaClient.products.retrieve(

params.handle

)

return { props: { product }, revalidate: 60 }

}

export default function ProductPage({ product }) {

return (

<div>

<p>{product.description}</p>

<p>Price: {product.variants[0].prices[0].amount / 100} THB</p>

<button onClick={() => addToCart(product.variants[0].id)}>

Add to Cart

</button>

</div>

)

}

เนื้อหาเกี่ยวข้อง — แนะนำให้อ่าน TTS Coqui Hexagonal Architecture

Custom API Route

src/api/routes/store/custom/index.ts

import { Router } from "express"

const router = Router()

router.get("/store/custom/bestsellers", async (req, res) => {

const productService = req.scope.resolve("productService")

const products = await productService.list(

{ status: "published" },

{ order: { sold_count: "DESC" }, take: 10 }

)

res.json({ products })

})

@dataclass

class APIEndpoint:

method: str

path: str

description: str

auth: str

rate_limit: str

endpoints = [

APIEndpoint("GET", "/store/products", "รายการสินค้า", "ไม่ต้อง", "100/min"),

APIEndpoint("POST", "/store/carts", "สร้างตะกร้า", "ไม่ต้อง", "50/min"),

APIEndpoint("POST", "/store/customers", "สมัครสมาชิก", "ไม่ต้อง", "10/min"),

APIEndpoint("GET", "/admin/orders", "รายการออเดอร์", "JWT Admin", "100/min"),

APIEndpoint("POST", "/admin/products", "เพิ่มสินค้า", "JWT Admin", "50/min"),

APIEndpoint("POST", "/hooks/payment", "Payment Webhook", "Signature", "Unlimited"),

]

print("\n=== API Endpoints ===")

for e in endpoints:

print(f" [{e.method}] {e.path}")

print(f" {e.description} | Auth: {e.auth} | Limit: {e.rate_limit}")

Remote Work Deployment

=== Production Deployment ===

Docker Compose — Production

services:

backend:

build: ./backend

environment:

  • DATABASE_URL=postgres://medusa:secret@db:5432/medusa
  • REDIS_URL=redis://redis:6379

ports:

  • "9000:9000"

depends_on: [db, redis]

storefront:

build: ./storefront

environment:

Medusa Commerce Remote Work Setup —
  • NEXT_PUBLIC_MEDUSA_BACKEND_URL=https://api.mystore.com

ports:

  • "8000:8000"

db:

image: postgres:15-alpine

เนื้อหาเกี่ยวข้อง — อ่านต่อ: suno ai คือ — คู่มือฉบับสมบูรณ์ 2026

environment:

  • POSTGRES_USER=medusa
  • POSTGRES_PASSWORD=secret
  • POSTGRES_DB=medusa

volumes:

  • pgdata:/var/lib/postgresql/data

redis:

image: redis:7-alpine

Railway / Fly.io Deployment

fly launch --name mystore-api

fly secrets set DATABASE_URL=postgres://...

fly secrets set STRIPE_API_KEY=sk_live_...

fly deploy

CI/CD — GitHub Actions

name: Deploy

on:

push:

branches: [main]

jobs:

deploy:

runs-on: ubuntu-latest

steps:

  • uses: actions/checkout@v4
  • uses: superfly/flyctl-actions/setup-flyctl@master
  • run: flyctl deploy --remote-only

remote_workflow = {

"Development": "Local Docker Compose ทุกคนรันเหมือนกัน",

"Staging": "Auto-deploy จาก develop branch ทดสอบก่อน",

"Production": "Deploy จาก main branch หลัง PR Approved",

"Admin Dashboard": "https://admin.mystore.com ทุกคนเข้าได้",

"API Docs": "Swagger UI ที่ /api-docs สำหรับ Frontend Team",

"Monitoring": "Sentry สำหรับ Error Tracking ทุก Environment",

"Communication": "Slack Channel #store-dev สำหรับทีม",

}

print("Remote Work Workflow:")

for stage, desc in remote_workflow.items():

print(f" [{stage}]: {desc}")

team_setup = [

"Backend Dev: พัฒนา API Plugin Custom Service",

"Frontend Dev: พัฒนา Storefront Next.js Components",

"Mobile Dev: ใช้ REST API สร้าง iOS Android App",

"Designer: ออกแบบ UI/UX ใน Figma Collaborate",

"QA: ทดสอบบน Staging Environment",

"DevOps: จัดการ Infrastructure CI/CD Monitoring",

"PM: จัดการ Sprint ใน Jira Linear",

]

print(f"\n\nTeam Roles:")

for i, t in enumerate(team_setup, 1):

print(f" {i}. {t}")

เคล็ดลับ

  • Docker: ใช้ Docker Compose ให้ทุกคนรัน Environment เดียวกัน
  • Staging: ตั้ง Staging Environment ทดสอบก่อน Production
  • Plugin: ใช้ Plugin System ขยาย Feature ไม่ต้องแก้ Core
  • API-first: ออกแบบ API ก่อน ให้ทุก Team ใช้ได้
  • Seed: สร้าง Seed Data สำหรับ Development ทุกคน

Medusa Commerce คืออะไร

Open Source Headless Commerce Node.js TypeScript REST API Admin Multi-currency Multi-region Plugin Stripe PayPal Self-hosted แทน Shopify

XM Legend · เทรดเดอร์ & ผู้สอน Forex 13 ปี

ผู้ก่อตั้ง SiamCafe ตั้งแต่ปี 1997 · เทรดเดอร์สาย Forex มากกว่า 13 ปี ได้รับการยกย่องเป็น XM Legend · แบ่งปันความรู้ Forex, ไอที, AI และการเทรด จากประสบการณ์จริงในตลาดจริง