Deployment guide

How to self-host ToolJet on a VPS: open-source low-code platform for internal tools

Deploy on a VPS Cloud →

Self-hosting6 min read

How to self-host ToolJet on a VPS: open-source low-code platform for internal tools

Development teams spend dozens of hours each month building internal tools from scratch — admin panels, operations dashboards, management forms. ToolJet changes the equation: an open-source low-code platform (AGPL-3.0, 38 000+ stars, v3.20) that lets a team ship an internal tool in hours, with drag-and-drop components, 50+ data connectors and custom JavaScript actions. Self-hosted on your own VPS, with no per-seat pricing.

What is ToolJet?

ToolJet is an open-source low-code platform for building internal tools: admin panels, dashboards, forms, approval workflows. The visual editor provides 100+ components (tables, charts, forms, buttons, calendars) that connect to any data source — PostgreSQL, MySQL, Redis, REST APIs, Google Sheets, Stripe — and are wired together with JavaScript actions.

Where Retool charges $10–25 per user per month, ToolJet CE is AGPL-3.0: unlimited users, unlimited apps, zero telemetry, hosted on your infrastructure. Version 3.0 (2026) added AI-native app building: describe the tool you want in natural language, ToolJet generates the component tree, connects the data source and wires the actions.

Deployment architecture on ServOrbit

On a ServOrbit VPS, ToolJet runs with two Docker containers: postgres:13 (application database with persistent volumes) and tooljet/tooljet-ce:latest (Node.js server on port 3000, UI and API bundled).

PostgREST is disabled (ENABLE_TOOLJET_DB=false): this optional component would expose a direct REST API over PostgreSQL — unnecessary for most deployments. The setup stays at two services — lightweight and easy to maintain.

AWX auto-generates secrets at provisioning: SECRET_KEY_BASE (64-char session signing key), LOCKBOX_MASTER_KEY (Lockbox encryption), the PostgreSQL password, and TOOLJET_HOST (computed from the domain if attached, otherwise the VPS IP). nginx terminates TLS and proxies to port 3000.

Requirements

  • A ServOrbit VPS with at least 2 GB RAM (Ubuntu 24.04, Docker installed by AWX).
  • An optional domain name — ToolJet also accepts IP access via SSH tunnel.
  • No SMTP required to get started: the first account is created via the in-browser wizard.

Deploy from the ServOrbit Marketplace

From your ServOrbit client area, go to Marketplace → Development → ToolJet and click Deploy. AWX takes over: Docker provisioning, secret generation, .env file writing, container startup. The application is ready in about 60 seconds.

Once the containers are running, nginx exposes ToolJet: with domain, https://your-domain.com (Let's Encrypt TLS set up automatically); without domain, SSH tunnel access only — ssh -L 8096:127.0.0.1:8096 root@your-ip, then http://localhost:8096 in your browser.

First launch: create the super-admin account

On first open, ToolJet shows a setup wizard asking for your full name and email address (the first account is automatically the super-admin), your password (freely chosen), and your organization name (used as the workspace name in the editor). No email confirmation is required. Once the wizard is submitted, you land directly in the ToolJet editor.

Connecting a data source

In the ToolJet editor, click Data Sources in the left sidebar, then + New data source. ToolJet offers 50+ connectors: databases (PostgreSQL, MySQL, MariaDB, SQLite, Redis, InfluxDB), APIs (REST, GraphQL, Stripe, Twilio, SendGrid, HubSpot, OpenAI), spreadsheets (Google Sheets, Airtable), storage (AWS S3, MinIO). Each connector stores its credentials encrypted in the database (Lockbox AES). A configured data source is available across all apps in the workspace.

Building your first app

Click Apps → Create new app, give it a name. The editor opens with a blank page and a component panel on the left.

Example — an order management admin panel: (1) drag a Table component onto the canvas; (2) create a PostgreSQL query SELECT * FROM orders ORDER BY created_at DESC LIMIT 100; (3) bind the table to the query via the Data property → {{queries.getOrders.data}}; (4) add a TextInput (search bar) and a Button ("Update status"); (5) wire the button to UPDATE orders SET status = 'shipped' WHERE id = {{table.selectedRow.id}}.

Click Preview to test, then Release to publish. Invite teammates from Settings → Users — they log in with their own accounts and see only apps their role grants access to.

ToolJet CE vs Retool comparison

CriterionToolJet CERetool
PriceFree (AGPL-3.0)$10–25/user/month
HostingYour VPSRetool Cloud
DataYour infrastructureSent to Retool
Connectors50+60+
UsersUnlimitedPaid per seat
Built-in AIYes (v3.0, 2026)Yes (Retool AI)
SourceOpen sourceProprietary

Maintenance and updates

ToolJet uses tooljet/tooljet-ce:latest. To update, run from the application directory:

docker compose pull
docker compose up -d

Database migrations are applied automatically at container startup. Your data stays intact in the tooljet-db volume. To pin to a specific version, replace latest with a version tag (e.g. tooljet/tooljet-ce:3.20.0).

Deploy your infrastructure today

VPS Cloud. Preconfigured environments available.

Need help?

Browse our help center and FAQ, or write to our team — support in French, English and Arabic.