ToolJet Internal Tools
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:latest4 ports: 5 - "80:80"6 environment: 7 TOOLJET_HOST: http://localhost8 PG_HOST: postgres9 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: redis15 depends_on: 16 postgres: 17 condition: service_healthy18 redis: 19 condition: service_started20 networks: 21 - tooljet-net22 restart: unless-stopped2324 postgres: 25 image: postgres:16-alpine26 environment: 27 POSTGRES_USER: ${POSTGRES_USER}28 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}29 POSTGRES_DB: ${POSTGRES_DB}30 volumes: 31 - postgres_data:/var/lib/postgresql/data32 healthcheck: 33 test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]34 interval: 10s35 timeout: 5s36 retries: 537 networks: 38 - tooljet-net39 restart: unless-stopped4041 redis: 42 image: redis:7-alpine43 volumes: 44 - redis_data:/data45 networks: 46 - tooljet-net47 restart: unless-stopped4849volumes: 50 postgres_data: 51 redis_data: 5253networks: 54 tooljet-net: 55 driver: bridge.env Template
.env
1# PostgreSQL2POSTGRES_USER=tooljet3POSTGRES_PASSWORD=secure_postgres_password4POSTGRES_DB=tooljet56# ToolJet7LOCKBOX_KEY=$(openssl rand -hex 32)8SECRET_KEY=$(openssl rand -hex 64)Usage Notes
- 1ToolJet at http://localhost
- 2Drag-and-drop UI builder
- 3Connect to databases, APIs, and more
- 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 file2cat > docker-compose.yml << 'EOF'3services:4 tooljet:5 image: tooljet/tooljet-ce:latest6 ports:7 - "80:80"8 environment:9 TOOLJET_HOST: http://localhost10 PG_HOST: postgres11 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: redis17 depends_on:18 postgres:19 condition: service_healthy20 redis:21 condition: service_started22 networks:23 - tooljet-net24 restart: unless-stopped2526 postgres:27 image: postgres:16-alpine28 environment:29 POSTGRES_USER: ${POSTGRES_USER}30 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}31 POSTGRES_DB: ${POSTGRES_DB}32 volumes:33 - postgres_data:/var/lib/postgresql/data34 healthcheck:35 test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]36 interval: 10s37 timeout: 5s38 retries: 539 networks:40 - tooljet-net41 restart: unless-stopped4243 redis:44 image: redis:7-alpine45 volumes:46 - redis_data:/data47 networks:48 - tooljet-net49 restart: unless-stopped5051volumes:52 postgres_data:53 redis_data:5455networks:56 tooljet-net:57 driver: bridge58EOF5960# 2. Create the .env file61cat > .env << 'EOF'62# PostgreSQL63POSTGRES_USER=tooljet64POSTGRES_PASSWORD=secure_postgres_password65POSTGRES_DB=tooljet6667# ToolJet68LOCKBOX_KEY=$(openssl rand -hex 32)69SECRET_KEY=$(openssl rand -hex 64)70EOF7172# 3. Start the services73docker compose up -d7475# 4. View logs76docker compose logs -fOne-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 | bashTroubleshooting
- 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
Components
tooljetpostgresqlredis
Tags
#tooljet#internal-tools#low-code#dashboards#admin
Category
Productivity & CollaborationAd Space
Shortcuts: C CopyF FavoriteD Download