Merge branch 'develop' into docs/workflow-revamp

This commit is contained in:
rudrapratik30 2025-11-24 14:22:09 +05:30
commit 6bce6ed4e7
140 changed files with 7935 additions and 2271 deletions

View file

@ -140,3 +140,50 @@ jobs:
TOOLJET_SERVER_URL: ${{ secrets.CLOUD_TOOLJET_SERVER_URL }}
WEBSITE_SIGNUP_URL: https://website-stage.tooljet.ai/signup
TOOLJET_EDITION: cloud
Purge_Cloudflare_Cache:
needs: deploy
runs-on: ubuntu-latest
steps:
- name: ✅ Check user authorization
run: |
allowed_user1=${{ secrets.ALLOWED_USER1_USERNAME }}
allowed_user2=${{ secrets.ALLOWED_USER2_USERNAME }}
allowed_user3=${{ secrets.ALLOWED_USER3_USERNAME }}
if [[ "${{ github.actor }}" != "$allowed_user1" && \
"${{ github.actor }}" != "$allowed_user2" && \
"${{ github.actor }}" != "$allowed_user3" ]]; then
echo "❌ User '${{ github.actor }}' is not authorized to trigger this workflow."
exit 1
else
echo "✅ User '${{ github.actor }}' is authorized."
fi
- name: 🧹 Purge Cloudflare Cache
continue-on-error: true
run: |
echo "🔄 Purging Cloudflare cache for specific URLs..."
response=$(curl -s -w "\n%{http_code}" -X POST \
"https://api.cloudflare.com/client/v4/zones/${{ secrets.CLOUDFLARE_ZONE_ID_PROD }}/purge_cache" \
-H "Authorization: Bearer ${{ secrets.CLOUDFLARE_API_TOKEN_PROD }}" \
-H "Content-Type: application/json" \
--data '{
"files": [
"${{ secrets.CLOUDFLARE_CONFIG_URL_STAGE }}",
"${{ secrets.CLOUDFLARE_METADATA_URL_STAGE }}"
]
}')
http_code=$(echo "$response" | tail -n1)
body=$(echo "$response" | sed '$d')
if [ "$http_code" = "200" ]; then
echo "✅ Cloudflare cache purged successfully for specified URLs"
echo "$body"
else
echo "⚠️ Cloudflare cache purge failed with status code: $http_code"
echo "$body"
exit 1
fi

View file

@ -118,7 +118,7 @@ jobs:
SERVER_IP: ${{ secrets.CLOUD_PROD_CLOUD_SERVER_IP }}
TJDB_SQL_MODE_DISABLE: ${{ secrets.CLOUD_TJDB_SQL_MODE_DISABLE }}
TOOLJET_SERVER_URL: ${{ secrets.CLOUD_TOOLJET_SERVER_URL }}
WEBSITE_SIGNUP_URL: https://tooljet.ai/ai-create-account
WEBSITE_SIGNUP_URL: https://www.tooljet.com/create-account
TOOLJET_EDITION: cloud
- name: 🚀 Deploy to Netlify
@ -138,5 +138,52 @@ jobs:
SERVER_IP: ${{ secrets.CLOUD_PROD_CLOUD_SERVER_IP }}
TJDB_SQL_MODE_DISABLE: ${{ secrets.CLOUD_PROD_TJDB_SQL_MODE_DISABLE }}
TOOLJET_SERVER_URL: ${{ secrets.CLOUD_PROD_TOOLJET_SERVER_URL }}
WEBSITE_SIGNUP_URL: https://www.tooljet.ai/create-account
WEBSITE_SIGNUP_URL: https://www.tooljet.com/create-account
TOOLJET_EDITION: cloud
Purge_Cloudflare_Cache:
needs: deploy
runs-on: ubuntu-latest
steps:
- name: ✅ Check user authorization
run: |
allowed_user1=${{ secrets.ALLOWED_USER1_USERNAME }}
allowed_user2=${{ secrets.ALLOWED_USER2_USERNAME }}
allowed_user3=${{ secrets.ALLOWED_USER3_USERNAME }}
if [[ "${{ github.actor }}" != "$allowed_user1" && \
"${{ github.actor }}" != "$allowed_user2" && \
"${{ github.actor }}" != "$allowed_user3" ]]; then
echo "❌ User '${{ github.actor }}' is not authorized to trigger this workflow."
exit 1
else
echo "✅ User '${{ github.actor }}' is authorized."
fi
- name: 🧹 Purge Cloudflare Cache
continue-on-error: true
run: |
echo "🔄 Purging Cloudflare cache for specific URLs..."
response=$(curl -s -w "\n%{http_code}" -X POST \
"https://api.cloudflare.com/client/v4/zones/${{ secrets.CLOUDFLARE_ZONE_ID_PROD }}/purge_cache" \
-H "Authorization: Bearer ${{ secrets.CLOUDFLARE_API_TOKEN_PROD }}" \
-H "Content-Type: application/json" \
--data '{
"files": [
"${{ secrets.CLOUDFLARE_CONFIG_URL_PROD }}",
"${{ secrets.CLOUDFLARE_METADATA_URL_PROD }}"
]
}')
http_code=$(echo "$response" | tail -n1)
body=$(echo "$response" | sed '$d')
if [ "$http_code" = "200" ]; then
echo "✅ Cloudflare cache purged successfully for specified URLs"
echo "$body"
else
echo "⚠️ Cloudflare cache purge failed with status code: $http_code"
echo "$body"
exit 1
fi

View file

@ -4,11 +4,11 @@ on:
workflow_dispatch:
inputs:
branch_name:
description: 'Git branch to build from'
description: "Git branch to build from"
required: true
default: 'main'
default: "main"
dockerfile_path:
description: 'Path to Dockerfile'
description: "Path to Dockerfile"
required: true
type: choice
options:
@ -16,7 +16,7 @@ on:
- ./docker/pre-release/ee/ee-production.Dockerfile
- ./docker/LTS/cloud/cloud-server.Dockerfile
docker_tag:
description: 'Docker tag suffix (e.g., pre-release-14)'
description: "Docker tag suffix (e.g., pre-release-14)"
required: true
jobs:
@ -24,6 +24,16 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Free up disk space
run: |
sudo rm -rf /usr/share/dotnet
sudo rm -rf /opt/ghc
sudo rm -rf /usr/local/share/boost
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
sudo docker system prune -af
sudo apt-get clean
df -h
- name: Checkout repo
uses: actions/checkout@v4
with:
@ -57,6 +67,8 @@ jobs:
push: true
tags: ${{ steps.taggen.outputs.tag }}
platforms: linux/amd64
cache-from: type=gha
cache-to: type=gha,mode=max
build-args: |
CUSTOM_GITHUB_TOKEN=${{ secrets.CUSTOM_GITHUB_TOKEN }}
BRANCH_NAME=${{ github.event.inputs.branch_name }}

View file

@ -5,8 +5,8 @@ on:
issue_comment:
types: [created, edited, deleted]
env:
PR_NUMBER: ${{ github.event.number }}
BRANCH_NAME: ${{ github.head_ref || github.ref_name }}
PR_NUMBER: ${{ github.event.pull_request.number || github.event.issue.number }}
BRANCH_NAME: ${{ github.event.pull_request.head.ref || github.head_ref || github.ref_name }}
permissions:
pull-requests: write
@ -20,6 +20,21 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Get PR details for issue_comment events
if: github.event_name == 'issue_comment'
uses: actions/github-script@v6
with:
script: |
const pr = await github.rest.pulls.get({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.issue.number
});
core.exportVariable('PR_NUMBER', pr.data.number);
core.exportVariable('BRANCH_NAME', pr.data.head.ref);
console.log(`✅ PR Number: ${pr.data.number}`);
console.log(`✅ Branch Name: ${pr.data.head.ref}`);
- name: Sync repo
uses: actions/checkout@v3
@ -285,36 +300,7 @@ jobs:
console.log(e)
}
# - name: Install PostgreSQL client
# run: |
# sudo apt update
# sudo apt install postgresql-client -y
# - name: Wait after installing PostgreSQL
# run: sleep 25
# - name: Drop PostgreSQL PR databases
# env:
# PGHOST: ${{ secrets.RENDER_DS_PG_HOST }}
# PGPORT: 5432
# PGUSER: ${{ secrets.RENDER_DS_PG_USER }}
# PGDATABASE: ${{ env.PR_NUMBER }}-ce
# PGTJBDATABASE: ${{ env.PR_NUMBER }}-ce-tjdb
# run: |
# if PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -lqt | cut -d \| -f 1 | grep -qw $PGDATABASE; then
# echo "Database $PGDATABASE exists, deleting..."
# PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -d postgres -c "drop database \"$PGDATABASE\" ;"
# else
# echo "Database $PGDATABASE does not exist."
# fi
# if PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -lqt | cut -d \| -f 1 | grep -qw $PGTJBDATABASE; then
# echo "Database $PGTJBDATABASE exists, deleting..."
# PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -d postgres -c "drop database \"$PGTJBDATABASE\" ;"
# else
# echo "Database $PGTJBDATABASE does not exist."
# fi
suspend-ce-review-app:
if: ${{ github.event.action == 'labeled' && github.event.label.name == 'suspend-ce-review-app' }}
runs-on: ubuntu-latest
@ -391,10 +377,27 @@ jobs:
# Enterprise Edition
create-ee-review-app:
if: ${{ github.event.action == 'labeled' && (github.event.label.name == 'create-ee-review-app' || github.event.label.name == 'review-app') }}
if: |
(github.event.action == 'labeled' && (github.event.label.name == 'create-ee-review-app' || github.event.label.name == 'create-ee-lts-review-app' || github.event.label.name == 'review-app')) ||
(github.event.action == 'created' && (contains(github.event.comment.body, '/deploy-ee') || contains(github.event.comment.body, '/deploy-ee-lts')))
runs-on: ubuntu-latest
steps:
- name: Get PR details for issue_comment events
if: github.event_name == 'issue_comment'
uses: actions/github-script@v6
with:
script: |
const pr = await github.rest.pulls.get({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.issue.number
});
core.exportVariable('PR_NUMBER', pr.data.number);
core.exportVariable('BRANCH_NAME', pr.data.head.ref);
console.log(`✅ PR Number: ${pr.data.number}`);
console.log(`✅ Branch Name: ${pr.data.head.ref}`);
- name: Sync repo
uses: actions/checkout@v3
@ -426,25 +429,26 @@ jobs:
if: env.is_fork == 'false'
uses: actions/checkout@v3
- name: Detect base branch and set Dockerfile path
- name: Determine Dockerfile path
run: |
BASE_BRANCH="${{ github.event.pull_request.base.ref }}"
echo "Base branch: $BASE_BRANCH"
if [[ "$BASE_BRANCH" == "main" || "$BASE_BRANCH" == release/* ]]; then
DOCKERFILE="./docker/pre-release/ee/ee-preview.Dockerfile"
echo "Using pre-release track"
elif [[ "$BASE_BRANCH" == "lts-3.16" || "$BASE_BRANCH" == release-lts/* ]]; then
# Check if LTS deployment is requested via comment or label
if [[ "${{ github.event.action }}" == "labeled" && "${{ github.event.label.name }}" == "create-ee-lts-review-app" ]]; then
DOCKERFILE="./docker/LTS/ee/ee-preview.Dockerfile"
echo "Using LTS track"
EDITION_TYPE="LTS"
echo "Using LTS EE Dockerfile (triggered by label)"
elif [[ "${{ github.event.action }}" == "created" && "${{ github.event.comment.body }}" == *"/deploy-ee-lts"* ]]; then
DOCKERFILE="./docker/LTS/ee/ee-preview.Dockerfile"
EDITION_TYPE="LTS"
echo "Using LTS EE Dockerfile (triggered by comment)"
else
echo "Error: Unsupported base branch '$BASE_BRANCH'"
echo "Supported branches: main, release/*, lts-3.16, release-lts/*"
exit 1
DOCKERFILE="./docker/pre-release/ee/ee-preview.Dockerfile"
EDITION_TYPE="pre-release"
echo "Using pre-release EE Dockerfile"
fi
echo "Edition Type: $EDITION_TYPE"
echo "Selected Dockerfile: $DOCKERFILE"
echo "DOCKERFILE=$DOCKERFILE" >> $GITHUB_ENV
echo "EDITION_TYPE=$EDITION_TYPE" >> $GITHUB_ENV
- name: Creating deployment for Enterprise Edition
id: create-ee-deployment
@ -626,11 +630,12 @@ jobs:
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
const editionType = '${{ env.EDITION_TYPE }}' === 'LTS' ? '(LTS)' : '';
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: 'Enterpise Edition: \n Deployment: https://tooljet-ee-pr-${{ env.PR_NUMBER }}.onrender.com \n Dashboard: https://dashboard.render.com/web/${{ env.SERVICE_ID }}'
body: `Enterprise Edition ${editionType}: \n Deployment: https://tooljet-ee-pr-${{ env.PR_NUMBER }}.onrender.com \n Dashboard: https://dashboard.render.com/web/${{ env.SERVICE_ID }}`
})
- uses: actions/github-script@v6
@ -646,6 +651,17 @@ jobs:
} catch (e) {
console.log(e)
}
try {
await github.rest.issues.removeLabel({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
name: 'create-ee-lts-review-app'
})
} catch (e) {
console.log(e)
}
await github.rest.issues.addLabels({
issue_number: context.issue.number,
@ -708,35 +724,7 @@ jobs:
console.log(e)
}
# - name: Install PostgreSQL client
# run: |
# sudo apt update
# sudo apt install postgresql-client -y
# - name: Wait after installing PostgreSQL
# run: sleep 25
# - name: Drop PostgreSQL PR databases
# env:
# PGHOST: ${{ secrets.RENDER_DS_PG_HOST }}
# PGPORT: 5432
# PGUSER: ${{ secrets.RENDER_DS_PG_USER }}
# PGDATABASE: ${{ env.PR_NUMBER }}-ee
# PGTJBDATABASE: ${{ env.PR_NUMBER }}-ee-tjdb
# run: |
# if PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -lqt | cut -d \| -f 1 | grep -qw $PGDATABASE; then
# echo "Database $PGDATABASE exists, deleting..."
# PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -d postgres -c "drop database \"$PGDATABASE\" ;"
# else
# echo "Database $PGDATABASE does not exist."
# fi
# if PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -lqt | cut -d \| -f 1 | grep -qw $PGTJBDATABASE; then
# echo "Database $PGTJBDATABASE exists, deleting..."
# PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -d postgres -c "drop database \"$PGTJBDATABASE\" ;"
# else
# echo "Database $PGTJBDATABASE does not exist."
# fi
suspend-ee-review-app:
if: ${{ github.event.action == 'labeled' && github.event.label.name == 'suspend-ee-review-app' }}
@ -811,369 +799,6 @@ jobs:
# Cloud Edition
# create-cloud-review-app:
# if: ${{ github.event.action == 'labeled' && (github.event.label.name == 'create-cloud-review-app' || github.event.label.name == 'review-app') }}
# runs-on: ubuntu-latest
# steps:
# - name: Creating deployment for Cloud Edition
# id: create-cloud-deployment
# run: |
# export RESPONSE=$(curl --request POST \
# --url https://api.render.com/v1/services \
# --header 'accept: application/json' \
# --header 'content-type: application/json' \
# --header 'Authorization: Bearer ${{ secrets.RENDER_API_KEY }}' \
# --data '
# {
# "autoDeploy": "yes",
# "branch": "${{ env.BRANCH_NAME }}",
# "name": "ToolJet Cloud PR #${{ env.PR_NUMBER }}",
# "notifyOnFail": "default",
# "ownerId": "tea-caeo4bj19n072h3dddc0",
# "repo": "https://github.com/ToolJet/ToolJet",
# "slug": "tooljet-cloud-pr-${{ env.PR_NUMBER }}",
# "suspended": "not_suspended",
# "suspenders": [],
# "type": "web_service",
# "envVars": [
# {
# "key": "PG_HOST",
# "value": "${{ secrets.RENDER_PG_HOST }}"
# },
# {
# "key": "PG_PORT",
# "value": "5432"
# },
# {
# "key": "PG_USER",
# "value": "${{ secrets.RENDER_PG_USER }}"
# },
# {
# "key": "PG_PASS",
# "value": "${{ secrets.RENDER_PG_PASS }}"
# },
# {
# "key": "PG_DB",
# "value": "${{ env.PR_NUMBER }}-cloud"
# },
# {
# "key": "TOOLJET_DB",
# "value": "${{ env.PR_NUMBER }}-cloud-tjdb"
# },
# {
# "key": "TOOLJET_DB_HOST",
# "value": "${{ secrets.RENDER_PG_HOST }}"
# },
# {
# "key": "TOOLJET_DB_USER",
# "value": "${{ secrets.RENDER_PG_USER }}"
# },
# {
# "key": "TOOLJET_DB_PASS",
# "value": "${{ secrets.RENDER_PG_PASS }}"
# },
# {
# "key": "TOOLJET_DB_PORT",
# "value": "5432"
# },
# {
# "key": "PGRST_DB_PRE_CONFIG",
# "value": "postgrest.pre_config"
# },
# {
# "key": "PGRST_DB_URI",
# "value": "postgres://${{ secrets.RENDER_PG_USER }}:${{ secrets.RENDER_PG_PASS }}@${{ secrets.RENDER_PG_HOST }}/${{ env.PR_NUMBER }}-cloud-tjdb"
# },
# {
# "key": "PGRST_HOST",
# "value": "127.0.0.1:3000"
# },
# {
# "key": "PGRST_JWT_SECRET",
# "value": "r9iMKoe5CRMgvJBBtp4HrqN7QiPpUToj"
# },
# {
# "key": "PGRST_LOG_LEVEL",
# "value": "info"
# },
# {
# "key": "PORT",
# "value": "80"
# },
# {
# "key": "TOOLJET_HOST",
# "value": "https://tooljet-cloud-pr-${{ env.PR_NUMBER }}.onrender.com"
# },
# {
# "key": "DISABLE_TOOLJET_TELEMETRY",
# "value": "true"
# },
# {
# "key": "SMTP_ADDRESS",
# "value": "smtp.mailtrap.io"
# },
# {
# "key": "SMTP_DOMAIN",
# "value": "smtp.mailtrap.io"
# },
# {
# "key": "SMTP_PORT",
# "value": "2525"
# },
# {
# "key": "SMTP_USERNAME",
# "value": "${{ secrets.RENDER_SMTP_USERNAME }}"
# },
# {
# "key": "SMTP_PASSWORD",
# "value": "${{ secrets.RENDER_SMTP_PASSWORD }}"
# },
# {
# "key": "REDIS_HOST",
# "value": "${{ secrets.RENDER_REDIS_HOST }}"
# },
# {
# "key": "REDIS_PORT",
# "value": "${{ secrets.RENDER_REDIS_PORT }}"
# },
# {
# "key": "TEMPORAL_SERVER_ADDRESS",
# "value": "https://auto-setup-1-25-1.onrender.com"
# },
# {
# "key": "TEMPORAL_TASK_QUEUE_NAME_FOR_WORKFLOWS",
# "value": "tooljet-cloud-pr-${{ env.PR_NUMBER }}"
# },
# {
# "key": "TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE",
# "value": "default"
# },
# {
# "key": "TOOLJET_MARKETPLACE_URL",
# "value": "${{ secrets.MARKETPLACE_BUCKET }}"
# },
# {
# "key": "CUSTOM_GITHUB_TOKEN",
# "value": "${{ secrets.CUSTOM_GITHUB_TOKEN }}"
# }
# ],
# "serviceDetails": {
# "disk": null,
# "env": "docker",
# "envSpecificDetails": {
# "dockerCommand": "",
# "dockerContext": "./",
# "dockerfilePath": "./docker/cloud/cloud-preview.Dockerfile"
# },
# "healthCheckPath": "/api/health",
# "numInstances": 1,
# "openPorts": [{
# "port": 80,
# "protocol": "TCP"
# }],
# "plan": "starter",
# "pullRequestPreviewsEnabled": "no",
# "region": "oregon",
# "url": "https://tooljet-cloud-pr-${{ env.PR_NUMBER }}.onrender.com"
# }
# }')
# echo "response: $RESPONSE"
# export SERVICE_ID=$(echo $RESPONSE | jq -r '.service.id')
# echo "SERVICE_ID=$SERVICE_ID" >> $GITHUB_ENV
# - name: Comment deployment URL
# uses: actions/github-script@v5
# with:
# github-token: ${{secrets.GITHUB_TOKEN}}
# script: |
# github.rest.issues.createComment({
# issue_number: context.issue.number,
# owner: context.repo.owner,
# repo: context.repo.repo,
# body: 'Cloud Edition: \n Deployment: https://tooljet-cloud-pr-${{ env.PR_NUMBER }}.onrender.com \n Dashboard: https://dashboard.render.com/web/${{ env.SERVICE_ID }}'
# })
# - uses: actions/github-script@v6
# with:
# script: |
# try {
# await github.rest.issues.removeLabel({
# issue_number: context.issue.number,
# owner: context.repo.owner,
# repo: context.repo.repo,
# name: 'create-cloud-review-app'
# })
# } catch (e) {
# console.log(e)
# }
# await github.rest.issues.addLabels({
# issue_number: context.issue.number,
# owner: context.repo.owner,
# repo: context.repo.repo,
# labels: ['active-cloud-review-app']
# })
# destroy-cloud-review-app:
# if: ${{ (github.event.action == 'labeled' && github.event.label.name == 'destroy-cloud-review-app') || github.event.action == 'closed' }}
# runs-on: ubuntu-latest
# steps:
# - name: Delete service
# run: |
# export SERVICE_ID=$(curl --request GET \
# --url 'https://api.render.com/v1/services?name=ToolJet%20PR%20%23${{ env.PR_NUMBER }}&limit=1' \
# --header 'accept: application/json' \
# --header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}' | \
# jq -r '.[0].service.id')
# curl --request DELETE \
# --url https://api.render.com/v1/services/$SERVICE_ID \
# --header 'accept: application/json' \
# --header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}'
# - uses: actions/github-script@v6
# with:
# script: |
# try {
# await github.rest.issues.removeLabel({
# issue_number: context.issue.number,
# owner: context.repo.owner,
# repo: context.repo.repo,
# name: 'destroy-cloud-review-app'
# })
# } catch (e) {
# console.log(e)
# }
# try {
# await github.rest.issues.removeLabel({
# issue_number: context.issue.number,
# owner: context.repo.owner,
# repo: context.repo.repo,
# name: 'suspend-cloud-review-app'
# })
# } catch (e) {
# console.log(e)
# }
# try {
# await github.rest.issues.removeLabel({
# issue_number: context.issue.number,
# owner: context.repo.owner,
# repo: context.repo.repo,
# name: 'active-cloud-review-app'
# })
# } catch (e) {
# console.log(e)
# }
# - name: Install PostgreSQL client
# run: |
# sudo apt update
# sudo apt install postgresql-client -y
# - name: Wait after installing PostgreSQL
# run: sleep 25
# - name: Drop PostgreSQL PR databases
# env:
# PGHOST: ${{ secrets.RENDER_DS_PG_HOST }}
# PGPORT: 5432
# PGUSER: ${{ secrets.RENDER_DS_PG_USER }}
# PGDATABASE: ${{ env.PR_NUMBER }}-cloud
# PGTJBDATABASE: ${{ env.PR_NUMBER }}-cloud-tjdb
# run: |
# if PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -lqt | cut -d \| -f 1 | grep -qw $PGDATABASE; then
# echo "Database $PGDATABASE exists, deleting..."
# PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -d postgres -c "drop database \"$PGDATABASE\" ;"
# else
# echo "Database $PGDATABASE does not exist."
# fi
# if PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -lqt | cut -d \| -f 1 | grep -qw $PGTJBDATABASE; then
# echo "Database $PGTJBDATABASE exists, deleting..."
# PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -d postgres -c "drop database \"$PGTJBDATABASE\" ;"
# else
# echo "Database $PGTJBDATABASE does not exist."
# fi
# suspend-cloud-review-app:
# if: ${{ github.event.action == 'labeled' && github.event.label.name == 'suspend-cloud-review-app' }}
# runs-on: ubuntu-latest
# steps:
# - name: Suspend service
# run: |
# export SERVICE_ID=$(curl --request GET \
# --url 'https://api.render.com/v1/services?name=ToolJet%20PR%20%23${{ env.PR_NUMBER }}&limit=1' \
# --header 'accept: application/json' \
# --header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}' | \
# jq -r '.[0].service.id')
# curl --request POST \
# --url https://api.render.com/v1/services/$SERVICE_ID/suspend \
# --header 'accept: application/json' \
# --header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}'
# - uses: actions/github-script@v6
# with:
# script: |
# try {
# await github.rest.issues.removeLabel({
# issue_number: context.issue.number,
# owner: context.repo.owner,
# repo: context.repo.repo,
# name: 'active-cloud-review-app'
# })
# } catch (e) {
# console.log(e)
# }
# resume-cloud-review-app:
# if: ${{ github.event.action == 'unlabeled' && github.event.label.name == 'suspend-cloud-review-app' }}
# runs-on: ubuntu-latest
# steps:
# - name: Resume service
# run: |
# export SERVICE_ID=$(curl --request GET \
# --url 'https://api.render.com/v1/services?name=ToolJet%20PR%20%23${{ env.PR_NUMBER }}&limit=1' \
# --header 'accept: application/json' \
# --header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}' | \
# jq -r '.[0].service.id')
# curl --request POST \
# --url https://api.render.com/v1/services/$SERVICE_ID/resume \
# --header 'accept: application/json' \
# --header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}'
# - uses: actions/github-script@v6
# with:
# script: |
# await github.rest.issues.addLabels({
# issue_number: context.issue.number,
# owner: context.repo.owner,
# repo: context.repo.repo,
# labels: ['active-cloud-review-app']
# })
# try {
# await github.rest.issues.removeLabel({
# issue_number: context.issue.number,
# owner: context.repo.owner,
# repo: context.repo.repo,
# name: 'suspend-cloud-review-app'
# })
# } catch (e) {
# console.log(e)
# }
redeploy-review-app:
if: ${{ github.event.action == 'synchronize' || github.event.action == 'opened' }}
runs-on: ubuntu-latest
@ -1404,3 +1029,4 @@ jobs:
} catch (e) {
console.log(e)
}

View file

@ -4,21 +4,21 @@ on:
workflow_dispatch:
inputs:
branch_name:
description: 'Git branch to build from'
description: "Git branch to build from"
required: true
default: 'main'
default: "main"
dockerfile_path:
description: 'Select Dockerfile'
description: "Select Dockerfile"
required: true
type: choice
options:
- ./docker/LTS/ee/ee-production.Dockerfile
- ./docker/pre-release/ee/ee-production.Dockerfile
docker_tag:
description: 'Docker tag suffix (e.g., pre-release-14, 3.16-lts, etc.)'
description: "Docker tag suffix (e.g., pre-release-14, 3.16-lts, etc.)"
required: true
test_system:
description: 'Select test system'
description: "Select test system"
required: true
type: choice
options:
@ -36,6 +36,16 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Free up disk space
run: |
sudo rm -rf /usr/share/dotnet
sudo rm -rf /opt/ghc
sudo rm -rf /usr/local/share/boost
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
sudo docker system prune -af
sudo apt-get clean
df -h
- name: ✅ Check user authorization
run: |
# Define allowed users
@ -52,18 +62,20 @@ jobs:
"${{ secrets.ALLOWED_USER10_TEST_SYSTEM }}"
"${{ secrets.ALLOWED_USER11_TEST_SYSTEM }}"
"${{ secrets.ALLOWED_USER12_TEST_SYSTEM }}"
"${{ secrets.ALLOWED_USER13_TEST_SYSTEM }}"
"${{ secrets.ALLOWED_USER14_TEST_SYSTEM }}"
)
current_user="${{ github.actor }}"
authorized=false
for user in "${allowed_users[@]}"; do
if [[ "$current_user" == "$user" ]]; then
authorized=true
break
fi
done
if [[ "$authorized" == "false" ]]; then
echo "❌ User '$current_user' is not authorized to trigger this workflow."
exit 1
@ -104,6 +116,8 @@ jobs:
push: true
tags: ${{ steps.taggen.outputs.tag }}
platforms: linux/amd64
cache-from: type=gha
cache-to: type=gha,mode=max
build-args: |
CUSTOM_GITHUB_TOKEN=${{ secrets.CUSTOM_GITHUB_TOKEN }}
BRANCH_NAME=${{ github.event.inputs.branch_name }}
@ -119,39 +133,39 @@ jobs:
run: |
test_system="${{ github.event.inputs.test_system }}"
vm_host=$(echo '${{ secrets.VM_HOST_MAP_JSON }}' | jq -r --arg sys "$test_system" '.[$sys]')
if [[ -z "$vm_host" || "$vm_host" == "null" ]]; then
echo "VM mapping not found for $test_system"
exit 1
fi
echo "host=$vm_host" >> $GITHUB_OUTPUT
- name: Deploy to target environment
run: |
echo "$SSH_KEY" > key.pem
chmod 600 key.pem
IMAGE_TAG="${{ steps.taggen.outputs.tag }}"
TARGET_SYSTEM="${{ github.event.inputs.test_system }}"
# Debug: Show what we're deploying
echo "DEBUG: IMAGE_TAG=$IMAGE_TAG"
echo "DEBUG: TARGET_SYSTEM=$TARGET_SYSTEM"
ssh -o StrictHostKeyChecking=no -i key.pem $SSH_USER@${{ steps.vmhost.outputs.host }} << EOF
set -e
IMAGE_TAG="$IMAGE_TAG"
TARGET_SYSTEM="$TARGET_SYSTEM"
cd ~
echo "📁 Finding correct deployment directory"
# Debug: Show variables on remote host
echo "Debug on remote: IMAGE_TAG=\$IMAGE_TAG"
echo "Debug on remote: TARGET_SYSTEM=\$TARGET_SYSTEM"
if [[ "\$TARGET_SYSTEM" == *-3.16-lts ]]; then
echo "Detected LTS system: \$TARGET_SYSTEM"
echo "🔍 Searching for LTS directories..."
@ -182,39 +196,39 @@ jobs:
cd ~
echo "✅ Now in directory: \$(pwd)"
fi
echo "🔐 Docker login"
echo "${{ secrets.DOCKER_PASSWORD }}" | sudo docker login --username "${{ secrets.DOCKER_USERNAME }}" --password-stdin
echo "current image"
cat .env | grep TOOLJET_IMAGE
echo "📦 Reading current TOOLJET_IMAGE from .env"
CURRENT_IMAGE=\$(grep '^TOOLJET_IMAGE=' .env | cut -d '=' -f2- | tr -d '"' | tr -d "'")
echo "Found CURRENT_IMAGE: \$CURRENT_IMAGE"
echo "🛑 Stopping containers"
sudo docker-compose down
echo "📝 Updating .env with new image"
sudo sed -i "s|^TOOLJET_IMAGE=.*|TOOLJET_IMAGE=\$IMAGE_TAG|" .env
echo "📥 Pulling new image: \$IMAGE_TAG"
if [ -z "\$IMAGE_TAG" ]; then
echo "❌ IMAGE_TAG is empty!"
exit 1
fi
sudo docker pull "\$IMAGE_TAG"
echo "🚀 Starting container in background"
sudo docker-compose up -d
# Wait for ToolJet to start and show success message
echo "⏳ Waiting for ToolJet to start (timeout: 300 seconds)..."
SUCCESS_FOUND=false
TIMEOUT=300
ELAPSED=0
while [ \$ELAPSED -lt \$TIMEOUT ]; do
# Check for success message in logs
if sudo docker-compose logs 2>/dev/null | grep -qE "🚀 TOOLJET APPLICATION STARTED SUCCESSFULLY|Ready to use at http://localhost:82 🚀|Ready to use at http://localhost:80"; then
@ -227,7 +241,7 @@ jobs:
sleep 10
ELAPSED=\$((ELAPSED + 10))
done
if [ "\$SUCCESS_FOUND" = false ]; then
echo "❌ Timeout reached without finding success logs"
echo "📄 Showing current logs for troubleshooting..."
@ -248,20 +262,19 @@ jobs:
echo "✅ Rollback completed!"
exit 1
fi
echo "✅ Deployment successful!"
echo "📌 Storing successful deployment info in .env"
sudo sed -i "/^OLD_IMAGE=/d" .env
echo "OLD_IMAGE=\$CURRENT_IMAGE" | sudo tee -a .env
echo "📄 Final application logs:"
sudo docker-compose logs --tail=50
echo "🧹 Pruning old Docker images"
sudo docker image prune -a -f
EOF
env:
SSH_USER: ${{ secrets.AZURE_VM_USER }}
SSH_KEY: ${{ secrets.AZURE_VM_KEY }}

View file

@ -2,8 +2,8 @@ name: Update LTS Table
on:
workflow_dispatch: # manually triggered
schedule:
- cron: '30 5 * * 1,4'
# schedule:
# - cron: '30 5 * * 1,4'
jobs:
update-lts:

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,46 @@
---
id: tooljet-domain-change
title: ToolJet Domain Change
---
We're updating our domain from `tooljet.ai` to `tooljet.com`.
## When is This Happening?
The change will take place at the following times:
- **ET (Eastern Time):** Sunday, November 23, 2025 11:00 PM
- **PT (Pacific Time):** Sunday, November 23, 2025 8:00 PM
- **GMT (Greenwich Mean Time):** Monday, November 24, 2025 4:00 AM
- **IST (Indian Standard Time):** Monday, November 24, 2025 9:30 AM
## What This Means For You
If your organization uses **Single Sign-On (SSO)** to access ToolJet, youll need to update your SSO redirect URLs to continue signing in after the domain change.
- This change is **only applicable to ToolJet Cloud** users.
- If you do **not** update your SSO configuration, **SSO login will stop working** after the domain change.
## How to Fix it
Youll need to regenerate and update the redirect URL for **each SSO provider** you have configured.
### Steps
1. Log in to ToolJet at **`https://app.tooljet.com`**.
2. Go to: **Workspace settings → Workspace login**.
3. Under SSO providers (Google, OIDC, SAML, etc.):
- Click on each configured provider.
- Copy the new redirect URL (it will now contain `tooljet.com` instead of `tooljet.ai`).
4. Go to your SSO providers admin console (e.g., Google, Okta, Azure AD).
5. Update the redirect/callback URL with the new **`tooljet.com`** URL.
6. Save the changes.
7. Test SSO login to ensure everything is working correctly.
For provider-specific configuration details, refer to your usual **[SSO](/docs/user-management/sso/overview)** setup guides.
## When to Update
To ensure uninterrupted access for your team, **please complete this update by Sunday, November 23, 2025, at 8:00 PM** (aligned with your relevant timezone in the schedule above).
If the redirect URLs are not updated before the domain change window, users relying on SSO will not be able to sign in until the configuration is updated.

View file

@ -16,7 +16,7 @@ const isProd = process.env.NODE_ENV === 'production';
module.exports = {
title: 'ToolJet',
tagline: 'Low-code framework to Build internal tools and business apps.',
url: 'https://docs.tooljet.ai',
url: 'https://docs.tooljet.com',
baseUrl: '/',
onBrokenLinks: 'ignore',
onBrokenMarkdownLinks: 'warn',
@ -60,21 +60,21 @@ module.exports = {
position: 'right',
},
{
href: 'https://www.tooljet.ai/',
href: 'https://www.tooljet.com/',
position: 'right',
label: 'Website',
className: 'navbar-signin',
'aria-label': 'Visit ToolJet Website',
},
{
href: 'https://www.tooljet.ai/login',
href: 'https://www.tooljet.com/login',
position: 'right',
label: 'Sign in',
className: 'navbar-signin',
'aria-label': 'Signin to ToolJet',
},
{
href: 'https://www.tooljet.ai/create-account',
href: 'https://www.tooljet.com/create-account',
position: 'right',
label: 'Try for free',
className: 'navbar-website',
@ -83,7 +83,7 @@ module.exports = {
],
},
footer: {
style: 'light',
style: 'light',
logo: {
alt: 'ToolJet Logo',
src: '/img/docs_logo.svg',
@ -93,35 +93,35 @@ module.exports = {
{
title: 'Platform',
items: [
{ label: 'App builder', to: 'https://www.tooljet.ai/visual-app-builder' },
{ label: 'AI Agent builder', to: 'https://www.tooljet.ai/ai-agent-builder' },
{ label: 'ToolJet Database', to: 'https://www.tooljet.ai/database' },
{ label: 'App builder', to: 'https://www.tooljet.com/visual-app-builder' },
{ label: 'AI Agent builder', to: 'https://www.tooljet.com/ai-agent-builder' },
{ label: 'ToolJet Database', to: 'https://www.tooljet.com/database' },
],
},
{
title: 'Solutions',
items: [
{ label: 'Back office tools', to: 'https://www.tooljet.ai/building-back-office-apps' },
{ label: 'Business applications', to: 'https://www.tooljet.ai/business-applications' },
{ label: 'Back office tools', to: 'https://www.tooljet.com/building-back-office-apps' },
{ label: 'Business applications', to: 'https://www.tooljet.com/business-applications' },
],
},
{
title: 'Developers',
items: [
{ label: 'Blogs', to: 'https://blog.tooljet.ai/' },
{ label: 'Events', to: 'https://www.tooljet.ai/events' },
{ label: 'Blogs', to: 'https://blog.tooljet.com/' },
{ label: 'Events', to: 'https://www.tooljet.com/events' },
{ label: 'GitHub', href: 'https://github.com/ToolJet/ToolJet' },
{ label: 'Slack', href: 'https://tooljet.ai/slack' },
{ label: 'Slack', href: 'https://tooljet.com/slack' },
],
},
{
title: 'Templates',
items: [
{ label: 'Lead management', to: 'https://www.tooljet.ai/templates/lead-management-system' },
{ label: 'KPI management', to: 'https://www.tooljet.ai/templates/kpi-management-dashboard' },
{ label: 'Inventory management', to: 'https://www.tooljet.ai/templates/inventory-management-system' },
{ label: 'Leave management', to: 'https://www.tooljet.ai/templates/leave-management-portal' },
{ label: 'Applicant tracking', to: 'https://www.tooljet.ai/templates/applicant-tracking-system' },
{ label: 'Lead management', to: 'https://www.tooljet.com/templates/lead-management-system' },
{ label: 'KPI management', to: 'https://www.tooljet.com/templates/kpi-management-dashboard' },
{ label: 'Inventory management', to: 'https://www.tooljet.com/templates/inventory-management-system' },
{ label: 'Leave management', to: 'https://www.tooljet.com/templates/leave-management-portal' },
{ label: 'Applicant tracking', to: 'https://www.tooljet.com/templates/applicant-tracking-system' },
],
},
{
@ -242,8 +242,41 @@ module.exports = {
window.buildUrlWithStoredParams = buildUrlWithStoredParams; // NEW: Build URLs with UTM params
})();
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
console.log("Script for cookie called");
var cookieName = "source_page";
var domain = ".tooljet.ai";
var maxAge = 7 * 24 * 60 * 60; // 7 days
var currentHost = window.location.hostname;
var fullUrl = window.location.href;
// Helper: read cookie
function getCookie(name) {
var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
return match ? decodeURIComponent(match[2]) : null;
}
// Helper: set cookie
function setCookie(name, value, maxAgeSeconds, domain) {
document.cookie =
name + "=" + encodeURIComponent(value) +
"; path=/; domain=" + domain +
"; max-age=" + maxAgeSeconds + ";";
}
// If user is on blog.tooljet.ai → always update cookie with latest blog URL
// Else → do not overwrite, just keep existing one
if (currentHost.includes("blog.tooljet.ai")) {
setCookie(cookieName, fullUrl, maxAge, domain);
console.log("Updated source_page cookie with latest blog URL: " + fullUrl);
} else {
console.log("Not on blog domain — keeping existing source_page: " + getCookie(cookieName));
}
});
</script>
<!-- Start of HubSpot Embed Code -->
<script type="text/javascript" id="hs-script-loader" async defer src="//js.hs-scripts.com/39494431.js"></script>
<!-- End of HubSpot Embed Code -->
`,
},
},
algolia: {
appId: 'O8HQRLI0WA',
apiKey: process.env.ALGOLIA_API_KEY || 'development', // Public API key: it is safe to commit it
@ -298,6 +331,7 @@ module.exports = {
ignorePatterns: ['/docs/1.x.x/**'],
filename: 'sitemap.xml',
},
googleTagManager: isProd
? {
containerId: process.env.GTM || 'development',
@ -305,6 +339,18 @@ module.exports = {
: undefined,
},
],
[
'redocusaurus',
{
openapi: {
path: 'openapi', // scans all folders inside openapi/, e.g., scim, tj-api
routeBasePath: '/api', // pages will be /api/scim, /api/tj-api
},
theme: {
primaryColor: '#1890ff', // customize the color
},
},
],
],
plugins: [
devServerPlugin,

View file

@ -0,0 +1,419 @@
openapi: 3.0.3
info:
title: ToolJet SCIM API
version: 1.0.0
description: >
ToolJet supports SCIM 2.0 for automated user and group provisioning.
All standard SCIM endpoints are supported — including `/Schemas`, `/ResourceTypes`, `/Users`, and `/Groups`.
servers:
- url: https://app.tooljet.com/api/scim/v2
description: Production server
- url: http://localhost:3000/api/scim/v2
description: Local development server
paths:
/Users:
get:
summary: List Users
responses:
"200":
description: List of users
content:
application/scim+json:
schema:
$ref: '#/components/schemas/SCIMListResponse'
post:
summary: Create User
requestBody:
required: true
content:
application/scim+json:
schema:
$ref: '#/components/schemas/SCIMUserRequest'
responses:
"201":
description: User created
content:
application/scim+json:
schema:
$ref: '#/components/schemas/SCIMUserResponse'
/Users/{id}:
get:
summary: Get User by ID
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
"200":
description: User details
content:
application/scim+json:
schema:
$ref: '#/components/schemas/SCIMUserResponse'
put:
summary: Replace User
parameters:
- name: id
in: path
required: true
schema:
type: string
requestBody:
required: true
content:
application/scim+json:
schema:
$ref: '#/components/schemas/SCIMUserRequest'
responses:
"200":
description: Updated user
content:
application/scim+json:
schema:
$ref: '#/components/schemas/SCIMUserResponse'
patch:
summary: Patch User
parameters:
- name: id
in: path
required: true
schema:
type: string
requestBody:
required: true
content:
application/scim+json:
schema:
$ref: '#/components/schemas/SCIMPatchRequest'
responses:
"200":
description: User updated
content:
application/scim+json:
schema:
$ref: '#/components/schemas/SCIMUserResponse'
delete:
summary: Delete User
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
"204":
description: User deleted
/Groups:
get:
summary: List Groups
responses:
"200":
description: List of groups
content:
application/scim+json:
schema:
$ref: '#/components/schemas/SCIMGroupListResponse'
post:
summary: Create Group
requestBody:
required: true
content:
application/scim+json:
schema:
$ref: '#/components/schemas/SCIMGroupRequest'
responses:
"201":
description: Group created
content:
application/scim+json:
schema:
$ref: '#/components/schemas/SCIMGroupResponse'
/Groups/{id}:
get:
summary: Get Group by ID
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
"200":
description: Group details
content:
application/scim+json:
schema:
$ref: '#/components/schemas/SCIMGroupResponse'
put:
summary: Replace Group
parameters:
- name: id
in: path
required: true
schema:
type: string
requestBody:
required: true
content:
application/scim+json:
schema:
$ref: '#/components/schemas/SCIMGroupRequest'
responses:
"200":
description: Group updated
content:
application/scim+json:
schema:
$ref: '#/components/schemas/SCIMGroupResponse'
patch:
summary: Patch Group
parameters:
- name: id
in: path
required: true
schema:
type: string
requestBody:
required: true
content:
application/scim+json:
schema:
$ref: '#/components/schemas/SCIMPatchRequest'
responses:
"200":
description: Group updated
content:
application/scim+json:
schema:
$ref: '#/components/schemas/SCIMGroupResponse'
delete:
summary: Delete Group
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
"204":
description: Group deleted
components:
schemas:
SCIMUserRequest:
type: object
required:
- schemas
- userName
properties:
schemas:
type: array
items:
type: string
example:
- "urn:ietf:params:scim:schemas:core:2.0:User"
- "urn:ietf:params:scim:schemas:extension:tooljet:User:2.0"
userName:
type: string
name:
type: object
properties:
givenName:
type: string
familyName:
type: string
active:
type: boolean
password:
type: string
description: User password for creation.
emails:
type: array
items:
type: object
properties:
value:
type: string
primary:
type: boolean
type:
type: string
groups:
type: array
items:
type: object
properties:
value:
type: string
display:
type: string
meta:
type: object
properties:
resourceType:
type: string
urn:ietf:params:scim:schemas:extension:tooljet:User:2.0:
type: object
description: ToolJets custom SCIM extension (only used in requests)
properties:
role:
type: string
SCIMUserResponse:
type: object
properties:
schemas:
type: array
items:
type: string
example:
- "urn:ietf:params:scim:schemas:core:2.0:User"
id:
type: string
format: uuid
userName:
type: string
name:
type: object
properties:
givenName:
type: string
familyName:
type: string
active:
type: boolean
emails:
type: array
items:
type: object
properties:
value:
type: string
primary:
type: boolean
type:
type: string
meta:
type: object
properties:
resourceType:
type: string
example: "User"
created:
type: string
format: date-time
lastModified:
type: string
format: date-time
SCIMListResponse:
type: object
properties:
totalResults:
type: integer
startIndex:
type: integer
itemsPerPage:
type: integer
Resources:
type: array
items:
$ref: '#/components/schemas/SCIMUserResponse'
SCIMPatchRequest:
type: object
required:
- schemas
- Operations
properties:
schemas:
type: array
items:
type: string
example:
- "urn:ietf:params:scim:api:messages:2.0:PatchOp"
Operations:
type: array
items:
type: object
properties:
op:
type: string
enum: [add, remove, replace]
path:
type: string
value: {}
SCIMGroupRequest:
type: object
required:
- schemas
- displayName
properties:
schemas:
type: array
items:
type: string
example:
- "urn:ietf:params:scim:schemas:core:2.0:Group"
displayName:
type: string
example: "Developers"
members:
type: array
description: List of User members belonging to this group.
items:
type: object
properties:
value:
type: string
format: uuid
description: User ID
display:
type: string
description: User display name
SCIMGroupResponse:
allOf:
- $ref: '#/components/schemas/SCIMGroupRequest'
- type: object
properties:
id:
type: string
format: uuid
meta:
type: object
properties:
resourceType:
type: string
example: "Group"
created:
type: string
format: date-time
lastModified:
type: string
format: date-time
SCIMGroupListResponse:
type: object
properties:
totalResults:
type: integer
startIndex:
type: integer
itemsPerPage:
type: integer
Resources:
type: array
items:
$ref: '#/components/schemas/SCIMGroupResponse'

1518
docs/package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -28,6 +28,7 @@
"prism-react-renderer": "^2.1.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"redocusaurus": "^2.5.0",
"tailwindcss": "^3.4.12"
},
"devDependencies": {

View file

@ -86,7 +86,7 @@ const sidebars = {
'setup/upgrade-to-v3',
'setup/cloud-v3-migration',
'setup/upgrade-to-v3.16',
'setup/tooljet-domain-change'
]
}
],

View file

@ -967,3 +967,24 @@ button[title="Switch between dark and light mode (currently light mode)"] svg,
.footer {
padding: 0px 70px !important;
}
.sc-kSaXSp.dkiBl { /* This hides the redocly branding at the bottom on the API pages.*/
visibility: hidden;
}
.jcDBan {
border: 0px !important;
margin-left: 0px !important;
}
.gHrCVQ {
padding: 30px 0 !important;
}
.hgujxv {
margin: 0 !important;
}
.sc-dTvVRJ {
padding: 10px 0px !important;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 301 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 KiB

View file

@ -3,13 +3,13 @@ id: codespaces
title: GitHub Codespaces
---
Follow the steps below to set up ToolJet on GitHub Codespaces. We recommend reading our guide on [architecture](https://docs.tooljet.ai/docs/contributing-guide/setup/architecture) of ToolJet before proceeding.
Follow the steps below to set up ToolJet on GitHub Codespaces. We recommend reading our guide on [architecture](https://docs.tooljet.com/docs/contributing-guide/setup/architecture) of ToolJet before proceeding.
Open the terminal and run the commands below.
## Setting up
### 1. Set up the environment
### 1. Set up the environment
1. Install Node.js ( version: v18.18.2 ) and npm (version: v9.8.1)
@ -31,7 +31,7 @@ sudo apt-get update
sudo apt-get install postgresql-13 postgresql-contrib-13
```
To start the postgresql service run the below command:
To start the postgresql service run the below command:
```
sudo service postgresql start
@ -44,14 +44,14 @@ sudo su
sudo -u postgres psql
\password postgres
\password postgres
\q
```
### 2. Set up environment variables
Create a `.env` file by running the command `touch .env`. More information on the variables that can be set is given in the [environment variables reference](https://docs.tooljet.ai/docs/setup/env-vars)
Create a `.env` file by running the command `touch .env`. More information on the variables that can be set is given in the [environment variables reference](https://docs.tooljet.com/docs/setup/env-vars)
**For basic set-up you add the below env variables:**
@ -81,7 +81,7 @@ SERVE_CLIENT=true
>
> `LOCKBOX_MASTER_KEY` requires a 32 byte key. (Run `openssl rand -hex 32` to create a 32 byte secure random key)
### 3. Install and build dependencies
### 3. Install and build dependencies
Make sure node version is set to 18.18.2 before running the below command:
@ -92,7 +92,6 @@ npm install --prefix frontend
npm run build:plugins
```
### 4. Set up database
```

View file

@ -149,7 +149,7 @@ This ID will be longer than the one generated earlier, and it could look like "2
:::tip Resources
- You can also write custom JavaScript code to get the data from **External APIs** and manipulate the response for graphical representation. Here's the [tutorial](https://blog.tooljet.ai/build-github-stars-history-app-in-5-minutes-using-low-code/) on how we used custom JavaScript code to build an app using GitHub API.
- You can also write custom JavaScript code to get the data from **External APIs** and manipulate the response for graphical representation. Here's the [tutorial](https://blog.tooljet.com/build-github-stars-history-app-in-5-minutes-using-low-code/) on how we used custom JavaScript code to build an app using GitHub API.
- [Import external libraries](/docs/how-to/import-external-libraries-using-runjs) using RunJS.
- [Intentionally Fail](/docs/how-to/intentionally-fail-js-query) a RunJS query.
- [Trigger query at specified intervals](/docs/how-to/run-query-at-specified-intervals) using RunJS.

View file

@ -11,7 +11,7 @@ ToolJet can connect to **Amazon S3** buckets and perform various operations on t
To establish a connection with the **Amazon S3** data source, you can either click on the **+ Add new Data source** button located on the query panel or navigate to the **[Data Sources](/docs/data-sources/overview/)** page from the ToolJet dashboard.
ToolJet supports connecting to AWS S3 using **IAM Access Keys**, **AWS Instance Credentials** or **AWS ARN Role**.
ToolJet supports connecting to AWS S3 using **IAM Access Keys**, **AWS Instance Credentials** or **AWS ARN Role**.
If you are using **IAM Access Keys**, you will need to provide the following details:
@ -64,18 +64,19 @@ Query results can be transformed using transformations. Read our [transformation
## Supported Operations
You can create query for AWS S3 data source to perform several actions such as:
- **[Create a new bucket](#create-a-new-bucket)**
- **[Read object](#read-object)**
- **[Upload object](#upload-object)**
- **[Remove object](#remove-object)**
- **[List buckets](#list-buckets)**
- **[List objects in a bucket](#list-objects-in-a-bucket)**
- **[Signed URL for download](#signed-url-for-download)**
- **[Signed URL for upload](#signed-url-for-upload)**
- **[Signed URL for download](#signed-url-for-download)**
- **[Signed URL for upload](#signed-url-for-upload)**
### Create a New Bucket
You can create a new bucket in your S3 by using this operation.
You can create a new bucket in your S3 by using this operation.
#### Required Parameters
@ -85,7 +86,7 @@ You can create a new bucket in your S3 by using this operation.
### Read Object
You can read an object in a bucket by using this operation.
You can read an object in a bucket by using this operation.
#### Required Parameters
@ -96,7 +97,7 @@ You can read an object in a bucket by using this operation.
### Upload Object
You can use this operation to upload objects(files) to your S3 bucket.
You can use this operation to upload objects(files) to your S3 bucket.
#### Required Parameters
@ -105,11 +106,11 @@ You can use this operation to upload objects(files) to your S3 bucket.
- **Content Type**
- **Upload data**
<img style={{marginBottom:'15px'}} className="screenshot-full" src="/img/datasource-reference/aws-s3/uplobjv2-v3.png" alt="aws s3 upload"/>
<img style={{marginBottom:'15px'}} className="screenshot-full" src="/img/datasource-reference/aws-s3/uplobjv2-v3.png" alt="aws s3 upload"/>
### Remove Object
You can use this operation to remove an object from your S3 bucket.
You can use this operation to remove an object from your S3 bucket.
#### Required Parameters
@ -139,7 +140,6 @@ This operation will fetch the list of all the files in your bucket. It requires
- **Offset**
- **Next Continuation Token**
:::info
**Next Continuation Token** <br/>
For listing a bucket for objects that begin with a specific character or a prefix, then use the **Offset** parameter. For example, if you want to list all the objects that begin with **a**, then set the **Offset** parameter to **a**. Similarly, if you want to list all the objects that begin with **ab**, then set the **Offset** parameter to **ab**. <br/>
@ -151,7 +151,7 @@ The results will continue from where the last listing finished.
### Signed URL for Download
The object owner can optionally share objects with others by creating a presigned URL, using their own security credentials, to grant time-limited permission to download the objects.
The object owner can optionally share objects with others by creating a presigned URL, using their own security credentials, to grant time-limited permission to download the objects.
#### Required Parameters
@ -163,7 +163,7 @@ The object owner can optionally share objects with others by creating a presigne
### Signed URL for Upload
The presigned URLs are useful if you want your user/customer to be able to upload a specific object to your bucket, but you don't require them to have AWS security credentials or permissions.
The presigned URLs are useful if you want your user/customer to be able to upload a specific object to your bucket, but you don't require them to have AWS security credentials or permissions.
#### Required Parameters
@ -175,7 +175,7 @@ The presigned URLs are useful if you want your user/customer to be able to uploa
<img className="screenshot-full" src="/img/datasource-reference/aws-s3/urluplv2-v3.png" alt="aws s3 signed upload" />
:::info
We built an app to view and upload files to AWS S3 buckets. Check out the complete tutorial **[here](https://blog.tooljet.ai/build-an-aws-s3-broswer-with-tooljet/)**.
We built an app to view and upload files to AWS S3 buckets. Check out the complete tutorial **[here](https://blog.tooljet.com/build-an-aws-s3-broswer-with-tooljet/)**.
:::
</div>
</div>

View file

@ -6,7 +6,7 @@ title: Stripe
ToolJet can connect to your Stripe account to read or write customers' and payments' data.
:::info
Check out the **[Stripe Refund App tutorial](https://blog.tooljet.ai/build-a-stripe-refund-tool-using-low-code/)**
Check out the **[Stripe Refund App tutorial](https://blog.tooljet.com/build-a-stripe-refund-tool-using-low-code/)**
:::
<div style={{paddingTop:'24px'}}>
@ -16,6 +16,7 @@ Check out the **[Stripe Refund App tutorial](https://blog.tooljet.ai/build-a-str
To establish a connection with the Stripe data source, you can either click on the **+ Add new Data source** button located on the query panel or navigate to the **[Data Sources](/docs/data-sources/overview/)** page from the ToolJet dashboard and choose Stripe as the data source.
ToolJet requires the following to connect to Stripe datasource.
- **Stripe API key**
<img className="screenshot-full" src="/img/datasource-reference/stripe/connect-v2.png" alt="ToolJet - Data source - Stripe" style={{marginBottom:'15px'}}/>
@ -49,149 +50,149 @@ You can check out the some of the operations mentioned below. All the operations
<h3 style={{paddingTop: "15px"}}>Account Operations</h3>
| **Method** | **Endpoint** | **Description** |
|------------|------------------------|-----------------------------------|
| DELETE | `/v1/account` | Delete an account |
| GET | `/v1/account` | Retrieve account details |
| POST | `/v1/account` | Create or update account |
| **Method** | **Endpoint** | **Description** |
| ---------- | ------------- | ------------------------ |
| DELETE | `/v1/account` | Delete an account |
| GET | `/v1/account` | Retrieve account details |
| POST | `/v1/account` | Create or update account |
<h3 style={{paddingTop: "15px"}}>Bank Accounts (Account)</h3>
| **Method** | **Endpoint** | **Description** |
|------------|---------------------------------------|-----------------------------------|
| POST | `/v1/account/bank_accounts` | Add a bank account |
| DELETE | `/v1/account/bank_accounts/{id}` | Delete a bank account |
| GET | `/v1/account/bank_accounts/{id}` | Retrieve bank account details |
| POST | `/v1/account/bank_accounts/{id}` | Update bank account details |
| **Method** | **Endpoint** | **Description** |
| ---------- | -------------------------------- | ----------------------------- |
| POST | `/v1/account/bank_accounts` | Add a bank account |
| DELETE | `/v1/account/bank_accounts/{id}` | Delete a bank account |
| GET | `/v1/account/bank_accounts/{id}` | Retrieve bank account details |
| POST | `/v1/account/bank_accounts/{id}` | Update bank account details |
<h3 style={{paddingTop: "15px"}}>Capabilities (Account)</h3>
| **Method** | **Endpoint** | **Description** |
|------------|------------------------------------------|-----------------------------------|
| GET | `/v1/account/capabilities` | Retrieve account capabilities |
| GET | `/v1/account/capabilities/{capability}` | Retrieve specific capability |
| POST | `/v1/account/capabilities/{capability}` | Update specific capability |
| **Method** | **Endpoint** | **Description** |
| ---------- | --------------------------------------- | ----------------------------- |
| GET | `/v1/account/capabilities` | Retrieve account capabilities |
| GET | `/v1/account/capabilities/{capability}` | Retrieve specific capability |
| POST | `/v1/account/capabilities/{capability}` | Update specific capability |
<h3 style={{paddingTop: "15px"}}>External Accounts (Account)</h3>
| **Method** | **Endpoint** | **Description** |
|------------|---------------------------------------|-----------------------------------|
| GET | `/v1/account/external_accounts` | Retrieve external accounts |
| POST | `/v1/account/external_accounts` | Add an external account |
| DELETE | `/v1/account/external_accounts/{id}` | Delete an external account |
| GET | `/v1/account/external_accounts/{id}` | Retrieve external account details |
| POST | `/v1/account/external_accounts/{id}` | Update external account details |
| **Method** | **Endpoint** | **Description** |
| ---------- | ------------------------------------ | --------------------------------- |
| GET | `/v1/account/external_accounts` | Retrieve external accounts |
| POST | `/v1/account/external_accounts` | Add an external account |
| DELETE | `/v1/account/external_accounts/{id}` | Delete an external account |
| GET | `/v1/account/external_accounts/{id}` | Retrieve external account details |
| POST | `/v1/account/external_accounts/{id}` | Update external account details |
<h3 style={{paddingTop: "15px"}}>People (Account)</h3>
| **Method** | **Endpoint** | **Description** |
|------------|---------------------------------------|-----------------------------------|
| GET | `/v1/account/people` | Retrieve people associated |
| POST | `/v1/account/people` | Add a person to account |
| DELETE | `/v1/account/people/{person}` | Delete a person |
| GET | `/v1/account/people/{person}` | Retrieve person details |
| POST | `/v1/account/people/{person}` | Update person details |
| **Method** | **Endpoint** | **Description** |
| ---------- | ----------------------------- | -------------------------- |
| GET | `/v1/account/people` | Retrieve people associated |
| POST | `/v1/account/people` | Add a person to account |
| DELETE | `/v1/account/people/{person}` | Delete a person |
| GET | `/v1/account/people/{person}` | Retrieve person details |
| POST | `/v1/account/people/{person}` | Update person details |
<h3 style={{paddingTop: "15px"}}>Persons (Account)</h3>
| **Method** | **Endpoint** | **Description** |
|------------|---------------------------------------|-----------------------------------|
| POST | `/v1/account/persons` | Add a person |
| DELETE | `/v1/account/persons/{person}` | Delete a person |
| GET | `/v1/account/persons/{person}` | Retrieve person details |
| POST | `/v1/account/persons/{person}` | Update person details |
| **Method** | **Endpoint** | **Description** |
| ---------- | ------------------------------ | ----------------------- |
| POST | `/v1/account/persons` | Add a person |
| DELETE | `/v1/account/persons/{person}` | Delete a person |
| GET | `/v1/account/persons/{person}` | Retrieve person details |
| POST | `/v1/account/persons/{person}` | Update person details |
<h3 style={{paddingTop: "15px"}}>Other Account Operations</h3>
| **Method** | **Endpoint** | **Description** |
|------------|-------------------------------|-----------------------------------|
| POST | `/v1/account/login_links` | Create login link for account |
| POST | `/v1/account_links` | Create account links |
| **Method** | **Endpoint** | **Description** |
| ---------- | ------------------------- | ----------------------------- |
| POST | `/v1/account/login_links` | Create login link for account |
| POST | `/v1/account_links` | Create account links |
<h3 style={{paddingTop: "15px"}}>Accounts (Specific) Operations</h3>
| **Method** | **Endpoint** | **Description** |
|------------|---------------------------------------|-----------------------------------|
| GET | `/v1/accounts` | Retrieve list of accounts |
| POST | `/v1/accounts` | Create a new account |
| DELETE | `/v1/accounts/{account}` | Delete a specific account |
| GET | `/v1/accounts/{account}` | Retrieve specific account details |
| POST | `/v1/accounts/{account}` | Update specific account details |
| **Method** | **Endpoint** | **Description** |
| ---------- | ------------------------ | --------------------------------- |
| GET | `/v1/accounts` | Retrieve list of accounts |
| POST | `/v1/accounts` | Create a new account |
| DELETE | `/v1/accounts/{account}` | Delete a specific account |
| GET | `/v1/accounts/{account}` | Retrieve specific account details |
| POST | `/v1/accounts/{account}` | Update specific account details |
<h3 style={{paddingTop: "15px"}}>Bank Accounts (Specific)</h3>
| **Method** | **Endpoint** | **Description** |
|------------|---------------------------------------|-----------------------------------|
| POST | `/v1/accounts/{account}/bank_accounts`| Add a bank account |
| DELETE | `/v1/accounts/{account}/bank_accounts/{id}`| Delete a bank account |
| GET | `/v1/accounts/{account}/bank_accounts/{id}`| Retrieve bank account details |
| **Method** | **Endpoint** | **Description** |
| ---------- | ------------------------------------------- | ----------------------------- |
| POST | `/v1/accounts/{account}/bank_accounts` | Add a bank account |
| DELETE | `/v1/accounts/{account}/bank_accounts/{id}` | Delete a bank account |
| GET | `/v1/accounts/{account}/bank_accounts/{id}` | Retrieve bank account details |
<h3 style={{paddingTop: "15px"}}>Capabilities (Specific)</h3>
| **Method** | **Endpoint** | **Description** |
|------------|------------------------------------------|-----------------------------------|
| GET | `/v1/accounts/{account}/capabilities` | Retrieve account capabilities |
| GET | `/v1/accounts/{account}/capabilities/{capability}`| Retrieve specific capability details |
| POST | `/v1/accounts/{account}/capabilities/{capability}`| Update specific capability |
| **Method** | **Endpoint** | **Description** |
| ---------- | -------------------------------------------------- | ------------------------------------ |
| GET | `/v1/accounts/{account}/capabilities` | Retrieve account capabilities |
| GET | `/v1/accounts/{account}/capabilities/{capability}` | Retrieve specific capability details |
| POST | `/v1/accounts/{account}/capabilities/{capability}` | Update specific capability |
<h3 style={{paddingTop: "15px"}}>External Accounts (Specific)</h3>
| **Method** | **Endpoint** | **Description** |
|------------|------------------------------------------|-----------------------------------|
| GET | `/v1/accounts/{account}/external_accounts`| Retrieve external accounts |
| POST | `/v1/accounts/{account}/external_accounts`| Add an external account |
| DELETE | `/v1/accounts/{account}/external_accounts/{id}`| Delete an external account |
| GET | `/v1/accounts/{account}/external_accounts/{id}`| Retrieve external account details|
| **Method** | **Endpoint** | **Description** |
| ---------- | ----------------------------------------------- | --------------------------------- |
| GET | `/v1/accounts/{account}/external_accounts` | Retrieve external accounts |
| POST | `/v1/accounts/{account}/external_accounts` | Add an external account |
| DELETE | `/v1/accounts/{account}/external_accounts/{id}` | Delete an external account |
| GET | `/v1/accounts/{account}/external_accounts/{id}` | Retrieve external account details |
<h3 style={{paddingTop: "15px"}}>People (Specific)</h3>
| **Method** | **Endpoint** | **Description** |
|------------|------------------------------------------|-----------------------------------|
| GET | `/v1/accounts/{account}/people` | Retrieve people associated |
| POST | `/v1/accounts/{account}/people` | Add a person to account |
| DELETE | `/v1/accounts/{account}/people/{person}` | Delete a person |
| GET | `/v1/accounts/{account}/people/{person}` | Retrieve person details |
| POST | `/v1/accounts/{account}/people/{person}` | Update person details |
| **Method** | **Endpoint** | **Description** |
| ---------- | ---------------------------------------- | -------------------------- |
| GET | `/v1/accounts/{account}/people` | Retrieve people associated |
| POST | `/v1/accounts/{account}/people` | Add a person to account |
| DELETE | `/v1/accounts/{account}/people/{person}` | Delete a person |
| GET | `/v1/accounts/{account}/people/{person}` | Retrieve person details |
| POST | `/v1/accounts/{account}/people/{person}` | Update person details |
<h3 style={{paddingTop: "15px"}}>Persons (Specific)</h3>
| **Method** | **Endpoint** | **Description** |
|------------|---------------------------------------|-----------------------------------|
| POST | `/v1/accounts/{account}/persons` | Add a person |
| DELETE | `/v1/accounts/{account}/persons/{person}`| Delete a person |
| GET | `/v1/accounts/{account}/persons/{person}`| Retrieve person details |
| POST | `/v1/accounts/{account}/persons/{person}`| Update person details |
| **Method** | **Endpoint** | **Description** |
| ---------- | ----------------------------------------- | ----------------------- |
| POST | `/v1/accounts/{account}/persons` | Add a person |
| DELETE | `/v1/accounts/{account}/persons/{person}` | Delete a person |
| GET | `/v1/accounts/{account}/persons/{person}` | Retrieve person details |
| POST | `/v1/accounts/{account}/persons/{person}` | Update person details |
<h3 style={{paddingTop: "15px"}}>Other Account-Specific Operations</h3>
| **Method** | **Endpoint** | **Description** |
|------------|------------------------------------------|-----------------------------------|
| POST | `/v1/accounts/{account}/login_links` | Create login link for account |
| POST | `/v1/accounts/{account}/reject` | Reject an account |
| **Method** | **Endpoint** | **Description** |
| ---------- | ------------------------------------ | ----------------------------- |
| POST | `/v1/accounts/{account}/login_links` | Create login link for account |
| POST | `/v1/accounts/{account}/reject` | Reject an account |
<h3 style={{paddingTop: "15px"}}>Apple Pay Operations</h3>
| **Method** | **Endpoint** | **Description** |
|------------|---------------------------------|-----------------------------------|
| GET | `/v1/apple_pay/domains` | Retrieve Apple Pay domains |
| POST | `/v1/apple_pay/domains` | Add a domain to Apple Pay |
| DELETE | `/v1/apple_pay/domains/{domain}`| Delete a domain from Apple Pay |
| GET | `/v1/apple_pay/domains/{domain}`| Retrieve specific Apple Pay domain|
| **Method** | **Endpoint** | **Description** |
| ---------- | -------------------------------- | ---------------------------------- |
| GET | `/v1/apple_pay/domains` | Retrieve Apple Pay domains |
| POST | `/v1/apple_pay/domains` | Add a domain to Apple Pay |
| DELETE | `/v1/apple_pay/domains/{domain}` | Delete a domain from Apple Pay |
| GET | `/v1/apple_pay/domains/{domain}` | Retrieve specific Apple Pay domain |
<h3 style={{paddingTop: "15px"}}>Application Fees Operations</h3>
| **Method** | **Endpoint** | **Description** |
|------------|-------------------------------------------|-----------------------------------|
| GET | `/v1/application_fees` | Retrieve list of application fees |
| GET | `/v1/application_fees/{id}` | Retrieve specific application fee |
| POST | `/v1/application_fees/{id}/refund` | Refund an application fee |
| GET | `/v1/application_fees/{id}/refunds` | Retrieve list of refunds |
| POST | `/v1/application_fees/{id}/refunds` | Create a refund for an application|
| **Method** | **Endpoint** | **Description** |
| ---------- | ----------------------------------- | ---------------------------------- |
| GET | `/v1/application_fees` | Retrieve list of application fees |
| GET | `/v1/application_fees/{id}` | Retrieve specific application fee |
| POST | `/v1/application_fees/{id}/refund` | Refund an application fee |
| GET | `/v1/application_fees/{id}/refunds` | Retrieve list of refunds |
| POST | `/v1/application_fees/{id}/refunds` | Create a refund for an application |
<h3 style={{paddingTop: "15px"}}>Application Fee Refunds (Specific)</h3>
| **Method** | **Endpoint** | **Description** |
|------------|---------------------------------------------|-----------------------------------|
| GET | `/v1/application_fees/{fee}/refunds/{id}` | Retrieve specific refund details
| **Method** | **Endpoint** | **Description** |
| ---------- | ----------------------------------------- | -------------------------------- |
| GET | `/v1/application_fees/{fee}/refunds/{id}` | Retrieve specific refund details |
</div>

View file

@ -7,8 +7,8 @@ title: Quickstart Guide
This quickstart guide walks you through the process of creating an employee directory app using ToolJet. The application lets users track and update employee details while working with core features of the platform, all within a user-friendly interface. Here are the step-by-step instructions:
**[1. Create Your First Application](#1-create-your-first-application)** <br/>
**[2. Create a Database Table](#2-create-a-database-table)** <br/>
**[1. Create Your First Application](#1-create-your-first-application)** <br/>
**[2. Create a Database Table](#2-create-a-database-table)** <br/>
**[3. Create a Query to Fetch Data](#3-create-a-query-to-fetch-data)** <br/>
**[4. Bind Queried Data to the UI](#4-bind-queried-data-to-the-ui)** <br/>
**[5. Create a Query to Add Data](#5-create-a-query-to-add-data)** <br/>
@ -21,15 +21,15 @@ This quickstart guide walks you through the process of creating an employee dire
### 1. Create Your First Application
To begin, create a free **[ToolJet](https://www.tooljet.ai/signup)** account and follow the steps below.
To begin, create a free **[ToolJet](https://www.tooljet.com/signup)** account and follow the steps below.
<div class="video-container">
<iframe width="560" height="315" src="https://www.youtube.com/embed/Cdi9XW-0rkA?si=ue3XS5986NZiaoLC&rel=0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div>
<br/>
- Click on the **Create new app** button on the dashboard. Name your application as "Employee Directory".
- Click and drag a **[Table](/docs/widgets/table)** component on the canvas. Optionally, you can also design a header by adding more components.
- Click on the **Create new app** button on the dashboard. Name your application as "Employee Directory".
- Click and drag a **[Table](/docs/widgets/table)** component on the canvas. Optionally, you can also design a header by adding more components.
<!-- <div style={{textAlign: 'center'}}>
<img style={{marginBottom:'15px', borderRadius: '6px' }} className="screenshot-full" src="/img/quickstart-guide/header-design-v3.png" alt="Database Preview" />
@ -40,14 +40,15 @@ To begin, create a free **[ToolJet](https://www.tooljet.ai/signup)** account and
<div style={{paddingTop:'24px', paddingBottom:'24px'}}>
### 2. Create a Database Table
Now, create a new table in **[ToolJets Database](/docs/tooljet-db/tooljet-database/)** to store employee records.
Now, create a new table in **[ToolJets Database](/docs/tooljet-db/tooljet-database/)** to store employee records.
<div class="video-container">
<iframe width="560" height="315" src="https://www.youtube.com/embed/GKOZsWcOxgI?si=qXGYetr1u9KLdl1Z&rel=0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div>
<br/>
- Name the table *employees*, then add the following columns: firstname, lastname, email, phone, department, position, joining, and status.
- Name the table _employees_, then add the following columns: firstname, lastname, email, phone, department, position, joining, and status.
- Add a few employee records in the database table as placeholder data.
</div>
@ -65,8 +66,8 @@ To display employees in the application, you will first have to fetch the data f
- Click on the **Add** button in the **[Query Panel](/docs/app-builder/query-panel/)** to create a new query.
- Select **ToolJet Database** as the data source for the query.
- Rename the query to *getEmployees*.
- Choose *employees* as the Table name, and List rows as the Operation.
- Rename the query to _getEmployees_.
- Choose _employees_ as the Table name, and List rows as the Operation.
- To automatically run the query when the app starts, enable the toggle for Run this query on application load? setting.
- Click on the **Run** button to fetch data.
@ -76,7 +77,7 @@ To display employees in the application, you will first have to fetch the data f
### 4. Bind Queried Data to the UI
Now, you need to bind the data returned by the *getEmployees* query with the Table created in the first step.
Now, you need to bind the data returned by the _getEmployees_ query with the Table created in the first step.
<div class="video-container">
<iframe width="560" height="315" src="https://www.youtube.com/embed/nh-LgW4uhWU?si=ZL_X5tKB3O6oU2ct&rel=0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
@ -87,10 +88,14 @@ Now, you need to bind the data returned by the *getEmployees* query with the Tab
- Under the Data property, enter the below code:
```js
{{queries.getEmployees.data}}
{
{
queries.getEmployees.data;
}
}
```
Now the Table component is filled with the data returned by the *getEmployees* query.
Now the Table component is filled with the data returned by the _getEmployees_ query.
</div>
@ -98,7 +103,7 @@ Now the Table component is filled with the data returned by the *getEmployees* q
### 5. Create a Query to Add Data
In the bottom-right corner of the Table component, there is a **+(Add new row)** button that opens an auto-generated form to add new data to the Table. Follow the steps below to create an *addEmployees* query and execute it when you click the **Save** button on the auto-generated form.
In the bottom-right corner of the Table component, there is a **+(Add new row)** button that opens an auto-generated form to add new data to the Table. Follow the steps below to create an _addEmployees_ query and execute it when you click the **Save** button on the auto-generated form.
<div class="video-container">
<iframe width="560" height="315" src="https://www.youtube.com/embed/xOihuO1w6Oc?si=CiHstXOao6hQlVtC&rel=0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
@ -106,8 +111,8 @@ In the bottom-right corner of the Table component, there is a **+(Add new row)**
<br/>
- Click on the **Add** button in the query panel, and select **ToolJet Database** as the data source.
- Select *employees* as the Table name, and Create row as the Operation.
- Rename the query to *addEmployees*.
- Select _employees_ as the Table name, and Create row as the Operation.
- Rename the query to _addEmployees_.
- Click on **Add Column** to add the required columns.
- Enter the code below for **email** and **firstname** column keys:
@ -118,23 +123,24 @@ In the bottom-right corner of the Table component, there is a **+(Add new row)**
```
Frame all the remaining keys in the same format.
</div>
<div style={{paddingTop:'24px', paddingBottom:'24px'}}>
### 6. Use Events to Trigger Queries
The *addEmployees* query should run when you click the **Save** button on the auto-generated form. The Table component should then reload and display the updated data whenever a new employee is added. Follow the steps below to set up this functionality using events.
The _addEmployees_ query should run when you click the **Save** button on the auto-generated form. The Table component should then reload and display the updated data whenever a new employee is added. Follow the steps below to set up this functionality using events.
<div class="video-container">
<iframe width="560" height="315" src="https://www.youtube.com/embed/ceMHaJeXASY?si=YC7jOJm5sJSa1p4K&rel=0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div>
<br/>
- In the *addEmployees* query's configuration, scroll down and click on **New event handler** to add a new event.
- Select Query Success as the Event, Run Query as the Action, and *getEmployees* as the Query.
- In the _addEmployees_ query's configuration, scroll down and click on **New event handler** to add a new event.
- Select Query Success as the Event, Run Query as the Action, and _getEmployees_ as the Query.
- Click on the Table component, and click on **New event handler** in the properties panel.
- Choose Add new rows as the Event, Run Query as the Action, and *addEmployees* as the Query.
- Choose Add new rows as the Event, Run Query as the Action, and _addEmployees_ as the Query.
Now, when you click the **+ (Add new row)** button on the Table component, enter the employee details, and click **Save**, the data will be added to the database and automatically reflected in the Table component on the UI.
@ -154,8 +160,6 @@ The preview, release and share buttons are at the top-right of the App-Builder.
- Once the development is done and you are ready to use the application, click on the **Release** button to deploy the app.
- Finally, share your application with your end users using the **Share** button.
Congratulations on completing the tutorial! You've successfully built an employee directory application and, in the process, learnt the fundamentals of ToolJet.
Congratulations on completing the tutorial! You've successfully built an employee directory application and, in the process, learnt the fundamentals of ToolJet.
</div>

View file

@ -7,13 +7,14 @@ This guide gives you an overview of how you can pass values in a REST API Query
<div style={{paddingTop:'24px'}}>
## Raw JSON
## Raw JSON
In the following JSON code, the `${}` syntax is used for JavaScript string interpolation within template literals (also called template strings). This allows dynamic values from JavaScript variables or expressions to be injected directly into the string.
```javascript
{{
`{
{
{
`{
"contents": [{
"parts": [{
"text": "Generate the following content for this image in markdown format:
@ -27,8 +28,9 @@ In the following JSON code, the `${}` syntax is used for JavaScript string inter
}
},],
},],
}`
}}
}`;
}
}
```
<div style={{textAlign: 'center'}}>
@ -49,7 +51,7 @@ In this example, simple key-value pairs are entered in the provided input fields
</div>
To see REST API queries in action, check out the following tutorials:
To see REST API queries in action, check out the following tutorials:
1. **[Gemini AI Content Generator](https://blog.tooljet.ai/build-an-ai-content-generator-using-gemini-api-and-tooljet-in-10-minutes/)**
2. **[Open AI Audio Transcriber](https://blog.tooljet.ai/building-an-audio-transcriber-and-analyzer-using-tooljet-and-openai/)**
1. **[Gemini AI Content Generator](https://blog.tooljet.com/build-an-ai-content-generator-using-gemini-api-and-tooljet-in-10-minutes/)**
2. **[Open AI Audio Transcriber](https://blog.tooljet.com/building-an-audio-transcriber-and-analyzer-using-tooljet-and-openai/)**

View file

@ -2,6 +2,7 @@
id: use-axios-in-runjs
title: Use Axios in RunJS
---
<div style={{paddingBottom:'24px'}}>
ToolJet supports three libraries: **Moment.js**, **Lodash**, and **Axios**. This guide focuses on using the Axios library with RunJS queries. **[Axios](https://axios-http.com/docs/intro)** is a promise-based HTTP client for making requests to your own or external servers. It supports various request types like `GET`, `POST`, `PUT/PATCH`, and `DELETE`.
@ -21,10 +22,10 @@ var url = "https://jsonplaceholder.typicode.com/users/1";
var data = (await axios.get(url)).data;
return data
return data;
```
*This code sets up a URL variable, makes a GET request to the API, and returns the data. Preview the query to see the API's response.*
_This code sets up a URL variable, makes a GET request to the API, and returns the data. Preview the query to see the API's response._
<div style={{textAlign: 'center'}}>
@ -43,18 +44,18 @@ return data
```javascript
var url = "https://jsonplaceholder.typicode.com/users";
var data = axios.post(url,{
var data = axios.post(url, {
id: 11,
name: "Shubhendra",
username: "camelcaseguy",
email: "shubhendra@tooljet.com",})
email: "shubhendra@tooljet.com",
});
return data
return data;
```
This POST request sends user details to the server. The server's response, as shown below, includes **Status: 201** indicating successful resource creation.
<div style={{textAlign: 'center'}}>
<img className="screenshot-full" src="/img/how-to/use-axios/post.png" alt="Use Axios in RunJS"/>
@ -62,7 +63,6 @@ This POST request sends user details to the server. The server's response, as sh
</div>
To see Axios in action in a project, check out this tutorial:
**[Build GitHub star history tracker](https://blog.tooljet.ai/build-github-stars-history-app-in-5-minutes-using-low-code/)**.
**[Build GitHub star history tracker](https://blog.tooljet.com/build-github-stars-history-app-in-5-minutes-using-low-code/)**.
</div>
</div>

View file

@ -3,11 +3,11 @@ id: tooljet-cloud
title: ToolJet Cloud
---
This guide explains the different types of subscriptions present and provides instructions on upgrading your subscription for ToolJet Cloud. For assistance in selecting an appropriate plan, visit the **[ToolJet Pricing](https://www.tooljet.ai/pricing)** page or **[contact the ToolJet team](mailto:hello@tooljet.com)**.
This guide explains the different types of subscriptions present and provides instructions on upgrading your subscription for ToolJet Cloud. For assistance in selecting an appropriate plan, visit the **[ToolJet Pricing](https://www.tooljet.com/pricing)** page or **[contact the ToolJet team](mailto:hello@tooljet.com)**.
## Types of Subscriptions
ToolJet provides three types of subscriptions - **Basic**, **Trial**, and **Paid**. These can be further categorized in different plans based on the services and features. Visit **[ToolJet Pricing](https://www.tooljet.ai/pricing)** page for more details on different plans.
ToolJet provides three types of subscriptions - **Basic**, **Trial**, and **Paid**. These can be further categorized in different plans based on the services and features. Visit **[ToolJet Pricing](https://www.tooljet.com/pricing)** page for more details on different plans.
### Basic Subscription
@ -19,7 +19,7 @@ ToolJet offers a trial subscription which is valid for 14 days, where users can
### Paid Subscription
ToolJet offers various plans for paid subscription. Visit the **[ToolJet Pricing](https://www.tooljet.ai/pricing)** page for more details on different plans. Once you have decided a suitable plan for your needs then you can upgrade to a paid subscription by simply clicking on the upgrade button.
ToolJet offers various plans for paid subscription. Visit the **[ToolJet Pricing](https://www.tooljet.com/pricing)** page for more details on different plans. Once you have decided a suitable plan for your needs then you can upgrade to a paid subscription by simply clicking on the upgrade button.
## Upgrading Your Subscription
@ -37,8 +37,8 @@ Role Required: **Admin**
1. Click the gear icon (⚙️) at the bottom of the left sidebar and select **Settings** from the dropdown.
2. In the Settings page, choose the **Subscription** tab. <br/>
(Example URL - `https://app.corp.com/nexus/settings/subscription`)
2. In the Settings page, choose the **Subscription** tab. <br/>
(Example URL - `https://app.corp.com/nexus/settings/subscription`)
3. The subscription tab displays a subscription overview card summarizing your current plan. Locate the **Upgrade** button in the lower left corner and click on it.
@ -47,7 +47,7 @@ Role Required: **Admin**
5. You'll be directed to a payment gateway. Complete the payment process.
6. Upon successful payment, you'll return to the ToolJet subscription tab. A success message will display, and your subscription overview card will update shortly to reflect your new plan.
<img style={{marginBottom:'15px'}} className="screenshot-full" src="/img/licensing/cloud-license-price.png" alt="Dashboard"/>
<img style={{marginBottom:'15px'}} className="screenshot-full" src="/img/licensing/cloud-license-price.png" alt="Dashboard"/>
If you've decided to move forward with Pro or customized Enterprise plan, please schedule a call with **[ToolJet team](mailto:hello@tooljet.com)** and expect a response from the team within 24-48 hours for onboarding.

View file

@ -3,11 +3,11 @@ id: self-hosted
title: Self-Hosted
---
This guide explains the different types of licenses present and provides instructions on upgrading your license for Self-Hosted ToolJet. Self-Hosted ToolJet works on a license model and you can reach out to the **[ToolJet Team](mailto:hello@tooljet.com)** to generate the key. For assistance in selecting an appropriate plan visit the **[ToolJet Pricing](https://www.tooljet.ai/pricing)** page or contact the **[ToolJet team](mailto:hello@tooljet.com)**.
This guide explains the different types of licenses present and provides instructions on upgrading your license for Self-Hosted ToolJet. Self-Hosted ToolJet works on a license model and you can reach out to the **[ToolJet Team](mailto:hello@tooljet.com)** to generate the key. For assistance in selecting an appropriate plan visit the **[ToolJet Pricing](https://www.tooljet.com/pricing)** page or contact the **[ToolJet team](mailto:hello@tooljet.com)**.
## Types of Licenses
ToolJet provides three types of licenses - **Basic**, **Trial**, and **Paid**. These can be further categorized into different subscription plans. Visit **[ToolJet Pricing](https://www.tooljet.ai/pricing)** page for more details on different subscription plans.
ToolJet provides three types of licenses - **Basic**, **Trial**, and **Paid**. These can be further categorized into different subscription plans. Visit **[ToolJet Pricing](https://www.tooljet.com/pricing)** page for more details on different subscription plans.
### Basic License
@ -19,7 +19,7 @@ ToolJet offers a trial license which is valid for 14 days, where users can acces
### Paid License
ToolJet offers various subscription plans for paid licenses. Visit the **[ToolJet Pricing](https://www.tooljet.ai/pricing)** page for more details on different subscription plans. Once you have decided on a suitable plan for your needs you can then contact the **[ToolJet Team](mailto:hello@tooljet.com)** to complete the onboarding process.
ToolJet offers various subscription plans for paid licenses. Visit the **[ToolJet Pricing](https://www.tooljet.com/pricing)** page for more details on different subscription plans. Once you have decided on a suitable plan for your needs you can then contact the **[ToolJet Team](mailto:hello@tooljet.com)** to complete the onboarding process.
## Updating License Key

View file

@ -21,7 +21,7 @@ Follow the steps below to deploy ToolJet on a DigitalOcean Droplet.
<div style={{textAlign: 'center'}}>
<img className="screenshot-full" src="/img/setup/digitalocean/droplet_plan.png" alt="use a droplet plan" />
</div>
- **Auth**: For authentication, use password or ssh
- Click **Create Droplet** and note the assigned public IP
@ -68,7 +68,7 @@ docker-compose --version
`TOOLJET_HOST=http://<public_ip>:80`
**7. Use the [Docker Documentation](https://docs.tooljet.ai/docs/setup/docker) to deploy ToolJet.**
**7. Use the [Docker Documentation](https://docs.tooljet.com/docs/setup/docker) to deploy ToolJet.**
## Upgrading to the Latest LTS Version

View file

@ -14,6 +14,7 @@ Use the ToolJet-hosted database to build apps faster, and manage your data with
## Enabling the ToolJet Database for your instance
Requires:
- PostgREST server
- Additional configuration for ToolJet server
@ -29,12 +30,12 @@ If you have openssl installed, you can run the following command `openssl rand -
If this parameter is not specified, then PostgREST refuses authentication requests.
:::
| <div style={{ width:"100px"}}> Variable </div> | <div style={{ width:"100px"}}> Description </div> |
| ---------------------------- | ----------------------------------------------- |
| PGRST_JWT_SECRET | JWT token client provided for authentication |
| PGRST_DB_URI | database connection string for tooljet database |
| PGRST_LOG_LEVEL | `info` |
| PGRST_DB_PRE_CONFIG | postgrest.pre_config |
| <div style={{ width:"100px"}}> Variable </div> | <div style={{ width:"100px"}}> Description </div> |
| ---------------------------------------------- | ------------------------------------------------- |
| PGRST_JWT_SECRET | JWT token client provided for authentication |
| PGRST_DB_URI | database connection string for tooljet database |
| PGRST_LOG_LEVEL | `info` |
| PGRST_DB_PRE_CONFIG | postgrest.pre_config |
:::info
Please make sure that DB_URI is given in the format `postgres://[USERNAME]:[PASSWORD]@[HOST]:[PORT]/[DATABASE]`
@ -44,19 +45,17 @@ Please make sure that DB_URI is given in the format `postgres://[USERNAME]:[PASS
#### Additional ToolJet server configuration
| <div style={{ width:"100px"}}> Variable </div> | <div style={{ width:"100px"}}> Description </div> |
| ------------------ | -------------------------------------------- |
| TOOLJET_DB | Default value is `tooljet_db` |
| TOOLJET_DB_HOST | database host |
| TOOLJET_DB_USER | database username |
| TOOLJET_DB_PASS | database password |
| TOOLJET_DB_PORT | database port |
| PGRST_JWT_SECRET | JWT token client provided for authentication |
| PGRST_HOST | postgrest database host |
| TOOLJET_DB_BULK_UPLOAD_MAX_ROWS | Maximum rows allowed to bulk upload. Default value is 1000 |
| TOOLJET_DB_BULK_UPLOAD_MAX_CSV_FILE_SIZE_MB | Maximum file size of CSV for bulk upload. Default value is 5 MB |
| <div style={{ width:"100px"}}> Variable </div> | <div style={{ width:"100px"}}> Description </div> |
| ---------------------------------------------- | --------------------------------------------------------------- |
| TOOLJET_DB | Default value is `tooljet_db` |
| TOOLJET_DB_HOST | database host |
| TOOLJET_DB_USER | database username |
| TOOLJET_DB_PASS | database password |
| TOOLJET_DB_PORT | database port |
| PGRST_JWT_SECRET | JWT token client provided for authentication |
| PGRST_HOST | postgrest database host |
| TOOLJET_DB_BULK_UPLOAD_MAX_ROWS | Maximum rows allowed to bulk upload. Default value is 1000 |
| TOOLJET_DB_BULK_UPLOAD_MAX_CSV_FILE_SIZE_MB | Maximum file size of CSV for bulk upload. Default value is 5 MB |
If you intend to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables).
@ -89,12 +88,10 @@ ToolJet database allows you to:
Once you log-in to your ToolJet account, from the left sidebar of the dashboard you can navigate to **ToolJet Database**.
The ToolJet Database is available on: **[ToolJet Cloud](https://tooljet.ai)**, **[Self-Host](/docs/setup/)**, and **Enterprise Edition**. You can manage your database and its data using the **Database editor UI**.
The ToolJet Database is available on: **[ToolJet Cloud](https://tooljet.com)**, **[Self-Host](/docs/setup/)**, and **Enterprise Edition**. You can manage your database and its data using the **Database editor UI**.
<div style={{textAlign: 'center'}}>
<img style={{ border:'0', marginBottom:'15px', borderRadius:'5px', boxShadow: '0px 1px 3px rgba(0, 0, 0, 0.2)' }} className="screenshot-full" src="/img/v2-beta/database/ux2/tjdbside-v2.png" alt="ToolJet database" />
</div>
</div>

View file

@ -6,48 +6,48 @@ title: ToolJet Documentation Versions
## Current LTS Versions (Stable)
| Version | Documentation |
|------------|------------------------------------------------------------|
| 3.16.0-LTS | [Documentation](https://docs.tooljet.ai/docs/) |
| 3.5.0-LTS | [Documentation](https://docs.tooljet.ai/docs/3.5.0-LTS/) |
| 3.0.0-LTS | [Documentation](https://docs.tooljet.ai/docs/3.0.0-LTS/) |
| 2.50.0-LTS | [Documentation](https://docs.tooljet.ai/docs/2.50.0-LTS/) |
| ---------- | ---------------------------------------------------------- |
| 3.16.0-LTS | [Documentation](https://docs.tooljet.com/docs/) |
| 3.5.0-LTS | [Documentation](https://docs.tooljet.com/docs/3.5.0-LTS/) |
| 3.0.0-LTS | [Documentation](https://docs.tooljet.com/docs/3.0.0-LTS/) |
| 2.50.0-LTS | [Documentation](https://docs.tooljet.com/docs/2.50.0-LTS/) |
<!--
<!--
## Beta Version (Pre-Release)
| Version | Documentation |
| Version | Documentation |
|-------------|-------------------------------------------|
| 3.1.0-Beta 🚧 | [Documentation](https://docs.tooljet.ai/docs/beta/) |
| 3.1.0-Beta 🚧 | [Documentation](https://docs.tooljet.com/docs/beta/) |
-->
## Past Versions (Not Maintained Anymore)
| Version | Documentation |
|-------------|-------------------------------------------|
| 2.65.0 | [Documentation](https://archived-docs.tooljet.ai/docs/) |
| 2.62.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.62.0) |
| 2.61.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.61.0) |
| 2.43.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.43.0) |
| 2.39.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.39.0) |
| 2.36.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.36.0) |
| 2.35.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.35.0) |
| 2.34.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.34.0) |
| 2.33.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.33.0) |
| 2.30.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.30.0) |
| 2.29.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.29.0) |
| 2.27.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.27.0) |
| 2.25.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.25.0) |
| 2.24.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.24.0) |
| 2.23.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.23.0) |
| 2.22.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.22.0) |
| 2.19.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.19.0) |
| 2.18.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.18.0) |
| 2.17.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.17.0) |
| 2.16.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.16.0) |
| 2.15.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.15.0) |
| 2.14.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.14.0) |
| 2.13.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.13.0) |
| 2.12.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.12.0) |
| 2.11.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.11.0) |
| 2.10.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.10.0) |
| 1.x.x | [Documentation](https://archived-docs.tooljet.ai/docs/1.x.x) |
| Version | Documentation |
| ------- | -------------------------------------------------------------- |
| 2.65.0 | [Documentation](https://archived-docs.tooljet.com/docs/) |
| 2.62.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.62.0) |
| 2.61.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.61.0) |
| 2.43.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.43.0) |
| 2.39.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.39.0) |
| 2.36.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.36.0) |
| 2.35.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.35.0) |
| 2.34.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.34.0) |
| 2.33.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.33.0) |
| 2.30.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.30.0) |
| 2.29.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.29.0) |
| 2.27.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.27.0) |
| 2.25.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.25.0) |
| 2.24.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.24.0) |
| 2.23.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.23.0) |
| 2.22.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.22.0) |
| 2.19.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.19.0) |
| 2.18.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.18.0) |
| 2.17.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.17.0) |
| 2.16.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.16.0) |
| 2.15.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.15.0) |
| 2.14.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.14.0) |
| 2.13.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.13.0) |
| 2.12.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.12.0) |
| 2.11.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.11.0) |
| 2.10.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.10.0) |
| 1.x.x | [Documentation](https://archived-docs.tooljet.com/docs/1.x.x) |

View file

@ -1,6 +1,6 @@
---
id: custom-theme
title: Custom Themes
title: App Themes
---
<div style={{display:'flex',justifyContent:"start",alignItems:"center",gap:"8px"}}>
@ -15,13 +15,24 @@ title: Custom Themes
</div>
</div>
ToolJet supports Custom Themes at the workspace level, giving teams complete control over the look and feel of their applications. With this feature, you can define and manage multiple themes and apply them across your apps in a consistent and reusable way.
ToolJet supports App Themes giving teams complete control over the look and feel of their applications. With this feature, you can define and manage multiple themes and apply them across your apps in a consistent and reusable way.
Each workspace can have one or more themes configured, and any application within that workspace can use any of the defined themes. This helps in maintaining visual consistency across applications, improves brand alignment, and enhances user experience.
## What is a Custom Theme?
## Why Use App Themes?
A Custom Theme allows you to customize the UI components of your ToolJet apps by configuring a set of visual styles such as:
App Themes empower your organization by:
- **Brand consistency**: Align your internal tools with your companys visual identity.
- **Reusability**: Define once, use across multiple apps.
- **Customization**: Update the look of all your apps in one go by editing the theme.
- **Collaboration**: Teams working on different apps can maintain a unified design system.
This is especially useful for teams with apps across different environments (e.g., internal tools, client-facing apps, admin panels) where each might need a slightly different yet consistent visual identity.
## How to Use App Themes
An App Theme allows you to customize the UI components of your ToolJet apps by configuring a set of visual styles such as:
- Brand Colors (Primary, Secondary, Tertiary)
- Text colors
- Border and surface styling
@ -33,41 +44,34 @@ You can configure these settings for both light and dark modes, and instantly pr
<img className="screenshot-full img-full" src="/img/app-builder/custom-theme/custom-theme.png" alt="Configure custom theme" />
## Why Use Custom Themes?
<br/><br/>
Custom Themes empower your organization by:
Using App Themes in ToolJet involves two simple steps — **creating the theme** and **applying it to your applications**.
- **Brand consistency**: Align your internal tools with your companys visual identity.
- **Reusability**: Define once, use across multiple apps.
- **Customization**: Update the look of all your apps in one go by editing the theme.
- **Collaboration**: Teams working on different apps can maintain a unified design system.
### 1. Create an App Theme
This is especially useful for teams with apps across different environments (e.g., internal tools, client-facing apps, admin panels) where each might need a slightly different yet consistent visual identity.
## How to Use Custom Themes
Using Custom Themes in ToolJet involves two simple steps — **creating the theme** and **applying it to your applications**.
### 1. Create a Custom Theme
Role Required: **Admin**
- Go to your **Workspace Settings**.
- Click on the **Custom Theme** tab.
- Click on the **Theme** tab.
- Click **Create new theme**.
- Configure your theme styles:
- Set your **Brand colors**: Primary, Secondary, Tertiary
- Define **Text**, **Border**, **System status**, and **Surface** colors
- Choose styles for both **Light** and **Dark** modes
- Click **Save** once you're done.
- Click **Save** once you're done.<br/>
You can create multiple themes as per your needs — for different teams, environments, or clients.
### 2. Apply the Theme to Your Application
Role Required: **Admin/Builder**
- Open the app where you want to use the theme.
- Click the **Settings icon** in the **left sidebar** to open **Global Settings**.
- Scroll down to the **Theme** section.
- Youll see a dropdown showing the currently selected theme (usually the default).
- Click the dropdown to view and select from all your configured themes.
- Click the dropdown to view and select from all your configured themes. <br/>
<img className="screenshot-full img-m" src="/img/app-builder/custom-theme/select-theme.png" alt="Configure custom theme" />
Once selected, your app will now use the chosen theme as the base style for components.
@ -88,7 +92,7 @@ Once components are styled using theme options, changing the theme from Global S
## Scenarios
Here are some scenarios where custom themes shine:
Here are some scenarios where app themes shine:
- **Brand-specific apps**: Create different themes for different brands/clients your company serves.
- **Dark & light mode toggle**: Provide a seamless visual switch for end-users between light and dark modes.
@ -96,17 +100,17 @@ Here are some scenarios where custom themes shine:
## Example
Heres an example showing how an application interface looks before and after applying a custom theme.
Heres an example showing how an application interface looks before and after applying an app theme.
### Before (Default Theme)
This is the default ToolJet UI without any custom theme applied. It uses the standard branding and neutral colors.
This is the default ToolJet UI without any app theme applied. It uses the standard branding and neutral colors.
<img className="screenshot-full img-full" src="/img/app-builder/custom-theme/default-theme-app-v1.png" alt="Configure custom theme" />
### After (Custom Theme Applied)
### After (App Theme Applied)
<img className="screenshot-full img-full" src="/img/app-builder/custom-theme/custom-theme-app-v1.png" alt="Configure custom theme" />
This is the same application after applying the "Coral" custom theme. Notice the button color, primary accents, and overall visual alignment now reflect the chosen palette.
This is the same application after applying the "Coral" app theme. Notice the button color, primary accents, and overall visual alignment now reflect the chosen palette.
By simply configuring a theme once at the workspace level, you can instantly apply a fresh look across all apps, improving usability, clarity, and brand identity.

View file

@ -0,0 +1,115 @@
---
id: customstyles
title: Custom Styles
---
<div className="badge badge--primary heading-badge">
<img
src="/img/badge-icons/premium.svg"
alt="Icon"
width="16"
height="16"
/>
<span>Paid feature</span>
</div>
The Custom Styles feature in ToolJet allows users to apply their own CSS, overriding the default app styles. This enables easy customization of app appearance, and maintains consistent themes across all ToolJet apps. By using standardized styles, users avoid the repetitive task of manually styling components for each new app, enhancing development efficiency and ensuring visual coherence for a seamless user experience
<div style={{textAlign: 'center'}}>
<img className="screenshot-full" src="/img/v2-beta/app-builder/customcss/customcss-v2.gif" alt="Custom CSS" />
</div>
## Applying Custom Styles To All Components
Follow these steps to apply custom styles in your ToolJet apps:
- Navigate to the **Custom Styles** page from **Workspace Settings** on the ToolJet dashboard
<div style={{textAlign: 'center'}}>
<img className="screenshot-full" src="/img/v2-beta/app-builder/customcss/custom-styles.png" alt="Custom CSS" />
</div>
<br/>
- To modify the default colors of components, use their class names, which follow the format `_tooljet-<component>`.
<div style={{textAlign: 'center'}}>
<img className="screenshot-full" src="/img/v2-beta/app-builder/customcss/component-class.png" alt="Component Class" />
</div>
<br/>
- You'll need to identify the specific sub-class(or HTML tags) of each component to target particular attributes. The browser's inspector will allow you to easily find the sub-class(or HTML tags) of the specific
properties.
<div style={{textAlign: 'center'}}>
<img className="screenshot-full" src="/img/v2-beta/app-builder/customcss/button-class-subclass.png" alt="Sub-Class" />
</div>
<br/>
- After locating the specific sub-class(or HTML tag), refer it in the **Custom Styles** section and add styling to it. For instance, for the Button component above, the the below CSS will change the background color:
```css
._tooljet-Button button {
background-color: #152A65 !important;
}
```
<div style={{textAlign: 'center'}}>
<img className="screenshot-full" src="/img/v2-beta/app-builder/customcss/button-component-customcss.png" alt="Button Custom CSS" />
</div>
<br/>
- Similarly, the code below can be used to change the background color of the Filter button on a Table component.
```css
._tooljet-Table .table-card-header button {
background-color: #152A65 !important;
}
```
<div style={{textAlign: 'center'}}>
<img className="screenshot-full" src="/img/v2-beta/app-builder/customcss/filter-button-customcss.png" alt="Filter Custom CSS" />
</div>
<br/>
- The code below will change the font size and color of the Text Input and Number Input labels.
```css
._tooljet-TextInput p {
color: #152A65 !important;
font-size: 16px !important;
font-weight: bold !important;
}
._tooljet-NumberInput p {
color: #152A65 !important;
font-size: 16px !important;
font-weight: bold !important;
}
```
<div style={{textAlign: 'center'}}>
<img className="screenshot-full" src="/img/v2-beta/app-builder/customcss/input-fields-customcss.png" alt="Input Field Custom CSS" />
</div>
## Applying Custom Styles To Individual Components
To modify the colors of individual components, use their class names, which follow the format `_tooljet-<component_name>`. Here, the component name refers to the name of the component that is set in the application.
<div style={{textAlign: 'center'}}>
<img className="screenshot-full" src="/img/v2-beta/app-builder/customcss/individual-class.png" alt="Individual Class Custom CSS" />
</div>
<br/>
- The color of the Button component above can be changed using the code below:
```css
._tooljet-addIncomeButton button {
background-color: blue !important;
}
```
<div style={{textAlign: 'center'}}>
<img className="screenshot-full" src="/img/v2-beta/app-builder/customcss/individual-customcss.png" alt="Individual Class Custom CSS" />
</div>
<br/>
In conclusion, Custom CSS feature lets you override default styles with your own CSS. By providing the flexibility to apply both global and component-specific customizations, this feature enhances the visual coherence and branding of your apps. cs

View file

@ -52,6 +52,7 @@ Refer to the [Accessing Component State](/docs/app-builder/building-ui/component
### Globals
By using the Globals properties in the Inspector, you can view various details about your application and its environment, such as:
- **App Version** - Stores the current app version name.
- **Current User** - Information about the logged-in user, including email, name, avatar, groups, roles, and SSO details. Useful for building role-based UI or showing personalized content.
- **Environment** - Indicates the current ToolJet environment — development, staging, or production.
- **Mode** - Indicates whether the app is opened in the editor or not.

View file

@ -18,7 +18,7 @@ When embedding applications, ToolJet ensures that only the right users can acces
| **Feature** | **Public Applications** | **Private & Data-Sensitive Applications** |
| ------------| ----------------------- | ------------------------------------------|
| **Access Control** | None anyone with the embed link or iframe can view | Requires a valid Personal Access Token (PAT) to load the app. |
| **Access Control** | None anyone with the embed link or iframe can view | Embed Application will follow the SSO of host application |
| **Granularity** | Not applicable | Tokens can be scoped to individual user and application |
| **Best For** | Public dashboards, demos, or open-data applications | Authenticated portals, customer-specific views, internal tools |
| **Example** | Live product status page displaying uptime and incident history | Embedded customer billing dashboard showing only that customers invoices |

View file

@ -7,7 +7,7 @@ title: Understanding AI Credits
This implementation of AI credits will be available from 22nd September 2025.
:::
A credit is a standardized unit of AI processing power consumed on every AI operation performed in ToolJet. Each operation, from [generating complete applications](/docs/build-with-ai/generate-applications) to creating custom code or modifying layouts, consumes a varied amount of credits based on the complexity and type of task. This approach provides transparent cost visibility while enabling you to scale your AI usage on-demand.
A credit is a standardized unit of AI processing power consumed on every AI operation performed in ToolJet. Each operation, from [generating complete applications](/docs/build-with-ai/generate-applications) to creating custom code or modifying layouts, consumes a varied amount of credits based on the complexity and type of task. This approach provides transparent cost visibility while enabling you to scale your AI usage on-demand.
In this guide you will learn about types of credits, credit usage, getting more credits, and more.
@ -15,16 +15,16 @@ In this guide you will learn about types of credits, credit usage, getting more
Credit usage in ToolJet varies based on the complexity of the request. Monthly credits are always consumed first. Add-on credits are utilized only after the monthly credits are exhausted. The table below provides an average range of credits utilized for different operations to help you estimate usage.
| Operation | Avg. Credits Utilised |
|:----------|:---------------------:|
| [App Generation](/docs/build-with-ai/generate-applications) | 100 |
| Adding New Feature in the Application | 100 |
| Modifying Layout/UI | 50 |
| Modifying Queries/Database | 30 |
| [Debug Components Auto Fix](/docs/build-with-ai/debug-components) | 10 |
| [AI Docs Assistant](/docs/build-with-ai/ai-docs-assistant) | 6 |
| SQL Query Generation | 5 |
| Custom Code Generation | 2 |
| Operation | Avg. Credits Utilised |
| :---------------------------------------------------------------- | :-------------------: |
| [App Generation](/docs/build-with-ai/generate-applications) | 100 |
| Adding New Feature in the Application | 100 |
| Modifying Layout/UI | 50 |
| Modifying Queries/Database | 30 |
| [Debug Components Auto Fix](/docs/build-with-ai/debug-components) | 10 |
| [AI Docs Assistant](/docs/build-with-ai/ai-docs-assistant) | 6 |
| SQL Query Generation | 5 |
| Custom Code Generation | 2 |
:::warning
These values are only average estimates to help plan your operations. **Actual credit consumption will vary depending on the complexity of the operation**.
@ -38,7 +38,7 @@ Monthly credits are recurring credits included with your purchased license. They
### Add-on Credits
Add-on credits can be purchased in addition to your monthly credits and are a one-time purchase that do not renew monthly. These credits can only be purchased in multiples of 100 and are valid for one year from the date of purchase. If you buy additional credits after an initial purchase, the validity of the entire pool of credits is extended based on the latest purchase date. Checkout the [pricing](https://www.tooljet.ai/pricing) page for more information.
Add-on credits can be purchased in addition to your monthly credits and are a one-time purchase that do not renew monthly. These credits can only be purchased in multiples of 100 and are valid for one year from the date of purchase. If you buy additional credits after an initial purchase, the validity of the entire pool of credits is extended based on the latest purchase date. Checkout the [pricing](https://www.tooljet.com/pricing) page for more information.
## Buy Add-on Credits
@ -49,9 +49,9 @@ Follow these steps to buy add-on credits on your self-hosted deployment of ToolJ
1. Go to the Settings > License. <br/>
(Example URL - https://app.nexuscorp.com/settings/license)
2. Click on the **Get AI credits** button in the top-right corner. <br/>
<img className="screenshot-full img-full" style={{marginTop:"15px"}} src="/img/tooljet-ai/credits/sh-button.png" alt="AI Credits" />
<img className="screenshot-full img-full" style={{marginTop:"15px"}} src="/img/tooljet-ai/credits/sh-button.png" alt="AI Credits" />
3. A payment modal will open where you can enter details such as the number of credits you want to purchase and any promo codes. After filling out the details, click the **Get AI credits** button at the bottom. <br/>
<img className="screenshot-full img-s" style={{marginTop:"15px"}} src="/img/tooljet-ai/credits/sh-modal.png" alt="AI Credits" />
<img className="screenshot-full img-s" style={{marginTop:"15px"}} src="/img/tooljet-ai/credits/sh-modal.png" alt="AI Credits" />
4. Youll then be redirected to the payment gateway. On successful payment, the credits will be added to your instance.
### Cloud Deployment
@ -59,16 +59,17 @@ Follow these steps to buy add-on credits on your self-hosted deployment of ToolJ
Follow these steps to buy add-on credits on ToolJet Cloud:
1. Go to the Settings > Subscription. <br/>
(Example URL - https://app.tooljet.ai/nexuscorp/settings/subscription)
(Example URL - https://app.tooljet.com/nexuscorp/settings/subscription)
2. Click the **Get AI credits** button. <br/>
<img className="screenshot-full img-full" style={{marginTop:"15px"}} src="/img/tooljet-ai/credits/cloud-button.jpg" alt="AI Credits" />
<img className="screenshot-full img-full" style={{marginTop:"15px"}} src="/img/tooljet-ai/credits/cloud-button.jpg" alt="AI Credits" />
3. A payment modal will open where you can enter details such as the number of credits you want to purchase and any promo codes. After filling out the details, click the Get AI credits button at the bottom. <br/>
<img className="screenshot-full img-full" style={{marginTop:"15px"}} src="/img/tooljet-ai/credits/cloud-modal.png" alt="AI Credits" />
<img className="screenshot-full img-full" style={{marginTop:"15px"}} src="/img/tooljet-ai/credits/cloud-modal.png" alt="AI Credits" />
4. Youll then be redirected to the payment gateway. On successful payment, the credits will be added to your workspace.
## Credit Allocation
ToolJet AI credits are allocated on a per builder per month basis according to the purchased license. The total credits from all builders, along with any add-on credits purchased, are pooled together and made available collectively.
- At **Instance Level** for [Self-Hosted](/docs/tj-setup/tj-deployment#self-hosted-tooljet) deployments.
- At **Workspace Level** for [Cloud](/docs/tj-setup/tj-deployment#tooljet-cloud) deployments.
@ -97,11 +98,11 @@ Starting September 22, 2025, were updating the AI credits system to introduce
### What's Changing
| | Before | After |
|---|--------|-------|
| Denomination | Minimum credit = 0.1 | Minimum credit = 1 |
| | Before | After |
| ------------ | ---------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| Denomination | Minimum credit = 0.1 | Minimum credit = 1 |
| Credit Usage | Fixed credits per operation. <br/> Eg. Every app generation would cost 10 credits. | Variable credits based on complexity of operation. <br/> Eg. A small app could take 70 credits, and a large app could take 120 credits. |
| Credit Types | Monthly recurring credits included in your plan. | - Monthly recurring credits included in your plan. <br/> - Optional purchase of additional credits which are valid for 1 year. |
| Credit Types | Monthly recurring credits included in your plan. | - Monthly recurring credits included in your plan. <br/> - Optional purchase of additional credits which are valid for 1 year. |
### Updated Credit Allocation

View file

@ -0,0 +1,253 @@
---
id: prompting101
title: Prompting 101
---
Prompting is how you communicate with ToolJet's AI to build internal applications. Think of it as giving detailed instructions to a highly skilled developer who understands the platform but needs context about your specific business needs.
The AI then translates these requirements into a fully functional application using ToolJet's low code application builder.
## Why Good Prompting Matters
**The Challenge**: Generic prompts produce generic applications. Simply asking for "a CRM system" or "project management tool" results in basic, template-like apps that don't reflect your actual business processes. <br/>
**The Solution**: Contextual prompting that provides business background, user needs, and specific workflows produces applications that feel purpose-built for your organization.
### Real Impact Example
#### Generic Prompt
**Prompt:** "Build a customer management system" <br/>
**Result**: Basic contact forms and lists that could work for anyone. <br/>
#### Contextual Prompt
**Prompt**: "Our design agency needs to track 50+ concurrent client projects, manage creative approval workflows, and prevent resource conflicts between our 12-person team..." <br/>
**Result**: Specialized project management app with approval workflows, resource calendars, and client communication tools.
## What ToolJet Already Handles
Don't waste your prompt describing these - they're built into the platform:
### ToolJet Automatically Provides
<div style={{ display: 'flex' }} >
<div style = {{ width:'50%' }} >
- User authentication and login systems
- Role-based access control and permissions
- Database integration and data storage
</div>
<div style = {{ width:'5%' }} > </div>
<div style = {{ width:'50%' }} >
- API integrations with external services
- Security features and data encryption
</div>
</div>
### Don't Include in Your Prompts
<div style={{ display: 'flex' }} >
<div style = {{ width:'50%' }} >
- "Build user login and authentication"
- "Add role-based permissions"
</div>
<div style = {{ width:'5%' }} > </div>
<div style = {{ width:'50%' }} >
- "Create API integrations"
- "Include security features"
</div>
</div>
### Instead Focus On
<div style={{ display: 'flex' }} >
<div style = {{ width:'50%' }} >
- Business workflows and processes
- Manual data entry and forms
- Custom business logic
</div>
<div style = {{ width:'5%' }} > </div>
<div style = {{ width:'50%' }} >
- Specific reporting needs
- User interface requirements
</div>
</div>
## The 3-Section Formula
Structure your prompts with these three sections for best results:
### 1. Business Context
Explain why you need this tool and what problems it solves.
#### Good Example
"Our sales team currently tracks leads in spreadsheets across 5 different files, causing data inconsistencies and missed follow-ups. We need centralized lead management that prevents duplicate entries and gives visibility into our sales pipeline."
#### Avoid
"Build a CRM system."
### 2. User Personas
Define who will use the tool and what they need to accomplish.
#### Good Format
- Sales Reps - Need to log new leads, update contact information, and track deal progress
- Sales Managers - Require pipeline visibility, team performance metrics, and forecast reporting
- Marketing Team - Must see lead sources, conversion rates, and campaign effectiveness
### 3. User Flows & Features
Describe how users will interact with the tool through specific workflows.
#### Good Format
- Lead Capture Flow - Import leads from various sources, assign to sales reps, set follow-up reminders
- Pipeline Management Flow - Move deals through stages, update probabilities, log interactions
- Reporting Flow - Generate weekly pipeline reports, track conversion metrics, analyze lead sources
## Best Practices
### Do This
- **Be Specific** <br/>
Instead of "customer management," say "client project tracking for our design agency"
- **Include Real Pain Points** <br/>
Mention actual problems like "version control issues" or "missed deadlines"
- **Think Workflows** <br/>
Describe the step-by-step process users will follow
- **Focus on Manual Processes** <br/>
Describe forms, data entry, and user interactions
### Avoid This
- Generic descriptions lacking proper use cases and context
- Feature lists without context ("needs forms, tables, and reports")
- Technical jargon that doesn't match your business needs
- Overly complex requirements that try to solve everything at once
- UI layout details - let the AI handle design decisions
## How Long Should My Prompt Be?
### Short Prompts (2-3 sentences per section)
- Best for: Simple tools with straightforward workflows
- Risk: May lack necessary detail for complex business logic
### Medium Prompts (1 paragraph per section)
- Best for: Most internal tools
- Sweet spot: Provides enough context without overwhelming
- This length typically produces the most usable results
### Long Prompts (2-3 paragraphs per section)
- Best for: Complex workflows with multiple user types
- Risk: May create overly complicated interfaces
:::tip Pro Tip
Specific prompts use fewer AI credits. Vague prompts make the AI work harder, consuming more credits as it tries to fill in the gaps.
:::
## Scoping Your Application
### Start Small, Then Iterate
Begin with a simple version (3-4 pages) covering core workflows, then build additional features. This approach:
- Makes the application easier to test and refine
- Reduces complexity and potential errors
- Allows you to validate workflows before expanding
## Complete Example: Before & After
### Before (Generic)
"Build a project management system with tasks, deadlines, and team collaboration features."
### After (Contextual)
#### Business Context
Our marketing agency juggles 15+ client campaigns simultaneously, but project details are scattered across email threads, Google Docs, and Slack conversations, causing missed deliverables and confused team members about priorities.
#### User Personas
- Account Managers - Need to track campaign progress, client approvals, and deliverable status
- Creative Team - Require clear briefs, asset approval workflows, and deadline visibility
- Project Directors - Must see resource allocation, campaign profitability, and team workload
#### User Flows & Features
- Campaign Setup Flow - Create project briefs, set deliverable milestones, assign team members and deadlines
- Asset Review Flow - Upload creative assets, collect client feedback, manage revision cycles with approval tracking
- Resource Planning Flow - View team capacity, assign tasks based on availability, track time allocation across campaigns
## Real-World Examples
### Example 1: Vendor Management Portal
#### Business Context:
Our company maintains strategic partnerships with major technology vendors like AWS, IBM, Microsoft, and ServiceNow that are critical for our go-to-market strategy. Currently, we're managing partnership agreements, certification requirements, and co-sell opportunities across multiple spreadsheets and email threads, making it difficult to track revenue attribution or identify new collaboration opportunities.
#### User Personas:
- Partnership Managers - Need to manage vendor relationships, track co-sell opportunities, and ensure certification compliance
- Business Development Team - Requires visibility into partner-driven revenue and joint sales opportunities
- Sales Teams - Must access partner resources, submit deal registrations, and leverage vendor relationships
- Executive Leadership - Needs partnership performance metrics and ROI assessment
#### User Flows & Features:
- Partnership Onboarding Flow - Register new vendor partnerships with tier classification, upload contract terms, set certification requirements, assign partnership managers
- Opportunity Management Flow - Log co-sell opportunities and deal registrations, track joint sales activities and revenue attribution, update opportunity status through sales pipeline
- Certification Tracking Flow - Monitor team certification progress, track renewal dates, maintain compliance documentation, generate certification reports
- Performance Analysis Flow - Generate partnership ROI reports, analyze co-sell effectiveness, create executive scorecards, track milestone achievement
### Example 2: Accounts Payable System
#### Business Context:
Our financial services firm processes 800+ vendor invoices monthly across multiple business units, but we're managing approvals through email chains and tracking payments in disconnected spreadsheets. This creates compliance risks for audits, delayed vendor payments, and makes month-end close extremely difficult.
#### User Personas:
- Accounts Payable Clerks - Need to enter invoice details, match invoices to purchase orders, and schedule payments
- Department Managers - Must review and approve invoices within budget limits and ensure compliance with spending policies
- Finance Controllers - Require visibility into cash flow obligations, aging reports, and month-end accruals
- CFO/Finance Director - Needs high-level spend analytics, vendor relationship insights, and compliance oversight
#### User Flows & Features:
- Invoice Processing Flow - Record invoice details, match against purchase orders, flag discrepancies, assign expense coding
- Approval Workflow Management - Route invoices through approval chains based on thresholds, track approval status, escalate overdue approvals
- Payment Scheduling Flow - Schedule payments based on vendor terms, batch payments, track confirmations, maintain payment history
- Reporting & Analytics Flow - Generate aging reports, create spend analytics by department, produce audit trail reports, analyze vendor payment patterns
## Quick Start Checklist
Before submitting your prompt, verify you've included:
- [ ] Business context explaining the current problem
- [ ] Specific pain points you're experiencing
- [ ] All relevant user personas and their needs
- [ ] Clear user flows describing how people will use the app
- [ ] Industry-specific terminology your team uses
- [ ] Realistic scope (start with 3-4 core pages)
**Remember**: You don't need to format your prompt into rigid sections. The AI will understand your requirements regardless of structure - what matters most is the content and context you provide.

View file

@ -1,7 +1,6 @@
---
id: tooljet-mcp
title: ToolJet MCP
---
<div className="badge badge--self-hosted">
@ -42,7 +41,7 @@ Before you begin, you'll need:
### Step 1: Get an Access Token
Get an access token from your ToolJet instance. You'll need this token to authenticate the MCP server. Refer to the [ToolJet API](https://docs.tooljet.ai/docs/tooljet-api#enabling-tooljet-api) documentation for more details on how to generate an API token.
Get an access token from your ToolJet instance. You'll need this token to authenticate the MCP server. Refer to the [ToolJet API](https://docs.tooljet.com/docs/tooljet-api#enabling-tooljet-api) documentation for more details on how to generate an API token.
### Step 2: Configure Your AI Tool
@ -59,10 +58,7 @@ Follow the instructions below to configure your preferred AI tool to connect wit
"mcpServers": {
"tooljet": {
"command": "npx",
"args": [
"-y",
"@tooljet/mcp",
],
"args": ["-y", "@tooljet/mcp"],
"env": {
"TOOLJET_ACCESS_TOKEN": "<your-access-token>",
"TOOLJET_HOST": "https://your-tooljet-instance.com"
@ -88,10 +84,7 @@ Replace `<your-access-token>` with your ToolJet access token and update the host
"mcpServers": {
"tooljet": {
"command": "npx",
"args": [
"-y",
"@tooljet/mcp",
],
"args": ["-y", "@tooljet/mcp"],
"env": {
"TOOLJET_ACCESS_TOKEN": "<your-access-token>",
"TOOLJET_HOST": "https://your-tooljet-instance.com"
@ -157,10 +150,7 @@ For more info on using MCP in VS Code, see the [Copilot documentation](https://c
"mcpServers": {
"tooljet": {
"command": "npx",
"args": [
"-y",
"@tooljet/mcp",
],
"args": ["-y", "@tooljet/mcp"],
"env": {
"TOOLJET_ACCESS_TOKEN": "<your-access-token>",
"TOOLJET_HOST": "https://your-tooljet-instance.com"
@ -186,10 +176,7 @@ Replace `<your-access-token>` with your ToolJet access token and update the host
"mcpServers": {
"tooljet": {
"command": "npx",
"args": [
"-y",
"@tooljet/mcp",
],
"args": ["-y", "@tooljet/mcp"],
"env": {
"TOOLJET_ACCESS_TOKEN": "<your-access-token>",
"TOOLJET_HOST": "https://your-tooljet-instance.com"
@ -214,10 +201,7 @@ Replace `<your-access-token>` with your ToolJet access token and update the host
"mcpServers": {
"tooljet": {
"command": "npx",
"args": [
"-y",
"@tooljet/mcp",
],
"args": ["-y", "@tooljet/mcp"],
"env": {
"TOOLJET_ACCESS_TOKEN": "<your-access-token>",
"TOOLJET_HOST": "https://your-tooljet-instance.com"
@ -243,12 +227,7 @@ If you're using Windows, prefix the command with `cmd /c`:
"mcpServers": {
"tooljet": {
"command": "cmd",
"args": [
"/c",
"npx",
"-y",
"@tooljet/mcp",
],
"args": ["/c", "npx", "-y", "@tooljet/mcp"],
"env": {
"TOOLJET_ACCESS_TOKEN": "<your-access-token>",
"TOOLJET_HOST": "https://your-tooljet-instance.com"
@ -264,24 +243,24 @@ ToolJet MCP provides several tools that AI assistants can use to interact with y
### User Management
| Tool | Description |
| --- | --- |
| `get-all-users` | Retrieve a list of all users in your ToolJet instance |
| `get-user` | Get detailed information about a specific user |
| `create-user` | Create a new user in a specified workspace |
| `update-user` | Update a user's profile information |
| `update-user-role` | Change a user's role within a workspace |
| Tool | Description |
| ------------------ | ----------------------------------------------------- |
| `get-all-users` | Retrieve a list of all users in your ToolJet instance |
| `get-user` | Get detailed information about a specific user |
| `create-user` | Create a new user in a specified workspace |
| `update-user` | Update a user's profile information |
| `update-user-role` | Change a user's role within a workspace |
### Workspace Management
| Tool | Description |
| --- | --- |
| Tool | Description |
| -------------------- | -------------------------------------------- |
| `get-all-workspaces` | List all workspaces in your ToolJet instance |
### Application Management
| Tool | Description |
| --- | --- |
| Tool | Description |
| -------------- | ------------------------------------------------- |
| `get-all-apps` | List all applications within a specific workspace |
## Example Usage
@ -293,8 +272,4 @@ Once connected, your AI assistant can perform tasks like:
- "List all the apps in the Development workspace"
- "Update the role of user@example.com to Admin in the Sales workspace"
For a full list of tools available, see the [GitHub README](https://github.com/ToolJet/tooljet-mcp). If you experience any issues, [submit a bug report](https://github.com/ToolJet/tooljet-mcp/issues/new).

View file

@ -3,7 +3,7 @@ id: code-of-conduct
title: Contributor Code of Conduct
---
# Contributor Covenant Code of Conduct
# Contributor Covenant Code of Conduct
## Our Pledge
@ -19,21 +19,21 @@ appearance, race, religion, or sexual identity and orientation.
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
- Using welcoming and inclusive language
- Being respectful of differing viewpoints and experiences
- Gracefully accepting constructive criticism
- Focusing on what is best for the community
- Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
- The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
- Trolling, insulting/derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
@ -60,7 +60,7 @@ a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at hello@tooljet.com . All
reported by contacting the project team at support@tooljet.com . All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
@ -78,4 +78,4 @@ available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.ht
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq
https://www.contributor-covenant.org/faq

View file

@ -3,7 +3,7 @@ id: style-guide
title: Style Guide
---
Welcome to the ToolJet's Style Guide for creating clear, consistent, and accessible documentation. In this guide, you will find recommendations on text formatting, proper use of headers, code snippet styling, accessibility practices, and much more.
Welcome to the ToolJet's Style Guide for creating clear, consistent, and accessible documentation. In this guide, you will find recommendations on text formatting, proper use of headers, code snippet styling, accessibility practices, and much more.
## 1. Text Formatting Guidelines
@ -12,32 +12,36 @@ Different elements in your projects should be formatted consistently for clarity
a. Italics are used for names given to Queries, Database Tables, and Components.
**Examples:**
- Create a new query and rename it to *getEmployees*.
- Select **ToolJetDB** as the the data source and *Employees* table as the data source.
- Pass the returned data to the *allEmployees* component.
- Create a new query and rename it to _getEmployees_.
- Select **ToolJetDB** as the the data source and _Employees_ table as the data source.
- Pass the returned data to the _allEmployees_ component.
b. Bold is applied for Workspace Constants, Clickable Buttons, fx, Data Sources, and Components.
**Examples:**
- Select the **Button** component and change its label to "Save".
- Drag andn drop a **Table** component and rename it to *todosTable*.
- Expand the query panel at the bottom and click on the **Add** button to create a new **REST API** query.
- Select the **Button** component and change its label to "Save".
- Drag andn drop a **Table** component and rename it to _todosTable_.
- Expand the query panel at the bottom and click on the **Add** button to create a new **REST API** query.
c. Use Single Ticks for Inline Code and Triple Ticks for Multi-Line Code.
**Examples:**
- The **fx** option next to the Loading state property can be used to add a loader to the component. For instance, you can enter `{{queries.getData.isLoading === true}}` to show the loader while the *getData* query is running.
- The **fx** option next to the Loading state property can be used to add a loader to the component. For instance, you can enter `{{queries.getData.isLoading === true}}` to show the loader while the _getData_ query is running.
- Use the below code to fetch data:
```js
// this code is wrapped in triple ticks
const fetchData = async () => {
const response = await api.get('/users');
console.log(response.data);
const response = await api.get("/users");
console.log(response.data);
};
```
**Additional Items**:
- API Endpoints: Use code ticks for API endpoints (e.g., `GET /api/v1/resources`).
- Labels or User Inputs: Use double quotes to highlight labels or user inputs (e.g., "Enter your username").
@ -66,11 +70,11 @@ Ensure all tables are left-aligned for consistency. This aids in readability and
**Example**:
| <div style={{ width:"100px"}}> Variable </div> | <div style={{ width:"200px"}}> Description </div> | <div style={{width: "200px"}}> How To Access </div>|
|:---------- | :---------- | :------------ |
| chartTitle | Holds the title of the chart component. | Accessible dynamically with JS (for e.g., `{{components.chart1.chartTitle}}`). |
| xAxisTitle | Contains the title for the X-axis of the chart. | Accessible dynamically with JS (for e.g., `{{components.chart1.xAxisTitle}}`). |
| yAxisTitle | Contains the title for the Y-axis of the chart. | Accessible dynamically with JS (for e.g., `{{components.chart1.yAxisTitle}}`). |
| clickedDataPoints | Stores details about the data points that were clicked.| Accessible dynamically with JS (for e.g., `{{components.chart1.clickedDataPoints}}`). Each data point includes `xAxisLabel`, `yAxisLabel`, `dataLabel`, `dataValue`, and `dataPercent`. |
| chartTitle | Holds the title of the chart component. | Accessible dynamically with JS (for e.g., `{{components.chart1.chartTitle}}`). |
| xAxisTitle | Contains the title for the X-axis of the chart. | Accessible dynamically with JS (for e.g., `{{components.chart1.xAxisTitle}}`). |
| yAxisTitle | Contains the title for the Y-axis of the chart. | Accessible dynamically with JS (for e.g., `{{components.chart1.yAxisTitle}}`). |
| clickedDataPoints | Stores details about the data points that were clicked.| Accessible dynamically with JS (for e.g., `{{components.chart1.clickedDataPoints}}`). Each data point includes `xAxisLabel`, `yAxisLabel`, `dataLabel`, `dataValue`, and `dataPercent`. |
- Use **bold** formatting for all column headers to differentiate them from the table content.
- Avoid leaving empty cells in tables. If a cell doesnt have applicable content, use a placeholder like "N/A" or "—" to indicate that the cell is intentionally blank.
@ -78,11 +82,11 @@ Ensure all tables are left-aligned for consistency. This aids in readability and
## 4. Admonitions
Admonitions are blocks of content that are designed to draw attention to specific points in your documentation. Use them sparingly to avoid overwhelming the user. Reserve admonitions for critical or cautionary information only.
Admonitions are blocks of content that are designed to draw attention to specific points in your documentation. Use them sparingly to avoid overwhelming the user. Reserve admonitions for critical or cautionary information only.
- **Warning Admonitions**: Use `warning` type admonitions for high-risk actions or irreversible changes. This type of admonition should alert users to potential dangers or critical issues.
**Example**:
**Example**:
:::warning
Ensure you back up your data before upgrading to the latest version.
:::
@ -94,20 +98,21 @@ Ensure you back up your data before upgrading to the latest version.
Preview the changes before pushing them.
:::
Overuse can dilute their impact. Use *italics* instead of admonitions whenever possible to emphasize important information instead of admonitions. This is a less intrusive way to draw attention to key details.
Overuse can dilute their impact. Use _italics_ instead of admonitions whenever possible to emphasize important information instead of admonitions. This is a less intrusive way to draw attention to key details.
---
## 5. Image Guidelines
Include images that closely align with real-world use cases. This makes the documentation more practical and relatable for the user.
- Name images to reflect their purpose, such as `create-get-query.jpeg`. This helps maintain an organized file structure and makes it easier to locate specific images.
- Align images to the left. This is the standard alignment that works well with most content layouts.
- Set the image width to 100% to ensure it scales appropriately with different screen sizes.
- Keep image sizes under 300kb to balance load speed and quality.
- Keep image sizes under 300kb to balance load speed and quality.
- Alt text should be a concise description of the image, providing the same information as the image itself. This is essential for accessibility and for users who rely on screen readers.
- Skip phrases like "image of" or "graphic of" as screen readers handle this automatically. Focus on describing what is important about the image.
- Use `WEBP` or `PNG` formats for web images due to their balance between quality and file size.
- Use `WEBP` or `PNG` formats for web images due to their balance between quality and file size.
- Use `SVG` for logos or icons to ensure scalability without loss of quality.
---
@ -120,14 +125,13 @@ Maintaining a clear and consistent tone throughout your documentation is crucial
- Always proofread content using Grammarly or a similar tool before submitting a PR. This helps catch errors that might be missed during the initial writing process.
- Use the active voice wherever possible to make the content more direct and engaging. Passive voice can make sentences longer and more difficult to understand.
---
## 7. Bullet Points
Use bullet points to break down steps or lists for clarity. This makes the content easier to scan and understand.
- Avoid using bullet points for a single item. If there is only one point to make, integrate it into the main text instead.
- Avoid using bullet points for a single item. If there is only one point to make, integrate it into the main text instead.
- Ensure subpoints are correctly indented in markdown. This maintains the hierarchy and relationship between the main point and subpoints.
- End bullet points that are complete sentences with a period. This helps maintain proper grammar and readability.
- Do not insert blank lines between bullet points. This keeps the list compact and visually connected.
@ -142,13 +146,15 @@ Use the below language guidelines to ensure clarity and consistency.
### HTTP Formatting
- All HTTP headers should be capitalized like this: `First-Letter-Capitalized`. This follows the standard convention and makes the headers easier to distinguish.
**Example**:
**Example**:
```
Content-Type: application/json
Authorization: Bearer <token>
```
- HTTP blocks should be ready to run when pasted into tools like Postman or `cURL` commands. This means including all necessary components like headers, body, and method. **Example**:
```bash
curl -X POST https://api.example.com/resource \
-H 'Content-Type: application/json' \
@ -159,24 +165,27 @@ curl -X POST https://api.example.com/resource \
### JavaScript Guidelines
- End statements with semicolons (`;`). While JavaScript can often infer semicolons, explicitly including them prevents potential issues, especially in complex code. **Example**:
```javascript
const name = 'John';
const name = "John";
console.log(name);
```
- Use single quotes for strings unless double quotes are necessary (e.g., to avoid escaping single quotes inside the string). **Example**:
```javascript
const greeting = 'Hello, world!';
const greeting = "Hello, world!";
```
### JSON Formatting
- Indent JSON by 2 spaces. This is a standard practice that improves readability. **Example**:
```json
{
"name": "John Doe",
"age": 30,
"city": "New York"
"name": "John Doe",
"age": 30,
"city": "New York"
}
```
@ -185,13 +194,15 @@ const greeting = 'Hello, world!';
### Shell Scripting
- Break separate commands into distinct code blocks or chain them with `&&` for readability. For multi-line commands, use `\` to break lines. **Example**:
```bash
sudo apt-get update && \
sudo apt-get install -y curl
```
- Preface comments with `#` to explain the command's purpose.
**Example**:
**Example**:
```bash
# This command installs Node.js
sudo apt-get install -y nodejs
@ -200,6 +211,7 @@ sudo apt-get install -y nodejs
### SQL Queries
- Format SQL queries with keywords in uppercase, and break down long queries into multiple lines for better readability. **Example**:
```sql
SELECT name, age, city
FROM users
@ -212,25 +224,22 @@ ORDER BY name ASC;
## 10. Linking Guidelines
- Use root-relative paths (e.g., `/schema/postgres/tables.mdx`) instead of relative links to avoid broken links during file moves. This practice ensures that links remain functional even if files are moved within the directory structure. **Example**: <br/>
`[Postgres tables](/schema/postgres/tables.mdx)` links to the Postgres tables page.
- When linking to a specific section within a page, use anchor links to direct the user precisely where needed. **Example**: <br/>
`ToolJet supports [multiple environments,](https://docs.tooljet.ai/docs/#multiple-environments)` takes the user directly to the specific section.
`[Postgres tables](/schema/postgres/tables.mdx)` links to the Postgres tables page.
- When linking to a specific section within a page, use anchor links to direct the user precisely where needed. **Example**: <br/>
`ToolJet supports [multiple environments,](https://docs.tooljet.com/docs/#multiple-environments)` takes the user directly to the specific section.
---
## 11. Semantics and Terminology
- Write in the second person (e.g., *you*, *your*). This makes the content more engaging and directly applicable to the reader.
- Write in the second person (e.g., _you_, _your_). This makes the content more engaging and directly applicable to the reader.
- Ensure that case sensitivity is consistently applied across the document, particularly for technical terms or commands. This is important for commands and variables in code that are case-sensitive.
**Example**: <br/>"`MyVariable` and `myvariable` are not the same."
**Example**: <br/>"`MyVariable` and `myvariable` are not the same."
- Define acronyms on first use and avoid using them excessively to maintain readability. This helps readers who may not be familiar with all acronyms.
**Example**: <br/>"The Content Delivery Network (CDN) is used to deliver content to users efficiently."
**Example**: <br/>"The Content Delivery Network (CDN) is used to deliver content to users efficiently."
- Maintain consistent terminology throughout the document. If you start with "user," don't switch to "customer" later in the same context.
---
By following these guidelines, you can ensure that your documentation is clear, consistent, and easy to use for a wide range of audiences.
By following these guidelines, you can ensure that your documentation is clear, consistent, and easy to use for a wide range of audiences.

View file

@ -3,13 +3,13 @@ id: codespaces
title: GitHub Codespaces
---
Follow the steps below to set up ToolJet on GitHub Codespaces. We recommend reading our guide on [architecture](https://docs.tooljet.ai/docs/contributing-guide/setup/architecture) of ToolJet before proceeding.
Follow the steps below to set up ToolJet on GitHub Codespaces. We recommend reading our guide on [architecture](https://docs.tooljet.com/docs/contributing-guide/setup/architecture) of ToolJet before proceeding.
Open the terminal and run the commands below.
## Setting up
### 1. Set up the environment
### 1. Set up the environment
1. Install Node.js ( version: v18.18.2 ) and npm (version: v9.8.1)
@ -31,7 +31,7 @@ sudo apt-get update
sudo apt-get install postgresql-13 postgresql-contrib-13
```
To start the postgresql service run the below command:
To start the postgresql service run the below command:
```
sudo service postgresql start
@ -44,14 +44,14 @@ sudo su
sudo -u postgres psql
\password postgres
\password postgres
\q
```
### 2. Set up environment variables
Create a `.env` file by running the command `touch .env`. More information on the variables that can be set is given in the [environment variables reference](https://docs.tooljet.ai/docs/setup/env-vars)
Create a `.env` file by running the command `touch .env`. More information on the variables that can be set is given in the [environment variables reference](https://docs.tooljet.com/docs/setup/env-vars)
**For basic set-up you add the below env variables:**
@ -81,7 +81,7 @@ SERVE_CLIENT=true
>
> `LOCKBOX_MASTER_KEY` requires a 32 byte key. (Run `openssl rand -hex 32` to create a 32 byte secure random key)
### 3. Install and build dependencies
### 3. Install and build dependencies
Make sure node version is set to 18.18.2 before running the below command:
@ -92,7 +92,6 @@ npm install --prefix frontend
npm run build:plugins
```
### 4. Set up database
```

View file

@ -56,7 +56,7 @@ In addition, violations of this code outside our spaces may affect a persons
## Enforcement
- Understand that speech and actions have consequences, and unacceptable behavior will not be tolerated.
- If you are the subject of, or witness to any violations of this Code of Conduct, please contact us via email at hello@tooljet.com or dm @navaneeth on slack.
- If you are the subject of, or witness to any violations of this Code of Conduct, please contact us via email at support@tooljet.com or dm @navaneeth on slack.
- If violations occur, organizers will take any action they deem appropriate for the infraction, up to and including expulsion.
:::info
@ -87,4 +87,4 @@ ToolJet's community of volunteer is very active and helpful, generally avoid tag
#### 6. Use threads for discussion
To keep the main channel area clear, we request to use threads to keep an ongoing conversation organized.
To keep the main channel area clear, we request to use threads to keep an ongoing conversation organized.

View file

@ -5,8 +5,6 @@ title: BigQuery
ToolJet can connect to **BigQuery** databases to run BigQuery queries.
<div style={{paddingTop:'24px'}}>
## Connection
To establish a connection with the **BigQuery** data source, you can either click on the **+ Add new Data source** button located on the query panel or navigate to the **[Data Sources](/docs/data-sources/overview)** page from the ToolJet dashboard and choose BigQuery as the data source.
@ -14,6 +12,13 @@ To establish a connection with the **BigQuery** data source, you can either clic
ToolJet requires the following to connect to your BigQuery:
- **Private key**
- **Scope**
:::warning
When entering multiple scopes, separate them using spaces. Using any other character may cause errors.
Example: `https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/drive`
:::
How to get a Private key?
@ -22,7 +27,7 @@ How to get a Private key?
3. Once you have created the service account after following the steps mentioned in the Google Cloud guide, create a new **Key** and download it in a JSON file.
4. Now, copy and paste the data from the downloaded JSON file into the **Private key** field in the BigQuery data source form.
<img className="screenshot-full" src="/img/datasource-reference/bigquery/bq-create-v2.png" alt="BQ create" />
<img className="screenshot-full img-full" src="/img/datasource-reference/bigquery/bq-create-v3.png" alt="BQ create" />
**The JSON file should look like this:**
@ -42,10 +47,6 @@ How to get a Private key?
}
```
</div>
<div style={{paddingTop:'24px'}}>
## Querying BigQuery
1. Click on **+ Add** button of the query manager at the bottom panel of the editor.
@ -53,20 +54,12 @@ How to get a Private key?
3. Select the desired operation from the dropdown and enter the required parameters.
4. Click on the **Preview** button to preview the output or Click on the **Run** button to trigger the query.
<div style={{textAlign: 'center'}}>
<img style={{ border:'0', marginBottom:'15px' }} className="screenshot-full" src="/img/datasource-reference/bigquery/bq-query-v2.png" alt="BQ query" />
</div>
<img className="screenshot-full img-full" src="/img/datasource-reference/bigquery/bq-query-v2.png" alt="BQ query" />
:::tip
Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/app-builder/custom-code/transform-data)
:::
</div>
<div style={{paddingTop:'24px'}}>
## Supported Operations
- **[Query](#query)**
@ -91,13 +84,13 @@ This operation returns the data based on the **Query**.
- **Query options**
- **Query results options**
<img className="screenshot-full" src="/img/datasource-reference/bigquery/query-v2.png" alt="BQ query" style={{marginBottom:'15px'}}/>
<img className="screenshot-full img-full" src="/img/datasource-reference/bigquery/query-v2.png" alt="BQ query" style={{marginBottom:'15px'}}/>
### List Datasets
This operation returns the list of datasets.
<img className="screenshot-full" src="/img/datasource-reference/bigquery/list-datasets-v2.png" alt="BQ list datasets" style={{marginBottom:'15px'}}/>
<img className="screenshot-full img-full" src="/img/datasource-reference/bigquery/list-datasets-v2.png" alt="BQ list datasets" style={{marginBottom:'15px'}}/>
### List Tables
@ -107,7 +100,7 @@ This operation returns the list of tables within a dataset.
- **Dataset ID**
<img className="screenshot-full" src="/img/datasource-reference/bigquery/listtables-v2.png" alt="BQ list tables" style={{marginBottom:'15px'}}/>
<img className="screenshot-full img-full" src="/img/datasource-reference/bigquery/listtables-v2.png" alt="BQ list tables" style={{marginBottom:'15px'}}/>
### Create Table
@ -119,7 +112,7 @@ This operation is used to create a table.
- **Dataset ID**
- **Options**
<img className="screenshot-full" src="/img/datasource-reference/bigquery/create-table.png" alt="BQ create tables"/>
<img className="screenshot-full img-full" src="/img/datasource-reference/bigquery/create-table.png" alt="BQ create tables"/>
**NOTE:** Visit https://github.com/googleapis/nodejs-bigquery/blob/main/samples/createTable.js for more info on schema.
@ -132,7 +125,7 @@ This operation is used to delete a table.
- **Table ID**
- **Dataset ID**
<img className="screenshot-full" src="/img/datasource-reference/bigquery/delete-table.png" alt="BQ delete tables" style={{marginBottom:'15px'}}/>
<img className="screenshot-full img-full" src="/img/datasource-reference/bigquery/delete-table.png" alt="BQ delete tables" style={{marginBottom:'15px'}}/>
### Create View
@ -148,7 +141,7 @@ This operation is used to create a view.
- **Query options**
- **Query results options**
<img className="screenshot-full" src="/img/datasource-reference/bigquery/create-view-v2.png" alt="BQ create view" style={{marginBottom:'15px'}}/>
<img className="screenshot-full img-full" src="/img/datasource-reference/bigquery/create-view-v2.png" alt="BQ create view" style={{marginBottom:'15px'}}/>
### Insert Record
@ -160,7 +153,7 @@ This operation is used to insert a record.
- **Dataset ID**
- **Rows**
<img className="screenshot-full" src="/img/datasource-reference/bigquery/bq-insert-v2.png" alt="BQ insert" style={{marginBottom:'15px'}}/>
<img className="screenshot-full img-full" src="/img/datasource-reference/bigquery/bq-insert-v2.png" alt="BQ insert" style={{marginBottom:'15px'}}/>
### Delete Record
@ -174,7 +167,7 @@ Use this operation to delete a record.
- **Query options**
- **Query results options**
<img className="screenshot-full" src="/img/datasource-reference/bigquery/bq-delete-v2.png" alt="BQ delete" />
<img className="screenshot-full img-full" src="/img/datasource-reference/bigquery/bq-delete-v2.png" alt="BQ delete" />
:::warning
NOTE: Be careful when deleting records in a table. If you omit the WHERE clause, all records in the table will be deleted!
@ -192,6 +185,4 @@ Use this operation to update a record.
- **Condition**
- **Query results options**
<img className="screenshot-full" src="/img/datasource-reference/bigquery/bq-update-v2.png" alt="BQ update" />
</div>
<img className="screenshot-full img-full" src="/img/datasource-reference/bigquery/bq-update-v2.png" alt="BQ update" />

View file

@ -149,7 +149,7 @@ This ID will be longer than the one generated earlier, and it could look like "2
:::tip Resources
- You can also write custom JavaScript code to get the data from **External APIs** and manipulate the response for graphical representation. Here's the [tutorial](https://blog.tooljet.ai/build-github-stars-history-app-in-5-minutes-using-low-code/) on how we used custom JavaScript code to build an app using GitHub API.
- You can also write custom JavaScript code to get the data from **External APIs** and manipulate the response for graphical representation. Here's the [tutorial](https://blog.tooljet.com/build-github-stars-history-app-in-5-minutes-using-low-code/) on how we used custom JavaScript code to build an app using GitHub API.
- [Import external libraries](/docs/how-to/import-external-libraries-using-runjs) using RunJS.
- [Intentionally Fail](/docs/how-to/intentionally-fail-js-query) a RunJS query.
- [Trigger query at specified intervals](/docs/how-to/run-query-at-specified-intervals) using RunJS.

View file

@ -189,6 +189,6 @@ If you are having trouble connecting a MariaDB data source to ToolJet, try the f
- Check the spelling and capitalization of your credentials.
- Try restarting the ToolJet server.
If you are still having trouble, please contact [ToolJet support](mailto:hello@tooljet.com) or ask on [slack](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) for assistance.
If you are still having trouble, please contact [ToolJet support](mailto:support@tooljet.com) or ask on [slack](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) for assistance.
</div>

View file

@ -14,7 +14,7 @@ ToolJets REST API data source supports Basic Authentication as the authentica
1. Go to the **Data Sources** page from the ToolJet dashboard, select **API** category on sidebar and choose the **REST API** data source.
2. In the **Base URL** field, enter the base URL. The base URL specifies the network address of the API service. For example, `http://localhost:3001/api/basic-auth`
3. Enter the **Headers** if required. Headers are key-value pairs to include as headers with REST API requests.
4. Select **Authentication** type as *Basic* from the dropdown.
4. Select **Authentication** type as _Basic_ from the dropdown.
5. Enter the **Username** and **Password** in the respective fields. The username and password are the credentials required to authenticate the user.
<img className="screenshot-full" src="/img/datasource-reference/rest-api/basic.png" alt="ToolJet - Data source - REST API" />
@ -28,19 +28,20 @@ ToolJets REST API data source supports Bearer Token as the authentication typ
1. Go to the **Data Sources** page from the ToolJet dashboard, select **API** category on sidebar and choose the **REST API** data source.
2. In the **Base URL** field, enter the base URL. The base URL specifies the network address of the API service. For example, `http://localhost:3001/api/bearer-auth`
3. Enter the **Headers** if required. Headers are key-value pairs to include as headers with REST API requests.
4. Select **Authentication** type as *Bearer* from the dropdown.
4. Select **Authentication** type as _Bearer_ from the dropdown.
5. Enter the **Token** in the field. The token is a security token that is issued by the authentication server to the client. The client then uses the token to access the protected resources hosted by the resource server.
<img className="screenshot-full" src="/img/datasource-reference/rest-api/none.png" alt="ToolJet - Data source - REST API" />
6. Now you have option to select the **SSL Certificate** if required. SSL certificate is used to verify the server certificate. By default, it is set to *None*. You can provide the **CA Certificate** or **Client Certificate** from the dropdown.
1. **CA Certificate**: Requires a CA certificate to verify the server certificate. Copy the content of `server.crt` file and paste it in the **CA Cert** field. `server.crt` file is the certificate file that is used to verify the server certificate.
<img className="screenshot-full" src="/img/datasource-reference/rest-api/cacert.png" alt="ToolJet - Data source - REST API" />
6. Now you have option to select the **SSL Certificate** if required. SSL certificate is used to verify the server certificate. By default, it is set to _None_. You can provide the **CA Certificate** or **Client Certificate** from the dropdown.
2. **Client Certificate**: Requires a client certificate to authenticate with the server. **client.key**, **client.crt**, and **server.crt** files are the certificate files that are used to authenticate with the server. Copy the content of **client.key** file and paste it in the **Client Key** field. Copy the content of **client.crt** file and paste it in the **Client Cert** field. Copy the content of **server.crt** file and paste it in the **CA Cert** field.
<img className="screenshot-full" src="/img/datasource-reference/rest-api/clientcert.png" alt="ToolJet - Data source - REST API" />
1. **CA Certificate**: Requires a CA certificate to verify the server certificate. Copy the content of `server.crt` file and paste it in the **CA Cert** field. `server.crt` file is the certificate file that is used to verify the server certificate.
<img className="screenshot-full" src="/img/datasource-reference/rest-api/cacert.png" alt="ToolJet - Data source - REST API" />
2. **Client Certificate**: Requires a client certificate to authenticate with the server. **client.key**, **client.crt**, and **server.crt** files are the certificate files that are used to authenticate with the server. Copy the content of **client.key** file and paste it in the **Client Key** field. Copy the content of **client.crt** file and paste it in the **Client Cert** field. Copy the content of **server.crt** file and paste it in the **CA Cert** field.
<img className="screenshot-full" src="/img/datasource-reference/rest-api/clientcert.png" alt="ToolJet - Data source - REST API" />
7. Once you have configured the REST API data source, click on the **Save** button.
@ -71,11 +72,11 @@ Google Cloud Platform provides access to more than 350 APIs and Services that ca
1. Sign in to your [Google Cloud](https://cloud.google.com/) account, and from the console create a New Project.
2. Navigate to the **APIs and Services**, and then open the **OAuth consent screen** section from the left sidebar.
3. Enter the Application details and select the appropriate scopes for your application. We will select the profile and the email scopes.
3. Enter the Application details and select the appropriate scopes for your application. We will select the profile and the email scopes.
4. Once you have created the OAuth consent screen, Create new credentials for the **OAuth client ID** from the **Credentials** section in the left sidebar.
5. Select the application type, enter the application name, and then add the following URIs under Authorized Redirect URIs(Callback URL):
1. `https://app.tooljet.ai/oauth2/authorize` (if youre using ToolJet cloud)
2. `http://localhost:8082/oauth2/authorize` (if youre using ToolJet locally)
1. `https://app.tooljet.com/oauth2/authorize` (if youre using ToolJet cloud)
2. `http://localhost:8082/oauth2/authorize` (if youre using ToolJet locally)
<img class="screenshot-full" src="/img/how-to/oauth2-authorization/callback-URL.png" alt="ToolJet - How To - REST API CallBack URL in OAuth 2.0" style={{marginBottom:'15px'}}/>
@ -91,16 +92,16 @@ Let's follow the steps to authorize ToolJet to access your Google profile data:
1. Go to the **Data Sources** page from the ToolJet dashboard, select API category on sidebar and choose the **REST API** data source.
2. In the **Base URL** field, enter the base URL `https://www.googleapis.com/oauth2/v1/userinfo`; the base URL specifies the network address of the API service.
3. Select **Authentication** type as *OAuth 2.0*
4. Keep the default values for **Grant Type**, **Add Access Token To**, and **Header Prefix** i.e. *Authorization Code*, *Request Header*, and *Bearer* respectively.
3. Select **Authentication** type as _OAuth 2.0_
4. Keep the default values for **Grant Type**, **Add Access Token To**, and **Header Prefix** i.e. _Authorization Code_, _Request Header_, and _Bearer_ respectively.
5. Enter **Access Token URL**: `https://oauth2.googleapis.com/token`; this token allows users to verify their identity, and in return, receive a unique access token.
6. Enter the **Client ID** and **Client Secret** that we generated from the [Google Console](http://console.developers.google.com/).
7. In the **Scope** field, enter `https://www.googleapis.com/auth/userinfo.profile`; Scope is a mechanism in OAuth 2.0 to limit an application's access to a user's account. Check the scopes available for [Google OAuth2 API here](https://developers.google.com/identity/protocols/oauth2/scopes#oauth2).
8. Enter **Authorization URL:** `https://accounts.google.com/o/oauth2/v2/auth`; the Authorization URL requests authorization from the user and redirects to retrieve an authorization code from identity server.
9. Create three **Custom Authentication Parameters:**
1. **response_type**: code ( `code` refers to the Authorization Code)
2. **client_id**: Client ID
3. **redirect_url**: `http://localhost:8082/oauth2/authorize` if using ToolJet locally or enter this `https://app.tooljet.ai/oauth2/authorize` if using ToolJet Cloud.
1. **response_type**: code ( `code` refers to the Authorization Code)
2. **client_id**: Client ID
3. **redirect_url**: `http://localhost:8082/oauth2/authorize` if using ToolJet locally or enter this `https://app.tooljet.com/oauth2/authorize` if using ToolJet Cloud.
10. Keep the default selection for **Client Authentication** and **Save** the data source.
<img class="screenshot-full" src="/img/how-to/oauth2-authorization/restapi-v2.png" alt="ToolJet - How To - REST API authentication using OAuth 2.0" />
@ -111,8 +112,8 @@ Let's follow the steps to authorize ToolJet to access your Google profile data:
1. Go to the **Data Sources** page from the ToolJet dashboard, select API category on sidebar and choose the **REST API** data source.
2. In the **Base URL** field, enter the base URL `https://www.googleapis.com/oauth2/v1/userinfo`; the base URL specifies the network address of the API service.
3. Select **Authentication** type as *OAuth 2.0*
4. Select the **Grant Type** as *Client credentials*.
3. Select **Authentication** type as _OAuth 2.0_
4. Select the **Grant Type** as _Client credentials_.
5. Enter **Access Token URL**: `https://oauth2.googleapis.com/token`; this token allows users to verify their identity, and in return, receive a unique access token.
6. Enter the **Client ID** and **Client Secret** that we generated from the [Google Console](http://console.developers.google.com/).
7. In the **Scope** field, enter `https://www.googleapis.com/auth/userinfo.profile`; Scope is a mechanism in OAuth 2.0 to limit an application's access to a user's account. Check the scopes available for [Google OAuth2 API here](https://developers.google.com/identity/protocols/oauth2/scopes#oauth2).
@ -125,6 +126,6 @@ Let's follow the steps to authorize ToolJet to access your Google profile data:
Lets create a query to make a `GET` request to the URL, it will pop a new window and ask the user to authenticate against the API.
- Add a new query and select the REST API data source from the dropdown
- In the **Method** dropdown select `GET` and enable the `Run query on application load?`
- Run the query.
- A new window will pop for authentication and once auth is successful, you can run the query again to get the user data like Name and Profile Picture.
- In the **Method** dropdown select `GET` and enable the `Run query on application load?`
- Run the query.
- A new window will pop for authentication and once auth is successful, you can run the query again to get the user data like Name and Profile Picture.

View file

@ -12,7 +12,7 @@ ToolJet can establish connections with any available REST API endpoint, allowing
To establish a connection with the REST API data source, you can either click on the **+ Add new Data source** button located on the query panel or navigate to the **[Data Sources](/docs/data-sources/overview)** page through the ToolJet dashboard.
<img className="screenshot-full" src="/img/datasource-reference/rest-api/restconnect.gif" alt="ToolJet - Data source - REST API" style={{marginBottom:'15px'}} />
<img className="screenshot-full img-full" src="/img/datasource-reference/rest-api/restconnect.gif" alt="ToolJet - Data source - REST API" style={{marginBottom:'15px'}} />
ToolJet requires the following to connect to a REST API data source:
@ -30,7 +30,7 @@ ToolJet requires the following to connect to a REST API data source:
- **Body**: Key-value pairs to include as the body of the request.
- **Cookies**: Key-value pairs to include as cookies with REST API requests. These cookies will be sent with every query created using this data source instance.
<img className="screenshot-full" src="/img/datasource-reference/rest-api/credentials.png" alt="REST API - Credentials" />
<img className="screenshot-full img-full" src="/img/datasource-reference/rest-api/credentials.png" alt="REST API - Credentials" />
</div>
@ -58,7 +58,7 @@ ToolJet supports the following authentication types for REST API data sources:
- Custom authentication parameters
- Client authentication method
<img className="screenshot-full" src="/img/datasource-reference/rest-api/authentication.png" alt="REST API - Authentication" />
<img className="screenshot-full img-full" src="/img/datasource-reference/rest-api/authentication.png" alt="REST API - Authentication" />
</div>
@ -71,7 +71,7 @@ ToolJet supports the following authentication types for REST API data sources:
- **CA Certificate**: Requires a CA certificate to verify the server certificate.
- **Client Certificate**: Requires a client certificate, client key, and CA certificate to authenticate with the server.
<img style={{marginBottom:'15px'}} className="screenshot-full" src="/img/datasource-reference/rest-api/ssl.png" alt="REST API - SSL Certificate" />
<img style={{marginBottom:'15px'}} className="screenshot-full img-full" src="/img/datasource-reference/rest-api/ssl.png" alt="REST API - SSL Certificate" />
</div>

View file

@ -175,7 +175,7 @@ The presigned URLs are useful if you want your user/customer to be able to uploa
<img className="screenshot-full" src="/img/datasource-reference/aws-s3/urluplv2-v3.png" alt="aws s3 signed upload" />
:::info
We built an app to view and upload files to AWS S3 buckets. Check out the complete tutorial **[here](https://blog.tooljet.ai/build-an-aws-s3-broswer-with-tooljet/)**.
We built an app to view and upload files to AWS S3 buckets. Check out the complete tutorial **[here](https://blog.tooljet.com/build-an-aws-s3-broswer-with-tooljet/)**.
:::
</div>

View file

@ -31,7 +31,7 @@ You can toggle on **Authentication required for all users** in the configuration
Note: After completing the OAuth flow, the query must be triggered again to load the data.
<img className="screenshot-full img-m" src="/img/datasource-reference/snowflake/snowflake-connect-v3.png" alt="ToolJet - Snowflake connection" />
<img className="screenshot-full img-m" src="/img/datasource-reference/snowflake/snowflake-connect-v4.png" alt="ToolJet - Snowflake connection" />
</div>
@ -44,7 +44,7 @@ Note: After completing the OAuth flow, the query must be triggered again to load
3. Select the **SQL Mode** form the dropdown and enter the query.
4. Click on the **Preview** button to preview the output or Click on the **Run** button to trigger the query.
<img className="screenshot-full" src="/img/datasource-reference/snowflake/snowflake-query-v2.png" alt="ToolJet - Snowflake query" />
<img className="screenshot-full img-full" src="/img/datasource-reference/snowflake/snowflake-query-v2.png" alt="ToolJet - Snowflake query" />
```sql
select * from "SNOWFLAKE_SAMPLE_DATA"."WEATHER"."DAILY_14_TOTAL" limit 10;

View file

@ -6,7 +6,7 @@ title: Stripe
ToolJet can connect to your Stripe account to read or write customers' and payments' data.
:::info
Check out the **[Stripe Refund App tutorial](https://blog.tooljet.ai/build-a-stripe-refund-tool-using-low-code/)**
Check out the **[Stripe Refund App tutorial](https://blog.tooljet.com/build-a-stripe-refund-tool-using-low-code/)**
:::
<div style={{paddingTop:'24px'}}>

View file

@ -0,0 +1,298 @@
---
id: branching-and-pr
title: Branching and Pull Requests
---
:::warning BETA VERSION
**Branching and Pull Requests is currently in beta** and not recommended for production use.
:::
Branching enables multiple developers to work on an isolated copy of the application (their own branch) where changes don't affect others or the live production application until explicitly merged. Branching helps in protecting production quality through mandatory code reviews before changes go live and provide complete change history through Git integration, making every modification traceable and reversible.
When multiple developers need to build features or fix bugs in the same application, they need a way to work independently without disrupting each other or risking production stability. Branching solves this by:
- Protecting production quality through mandatory code reviews before changes go live
- Enabling parallel development, so teams can maintain speed without compromising on safety
- Providing complete change history through Git integration, making every modification traceable and reversible
**When to Enable Branching?**
Enable branching at the workspace level when:
- Multiple developers work on the same applications
- You need formal approval workflows before production changes
- Change tracking and review are organizational requirements
## Understanding Branches and Versions
### Master Branch and Sub-Branches
- **Master Branch**: The main branch containing your live application and its linear development history. The master branch is locked—changes can only enter through approved pull requests, never through direct edits.
- **Sub-Branches**: Independent copies created from the master branch where developers make changes freely. Each sub-branch is isolated until merged back to master.
### Versions as Milestones
Versions exist only on the master branch, marking stable points in your application's development:
- **Draft Version**: The current working state on master (one active draft at a time).
- **Saved Version**: A finalized milestone, automatically committed to Git.
- **Released Version**: A version released from the production environment.
Sub-branches don't have versions, they themselves are working copies of a specific version.
## Setting Up Branching
To enable branching you would need to configure the git sync. Follow the [Git Sync Guide](/docs/development-lifecycle/gitsync/overview) to configure it. Once Git Sync is configure then the branching is enabled by default (only for the beta version). Specify your Default Branch Name (typically "master" or "main"). This becomes your master branch where live applications reside.
:::warning NOTE
ToolJet supports branching **only over Git HTTPS**. SSH is not supported.
:::
## Creating and Managing Branches
### Create a New Branch
1. Open your application
2. Click the branch dropdown in the top navigation
3. Select **+ Create New Branch** <br/><br/>
<img className="screenshot-full img-l" src="/img/development-lifecycle/branching/new-branch-modal.png" alt="GitSync" /><br/><br/>
4. Enter a descriptive branch name <br/><br/>
<img className="screenshot-full img-s" src="/img/development-lifecycle/branching/branch-name-modal.png" alt="GitSync" /><br/><br/>
5. Choose the version to branch from (typically the current draft)
6. Click **Create Branch**.
Your new branch is immediately available in ToolJet and automatically synced to Git.
### Switch Between Branches
1. Click the branch dropdown in the top navigation and then click on **Switch Branch** <br/><br/>
<img className="screenshot-full img-l" src="/img/development-lifecycle/branching/new-branch-modal.png" alt="GitSync" /><br/><br/>
2. Select any active branch to switch
3. All your edits now apply to the selected branch
<!-- ### Rename a Branch
1. Select the branch you want to rename
2. Click the branch dropdown → Rename Branch
3. Enter the new name
4. Click Save
Changes sync automatically to Git. Note: Master branch cannot be renamed from ToolJet. -->
## Working with Pull Requests
Pull requests are how changes move from sub-branches to the master branch. All pull request management happens in your Git provider (GitHub, GitLab, etc.).
### Push Changes to Git
Available only on sub-branches (master is locked):
1. Make your changes in ToolJet
2. Click **Commit** button in the top navigation
3. Add a commit message describing your changes <br/>
<img className="screenshot-full img-s" src="/img/development-lifecycle/branching/commit-changes.png" alt="GitSync" />
4. Click **Commit Changes**
Changes are committed to your current branch in Git.
### Pull Changes from Git
**On Master Branch:**
1. Ensure you're on the master branch with a draft version active
2. Click **Pull Commit**
3. Current draft is replaced with Git content
### Create a Pull Request
A pull request is created in your Git provider, and the merge also happens there. All changes must be committed to Git to keep your application in sync.
1. In ToolJet: Push your branch changes to Git
- Click **Commit** button in the top navigation
- Add a commit message describing your changes <br/>
<img className="screenshot-full img-s" src="/img/development-lifecycle/branching/commit-changes.png" alt="GitSync" />
- Click **Commit Changes**
2. Create Pull Request
- After committing your changes, click the branch name in the navigation bar.
- Click the **Create pull request** button.<br/>
<img className="screenshot-full img-s" src="/img/development-lifecycle/branching/pr-button.png" alt="GitSync" />
- Youll be redirected to your Git provider to create the pull request. To keep the flow consistent, some fields are pre-filled. You can edit them or directly create the PR.
3. Review and Approval:
- Add reviewers and description
- Submit for review
- Reviewers examine changes in Git
- Address any feedback or conflicts
- Approver merges the pull request
4. In ToolJet: Pull merged changes into master
- Switch to the master branch and create a draft version
- Click **Pull Commit**
- Changes replace the current draft version
<!-- ### View Pull Request Status
1. Click the Pull Requests icon in the top navigation
2. View all active pull requests for your application
3. Click Refresh to sync the latest status from Git
Note: Pull request status is read-only in ToolJet. All actions (approve, merge, close) happen in Git. -->
<!-- **On Sub-Branches:**
1. Switch to your sub-branch
2. Click Pull from Git
3. Select any branch to pull from (often master for rebasing)
4. Click Pull
5. Current branch content is replaced with selected branch content
## Common Scenarios -->
## Creating Your First Released Version
**Scenario**: You've built a new application and need to release version 1.
1. Create your application (master branch and draft v1 created automatically)
2. Create a sub-branch from draft v1: developer/initial-build
3. Develop your application on the branch
4. Push changes to Git
5. In Git: Create pull request, get approval, merge to master
6. In ToolJet: Pull from Git into master branch
7. Save draft v1 as version v1 (auto-commits to Git)
8. Promote v1 to staging for testing
9. Promote v1 to production
10. Release v1
### Parallel Development
**Scenario**: Two developers need to work on different features simultaneously.
1. Developer A creates branch `johnson/inventory` from current master
2. Developer B creates branch `taylor/search` from current master
3. Both developers work independently and push their changes
4. In Git:
- Both create pull requests to master
- Resolve any merge conflicts
- Manager approves both PRs
- Merge both branches to master
5. In ToolJet:
- Create draft v2 from v1 (if no active draft exists)
- Pull changes from Git into draft v2
- Save v2 as a version
- Promote and release v2
### Patching a Released Version
**Scenario**: Version 2 is released, version 3 is in draft, but v2 has a production bug requiring immediate fix.
Existing versions:
- v1 (Released)
- v2 (Released, needs patch)
- v3 (Draft, ongoing work)
Steps:
1. Save draft v3 as v3 (preserves ongoing work)
2. Create new draft v2.1 from v2
3. Create branch `robert/patch` from v2
4. Make fixes on the patch branch and commit to Git
5. In Git: Create PR, get approval, merge to master
6. In ToolJet: Pull changes into draft v2.1
7. Save v2.1 as a version
8. Promote v2.1 to staging, then production
9. Release v2.1
<!--
### Rebasing Your Branch
**Scenario**: You're working on a branch while another developer's changes get merged to master. You need those changes.
Setup:
- Master has v1, v2, and draft v3
- Branch `taylor/search` created from v2
- Branch `johnson/inventory` created from v2
Steps:
1. Taylor completes work and creates pull request
2. In Git: Pull request approved and merged to master
3. In ToolJet: Pull from Git into draft v3 (now has Taylor's changes)
4. On Johnson's branch: Pull from master branch into nechal/inventory
5. Resolve any conflicts locally, then push updated branch to Git -->
## Creating and Saving Versions
### Creating Draft Versions
On Master Branch Only:
- One active draft version at a time
- Create new draft from any saved version
- Draft represents the current working state
To create a new draft:
1. Switch to master branch
2. Click version dropdown → Create Draft
3. Select the version to draft from
4. Click Create
### Saving Versions
When you save a draft version:
1. Switch to master branch with active draft
2. Click Save Version
3. Enter version number (e.g., v2, v2.1)
4. Click Save
5. Version is automatically committed to Git
6. Saved versions cannot be edited (locked state)
**Important**: Once saved, no further commits are allowed on that version. Saved versions represent completed milestones.
<!-- ### Closing Branches
Branches can only be closed in your Git provider, not in ToolJet:
1. In Git: Close the branch (merged or unmerged)
2. In ToolJet: Pull from Git or refresh to sync status
3. Closed branches appear with closed status
4. No further edits allowed on closed branches
### Importing Applications with Branching
When importing an application from Git with branching enabled:
1. Navigate to Create New → Import from Git
2. Select your repository
3. Choose the application
4. Click Import
All open branches from Git are imported into ToolJet with branching structure intact. -->
<!-- ## Important Notes -->
<!-- ### Auto-Commit Behavior
- Branching Enabled: Auto-commit on save is required and cannot be disabled
- Branching Disabled: Auto-commit can be toggled on or off
When auto-commit is enabled, saving a draft version automatically pushes it to Git. -->
## Branch Permissions
| Action | Master Branch | Sub-Branch |
|--------|---------------|------------|
| Direct edits | ❌ Only via PR | ✅ Yes |
| Push to Git | ❌ Not needed | ✅ Yes |
| Pull from Git | ✅ Draft only | ✅ Open branches |
| Rename | ❌ Git only | ❌ Git only |
| Close | ❌ Never | ❌ Git only |
<!-- ### Conflict Resolution
All merge conflicts must be resolved in Git or your CLI before merging:
1. Pull request shows conflicts in Git
2. Resolve conflicts using Git tools or command line
3. Commit resolved changes
4. Complete the merge in Git
5. Pull merged result into ToolJet -->
<!-- ### Best Practices
**Branch Naming**: Use descriptive names with developer identifier
- ✅ nechal/inventory-feature
- ✅ taylor/search-fix
- ❌ test-branch
- ❌ updates
**Commit Messages**: Write clear, action-oriented messages
- ✅ "Add inventory filtering to dashboard"
- ✅ "Fix search query timeout issue"
- ❌ "updates"
- ❌ "changes" -->

View file

@ -25,7 +25,7 @@ The following APIs are available to manage git sync within your CI/CD pipeline.
### Add GitHub HTTPS Git Configuration
- **Description:** Configure GitHub HTTPS settings for an organization by associating a GitHub App and repo.
- **URL:** `/api/ext/organization/git`
- **URL:** `/api/ext/organizations/git`
- **Method:** POST
- **Authorization:** `Basic <access_token>`
- **Content-Type:** `application/json`

View file

@ -1,6 +1,6 @@
---
id: importing-exporting-applications
title: Import and Export Applications
title: Applications
---
This documentation explains the process of exporting and importing applications in ToolJet.

View file

@ -1,6 +1,6 @@
---
id: import-export-modules
title: Import and Export Modules
title: Modules
---
ToolJet allows you to export and import modules, making it easy to share, reuse, or migrate modules across different workspaces.

View file

@ -0,0 +1,36 @@
---
id: import-export-workflows
title: Workflows
---
<div style={{display:'flex',justifyContent:"start",alignItems:"center",gap:"8px"}}>
<div className="badge badge--self-hosted heading-badge" >
<span>Self Hosted</span>
</div>
</div>
ToolJet supports exporting workflows as JSON files and importing them into any ToolJet workspace.
## Exporting Workflows
To export a workflow from your ToolJet workspace:
1. Navigate to the **Workflows** tab from the dashboard.
2. Click on the kebab menu (three vertical dots) at the top-right corner of the workflow you want to export.
3. Select **Export Workflow** from the menu. A `.json` file containing the workflow configuration will be downloaded to your system.
<img style={{marginTop:'15px'}} className="screenshot-full img-full" src="/img/workflows/import-export/export.png" alt="Navigate to Workflow Section" />
This file can later be imported into any ToolJet workspace to replicate the same workflow setup.
## Importing Workflows
To import a workflow from your ToolJet workspace:
1. Navigate to the **Workflows** tab from the dashboard.
2. Click on the kebab menu (three vertical dots) next to the **Create new workflow** button and select **Import from device**.
<img style={{marginTop:'15px'}} className="screenshot-full img-full" src="/img/workflows/import-export/import.png" alt="Navigate to Workflow Section" />
3. Choose the `.json` file of the workflow you want to import from your local system.
4. Click **Import workflow** button to complete the import process.
<img style={{marginTop:'15px'}} className="screenshot-full img-s" src="/img/workflows/import-export/import-modal.png" alt="Navigate to Workflow Section" />
Once imported, the workflow will appear in your workspace and can be edited or triggered like any other workflow.

View file

@ -3,11 +3,10 @@ id: quickstart-guide
title: Quickstart Guide
---
This quickstart guide walks you through the process of creating an employee directory app using ToolJet. The application lets users track and update employee details while working with core features of the platform, all within a user-friendly interface. Here are the step-by-step instructions:
**[1. Create Your First Application](#1-create-your-first-application)** <br/>
**[2. Create a Database Table](#2-create-a-database-table)** <br/>
**[1. Create Your First Application](#1-create-your-first-application)** <br/>
**[2. Create a Database Table](#2-create-a-database-table)** <br/>
**[3. Create a Query to Fetch Data](#3-create-a-query-to-fetch-data)** <br/>
**[4. Bind Queried Data to the UI](#4-bind-queried-data-to-the-ui)** <br/>
**[5. Create a Query to Add Data](#5-create-a-query-to-add-data)** <br/>
@ -18,29 +17,30 @@ This quickstart guide walks you through the process of creating an employee dire
### 1. Create Your First Application
To begin, create a free **[ToolJet](https://www.tooljet.ai/signup)** account and follow the steps below.
To begin, create a free **[ToolJet](https://www.tooljet.com/signup)** account and follow the steps below.
<div class="video-container">
<iframe width="560" height="315" src="https://www.youtube.com/embed/3opM-aL_ct4?si=ubFBF7SpneufFb0s&rel=0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div>
<br/>
- Click on the **Create new app** button on the dashboard. Name your application as "Employee Directory".
- Click and drag a **[Table](/docs/widgets/table)** component on the canvas. Optionally, you can also design a header by adding more components.
- Click on the **Create new app** button on the dashboard. Name your application as "Employee Directory".
- Click and drag a **[Table](/docs/widgets/table)** component on the canvas. Optionally, you can also design a header by adding more components.
</div>
<div style={{paddingTop:'24px', paddingBottom:'24px'}}>
### 2. Create a Database Table
Now, create a new table in **[ToolJets Database](/docs/tooljet-db/tooljet-database/)** to store employee records.
Now, create a new table in **[ToolJets Database](/docs/tooljet-db/tooljet-database/)** to store employee records.
<div class="video-container">
<iframe width="560" height="315" src="https://www.youtube.com/embed/a7qWJajVQ2o?si=KtppkSMB7JK4ANd1&rel=0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div>
<br/>
- Name the table *employees*, then add the following columns: first_name, last_name, email, phone, department, position, joining, and status.
- Name the table _employees_, then add the following columns: first_name, last_name, email, phone, department, position, joining, and status.
- Add a few employee records in the database table as placeholder data.
</div>
@ -58,10 +58,10 @@ To display employees in the application, you will first have to fetch the data f
- Click on the **Add** button in the **[Query Panel](/docs/app-builder/query-panel/)** to create a new query.
- Select **ToolJet Database** as the data source for the query.
- Rename the query to *getEmployees*.
- Choose *employees* as the Table name, and *List rows* as the Operation.
- Rename the query to _getEmployees_.
- Choose _employees_ as the Table name, and _List rows_ as the Operation.
- Click on the **Run** button to fetch data.
- To automatically run the query when the app starts, enable the toggle for *Run this query on application load* from the query setting.
- To automatically run the query when the app starts, enable the toggle for _Run this query on application load_ from the query setting.
</div>
@ -69,7 +69,7 @@ To display employees in the application, you will first have to fetch the data f
### 4. Bind Queried Data to the UI
Now, you need to bind the data returned by the *getEmployees* query with the Table created in the first step.
Now, you need to bind the data returned by the _getEmployees_ query with the Table created in the first step.
<div class="video-container">
<iframe width="560" height="315" src="https://www.youtube.com/embed/fmLeeheFHsM?si=YzO-V_NHTyKHYkC5&rel=0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
@ -80,10 +80,14 @@ Now, you need to bind the data returned by the *getEmployees* query with the Tab
- Under the Data property, enter the below code:
```js
{{queries.getEmployees.data}}
{
{
queries.getEmployees.data;
}
}
```
Now the Table component is filled with the data returned by the *getEmployees* query.
Now the Table component is filled with the data returned by the _getEmployees_ query.
</div>
@ -91,7 +95,7 @@ Now the Table component is filled with the data returned by the *getEmployees* q
### 5. Create a Query to Add Data
In the bottom-right corner of the Table component, there is a **+(Add new row)** button that opens an auto-generated form to add new data to the Table. Follow the steps below to create an *addEmployees* query and execute it when you click the **Save** button on the auto-generated form.
In the bottom-right corner of the Table component, there is a **+(Add new row)** button that opens an auto-generated form to add new data to the Table. Follow the steps below to create an _addEmployees_ query and execute it when you click the **Save** button on the auto-generated form.
<div class="video-container">
<iframe width="560" height="315" src="https://www.youtube.com/embed/mbvygFJYY9c?si=sEpqNlR36P8wlHBN&rel=0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
@ -99,8 +103,8 @@ In the bottom-right corner of the Table component, there is a **+(Add new row)**
<br/>
- Click on the **Add** button in the query panel, and select **ToolJet Database** as the data source.
- Select *employees* as the Table name, and Create row as the Operation.
- Rename the query to *addEmployees*.
- Select _employees_ as the Table name, and Create row as the Operation.
- Rename the query to _addEmployees_.
- Click on **Add Column** to add the required columns.
- Enter the code below for **first_name** and **email** column keys:
@ -111,13 +115,14 @@ In the bottom-right corner of the Table component, there is a **+(Add new row)**
```
Frame all the remaining keys in the same format.
</div>
<div style={{paddingTop:'24px', paddingBottom:'24px'}}>
### 6. Use Events to Trigger Queries
The *addEmployees* query should run when you click the **Save** button on the auto-generated form. The Table component should then reload and display the updated data whenever a new employee is added. Follow the steps below to set up this functionality using events.
The _addEmployees_ query should run when you click the **Save** button on the auto-generated form. The Table component should then reload and display the updated data whenever a new employee is added. Follow the steps below to set up this functionality using events.
<div class="video-container">
<iframe width="560" height="315" src="https://www.youtube.com/embed/UJ3FyUqhhjE?si=pPun7LM7Rbs0g35C&rel=0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
@ -125,9 +130,9 @@ The *addEmployees* query should run when you click the **Save** button on the au
<br/>
- Click on the Table component, and click on **New event handler** in the properties panel.
- Choose Add new rows as the Event, Run Query as the Action, and *addEmployees* as the Query.
- In the *addEmployees* query's configuration, under the settings tab, click on **New event handler** to add a new event.
- Select Query Success as the Event, Run Query as the Action, and *getEmployees* as the Query.
- Choose Add new rows as the Event, Run Query as the Action, and _addEmployees_ as the Query.
- In the _addEmployees_ query's configuration, under the settings tab, click on **New event handler** to add a new event.
- Select Query Success as the Event, Run Query as the Action, and _getEmployees_ as the Query.
Now, when you click the **+ (Add new row)** button on the Table component, enter the employee details, and click **Save**, the data will be added to the database and automatically reflected in the Table component on the UI.
@ -148,8 +153,6 @@ The preview, release and share buttons are at the top-right of the App-Builder.
- Once the development is done and you are ready to use the application, click on the **Release** button to deploy the app.
- Finally, share your application with your end users using the **Share** button.
Congratulations on completing the tutorial! You've successfully built an employee directory application and, in the process, learnt the fundamentals of ToolJet.
Congratulations on completing the tutorial! You've successfully built an employee directory application and, in the process, learnt the fundamentals of ToolJet.
</div>

View file

@ -7,13 +7,14 @@ This guide gives you an overview of how you can pass values in a REST API Query
<div style={{paddingTop:'24px'}}>
## Raw JSON
## Raw JSON
In the following JSON code, the `${}` syntax is used for JavaScript string interpolation within template literals (also called template strings). This allows dynamic values from JavaScript variables or expressions to be injected directly into the string.
```javascript
{{
`{
{
{
`{
"contents": [{
"parts": [{
"text": "Generate the following content for this image in markdown format:
@ -27,8 +28,9 @@ In the following JSON code, the `${}` syntax is used for JavaScript string inter
}
},],
},],
}`
}}
}`;
}
}
```
<div style={{textAlign: 'center'}}>
@ -49,7 +51,7 @@ In this example, simple key-value pairs are entered in the provided input fields
</div>
To see REST API queries in action, check out the following tutorials:
To see REST API queries in action, check out the following tutorials:
1. **[Gemini AI Content Generator](https://blog.tooljet.ai/build-an-ai-content-generator-using-gemini-api-and-tooljet-in-10-minutes/)**
2. **[Open AI Audio Transcriber](https://blog.tooljet.ai/building-an-audio-transcriber-and-analyzer-using-tooljet-and-openai/)**
1. **[Gemini AI Content Generator](https://blog.tooljet.com/build-an-ai-content-generator-using-gemini-api-and-tooljet-in-10-minutes/)**
2. **[Open AI Audio Transcriber](https://blog.tooljet.com/building-an-audio-transcriber-and-analyzer-using-tooljet-and-openai/)**

View file

@ -2,6 +2,7 @@
id: use-axios-in-runjs
title: Use Axios in RunJS
---
<div style={{paddingBottom:'24px'}}>
ToolJet supports three libraries: **Moment.js**, **Lodash**, and **Axios**. This guide focuses on using the Axios library with RunJS queries. **[Axios](https://axios-http.com/docs/intro)** is a promise-based HTTP client for making requests to your own or external servers. It supports various request types like `GET`, `POST`, `PUT/PATCH`, and `DELETE`.
@ -21,10 +22,10 @@ var url = "https://jsonplaceholder.typicode.com/users/1";
var data = (await axios.get(url)).data;
return data
return data;
```
*This code sets up a URL variable, makes a GET request to the API, and returns the data. Preview the query to see the API's response.*
_This code sets up a URL variable, makes a GET request to the API, and returns the data. Preview the query to see the API's response._
<div style={{textAlign: 'center'}}>
@ -43,18 +44,18 @@ return data
```javascript
var url = "https://jsonplaceholder.typicode.com/users";
var data = axios.post(url,{
var data = axios.post(url, {
id: 11,
name: "Shubhendra",
username: "camelcaseguy",
email: "shubhendra@tooljet.com",})
email: "shubhendra@tooljet.com",
});
return data
return data;
```
This POST request sends user details to the server. The server's response, as shown below, includes **Status: 201** indicating successful resource creation.
<div style={{textAlign: 'center'}}>
<img className="screenshot-full" src="/img/how-to/use-axios/post.png" alt="Use Axios in RunJS"/>
@ -62,7 +63,6 @@ This POST request sends user details to the server. The server's response, as sh
</div>
To see Axios in action in a project, check out this tutorial:
**[Build GitHub star history tracker](https://blog.tooljet.ai/build-github-stars-history-app-in-5-minutes-using-low-code/)**.
**[Build GitHub star history tracker](https://blog.tooljet.com/build-github-stars-history-app-in-5-minutes-using-low-code/)**.
</div>
</div>

View file

@ -20,9 +20,6 @@ Use this operation to generate text based on the prompt, system instructions, an
**Required Parameters**
- **Model**: Specifies the Gemini model to use for generating responses.
- Gemini 1.5 Flash
- Gemini 1.5 Flash-8B
- Gemini 1.5 Pro
- Gemini 2.0 Flash
- **Prompt**: The main user input for generating responses.
@ -75,9 +72,6 @@ Use this operation for a chat-like conversation, where the model responds based
**Required Parameters**
- **Model**: Specifies the Gemini model to use for generating responses in the chat.
- Gemini 1.5 Flash
- Gemini 1.5 Flash-8B
- Gemini 1.5 Pro
- Gemini 2.0 Flash
- **User Prompt**: The user's question or request that the model will respond to.

View file

@ -17,7 +17,7 @@ You can toggle on **Authentication required for all users** in the configuration
Note: After completing the OAuth flow, the query must be triggered again to load the data.
<img className="screenshot-full img-l" src="/img/marketplace/plugins/gmail/connection.png" alt="Gmail Configuration" />
<img className="screenshot-full img-l" src="/img/marketplace/plugins/gmail/connection-v2.png" alt="Gmail Configuration" />
## Supported Operations

View file

@ -17,7 +17,7 @@ You can toggle on **Authentication required for all users** in the configuration
Note: After completing the OAuth flow, the query must be triggered again to load the data.
<img className="screenshot-full img-l" src="/img/marketplace/plugins/googlecal/connection.png" alt="Hugging Face Configuration" />
<img className="screenshot-full img-l" src="/img/marketplace/plugins/googlecal/connection-v2.png" alt="Hugging Face Configuration" />
### Generating Client ID and Client Secret

View file

@ -14,7 +14,7 @@ To connect HubSpot with ToolJet, you need the following credentials:
You also need to define the scope(s) for the operations you plan to perform. You can refer to the [HubSpot guide](https://developers.hubspot.com/docs/guides/apps/private-apps/overview) for detailed steps to generate these credentials.
<img className="screenshot-full img-l" src="/img/marketplace/plugins/hubspot/config.png" alt="HubSpot Configuration" />
<img className="screenshot-full img-l" src="/img/marketplace/plugins/hubspot/config-v2.png" alt="HubSpot Configuration" />
You can toggle on Authentication required for all users in the configuration. When enabled, users will be redirected to the OAuth consent screen the first time a query from this data source is triggered in the application. This ensures each user connects their own HubSpot account securely.

View file

@ -20,7 +20,7 @@ You can enable the **Authentication required for all users** toggle in the confi
**Note**: After completing the OAuth flow, the query must be triggered again to fetch data from Microsoft Graph.
<img className="screenshot-full img-full" src="/img/marketplace/plugins/microsoft-graph/connection.png" alt="Microsoft Graph Configuration" />
<img className="screenshot-full img-full" src="/img/marketplace/plugins/microsoft-graph/connection-v2.png" alt="Microsoft Graph Configuration" />
## Supported Operations

View file

@ -0,0 +1,66 @@
---
id: marketplace-plugin-prometheus
title: Prometheus
---
ToolJet integrates with Prometheus to help you fetch and display metrics in your app. You can use this plugin to run PromQL queries and show real-time or historical data from your Prometheus server. Its useful for building internal dashboards to monitor systems and track performance.
:::note
Before following this guide, it is assumed that you have already completed the process of **[Using Marketplace plugins](/docs/marketplace/marketplace-overview#using-marketplace-plugins)**.
:::
## Connection
Follow the steps in the [Prometheus documentation](https://prometheus.io/docs/prometheus/latest/getting_started/) to set up and run a Prometheus server.
To connect Prometheus with ToolJet, youll need the following details:
- **Prometheus server URL**
- **Username**
- **Password**
- **CA certificate**
<img className="screenshot-full img-l" src="/img/marketplace/plugins/prometheus/connection.png" alt="Configuring Prometheus in ToolJet" />
Once connected, you can start using instant and range queries to fetch metric data from your server.
## Supported Operations
- [Instant Query with PromQL](#instant-query-with-promql)
- [Range Query with PromQL](#range-query-with-promql)
### Instant Query with PromQL
Fetches the current value of a metric at a single point in time.
**Required Parameters**
- **Query**: A valid PromQL expression to fetch the metric.
- **Request method**: Defines how the request is sent (GET or POST)
**Optional Parameter**
- **Time**: Specific timestamp to evaluate the query against.
- **Timeout**: Maximum duration the query is allowed to run before timing out.
- **Limit**: Restricts the number of results returned.
<img className="screenshot-full img-full" src="/img/marketplace/plugins/prometheus/instant.png" alt="Instant Query with PromQL in ToolJet" />
### Range Query with PromQL
Retrieves metric data over a specified time range.
**Required Parameters**
- **Query**: A valid PromQL expression to fetch the metric.
- **Start**: Start timestamp of the time range.
- **End**: End timestamp of the time range.
- **Step**: Interval between data points within the time range.
- **Request method**: Defines how the request is sent (GET or POST).
**Optional Parameter**
- **Timeout**: Maximum duration the query is allowed to run before timing out.
- **Limit**: Restricts the number of results returned.
<img className="screenshot-full img-full" src="/img/marketplace/plugins/prometheus/range.png" alt="Range Query with PromQL in ToolJet" />

View file

@ -25,7 +25,7 @@ You can toggle on **Authentication required for all users** in the configuration
Note: After completing the OAuth flow, the query must be triggered again to load the data.
<img className="screenshot-full img-full" style={{ marginTop: '15px' }} src="/img/marketplace/plugins/salesforce/setup-v2.png" alt="Salesforece Install" />
<img className="screenshot-full img-full" style={{ marginTop: '15px' }} src="/img/marketplace/plugins/salesforce/setup-v3.png" alt="Salesforece Install" />
## Querying Salesforce

View file

@ -1,6 +1,6 @@
---
id: audit-logs
title: Audit Logs
title: Overview
---
<div className="badge badge--primary heading-badge">

View file

@ -0,0 +1,365 @@
---
id: stream-audit-to-datadog
title: Stream Audit Logs to Datadog
---
<br/>
This guide demonstrates how to configure ToolJet to stream audit logs from Rsyslog to Datadog for **centralized log management**, **monitoring**, and **analysis**. This integration enables real-time visibility into user activities, resource changes, and system events, helping you maintain security, compliance, and operational awareness across your infrastructure.
When to stream ToolJet audit logs to Datadog:
- **Multi-server deployments**: Centralize logs from production, staging, and development environments
- **Security monitoring**: Correlate user actions with infrastructure metrics to detect anomalies
- **Compliance requirements**: Maintain tamper-proof audit trails with long-term retention
- **Incident response**: Quickly search and analyze logs during security or operational incidents
## Prerequisites
Before setting up the Datadog integration, ensure you have:
1. **ToolJet with rsyslog enabled** - Follow the **[Setup Rsyslog guide](/docs/how-to/setup-rsyslog)** to enable log file generation
2. **Datadog account** - Sign up at [https://www.datadoghq.com/](https://www.datadoghq.com/)
3. **Datadog API key** - Obtain from [Datadog Organization Settings](https://app.datadoghq.com/organization-settings/api-keys)
4. **Docker Compose setup** - This guide uses Docker Compose for deployment
## Architecture Overview
1. **ToolJet** writes audit logs to `/home/appuser/rsyslog/` inside the container
2. **Docker volume** shares the rsyslog directory between ToolJet and Datadog Agent containers
3. **Datadog Agent** monitors the log files and streams them to Datadog's cloud platform
4. **Datadog** parses, indexes, and displays the logs in the Logs Explorer
```
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ ToolJet │─────>│ Docker Volume│<─────│ Datadog │
│ Container │ │ (rsyslog/) │ │ Agent │
└─────────────┘ └──────────────┘ └──────┬──────┘
┌─────────────┐
│ Datadog │
│ Cloud │
└─────────────┘
```
## Configuration Steps
### Step 1: Configure Environment Variables
Add the following environment variables to your `.env` file:
```bash
# Enable rsyslog (if not already enabled)
LOG_FILE_PATH='rsyslog'
# Datadog Configuration
DD_API_KEY=your_datadog_api_key_here
DD_SITE=datadoghq.com
```
:::info
Replace `your_datadog_api_key_here` with your actual Datadog API key from [https://app.datadoghq.com/organization-settings/api-keys](https://app.datadoghq.com/organization-settings/api-keys)
:::
:::tip Datadog Site
The `DD_SITE` value depends on your Datadog region:
- US1: `datadoghq.com` (default)
- US3: `us3.datadoghq.com`
- US5: `us5.datadoghq.com`
- EU: `datadoghq.eu`
- AP1: `ap1.datadoghq.com`
:::
### Step 2: Create Datadog Agent Configuration
Create a file named `datadog-agent-config.yml` in your ToolJet deployment directory:
```yaml
logs_enabled: true
logs_config:
container_collect_all: false
# ToolJet audit log configuration
log_processing_rules:
- type: multi_line
name: json_logs
pattern: ^\{
```
This configuration:
- Enables log collection in the Datadog Agent
- Disables automatic collection from all containers (we'll target specific logs)
- Sets up multiline processing for JSON-formatted logs
### Step 3: Create ToolJet Log Collection Configuration
Create a file named `datadog-tooljet-logs.yaml` in your ToolJet deployment directory:
```yaml
logs:
- type: file
path: /var/log/tooljet/rsyslog/tooljet_log/*/audit.log
service: tooljet
source: tooljet-audit
sourcecategory: audit
tags:
- env:production
- application:tooljet
- log_type:audit
# Parse JSON logs
log_processing_rules:
- type: exclude_at_match
name: exclude_empty_logs
pattern: "^\\s*$"
```
This configuration:
- **path**: Monitors all audit.log files using a wildcard pattern to match daily rotated logs
- **service**: Tags logs with `service:tooljet` for filtering in Datadog
- **source**: Identifies logs as `tooljet-audit` for parsing pipelines
- **tags**: Adds custom tags for organization and filtering
- **log_processing_rules**: Excludes empty log lines
**Customize Tags**
Modify the `tags` section to match your environment:
```yaml
tags:
- env:staging # or development, production
- application:tooljet
- team:platform
- region:us-east-1
```
### Step 4: Update Docker Compose Configuration
Update your `docker-compose.yml` file to include the Datadog Agent and shared volume:
#### Add Shared Volume to ToolJet Service
```yaml
services:
tooljet:
# ... existing configuration ...
volumes:
- tooljet-logs:/home/appuser/rsyslog
```
#### Add Datadog Agent Service
```yaml
datadog-agent:
container_name: datadog-agent
image: gcr.io/datadoghq/agent:7
restart: always
environment:
- DD_API_KEY=${DD_API_KEY}
- DD_SITE=${DD_SITE:-datadoghq.com}
- DD_LOGS_ENABLED=true
- DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=false
- DD_PROCESS_AGENT_ENABLED=true
- DD_DOCKER_LABELS_AS_TAGS={"*":"%%label%%"}
- DD_TAGS=env:production application:tooljet
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /proc/:/host/proc/:ro
- /sys/fs/cgroup/:/host/sys/fs/cgroup:ro
- tooljet-logs:/var/log/tooljet/rsyslog:ro
- ./datadog-agent-config.yml:/etc/datadog-agent/datadog.yaml:ro
- ./datadog-tooljet-logs.yaml:/etc/datadog-agent/conf.d/tooljet.d/conf.yaml:ro
```
#### Define the Shared Volume
```yaml
volumes:
tooljet-logs:
# ... other volumes ...
```
Complete docker-compose.yml Example
```bash
name: ToolJet
services:
tooljet:
container_name: Tooljet-app
image: tooljet/tooljet:latest
restart: always
env_file: .env
ports:
- 80:80
environment:
SERVE_CLIENT: "true"
PORT: "80"
command: npm run start:prod
volumes:
- tooljet-logs:/home/appuser/rsyslog
datadog-agent:
container_name: datadog-agent
image: gcr.io/datadoghq/agent:7
restart: always
environment:
- DD_API_KEY=${DD_API_KEY}
- DD_SITE=${DD_SITE:-datadoghq.com}
- DD_LOGS_ENABLED=true
- DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=false
- DD_PROCESS_AGENT_ENABLED=true
- DD_DOCKER_LABELS_AS_TAGS={"*":"%%label%%"}
- DD_TAGS=env:production application:tooljet
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /proc/:/host/proc/:ro
- /sys/fs/cgroup/:/host/sys/fs/cgroup:ro
- tooljet-logs:/var/log/tooljet/rsyslog:ro
- ./datadog-agent-config.yml:/etc/datadog-agent/datadog.yaml:ro
- ./datadog-tooljet-logs.yaml:/etc/datadog-agent/conf.d/tooljet.d/conf.yaml:ro
postgres:
container_name: postgres
image: postgres:13
restart: always
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
ports:
- 5432:5432
volumes:
tooljet-logs:
```
### Step 5: Deploy the Configuration
1. **Stop existing containers**:
```bash
docker-compose down
```
2. **Start the updated stack**:
```bash
docker-compose up -d
```
3. **Verify containers are running**:
```bash
docker ps
```
You should see both `Tooljet-app` and `datadog-agent` containers running.
### Step 6: Verify the Integration
#### Check Datadog Agent Status
Run the following command to verify the agent is collecting logs:
```bash
docker exec datadog-agent agent status
```
Look for the **Logs Agent** section in the output:
```
Logs Agent
==========
...
Integrations
============
tooljet
-------
- Type: file
Path: /var/log/tooljet/rsyslog/tooljet_log/*/audit.log
Service: tooljet
Source: tooljet-audit
Status: OK
1 files tailed out of 1 files matching
```
:::info
If the status shows "OK" and files are being tailed, the integration is working correctly.
:::
#### Check Datadog Agent Logs
View the Datadog Agent logs to troubleshoot any issues:
```bash
docker logs datadog-agent --tail 50
```
#### Generate Test Audit Logs
Perform actions in ToolJet to generate audit logs:
- Create or delete an application
- Modify data sources
- Update user permissions
- Change organization settings
### Step 7: View Logs in Datadog
1. Navigate to the **[Datadog Logs Explorer](https://app.datadoghq.com/logs)**
2. Use the following filters to find your ToolJet logs:
- `service:tooljet`
- `source:tooljet-audit`
- `env:production`
## Log Structure and Fields
ToolJet audit logs contain the following structured fields:
| Field | Description | Example |
|-------|-------------|---------|
| `level` | Log severity level | `info`, `warn`, `error` |
| `message` | Human-readable log message | `PERFORM APP_CREATE OF MyApp` |
| `timestamp` | When the event occurred | `2025-10-21 11:27:44` |
| `auditLog.userId` | User who performed the action | `a59e1ec7-d015-47b9-8ef8-e5d3f4e5f8d4` |
| `auditLog.resourceId` | ID of the affected resource | `95031c39-9d19-425d-b70c-3436c2805773` |
| `auditLog.resourceType` | Type of resource | `APP`, `DATA_SOURCE`, `USER` |
| `auditLog.actionType` | Action performed | `APP_CREATE`, `APP_DELETE`, `APP_UPDATE` |
| `auditLog.resourceName` | Name of the resource | `MyApplication` |
| `auditLog.ipAddress` | Client IP address | `::ffff:192.168.65.1` |
| `auditLog.organizationId` | Organization ID | `e9de636b-e611-4b90-95f0-0fe20b540924` |
| `auditLog.metadata.userAgent` | Browser/client information | `Mozilla/5.0...` |
| `auditLog.metadata.tooljetVersion` | ToolJet version | `3.16.33-ee-lts` |
| `auditLog.metadata.transactionId` | Unique transaction identifier | `732440597788045` |
| `auditLog.metadata.route` | API endpoint called | `[POST] /api/apps` |
**Example Audit Log Entry**
```json
{
"level": "info",
"message": "PERFORM APP_CREATE OF MyApp APP FOR ORGANIZATION e9de636b-e611-4b90-95f0-0fe20b540924",
"timestamp": "2025-10-21 11:27:44",
"auditLog": {
"userId": "a59e1ec7-d015-47b9-8ef8-e5d3f4e5f8d4",
"resourceId": "95031c39-9d19-425d-b70c-3436c2805773",
"resourceType": "APP",
"actionType": "APP_CREATE",
"resourceName": "MyApp",
"ipAddress": "::ffff:192.168.65.1",
"metadata": {
"instance_level": false,
"workspace_level": true,
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:144.0) Gecko/20100101 Firefox/144.0",
"tooljetVersion": "3.16.33-ee-lts",
"transactionId": "732440597788045",
"totalDuration": 150,
"route": "[POST] /api/apps"
},
"resourceData": {},
"organizationId": "e9de636b-e611-4b90-95f0-0fe20b540924"
},
"label": "APP"
}
```
## Related Resources
- **[Setup Rsyslog](/docs/how-to/setup-rsyslog)** - Configure audit log generation
- **[Datadog Documentation](https://docs.datadoghq.com/)** - Official Datadog guides
- **[Datadog Agent Configuration](https://docs.datadoghq.com/agent/guide/agent-configuration-files/)** - Detailed Agent setup
- **[Log Collection](https://docs.datadoghq.com/logs/log_collection/)** - Datadog log collection guide

View file

@ -8,11 +8,13 @@ title: AWS AMI
You can effortlessly deploy Amazon Elastic Compute Cloud Service (EC2) by utilizing a **CloudFormation template**. This template will deploy all the services required to run ToolJet on AWS AMI instances.
:::warning
To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` in your network settings.
To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings.
:::
:::info
You should setup a PostgreSQL database manually to be used by ToolJet. We recommend using an **RDS PostgreSQL database**. You can find the system requirements [here](/docs/setup/system-requirements).
ToolJet runs with **built-in Redis** for multiplayer editing and background jobs. When running **separate worker containers** or **multi-pod setup**, an **external Redis instance** is **required** for job queue coordination.
:::
## Deploy using CloudFormation
@ -72,6 +74,7 @@ Follow the steps below to deploy ToolJet on AWS AMI instances.
:::
For AWS RDS PostgreSQL connections, first download the certificate bundle:
```bash
# Create directory and download certificate
sudo mkdir -p /home/ubuntu/certs/
@ -81,6 +84,7 @@ Follow the steps below to deploy ToolJet on AWS AMI instances.
```
Then add these variables to your `.env` file:
```bash
PG_HOST=your-rds-endpoint.region.rds.amazonaws.com
PGSSLMODE=require
@ -124,30 +128,41 @@ You can learn more about this feature [here](/docs/tooljet-db/tooljet-database).
ToolJet Workflows allows users to design and execute complex, data-centric automations using a visual, node-based interface. This feature enhances ToolJet's functionality beyond building secure internal tools, enabling developers to automate complex business processes.
:::info
For users migrating from Temporal-based workflows, please refer to the [Workflow Migration Guide](./workflow-temporal-to-bullmq-migration).
:::
### Enabling Workflow Scheduling
To activate workflows scheduling, set the following environment variables:
To activate workflow scheduling, set the following environment variables:
```bash
WORKFLOW_WORKER=true
ENABLE_WORKFLOW_SCHEDULING=true
TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE=default
TEMPORAL_SERVER_ADDRESS=<Temporal_Server_Address>
# Worker Mode (required)
# Set to 'true' to enable job processing
# Set to 'false' or unset for HTTP-only mode (scaled deployments)
WORKER=true
# Workflow Processor Concurrency (optional)
# Number of workflow jobs processed concurrently per worker
# Default: 5
TOOLJET_WORKFLOW_CONCURRENCY=5
```
**Note**: Workflows scheduling requires a Temporal server to be deployed. Restarting the server using `./setup_app`.
**Environment Variable Details:**
- **WORKER** (required): Enables job processing. Set to `true` to activate workflow scheduling
- **TOOLJET_WORKFLOW_CONCURRENCY** (optional): Controls the number of workflow jobs processed concurrently per worker instance. Default is 5 if not specified
### Deploying Temporal with Docker Compose
:::warning
**External Redis Requirement**: When running separate worker containers or multiple instances, an external stateful Redis instance is **required** for job queue coordination. The built-in Redis only works when the server and worker are in the same container instance (single instance deployment). Configure the Redis connection using the following environment variables:
- `REDIS_HOST=localhost` - Default: localhost
- `REDIS_PORT=6379` - Default: 6379
- `REDIS_USERNAME=` - Optional: Redis username (ACL)
- `REDIS_PASSWORD=` - Optional: Redis password
- `REDIS_DB=0` - Optional: Redis database number (default: 0)
- `REDIS_TLS=false` - Optional: Enable TLS/SSL (set to 'true')
:::
Below is a `docker-compose` template to set up Temporal.
```
curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/ec2-temporal/docker-compose.yml
```
This setup can be deployed on a different EC2 instance. To enable seamless communication, ensure that both the application server and the Temporal server are in the same VPC.
**Note**: Ensure that port 7233 is configured for gRPC in the security group.
**Note**: After updating the `.env` file, restart the server using `./setup_app`.
## Upgrading to the Latest LTS Version
@ -183,4 +198,4 @@ Since ToolJet is deployed using an AMI (Amazon Machine Image), upgrading to a ne
7. **Terminate the Old EC2 Instance** <br/>
After verifying that ToolJet is running correctly on the new instance, terminate the old EC2 instance to avoid unnecessary costs.
_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._
_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._

View file

@ -6,13 +6,13 @@ title: Azure Container Apps
# Deploying ToolJet on Azure Container Apps
:::warning
To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` in your network settings.
To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings.
:::
:::info
Please note that you need to set up a **PostgreSQL database** manually to be used by ToolJet.
ToolJet comes with a **built-in Redis setup**, which is used for multiplayer editing and background jobs. However, for **multi-pod setup**, it's recommended to use an **external Redis instance**.
ToolJet runs with **built-in Redis** for multiplayer editing and background jobs. When running **separate worker containers** or **multi-pod setup**, an **external Redis instance** is **required** for job queue coordination.
:::
## Deploying ToolJet Application
@ -29,9 +29,10 @@ ToolJet comes with a **built-in Redis setup**, which is used for multiplayer edi
:::
<img className="screenshot-full img-full" src="/img/setup/azure-container/step3-2.png" alt="Deploying ToolJet on Azure container apps" />
5. Click on the **Create** button at the bottom of the page.
6. Then you will be redirected to the Create Container App tab, uncheck the **Use quickstart image** option to select the image source manually. Make sure to provide the image tag, and then enter `server/entrypoint.sh, npm, run, start:prod` in the "Arguments override" field.
6. Then you will be redirected to the Create Container App tab, uncheck the **Use quickstart image** option to select the image source manually. Make sure to provide the image tag, and then enter `server/ee-entrypoint.sh, npm, run, start:prod` in the "Arguments override" field.
<img className="screenshot-full img-m" src="/img/setup/azure-container/step3-v2.png" alt="Deploying ToolJet on Azure container apps" />
7. Under "Environmental variables", please add the below ToolJet application variables:
```env
TOOLJET_HOST=<Endpoint url>
LOCKBOX_MASTER_KEY=<generate using 'openssl rand -hex 32'>
@ -83,6 +84,7 @@ ToolJet comes with a **built-in Redis setup**, which is used for multiplayer edi
**Note:** These environment variables are in general and might change in the future. You can also refer env variable [**here**](/docs/setup/env-vars).
<img className="screenshot-full img-full" src="/img/setup/azure-container/step4-v2.png" alt="Deploying ToolJet on Azure container apps" />
8. In the Ingress tab, configure Ingress and Authentication settings as shown below. You can customize the security configurations as per your requirements. Make sure the port is set to 3000.
<img className="screenshot-full img-full" src="/img/setup/azure-container/step4.png" alt="Deploying ToolJet on Azure container apps" />
9. Move to Review + create tab and wait for the template to be verified and passed, as shown in the screenshot below.
@ -129,6 +131,44 @@ Deploying ToolJet Database is mandatory from ToolJet 3.0 or else the migration m
- [ToolJet 3.0 Migration Guide for Self-Hosted Versions](./upgrade-to-v3.md)
## Workflows
ToolJet Workflows allows users to design and execute complex, data-centric automations using a visual, node-based interface. This feature enhances ToolJet's functionality beyond building secure internal tools, enabling developers to automate complex business processes.
:::info
For users migrating from Temporal-based workflows, please refer to the [Workflow Migration Guide](./workflow-temporal-to-bullmq-migration).
:::
### Enabling Workflow Scheduling
To activate workflow scheduling, set the following environment variables:
```bash
# Worker Mode (required)
# Set to 'true' to enable job processing
# Set to 'false' or unset for HTTP-only mode (scaled deployments)
WORKER=true
# Workflow Processor Concurrency (optional)
# Number of workflow jobs processed concurrently per worker
# Default: 5
TOOLJET_WORKFLOW_CONCURRENCY=5
```
**Environment Variable Details:**
- **WORKER** (required): Enables job processing. Set to `true` to activate workflow scheduling
- **TOOLJET_WORKFLOW_CONCURRENCY** (optional): Controls the number of workflow jobs processed concurrently per worker instance. Default is 5 if not specified
:::warning
**External Redis Requirement**: When running separate worker containers or multiple instances, an external stateful Redis instance is **required** for job queue coordination. The built-in Redis only works when the server and worker are in the same container instance (single instance deployment). Configure the Redis connection using the following environment variables:
- `REDIS_HOST=localhost` - Default: localhost
- `REDIS_PORT=6379` - Default: 6379
- `REDIS_USERNAME=` - Optional: Redis username (ACL)
- `REDIS_PASSWORD=` - Optional: Redis password
- `REDIS_DB=0` - Optional: Redis database number (default: 0)
- `REDIS_TLS=false` - Optional: Enable TLS/SSL (set to 'true')
:::
## Upgrading to the Latest LTS Version
New LTS versions are released every 3-5 months with an end-of-life of atleast 18 months. To check the latest LTS version, visit the [ToolJet Docker Hub](https://hub.docker.com/r/tooljet/tooljet/tags) page. The LTS tags follow a naming convention with the prefix `LTS-` followed by the version number, for example `tooljet/tooljet:ee-lts-latest`.
@ -140,4 +180,4 @@ If this is a new installation of the application, you may start directly with th
- It is crucial to perform a **comprehensive backup of your database** before starting the upgrade process to prevent data loss.
- Users on versions earlier than **v2.23.0-ee2.10.2** must first upgrade to this version before proceeding to the LTS version.
_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._
_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._

View file

@ -13,14 +13,14 @@ Please find the latest LTS version here: <br/>
[Docker Hub - LTS Versions](https://hub.docker.com/r/tooljet/tooljet/tags?page_size=&ordering=&name=ee-lts)
:::info
To use the ToolJet AI feature, you will have to upgrade to **`v3.20.00-ee-lts`** or higher. Checkout the **[Build with AI](/docs/build-with-ai/overview)** section for more information. If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or email us at hello@tooljet.com.
To use the ToolJet AI feature, you will have to upgrade to **`v3.20.00-ee-lts`** or higher. Checkout the **[Build with AI](/docs/build-with-ai/overview)** section for more information. If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or email us at support@tooljet.com.
:::
| Version | Release Date | Docker Pull Command |
| ---------| ------------- | ----------------------|
| Latest EE-LTS | N/A | `docker pull tooljet/tooljet:ee-lts-latest` |
| [v3.16.0-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.16.0-lts/images/sha256-626a6463504f74659e1468a69edbdacc264eded5867ae159a18358fc43d47b48) | August 4, 2025 | `docker pull tooljet/tooljet:v3.16.0-lts` |
| [v3.5.0-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.5.0-ee-lts/images/sha256-9580d2377d17ce0c26fca0535eca51bce899015f26bfc81769d032b4b15a5da5) | February 12, 2025 | `docker pull tooljet/tooljet:v3.5.0-ee-lts` |
| Version | Release Date | Docker Pull Command |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | -------------------------------------------- |
| Latest EE-LTS | N/A | `docker pull tooljet/tooljet:ee-lts-latest` |
| [v3.16.0-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.16.0-lts/images/sha256-626a6463504f74659e1468a69edbdacc264eded5867ae159a18358fc43d47b48) | August 4, 2025 | `docker pull tooljet/tooljet:v3.16.0-lts` |
| [v3.5.0-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.5.0-ee-lts/images/sha256-9580d2377d17ce0c26fca0535eca51bce899015f26bfc81769d032b4b15a5da5) | February 12, 2025 | `docker pull tooljet/tooljet:v3.5.0-ee-lts` |
| [v3.0.24-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.24-ee-lts/images/sha256-33494c8ee72c440ce0ded925cdeb15507cd87f2b7c3fe172dd1cbee790e3b96f?context=explore) | January 3, 2025 | `docker pull tooljet/tooljet:v3.0.24-ee-lts` |
| [v3.0.23-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.23-ee-lts/images/sha256-1ca2bcb5dac66b1d3d089bd8300b7077c0dcd27bb2cfe6665bf388b680294467?context=explore) | January 2, 2025 | `docker pull tooljet/tooljet:v3.0.23-ee-lts` |
| [v3.0.22-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.22-ee-lts/images/sha256-fc2bca053802e06a09858b65c2a5f47f1cb0ece2d156ca9b0dd1c37c60d5d2b8?context=explore) | December 30, 2024 | `docker pull tooljet/tooljet:v3.0.22-ee-lts` |

View file

@ -256,5 +256,5 @@ The `metadata` object will contain detailed information about the request and re
## Help and Support
- Feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or you can also e-mail us at hello@tooljet.com.
- Feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or you can also e-mail us at support@tooljet.com.
- If you have found a bug, please create a [GitHub issue](https://github.com/ToolJet/ToolJet/issues) for the same.

View file

@ -5,6 +5,10 @@ title: DigitalOcean
Follow the steps below to deploy ToolJet on a DigitalOcean Droplet.
:::warning
To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings.
:::
**1. Navigate to the Droplets section in DigitalOcean.**
<div style={{textAlign: 'center'}}>
@ -21,7 +25,7 @@ Follow the steps below to deploy ToolJet on a DigitalOcean Droplet.
<div style={{textAlign: 'center'}}>
<img className="screenshot-full" src="/img/setup/digitalocean/droplet_plan.png" alt="use a droplet plan" />
</div>
- **Auth**: For authentication, use password or ssh
- Click **Create Droplet** and note the assigned public IP
@ -82,4 +86,4 @@ If this is a new installation of the application, you may start directly with th
- Users on versions earlier than **v2.23.0-ee2.10.2** must first upgrade to this version before proceeding to the LTS version.
If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com.
If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com.

View file

@ -14,7 +14,7 @@ Follow the steps below to deploy ToolJet on a server using Docker Compose. ToolJ
If you rather want to try out ToolJet on your local machine with Docker, you can follow the steps [here](/docs/setup/try-tooljet/).
:::warning
To enable ToolJet AI features in your ToolJet deployment, whitelist https://api-gateway.tooljet.ai.
To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings.
:::
::::
@ -167,6 +167,119 @@ iv. Setup docker to run without root privileges by following the instructions wr
</TabItem>
</Tabs>
## Workflows
ToolJet Workflows allows users to design and execute complex, data-centric automations using a visual, node-based interface. This feature enhances ToolJet's functionality beyond building secure internal tools, enabling developers to automate complex business processes.
:::info
For users migrating from Temporal-based workflows, please refer to the [Workflow Migration Guide](./workflow-temporal-to-bullmq-migration).
:::
### Enabling Workflow Scheduling
To activate workflow scheduling, set the following environment variables:
```bash
# Worker Mode (required)
WORKER=true
# Workflow Processor Concurrency (optional)
TOOLJET_WORKFLOW_CONCURRENCY=5
```
**Environment Variable Details:**
- **WORKER** (required): Enables job processing. Set to `true` to activate workflow scheduling
- **TOOLJET_WORKFLOW_CONCURRENCY** (optional): Controls the number of workflow jobs processed concurrently per worker instance. Default is 5 if not specified
:::warning
**External Redis Requirement**: When running separate worker containers or multiple instances, an external stateful Redis instance is **required** for job queue coordination. The built-in Redis only works when the server and worker are in the same container instance (single instance deployment).
:::
### Running Multiple Workers with External Redis
<details id="tj-dropdown">
<summary>Docker Compose Example with Multiple Workers and External Redis</summary>
This example shows how to run ToolJet with multiple workers and external Redis for scalable workflow processing:
```yaml
services:
tooljet:
tty: true
stdin_open: true
container_name: Tooljet-app
image: tooljet/tooljet:ee-lts-latest
platform: linux/amd64
restart: always
env_file: .env
ports:
- 80:80
environment:
SERVE_CLIENT: "true"
PORT: "80"
command: npm run start:prod
tooljet-worker-1:
container_name: tooljet-worker-1
image: tooljet/tooljet:ee-lts-latest
env_file: .env
environment:
WORKER: "true"
TOOLJET_WORKFLOW_CONCURRENCY: 10
command: npm run start:prod
depends_on:
- redis
tooljet-worker-2:
container_name: tooljet-worker-2
image: tooljet/tooljet:ee-lts-latest
env_file: .env
environment:
WORKER: "true"
TOOLJET_WORKFLOW_CONCURRENCY: 10
command: npm run start:prod
depends_on:
- redis
redis:
image: redis:7
container_name: redis
ports:
- 6379:6379
volumes:
- redis-data:/data
command: redis-server --appendonly yes --maxmemory-policy noeviction
volumes:
redis-data:
```
**Architecture:**
- **tooljet**: Web server that handles HTTP requests and processes jobs (WORKER=true, Port 80)
- **tooljet-worker-1 & tooljet-worker-2**: Dedicated workers that only process workflow jobs (WORKER=true, no ports)
- **redis**: External stateful Redis with persistence for the job queue
**Redis Environment Variables:**
Add these to your **.env** file to connect to the external Redis:
```bash
# Redis - Note: Only REDIS_HOST and REDIS_PORT are required. Authentication and TLS are optional.
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_USER=default
REDIS_PASSWORD=
# REDIS_DB=0 # Optional: Redis database number (default: 0)
# REDIS_TLS=false # Optional: Enable TLS/SSL (set to 'true')
```
**Critical Redis Configuration:**
- **--appendonly yes**: Enables AOF (Append Only File) persistence
- **--maxmemory-policy noeviction**: Required by BullMQ to prevent job loss
</details>
## Upgrading to the Latest LTS Version
New LTS versions are released every 3-5 months with an end-of-life of atleast 18 months. To check the latest LTS version, visit the [ToolJet Docker Hub](https://hub.docker.com/r/tooljet/tooljet/tags) page. The LTS tags follow a naming convention with the prefix `LTS-` followed by the version number, for example `tooljet/tooljet:ee-lts-latest`.
@ -179,4 +292,4 @@ If this is a new installation of the application, you may start directly with th
- Users on versions earlier than **v2.23.0-ee2.10.2** must first upgrade to this version before proceeding to the LTS version.
_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._
_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._

View file

@ -6,13 +6,13 @@ title: AWS ECS
# Deploying ToolJet on Amazon ECS
:::warning
To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` in your network settings.
To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings.
:::
:::info
You should setup a PostgreSQL database manually to be used by ToolJet. We recommend using an **RDS PostgreSQL database**. You can find the system requirements [here](/docs/3.5.0-LTS/setup/system-requirements#postgresql).
ToolJet comes with a **built-in Redis setup**, which is used for multiplayer editing and background jobs. However, for **multi-service setup**, it's recommended to use an **external Redis instance**.
ToolJet runs with **built-in Redis** for multiplayer editing and background jobs. When running **separate worker containers** or **multi-pod setup**, an **external Redis instance** is **required** for job queue coordination.
:::
### ⚙️ Deploy using CloudFormation
@ -37,7 +37,6 @@ If you prefer **(IaC)** with Terraform, ToolJet also provides **ECS deployment s
📂 Repository: [ToolJet Terraform for ECS](https://github.com/ToolJet/ToolJet/tree/develop/terraform/ECS)
## ToolJet
Follow the steps below to deploy ToolJet on a ECS cluster.
@ -45,18 +44,20 @@ Follow the steps below to deploy ToolJet on a ECS cluster.
1. Setup a PostgreSQL database, ToolJet uses a postgres database as the persistent storage for storing data related to users and apps.
2. Create a target group and an application load balancer to route traffic onto ToolJet containers. You can [reference](https://docs.aws.amazon.com/AmazonECS/latest/userguide/create-application-load-balancer.html) AWS docs to set it up. Please note that ToolJet server exposes `/api/health`, which you can configure for health checks.
3. Create task definition for deploying ToolJet app as a service on your preconfigured cluster.
1. Select Fargate as launch type compatibility
2. Configure IAM roles and set operating system family as Linux.
3. Select task size to have 3GB of memory and 1vCpu
<img className="screenshot-full" src="/img/setup/ecs/ecs-4.png" alt="ECS Setup" />
<img className="screenshot-full" src="/img/setup/ecs/ecs-4.png" alt="ECS Setup" />
4. Add container details that is shown: <br/>
Specify your container name ex: `ToolJet` <br/>
Set the image you intend to deploy. ex: `tooljet/tooljet:ee-lts-latest` <br/>
Update port mappings at container port `3000` for tcp protocol.
<img className="screenshot-full" src="/img/setup/ecs/ecs-5.png" alt="ECS Setup" />
<img className="screenshot-full" src="/img/setup/ecs/ecs-5.png" alt="ECS Setup" />
Specify environmental values for the container. You'd want to make use of secrets to store sensitive information or credentials, kindly refer the AWS [docs](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data-secrets.html) to set it up. You can also store the env in S3 bucket, kindly refer the AWS [docs](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/taskdef-envfiles.html) .
<img className="screenshot-full" src="/img/setup/ecs/ecs-6.png" alt="ECS Setup" />
<img className="screenshot-full" src="/img/setup/ecs/ecs-6.png" alt="ECS Setup" />
For the setup, ToolJet requires:
```
TOOLJET_HOST=<Endpoint url>
LOCKBOX_MASTER_KEY=<generate using openssl rand -hex 32>
@ -67,18 +68,23 @@ Follow the steps below to deploy ToolJet on a ECS cluster.
PG_PASS=<password>
PG_DB=tooljet_production # Must be a unique database name (do not reuse across deployments)
```
Also, for setting up additional environment variables in the .env file, please check our documentation on environment variables [here](/docs/setup/env-vars).
#### SSL Configuration for AWS RDS PostgreSQL
:::warning
**Important**: When connecting to PostgreSQL 16.9 on AWS RDS with SSL enabled, you need to configure SSL certificates. The `NODE_EXTRA_CA_CERTS` environment variable is critical for resolving SSL certificate chain issues and for connecting to self-signed HTTPS endpoints.
:::
For AWS RDS PostgreSQL connections, add these environment variables to your container:
```
PGSSLMODE=require
NODE_EXTRA_CA_CERTS=/certs/global-bundle.pem
```
You'll also need to:
1. **Download the AWS RDS global certificate bundle** on your ECS container instances:
```bash
mkdir -p /opt/ssl-certs
@ -89,20 +95,22 @@ Follow the steps below to deploy ToolJet on a ECS cluster.
- **Source path**: `/opt/ssl-certs` (on host)
- **Container path**: `/certs` (in container)
- **Read only**: Yes
5. Make sure `Use log collection checked` and `Docker configuration` with the command `npm run start:prod`
<img className="screenshot-full" src="/img/setup/ecs/ecs-8.png" alt="ECS Setup" />
4. Create a service to run your task definition within your cluster.
- Select the cluster which you have created
- Select launch type as Fargate
<img className="screenshot-full img-m" src="/img/setup/ecs/ecs-9.png" alt="ECS Setup" />
- Select the cluster and set the service name
- You can set the number of tasks to start with as two
- Rest of the values can be kept as default
<img className="screenshot-full img-l" src="/img/setup/ecs/ecs-10.png" alt="ECS Setup" />
- Click on next step to configure networking options
- Select your designated VPC, Subnets and Security groups. Kindly ensure that the security group allows for inbound traffic to http port 3000 for the task.
<img className="screenshot-full img-l" src="/img/setup/ecs/ecs-11.png" alt="ECS Setup" />
- Since migrations are run as a part of container boot, please specify health check grace period for 900 seconds. Select the application loadbalancer option and set the target group name to the one we had created earlier. This will auto populate the health check endpoints.
- Select the cluster which you have created
- Select launch type as Fargate
<img className="screenshot-full img-m" src="/img/setup/ecs/ecs-9.png" alt="ECS Setup" />
- Select the cluster and set the service name
- You can set the number of tasks to start with as two
- Rest of the values can be kept as default
<img className="screenshot-full img-l" src="/img/setup/ecs/ecs-10.png" alt="ECS Setup" />
- Click on next step to configure networking options
- Select your designated VPC, Subnets and Security groups. Kindly ensure that the security group allows for inbound traffic to http port 3000 for the task.
<img className="screenshot-full img-l" src="/img/setup/ecs/ecs-11.png" alt="ECS Setup" />
- Since migrations are run as a part of container boot, please specify health check grace period for 900 seconds. Select the application loadbalancer option and set the target group name to the one we had created earlier. This will auto populate the health check endpoints.
:::info
The setup above is just a template. Feel free to update the task definition and configure parameters for resources and environment variables according to your needs.
@ -165,6 +173,70 @@ PGRST_DB_URI=postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:5432/TOO
- [ToolJet Environment Variables Documentation](https://docs.tooljet.com/docs/setup/env-vars/)
- [Node.js TLS Configuration](https://nodejs.org/api/tls.html)
## Workflows
ToolJet Workflows allows users to design and execute complex, data-centric automations using a visual, node-based interface. This feature enhances ToolJet's functionality beyond building secure internal tools, enabling developers to automate complex business processes.
:::info
For users migrating from Temporal-based workflows, please refer to the [Workflow Migration Guide](./workflow-temporal-to-bullmq-migration).
:::
### Enabling Workflow Scheduling
To activate workflow scheduling, set the following environment variables in your ECS task definition:
```bash
# Worker Mode (required)
# Set to 'true' to enable job processing
# Set to 'false' or unset for HTTP-only mode (scaled deployments)
WORKER=true
# Workflow Processor Concurrency (optional)
# Number of workflow jobs processed concurrently per worker
# Default: 5
TOOLJET_WORKFLOW_CONCURRENCY=5
```
**Environment Variable Details:**
- **WORKER** (required): Enables job processing. Set to `true` to activate workflow scheduling
- **TOOLJET_WORKFLOW_CONCURRENCY** (optional): Controls the number of workflow jobs processed concurrently per worker instance. Default is 5 if not specified
:::warning
**External Redis Requirement**: When running separate worker containers or multiple instances, an external stateful Redis instance is **required** for job queue coordination. The built-in Redis only works when the server and worker are in the same container instance (single instance deployment).
:::
#### Setting Up Redis for Workflows
We recommend using **Amazon ElastiCache for Redis** with the following configuration:
1. **Create an ElastiCache Redis cluster** with these settings:
- Engine version: Redis 7.x
- Node type: cache.t3.medium or higher
- Number of replicas: At least 1 (for high availability)
- Automatic failover: Enabled
2. **Configure Redis settings**:
- **maxmemory-policy**: Must be set to `noeviction` (critical for BullMQ)
- **appendonly**: Set to `yes` for AOF persistence
- **appendfsync**: Set to `everysec`
3. **Add Redis environment variables** to your ECS task definition:
```bash
REDIS_HOST=<your-elasticache-endpoint>
REDIS_PORT=6379
REDIS_PASSWORD=<your-redis-password> # If auth is enabled
```
**Optional Redis Configuration:**
- `REDIS_USERNAME=` - Redis username (ACL)
- `REDIS_DB=0` - Redis database number (default: 0)
- `REDIS_TLS=true` - Enable TLS/SSL for secure connections
:::info
For production deployments, ensure your ElastiCache Redis cluster is in the same VPC as your ECS tasks and configure security groups to allow traffic on port 6379.
:::
## Upgrading to the Latest LTS Version
New LTS versions are released every 3-5 months with an end-of-life of atleast 18 months. To check the latest LTS version, visit the [ToolJet Docker Hub](https://hub.docker.com/r/tooljet/tooljet/tags) page. The LTS tags follow a naming convention with the prefix `LTS-` followed by the version number, for example `tooljet/tooljet:ee-lts-latest`.
@ -177,4 +249,4 @@ If this is a new installation of the application, you may start directly with th
- Users on versions earlier than **v2.23.0-ee2.10.2** must first upgrade to this version before proceeding to the LTS version.
_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._
_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._

View file

@ -11,23 +11,26 @@ ToolJet requires several environment variables to function properly. Below is a
#### ToolJet Host
- `TOOLJET_HOST`: Public URL of ToolJet (e.g., `https://app.tooljet.ai`)
- `TOOLJET_HOST`: Public URL of ToolJet (e.g., `https://app.tooljet.com`)
#### Lockbox Configuration
- `LOCKBOX_MASTER_KEY`: 32-byte hex string for encrypting datasource credentials
- Generate using: `openssl rand -hex 32`
#### Application Secret
- `SECRET_KEY_BASE`: 64-byte hex string for encrypting session cookies
- Generate using: `openssl rand -hex 64`
#### Database Configuration
- `PG_HOST`: PostgreSQL database host
- `PG_DB`: Database name
- `PG_USER`: Username
- `PG_PASS`: Password
- `PG_PORT`: Port
**Docker Compose Setup:** If you are using a Docker Compose setup with an in-built PostgreSQL instance, set `PG_HOST` to `postgres`. This ensures that Docker's internal DNS resolves the hostname correctly, allowing the ToolJet server to connect to the database seamlessly.
**Database Connection URL:** If you intend to use the database connection URL and your database does not support SSL, use the following format when setting the `DATABASE_URL` variable:
@ -39,9 +42,11 @@ DATABASE_URL=postgres://PG_USER:PG_PASS@PG_HOST:5432/PG_DB?sslmode=disable
Replace `username`, `password`, `hostname`, `port`, and `database_name` with your actual database details.
#### Disabling Automatic Database & Extension Creation (Optional)
- `PG_DB_OWNER=false`: ToolJet by default tries to create database based on `PG_DB` variable set and additionally my try to create postgres extensions. This requires the postgres user to have `CREATEDB` permission. If this cannot be granted you can disable this behaviour by setting `PG_DB_OWNER` as `false` and will have to manually run them.
#### ToolJet Database
- `TOOLJET_DB`: Default database name (`tooljet_db`)
- `TOOLJET_DB_HOST`: Database host
- `TOOLJET_DB_USER`: Database username
@ -52,10 +57,10 @@ Replace `username`, `password`, `hostname`, `port`, and `database_name` with you
ToolJet requires two separate databases for optimal functionality. **TOOLJET_DB** is used to store the platform's internal metadata, including tables created within ToolJet. On the other hand, **PG_DB** acts as the primary database for application data, handling end-user data managed by the apps built on ToolJet.
**Automatic Database Creation:** The database name specified in `TOOLJET_DB` will be automatically created during the server boot process in all production deployment setups.
#### PostgREST
ToolJet uses **PostgREST (v12.2.0)** for API access. The following environment variables are required for PostgREST:
- `PGRST_JWT_SECRET`: JWT secret (Generate using `openssl rand -hex 32`). If this parameter is not specified, PostgREST will refuse authentication requests.
@ -84,15 +89,46 @@ Ensure that:
#### Redis Configuration
Include the following Redis environment variables within the ToolJet deployment only if you are connecting to an external **Redis instance (v6.2)** for a multi-service or multi-pod setup and have followed the necessary steps to create Redis.
Include the following Redis environment variables within the ToolJet deployment only if you are connecting to an external **Redis instance (v6.x or higher, v7.x recommended)** for a multi-service or multi-pod setup, or when running workflows with separate worker containers.
**Required Variables:**
```
REDIS_HOST=
REDIS_PORT=
```
**Optional Variables:**
```
REDIS_USER=
REDIS_PASSWORD=
REDIS_DB=0 # Redis database number (default: 0)
REDIS_TLS=false # Enable TLS/SSL connection (set to 'true')
```
:::info
**For Workflows:** When running separate worker containers or multiple instances for workflow scheduling, an external Redis instance is **required** for job queue coordination. The built-in Redis only works for single instance deployments.
:::
#### Workflow Scheduling
ToolJet Workflows allows you to design and execute complex, data-centric automations using a visual, node-based interface. Configure the following environment variables to enable workflow scheduling:
**Required Variables:**
- `WORKER`: Set to `true` to enable job processing for workflow scheduling. Set to `false` or leave unset for HTTP-only mode (default: `false`)
**Optional Variables:**
- `TOOLJET_WORKFLOW_CONCURRENCY`: Number of workflow jobs processed concurrently per worker instance (default: `5`)
:::warning
**External Redis Requirement**: When running separate worker containers or multiple instances, an external stateful Redis instance is **required** for job queue coordination. The built-in Redis only works when the server and worker are in the same container instance (single instance deployment).
:::
For detailed workflow configuration and deployment examples, refer to the [Workflow Migration Guide](./workflow-temporal-to-bullmq-migration).
### Optional Configurations
#### Comments Feature
@ -100,25 +136,29 @@ REDIS_PASSWORD=
- `COMMENT_FEATURE_ENABLE=true/false`: Use this environment variable to enable/disable the feature that allows you to add comments on the canvas. To configure this environment variable, ensure that multiplayer editing is enabled in the Settings.
#### User Session Expiry
- `USER_SESSION_EXPIRY`: Controls session expiry time (in minutes). Default: **10 days**.
Note: The variable expects the value in minutes. ex: USER_SESSION_EXPIRY = 120 which is 2 hours
#### Password Retry Limit
By default, an account is locked after 5 failed login attempts. You can control this with:
- `DISABLE_PASSWORD_RETRY_LIMIT=true`: Disables the retry limit.
By default, an account is locked after 5 failed login attempts. You can control this with:
- `DISABLE_PASSWORD_RETRY_LIMIT=true`: Disables the retry limit.
- `PASSWORD_RETRY_LIMIT=<number>`: Sets a custom retry limit (default is 5).
#### Hide Account Setup Link
- `HIDE_ACCOUNT_SETUP_LINK`: Set to `true` to hide the account setup link from the admin in the manage user page. Ensure SMTP is configured to send welcome emails.
#### Restrict Signups
#### Restrict Signups
Set `DISABLE_SIGNUPS=true` to allow only invited users to sign up. The signup page will still be visible but unusable.
#### SMTP Configuration
ToolJet sends emails via SMTP.
ToolJet sends emails via SMTP.
:::info
If you have upgraded from a version prior to v2.62.0, the SMTP variables in your .env file will automatically be mapped to the UI. For versions v2.62.0 and later, SMTP configuration will no longer be picked up from the .env file for Enterprise Edition. You must configure SMTP through the UI. You can safely remove these variables from your .env file after ensuring that the configuration is properly set up in the UI.
@ -135,13 +175,14 @@ For **Community Edition**, use these environment variables:
- `SMTP_PORT`: SMTP port
#### Custom CA Certificate
If ToolJet needs to connect to self-signed HTTPS endpoints, ensure the `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path of the CA certificate file.
- `NODE_EXTRA_CA_CERTS=/path/to/cert.pem`: Absolute path to the PEM file (can contain multiple certificates).
#### ToolJet API Import Application
By default, server accepts maximum JSON size as 50 MB. To increase this limit, use the following environment variable:
By default, server accepts maximum JSON size as 50 MB. To increase this limit, use the following environment variable:
- `MAX_JSON_SIZE = "150mb"`
@ -158,53 +199,65 @@ You can control workflow execution behavior using the following environment vari
### Third-Party Integrations
#### Slack
To use Slack as a data source in ToolJet, create a Slack app and set:
- `SLACK_CLIENT_ID`: Slack app client ID
- `SLACK_CLIENT_SECRET`: Slack app client secret
#### Google OAuth
To connect ToolJet with Google services like Google Sheets, create OAuth credentials in Google Cloud Console.
- `GOOGLE_CLIENT_ID`: Google OAuth client ID
- `GOOGLE_CLIENT_SECRET`: Google OAuth client secret
#### Google Maps API
To use the Maps widget in ToolJet, create a Google Maps API key and set:
- `GOOGLE_MAPS_API_KEY`: Google Maps API key
#### Application Monitoring (APM)
- `APM_VENDOR=sentry`: Set APM vendor.
- `SENTRY_DNS`: Sentry project DSN.
- `SENTRY_DEBUG=true/false`: Enable/disable Sentry debugging.
#### Security & Authentication
By default, ToolJet sends user count updates every 24 hours. To disable this, use:
- `DISABLE_TOOLJET_TELEMETRY=true`: Disables telemetry.(Enabled by default)
#### Single Sign-On (SSO)
Enable Google or GitHub SSO with these environment variables:
**Google SSO:**
- `SSO_GOOGLE_OAUTH2_CLIENT_ID`: Google OAuth client ID
**GitHub SSO:**
- `SSO_GIT_OAUTH2_CLIENT_ID`: GitHub OAuth client ID
- `SSO_GIT_OAUTH2_CLIENT_SECRET`: GitHub OAuth client secret
- `SSO_GIT_OAUTH2_HOST`: GitHub host if self-hosted
**General SSO Settings:**
- `SSO_ACCEPTED_DOMAINS`: Comma-separated list of allowed email domains
- `SSO_DISABLE_SIGNUPS=true`: Restricts signups to existing users
#### Group Synchronization
If any of the following environment variables are set to true, group synchronization will be skipped during the login process for the respective SSO provider:
- `DISABLE_LDAP_GROUP_SYNC=true` Disables group sync for LDAP during login.
- `DISABLE_SAML_GROUP_SYNC=true` Disables group sync for SAML during login.
#### REST API Cookie Forwarding
By default, ToolJet does not forward cookies with REST API requests. To enable this (self-hosted only), set:
- `FORWARD_RESTAPI_COOKIES=true`: Allows forwarding cookies with REST API requests.
@ -213,14 +266,16 @@ By default, ToolJet does not forward cookies with REST API requests. To enable t
This is required when the assets for the client are to be loaded from elsewhere (eg: CDN). This can be an absolute path, or relative to main HTML file.
- `ASSET_PATH`: Path for loading frontend assets (e.g., `https://app.tooljet.ai/`)
- `ASSET_PATH`: Path for loading frontend assets (e.g., `https://app.tooljet.com/`)
## Additional Configurations
#### Log File Path
- `LOG_FILE_PATH`: Path to store audit logs (e.g., `tooljet/log/tooljet-audit.log`)
#### Embedding Private Apps
By default, only public apps can be embedded. To allow embedding of private ToolJet apps, set:
- `ENABLE_PRIVATE_APP_EMBED=true/false`: Allows embedding of private ToolJet apps.
@ -228,19 +283,19 @@ By default, only public apps can be embedded. To allow embedding of private Tool
**Note: Available in ToolJet Enterprise 2.8.0+ and Community/Cloud 2.10.0+.**
#### Default Language
Set the default language using the `LANGUAGE` variable. Supported options:
Set the default language using the `LANGUAGE` variable. Supported options:
<div style={{ display: 'flex' }} >
<div style = {{ width:'40%' }} >
| Language | Code | Native Name |
|-------------|------|-------------------|
| English | en | English |
| French | fr | Français |
| Spanish | es | Español |
| Italian | it | Italiano |
| Language | Code | Native Name |
| -------- | ---- | ----------- |
| English | en | English |
| French | fr | Français |
| Spanish | es | Español |
| Italian | it | Italiano |
</div>
@ -248,12 +303,12 @@ Set the default language using the `LANGUAGE` variable. Supported options:
<div style = {{ width:'50%' }} >
| Language | Code | Native Name |
|-------------|------|-------------------|
| Indonesian | id | Bahasa Indonesia |
| Ukrainian | uk | Українська |
| Russian | ru | Русский |
| German | de | Deutsch |
| Language | Code | Native Name |
| ---------- | ---- | ---------------- |
| Indonesian | id | Bahasa Indonesia |
| Ukrainian | uk | Українська |
| Russian | ru | Русский |
| German | de | Deutsch |
</div>
@ -261,4 +316,29 @@ Set the default language using the `LANGUAGE` variable. Supported options:
Example: `LANGUAGE=fr` (for French).
**Note:** This setting is not available in ToolJet Cloud.
**Note:** This setting is not available in ToolJet Cloud.
#### Observability
ToolJet supports OpenTelemetry (OTEL) for comprehensive observability and monitoring. Enable metrics collection to monitor application performance, query executions, and system health.
**Basic Configuration:**
- `ENABLE_OTEL`: Set to `true` to enable OpenTelemetry metrics collection (default: `false`)
- `OTEL_EXPORTER_OTLP_TRACES`: OTLP traces endpoint URL (default: `http://localhost:4318/v1/traces`)
- `OTEL_EXPORTER_OTLP_METRICS`: OTLP metrics endpoint URL (default: `http://localhost:4318/v1/metrics`)
- `OTEL_SERVICE_NAME`: Service identifier for metrics (default: `tooljet`)
- `OTEL_EXPORTER_OTLP_HEADERS`: Authentication headers for OTLP endpoint (optional, format: `key1=value1,key2=value2`)
**Advanced Configuration:**
- `OTEL_LOG_LEVEL`: Debug logging level for OTEL (use `debug` for detailed logs)
- `OTEL_ACTIVE_USER_WINDOW_MINUTES`: Activity window for concurrent user tracking in minutes (default: `5`)
- `OTEL_MAX_TRACKED_USERS`: Maximum number of tracked users/sessions (default: `10000`)
- `OTEL_INCLUDE_QUERY_TEXT`: Include actual query text in metrics - **WARNING:** Creates high cardinality (default: `false`)
:::warning High Cardinality
Only enable `OTEL_INCLUDE_QUERY_TEXT=true` for debugging. This creates high cardinality metrics that can impact Prometheus performance. Use an OTEL Collector to filter this label in production.
:::
For comprehensive setup instructions, metrics details, and Grafana dashboard integration, see the [OpenTelemetry Observability](/docs/setup/observability-otel) documentation.

View file

@ -6,13 +6,13 @@ title: Google Cloud Run
# Deploying ToolJet on Google Cloud Run
:::warning
To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` in your network settings.
To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings.
:::
:::info
You should manually set up a **PostgreSQL database** to be used by ToolJet. We recommend using **Cloud SQL** for this purpose.
ToolJet comes with a **built-in Redis setup**, which is used for multiplayer editing and background jobs. However, for **multi-service setup**, it's recommended to use an **external Redis instance**.
ToolJet runs with **built-in Redis** for multiplayer editing and background jobs. When running **separate worker containers** or **multi-pod setup**, an **external Redis instance** is **required** for job queue coordination.
:::
<!-- Follow the steps below to deploy ToolJet on Cloud run with `gcloud` CLI. -->
@ -28,28 +28,30 @@ ToolJet comes with a **built-in Redis setup**, which is used for multiplayer edi
| **Cloud SQL** | `PG_DB` | Database used to store application data |
1. **Create a new Google Cloud Run Service:**
<img className="screenshot-full img-m" style={{ marginTop: '15px' }} src="/img/cloud-run/google-cloud-run-setup-V3.png" alt="Google Cloud Run New Setup" />
<img className="screenshot-full img-m" style={{ marginTop: '15px' }} src="/img/cloud-run/google-cloud-run-setup-V3.png" alt="Google Cloud Run New Setup" />
2. **Ingress and Authentication can be set as shown below, to begin with. Feel free to change the security configurations as per your requirements.**
<img className="screenshot-full img-l" style={{ marginTop: '15px' }} src="/img/cloud-run/ingress-auth-V3.png" alt="ingress-auth" />
<img className="screenshot-full img-l" style={{ marginTop: '15px' }} src="/img/cloud-run/ingress-auth-V3.png" alt="ingress-auth" />
3. **Under the containers tab, please make sure the port is set to 3000 and command `npm, run, start:prod` is entered in container argument field with CPU capacity set to 2GiB:**
<img className="screenshot-full img-m" style={{ marginTop: '15px' }} src="/img/cloud-run/port-and-capacity-postgrest-v2.png" alt="port-and-capacity-tooljet" />
- If the above command is not compatible, please use the following command structure instead: <br/>
<img className="screenshot-full img-m" style={{ marginTop: '15px' }} src="/img/cloud-run/port-and-capacity-postgrest-alternative-command.png" alt="port-and-capacity-tooljet-alternative-command" />
- If you encounter any migration issues, please execute the following command. Be aware that executing this command may cause the revision to break. However, modifying the command back to `npm, run, start:prod` will successfully reboot the instance:
<img className="screenshot-full img-m" style={{ marginTop: '15px' }} src="/img/cloud-run/port-and-capacity-postgrest-migration-fix-command.png" alt="port-and-capacity-tooljet-migration-fix-command" />
<img className="screenshot-full img-m" style={{ marginTop: '15px' }} src="/img/cloud-run/port-and-capacity-postgrest-v2.png" alt="port-and-capacity-tooljet" />
- If the above command is not compatible, please use the following command structure instead: <br/>
<img className="screenshot-full img-m" style={{ marginTop: '15px' }} src="/img/cloud-run/port-and-capacity-postgrest-alternative-command.png" alt="port-and-capacity-tooljet-alternative-command" />
- If you encounter any migration issues, please execute the following command. Be aware that executing this command may cause the revision to break. However, modifying the command back to `npm, run, start:prod` will successfully reboot the instance:
<img className="screenshot-full img-m" style={{ marginTop: '15px' }} src="/img/cloud-run/port-and-capacity-postgrest-migration-fix-command.png" alt="port-and-capacity-tooljet-migration-fix-command" />
4. **Under environmental variables, please add the below ToolJet application variables:** <br/>
You can use these variables for: tooljet-app:
```env
TOOLJET_HOST=<Endpoint url>
LOCKBOX_MASTER_KEY=<generate using openssl rand -hex 32>
SECRET_KEY_BASE=<generate using openssl rand -hex 64>
You can use these variables for: tooljet-app:
PG_USER=<username>
PG_HOST=<postgresql-instance-ip>
PG_PASS=<password>
PG_DB=tooljet_production # Must be a unique database name (do not reuse across deployments)
```
Update `TOOLJET_HOST` environment variable if you want to use the default url assigned with Cloud run after the initial deploy.
```env
TOOLJET_HOST=<Endpoint url>
LOCKBOX_MASTER_KEY=<generate using openssl rand -hex 32>
SECRET_KEY_BASE=<generate using openssl rand -hex 64>
PG_USER=<username>
PG_HOST=<postgresql-instance-ip>
PG_PASS=<password>
PG_DB=tooljet_production # Must be a unique database name (do not reuse across deployments)
```
Update `TOOLJET_HOST` environment variable if you want to use the default url assigned with Cloud run after the initial deploy.
## ToolJet Database
@ -109,42 +111,49 @@ If you are using [Public IP](https://cloud.google.com/sql/docs/postgres/connect-
:::
5. **Please go to the connection tab. Under the Cloud SQL instance please select the PostgreSQL database which you have set-up.**
<img className="screenshot-full img-m" style={{ marginTop: '15px' }} src="/img/cloud-run/cloud-SQL-tooljet.png" alt="cloud-SQL-tooljet" /> <br/>
Click on deploy once the above parameters are set.
:::info
Once the Service is created and live, to make the Cloud Service URL public. Please follow the steps [**here**](https://cloud.google.com/run/docs/securing/managing-access) to make the service public.
:::
<img className="screenshot-full img-m" style={{ marginTop: '15px' }} src="/img/cloud-run/cloud-SQL-tooljet.png" alt="cloud-SQL-tooljet" /> <br/>
Click on deploy once the above parameters are set.
:::info
Once the Service is created and live, to make the Cloud Service URL public. Please follow the steps [**here**](https://cloud.google.com/run/docs/securing/managing-access) to make the service public.
:::
## Workflows
ToolJet Workflows allows users to design and execute complex, data-centric automations using a visual, node-based interface. This feature enhances ToolJet's functionality beyond building secure internal tools, enabling developers to automate complex business processes.
:::info
For users migrating from Temporal-based workflows, please refer to the [Workflow Migration Guide](./workflow-temporal-to-bullmq-migration).
:::
### Enabling Workflow Scheduling
Please deploy the below containers to enable workflows scheduling.
#### Worker container:
You can use the same `tooljet/tooljet:ee-lts-latest` image tag and ensure it has env variables from the tooljet-app container.
To activate workflow scheduling, set the following environment variables:
```bash
WORKFLOW_WORKER=true
ENABLE_WORKFLOW_SCHEDULING=true
TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE=default
TEMPORAL_SERVER_ADDRESS=<Temporal_Server_Address>
# Worker Mode (required)
# Set to 'true' to enable job processing
# Set to 'false' or unset for HTTP-only mode (scaled deployments)
WORKER=true
# Workflow Processor Concurrency (optional)
# Number of workflow jobs processed concurrently per worker
# Default: 5
TOOLJET_WORKFLOW_CONCURRENCY=5
```
Under the containers tab, please make sure the command `npm, run, worker:prod` is set.
<img className="screenshot-full img-m" src="/img/cloud-run/tooljet-worker-settings.png" alt="ToolJet Worker Settings" />
**Environment Variable Details:**
- **WORKER** (required): Enables job processing. Set to `true` to activate workflow scheduling
- **TOOLJET_WORKFLOW_CONCURRENCY** (optional): Controls the number of workflow jobs processed concurrently per worker instance. Default is 5 if not specified
#### Temporal server container:
1. Set the image tag as `temporalio/auto-setup:1.25.1`
<img className="screenshot-full img-l" style={{ marginTop: '15px' }} src="/img/cloud-run/temporal-settings.png" alt="Temporal Settings" />
2. Add the below env variables to the temporal container:
<img className="screenshot-full img-m" style={{ marginTop: '15px' }} src="/img/cloud-run/temporal-variables-and-secrets.png" alt="Temporal Variables and Secrets" />
:::warning
**External Redis Requirement**: When running separate worker containers or multiple instances, an external stateful Redis instance is **required** for job queue coordination. The built-in Redis only works when the server and worker are in the same container instance (single instance deployment). Configure the Redis connection using the following environment variables:
- `REDIS_HOST=localhost` - Default: localhost
- `REDIS_PORT=6379` - Default: 6379
- `REDIS_USERNAME=` - Optional: Redis username (ACL)
- `REDIS_PASSWORD=` - Optional: Redis password
- `REDIS_DB=0` - Optional: Redis database number (default: 0)
- `REDIS_TLS=false` - Optional: Enable TLS/SSL (set to 'true')
:::
## Upgrading to the Latest LTS Version
@ -158,4 +167,4 @@ If this is a new installation of the application, you may start directly with th
- Users on versions earlier than **v2.23.0-ee2.10.2** must first upgrade to this version before proceeding to the LTS version.
_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._
_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._

View file

@ -26,7 +26,7 @@ helm install tooljet tooljet/tooljet
Remember to replace the variables with your specific configuration values.
:::warning
To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` in your network settings.
To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings.
:::
## ToolJet Database
@ -74,6 +74,135 @@ redis:
REDIS_PASSWORD=<external_redis_password>
```
## Workflows
ToolJet Workflows allows users to design and execute complex, data-centric automations using a visual, node-based interface. This feature enhances ToolJet's functionality beyond building secure internal tools, enabling developers to automate complex business processes.
:::info
For users migrating from Temporal-based workflows, please refer to the [Workflow Migration Guide](/docs/setup/workflow-temporal-to-bullmq-migration).
:::
### Enabling Workflow Scheduling
To enable workflow scheduling in your Helm deployment, you need to configure the following environment variables:
| Variable | Description | Default |
|----------|-------------|---------|
| **WORKER** | Enable job processing for workflows. Set to `true` to process workflow jobs | `true` |
| **TOOLJET_WORKFLOW_CONCURRENCY** | Maximum number of concurrent workflows that can be executed | `10` |
:::warning
**External Redis for Multiple Workflow Workers**: When running multiple workers for workflows, an external stateful Redis instance is recommended for better performance and reliability. The built-in Redis is suitable for single-worker workflow setups.
:::
### Configuring Multiple Workers with External Redis
<details id="tj-dropdown">
<summary>Helm values.yaml Configuration for Multiple Workers</summary>
The ToolJet Helm chart includes a dedicated worker deployment template (**worker.yml**) that can be used to run multiple workflow workers. Here's how to configure it:
**Step 1: Enable Redis in values.yaml**
```yaml
redis:
enabled: true # Enable Redis for multiple workers
architecture: standalone
fullnameOverride: redis
auth:
enabled: true
password: "your-secure-password"
master:
service:
port: 6379
persistence:
enabled: true
size: 8Gi
```
**Step 2: Configure Redis Connection**
```yaml
redis_pod:
REDIS_HOST: "redis-master" # Redis service name
REDIS_PORT: "6379"
REDIS_USER: "default"
```
**Step 3: Add Workflow Environment Variables**
Add these to the `env:` section in values.yaml:
```yaml
env:
TOOLJET_HOST: "https://your-tooljet-domain.com"
DEPLOYMENT_PLATFORM: "k8s:helm"
TOOLJET_WORKFLOW_CONCURRENCY: "10"
# ... other environment variables
```
**Step 4: Configure Worker Settings**
```yaml
workflow_env:
WORKER: "true" # Already set by default
apps:
tooljet:
replicaCount: 1 # Main application server
```
**Step 5: Install or Upgrade with Helm**
```bash
helm upgrade --install tooljet tooljet/tooljet -f values.yaml
```
### Architecture
The Helm chart deploys:
- **Main ToolJet deployment** (`deployment.yaml`): Web server with `WORKER=true`, handles HTTP requests and processes workflow jobs
- **Worker deployment** (`worker.yml`): Additional dedicated workers with `WORKER=true`, scale independently for more processing capacity
- **External Redis**: Stateful service for job queue and persistence
### Redis Configuration Requirements
**Critical**: Redis must be configured with:
- **AOF (Append Only File)** persistence enabled
- **maxmemory-policy** set to `noeviction`
To configure these settings, you can use Redis configuration:
```yaml
redis:
enabled: true
master:
persistence:
enabled: true
extraFlags:
- --appendonly yes
- --maxmemory-policy noeviction
```
### Redis Environment Variables (Optional)
If you need to configure additional Redis settings, you can add these to the `env:` section:
```yaml
env:
REDIS_HOST: "redis-master" # Default: redis-master
REDIS_PORT: "6379" # Default: 6379
REDIS_USERNAME: "" # Optional: Redis username (ACL)
REDIS_PASSWORD: "" # Optional: Set via secret
REDIS_DB: "0" # Optional: Redis database number
REDIS_TLS: "false" # Optional: Enable TLS/SSL
```
**Note:** Only `REDIS_HOST` and `REDIS_PORT` are required. Authentication and TLS are optional based on your Redis setup.
</details>
## Upgrading to the Latest LTS Version
New LTS versions are released every 3-5 months with an end-of-life of atleast 18 months. To check the latest LTS version, visit the [ToolJet Docker Hub](https://hub.docker.com/r/tooljet/tooljet/tags) page. The LTS tags follow a naming convention with the prefix `LTS-` followed by the version number, for example `tooljet/tooljet:ee-lts-latest`.
@ -86,4 +215,4 @@ If this is a new installation of the application, you may start directly with th
- Users on versions earlier than **v2.23.0-ee2.10.2** must first upgrade to this version before proceeding to the LTS version.
_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._
_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._

View file

@ -9,7 +9,7 @@ The server will connect to the internet via the configured HTTP proxy when the b
| :----------------- | :------------------------------------ |
| TOOLJET_HTTP_PROXY | Used for both HTTP and HTTPS requests |
_If you have any questions, feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._
_If you have any questions, feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._
<div style={{paddingTop:'24px', paddingBottom:'24px'}}>

View file

@ -6,23 +6,26 @@ title: Kubernetes (AKS)
# Deploying ToolJet on Kubernetes (AKS)
:::warning
To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` in your network settings.
To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings.
:::
:::info
You should setup a PostgreSQL database manually to be used by ToolJet. We recommend using **Azure Database for PostgreSQL** since this guide is for deploying using AKS. You can find the system requirements [here](/docs/3.5.0-LTS/setup/system-requirements#postgresql).
ToolJet comes with a **built-in Redis setup**, which is used for multiplayer editing and background jobs. However, for **multi-pod setup**, it's recommended to use an **external Redis instance**.
ToolJet runs with **built-in Redis** for multiplayer editing and background jobs. When running **separate worker containers** or **multi-pod setup**, an **external Redis instance** is **required** for job queue coordination.
:::
Follow the steps below to deploy ToolJet on a AKS Kubernetes cluster.
1. Create an AKS cluster and connect to it to start with the deployment. You can follow the steps as mentioned on the [Azure's documentation](https://docs.microsoft.com/en-us/azure/aks/kubernetes-walkthrough-portal).
2. Create k8s deployment
```bash
curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/AKS/deployment.yaml
```
For the setup, ToolJet requires:
```
TOOLJET_HOST=<Endpoint url>
LOCKBOX_MASTER_KEY=<generate using openssl rand -hex 32>
@ -33,10 +36,12 @@ Follow the steps below to deploy ToolJet on a AKS Kubernetes cluster.
PG_PASS=<password>
PG_DB=tooljet_production # Must be a unique database name (do not reuse across deployments)
```
Make sure to edit the environment variables in the `deployment.yaml`. You can check out the available options [here](/docs/setup/env-vars).
:::info
If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. You can make use of kubernetes secrets to mount the certificate file onto the containers.
:::
3. Create k8s service and reserve a static IP and expose it via a service load balancer as mentioned in the [doc](https://docs.microsoft.com/en-us/azure/aks/static-ip). You can refer `service.yaml`.
```bash
curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/AKS/service.yaml
@ -103,19 +108,85 @@ PGRST_DB_URI=postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:5432/TOO
ToolJet Workflows allows users to design and execute complex, data-centric automations using a visual, node-based interface. This feature enhances ToolJet's functionality beyond building secure internal tools, enabling developers to automate complex business processes.
:::info
For users migrating from Temporal-based workflows, please refer to the [Workflow Migration Guide](./workflow-temporal-to-bullmq-migration).
:::
### Enabling Workflow Scheduling
Create workflow deployment:
To activate workflow scheduling, set the following environment variables in your ToolJet deployment:
```bash
kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/workflow-deployment.yaml
# Worker Mode (required)
# Set to 'true' to enable job processing
# Set to 'false' or unset for HTTP-only mode (scaled deployments)
WORKER=true
# Workflow Processor Concurrency (optional)
# Number of workflow jobs processed concurrently per worker
# Default: 5
TOOLJET_WORKFLOW_CONCURRENCY=5
```
**Note:** Ensure that the worker deployment uses the same image as the ToolJet application deployment to maintain compatibility. Additionally, the variables below need to be a part of tooljet-deployment.
**Environment Variable Details:**
- **WORKER** (required): Enables job processing. Set to `true` to activate workflow scheduling
- **TOOLJET_WORKFLOW_CONCURRENCY** (optional): Controls the number of workflow jobs processed concurrently per worker instance. Default is 5 if not specified
`ENABLE_WORKFLOW_SCHEDULING=true`
`TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE=default`
`TEMPORAL_SERVER_ADDRESS=<Temporal_Server_Address>`
:::warning
**External Redis Requirement**: When running separate worker containers or multiple instances, an external stateful Redis instance is **required** for job queue coordination. The built-in Redis only works when the server and worker are in the same container instance (single instance deployment).
:::
#### Deploying Redis for Workflows
Deploy a stateful Redis instance using the following example configuration:
```bash
kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/redis-stateful.yaml
```
<details id="tj-dropdown">
<summary>Built-in Redis vs External Redis</summary>
ToolJet images include a built-in Redis instance for development. When deploying workflows in production, you must update your deployment configuration to use the external stateful Redis:
Change **REDIS_HOST** from **localhost** to **redis-service** in your deployment YAML:
```yaml
- name: REDIS_HOST
value: redis-service # Changed from localhost
- name: REDIS_PORT
value: "6379"
```
</details>
This example deployment creates:
- A StatefulSet with persistent storage for Redis
- A headless Service for stable network identity
- ConfigMap with production-ready Redis configuration
- A Secret for optional password authentication
:::info
This is an example configuration that you can customize to your needs. However, **AOF (Append Only File) persistence** and **`maxmemory-policy noeviction`** are critical settings that must be maintained for BullMQ job queue reliability.
:::
After deploying Redis, configure ToolJet to connect to it using these environment variables in your deployment:
```bash
REDIS_HOST=redis-service.default.svc.cluster.local
REDIS_PORT=6379
REDIS_PASSWORD=your-secure-redis-password-here # Match the password in redis-secret
```
**Optional Redis Configuration:**
- `REDIS_USERNAME=` - Redis username (ACL)
- `REDIS_DB=0` - Redis database number (default: 0)
- `REDIS_TLS=false` - Enable TLS/SSL (set to 'true')
**Note:** Update the `redis-secret` in the Redis deployment YAML with a secure password before deploying to production.
**Note:** Ensure that these environment variables are added to your Kubernetes deployment configuration (e.g., in your deployment.yaml file or Kubernetes secret).
## Upgrading to the Latest LTS Version
@ -129,4 +200,4 @@ If this is a new installation of the application, you may start directly with th
- Users on versions earlier than **v2.23.0-ee2.10.2** must first upgrade to this version before proceeding to the LTS version.
_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._
_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._

View file

@ -6,72 +6,78 @@ title: Kubernetes (EKS)
Follow the steps below to deploy ToolJet on an EKS Kubernetes cluster.
:::warning
To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` in your network settings.
To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings.
:::
:::info
You should set up a PostgreSQL database manually to be used by ToolJet. We recommend using an **RDS PostgreSQL database**. You can find the system requirements [here](/docs/3.5.0-LTS/setup/system-requirements#postgresql).
ToolJet comes with a **built-in Redis setup**, which is used for multiplayer editing and background jobs. However, for **multi-pod setup**, it's recommended to use an **external Redis instance**.
ToolJet runs with **built-in Redis** for multiplayer editing and background jobs. When running **separate worker containers** or **multi-pod setup**, an **external Redis instance** is **required** for job queue coordination.
:::
1. Create an EKS cluster and connect to it to start with the deployment. You can follow the steps as mentioned in the [AWS documentation](https://docs.aws.amazon.com/eks/latest/userguide/create-cluster.html).
2. Create a k8s Deployment: <br/>
The file below is just a template and might not suit production environments. You should download the file and configure parameters such as the replica count and environment variables according to your needs.
```
kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/deployment.yaml
```
Make sure to edit the environment variables in the `deployment.yaml`. We advise using secrets to set up sensitive information. You can check out the available options [here](/docs/setup/env-vars). <br/>
For the setup, ToolJet requires:
```
TOOLJET_HOST=<Endpoint url>
LOCKBOX_MASTER_KEY=<generate using openssl rand -hex 32>
SECRET_KEY_BASE=<generate using openssl rand -hex 64>
The file below is just a template and might not suit production environments. You should download the file and configure parameters such as the replica count and environment variables according to your needs.
PG_USER=<username>
PG_HOST=<postgresql-database-host>
PG_PASS=<password>
PG_DB=tooljet_production # Must be a unique database name (do not reuse across deployments)
```
Make sure to edit the environment variables in the `deployment.yaml`. You can check out the available options [here](/docs/setup/env-vars).
```
kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/deployment.yaml
```
#### SSL Configuration for AWS RDS PostgreSQL
Make sure to edit the environment variables in the `deployment.yaml`. We advise using secrets to set up sensitive information. You can check out the available options [here](/docs/setup/env-vars). <br/>
For the setup, ToolJet requires:
:::warning
**Important**: When connecting to PostgreSQL 16.9 on AWS RDS with SSL enabled, you need to configure SSL certificates. The `NODE_EXTRA_CA_CERTS` environment variable is critical for resolving SSL certificate chain issues and for connecting to self-signed HTTPS endpoints.
:::
```
TOOLJET_HOST=<Endpoint url>
LOCKBOX_MASTER_KEY=<generate using openssl rand -hex 32>
SECRET_KEY_BASE=<generate using openssl rand -hex 64>
For AWS RDS PostgreSQL connections, create a ConfigMap with the certificate:
```bash
# Download the AWS RDS global certificate bundle
curl -O https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem
PG_USER=<username>
PG_HOST=<postgresql-database-host>
PG_PASS=<password>
PG_DB=tooljet_production # Must be a unique database name (do not reuse across deployments)
```
# Create a ConfigMap with the certificate
kubectl create configmap aws-rds-certs --from-file=global-bundle.pem
```
Make sure to edit the environment variables in the `deployment.yaml`. You can check out the available options [here](/docs/setup/env-vars).
Then update your deployment YAML to include:
```yaml
# Add these environment variables
env:
- name: PGSSLMODE
value: "require"
- name: NODE_EXTRA_CA_CERTS
value: "/certs/global-bundle.pem"
#### SSL Configuration for AWS RDS PostgreSQL
# Add volume mount
volumeMounts:
- name: ssl-certs
mountPath: /certs
readOnly: true
:::warning
**Important**: When connecting to PostgreSQL 16.9 on AWS RDS with SSL enabled, you need to configure SSL certificates. The `NODE_EXTRA_CA_CERTS` environment variable is critical for resolving SSL certificate chain issues and for connecting to self-signed HTTPS endpoints.
:::
# Add volume
volumes:
- name: ssl-certs
configMap:
name: aws-rds-certs
```
For AWS RDS PostgreSQL connections, create a ConfigMap with the certificate:
```bash
# Download the AWS RDS global certificate bundle
curl -O https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem
# Create a ConfigMap with the certificate
kubectl create configmap aws-rds-certs --from-file=global-bundle.pem
```
Then update your deployment YAML to include:
```yaml
# Add these environment variables
env:
- name: PGSSLMODE
value: "require"
- name: NODE_EXTRA_CA_CERTS
value: "/certs/global-bundle.pem"
# Add volume mount
volumeMounts:
- name: ssl-certs
mountPath: /certs
readOnly: true
# Add volume
volumes:
- name: ssl-certs
configMap:
name: aws-rds-certs
```
3. Create a Kubernetes service to publish the Kubernetes deployment that you have created. We have a [template](https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/service.yaml) for exposing the ToolJet server as a service using an AWS Load Balancer.
@ -140,19 +146,85 @@ PGRST_DB_URI=postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:5432/TOO
ToolJet Workflows allows users to design and execute complex, data-centric automations using a visual, node-based interface. This feature enhances ToolJet's functionality beyond building secure internal tools, enabling developers to automate complex business processes.
:::info
For users migrating from Temporal-based workflows, please refer to the [Workflow Migration Guide](./workflow-temporal-to-bullmq-migration).
:::
### Enabling Workflow Scheduling
Create workflow deployment:
To activate workflow scheduling, set the following environment variables in your ToolJet deployment:
```bash
kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/workflow-deployment.yaml
# Worker Mode (required)
# Set to 'true' to enable job processing
# Set to 'false' or unset for HTTP-only mode (scaled deployments)
WORKER=true
# Workflow Processor Concurrency (optional)
# Number of workflow jobs processed concurrently per worker
# Default: 5
TOOLJET_WORKFLOW_CONCURRENCY=5
```
**Note:** Ensure that the worker deployment uses the same image as the ToolJet application deployment to maintain compatibility. Additionally, the variables below need to be a part of tooljet-deployment.
**Environment Variable Details:**
- **WORKER** (required): Enables job processing. Set to `true` to activate workflow scheduling
- **TOOLJET_WORKFLOW_CONCURRENCY** (optional): Controls the number of workflow jobs processed concurrently per worker instance. Default is 5 if not specified
`ENABLE_WORKFLOW_SCHEDULING=true`
`TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE=default`
`TEMPORAL_SERVER_ADDRESS=<Temporal_Server_Address>`
:::warning
**External Redis Requirement**: When running separate worker containers or multiple instances, an external stateful Redis instance is **required** for job queue coordination. The built-in Redis only works when the server and worker are in the same container instance (single instance deployment).
:::
#### Deploying Redis for Workflows
Deploy a stateful Redis instance using the following example configuration:
```bash
kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/redis-stateful.yaml
```
<details id="tj-dropdown">
<summary>Built-in Redis vs External Redis</summary>
ToolJet images include a built-in Redis instance for development. When deploying workflows in production, you must update your deployment configuration to use the external stateful Redis:
Change **REDIS_HOST** from **localhost** to **redis-service** in your deployment YAML:
```yaml
- name: REDIS_HOST
value: redis-service # Changed from localhost
- name: REDIS_PORT
value: "6379"
```
</details>
This example deployment creates:
- A StatefulSet with persistent storage for Redis
- A headless Service for stable network identity
- ConfigMap with production-ready Redis configuration
- A Secret for optional password authentication
:::info
This is an example configuration that you can customize to your needs. However, **AOF (Append Only File) persistence** and **`maxmemory-policy noeviction`** are critical settings that must be maintained for BullMQ job queue reliability.
:::
After deploying Redis, configure ToolJet to connect to it using these environment variables in your deployment:
```bash
REDIS_HOST=redis-service.default.svc.cluster.local
REDIS_PORT=6379
REDIS_PASSWORD=your-secure-redis-password-here # Match the password in redis-secret
```
**Optional Redis Configuration:**
- `REDIS_USERNAME=` - Redis username (ACL)
- `REDIS_DB=0` - Redis database number (default: 0)
- `REDIS_TLS=false` - Enable TLS/SSL (set to 'true')
**Note:** Update the `redis-secret` in the Redis deployment YAML with a secure password before deploying to production.
**Note:** Ensure that these environment variables are added to your Kubernetes deployment configuration (e.g., in your deployment.yaml file or Kubernetes secret).
## Upgrading to the Latest LTS Version
@ -166,4 +238,4 @@ If this is a new installation of the application, you may start directly with th
- Users on versions earlier than **v2.23.0-ee2.10.2** must first upgrade to this version before proceeding to the LTS version.
_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._
_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._

View file

@ -6,58 +6,63 @@ title: Kubernetes (GKE)
# Deploying ToolJet on Kubernetes (GKE)
:::warning
To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` in your network settings.
To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings.
:::
:::info
You should setup a **PostgreSQL database** manually to be used by ToolJet. You can find the system requirements [here](/docs/3.5.0-LTS/setup/system-requirements#postgresql).
ToolJet comes with a **built-in Redis setup**, which is used for multiplayer editing and background jobs. However, for **multi-pod setup**, it's recommended to use an **external Redis instance**.
ToolJet runs with **built-in Redis** for multiplayer editing and background jobs. When running **separate worker containers** or **multi-pod setup**, an **external Redis instance** is **required** for job queue coordination.
:::
Follow the steps below to deploy ToolJet on a GKE Kubernetes cluster.
1. Create an SSL certificate.
```bash
curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/GKE/certificate.yaml
```
Change the domain name to the domain/subdomain that you wish to use for ToolJet installation.
```bash
curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/GKE/certificate.yaml
```
Change the domain name to the domain/subdomain that you wish to use for ToolJet installation.
2. Reserve a static IP address using `gcloud` cli
```bash
gcloud compute addresses create tj-static-ip --global
```
```bash
gcloud compute addresses create tj-static-ip --global
```
3. Create k8s deployment
```bash
curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/GKE/deployment.yaml
```
For the setup, ToolJet requires:
```
TOOLJET_HOST=<Endpoint url>
LOCKBOX_MASTER_KEY=<generate using openssl rand -hex 32>
SECRET_KEY_BASE=<generate using openssl rand -hex 64>
PG_USER=<username>
PG_HOST=<postgresql-database-host>
PG_PASS=<password>
PG_DB=tooljet_production # Must be a unique database name (do not reuse across deployments)
```
Make sure to edit the environment variables in the `deployment.yaml`. You can check out the available options [here](/docs/setup/env-vars).
:::info
If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. You can make use of kubernetes secrets to mount the certificate file onto the containers.
:::
```bash
curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/GKE/deployment.yaml
```
For the setup, ToolJet requires:
```
TOOLJET_HOST=<Endpoint url>
LOCKBOX_MASTER_KEY=<generate using openssl rand -hex 32>
SECRET_KEY_BASE=<generate using openssl rand -hex 64>
PG_USER=<username>
PG_HOST=<postgresql-database-host>
PG_PASS=<password>
PG_DB=tooljet_production # Must be a unique database name (do not reuse across deployments)
```
Make sure to edit the environment variables in the `deployment.yaml`. You can check out the available options [here](/docs/setup/env-vars).
:::info
If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. You can make use of kubernetes secrets to mount the certificate file onto the containers.
:::
4. Create k8s service
```bash
curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/GKE/service.yaml
```
```bash
curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/GKE/service.yaml
```
5. Create k8s ingress
```bash
curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/GKE/ingress.yaml
```
Change the domain name to the domain/subdomain that you wish to use for ToolJet installation.
```bash
curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/GKE/ingress.yaml
```
Change the domain name to the domain/subdomain that you wish to use for ToolJet installation.
6. Apply YAML configs
```bash
kubectl apply -f certificate.yaml, deployment.yaml, service.yaml, ingress.yaml
```
```bash
kubectl apply -f certificate.yaml, deployment.yaml, service.yaml, ingress.yaml
```
:::info
It might take a few minutes to provision the managed certificates. [Managed certificates documentation](https://cloud.google.com/kubernetes-engine/docs/how-to/managed-certs).
@ -120,19 +125,85 @@ PGRST_DB_URI=postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:5432/TOO
ToolJet Workflows allows users to design and execute complex, data-centric automations using a visual, node-based interface. This feature enhances ToolJet's functionality beyond building secure internal tools, enabling developers to automate complex business processes.
:::info
For users migrating from Temporal-based workflows, please refer to the [Workflow Migration Guide](./workflow-temporal-to-bullmq-migration).
:::
### Enabling Workflow Scheduling
Create workflow deployment:
To activate workflow scheduling, set the following environment variables in your ToolJet deployment:
```bash
kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/workflow-deployment.yaml
# Worker Mode (required)
# Set to 'true' to enable job processing
# Set to 'false' or unset for HTTP-only mode (scaled deployments)
WORKER=true
# Workflow Processor Concurrency (optional)
# Number of workflow jobs processed concurrently per worker
# Default: 5
TOOLJET_WORKFLOW_CONCURRENCY=5
```
**Note:** Ensure that the worker deployment uses the same image as the ToolJet application deployment to maintain compatibility. Additionally, the variables below need to be a part of tooljet-deployment.
**Environment Variable Details:**
- **WORKER** (required): Enables job processing. Set to `true` to activate workflow scheduling
- **TOOLJET_WORKFLOW_CONCURRENCY** (optional): Controls the number of workflow jobs processed concurrently per worker instance. Default is 5 if not specified
`ENABLE_WORKFLOW_SCHEDULING=true`
`TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE=default`
`TEMPORAL_SERVER_ADDRESS=<Temporal_Server_Address>`
:::warning
**External Redis Requirement**: When running separate worker containers or multiple instances, an external stateful Redis instance is **required** for job queue coordination. The built-in Redis only works when the server and worker are in the same container instance (single instance deployment).
:::
#### Deploying Redis for Workflows
Deploy a stateful Redis instance using the following example configuration:
```bash
kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/redis-stateful.yaml
```
<details id="tj-dropdown">
<summary>Built-in Redis vs External Redis</summary>
ToolJet images include a built-in Redis instance for development. When deploying workflows in production, you must update your deployment configuration to use the external stateful Redis:
Change **REDIS_HOST** from **localhost** to **redis-service** in your deployment YAML:
```yaml
- name: REDIS_HOST
value: redis-service # Changed from localhost
- name: REDIS_PORT
value: "6379"
```
</details>
This example deployment creates:
- A StatefulSet with persistent storage for Redis
- A headless Service for stable network identity
- ConfigMap with production-ready Redis configuration
- A Secret for optional password authentication
:::info
This is an example configuration that you can customize to your needs. However, **AOF (Append Only File) persistence** and **`maxmemory-policy noeviction`** are critical settings that must be maintained for BullMQ job queue reliability.
:::
After deploying Redis, configure ToolJet to connect to it using these environment variables in your deployment:
```bash
REDIS_HOST=redis-service.default.svc.cluster.local
REDIS_PORT=6379
REDIS_PASSWORD=your-secure-redis-password-here # Match the password in redis-secret
```
**Optional Redis Configuration:**
- `REDIS_USERNAME=` - Redis username (ACL)
- `REDIS_DB=0` - Redis database number (default: 0)
- `REDIS_TLS=false` - Enable TLS/SSL (set to 'true')
**Note:** Update the `redis-secret` in the Redis deployment YAML with a secure password before deploying to production.
**Note:** Ensure that these environment variables are added to your Kubernetes deployment configuration (e.g., in your deployment.yaml file or Kubernetes secret).
## Upgrading to the Latest LTS Version
@ -146,4 +217,4 @@ If this is a new installation of the application, you may start directly with th
- Users on versions earlier than **v2.23.0-ee2.10.2** must first upgrade to this version before proceeding to the LTS version.
_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._
_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._

View file

@ -6,13 +6,13 @@ title: Kubernetes
# Deploying ToolJet on Kubernetes
:::warning
To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` in your network settings.
To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings.
:::
:::info
You should setup a **PostgreSQL database** manually to be used by ToolJet. You can find the system requirements [here](/docs/3.5.0-LTS/setup/system-requirements#postgresql).
ToolJet comes with a **built-in Redis setup**, which is used for multiplayer editing and background jobs. However, for **multi-pod setup**, it's recommended to use an **external Redis instance**.
ToolJet runs with **built-in Redis** for multiplayer editing and background jobs. When running **separate worker containers** or **multi-pod setup**, an **external Redis instance** is **required** for job queue coordination.
:::
Follow the steps below to deploy ToolJet on a Kubernetes cluster.
@ -21,6 +21,7 @@ Follow the steps below to deploy ToolJet on a Kubernetes cluster.
ToolJet uses a postgres database as the persistent storage for storing data related to users and apps. We do not have plans to support other databases such as MySQL.
2. **Create a Kubernetes secret with name `server`.**
For the setup, ToolJet requires:
```
TOOLJET_HOST=<Endpoint url>
LOCKBOX_MASTER_KEY=<generate using openssl rand -hex 32>
@ -31,7 +32,9 @@ Follow the steps below to deploy ToolJet on a Kubernetes cluster.
PG_PASS=<password>
PG_DB=tooljet_production # Must be a unique database name (do not reuse across deployments)
```
Also, for setting up additional environment variables in the .env file, please check our documentation on environment variables [here](/docs/setup/env-vars).
3. Create a Kubernetes deployment
```bash
kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/deployment.yaml
@ -39,7 +42,7 @@ Follow the steps below to deploy ToolJet on a Kubernetes cluster.
:::info
1. The file given above is just a template and might not suit production environments. You should download the file and configure parameters such as the replica count and environment variables according to your needs.
2. If there are self signed HTTPS endpoints that ToolJet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. You can make use of kubernetes secrets to mount the certificate file onto the containers.
:::
:::
4. Verify if ToolJet is running
```bash
kubectl get pods
@ -108,19 +111,85 @@ PGRST_DB_URI=postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:5432/TOO
ToolJet Workflows allows users to design and execute complex, data-centric automations using a visual, node-based interface. This feature enhances ToolJet's functionality beyond building secure internal tools, enabling developers to automate complex business processes.
:::info
For users migrating from Temporal-based workflows, please refer to the [Workflow Migration Guide](./workflow-temporal-to-bullmq-migration).
:::
### Enabling Workflow Scheduling
Create workflow deployment:
To activate workflow scheduling, set the following environment variables in your ToolJet deployment:
```bash
kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/workflow-deployment.yaml
# Worker Mode (required)
# Set to 'true' to enable job processing
# Set to 'false' or unset for HTTP-only mode (scaled deployments)
WORKER=true
# Workflow Processor Concurrency (optional)
# Number of workflow jobs processed concurrently per worker
# Default: 5
TOOLJET_WORKFLOW_CONCURRENCY=5
```
**Note:** Ensure that the worker deployment uses the same image as the ToolJet application deployment to maintain compatibility. Additionally, the variables below need to be a part of tooljet-deployment.
**Environment Variable Details:**
- **WORKER** (required): Enables job processing. Set to `true` to activate workflow scheduling
- **TOOLJET_WORKFLOW_CONCURRENCY** (optional): Controls the number of workflow jobs processed concurrently per worker instance. Default is 5 if not specified
`ENABLE_WORKFLOW_SCHEDULING=true`
`TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE=default`
`TEMPORAL_SERVER_ADDRESS=<Temporal_Server_Address>`
:::warning
**External Redis Requirement**: When running separate worker containers or multiple instances, an external stateful Redis instance is **required** for job queue coordination. The built-in Redis only works when the server and worker are in the same container instance (single instance deployment).
:::
#### Deploying Redis for Workflows
Deploy a stateful Redis instance using the following example configuration:
```bash
kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/redis-stateful.yaml
```
<details id="tj-dropdown">
<summary>Built-in Redis vs External Redis</summary>
ToolJet images include a built-in Redis instance for development. When deploying workflows in production, you must update your deployment configuration to use the external stateful Redis:
Change **REDIS_HOST** from **localhost** to **redis-service** in your deployment YAML:
```yaml
- name: REDIS_HOST
value: redis-service # Changed from localhost
- name: REDIS_PORT
value: "6379"
```
</details>
This example deployment creates:
- A StatefulSet with persistent storage for Redis
- A headless Service for stable network identity
- ConfigMap with production-ready Redis configuration
- A Secret for optional password authentication
:::info
This is an example configuration that you can customize to your needs. However, **AOF (Append Only File) persistence** and **`maxmemory-policy noeviction`** are critical settings that must be maintained for BullMQ job queue reliability.
:::
After deploying Redis, configure ToolJet to connect to it using these environment variables in your deployment:
```bash
REDIS_HOST=redis-service.default.svc.cluster.local
REDIS_PORT=6379
REDIS_PASSWORD=your-secure-redis-password-here # Match the password in redis-secret
```
**Optional Redis Configuration:**
- `REDIS_USERNAME=` - Redis username (ACL)
- `REDIS_DB=0` - Redis database number (default: 0)
- `REDIS_TLS=false` - Enable TLS/SSL (set to 'true')
**Note:** Update the `redis-secret` in the Redis deployment YAML with a secure password before deploying to production.
**Note:** Ensure that these environment variables are added to your Kubernetes deployment configuration (e.g., in your deployment.yaml file or Kubernetes secret).
## Upgrading to the Latest LTS Version
@ -134,4 +203,4 @@ If this is a new installation of the application, you may start directly with th
- Users on versions earlier than **v2.23.0-ee2.10.2** must first upgrade to this version before proceeding to the LTS version.
_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._
_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._

View file

@ -6,48 +6,51 @@ title: Openshift
# Deploying ToolJet on Openshift
:::warning
To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` in your network settings.
To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings.
:::
:::info
You should setup a **PostgreSQL database** manually to be used by ToolJet. You can find the system requirements [here](/docs/3.5.0-LTS/setup/system-requirements#postgresql).
ToolJet comes with a **built-in Redis setup**, which is used for multiplayer editing and background jobs. However, for **multi-pod setup**, it's recommended to use an **external Redis instance**.
ToolJet runs with **built-in Redis** for multiplayer editing and background jobs. When running **separate worker containers** or **multi-pod setup**, an **external Redis instance** is **required** for job queue coordination.
:::
Follow the steps below to deploy ToolJet on Openshift.
1. Setup a PostgreSQL database ToolJet uses a postgres database as the persistent storage for storing data related to users and apps.
```
TOOLJET_HOST=<Endpoint url>
LOCKBOX_MASTER_KEY=<generate using openssl rand -hex 32>
SECRET_KEY_BASE=<generate using openssl rand -hex 64>
PG_USER=<username>
PG_HOST=<postgresql-database-host>
PG_PASS=<password>
PG_DB=tooljet_production # Must be a unique database name (do not reuse across deployments)
```
Also, for setting up additional environment variables in the .env file, please check our documentation on environment variables [here](/docs/setup/env-vars).
```
TOOLJET_HOST=<Endpoint url>
LOCKBOX_MASTER_KEY=<generate using openssl rand -hex 32>
SECRET_KEY_BASE=<generate using openssl rand -hex 64>
PG_USER=<username>
PG_HOST=<postgresql-database-host>
PG_PASS=<password>
PG_DB=tooljet_production # Must be a unique database name (do not reuse across deployments)
```
Also, for setting up additional environment variables in the .env file, please check our documentation on environment variables [here](/docs/setup/env-vars).
2. Once you have logged into the Openshift developer dashboard click on `+Add` tab. Select import YAML from the local machine.
:::note
When entering one or more files and use --- to separate each definition
:::
Copy paste deployment.yaml to the online editor
```
curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/openshift/deployment.yaml
```
Copy paste the service.yaml to the online editor
```
curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/openshift/service.yaml
```
<img className="screenshot-full" src="/img/setup/openshift/online-yaml-editor.png" alt="online yaml editor" />
Once you have added the files click on create.
:::info
If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. You can make use of kubernetes secrets to mount the certificate file onto the containers.
:::
4. Navigate to topology tab and use the visual connector to establish the connect between tooljet-deployment and postgresql as shown in the screenshot below.
<img className="screenshot-full" src="/img/setup/openshift/toplogy.png" alt="topology" />
:::note
When entering one or more files and use --- to separate each definition
:::
Copy paste deployment.yaml to the online editor
```
curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/openshift/deployment.yaml
```
Copy paste the service.yaml to the online editor
```
curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/openshift/service.yaml
```
<img className="screenshot-full" src="/img/setup/openshift/online-yaml-editor.png" alt="online yaml editor" />
Once you have added the files click on create.
:::info
If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. You can make use of kubernetes secrets to mount the certificate file onto the containers.
:::
3. Navigate to topology tab and use the visual connector to establish the connect between tooljet-deployment and postgresql as shown in the screenshot below.
<img className="screenshot-full" src="/img/setup/openshift/toplogy.png" alt="topology" />
## ToolJet Database
@ -104,19 +107,85 @@ PGRST_DB_URI=postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:5432/TOO
ToolJet Workflows allows users to design and execute complex, data-centric automations using a visual, node-based interface. This feature enhances ToolJet's functionality beyond building secure internal tools, enabling developers to automate complex business processes.
:::info
For users migrating from Temporal-based workflows, please refer to the [Workflow Migration Guide](./workflow-temporal-to-bullmq-migration).
:::
### Enabling Workflow Scheduling
Create workflow deployment:
To activate workflow scheduling, set the following environment variables in your ToolJet deployment:
```bash
kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/workflow-deployment.yaml
# Worker Mode (required)
# Set to 'true' to enable job processing
# Set to 'false' or unset for HTTP-only mode (scaled deployments)
WORKER=true
# Workflow Processor Concurrency (optional)
# Number of workflow jobs processed concurrently per worker
# Default: 5
TOOLJET_WORKFLOW_CONCURRENCY=5
```
**Note:** Ensure that the worker deployment uses the same image as the ToolJet application deployment to maintain compatibility. Additionally, the variables below need to be a part of tooljet-deployment.
**Environment Variable Details:**
- **WORKER** (required): Enables job processing. Set to `true` to activate workflow scheduling
- **TOOLJET_WORKFLOW_CONCURRENCY** (optional): Controls the number of workflow jobs processed concurrently per worker instance. Default is 5 if not specified
`ENABLE_WORKFLOW_SCHEDULING=true`
`TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE=default`
`TEMPORAL_SERVER_ADDRESS=<Temporal_Server_Address>`
:::warning
**External Redis Requirement**: When running separate worker containers or multiple instances, an external stateful Redis instance is **required** for job queue coordination. The built-in Redis only works when the server and worker are in the same container instance (single instance deployment).
:::
#### Deploying Redis for Workflows
Deploy a stateful Redis instance using the following example configuration:
```bash
kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/redis-stateful.yaml
```
<details id="tj-dropdown">
<summary>Built-in Redis vs External Redis</summary>
ToolJet images include a built-in Redis instance for development. When deploying workflows in production, you must update your deployment configuration to use the external stateful Redis:
Change **REDIS_HOST** from **localhost** to **redis-service** in your deployment YAML:
```yaml
- name: REDIS_HOST
value: redis-service # Changed from localhost
- name: REDIS_PORT
value: "6379"
```
</details>
This example deployment creates:
- A StatefulSet with persistent storage for Redis
- A headless Service for stable network identity
- ConfigMap with production-ready Redis configuration
- A Secret for optional password authentication
:::info
This is an example configuration that you can customize to your needs. However, **AOF (Append Only File) persistence** and **`maxmemory-policy noeviction`** are critical settings that must be maintained for BullMQ job queue reliability.
:::
After deploying Redis, configure ToolJet to connect to it using these environment variables in your deployment:
```bash
REDIS_HOST=redis-service.default.svc.cluster.local
REDIS_PORT=6379
REDIS_PASSWORD=your-secure-redis-password-here # Match the password in redis-secret
```
**Optional Redis Configuration:**
- `REDIS_USERNAME=` - Redis username (ACL)
- `REDIS_DB=0` - Redis database number (default: 0)
- `REDIS_TLS=false` - Enable TLS/SSL (set to 'true')
**Note:** Update the `redis-secret` in the Redis deployment YAML with a secure password before deploying to production.
**Note:** Ensure that these environment variables are added to your OpenShift deployment configuration (e.g., in your deployment.yaml file).
## Upgrading to the Latest LTS Version
@ -130,4 +199,4 @@ If this is a new installation of the application, you may start directly with th
- Users on versions earlier than **v2.23.0-ee2.10.2** must first upgrade to this version before proceeding to the LTS version.
_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._
_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._

View file

@ -46,4 +46,4 @@ cd /app/tooljet
sudo ./setup_app
```
**Reference**: [ToolJet AMI Setup Documentation](https://docs.tooljet.ai/docs/setup/ami)
**Reference**: [ToolJet AMI Setup Documentation](https://docs.tooljet.com/docs/setup/ami)

View file

@ -10,8 +10,8 @@ Add volume mount only
```yaml
services:
tooljet:
# ... other configuration
volumes:
# ... other configuration
volumes:
- /path/to/global-bundle.pem:/certs/global-bundle.pem
```
@ -43,4 +43,4 @@ docker-compose up -d
docker-compose logs tooljet | grep "TOOLJET APPLICATION STARTED SUCCESSFULLY"
```
**Reference**: [ToolJet Docker Setup Documentation](https://docs.tooljet.ai/docs/setup/docker)
**Reference**: [ToolJet Docker Setup Documentation](https://docs.tooljet.com/docs/setup/docker)

View file

@ -38,6 +38,7 @@ aws ssm send-command \
#### Using AWS CLI
Create a new task definition file `tooljet-task-updated.json`:
```json
{
"family": "tooljet-task",
@ -81,6 +82,7 @@ Create a new task definition file `tooljet-task-updated.json`:
```
Register the updated task definition:
```bash
aws ecs register-task-definition --cli-input-json file://tooljet-task-updated.json
```
@ -112,6 +114,7 @@ aws ecs register-task-definition --cli-input-json file://tooljet-task-updated.js
#### Using AWS CLI
Update your task definition to use EFS:
```json
{
"volumes": [
@ -177,6 +180,7 @@ aws ecs describe-services --cluster your-cluster-name --services tooljet-service
```
**Verify SSL certificate mount:**
```bash
# Connect to running container and verify certificate
aws ecs execute-command \
@ -186,4 +190,4 @@ aws ecs execute-command \
--command "ls -la /certs/"
```
**Reference**: [ToolJet ECS Setup Documentation](https://docs.tooljet.ai/docs/setup/ecs)
**Reference**: [ToolJet ECS Setup Documentation](https://docs.tooljet.com/docs/setup/ecs)

View file

@ -37,22 +37,22 @@ spec:
template:
spec:
containers:
- name: tooljet
env:
- name: PG_HOST
value: "your-rds-endpoint.region.rds.amazonaws.com"
- name: PGSSLMODE
value: "require"
- name: NODE_EXTRA_CA_CERTS
value: "/certs/global-bundle.pem"
volumeMounts:
- name: ssl-certs
mountPath: /certs
readOnly: true
- name: tooljet
env:
- name: PG_HOST
value: "your-rds-endpoint.region.rds.amazonaws.com"
- name: PGSSLMODE
value: "require"
- name: NODE_EXTRA_CA_CERTS
value: "/certs/global-bundle.pem"
volumeMounts:
- name: ssl-certs
mountPath: /certs
readOnly: true
volumes:
- name: ssl-certs
configMap:
name: rds-ssl-cert
- name: ssl-certs
configMap:
name: rds-ssl-cert
```
### 3. Alternative: Using Kubernetes Secret
@ -67,9 +67,9 @@ kubectl create secret generic rds-ssl-cert \
```yaml
# In deployment.yaml
volumes:
- name: ssl-certs
secret:
secretName: rds-ssl-cert
- name: ssl-certs
secret:
secretName: rds-ssl-cert
```
### 4. Apply Configuration
@ -99,4 +99,4 @@ extraVolumeMounts:
readOnly: true
```
**Reference**: [ToolJet Kubernetes EKS Setup Documentation](https://docs.tooljet.ai/docs/setup/kubernetes-eks)
**Reference**: [ToolJet Kubernetes EKS Setup Documentation](https://docs.tooljet.com/docs/setup/kubernetes-eks)

View file

@ -36,9 +36,9 @@ title: Best Practices and Additional Resources
- [ToolJet Environment Variables Documentation](https://docs.tooljet.com/docs/setup/env-vars/)
- [Azure Kubernetes Service Documentation](https://docs.microsoft.com/en-us/azure/aks/)
- [Azure Container Instances Documentation](https://docs.microsoft.com/en-us/azure/container-instances/)
- [ToolJet Kubernetes AKS Setup](https://docs.tooljet.ai/docs/setup/kubernetes-aks)
- [ToolJet Azure Container Setup](https://docs.tooljet.ai/docs/setup/azure-container)
- [ToolJet Kubernetes AKS Setup](https://docs.tooljet.com/docs/setup/kubernetes-aks)
- [ToolJet Azure Container Setup](https://docs.tooljet.com/docs/setup/azure-container)
:::note
**Important Note**: The `PGSSLMODE=require` environment variable is mandatory for connecting to Azure Database for PostgreSQL Flexible Server. This ensures secure SSL/TLS encrypted connections are established and is a requirement for all Azure PostgreSQL databases.
:::
:::

View file

@ -1,6 +1,6 @@
---
id: aks
title: Azure Kubernetes Service (AKS)
title: Azure Kubernetes Service (AKS)
---
For Azure Kubernetes Service (AKS) deployment, follow the comprehensive setup guide in the ToolJet documentation which includes detailed Kubernetes manifests, Helm charts, and configuration options.
@ -13,7 +13,7 @@ When configuring your AKS deployment, ensure you include these critical environm
# Required environment variables for Azure PostgreSQL connection
PG_HOST=your-server.postgres.database.azure.com
PG_PORT=5432
PG_DB=your-database-name
PG_DB=your-database-name
PG_USER=your-username
PGSSLMODE=require # MANDATORY for Azure PostgreSQL
```
@ -40,4 +40,4 @@ kubectl exec -it deployment/tooljet -n tooljet -- \
psql "postgresql://username:password@your-server.postgres.database.azure.com:5432/database?sslmode=require"
```
**Reference**: [ToolJet Kubernetes AKS Setup Documentation](https://docs.tooljet.ai/docs/setup/kubernetes-aks)
**Reference**: [ToolJet Kubernetes AKS Setup Documentation](https://docs.tooljet.com/docs/setup/kubernetes-aks)

View file

@ -39,4 +39,4 @@ az container logs --resource-group your-rg --name tooljet-container | grep "TOOL
curl http://your-container-fqdn:3000/api/health
```
**Reference**: [ToolJet Azure Container Setup Documentation](https://docs.tooljet.ai/docs/setup/azure-container)
**Reference**: [ToolJet Azure Container Setup Documentation](https://docs.tooljet.com/docs/setup/azure-container)

View file

@ -10,6 +10,7 @@ SSL certificates are not required for Cloud Run with Cloud SQL as SSL connection
:::
**Method A: Using gcloud CLI**
```bash
# Deploy to Cloud Run with direct database connection
gcloud run deploy tooljet \
@ -27,6 +28,7 @@ gcloud run deploy tooljet \
**Method B: Using YAML configuration**
Create `service.yaml`:
```yaml
apiVersion: serving.knative.dev/v1
kind: Service
@ -41,39 +43,39 @@ spec:
containerConcurrency: 80
timeoutSeconds: 300
containers:
- image: tooljet/tooljet:latest
resources:
limits:
memory: 2Gi
cpu: 2000m
env:
- name: PG_HOST
value: "your-cloud-sql-ip"
- name: PG_PORT
value: "5432"
- name: PG_DB
value: "your-database-name"
- name: PG_USER
value: "postgres"
- name: PG_PASS
valueFrom:
secretKeyRef:
name: db-password
key: password
ports:
- containerPort: 3000
livenessProbe:
httpGet:
path: /api/health
port: 3000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /api/health
port: 3000
initialDelaySeconds: 10
periodSeconds: 5
- image: tooljet/tooljet:latest
resources:
limits:
memory: 2Gi
cpu: 2000m
env:
- name: PG_HOST
value: "your-cloud-sql-ip"
- name: PG_PORT
value: "5432"
- name: PG_DB
value: "your-database-name"
- name: PG_USER
value: "postgres"
- name: PG_PASS
valueFrom:
secretKeyRef:
name: db-password
key: password
ports:
- containerPort: 3000
livenessProbe:
httpGet:
path: /api/health
port: 3000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /api/health
port: 3000
initialDelaySeconds: 10
periodSeconds: 5
```
```bash
@ -81,4 +83,4 @@ spec:
gcloud run services replace service.yaml --region=your-region
```
**Reference**: [ToolJet Google Cloud Run Setup Documentation](https://docs.tooljet.ai/docs/setup/google-cloud-run)
**Reference**: [ToolJet Google Cloud Run Setup Documentation](https://docs.tooljet.com/docs/setup/google-cloud-run)

Some files were not shown because too many files have changed in this diff Show more