8.1. Build Medusa Application
In this chapter, you'll learn how to create a production build of your Medusa application for deployment to a hosting provider.
The next chapter explains how to deploy your Medusa application.
build Command#
The Medusa CLI tool provides a build command that creates a standalone build of the Medusa application that:
- Doesn't rely on the source TypeScript files.
- Can be copied to a production server reliably.
So, to create the production build, run the following command in the root of your Medusa application:
The command will create a .medusa/server directory in the root of your project that contains your build assets. The next sections explain how to use the build output.
Start Built Medusa Application#
To start the Medusa application after running the build command:
build command, since the .medusa/server directory is recreated each time.- Change to the
.medusa/serverdirectory and install the dependencies:
- When running the application locally, make sure to copy the
.envfile from the root project's directory. In production, use system environment variables instead.
NODE_ENV=production, the Medusa application loads the environment variables from .env.production. Learn more in the environment variables guide.- Set
NODE_ENVtoproductionin the system environment variable:
- Start the Medusa application from
.medusa/server:
Authentication Locally in Production Build#
When the Medusa application is started in production (NODE_ENV=production) or staging mode, cookie settings are stricter. Cookie authentication only works if the client application is served from the same domain as the Medusa server, and the domain is not localhost or part of the public suffix list.
So if you try to access the Medusa Admin locally in production mode, you won't be able to log in.
To access the Medusa Admin locally in production mode, set the projectConfig.cookieOptions in your medusa-config.ts file to be less strict. For example:
In this example, you set sameSite to lax and secure to false, which allows cookies to be sent over non-secure connections and from different domains.
Then rebuild the Medusa application and start it again as described in the steps above. You can now access the Medusa Admin locally in production mode.
projectConfig.cookieOptions configuration once you're done testing locally, as it's not secure for production environments.Build Output#
The build command creates a .medusa/server directory in the root of your project that contains your build assets. Do not commit this directory to your repository. This directory should be generated as part of your deployment process.
The .medusa/server directory contains the following:

public/admin: Contains the production build of the admin dashboard. Thepublicdirectory is publicly accessible.src: Contains the compiled JavaScript files of yoursrcdirectory.instrumentation.js: The compiled instrumentation configuration file, if you have one.medusa-config.js: The compiled Medusa configuration file.package.jsonand a lock file: The dependencies required to run the Medusa application in production.
Built Assets#
The build command compiles and copies .{ts,js,tsx,jsx} files in your project, such as those in the root directory and in the src directory.
If you have other assets, such as JSON files or fonts, that you need in your Medusa backend at runtime, you need to copy them to the .medusa/server directory as part of your build process.
For example, consider you have a src/data directory that contains JSON files needed at runtime. You can add a postbuild script to your package.json file to copy this directory after the build process:
This script copies the src/data directory to the .medusa/server directory after the build process.
.medusa/server/public directory, as they will be publicly accessible. Sensitive files include those containing API keys, database credentials, or any other confidential information.Customize Admin Build#
The admin dashboard is built with Vite. If you need to customize the build process to include additional static assets, you can modify the Vite configuration with the admin.vite option in your medusa-config.ts file.
Separate Admin Build#
The build command accepts a --admin-only option that outputs the admin to the .medusa/admin directory. This is useful when deploying the admin dashboard separately, such as on Vercel:
Deploying Production Build#
The next chapter covers how to deploy the production build.