docker.recipes

ToolJet Internal Tools

intermediate

Open-source low-code platform for building internal tools.

Overview

ToolJet is an open-source low-code platform that enables developers and business users to rapidly build internal tools, admin panels, and custom applications without extensive coding. Launched as a self-hosted alternative to tools like Retool and Appsmith, ToolJet features a visual drag-and-drop interface builder with 45+ pre-built UI components, supports 40+ data source integrations including REST APIs, databases, and third-party services, and allows custom JavaScript for advanced functionality. This stack combines ToolJet with PostgreSQL as the metadata and application storage backend, while Redis handles caching, session management, and real-time features like collaborative editing and live data updates. PostgreSQL stores ToolJet's internal configuration, user permissions, application definitions, and query metadata, while Redis accelerates the platform by caching frequently accessed data sources, maintaining WebSocket connections for real-time collaboration, and storing temporary query results. This configuration is ideal for teams wanting to deploy a production-ready internal tools platform that can handle multiple concurrent users building and using custom applications, with the reliability of PostgreSQL for data persistence and the performance boost of Redis for interactive features.

Key Features

  • Visual application builder with 45+ UI components including tables, charts, forms, and custom widgets
  • Multi-database query engine supporting PostgreSQL, MySQL, MongoDB, REST APIs, and 40+ data sources
  • Real-time collaborative editing powered by Redis WebSocket connections and session synchronization
  • Advanced PostgreSQL-backed permissions system with granular access control and multi-workspace support
  • Redis-cached query results and data source connections for sub-second application loading times
  • Custom JavaScript code execution with secure sandboxing for advanced business logic
  • Built-in workflow automation with triggers, transformations, and external service integrations
  • PostgreSQL JSONB storage for flexible application schemas and rapid UI component configuration changes

Common Use Cases

  • 1Customer support dashboards connecting CRM data, support tickets, and user analytics from multiple APIs
  • 2Internal admin panels for e-commerce platforms managing inventory, orders, and customer data across databases
  • 3Data visualization tools for business intelligence combining PostgreSQL analytics with Redis-cached real-time metrics
  • 4Employee onboarding workflows integrating HR systems, IT provisioning, and document management platforms
  • 5Operations dashboards for DevOps teams monitoring application metrics, deployment status, and infrastructure data
  • 6Content management interfaces for marketing teams handling campaigns, social media, and customer communications
  • 7Financial reporting tools connecting accounting systems, payment processors, and business intelligence platforms

Prerequisites

  • Minimum 2GB RAM for ToolJet application server plus 1GB for PostgreSQL and 512MB for Redis
  • Docker and Docker Compose installed with support for health checks and multi-service networking
  • Port 80 available for ToolJet web interface, or alternative port configuration knowledge
  • Understanding of environment variable management for database credentials and encryption keys
  • Basic knowledge of PostgreSQL administration for backup, monitoring, and performance tuning
  • Familiarity with Redis persistence concepts for cache durability and session storage requirements

For development & testing. Review security settings, change default credentials, and test thoroughly before production use. See Terms

docker-compose.yml

docker-compose.yml
1services:
2 tooljet:
3 image: tooljet/tooljet-ce:latest
4 ports:
5 - "80:80"
6 environment:
7 TOOLJET_HOST: http://localhost
8 PG_HOST: postgres
9 PG_DB: ${POSTGRES_DB}
10 PG_USER: ${POSTGRES_USER}
11 PG_PASS: ${POSTGRES_PASSWORD}
12 LOCKBOX_MASTER_KEY: ${LOCKBOX_KEY}
13 SECRET_KEY_BASE: ${SECRET_KEY}
14 REDIS_HOST: redis
15 depends_on:
16 postgres:
17 condition: service_healthy
18 redis:
19 condition: service_started
20 networks:
21 - tooljet-net
22 restart: unless-stopped
23
24 postgres:
25 image: postgres:16-alpine
26 environment:
27 POSTGRES_USER: ${POSTGRES_USER}
28 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
29 POSTGRES_DB: ${POSTGRES_DB}
30 volumes:
31 - postgres_data:/var/lib/postgresql/data
32 healthcheck:
33 test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
34 interval: 10s
35 timeout: 5s
36 retries: 5
37 networks:
38 - tooljet-net
39 restart: unless-stopped
40
41 redis:
42 image: redis:7-alpine
43 volumes:
44 - redis_data:/data
45 networks:
46 - tooljet-net
47 restart: unless-stopped
48
49volumes:
50 postgres_data:
51 redis_data:
52
53networks:
54 tooljet-net:
55 driver: bridge

.env Template

.env
1# PostgreSQL
2POSTGRES_USER=tooljet
3POSTGRES_PASSWORD=secure_postgres_password
4POSTGRES_DB=tooljet
5
6# ToolJet
7LOCKBOX_KEY=$(openssl rand -hex 32)
8SECRET_KEY=$(openssl rand -hex 64)

Usage Notes

  1. 1ToolJet at http://localhost
  2. 2Drag-and-drop UI builder
  3. 3Connect to databases, APIs, and more
  4. 4Build admin panels and dashboards

Individual Services(3 services)

Copy individual services to mix and match with your existing compose files.

tooljet
tooljet:
  image: tooljet/tooljet-ce:latest
  ports:
    - "80:80"
  environment:
    TOOLJET_HOST: http://localhost
    PG_HOST: postgres
    PG_DB: ${POSTGRES_DB}
    PG_USER: ${POSTGRES_USER}
    PG_PASS: ${POSTGRES_PASSWORD}
    LOCKBOX_MASTER_KEY: ${LOCKBOX_KEY}
    SECRET_KEY_BASE: ${SECRET_KEY}
    REDIS_HOST: redis
  depends_on:
    postgres:
      condition: service_healthy
    redis:
      condition: service_started
  networks:
    - tooljet-net
  restart: unless-stopped
postgres
postgres:
  image: postgres:16-alpine
  environment:
    POSTGRES_USER: ${POSTGRES_USER}
    POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    POSTGRES_DB: ${POSTGRES_DB}
  volumes:
    - postgres_data:/var/lib/postgresql/data
  healthcheck:
    test:
      - CMD-SHELL
      - pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}
    interval: 10s
    timeout: 5s
    retries: 5
  networks:
    - tooljet-net
  restart: unless-stopped
redis
redis:
  image: redis:7-alpine
  volumes:
    - redis_data:/data
  networks:
    - tooljet-net
  restart: unless-stopped

Quick Start

terminal
1# 1. Create the compose file
2cat > docker-compose.yml << 'EOF'
3services:
4 tooljet:
5 image: tooljet/tooljet-ce:latest
6 ports:
7 - "80:80"
8 environment:
9 TOOLJET_HOST: http://localhost
10 PG_HOST: postgres
11 PG_DB: ${POSTGRES_DB}
12 PG_USER: ${POSTGRES_USER}
13 PG_PASS: ${POSTGRES_PASSWORD}
14 LOCKBOX_MASTER_KEY: ${LOCKBOX_KEY}
15 SECRET_KEY_BASE: ${SECRET_KEY}
16 REDIS_HOST: redis
17 depends_on:
18 postgres:
19 condition: service_healthy
20 redis:
21 condition: service_started
22 networks:
23 - tooljet-net
24 restart: unless-stopped
25
26 postgres:
27 image: postgres:16-alpine
28 environment:
29 POSTGRES_USER: ${POSTGRES_USER}
30 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
31 POSTGRES_DB: ${POSTGRES_DB}
32 volumes:
33 - postgres_data:/var/lib/postgresql/data
34 healthcheck:
35 test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
36 interval: 10s
37 timeout: 5s
38 retries: 5
39 networks:
40 - tooljet-net
41 restart: unless-stopped
42
43 redis:
44 image: redis:7-alpine
45 volumes:
46 - redis_data:/data
47 networks:
48 - tooljet-net
49 restart: unless-stopped
50
51volumes:
52 postgres_data:
53 redis_data:
54
55networks:
56 tooljet-net:
57 driver: bridge
58EOF
59
60# 2. Create the .env file
61cat > .env << 'EOF'
62# PostgreSQL
63POSTGRES_USER=tooljet
64POSTGRES_PASSWORD=secure_postgres_password
65POSTGRES_DB=tooljet
66
67# ToolJet
68LOCKBOX_KEY=$(openssl rand -hex 32)
69SECRET_KEY=$(openssl rand -hex 64)
70EOF
71
72# 3. Start the services
73docker compose up -d
74
75# 4. View logs
76docker compose logs -f

One-Liner

Run this command to download and set up the recipe in one step:

terminal
1curl -fsSL https://docker.recipes/api/recipes/tooljet-internal/run | bash

Troubleshooting

  • ToolJet shows database connection errors: Verify POSTGRES_USER, POSTGRES_PASSWORD, and POSTGRES_DB environment variables match between services, and ensure PostgreSQL health check is passing
  • Application loads slowly or timeouts occur: Check Redis container status and increase Redis memory allocation, verify REDIS_HOST environment variable points to redis service name
  • ToolJet fails to start with 'Lockbox key invalid': Generate a new 32-character LOCKBOX_MASTER_KEY and SECRET_KEY_BASE using secure random generators, restart all services after updating
  • PostgreSQL container exits with permission errors: Ensure postgres_data volume has correct ownership permissions, or remove volume and recreate with proper Docker user mapping
  • Redis data loss after container restart: Add Redis persistence configuration by mounting redis.conf with save intervals, or accept ephemeral cache behavior for session-only data
  • ToolJet web interface shows 502 Bad Gateway: Check if ToolJet container finished initialization by examining logs for 'Server running on port 80' message, database migrations may still be processing

Community Notes

Loading...
Loading notes...

Download Recipe Kit

Get all files in a ready-to-deploy package

Includes docker-compose.yml, .env template, README, and license

Ad Space