--- title: Docker Compose sidebar_position: 3 sidebar_custom_props: icon: TbBrandDocker --- # Step by step instructions: 1. Copy the [.env.example](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/.env.example) into a `.env` in the same directory where your `docker-compose.yml` file will be 2. Run the command `openssl rand -base64 32` three times, make note of the string for each 3. In your .env file, replace the three "replace_me_with_a_random_string_access" with the three random strings you just generated. ``` ACCESS_TOKEN_SECRET=replace_me_with_a_random_string_access LOGIN_TOKEN_SECRET=replace_me_with_a_random_string_login REFRESH_TOKEN_SECRET=replace_me_with_a_random_string_refresh ``` 4. Create a `docker-compose.yml` file from the example below. 5. Run the command `docker-compose up -d` 6. Go to http://localhost:3001 and see your docker instance. ## Troubleshooting ### Not able to login If you encounter errors, (not able to log into the application after inputting an email) after the inital setup, try running `docker exec -it twenty-backend-1 yarn database:reset` and see if that solves your issue. ### Cannot connect to server, running behind a reverse proxy Complete step three and four with : 3. Add `SERVER_URL=https://` to your `.env` 4. Uncomment `SERVER_URL=${SERVER_URL}` in your `docker-compose.yml` ## Production docker containers Prebuilt images for both Postgres, frontend, and back-end can be found on [docker hub](https://hub.docker.com/r/twentycrm/). Note that the Postgres container will not persist data if your server is not configured to be stateful (e.g. Heroku). You probably want to configure a special stateful resource for the database. ## Environment Variables - Copy this `.env.example` file into a `.env` in the same directory as your `docker-compose.yml` file - Find the `.env.example` [here](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/.env.example). ## Docker Compose file We will soon update the documentation with an up-to-date docker compose file. Here is one that was proposed on Discord by a community member: ```yaml version: "3.9" services: twenty: image: twentycrm/twenty-front:${TAG} ports: - 3001:3000 environment: - SIGN_IN_PREFILLED=${SIGN_IN_PREFILLED} - REACT_APP_SERVER_BASE_URL=${LOCAL_SERVER_URL} depends_on: - backend backend: image: twentycrm/twenty-server:${TAG} ports: - 3000:3000 environment: - SIGN_IN_PREFILLED=${SIGN_IN_PREFILLED} - PG_DATABASE_URL=${PG_DATABASE_URL} - FRONT_BASE_URL=${FRONT_BASE_URL} - PORT=3000 - STORAGE_TYPE=local - STORAGE_LOCAL_PATH=.local-storage - ACCESS_TOKEN_SECRET=${ACCESS_TOKEN_SECRET} - LOGIN_TOKEN_SECRET=${LOGIN_TOKEN_SECRET} - REFRESH_TOKEN_SECRET=${REFRESH_TOKEN_SECRET} # Uncomment if behind a reverse proxy # - SERVER_URL=${SERVER_URL} depends_on: - db db: image: twentycrm/twenty-postgres:${TAG} volumes: - twenty-db-data:/var/lib/postgresql/data environment: - POSTGRES_PASSWORD=${POSTGRES_ADMIN_PASSWORD} volumes: twenty-db-data: ```