#!/bin/sh # This is the Likelava install script! # Read more https://...... # # To install using this method run on Linux: # curl https://install.likelava.io/ | sudo sh # Root access is needed to install system packages # Likelava currently supports this alternative method on Linux. # We wrap this whole script in a function, so that we won't execute # until the entire script is downloaded. # That's good because it prevents our output overlapping with curl's. # It also means that we can't run a partially downloaded script. # We don't indent because it would be really confusing with the heredocs. run_it () { RELEASE="1.0.0" CAPROVER_VERSION="1.12.0" CAPROVER_CLI_VERSION="v2.1.1" # PLEASE FILL THIS BEFORE RUNNING INSTALLATION_DOMAIN="$(date +'%Y%m%d').likelava.io" SMTP_HOST="" SMTP_PWD="" SMTP_PORT="465" SMTP_USER="" SUPER_ADMIN_EMAIL="" # Now, on to the actual installer! # Check privilege access if [ "$(id -u)" -ne 0 ]; then echo "This script requires root privileges. Please run it as root or using sudo." exit 1 fi ## NOTE sh NOT bash. This script should be POSIX sh only, since we don't ## know what shell the user has. Debian uses 'dash' for 'sh', for ## example. set -e set -u # Let's display everything on stderr. exec 1>&2 echo "************ Checking information system ************\n" UNAME=$(uname) # Check OS. if [ "$UNAME" != "Linux" ] ; then echo "Sorry, this OS is not supported yet via this installer." exit 1 fi echo "OS is ok" # Check OS Arch LINUX_ARCH=$(uname -m) if [ "${LINUX_ARCH}" = "x86_64" ] ; then PLATFORM="os.linux.x86_64" echo "Arch is ok" else echo "Unusable architecture: ${LINUX_ARCH}" echo "Likelava only supports x86_64 for now." exit 1 fi # Check OS name LINUX_OS_NAME=$(lsb_release -si) if [ "${LINUX_OS_NAME}" != "Ubuntu" ]; then echo "Unusable architecture: ${LINUX_OS_NAME}" exit 1 fi echo "OS release is ok" if ! command -v curl > /dev/null 2>&1 ; then echo "Curl is not installed. Please install it before continue." exit 1 fi echo "Curl is installed" if ! command -v ufw > /dev/null 2>&1 ; then echo "UFW is not installed. Please install it before continue." exit 1 fi echo "UFW is installed" if [ -z $HOME ] || [ ! -d $HOME ]; then echo "The installation and use of Likelava requires the \$HOME environment variable be set to a directory where its files can be installed." exit 1 fi echo "\$HOME is ok" trap "echo Installation failed." EXIT # Install prerequisites # Docker echo "\n************ Checking prerequisites ************\n" if command -v docker > /dev/null 2>&1 ; then echo "Docker is already installed" else echo "Docker is not installed. We need to proceed to Docker installation" curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - cat > /etc/apt/sources.list.d/docker.list < /captain/data/config-override.json echo "Installing Caprover" docker pull caprover/caprover:$CAPROVER_VERSION docker run -e ACCEPTED_TERMS=true -e MAIN_NODE_IP_ADDRESS='127.0.0.1' -p 80:80 -p 443:443 -p 3000:3000 -v /var/run/docker.sock:/var/run/docker.sock -v /captain:/captain caprover/caprover:$CAPROVER_VERSION echo "==============================================" echo "==============================================" echo "Waiting for CapRover to finish installation..." echo "==============================================" echo "==============================================" echo " " echo " " set +e CAPTAIN_INITED="" while [ -z "$CAPTAIN_INITED" ] do CAPTAIN_INITED=`docker service logs captain-captain --since 3s | grep "Captain is initialized"` docker service logs captain-captain --since 2s sleep 2 done set -e echo " " echo " " echo " " echo "===================================" echo "===================================" echo " **** Installation is done! ***** " echo "CapRover is available at http://$(ip route get 8.8.8.8 | awk '{print $7}'):3000" echo "Default password is: captain42" echo "===================================" echo "===================================" sleep 10 # Apps installation # TODO make this in json and read it echo "\n************ Installing Likelava apps ************\n" docker pull caprover/cli-caprover:$CAPROVER_CLI_VERSION echo " ------ Installing Postgres ------ " docker run caprover/cli-caprover:$CAPROVER_CLI_VERSION caprover api --caproverUrl "http://$INSTALLATION_DOMAIN" --caproverPassword "captain42" --path '/user/apps/appDefinitions/register' --method 'POST' --data "{\"appName\":\"postgres\",\"hasPersistentData\":true}" sleep 5 docker run caprover/cli-caprover:$CAPROVER_CLI_VERSION caprover api --caproverUrl "http://$INSTALLATION_DOMAIN" --caproverPassword "captain42" --path '/user/apps/appDefinitions/update' --method 'POST' --data "{\"appName\":\"postgres\", \"instanceCount\":1, \"notExposeAsWebApp\":true, \"envVars\": [{\"key\": \"POSTGRES_PASSWORD\" , \"value\": \"5b8a8b4df0fc9211\" }, {\"key\": \"POSTGRES_USER\" , \"value\": \"root\" }, {\"key\": \"POSTGRES_DB\" , \"value\": \"postgres\" }], \"volumes\": [{\"containerPath\":\"/var/lib/postgresql/data\", \"volumeName\":\"postgres\"}]}" sleep 5 docker run caprover/cli-caprover:$CAPROVER_CLI_VERSION caprover deploy --caproverUrl "http://$INSTALLATION_DOMAIN" --caproverPassword "captain42" -a "postgres" -i postgres:15.4 sleep 10 echo " ------ Installing Baserow ------ " docker run caprover/cli-caprover:$CAPROVER_CLI_VERSION caprover api --caproverUrl "http://$INSTALLATION_DOMAIN" --caproverPassword "captain42" --path '/user/apps/appDefinitions/register' --method 'POST' --data "{\"appName\":\"baserow\",\"hasPersistentData\":true}" # TODO # IP formt get is not valid for baserow # BASEROW_WEBHOOKS_IP_WHITELIST should be set manually or use BASEROW_WEBHOOKS_ALLOW_PRIVATE_ADDRESS # WHITELIST=$(ip addr show | awk '/inet / {print $2}' | grep $(ip route get 8.8.8.8 | awk '{print $7}')) # docker run caprover/cli-caprover:$CAPROVER_CLI_VERSION caprover api --caproverUrl "http://$INSTALLATION_DOMAIN" --caproverPassword "captain42" --path '/user/apps/appDefinitions/update' --method 'POST' --data "{\"appName\":\"baserow\", \"instanceCount\":1, \"websocketSupport\": true ,\"envVars\": [{\"key\":\"BASEROW_WEBHOOKS_IP_WHITELIST\", \"value\":\"$WHITELIST\"}, {\"key\":\"BASEROW_PUBLIC_URL\", \"value\":\"http://baserow.$INSTALLATION_DOMAIN\"}, {\"key\":\"EMAIL_SMTP\", \"value\":true}, {\"key\":\"EMAIL_SMTP_HOST\", \"value\":\"$SMTP_HOST\"}, {\"key\":\"EMAIL_SMTP_PORT\", \"value\":\"$SMTP_PORT\"}, {\"key\":\"EMAIL_SMTP_USER\", \"value\":\"$SMTP_USER\"} ,{\"key\":\"EMAIL_SMTP_PASSWORD\", \"value\":\"$SMTP_PWD\"},{\"key\":\"EMAIL_SMTP_USE_TLS\", \"value\":true}, {\"key\":\"FROM_EMAIL\", \"value\":\"no-reply@likelava.io\"}], \"volumes\": [{\"containerPath\":\"/baserow/data\", \"volumeName\":\"baserow\"}]}" sleep 5 docker run caprover/cli-caprover:$CAPROVER_CLI_VERSION caprover api --caproverUrl "http://$INSTALLATION_DOMAIN" --caproverPassword "captain42" --path '/user/apps/appDefinitions/update' --method 'POST' --data "{\"appName\":\"baserow\", \"instanceCount\":1, \"websocketSupport\": true ,\"envVars\": [{\"key\":\"BASEROW_PUBLIC_URL\", \"value\":\"http://baserow.$INSTALLATION_DOMAIN\"}, {\"key\":\"EMAIL_SMTP\", \"value\":true}, {\"key\":\"EMAIL_SMTP_HOST\", \"value\":\"$SMTP_HOST\"}, {\"key\":\"EMAIL_SMTP_PORT\", \"value\":\"$SMTP_PORT\"}, {\"key\":\"EMAIL_SMTP_USER\", \"value\":\"$SMTP_USER\"} ,{\"key\":\"EMAIL_SMTP_PASSWORD\", \"value\":\"$SMTP_PWD\"},{\"key\":\"EMAIL_SMTP_USE_TLS\", \"value\":true}, {\"key\":\"FROM_EMAIL\", \"value\":\"no-reply@likelava.io\"}], \"volumes\": [{\"containerPath\":\"/baserow/data\", \"volumeName\":\"baserow\"}]}" sleep 5 docker run caprover/cli-caprover:$CAPROVER_CLI_VERSION caprover deploy --caproverUrl "http://$INSTALLATION_DOMAIN" --caproverPassword "captain42" -a "baserow" -i baserow/baserow:1.20.2 sleep 10 echo " ------ Installing Cal.com ------ " docker run caprover/cli-caprover:$CAPROVER_CLI_VERSION caprover api --caproverUrl "http://$INSTALLATION_DOMAIN" --caproverPassword "captain42" --path '/user/apps/appDefinitions/register' --method 'POST' --data "{\"appName\":\"calcom\",\"hasPersistentData\":false}" sleep 5 docker run caprover/cli-caprover:$CAPROVER_CLI_VERSION caprover api --caproverUrl "http://$INSTALLATION_DOMAIN" --caproverPassword "captain42" --path '/user/apps/appDefinitions/update' --method 'POST' --data "{\"appName\":\"calcom\", \"instanceCount\":1, \"containerHttpPort\": 3000,\"envVars\": [{\"key\":\"NEXT_PUBLIC_WEBAPP_URL\", \"value\":\"http://calcom.$INSTALLATION_DOMAIN\"}, {\"key\":\"NEXTAUTH_SECRET\", \"value\":\"74c495f246d2b079708846e5b533f137\"}, {\"key\":\"CALENDSO_ENCRYPTION_KEY\", \"value\":\"afbcd85cdd9955a0118464a760a7de94\"}, {\"key\":\"POSTGRES_USER\", \"value\":\"root\"}, {\"key\":\"POSTGRES_PASSWORD\", \"value\":\"5b8a8b4df0fc9211\"}, {\"key\":\"POSTGRES_DB\", \"value\":\"calcom\"}, {\"key\":\"DATABASE_HOST\", \"value\":\"srv-captain--postgres:5432\"}, {\"key\":\"DATABASE_URL\", \"value\":\"postgresql://root:5b8a8b4df0fc9211@srv-captain--postgres:5432/calcom\"}, {\"key\":\"CALCOM_TELEMETRY_DISABLED\", \"value\":1}, {\"key\":\"EMAIL_SERVER_HOST\", \"value\":\"$SMTP_HOST\"}, {\"key\":\"EMAIL_SERVER_PORT\", \"value\":\"$SMTP_PORT\"}, {\"key\":\"EMAIL_SERVER_USER\", \"value\":\"$SMTP_USER\"}, {\"key\":\"EMAIL_SERVER_PASSWORD\", \"value\":\"$SMTP_PWD\"}, {\"key\":\"NODE_ENV\", \"value\":\"production\"}, {\"key\":\"EMAIL_FROM\", \"value\":\"no-reply@likelava.io\"}, {\"key\":\"NEXT_PUBLIC_DISABLE_SIGNUP\", \"value\":\"true\"}, {\"key\":\"NEXT_PUBLIC_API_V2_URL\", \"value\":\"http://calcom.$INSTALLATION_DOMAIN\"}]}" sleep 5 docker run caprover/cli-caprover:$CAPROVER_CLI_VERSION caprover deploy --caproverUrl "http://$INSTALLATION_DOMAIN" --caproverPassword "captain42" -a "calcom" -i calcom/cal.com:v4.5.3 sleep 10 echo " ------ Installing N8N ------ " # TODO # add to nginx conf # proxy_pass $upstream; # proxy_set_header Host $host; # proxy_set_header X-Real-IP $remote_addr; # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # proxy_set_header X-Forwarded-Proto $scheme; # proxy_buffering off; <= Add this here # proxy_cache off; <= Add this here docker run caprover/cli-caprover:$CAPROVER_CLI_VERSION caprover api --caproverUrl "http://$INSTALLATION_DOMAIN" --caproverPassword "captain42" --path '/user/apps/appDefinitions/register' --method 'POST' --data "{\"appName\":\"n8n\",\"hasPersistentData\":true}" sleep 5 docker run caprover/cli-caprover:$CAPROVER_CLI_VERSION caprover api --caproverUrl "http://$INSTALLATION_DOMAIN" --caproverPassword "captain42" --path '/user/apps/appDefinitions/update' --method 'POST' --data "{\"appName\":\"n8n\",\"websocketSupport\":true, \"instanceCount\":1, \"containerHttpPort\": 5678,\"envVars\": [{\"key\":\"GENERIC_TIMEZONE\", \"value\":\"Indian/Reunion\"}, {\"key\":\"TZ\", \"value\":\"Indian/Reunion\"}, {\"key\":\"NODE_ENV\", \"value\":\"production\"}, {\"key\":\"N8N_EDITOR_BASE_URL\", \"value\":\"http://n8n.$INSTALLATION_DOMAIN\"}, {\"key\":\"N8N_HOST\", \"value\":\"n8n.$INSTALLATION_DOMAIN\"}, {\"key\":\"N8N_DIAGNOSTICS_ENABLED\", \"value\": false}, {\"key\":\"NODE_TLS_REJECT_UNAUTHORIZED\", \"value\":\"0\"}, {\"key\":\"N8N_SMTP_HOST\", \"value\":\"$SMTP_HOST\"}, {\"key\":\"N8N_SMTP_PORT\", \"value\":\"$SMTP_PORT\"}, {\"key\":\"N8N_SMTP_USER\", \"value\":\"$SMTP_USER\"}, {\"key\":\"N8N_SMTP_PASS\", \"value\":\"$SMTP_PWD\"}, {\"key\":\"N8N_SMTP_SENDER\", \"value\":\"no-reply@likelava.io\"}, {\"key\":\"N8N_EMAIL_MODE\", \"value\":\"smtp\"}, {\"key\":\"WEBHOOK_URL\", \"value\":\"http://n8n.$INSTALLATION_DOMAIN\"}, {\"key\":\"N8N_DEFAULT_LOCALE\", \"value\":\"fr\"}], \"volumes\": [{\"containerPath\":\"/home/node/.n8n\", \"volumeName\":\"n8n\"}, {\"containerPath\":\"/files\", \"volumeName\":\"n8n-files\"}]}" sleep 5 docker run caprover/cli-caprover:$CAPROVER_CLI_VERSION caprover deploy --caproverUrl "http://$INSTALLATION_DOMAIN" --caproverPassword "captain42" -a "n8n" -i n8nio/n8n:1.24.1 sleep 10 # echo " ------ Installing Likelava portal ------ " # docker run caprover/cli-caprover:$CAPROVER_CLI_VERSION caprover api --caproverUrl "http://$INSTALLATION_DOMAIN" --caproverPassword "captain42" --path '/user/apps/appDefinitions/register' --method 'POST' --data "{\"appName\":\"home\"}" # sleep 5 # docker run caprover/cli-caprover:$CAPROVER_CLI_VERSION caprover api --caproverUrl "http://$INSTALLATION_DOMAIN" --caproverPassword "captain42" --path '/user/apps/appDefinitions/update' --method 'POST' --data "{\"appName\":\"home\", \"instanceCount\":1, \"containerHttpPort\": 80}" # sleep 5 # docker run --mount type=bind,source="$PORTAL_FILE",target="$PORTAL_FILE",readonly caprover/cli-caprover:$CAPROVER_CLI_VERSION caprover deploy --caproverUrl "http://$INSTALLATION_DOMAIN" --caproverPassword "captain42" -a "home" -t $PORTAL_FILE # The `trap cleanUp EXIT` line above won't actually fire after the exec # call below, so call cleanUp manually. cleanUp trap "echo Installation failed." EXIT echo "Starting all apps" sleep 30 echo echo "Likelava ${RELEASE} has been installed." echo " " echo " " echo " " echo "**************************************************************" echo "**************************************************************" echo " **** Installation is done! ***** " echo "Likelava is now available !" echo "Visit http://home.$INSTALLATION_DOMAIN to access to yours apps !" echo "**************************************************************" echo "**************************************************************" trap - EXIT } run_it