-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathturbocloud
executable file
·144 lines (117 loc) · 4.36 KB
/
turbocloud
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#!/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 <key>
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 <key> [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 <key>
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