😍

ToolJet#01 インストール

2023/01/20に公開

はじめに

ToolJetの検証を行った際の備忘録です。Budibasenocobaseと比べるとかなりハマるポイントがありました。

構成

  • Windows11(or Windows10)上にWSL2を使ってUbuntu22.04を構築
  • Docker環境構築済み
  • dockerとdocker-composeコマンドがsudo無しで利用可能
  • viコマンドが使える
  • ToolJetのバージョンは2.0.2
  • 接続先ポートは13001->80にしています。

構成イメージ

今回はA->B間の接続しか設定していません。

A.Windows11のIPアドレスが192.168.10.111だったとした場合、同一ネットワークの192.168.10.121の端末からは今回の設定を行ってもアクセスできません。その接続をできるようにするには、A上で13001ポートを解放(ファイヤウォールから除外)し、Bへ転送する経路が必要です。

図にすると思ったより深くてわかりにくい…

構築手順

ToolJet用ディレクト作成

ホームディレクトを /home/myuser とします。下記の手順でtooljet用のフォルダを作成。
その後、カレントディレクトリを作成したtooljetに移動

cd ~
mkdir tooljet
cd tooljet

必要なファイルの準備

.envの作成

下記のコマンドを実行し、環境設定用ファイルを作成

vi .env
(aキーを押して、入力モードに入る)
(その後、下記のアコーディオン内の内容をクリップボードにコピー)

.env

LOCKBOX_MASTER_KEY,SECRET_KEY_BASEについてはLinux上で生成したキーを使って再設定をオススメします。

設定項目 キー生成コマンド
LOCKBOX_MASTER_KEY openssl rand -hex 32
SECRET_KEY_BASE openssl rand -hex 64
# Create .env from this example file and replace values for the environment.
# The application expects a separate .env.test for test environment configuration
# Get detailed information about each variable here: https://docs.tooljet.com/docs/setup/env-vars

TOOLJET_HOST=http://localhost
LOCKBOX_MASTER_KEY=5678f86542b2f00be46ddddc8e87cf28e854945d2999987c3bb5b5f4770ca36f
SECRET_KEY_BASE=12345678a8de3e3be1ef49353078282a8b6c290aede9dcf3afa4bec5ff6438dd263c6c79096bf1572784db88dae26915561da42c137e76216c99717446e508e9

# DATABASE CONFIG
ORM_LOGGING=all
PG_DB=tooljet_production
PG_USER=postgres
PG_HOST=postgres
PG_PASS=postgres

# Checks every 24 hours to see if a new version of ToolJet is available
# (Enabled by default. Set 0 to disable)
CHECK_FOR_UPDATES=

# Checks every 24 hours to update app telemetry data to ToolJet hub.
# (Telemetry is enabled by default. Set value to true to disable.)
# DISABLE_APP_TELEMETRY=false

GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=

# EMAIL CONFIGURATION
DEFAULT_FROM_EMAIL=hello@tooljet.io
SMTP_USERNAME=
SMTP_PASSWORD=
SMTP_DOMAIN=
SMTP_PORT=

# DISABLE USER SIGNUPS (true or false). Default: true
DISABLE_SIGNUPS=

# OBSERVABILITY
APM_VENDOR=
SENTRY_DNS=
SENTRY_DEBUG=

# FEATURE TOGGLE
COMMENT_FEATURE_ENABLE=
ENABLE_MULTIPLAYER_EDITING=true

#SSO
SSO_DISABLE_SIGNUP=
SSO_RESTRICTED_DOMAIN=
SSO_GOOGLE_OAUTH2_CLIENT_ID=
SSO_GIT_OAUTH2_CLIENT_ID=
SSO_GIT_OAUTH2_CLIENT_SECRET=

(viの編集画面に戻り、右クリック)
(その後、ESCキー押下)
:wq

これで、 .env の作成が完了。

docker-compose.ymlの作成

下記のコマンドを実行し、docker環境構築ファイルを作成

vi docker-compose.yml
(aキーを押して、入力モードに入る)
(その後、下記のアコーディオン内の内容をクリップボードにコピー)

docker-compose.yml
version: '3'

services:
  client:
    tty: true
    stdin_open: true
    image: tooljet/tooljet-client-ce:latest
    container_name: tooljet-client
    restart: always
    env_file: .env
    depends_on:
      - server
    volumes:
      - ./logs:/var/log/openresty/
      - ./certs:/etc/resty-auto-ssl/
      - ./fallbackcerts:/etc/fallback-certs
    ports:
      - 13001:80
      - 13443:443
    command: openresty -g "daemon off;"

  server:
    image: tooljet/tooljet-server-ce:latest
    container_name: tooljet-server
    tty: true
    stdin_open: true
    restart: always
    ports:
      - 3000
    env_file: .env
    environment:
      SERVE_CLIENT: "false"
    command: npm run start:prod
    depends_on:
      - postgres

  postgres:
    image: postgres:13
    container_name: tooljet-db
    restart: always
    ports:
      - 5432
    volumes:
      - ./postgres:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=postgres

(viの編集画面に戻り、右クリック)
(その後、ESCキー押下)
:wq

これで、 docker-compose.yml の作成が完了。

dockerコンテナ生成

ここまで出来たら終わったも同然。カレントディレクトリはそのままで、下記コマンドを1行ずつ実行してください。

docker-compose up -d
docker-compose run server npm run db:seed

PCスペック次第ですが結構時間がかかります。

エラーが出ているのが気になりますが、無視して http://localhost:13001 へアクセスしててください。

稼働確認


この画面が表示されたら無事セットアップ完了です。お疲れ様です。

初期セットアップ

次画面に進むと、

上記のように管理者アカウントの登録になります。Ver2.00から変更されているかもしれません。
今までは下記でログインしていたようです。

email: dev@tooljet.io
password: password

ハマったポイント

ハマったポイントをまとめておきます。

.envの設定箇所が分かりにくい

項目数が多くて、設定が必要なのかどうかわかりにくい

TOOLJET_HOSTはポート番号を指定してはいけない

.env内のTOOLJET_HOSTについて当初、 http://localhost:13001 と指定していましたが、この設定ではToolJetのダッシュボードが表示されません。

コマンドでエラーが発生する

 docker-compose run server npm run db:seed

Docker環境構築中に上記コマンドを実行すると…

といった結果になります。

エラーメッセージ全文
$ docker-compose run server npm run db:seed
Creating tooljet_server_run ... done
wait-for-it.sh: waiting 300 seconds for postgres:5432
wait-for-it.sh: postgres:5432 is available after 0 seconds

> tooljet@1.18.0 db:setup:prod /app
> npm --prefix server run db:setup:prod


> server@0.0.1 db:setup:prod /app/server
> npm run db:create:prod && npm run db:migrate:prod


> server@0.0.1 db:create:prod /app/server
> node dist/scripts/create-database.js

Picking up config from the environment
Using Application database
PG_DB: tooljet_production
PG_HOST: postgres


> server@0.0.1 db:migrate:prod /app/server
> node ./node_modules/typeorm/cli.js migration:run --config dist/ormconfig.js && npm run db:migrate:data:prod

query: SELECT * FROM current_schema()
query: CREATE EXTENSION IF NOT EXISTS "pgcrypto"
query: SHOW server_version;
query: SELECT * FROM "information_schema"."tables" WHERE "table_schema" = 'public' AND "table_name" = 'migrations'
query: SELECT * FROM "information_schema"."tables" WHERE "table_schema" = 'public' AND "table_name" = 'typeorm_metadata'
query: SELECT * FROM "migrations" "migrations" ORDER BY "id" DESC
92 migrations are already loaded in the database.
57 migrations were found in the source code.
addDataSourceType1671815159504 is the last executed migration. It was executed on Fri Dec 23 2022 17:05:59 GMT+0000 (Coordinated Universal Time).
1 migrations are new migrations that needs to be executed.
query: START TRANSACTION
query: DELETE FROM migrations where name = 'LockMigrationsTable1234567890000'
query: LOCK TABLE migrations;
query: INSERT INTO "migrations"("timestamp", "name") VALUES ($1, $2) -- PARAMETERS: [1234567891000,"LockMigrationsTable1234567891000"]
Migration LockMigrationsTable1234567891000 has been executed successfully.
query: COMMIT

> server@0.0.1 db:migrate:data:prod /app/server
> node ./node_modules/typeorm/cli.js migration:run --config dist/data-migration-config.js

query: SELECT * FROM current_schema()
query: CREATE EXTENSION IF NOT EXISTS "pgcrypto"
query: SHOW server_version;
query: SELECT * FROM "information_schema"."tables" WHERE "table_schema" = 'public' AND "table_name" = 'migrations'
query: SELECT * FROM "information_schema"."tables" WHERE "table_schema" = 'public' AND "table_name" = 'typeorm_metadata'
query: SELECT * FROM "migrations" "migrations" ORDER BY "id" DESC
92 migrations are already loaded in the database.
38 migrations were found in the source code.
addDataSourceType1671815159504 is the last executed migration. It was executed on Fri Dec 23 2022 17:05:59 GMT+0000 (Coordinated Universal Time).
1 migrations are new migrations that needs to be executed.
query: START TRANSACTION
query: DELETE FROM migrations where name = 'LockMigrationsTable1234567891000'
query: LOCK TABLE migrations;
query: INSERT INTO "migrations"("timestamp", "name") VALUES ($1, $2) -- PARAMETERS: [1234567890000,"LockMigrationsTable1234567890000"]
Migration LockMigrationsTable1234567890000 has been executed successfully.
query: COMMIT

> tooljet@1.18.0 db:seed /app
> npm --prefix server run db:seed


> server@0.0.1 db:seed /app/server
> ts-node -r tsconfig-paths/register --transpile-only ./scripts/seeds.ts

Couldn't find tsconfig.json. tsconfig-paths will be skipped
Error: Cannot find module '../src/app.module'
Require stack:
- /app/server/scripts/seeds.ts
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:902:15)
    at Function.Module._load (internal/modules/cjs/loader.js:746:27)
    at Module.require (internal/modules/cjs/loader.js:974:19)
    at require (internal/modules/cjs/helpers.js:92:18)
    at Object.<anonymous> (/app/server/scripts/seeds.ts:2:1)
    at Module._compile (internal/modules/cjs/loader.js:1085:14)
    at Module.m._compile (/app/server/node_modules/ts-node/src/index.ts:1295:23)
    at Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
    at Object.require.extensions.<computed> [as .ts] (/app/server/node_modules/ts-node/src/index.ts:1298:12)    at Module.load (internal/modules/cjs/loader.js:950:32)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! server@0.0.1 db:seed: `ts-node -r tsconfig-paths/register --transpile-only ./scripts/seeds.ts`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the server@0.0.1 db:seed script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2023-01-20T10_01_45_592Z-debug.log
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! tooljet@1.18.0 db:seed: `npm --prefix server run db:seed`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the tooljet@1.18.0 db:seed script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2023-01-20T10_01_45_604Z-debug.log

が!、気にせず http://localhost:13001 にアクセスすると正常に表示されます。

お手軽お試しモードが起動しない

Try ToolJet with Dockerで紹介されている、お手軽お試しモードの下記コマンドですが…

docker run \
  --name tooljet \
  --restart unless-stopped \
  -p 3000:3000 \
  -v tooljet_data:/var/lib/postgresql/13/main \
  tooljet/try:latest

ブラウザに下記テキストが表示されて終了します。

{"code":"PGRST302","details":null,"hint":null,"message":"Anonymous access is disabled"}

2023/01/20時点ではまだ直っていないようなので、お試しモードはやめたほうが良いです。

Ver2.0.2でMariaDBへの接続は怪しい

これはセットアップ完了後の話ですが、ToolJetからMariaDBに接続したところ、コネクションプールをMAXまで使い切ってしまい、正常に動作しなくなる現象を確認しました。
その後、Postgresで同様の検証をしたところ問題なく動作しましたので、MariaDB固有の問題かもしれません。いまはMariaDBへの接続は避けたほうがよさそうです。
私の環境では接続したシステムがコネクションプール上限のため起動できなくなりましたので、業務システムのDBに接続するのは慎重に。
本体利用しているPostgres内にテスト用のDBを作成するのが安心かと思います。

参考

Discussion