# {{ name }} This project was generated with [`@vendure/create`](https://github.com/vendure-ecommerce/vendure/tree/master/packages/create). Useful links: - [Vendure docs](https://www.vendure.io/docs) - [Vendure Discord community](https://www.vendure.io/community) - [Vendure on GitHub](https://github.com/vendure-ecommerce/vendure) - [Vendure plugin template](https://github.com/vendure-ecommerce/plugin-template) ## Directory structure * `/src` contains the source code of your Vendure server. All your custom code and plugins should reside here. * `/static` contains static (non-code) files such as assets (e.g. uploaded images) and email templates. ## Development ``` {{#if useYarn}}yarn dev{{else}}npm run dev{{/if}} ``` will start the Vendure server and [worker](https://www.vendure.io/docs/developer-guide/vendure-worker/) processes from the `src` directory. ## Build ``` {{#if useYarn}}yarn build{{else}}npm run build{{/if}} ``` will compile the TypeScript sources into the `/dist` directory. ## Production For production, there are many possibilities which depend on your operational requirements as well as your production hosting environment. ### Running directly You can run the built files directly with the `start` script: ``` {{#if useYarn}}yarn start{{else}}npm run start{{/if}} ``` You could also consider using a process manager like [pm2](https://pm2.keymetrics.io/) to run and manage the server & worker processes. ### Using Docker We've included a sample [Dockerfile](./Dockerfile) which you can build with the following command: ``` docker build -t vendure . ``` This builds an image and tags it with the name "vendure". We can then run it with: ``` # Run the server docker run -dp 3000:3000 -e "DB_HOST=host.docker.internal" --name vendure-server vendure npm run start:server # Run the worker docker run -dp 3000:3000 -e "DB_HOST=host.docker.internal" --name vendure-worker vendure npm run start:worker ``` Here is a breakdown of the command used above: - `docker run` - run the image we created with `docker build` - `-dp 3000:3000` - the `-d` flag means to run in "detached" mode, so it runs in the background and does not take control of your terminal. `-p 3000:3000` means to expose port 3000 of the container (which is what Vendure listens on by default) as port 3000 on your host machine. - `-e "DB_HOST=host.docker.internal"` - the `-e` option allows you to define environment variables. In this case we are setting the `DB_HOST` to point to a special DNS name that is created by Docker desktop which points to the IP of the host machine. Note that `host.docker.internal` only exists in a Docker Desktop environment and thus should only be used in development. - `--name vendure-server` - we give the container a human-readable name. - `vendure` - we are referencing the tag we set up during the build. - `npm run start:server` - this last part is the actual command that should be run inside the container. ### Docker compose We've included a sample [docker-compose.yml](./docker-compose.yml) file which demonstrates how the server, worker, and database may be orchestrated with Docker Compose. ## Plugins In Vendure, your custom functionality will live in [plugins](https://www.vendure.io/docs/plugins/). These should be located in the `./src/plugins` directory. ## Migrations [Migrations](https://www.vendure.io/docs/developer-guide/migrations/) allow safe updates to the database schema. Migrations will be required whenever you make changes to the `customFields` config or define new entities in a plugin. The following npm scripts can be used to generate migrations: ``` {{#if useYarn}}yarn{{else}}npm run{{/if}} migration:generate [name] ``` The generated migration file will be found in the `./src/migrations/` directory, and should be committed to source control. Next time you start the server, and outstanding migrations found in that directory will be run by the `runMigrations()` function in the [index.ts file](./src/index.ts). If, during initial development, you do not wish to manually generate a migration on each change to customFields etc, you can set `dbConnectionOptions.synchronize` to `true`. This will cause the database schema to get automatically updated on each start, removing the need for migration files. Note that this is **not** recommended once you have production data that you cannot lose. --- You can also run any pending migrations manually, without starting the server by running: ``` {{#if useYarn}}yarn{{else}}npm run{{/if}} migration:run ``` You can revert the most recently-applied migration with: ``` {{#if useYarn}}yarn{{else}}npm run{{/if}} migration:revert ```