Analytics cookies only (Google Analytics, PostHog). No ad networks, no cross-site tracking. See our privacy policy.
Self-host ToolJet
updated Oct 2026deployed by usprices checked · Jul 2026Install verified on Ubuntu 26.04 · Oct 2026 · how we test
We earn commissions when you shop through the links below. Full disclosure →
A low-code platform for building internal tools and workflows on top of your existing databases and APIs, with a drag-and-drop app builder, a built-in ToolJet Database served through PostgREST, and workflow jobs run by a worker. The public repository is AGPL-3.0; its server/ee and frontend/ee directories are Git submodules pointing at separate ToolJet repositories, and the single Docker image runs with a PostgreSQL database.
Runs on a VPS from $40/mo (Vultr 8 GB, 8 GB RAM) · prices checked Oct 2026
Our recommendation
Pick ToolJet when your internal tools need workflows as well as screens: it pairs a drag-and-drop app builder over your databases and APIs with a built-in ToolJet Database (PostgreSQL behind PostgREST) and a worker that runs scheduled and triggered workflow jobs. It is a TypeScript platform, NestJS on the server, and the public repository is AGPL-3.0, with `server/ee` and `frontend/ee` as Git submodules of separate ToolJet repositories that are not publicly readable, so the paid features are not in the open code. The official compose runs one ToolJet image beside PostgreSQL, and upstream's system-requirements page asks for 4 GB of RAM and one vCPU for the application server (x86 only; arm64 is unsupported), which is our documented floor; the PostgreSQL sizing it gives is for a separate database host. Of the catalog's low-code internal-tool builders, ToolJet is the one to choose for workflow automation inside the tool; Appsmith is simpler to run, Budibase has the richer internal database, and NocoBase is data-model-first.
What you need
Any VPS with at least 4096 MB of RAM
A domain you control — most self-hosted setups need HTTPS in front of them
About an afternoon — budget time for troubleshooting
ToolJet's Docker Compose docs and env template leave these decisions to you:
non-negotiableUpstream's compose file pulls tooljet/tooljet:ee-lts-latest, a rolling tag; its upgrade note says to replace the placeholder with the exact LTS tag copied from Docker Hub, which is what our pin does. The LTS lines are the supported path, and the image is built for linux/amd64 only.
non-negotiableLOCKBOX_MASTER_KEY encrypts the data-source credentials you store and SECRET_KEY_BASE encrypts session cookies; upstream's internal.sh generates them with openssl rand -hex, which our .env reproduces (the script itself prompts for the database password, so it cannot run unattended). Lose .env and the stored credentials are unrecoverable, so back it up together with the postgres_data directory; upstream ships a backup-restore.sh for this in-built-PostgreSQL layout.
non-negotiableTOOLJET_HOST must be the public address people use, starting with http:// or https://; set it before you invite anyone. The env template also turns on a daily update check (CHECK_FOR_UPDATES=true) and telemetry to ToolJet (DISABLE_TOOLJET_TELEMETRY opts out), and leaves SMTP empty, so invitations cannot be emailed until you fill it in.
non-negotiablePort 80 is plain HTTP; put a TLS reverse proxy in front. The single container runs the server and worker together with a built-in Redis, which upstream says only works in that one-container case: separate workers need an external Redis started with --appendonly yes --maxmemory-policy noeviction, and upstream recommends the PostgreSQL release our snippet uses.