Deploying a Hapi App


App Platform supports three runtimes for Hapi applications: Node.js, Bun, and Deno. Each runtime has its own package manager, build command, start command, and config file.

Application Build
Copy link

Node.js
Copy link

Hostman uses the following environment when building a Hapi application:

  • Node.js: 20, 22, or 24
  • npm
  • yarn
  • PM2 (latest version)

The application is built in the repository root or in the directory specified in the Project directory path field.

Hostman will execute the following commands during the build:

apt install -y nodejs --fix-missing
npm install pm2@latest -g
npm install hapi @hapi/hapi

If the project includes a package.json file and uses yarn, we will also run:

apt-get remove -y cmdtest yarn
npm install --global yarn
cd /<DIRECTORY> && yarn install --check-files

In all other cases, if the a package.json file is present:

cd /<DIRECTORY> && npm install

<DIRECTORY> is the path to the directory with package.json

The application is run using the PM2 process manager. The default start command is:

pm2 start --no-daemon app.js

The application initialization file (app.js in the example above) can be named app.js, server.js, main.js, or index.js

Deno
Copy link

App Platform builds your app in the repository root, or in the directory you specify in the Project directory path field. The following Deno versions are available:

  • 2.7.14
  • 2.7.10
  • 2.6.0

Deno apps don't require a separate build step. App Platform runs your app directly inside a Deno container, so deno compile isn't used in a typical deployment.

App Platform uses the following command to start your app:

deno run --allow-net --allow-env --allow-read --allow-sys --allow-ffi main.ts

Alternatively, the start command can be defined as a task:

deno task start

When App Platform runs deno task start, Deno executes the start task defined in deno.json. Define it like this:

"tasks": {
  "start": "deno run --allow-net --allow-env --allow-read --allow-sys --allow-ffi main.ts"
}

This example assumes your app entry point is main.ts. Update the path if your project uses a different file.

Permissions

Deno requires you to declare exactly which permissions your app needs. Pass the relevant flags when running your app:

  • --allow-net: outbound network requests
  • --allow-read: read access to the filesystem
  • --allow-write: write access to the filesystem
  • --allow-env: access to environment variables
  • --allow-run: spawn subprocesses
  • --allow-ffi: load native (FFI) libraries
  • --allow-hrtime: high-resolution timers
  • --allow-sys: read system info (OS, CPU, etc.)
  • --allow-all or -A: grant all permissions at once
  • --watch: restart the app automatically when files change

For example, if your app makes network requests, reads environment variables, and accesses the filesystem:

deno run --allow-net --allow-env --allow-read src/index.ts

Bun
Copy link

App Platform builds your app in the repository root, or in the directory you specify in the Project directory path field. Bun is used as both the package manager and runtime.

To build your app, App Platform runs:

bun build

To start your app, App Platform runs:

bun run start

This executes the start script defined in your package.json. Point it to your app's entry file:

"scripts": {
  "start": "bun run src/main.ts"
}

This example assumes your app entry point is src/main.ts. Update the path if your project uses a different file.

Troubleshooting
Copy link

Deployment fails
Copy link

If there are problems with deployment, first check the deployment log. You will be able to determine at what point something went wrong.

Often the problems are related to the start command. If using Node.js, check that everything in your development environment works with pm2. Make sure that all modules required to run the application are present in the package.json file.

Please add build instructions to your script section in package.json
Copy link

The problem is that the Node.js yarn build command accesses the package.json file, and if the value of the build directive is not specified, an error occurs.

To fix this, you need to add the necessary directives to the scripts section of the package.json file. Read more about using scripts here.