Since I no longer use Express for my backend services (I've no write my backends almost exclusively in Go), I'm archiving this repository—it will no longer be maintained. Feel free to fork it, though!
An opinionated Typescript starter setup for Express + Pino. Deployable with Docker and PM2. Works really well with ng-starter
!
# If using Yarn:
yarn install
# If using NPM:
npm install
# If using Yarn:
yarn dev # starts a dev server with hot-reloading
# and detailed debugging.
yarn prod # starts a production server with minimal
# debugging and no hot-reloading.
yarn start # selects 'yarn dev' or 'yarn prod' based
# on your NODE_ENV
# If using NPM, replace 'yarn ...' with 'npm run ...'
# However, 'yarn' is highly recommended for a more
# deterministic package installation!
-
/
- Endpoint forstatic/index.html
. Static assets are served fromstatic/
.Note that in production, usage of Express as a static asset server is discouraged, as it is much more efficient to use NGINX to serve static content, and to use Express only as an API server.
-
/api
- Main API endpoint; returns atext/plain
message indicating that the API is working. -
/api/puppies
- Sample API endpoint that counts page refreshes. Sends data asapplication/json
.
Method 1: Building an image from scratch.
First, edit package.json
's config section:
- Set
docker-image-version
to a pattern that matches #.#.# (typically using semver)). This affects the tag of the built Docker image (which will look something along the lines of #.#.#-prod or #.#.#-dev), and also sets the image version label.
Now, decide whether you want to build for production or development
(this affects the installed dependencies, and whether express-starter
runs
in development / production mode), and run the associated command:
# dk = docker
## For a production build:
yarn dk-build-prod
## Or, a shorter alias for the above:
yarn dk-build
## For a development build:
yarn dk-build-dev
Once you build a version, the .env
file will be populated with the build
configuration (i.e. BUILD_ENV
and BUILD_TAG
).
Method 2: Pulling a remote registry image.
Pull the latest image from Docker Hub:
docker pull stevenxie/express-starter
Then, start a container from Docker Compose
(which is named express-starter
, configured to expose port 3000, and
mount a volume named express-vol
). If no image has been built, it will also
build an image before starting a container from it. Make sure you have
Docker Compose installed, or look up how
to manually configure a build with docker build
!
# To see output in the console foreground (dk = docker)
yarn dk-foreground
# To run in the background
yarn dk-up
To instantiate a container, run yarn dk-up
. If no image is built, it will
also build the initial image.
For more information about Docker images and containers, please see Docker's documentation.
To stop the container, run yarn dk-stop
, and to run it again, run
yarn dk-start
. The container can also be paused with yarn dk-pause
.
To remove the container entirely, run yarn dk-down
. To also remove images,
run yarn dk-purge
.
See the
package.json
for more useful Docker-related scripts! Each Docker script is prefixed withdk-
.
If you have multiple environments / tags, you can have the yarn dk-...
scripts
target a different image by editing the .env
file with the correct BUILD_ENV
and BUILD_TAG
.
If you're on a Mac, you won't be able to access the express-vol
Docker
volume directly through the filesystem; you'll have to access it through
Docker's VM as follows:
screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
# At this point, your screen will become blank.
# Press enter, and wait for the prompt to show up.
# When it does, you can access the volumes at the
# following location:
cd /var/lib/docker/volumes
To launch on a server with PM2 installed globally,
run with yarn pm2
or npm run pm2
. This will allow you to monitor the status
of the server, and auto-restart it if it crashes.
If you have your server settings correctly filled out in pm2.ecosystem.conf.js → deployment, and your server has your GitHub SSH keys / credentials, then you can set-up the server instantly as follows:
# Assuming using Yarn:
yarn pm2-setup
yarn pm2-deploy
After that, every time you want to update to the latest Git commit, just run
yarn pm2-update
. If you've at some point performed a git push --force
,
then it is necessary to run yarn pm2-update-force
instead.
dev-log-level
– logging level for when the server is started in development mode (default:debug
).prod-log-level
– logging level for when the server is started in production mode (default:error
).jmespath-log-filter
– the filter to be applied to the console output logs during development. Uses the JMESPath query language. To show all output, set to:*
. (default:contains(name, `server`)
)browser-live-reload
– whether or not you would like the browser to reload when you save your code. Useful if you're making visual changes. (The server itself will always live-reload to reflect new changes). (default:false
)docker-image-version
— a pattern that matches #.#.# (typically using semver). This affects the tag of the built docker image (which will look something along the lines of #.#.#-prod or #.#.#-dev), and also sets the image version label.
The 'services → express → environment' section can be configured with
environment variables like NODE_ENV
, LOG_LEVEL
, and LOG_FILTER
, which
will override related settings in the NPM package configuration.
Allows you to configure custom properties for PM2 monitoring and remote deployment. See the documentation for details.