#!/bin/sh #Parameters #$1 - public ip address of a server #$2 - domain #Example: ./turbocloud.sh -i 12.32.22.43 -d myproject.com -t static public_ip="" domain="" project_type="" project_port="80" #not used for static websites project_folder=${PWD} server_project_folder="/root/$(cat /proc/sys/kernel/random/uuid)" image_name="" while getopts i:d:t:p: option do case "${option}" in i)public_ip=${OPTARG};; d)domain=${OPTARG};; t)project_type=${OPTARG};; p)project_port=${OPTARG};; esac done image_name="$domain" scp -r $project_folder root@$public_ip:$server_project_folder ssh root@$public_ip domain=$domain project_type=$project_type image_name=$image_name project_port=$project_port server_project_folder=$server_project_folder 'bash -s' <<'ENDSSH' ############################################ ## Key-value storage ## ## Usage: ## kvset user mr.bob ## kvset pass abc@123 ## kvget user ## kvdel pass ## kvclear ## kvlist default_kv_user_dir="$HOME/.kv-bash" # Usage: kvget kvget() { key="$1" kv_user_dir=${KV_USER_DIR:-$default_kv_user_dir} VALUE="$([ -f "$kv_user_dir/$key" ] && cat "$kv_user_dir/$key")" echo "$VALUE" [ "$VALUE" != "" ] } # Usage: kvset [value] kvset() { key="$1" value="$2" kv_user_dir=${KV_USER_DIR:-$default_kv_user_dir} test -d "$kv_user_dir" || mkdir "$kv_user_dir" echo "$value" > "$kv_user_dir/$key" } # Usage: kvdel kvdel() { key="$1" kv_user_dir=${KV_USER_DIR:-$default_kv_user_dir} test -f "$kv_user_dir/$key" && rm -f "$kv_user_dir/$key" } # list all key/value pairs to stdout # Usage: kvlist kvlist() { kv_user_dir=${KV_USER_DIR:-$default_kv_user_dir} for i in "$kv_user_dir/"*; do if [ -f "$i" ]; then key="$(basename "$i")" echo "$key" "$(kvget "$key")" fi done } # clear all key/value pairs in database # Usage: kvclear kvclear() { kv_user_dir=${KV_USER_DIR:-$default_kv_user_dir} rm -rf "$kv_user_dir" } ##Key-value storage end ##################################### while available_port=$(shuf -n 1 -i 4000-7999) netstat -atun | grep -q "$available_port" do continue done echo "Free port found: $available_port" if ! [ -x "$(command -v caddy)" ]; then sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list sudo apt update sudo apt install caddy fi if ! [ -x "$(command -v docker)" ]; then sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin fi #If the project type is static, we generate Dockerfile if [[ "$project_type" == "static" ]]; then sudo echo -e "FROM joseluisq/static-web-server:2-alpine\nCOPY ./ public/" >> $server_project_folder/Dockerfile fi prev_container_id=$(docker ps -q --filter ancestor=$image_name ) sudo docker build $server_project_folder -t $image_name sudo docker container rm $prev_container_id --force sudo docker run -it -d --restart unless-stopped -p $available_port:$project_port $image_name rm /etc/caddy/Caddyfile sudo echo -e "$domain {\nreverse_proxy * localhost:$available_port\n}" >> /etc/caddy/Caddyfile caddy reload -c /etc/caddy/Caddyfile rm -rf $server_project_folder ENDSSH