Git Product home page Git Product logo

zion's Introduction

Shows a abstract star with on the right Zion name

CI status Issues License Discord chat LinkedIn eslint support prettier

Zion - A scalable Thing Description Directory

Overview

In the context of the W3C Web of Things, Thing Description Directories (TDDs) are services that store a set of Thing Descriptions. A TDD offers a set of APIs with CRUD operations on the collection of TDs that it stores. Zion implements the standard TDD APIs with a set of extensions to cover the use cases of VAIMEE.

Table of Contents
  1. Features
  2. Getting Started
  3. Publication
  4. Roadmap
  5. Contributing
  6. Contact
  7. Acknowledgments

Features

Zion employs the best open-source technologies to provide a scalable TDD service. Zion wants to be fast, ease to use and flexible. Currently, Zion supports the following features:

  • Introduction methods :
    • DNS-SD
    • Well-known URL
    • CoRE Link Format and /.well-known/core
  • Standard API:
    • CRUD operations on the collection of TDs
    • JSONPath queries compliant with IETF JSONPath standard draft 5
    • Pagination support
  • Basic support for authentication and authorization

Getting started

Thank you for considering using Zion in your Web of Things project! 🥳. Zion is still in its early stages and it is still in the process of being tested and developed. However, if you already want to deploy on your own you have three options:

Clone and docker compose

You can clone the repository and start Zion using the following command:

docker compose up

If you want to manually set up your database, you can edit the example .env file:

ZION_NODE_ENV=development
# ZION_SERVER_PORT specifies the port number on which the Zion server will listen for incoming requests.
ZION_SERVER_PORT=3000
# ZION_DB_HOST specifies the host address where the Zion target database is located.
ZION_DB_HOST=localhost
# ZION_DB_PORT specifies the port number on which the Zion target database server is listening.
ZION_DB_PORT=5432
# ZION_DB_USER specifies the username to connect to the Zion target database.
ZION_DB_USER=zion
# ZION_DB_PASSWORD specifies the password for the Zion target database user.
ZION_DB_PASSWORD=zion
# ZION_DB_DATABASE specifies the name of the Zion target database.
ZION_DB_DATABASE=zion
# ZION_JWT_SECRET specifies the secret key used for JSON Web Token (JWT) encryption and decryption.
ZION_JWT_SECRET=abc123
# ZION_JWT_EXPIRES_IN specifies the duration for which a JWT token remains valid.
# Examples: "15m" (15 minutes), "1h" (1 hour), "7d" (7 days), etc.
ZION_JWT_EXPIRES_IN=15m

Clone and npm

Requirements Node.js v16+

If you want to start Zion in development mode, you can clone the repository and run the following command:

npm ci
npm start

Note: you have to manually set up your database and configure Zion using the .env file.

Docker compose

You can start Zion right away using this simple docker compose file together with your local .env file :

version: '3.6'
services:
  database:
    image: postgres:14.3-alpine
    environment:
      - POSTGRES_USER=zion
      - POSTGRES_PASSWORD=zion
      - POSTGRES_DB=zion
    container_name: 'zion-postgres'
  zion:
    image: vaimee/zion:latest
    depends_on:
      - database
    entrypoint: ['sh', '-c','npm run db:migrate:latest && npm run start:prod']
    ports: 
      - 3000:3000
    environment:
      - ZION_NODE_ENV=production
      - ZION_SERVER_PORT=3000
      # Using task name as explained in https://github.com/vaimee/zion/issues/11#issuecomment-1434457337
      - ZION_DB_HOST=tasks.database
      - ZION_DB_PORT=5432
      - ZION_DB_USER=zion
      - ZION_DB_PASSWORD=zion
      - ZION_DB_DATABASE=zion
      - ZION_JWT_SECRET=change-me
      - ZION_JWT_EXPIRES_IN=7d
    container_name: zion

Publication

The full paper, available here, should be cited if this repository is utilized for research, thesis, or industrial activities involving publications.

C. Aguzzi, L. Gigli, I. Zyrianoff and L. Roffia, "ZION: A Scalable W3C Web of Things Directory," 2024 IEEE 21st Consumer Communications & Networking Conference (CCNC), Las Vegas, NV, USA, 2024, pp. 1-6, doi: 10.1109/CCNC51664.2024.10454685.
@INPROCEEDINGS{10454685,
  author={Aguzzi, Cristiano and Gigli, Lorenzo and Zyrianoff, Ivan and Roffia, Luca},
  booktitle={2024 IEEE 21st Consumer Communications & Networking Conference (CCNC)}, 
  title={ZION: A Scalable W3C Web of Things Directory}, 
  year={2024},
  volume={},
  number={},
  pages={1-6},
  doi={10.1109/CCNC51664.2024.10454685}
}

Roadmap

  • Standard API
    • XPath queries
    • SPARQL queries supported with an external SPARQL endpoint
    • CoRE introduction method
  • Experimental API
    • GEO spatial queries
    • User private TD collection CRUD
  • Caching layer
  • Cluster mode support
  • Advance authentication
    • OpenID Connect
    • OAuth2 Bearer Token

Other minor features are listed in the Issue tracker with the label feature.

Contributing

Thank you for considering contributing to Zion. Please follow the guidelines in the CONTRIBUTING.md file.

Contact

Lorenzo Gigli - @hyperloris - [email protected]

Cristiano Aguzzi - @relucri - [email protected]

VAIMEE - @MaVaimee - [email protected]

Acknowledgments

DESMO-LD

Zion is founded by the DESMO-LD project inside the ONTOCHAIN European organization part of the Next Generation Internet fund.

zion's People

Contributors

dependabot[bot] avatar elithkob avatar hyperloris avatar ivanzy avatar jkrhb avatar relu91 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

zion's Issues

Add in readme ZION_API_BASE

I didn't find the description for ZION_API_BASE in the README.
This variable is very important because it allows ZION to be exposed with a load balancer in kubernetes.

DELETE /things is not a protected endpoint

Currently, it is possible to execute delete any TD from the directory performinig a DELETE operation in the /things endpoint. I imagine that this is not the desired behavior, since an access token is needed to create (POST /things) or to update (PUT /things) a given TD.

Also, the PATCH endpoint does not require credentials.

Incorrect /.well-known URL

Zion hosts the Thing Description of the directory at /well-known/wot. My understanding of the specification is that it should be /.well-known/wot, which currently returns a 404.

I also noticed that link to the Thing Description in the Zion HTML UI server at / links to /well-known/wot-thing-description which returns a 404.

P.S. Congrats on the release! Great to see the WoT Discovery specification in action.

Transient `500` for `/things` endpoint

I received a 500 when accessing the /things endpoint. Here is the Zion log:

Error: select * from "thing_description" - Connection terminated unexpectedly
    at Connection.<anonymous> (/home/node/app/node_modules/pg/lib/client.js:132:73)
    at Object.onceWrapper (node:events:641:28)
    at Connection.emit (node:events:527:28)
    at Socket.<anonymous> (/home/node/app/node_modules/pg/lib/connection.js:57:12)
    at Socket.emit (node:events:527:28)
    at TCP.<anonymous> (node:net:709:12)
Connection Error: Connection ended unexpectedly

The error disappeared after a second try.

Update operations do not update the TD id correctly

Zion uses a "wrapper" model to save a TD called InternalThingDescription. In this model, there are various fields including json containing the descriptor and urn which saves its id. The directory uses the urn field for retrieval operations.

If we perform an update (either via PUT or via PATCH) where we change the TD id, this is updated inside the descriptor, but not on the urn field.

This prevents later retrieval of the TD via the new id.

Zion replies with 500 when DB is reset during execution

This is a minor issue and probably represents a corner case that very few users will experience. Nevertheless, if the DB gets reset (totally erased) when Zion is executing, Zion tries to make queries in tables that do not exist, throwing a 500 error. I experienced these problems when performing some tests in Zion where I needed to reset the DB manually. The screenshot below illustrates the issue.

Screenshot from 2022-07-29 13-03-39

Decrees docker size

Currently, the docker image is around 380 Mb doing some experiments removing the development dependencies we could achieve 178 Mb. Although there are some runtime issues that appear when you remove tsc from the installed dependencies. The major one is that knex uses d.ts files instead of js files.

No assigned _id on POST CREATE

Hi,
The post call for a creation of a new TD is working, but it is not generating any _id to assign at the TD.
Below is a curl example of CREATE (using the authentication, pls replace the Bearer token):

curl --location --request POST 'http://localhost:3000/things' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjEsImlhdCI6MTY1NzAyMTE4MiwiZXhwIjoxNjU3MDIyMDgyfQ.kxCnnuJLVWVVtOKChcoBw7THXqmiv2onaFtRMQcNd5c' \
--header 'Content-Type: application/json' \
--data-raw '{"@context":["http://www.w3.org/ns/td","https://context.dasibreaker.vaimee.it/context.jsonld",{"@language":"en"}],"@type":["Sensor"],"title":"temp_02","securityDefinitions":{"no_sec":{"scheme":"nosec"}},"security":"no_sec","properties":{"latitude":{"title":"Latitude","description":"Latitude of the sensor","@type":"xsd:float","readOnly":false,"writeOnly":false,"observable":false,"forms":[{"href":"http://15.0.0.2:8080/temp_02/properties/latitude","contentType":"application/json","op":["readproperty","writeproperty"]},{"href":"http://192.168.80.1:8080/temp_02/properties/latitude","contentType":"application/json","op":["readproperty","writeproperty"]},{"href":"coap://15.0.0.2:5683/temp_02/properties/latitude","contentType":"application/json","op":["readproperty","writeproperty"]},{"href":"coap://192.168.80.1:5683/temp_02/properties/latitude","contentType":"application/json","op":["readproperty","writeproperty"]}]},"longitude":{"title":"Longitude","description":"Longitude of the sensor","@type":"xsd:float","readOnly":false,"writeOnly":false,"observable":false,"forms":[{"href":"http://15.0.0.2:8080/temp_02/properties/longitude","contentType":"application/json","op":["readproperty","writeproperty"]},{"href":"http://192.168.80.1:8080/temp_02/properties/longitude","contentType":"application/json","op":["readproperty","writeproperty"]},{"href":"coap://15.0.0.2:5683/temp_02/properties/longitude","contentType":"application/json","op":["readproperty","writeproperty"]},{"href":"coap://192.168.80.1:5683/temp_02/properties/longitude","contentType":"application/json","op":["readproperty","writeproperty"]}]},"value":{"title":"Sensor value","description":"Sensor value","@type":"xsd:float","readOnly":false,"writeOnly":false,"observable":false,"forms":[{"href":"http://15.0.0.2:8080/temp_02/properties/value","contentType":"application/json","op":["readproperty","writeproperty"]},{"href":"http://192.168.80.1:8080/temp_02/properties/value","contentType":"application/json","op":["readproperty","writeproperty"]},{"href":"coap://15.0.0.2:5683/temp_02/properties/value","contentType":"application/json","op":["readproperty","writeproperty"]},{"href":"coap://192.168.80.1:5683/temp_02/properties/value","contentType":"application/json","op":["readproperty","writeproperty"]}]}},"forms":[{"href":"http://15.0.0.2:8080/temp_02/all/properties","contentType":"application/json","op":["writeallproperties","writemultipleproperties"]},{"href":"http://192.168.80.1:8080/temp_02/all/properties","contentType":"application/json","op":["writeallproperties","writemultipleproperties"]}]}'

That request has a response: 201 created
Then if I ask for a get-all like that:
curl --location --request GET 'http://localhost:3000/things'
The TD exists but with not _id:

[
    {
        "@type": [
            "Sensor"
        ],
        "forms": [
            {
                "op": [
                    "writeallproperties",
                    "writemultipleproperties"
                ],
                "href": "http://15.0.0.2:8080/temp_02/all/properties",
                "contentType": "application/json"
            },
            {
                "op": [
                    "writeallproperties",
                    "writemultipleproperties"
                ],
                "href": "http://192.168.80.1:8080/temp_02/all/properties",
                "contentType": "application/json"
            }
        ],
        "title": "temp_02",
        "@context": [
            "http://www.w3.org/ns/td",
            "https://context.dasibreaker.vaimee.it/context.jsonld",
            {
                "@language": "en"
            }
        ],
        "security": "no_sec",
        "properties": {
            "value": {
                "@type": "xsd:float",
                "forms": [
                    {
                        "op": [
                            "readproperty",
                            "writeproperty"
                        ],
                        "href": "http://15.0.0.2:8080/temp_02/properties/value",
                        "contentType": "application/json"
                    },
                    {
                        "op": [
                            "readproperty",
                            "writeproperty"
                        ],
                        "href": "http://192.168.80.1:8080/temp_02/properties/value",
                        "contentType": "application/json"
                    },
                    {
                        "op": [
                            "readproperty",
                            "writeproperty"
                        ],
                        "href": "coap://15.0.0.2:5683/temp_02/properties/value",
                        "contentType": "application/json"
                    },
                    {
                        "op": [
                            "readproperty",
                            "writeproperty"
                        ],
                        "href": "coap://192.168.80.1:5683/temp_02/properties/value",
                        "contentType": "application/json"
                    }
                ],
                "title": "Sensor value",
                "readOnly": false,
                "writeOnly": false,
                "observable": false,
                "description": "Sensor value"
            },
            "latitude": {
                "@type": "xsd:float",
                "forms": [
                    {
                        "op": [
                            "readproperty",
                            "writeproperty"
                        ],
                        "href": "http://15.0.0.2:8080/temp_02/properties/latitude",
                        "contentType": "application/json"
                    },
                    {
                        "op": [
                            "readproperty",
                            "writeproperty"
                        ],
                        "href": "http://192.168.80.1:8080/temp_02/properties/latitude",
                        "contentType": "application/json"
                    },
                    {
                        "op": [
                            "readproperty",
                            "writeproperty"
                        ],
                        "href": "coap://15.0.0.2:5683/temp_02/properties/latitude",
                        "contentType": "application/json"
                    },
                    {
                        "op": [
                            "readproperty",
                            "writeproperty"
                        ],
                        "href": "coap://192.168.80.1:5683/temp_02/properties/latitude",
                        "contentType": "application/json"
                    }
                ],
                "title": "Latitude",
                "readOnly": false,
                "writeOnly": false,
                "observable": false,
                "description": "Latitude of the sensor"
            },
            "longitude": {
                "@type": "xsd:float",
                "forms": [
                    {
                        "op": [
                            "readproperty",
                            "writeproperty"
                        ],
                        "href": "http://15.0.0.2:8080/temp_02/properties/longitude",
                        "contentType": "application/json"
                    },
                    {
                        "op": [
                            "readproperty",
                            "writeproperty"
                        ],
                        "href": "http://192.168.80.1:8080/temp_02/properties/longitude",
                        "contentType": "application/json"
                    },
                    {
                        "op": [
                            "readproperty",
                            "writeproperty"
                        ],
                        "href": "coap://15.0.0.2:5683/temp_02/properties/longitude",
                        "contentType": "application/json"
                    },
                    {
                        "op": [
                            "readproperty",
                            "writeproperty"
                        ],
                        "href": "coap://192.168.80.1:5683/temp_02/properties/longitude",
                        "contentType": "application/json"
                    }
                ],
                "title": "Longitude",
                "readOnly": false,
                "writeOnly": false,
                "observable": false,
                "description": "Longitude of the sensor"
            }
        },
        "securityDefinitions": {
            "no_sec": {
                "scheme": "nosec"
            }
        }
    }
]

Thx :)

WWW-Authenticate header missing for failed Authentication

The exploration-secboot-auth states that:

If security bootstrapping is enabled on an exploration service using one of the following IANA-registered HTTP Authentication Schemes: Basic, Bearer, or Digest, then a 401 HTTP response at an API endpoint intended to serve a TD MUST include a WWW-Authenticate header and any other headers describing the required authorizations.

Currently, zion uses the Bearer token mechanism but it does not fulfill the assertion.

Discrepancy of environment variable names (`SERVER` vs `APP`)

The .env, test.env, and README.md files refer to an environment variable called ZION_SERVER_PORT for configuring the port the Zion server should listen on:

ZION_SERVER_PORT=3000

zion/.env

Line 3 in 5b03e3e

ZION_SERVER_PORT=3000

zion/README.md

Lines 66 to 67 in 5b03e3e

# ZION_SERVER_PORT specifies the port number on which the Zion server will listen for incoming requests.
ZION_SERVER_PORT=3000

However, in the codebase itself, this environment variable is apparently not being used and instead, the AppConfig tries to use the variables ZION_APP_HOST and ZION_APP_PORT instead:

host: this.nestConfigService.get('ZION_APP_HOST', Default.app.host),
port: this.nestConfigService.get('ZION_APP_PORT', Default.app.port),

Is this correct or should ZION_APP_HOST and ZION_APP_PORT be changed to ZION_SERVER_HOST and ZION_SERVER_PORT here (or vice versa)?

Use `assert` or `require` for input validation methods/functions

I've also noticed that we have requireValidThingDescription method in the same class. We should decide whether to use assert or require in such cases and write the final decision here (I'm opening an issue to tracking this down)

We have functions that validate input and show if the input is not valid. How we should prefix those functions? In #18 we are suggesting using assert but previously we used require. Which one is more evocative? You can even propose your alternative prefix here. When the discussion is settled we MUST update the CONTRIBUTING.md

Improve configuration process

Currently, Zion utilizes a simple Env base configuration workflow. We should organize configuration parameters in a hierarchical data structure. Moreover, we have to keep in mind different developer workflows and experiences. This means that we need the flexibility to configure Zion from different sources with different priorities (like JSON/YAML files, CLI parameters, ENVs). This issue serves also as a place to evaluate different ideas before going to the PR phase.

Todos:

  • Refactoring code to have a structured config model
  • Support different development environments
  • Hooks on package.json
  • Configuration file support
  • CLI support
  • Review and check the defaults

Sources:

  1. Nest configuration
  2. Commander in Nest

Trailing slashes not allowed in URLs

Just a small thing, and it's probably spec compliant, but this caught me out when I wasn't sure why I kept getting 404 responses.

A GET request on /things works, but a request on /things/ returns a 404.

Can't `docker compose up`

It seems that the migration step in the docker compose it is not properly configured.

Step to reproduce

  • clone the repository
  • docker compose up
  • Zion won't start:
zion               | 
zion               | > @vaimee/[email protected] db:migrate:latest
zion               | > knex migrate:latest
zion               |
zion               | Requiring external module ts-node/register
zion               | [[email protected]][DEBUG] "ZION_NODE_ENV" is already defined in `process.env` and was NOT overwritten
zion               | [[email protected]][DEBUG] "ZION_SERVER_PORT" is already defined in `process.env` and was NOT overwritten
zion               | [[email protected]][DEBUG] "ZION_DB_HOST" is already defined in `process.env` and was NOT overwritten
zion               | [[email protected]][DEBUG] "ZION_DB_PORT" is already defined in `process.env` and was NOT overwritten
zion               | [[email protected]][DEBUG] "ZION_DB_USER" is already defined in `process.env` and was NOT overwritten
zion               | [[email protected]][DEBUG] "ZION_DB_PASSWORD" is already defined in `process.env` and was NOT overwritten
zion               | [[email protected]][DEBUG] "ZION_DB_TYPE" is already defined in `process.env` and was NOT overwritten
zion               | [[email protected]][DEBUG] "ZION_JWT_SECRET" is already defined in `process.env` and was NOT overwritten
zion               | [[email protected]][DEBUG] "ZION_JWT_EXPIRES_IN" is already defined in `process.env` and was NOT overwritten
zion               | connect ECONNREFUSED 172.23.0.2:54310
zion               | Error: connect ECONNREFUSED 172.23.0.2:54310
zion               |     at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1494:16)
zion               | npm notice 
zion               | npm notice New minor version of npm available! 9.5.1 -> 9.6.7
zion               | npm notice Changelog: <https://github.com/npm/cli/releases/tag/v9.6.7>
zion               | npm notice Run `npm install -g [email protected]` to update!
zion               | npm notice

PATCH /things endpoint returns 400 no matter the payload

I created a very simple TD and tried to updated it using the PATCH endpoint, but no matter the payload that I added in the PATCH request the server replied was { "type": "/errors/types/bad-request", "title": "Bad Request", "status": 400 }

For reference, the created TD was { "@context": "https://www.w3.org/2019/wot/td/v1", "title": "testTD", "securityDefinitions": { "basic_sc": { "scheme": "basic", "in": "header" } }, "security": "basic_sc" } and the executed PATCH request was curl --request PATCH \ --url http://localhost:3000/things/urn:uuid:1459b300-5388-4dcc-a802-90ebbf1e7e6e \ --header 'authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjksImlhdCI6MTY1OTEwNDM4MywiZXhwIjoxNjU5MTA1MjgzfQ.S7x7_ACToNa_caVE11asTts4xjgwZoQbMupI93FeUrI' \ --header 'content-type: application/json' \ --data '{"@context": "https://www.w3.org/2019/wot/td/v1","title": "update testTD","securityDefinitions": {"basic_sc": {"scheme": "basic","in": "header"}},"security": "basic_sc"}'

MIssing check on PUT /things/{id} (create) to prevent a different id in the body

When a new TD is created via the PUT /things/{id} endpoint, it is possible to pass two different ids between the one in the URL and the one in the body. This creates a situation where the user will receive a 404 Not Found if they subsequently try to retrieve the TD via the id in the descriptor.

If we take a look at the documentation it becomes clear to me that this situation should not be possible:

A TD that has an id MUST be submitted to the directory in the body of an HTTP PUT request at /things/{id} endpoint, where id is the unique TD identifier, present inside the TD object.

TDD affordances under zion.vaimee.com not working

I sometimes use the Zion instance running under https://zion.vaimee.com for testing. However, this instance can currently only be used for rudimentary testing, since the forms of its affordances are pointing to localhost:3000 at the moment.

To be able to use it for interoperability testing and in examples, it would be nice if the configuration could be adjusted – do you think that would be possible? Or has the current configuration been a deliberate choice?

Can't import config service in TDLifeCycleEvents

cabe601 introduced support for recording events in the memory. The length of the array used to record the events should be configured using the ConfigService. However, if you try to inject the service as a constructor parameter, Nest screams:

[Nest] 14328  - 21/06/2022, 12:51:29   ERROR [ExceptionHandler] Nest can't resolve dependencies of the TDLifeCycleEventRepository (?). Please make sure that the argument dependency at index [0] is available in the PersistenceModule context.

Potential solutions:
- If dependency is a provider, is it part of the current PersistenceModule?
- If dependency is exported from a separate @Module, is that module imported within PersistenceModule?
  @Module({
    imports: [ /* the Module containing dependency */ ]
  })

Notice that I checked for imports:

  imports: [
    ConfigModule, // importing ConfigModule
    KnexModule.forRootAsync({
      imports: [ConfigModule],
      useFactory: (config: ConfigService) => ({
        config: {
          client: 'pg',
          connection: {
            host: config.dbHost,
            port: config.dbPort,
            user: config.dbUser,
            password: config.dbPassword,
            database: config.dbDatabase,
          },
        },
      }),
      inject: [ConfigService],
    }),
  ],

Error on deploying the Zion service with docker compose

hi all,

I am trying to deploy via docker compose the zion service. It seems that the environmental variable
ZION_DB_HOST=host.docker.internal is not understood.
Similarly the .env file is not found by the service.

[+] Running 2/2
 ⠿ Container zion-postgres-dev  Recreated                                                                                       0.4s
 ⠿ Container zion               Recreated                                                                                       0.0s
Attaching to zion, zion-postgres-dev
zion-postgres-dev  | 
zion-postgres-dev  | PostgreSQL Database directory appears to contain a database; Skipping initialization
zion-postgres-dev  | 
zion-postgres-dev  | 2023-06-27 08:33:02.092 UTC [1] LOG:  starting PostgreSQL 14.3 on x86_64-pc-linux-musl, compiled by gcc (Alpine 11.2.1_git20220219) 11.2.1 20220219, 64-bit
zion-postgres-dev  | 2023-06-27 08:33:02.092 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
zion-postgres-dev  | 2023-06-27 08:33:02.092 UTC [1] LOG:  listening on IPv6 address "::", port 5432
zion-postgres-dev  | 2023-06-27 08:33:02.098 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
zion-postgres-dev  | 2023-06-27 08:33:02.108 UTC [21] LOG:  database system was shut down at 2023-06-27 08:33:01 UTC
zion-postgres-dev  | 2023-06-27 08:33:02.113 UTC [1] LOG:  database system is ready to accept connections
zion               | 
zion               | > @vaimee/[email protected] db:migrate:latest
zion               | > knex migrate:latest
zion               | 
zion               | Requiring external module ts-node/register
zion               | [[email protected]][DEBUG] Failed to load /home/node/app/.env ENOENT: no such file or directory, open '/home/node/app/.env'
zion               | getaddrinfo ENOTFOUND host.docker.internal
zion               | Error: getaddrinfo ENOTFOUND host.docker.internal
zion               |     at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:107:26)
zion               | npm notice 
zion               | npm notice New minor version of npm available! 9.5.1 -> 9.7.2
zion               | npm notice Changelog: <https://github.com/npm/cli/releases/tag/v9.7.2>
zion               | npm notice Run `npm install -g [email protected]` to update!
zion               | npm notice 
zion exited with code 1

I am trying to deploy zion to a Ubuntu 22.04.1 LTS machine,

Any idea is more than welcome!
Thank you so much for your time and support!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.