2024-03-27 23:28:03 +03:00
#!/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
2024-03-29 17:25:41 +03:00
# 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
2024-03-27 23:28:03 +03:00
# 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) }
2024-10-22 23:19:46 +03:00
branch = ${ BRANCH :- $version }
2024-03-27 23:28:03 +03:00
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; }
2024-10-22 23:19:46 +03:00
# Copy twenty/packages/twenty-docker/docker-compose.yml in it
2024-03-27 23:43:50 +03:00
echo -e "\t• Copying docker-compose.yml"
2024-04-03 17:38:28 +03:00
curl -sLo docker-compose.yml https://raw.githubusercontent.com/twentyhq/twenty/$branch /packages/twenty-docker/docker-compose.yml
2024-03-27 23:28:03 +03:00
2024-04-03 17:38:28 +03:00
# Copy twenty/packages/twenty-docker/.env.example to .env
2024-03-27 23:43:50 +03:00
echo -e "\t• Setting up .env file"
2024-04-03 17:38:28 +03:00
curl -sLo .env https://raw.githubusercontent.com/twentyhq/twenty/$branch /packages/twenty-docker/.env.example
2024-03-27 23:28:03 +03:00
# 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
2024-03-29 17:25:41 +03:00
echo "# === Randomly generated secrets ===" >>.env
2024-03-27 23:28:03 +03:00
echo " ACCESS_TOKEN_SECRET= $( openssl rand -base64 32) " >>.env
echo " LOGIN_TOKEN_SECRET= $( openssl rand -base64 32) " >>.env
echo " REFRESH_TOKEN_SECRET= $( openssl rand -base64 32) " >>.env
echo " FILE_TOKEN_SECRET= $( openssl rand -base64 32) " >>.env
2024-03-29 17:25:41 +03:00
echo "" >>.env
echo " POSTGRES_ADMIN_PASSWORD= $( openssl rand -base64 32) " >>.env
2024-03-27 23:28:03 +03:00
2024-03-27 23:43:50 +03:00
echo -e "\t• .env configuration completed"
2024-03-27 23:28:03 +03:00
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
2024-09-14 12:05:43 +03:00
sed -E -i '' " s|^SERVER_URL=http://localhost:[0-9]+|SERVER_URL=http://localhost: $new_port |g " .env
2024-03-27 23:28:03 +03:00
else
sed -i'' " s/ $port : $port / $new_port : $port /g " docker-compose.yml
2024-09-14 12:05:43 +03:00
sed -E -i'' " s|^SERVER_URL=http://localhost:[0-9]+|SERVER_URL=http://localhost: $new_port |g " .env
2024-03-27 23:28:03 +03:00
fi
port = $new_port
done
fi
2024-05-24 19:03:55 +03:00
# Ask user if they want to start the project
2024-03-27 23:28:03 +03:00
read -p "🚀 Do you want to start the project now? (Y/n) " answer
if [ " $answer " = "n" ] ; then
2024-04-07 12:14:20 +03:00
echo "✅ Project setup completed. Run 'docker compose up -d' to start."
2024-03-27 23:28:03 +03:00
exit 0
else
echo "🐳 Starting Docker containers..."
docker compose up -d
# Check if port is listening
2024-03-29 17:25:41 +03:00
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 = $!
2024-03-27 23:28:03 +03:00
while [ ! $( docker inspect --format= '{{.State.Health.Status}}' twenty-server-1) = "healthy" ] ; do
sleep 1
done
2024-03-29 17:25:41 +03:00
kill $pid
2024-03-27 23:28:03 +03:00
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
}
2024-05-24 19:03:55 +03:00
# Ask user if they want to open the project
2024-03-27 23:28:03 +03:00
# 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