mirror of
				https://github.com/lingble/twenty.git
				synced 2025-10-30 04:12:28 +00:00 
			
		
		
		
	 736635a94b
			
		
	
	736635a94b
	
	
	
		
			
			We will remove the `twenty-postgres` image that was used for local development and only use `twenty-postgres-pilo` (which we use in prod), bringing the development environment closer to prod and avoiding having to maintain 2 images. Instead of provisioning the super user after the db initialization, we directly rely on the superuser provided by Spilo for simplicity. We also introduce a change that tries to create the right database (`default` or `test`) based on the context. How to test: ``` docker build -t twentycrm/twenty-postgres-spilo:latest -f ./packages/twenty-docker/twenty-postgres-spilo/Dockerfile . docker images --no-trunc | grep twenty-postgres-spilo postgres-on-docker: docker run \ --name twenty_pg \ -e PGUSER_SUPERUSER=twenty \ -e PGPASSWORD_SUPERUSER=twenty \ -e ALLOW_NOSSL=true \ -v twenty_db_data:/home/postgres/pgdata \ -p 5432:5432 \ REPLACE_WITH_IMAGE_ID ```
		
			
				
	
	
		
			167 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | ||
| 
 | ||
| echo "🔧 Checking dependencies..."
 | ||
| if ! command -v docker &>/dev/null; then
 | ||
|   echo -e "\t❌ Docker is not installed or not in PATH. Please install Docker first.\n\t\tSee https://docs.docker.com/get-docker/"
 | ||
|   exit 1
 | ||
| fi
 | ||
| # Check if docker compose plugin is installed
 | ||
| if ! docker compose version &>/dev/null; then
 | ||
|   echo -e "\t❌ Docker Compose is not installed or not in PATH (n.b. docker-compose is deprecated)\n\t\tUpdate docker or install docker-compose-plugin\n\t\tOn Linux: sudo apt-get install docker-compose-plugin\n\t\tSee https://docs.docker.com/compose/install/"
 | ||
|   exit 1
 | ||
| fi
 | ||
| # Check if docker is started
 | ||
| if ! docker info &>/dev/null; then
 | ||
|   echo -e "\t❌ Docker is not running.\n\t\tPlease start Docker Desktop, Docker or check documentation at https://docs.docker.com/config/daemon/start/"
 | ||
|   exit 1
 | ||
| fi
 | ||
| if ! command -v curl &>/dev/null; then
 | ||
|   echo -e "\t❌ Curl is not installed or not in PATH.\n\t\tOn macOS: brew install curl\n\t\tOn Linux: sudo apt install curl"
 | ||
|   exit 1
 | ||
| fi
 | ||
| 
 | ||
| # Check if docker compose version is >= 2
 | ||
| if [ "$(docker compose version --short | cut -d' ' -f3 | cut -d'.' -f1)" -lt 2 ]; then
 | ||
|   echo -e "\t❌ Docker Compose is outdated. Please update Docker Compose to version 2 or higher.\n\t\tSee https://docs.docker.com/compose/install/linux/"
 | ||
|   exit 1
 | ||
| fi
 | ||
| # Check if docker-compose is installed, if so issue a warning if version is < 2
 | ||
| if command -v docker-compose &>/dev/null; then
 | ||
|   if [ "$(docker-compose version --short | cut -d' ' -f3 | cut -d'.' -f1)" -lt 2 ]; then
 | ||
|     echo -e "\n\t⚠️ 'docker-compose' is installed but outdated. Make sure to use 'docker compose' or to upgrade 'docker-compose' to version 2.\n\t\tSee https://docs.docker.com/compose/install/standalone/\n"
 | ||
|   fi
 | ||
| fi
 | ||
| 
 | ||
| # Catch errors
 | ||
| set -e
 | ||
| function on_exit {
 | ||
|   # $? is the exit status of the last command executed
 | ||
|   local exit_status=$?
 | ||
|   if [ $exit_status -ne 0 ]; then
 | ||
|     echo "❌ Something went wrong, exiting: $exit_status"
 | ||
|   fi
 | ||
| }
 | ||
| trap on_exit EXIT
 | ||
| 
 | ||
| # Use environment variables VERSION and BRANCH, with defaults if not set
 | ||
| version=${VERSION:-$(curl -s https://api.github.com/repos/twentyhq/twenty/releases/latest | grep '"tag_name":' | cut -d '"' -f 4)}
 | ||
| branch=${BRANCH:-$version}
 | ||
| 
 | ||
| echo "🚀 Using version $version and branch $branch"
 | ||
| 
 | ||
| dir_name="twenty"
 | ||
| function ask_directory {
 | ||
|   read -p "📁 Enter the directory name to setup the project (default: $dir_name): " answer
 | ||
|   if [ -n "$answer" ]; then
 | ||
|     dir_name=$answer
 | ||
|   fi
 | ||
| }
 | ||
| 
 | ||
| ask_directory
 | ||
| 
 | ||
| while [ -d "$dir_name" ]; do
 | ||
|   read -p "🚫 Directory '$dir_name' already exists. Do you want to overwrite it? (y/N) " answer
 | ||
|   if [ "$answer" = "y" ]; then
 | ||
|     break
 | ||
|   else
 | ||
|     ask_directory
 | ||
|   fi
 | ||
| done
 | ||
| 
 | ||
| # Create a directory named twenty
 | ||
| echo "📁 Creating directory '$dir_name'"
 | ||
| mkdir -p "$dir_name" && cd "$dir_name" || { echo "❌ Failed to create/access directory '$dir_name'"; exit 1; }
 | ||
| 
 | ||
| # Copy twenty/packages/twenty-docker/docker-compose.yml in it
 | ||
| echo -e "\t• Copying docker-compose.yml"
 | ||
| curl -sLo docker-compose.yml https://raw.githubusercontent.com/twentyhq/twenty/$branch/packages/twenty-docker/docker-compose.yml
 | ||
| 
 | ||
| # Copy twenty/packages/twenty-docker/.env.example to .env
 | ||
| echo -e "\t• Setting up .env file"
 | ||
| curl -sLo .env https://raw.githubusercontent.com/twentyhq/twenty/$branch/packages/twenty-docker/.env.example
 | ||
| 
 | ||
| # Replace TAG=latest by TAG=<latest_release or version input>
 | ||
| if [[ $(uname) == "Darwin" ]]; then
 | ||
|   # Running on macOS
 | ||
|   sed -i '' "s/TAG=latest/TAG=$version/g" .env
 | ||
| else
 | ||
|   # Assuming Linux
 | ||
|   sed -i'' "s/TAG=latest/TAG=$version/g" .env
 | ||
| fi
 | ||
| 
 | ||
| # Generate random strings for secrets
 | ||
| echo "# === Randomly generated secrets ===" >>.env
 | ||
| echo "APP_SECRET=$(openssl rand -base64 32)" >>.env
 | ||
| echo "" >>.env
 | ||
| echo "PGPASSWORD_SUPERUSER=$(openssl rand -hex 16)" >>.env
 | ||
| 
 | ||
| echo -e "\t• .env configuration completed"
 | ||
| 
 | ||
| port=3000
 | ||
| # Check if command nc is available
 | ||
| if command -v nc &> /dev/null; then
 | ||
|   # Check if port 3000 is already in use, propose to change it
 | ||
|   while nc -zv localhost $port &>/dev/null; do
 | ||
|     read -p "🚫 Port $port is already in use. Do you want to use another port? (Y/n) " answer
 | ||
|     if [ "$answer" = "n" ]; then
 | ||
|       continue
 | ||
|     fi
 | ||
|     read -p "Enter a new port number: " new_port
 | ||
|     if [[ $(uname) == "Darwin" ]]; then
 | ||
|       sed -i '' "s/$port:$port/$new_port:$port/g" docker-compose.yml
 | ||
|       sed -E -i '' "s|^SERVER_URL=http://localhost:[0-9]+|SERVER_URL=http://localhost:$new_port|g" .env
 | ||
|     else
 | ||
|       sed -i'' "s/$port:$port/$new_port:$port/g" docker-compose.yml
 | ||
|       sed -E -i'' "s|^SERVER_URL=http://localhost:[0-9]+|SERVER_URL=http://localhost:$new_port|g" .env
 | ||
|     fi
 | ||
|     port=$new_port
 | ||
|   done
 | ||
| fi
 | ||
| 
 | ||
| # Ask user if they want to start the project
 | ||
| read -p "🚀 Do you want to start the project now? (Y/n) " answer
 | ||
| if [ "$answer" = "n" ]; then
 | ||
|   echo "✅ Project setup completed. Run 'docker compose up -d' to start."
 | ||
|   exit 0
 | ||
| else
 | ||
|   echo "🐳 Starting Docker containers..."
 | ||
|   docker compose up -d
 | ||
|   # Check if port is listening
 | ||
|   echo "Waiting for server to be healthy, it might take a few minutes while we initialize the database..."
 | ||
|   # Tail logs of the server until it's ready
 | ||
|   docker compose logs -f server &
 | ||
|   pid=$!
 | ||
|   while [ ! $(docker inspect --format='{{.State.Health.Status}}' twenty-server-1) = "healthy" ]; do
 | ||
|     sleep 1
 | ||
|   done
 | ||
|   kill $pid
 | ||
|   echo ""
 | ||
|   echo "✅ Server is up and running"
 | ||
| fi
 | ||
| 
 | ||
| function ask_open_browser {
 | ||
|   read -p "🌐 Do you want to open the project in your browser? (Y/n) " answer
 | ||
|   if [ "$answer" = "n" ]; then
 | ||
|     echo "✅ Setup completed. Access your project at http://localhost:$port"
 | ||
|     exit 0
 | ||
|   fi
 | ||
| }
 | ||
| 
 | ||
| # Ask user if they want to open the project
 | ||
| # Running on macOS
 | ||
| if [[ $(uname) == "Darwin" ]]; then
 | ||
|   ask_open_browser
 | ||
| 
 | ||
|   open "http://localhost:$port"
 | ||
| # Assuming Linux
 | ||
| else
 | ||
|   # xdg-open is not installed, we could be running in a non gui environment
 | ||
|   if command -v xdg-open >/dev/null 2>&1; then
 | ||
|     ask_open_browser
 | ||
| 
 | ||
|     xdg-open "http://localhost:$port"
 | ||
|   else
 | ||
|     echo "✅ Setup completed. Your project is available at http://localhost:$port"
 | ||
|   fi
 | ||
| fi
 |