Medusa v2 Development Setup
Before writing code
Fetch live docs:
- Fetch
https://docs.medusajs.com/learn/installationfor installation guide - Web-search
site:docs.medusajs.com create medusa starterfor project scaffolding - Web-search
site:docs.medusajs.com medusa-config referencefor configuration options - Web-search
site:docs.medusajs.com project directory structurefor v2 layout
Prerequisites
Required Software
| Software | Minimum Version | Purpose | |----------|----------------|---------| | Node.js | v20+ | Runtime | | PostgreSQL | — (see docs) | Primary database | | Redis | v6+ | Event bus, caching (optional for dev) | | Git | any | Version control | | npm / yarn / pnpm | latest | Package manager |
PostgreSQL Setup
- Create a dedicated database:
CREATE DATABASE medusa_db; - Create a user with full privileges on that database
- Connection string format:
postgres://user:password@localhost:5432/medusa_db
Redis Setup (Optional for Development)
- Default connection:
redis://localhost:6379 - Required in production for the event bus module and caching
- In development, Medusa falls back to an in-memory event bus
Project Creation
CLI Scaffolding
npx create-medusa-app@latest my-store
# Prompts: project name, PostgreSQL credentials
# Creates: backend + Next.js storefront starter
Backend Only
npx create-medusa-app@latest my-store --skip-client
# Fetch live docs for current CLI flags
Project Directory Structure
| Directory | Purpose | |-----------|---------| | src/modules/ | Custom modules (DML data models, services) | | src/workflows/ | Custom workflows and steps | | src/api/store/, src/api/admin/ | Custom API routes + middlewares.ts | | src/subscribers/, src/jobs/ | Event subscribers, scheduled jobs | | src/admin/widgets/, src/admin/routes/ | Admin UI extensions | | src/links/ | Module link definitions | | Root | medusa-config.ts, package.json, tsconfig.json, .env |
medusa-config.ts Key Fields
| Field | Purpose | |-------|---------| | projectConfig.databaseUrl | PostgreSQL connection string | | projectConfig.redisUrl | Redis connection (optional) | | projectConfig.http.adminCors | Allowed origins for admin API | | projectConfig.http.storeCors | Allowed origins for store API | | projectConfig.http.authCors | Allowed origins for auth routes | | projectConfig.workerMode | shared, worker, or server | | modules | Array of module configurations | | plugins | Array of plugin configurations |
Minimal Configuration Skeleton
// medusa-config.ts — Fetch live docs for current defineConfig shape
import { defineConfig } from "@medusajs/framework/utils"
export default defineConfig({
projectConfig: { databaseUrl: process.env.DATABASE_URL },
// Fetch live docs for modules, plugins, http config
})
Environment Variables
DATABASE_URL=postgres://user:password@localhost:5432/medusa_db
REDIS_URL=redis://localhost:6379
COOKIE_SECRET=your-cookie-secret
JWT_SECRET=your-jwt-secret
STORE_CORS=http://localhost:8000
ADMIN_CORS=http://localhost:5173
AUTH_CORS=http://localhost:5173
Never hardcode secrets -- always use .env files excluded from version control.
CLI Commands
| Command | Purpose | |---------|---------| | npx medusa develop | Start dev server with hot reload | | npx medusa build | Build for production | | npx medusa start | Start production server | | npx medusa worker | Start background worker process | | npx medusa db:migrate | Run database migrations | | npx medusa db:generate | Generate migration files | | npx medusa db:rollback | Rollback last migration | | npx medusa user --email admin@example.com | Create admin user | | npx medusa exec ./src/scripts/seed.ts | Run seed script |
Worker Mode
Medusa supports three worker modes for handling background jobs:
| Mode | Description | |------|-------------| | shared | Single process handles HTTP and background jobs (default) | | worker | Dedicated process for background jobs only | | server | HTTP-only, no background job processing |
In production, run one server instance and one or more worker instances.
Database Migrations
- Medusa v2 auto-generates migrations from DML model changes
- Run
npx medusa db:generateafter modifying data models - Run
npx medusa db:migrateto apply pending migrations - Always commit migration files to version control
Best Practices
- Use
npx create-medusa-app@latestto scaffold -- do not set up manually - Always run
npx medusa db:migrateafter pulling changes that include new migrations - Keep
.envin.gitignoreand provide.env.templatefor team members - Use
sharedworker mode in development, separateserver+workerin production - Pin your Medusa version in
package.jsonto avoid unexpected breaking changes - Run
npx medusa userto create the first admin user after initial setup
Common Issues
| Issue | Resolution | |-------|-----------| | Database connection refused | Verify PostgreSQL is running and DATABASE_URL is correct | | Migrations fail | Ensure database exists and user has DDL privileges | | Admin dashboard blank | Check ADMIN_CORS matches the admin URL | | Store API 403 | Check STORE_CORS matches the storefront URL | | Redis connection error | Either start Redis or remove redisUrl from config |
Fetch the Medusa installation guide and CLI reference for exact commands, flags, and latest configuration options before setting up.