Packaging the App

With Nuvolaris you can write a manifest file (in YAML) to have an easy way to deploy applications.

In this last chapter of the tutorial we will package the code to easily deploy the app, both frontend and actions.

Start The Manifest File

Let’s create a "manifest.yaml" file in the packages directory which will be used to describe the actions to deploy:

packages:
  contact:
    actions:
      notify:
        function: contacts/notify.js
        web: true
        inputs:
          notifications:
            value: $NOTIFICATIONS

This is the basic manifest file with just the notify action. At the top level we have the standard packages keyword, under which we can define the packages we want. Until now we created all of our actions in the contact package so we add it under packages.

Then under each package, the actions keyword is needed so we can add our action custom names with the path to the code (with function). Finally we also add web: true which is equivalent to --web true when creating the action manually.

Finally we used the inputs keyword to define the parameters to inject in the function.

If we apply this manifest file (we will see how soon), it will be the same as the previous nuv action create contact/notify <path-to-notify.js> -p notifications $NOTIFICATIONS --web true. You need to have the webhooks url in the NOTIFICATIONS environment variable.

The Submit Action

The submit action is quite straightforward:

packages:
  contact:
    actions:
      ...
      submit:
        function: contact/submit.js
        web: true

The Database Actions

Similarly to the notify and submit actions, let’s add to the manifest file the two actions for the database. We also need to pass as a package parameter the DB url, so we will use inputs key as before, but at the package level:

packages:
  contact:
    inputs:
      dbUri:
        type: string
        value: $POSTGRES_URL
    actions:
      ...
      write:
        function: contact/write.js
        web: true

      create-table:
        function: contact/create-table.js
        annotations:
          autoexec: true

Note the create-table action does not have the web set to true as it is not needed to be exposed to the world. Instead it just has the annotation for cron scheduler.

The Sequences

Lastly, we created a sequence with submit and notify that we have to specify it in the manifest file as well.

packages:
  contact:
    inputs:
      ...

    actions:
      ...

    sequences:
      submit-write:
        actions: submit, write
        web: true
      submit-notify:
        actions: submit-write, notify
        web: true

We just have to add the sequences key at the contact level (next to actions) and define the sequences we want with the available actions.

Deployment

The final version of the manifest file is:

packages:
  contact:
    inputs:
      dbUri:
        type: string
        value: $POSTGRES_URL
    actions:
      notify:
        function: contact/notify.js
        web: true
        inputs:
          notifications:
            value: $NOTIFICATIONS

      submit:
        function: contact/submit.js
        web: true

      write:
        function: contact/write.js
        web: true

      create-table:
        function: contact/create-table.js
        annotations:
          autoexec: true

    sequences:
      submit-write:
        actions: submit, write
        web: true
      submit-notify:
        actions: submit-write, notify
        web: true

nuv comes equipped with a handy command to deploy an app: nuv project deploy.

It checks if there is a packages folder with inside a manifest file and deploys all the specified actions. Then it checks if there is a web folder and uploads it to the platform.

It does all what we did manually until now in one command.

So, from the top level directory of our app, let’s run (to also set the input env var):

export POSTGRES_URL=<your-postgres-url>
export NOTIFICATIONS=<the-webhook>

nuv project deploy

Packages and web directory present.
Success: Deployment completed successfully.
Found web directory. Uploading..

With just this command you deployed all the actions (and sequences) and uploaded the frontend (from the web folder).