Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/jAtInn71/chatwoot-costom/llms.txt

Use this file to discover all available pages before exploring further.

Chatwoot Custom ships as a standard Docker Compose stack. This page covers the two ways to get the application image, the full set of environment variables you need to configure, the four services the stack runs, and the commands you’ll use day-to-day.

Image options

The fastest path. Pull the image from Docker Hub — no Node.js, no build time.
docker pull jatin4002/chatwoot-custom:latest
The docker-compose.yaml in the repository already references this image for both the rails and sidekiq services:
image: jatin4002/chatwoot-custom:latest
No changes to docker-compose.yaml are needed when you use this image. Run docker compose up -d after setting up your .env file.
Use pull_policy: always (already set in the default Compose file) to automatically pull newer tags on each docker compose up.

Environment variables

Copy .env.example to .env and fill in these values before starting the stack:
cp .env.example .env

Required

VariableDescription
FRONTEND_URLPublic URL of the Chatwoot install. Use http://localhost:3000 for local testing. Voice/mic features require HTTPS on public deployments.
SECRET_KEY_BASELong random string for Rails session encryption. Generate with docker run --rm chatwoot/chatwoot:latest rails secret. Never reuse across environments.
POSTGRES_PASSWORDPassword for the bundled PostgreSQL container.
REDIS_PASSWORDPassword for the bundled Redis container. Must also appear in REDIS_URL.

Database

VariableDefaultDescription
POSTGRES_DATABASEchatwoot_prodDatabase name
POSTGRES_USERNAMEchatwoot_prodDatabase user
POSTGRES_HOSTpostgresHostname of the postgres service (matches the Compose service name)
POSTGRES_PORT5432PostgreSQL port

Redis

VariableDescription
REDIS_URLFull Redis connection string, e.g. redis://:YOUR_SECURE_REDIS_PASSWORD@redis:6379

Rails runtime

VariableDefaultDescription
RAILS_ENVproductionRails environment
FORCE_SSLfalseSet to true to redirect all HTTP traffic to HTTPS. Requires a valid TLS certificate.
RAILS_LOG_LEVELinfoLog verbosity (debug, info, warn, error)
RAILS_MAX_THREADS5Puma thread count; also sets the database pool size
Set FORCE_SSL=true only when your reverse proxy or load balancer handles TLS termination. Enabling it without a valid certificate will make the application unreachable.

Services

The Compose stack runs four services:
ServiceImagePurpose
postgrespgvector/pgvector:pg14Primary database. Includes the pgvector extension for future vector search support. Data persisted to the postgres_data volume.
redisredis:7-alpineCache and background job queue. Password-protected via REDIS_PASSWORD. Data persisted to the redis_data volume.
railsjatin4002/chatwoot-custom:latestWeb application server. Runs db:chatwoot_prepare on startup to apply migrations, then starts Puma on port 3000 (mapped to host port 3001).
sidekiqjatin4002/chatwoot-custom:latestBackground job worker. Shares the same image as rails and uses the same .env file.
Both rails and sidekiq wait for postgres and redis to pass their health checks before starting.
The rails service is mapped to host port 3001, not 3000. If you’re accessing the dashboard directly (without a reverse proxy), use http://localhost:3001. Set FRONTEND_URL to match.

Useful commands

# Start everything in the background
docker compose up -d

# Stop and remove containers (data volumes are preserved)
docker compose down

# Tail Rails logs
docker compose logs -f rails

# Restart the Rails process after editing mounted volumes
docker compose restart rails

# Open a Rails console
docker compose exec rails rails c

# Open a shell inside the Rails container
docker compose exec rails bash
To search for voice-agent log lines on Linux/macOS:
docker compose logs rails | grep VOICE-AGENT

HTTPS and voice features

Browser microphone access requires a secure context. This means:
  • http://localhost — works for local development
  • Any other HTTP origin — microphone blocked by the browser; the voice button will not work
For staging or production, put Chatwoot Custom behind a reverse proxy (nginx, Caddy, Traefik) that terminates TLS, or use a tunnel service such as ngrok or cloudflared. Set FRONTEND_URL to the HTTPS URL and, optionally, set FORCE_SSL=true to redirect HTTP visitors automatically.

Build docs developers (and LLMs) love