---
title: Docker Setup
sidebar_position: 3
description: Set up the project with Docker
sidebar_custom_props:
  icon: TbBrandDocker
---

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

This guide will walk you through provisioning the project with Docker. This comes with the following advantages:
- It provides the exact same environment as the core development team.
- It includes some extra dependencies (such as `playwright`) that you might need if you wish to contribute to some advanced areas of the project.
- It provisions a PostgreSQL database.

:::info
Avoid setting up the project with Docker if you are a Windows (WSL) user, unless you have experience with it, as it will make troubleshooting harder.
If you are a Windows user, it's better to use the [yarn installation](/start/local-setup/yarn-setup).
:::

## Prerequisites

Make sure you have the latest [Docker](https://docs.docker.com/get-docker/) and [git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) versions installed on your computer.

You can run `docker --version` to verify the installation.

## Step 1: Git Clone

In your terminal, run the following command:

:::info Note

It's better to use SSH for this step. If you already haven't set up SSH keys, please do so first. You can learn more about it [here](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/about-ssh). 

:::

<Tabs>
<TabItem value="ssh" label="SSH (Recommended)" default>

```bash
git clone git@github.com:twentyhq/twenty.git
```
</TabItem>
<TabItem value="https" label="HTTPS" >

```bash
git clone https://github.com/twentyhq/twenty.git
```

</TabItem>
</Tabs>

## Step 2: Setup environment variables

You need to set some environment variables before you can work on the project. Locally, it's better to set them through `.env` files.

```bash
cd twenty
cp ./packages/twenty-front/.env.example ./packages/twenty-front/.env
cp ./packages/twenty-server/.env.example ./packages/twenty-server/.env
echo "# ———————— Docker setup ———————— " >> ./packages/twenty-server/.env
echo "TAG=latest" >> ./packages/twenty-server/.env
echo "POSTGRES_ADMIN_PASSWORD=twenty" >> ./packages/twenty-server/.env
echo "LOCAL_SERVER_URL=http://localhost:3001" >> ./packages/twenty-server/.env
```

The default values should work out of the box, except for the postgres URL, which requires a small modification.

Open `./packages/twenty-server/.env` and change to the following:

```bash
PG_DATABASE_URL=postgres://twenty:twenty@postgres:5432/default
```


## Step 3: Build

The project includes an environment containerized with Docker and orchestrated with `docker-compose`.
This installation method will also provision a PostgreSQL container.


```bash
make docker-dev-build
```

## Step 4: Migrate & seed

Before running the project, you need to initialize the database by running the migrations and seed.

Start the containers:
```bash
make docker-dev-up
```

Setup database, run migrations, and seed:
```bash
make docker-dev-sh
yarn
yarn nx database:reset twenty-server
```

## Step 5: Start Twenty

Run the project with the following commands from the `root` folder:

```bash
make docker-dev-sh
yarn nx start twenty-server
```

and in a separate terminal:
```bash
make docker-dev-sh
yarn nx start twenty-front
```

You should now have:
- **Frontend** available on: [http://localhost:3001](http://localhost:3001)
- **Server** available on: [http://localhost:3000/graphql](http://localhost:3000/graphql)
- **Postgres** available on [http://localhost:5432](http://localhost:5432) and containing database named `default`

Sign in using a seeded demo account `tim@apple.dev` (password: `Applecar2025`) to start using Twenty.

## Step 6: Configure your IDE

As you are executing the project inside a Docker container, you need to configure your IDE to use the same environment.
You can find the instructions for your IDE in our [IDE setup](/start/local-setup/ide-setup) guide.

### Troubleshooting

#### Docker throws errors while setting up local environment

If by any chance you run into problems with Docker, you should change the `docker-compose` to `docker compose` in `./infra/dev/Makefile` as `docker-compose` is an old version
that's becoming obsolete. (You can find more info [here](https://docs.docker.com/compose/migrate/))
