Docker containers are for production hosting or self-hosting, for the contribution please check the Local Setup.
This guide provides step-by-step instructions to install and configure the Twenty application using Docker Compose. The aim is to make the process straightforward and prevent common pitfalls that could break your setup.
Important: Only modify settings explicitly mentioned in this guide. Altering other configurations may lead to issues.
See docs Setup Environment Variables for advanced configuration. All environment variables must be declared in the docker-compose.yml file at the server and / or worker level depending on the variable.
Install the latest stable version of Twenty with a single command:
bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
To install a specific version or branch:
VERSION=vx.y.z BRANCH=branch-name bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
Follow these steps for a manual setup.
Create the .env File
Copy the example environment file to a new .env file in your working directory:
curl -o .env https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/.env.example
Generate Secret Tokens
Run the following command to generate a unique random string:
openssl rand -base64 32
Important: Keep this value secret / do not share it.
Update the .env
Replace the placeholder value in your .env file with the generated token:
APP_SECRET=first_random_string
Set the Postgres Password
Update the PG_DATABASE_PASSWORD value in the .env file with a strong password without special characters.
PG_DATABASE_PASSWORD=my_strong_password
Download the docker-compose.yml file to your working directory:
curl -o docker-compose.yml https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/docker-compose.yml
Start the Docker containers:
docker compose up -d
If you host twentyCRM on your own computer, open your browser and navigate to http://localhost:3000.
If you host it on a server, check that the server is running and that everything is ok with
curl http://localhost:3000
By default, Twenty runs on localhost at port 3000. To access it via an external domain or IP address, you need to configure the SERVER_URL in your .env file.
SERVER_URLhttp or https depending on your setup.
http if you haven't set up SSL.https if you have SSL configured.80 for http, 443 for https).SSL (HTTPS) is required for certain browser features to work properly. While these features might work during local development (as browsers treat localhost differently), a proper SSL setup is needed when hosting Twenty on a regular domain.
For example, the clipboard API might require a secure context - some features like copy buttons throughout the application might not work without HTTPS enabled.
We strongly recommend setting up Twenty behind a reverse proxy with SSL termination for optimal security and functionality.
SERVER_URLDetermine Your Access URL
Without Reverse Proxy (Direct Access):
If you're accessing the application directly without a reverse proxy:
SERVER_URL=http://your-domain-or-ip:3000
With Reverse Proxy (Standard Ports):
If you're using a reverse proxy like Nginx or Traefik and have SSL configured:
SERVER_URL=https://your-domain-or-ip
With Reverse Proxy (Custom Ports):
If you're using non-standard ports:
SERVER_URL=https://your-domain-or-ip:custom-port
Update the .env File
Open your .env file and update the SERVER_URL:
SERVER_URL=http(s)://your-domain-or-ip:your-port
Examples:
SERVER_URL=http://123.45.67.89:3000
SERVER_URL=https://mytwentyapp.com
Restart the Application
For changes to take effect, restart the Docker containers:
docker compose down
docker compose up -d
Reverse Proxy Configuration:
Ensure your reverse proxy forwards requests to the correct internal port (3000 by default). Configure SSL termination and any necessary headers.
Firewall Settings:
Open necessary ports in your firewall to allow external access.
Consistency:
The SERVER_URL must match how users access your application in their browsers.
Data Volumes:
The Docker Compose configuration uses volumes to persist data for the database and server storage.
Stateless Environments:
If deploying to a stateless environment (e.g., certain cloud services), configure external storage to persist data.
If you encounter any problem, check Troubleshooting for solutions.
As an open-source company, we welcome contributions through Github. Help us keep it up-to-date, accurate, and easy to understand by getting involved and sharing your ideas!
