Medusa v2 Development Setup
Before writing code
Fetch live docs:
- Fetch
https://docs.medusajs.com/learn/installation for installation guide
- Web-search
site:docs.medusajs.com create medusa starter for project scaffolding
- Web-search
site:docs.medusajs.com medusa-config reference for configuration options
- Web-search
site:docs.medusajs.com project directory structure for 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:generate after modifying data models
- Run
npx medusa db:migrate to apply pending migrations
- Always commit migration files to version control
Best Practices
- Use
npx create-medusa-app@latest to scaffold -- do not set up manually
- Always run
npx medusa db:migrate after pulling changes that include new migrations
- Keep
.env in .gitignore and provide .env.template for team members
- Use
shared worker mode in development, separate server + worker in production
- Pin your Medusa version in
package.json to avoid unexpected breaking changes
- Run
npx medusa user to 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.