2023-03-21 04:06:44 +00:00
#!/bin/bash
PATH = /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
2023-04-12 09:07:36 +00:00
function error_exit {
echo " $1 " 1>& 2
exit 1
}
trap 'error_exit "Please push issue to: https://github.com/Websoft9/StackHub/issues"' ERR
2023-05-18 09:15:59 +00:00
urls = (
https://ghproxy.com/https://github.com
2023-05-25 07:04:45 +00:00
https://github.com
2023-05-29 06:36:40 +00:00
https://gitee.com
2023-05-18 09:15:59 +00:00
)
2023-04-12 09:07:36 +00:00
function get_os_type( ) {
if [ -f /etc/os-release ] ; then
. /etc/os-release
OS = $NAME
elif type lsb_release >/dev/null 2>& 1; then
OS = $( lsb_release -si)
else
OS = $( uname -s)
fi
if [ [ " $OS " = = "CentOS Linux" ] ] ; then
echo "CentOS"
elif [ [ " $OS " = = "Oracle Linux Server" ] ] ; then
echo "OracleLinux"
elif [ [ " $OS " = = "Debian GNU/Linux" ] ] ; then
echo "Debian"
elif [ [ " $OS " = = "Ubuntu" ] ] ; then
echo "Ubuntu"
elif [ [ " $OS " = = "Fedora Linux" ] ] ; then
echo "Fedora"
elif [ [ " $OS " = ~ "Red Hat Enterprise Linux" ] ] ; then
echo "Redhat"
else
echo $OS
fi
}
function get_os_version( ) {
if [ -f /etc/os-release ] ; then
. /etc/os-release
OS = $NAME
VERSION = $VERSION_ID
elif type lsb_release >/dev/null 2>& 1; then
OS = $( lsb_release -si)
VERSION = $( lsb_release -sr)
else
OS = $( uname -s)
VERSION = $( uname -r)
fi
if [ [ " $OS " = = "CentOS Linux" && " $VERSION " = ~ ^7| 8$ ] ] ; then
echo "CentOS" $VERSION
elif [ [ " $OS " = = "Oracle Linux Server" && " $VERSION " = ~ ^7| 8$ ] ] ; then
echo "OracleLinux" $VERSION
elif [ [ " $OS " = = "Debian GNU/Linux" && " $VERSION " = ~ ^9| 10| 11$ ] ] ; then
echo "Debian" $VERSION
elif [ [ " $OS " = = "Ubuntu" && " $VERSION " = ~ ^20.04| 20.10| 21.04| 21.10| 22.04$ ] ] ; then
echo "Ubuntu" $VERSION
elif [ [ " $OS " = ~ "Red Hat Enterprise Linux" && " $VERSION " = ~ ^7| 8$ ] ] ; then
echo "Redhat" $VERSION
else
echo $OS $VERSION
fi
}
os_type = $( get_os_type)
os_version = $( get_os_version)
CheckEnvironment( ) {
2023-05-22 02:48:58 +00:00
echo "---------------------------------- Welcome to install websoft9's appstore, it will take 3-5 minutes -------------------------------------------------------"
2023-05-20 03:17:35 +00:00
2023-04-12 09:07:36 +00:00
echo "Check environment ..."
echo os_type: $os_type
echo os_version: $os_version
2023-05-22 02:48:58 +00:00
if [ $( id -u) != "0" ] ; then
echo "Please change to root or 'sudo su' to up system privileges, and reinstall the script again ."
exit 1
fi
2023-04-12 09:07:36 +00:00
if [ $( getconf WORD_BIT) = '32' ] && [ $( getconf LONG_BIT) = '64' ] ; then
echo "64-bit operating system detected."
2023-03-21 04:06:44 +00:00
else
2023-04-12 09:07:36 +00:00
echo "This script only works on 64-bit operating systems."
exit 1
2023-03-21 04:06:44 +00:00
fi
2023-04-12 09:07:36 +00:00
if [ -f /etc/os-release ] ; then
. /etc/os-release
OS = $NAME
VERSION = $VERSION_ID
elif type lsb_release >/dev/null 2>& 1; then
OS = $( lsb_release -si)
VERSION = $( lsb_release -sr)
else
OS = $( uname -s)
VERSION = $( uname -r)
2023-03-21 04:06:44 +00:00
fi
2023-04-12 09:07:36 +00:00
if [ [ " $OS " = = "CentOS Linux" && " $VERSION " = ~ ^[ 0-6] $ ] ] ; then
echo "This script only works on CentOS 7 or later."
exit 1
elif [ [ " $OS " = = "Ubuntu" && " $VERSION " = ~ ^1[ 0-9] .*$ ] ] ; then
echo "This script only works on Ubuntu 20.04 or later."
exit 1
elif [ [ " $OS " = = "Debian GNU/Linux" && " $VERSION " = ~ ^[ 1-8] $ ] ] ; then
echo "This script only works on Debian 9 or later."
exit 1
elif [ [ " $OS " = ~ "Red Hat Enterprise Linux" && " $VERSION " = ~ ^[ 0-6] $ ] ] ; then
echo "This script only works on Red Hat 7 or later."
exit 1
else
echo "Your server os is supported to install this software."
2023-03-21 04:06:44 +00:00
fi
2023-04-12 09:07:36 +00:00
# Check port used
if netstat -tuln | grep -qE ':(80|9000|5000)\s' ; then
echo "Port 80 or 9000 or 5000 is already in use."
exit 1
else
echo "Port 80, 9000 and 5000 are free."
2023-03-21 04:06:44 +00:00
fi
2023-04-12 09:07:36 +00:00
}
InstallTools( ) {
2023-03-21 04:06:44 +00:00
2023-05-30 09:42:14 +00:00
echo "Prepare to install Tools ..."
2023-04-12 09:07:36 +00:00
if [ " $os_type " = = 'CentOS' ] || [ " $os_type " = = 'CentOS Stream' ] || [ " $os_type " = = 'Fedora' ] || [ " $os_type " = = 'OracleLinux' ] || [ " $os_type " = = 'Redhat' ] ; then
sudo yum update -y 1>/dev/null 2>& 1
2023-05-18 09:15:59 +00:00
sudo yum install git curl wget yum-utils jq -y 1>/dev/null 2>& 1
2023-03-21 04:06:44 +00:00
fi
2023-04-12 09:07:36 +00:00
if [ " $os_type " = = 'Ubuntu' ] || [ " $os_type " = = 'Debian' ] ; then
while fuser /var/lib/dpkg/lock >/dev/null 2>& 1 ; do
echo "Waiting for other software managers to finish..."
sleep 5
done
sudo apt update -y 1>/dev/null 2>& 1
2023-05-18 09:15:59 +00:00
sudo apt install git curl wget jq -y 1>/dev/null 2>& 1
2023-04-12 09:07:36 +00:00
fi
2023-03-21 04:06:44 +00:00
}
2023-04-12 09:07:36 +00:00
InstallDocker( ) {
2023-05-30 09:42:14 +00:00
echo "Prepare to install Docker ..."
2023-04-12 09:07:36 +00:00
if [ " $os_type " = = 'CentOS' ] ; then
curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh
fi
if [ " $os_type " = = 'Ubuntu' ] || [ " $os_type " = = 'Debian' ] ; then
apt-get update
while fuser /var/lib/dpkg/lock >/dev/null 2>& 1 ; do
echo "Waiting for other software managers to finish..."
sleep 5
done
curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh
sleep 30
fi
if [ " $os_type " = = 'OracleLinux' ] ; then
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
fi
if [ " $os_type " = = 'Fedora' ] ; then
wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/fedora/docker-ce.repo
sudo yum install device-mapper-persistent-data lvm2 docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-scan-plugin docker-ce-rootless-extras -y
fi
if [ " $os_type " = = 'Redhat' ] ; then
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine podman runc -y 1>/dev/null 2>& 1
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
fi
if [ " $os_type " = = 'CentOS Stream' ] ; then
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine podman runc -y 1>/dev/null 2>& 1
wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
fi
sudo systemctl start docker
sudo systemctl enable docker
if ! docker network inspect websoft9 > /dev/null 2>& 1; then
sudo docker network create websoft9
fi
2023-03-21 04:06:44 +00:00
}
2023-04-12 09:07:36 +00:00
InstallCockpit( ) {
2023-05-30 09:42:14 +00:00
echo "Prepare to install Cockpit ..."
2023-03-21 04:06:44 +00:00
2023-04-12 09:07:36 +00:00
if [ " ${ os_type } " = = 'Debian' ] ; then
VERSION_CODENAME = $( cat /etc/os-release | grep VERSION_CODENAME| cut -f2 -d"=" )
sudo echo " deb http://deb.debian.org/debian ${ VERSION_CODENAME } -backports main " >/etc/apt/sources.list.d/backports.list
sudo apt update
sudo apt install -t ${ VERSION_CODENAME } -backports cockpit -y
2023-03-21 04:06:44 +00:00
fi
2023-04-12 09:07:36 +00:00
if [ " ${ os_type } " = = 'Ubuntu' ] ; then
2023-05-22 09:12:08 +00:00
if grep -q "^#.*deb http://mirrors.tencentyun.com/ubuntu.*backports" /etc/apt/sources.list; then
2023-05-22 08:18:38 +00:00
echo "Add backports deb ..."
2023-05-22 09:12:08 +00:00
sudo sed -i 's/^#\(.*deb http:\/\/mirrors.tencentyun.com\/ubuntu.*backports.*\)/\1/' /etc/apt/sources.list
2023-05-22 08:09:30 +00:00
apt update
fi
2023-04-12 09:07:36 +00:00
VERSION_CODENAME = $( cat /etc/os-release | grep VERSION_CODENAME| cut -f2 -d"=" )
sudo apt install -t ${ VERSION_CODENAME } -backports cockpit -y
echo "Cockpit allow root user"
echo "" >/etc/cockpit/disallowed-users 1>/dev/null 2>& 1
2023-03-21 04:06:44 +00:00
fi
2023-04-12 09:07:36 +00:00
if [ " ${ os_type } " = = 'CentOS' ] || [ " $os_type " = = 'OracleLinux' ] ; then
sudo yum install cockpit -y
sudo systemctl enable --now cockpit.socket
sudo firewall-cmd --permanent --zone= public --add-service= cockpit
sudo firewall-cmd --reload
fi
2023-03-21 04:06:44 +00:00
2023-04-12 09:07:36 +00:00
if [ " $os_type " = = 'Fedora' ] ; then
sudo dnf install cockpit -y
sudo systemctl enable --now cockpit.socket
sudo firewall-cmd --add-service= cockpit
sudo firewall-cmd --add-service= cockpit --permanent
fi
if [ " $os_type " = = 'Redhat' ] ; then
sudo subscription-manager repos --enable rhel-7-server-extras-rpms 1>/dev/null 2>& 1
sudo yum install cockpit -y
sudo setenforce 0 1>/dev/null 2>& 1
sudo sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config 1>/dev/null 2>& 1
sudo systemctl enable --now cockpit.socket
sudo firewall-cmd --add-service= cockpit
sudo firewall-cmd --add-service= cockpit --permanent
fi
if [ " $os_type " = = 'CentOS Stream' ] ; then
sudo subscription-manager repos --enable rhel-7-server-extras-rpms 1>/dev/null 2>& 1
sudo yum install cockpit -y
sudo systemctl enable --now cockpit.socket
sudo firewall-cmd --add-service= cockpit
sudo firewall-cmd --add-service= cockpit --permanent
sudo setenforce 0 1>/dev/null 2>& 1
sudo sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config 1>/dev/null 2>& 1
fi
echo "Set cockpit port to 9000 ..."
sudo sed -i 's/ListenStream=9090/ListenStream=9000/' /lib/systemd/system/cockpit.socket
# install plugins
mkdir -p /usr/share/cockpit/appstore
2023-05-18 09:15:59 +00:00
mkdir -p /usr/share/cockpit/container
mkdir -p /usr/share/cockpit/nginx
2023-05-25 01:09:42 +00:00
mkdir -p /usr/share/cockpit/backup
2023-05-18 09:15:59 +00:00
2023-04-12 09:07:36 +00:00
# install web
cp -r /data/apps/stackhub/appmanage/static/images /data/stackhubweb/src/apps/build/static
cp -r /data/stackhubweb/src/apps/build/* /usr/share/cockpit/appstore
2023-05-18 09:15:59 +00:00
## install container
cp -r /data/stackhubweb/plugins/portainer/build/* /usr/share/cockpit/container
cp -r /data/stackhubweb/plugins/nginxproxymanager/build/* /usr/share/cockpit/nginx
2023-05-25 01:09:42 +00:00
cp -r /data/stackhubweb/plugins/kopia/build/* /usr/share/cockpit/backup
2023-04-12 09:07:36 +00:00
# install navigator
if [ " $os_type " = = 'Ubuntu' ] || [ " $os_type " = = 'Debian' ] ; then
2023-05-18 09:15:59 +00:00
wget -qO - https://repo.45drives.com/key/gpg.asc | sudo gpg --dearmor -o /usr/share/keyrings/45drives-archive-keyring.gpg
cd /etc/apt/sources.list.d
sudo curl -sSL https://repo.45drives.com/lists/45drives.sources -o /etc/apt/sources.list.d/45drives.sources
sudo apt update
sudo apt install cockpit-navigator -y
2023-03-21 04:06:44 +00:00
fi
2023-04-12 09:07:36 +00:00
if [ " $os_type " = = 'Redhat' ] || [ " $os_type " = = 'CentOS Stream' ] || [ " $os_type " = = 'Fedora' ] ; then
2023-05-18 09:15:59 +00:00
curl -sSL https://repo.45drives.com/setup -o setup-repo.sh
sudo bash setup-repo.sh
2023-04-12 09:07:36 +00:00
sudo dnf install cockpit-navigator -y 1>/dev/null 2>& 1
fi
if [ " ${ os_type } " = = 'CentOS' ] || [ " $os_type " = = 'OracleLinux' ] ; then
2023-05-18 09:15:59 +00:00
curl -sSL https://repo.45drives.com/setup -o setup-repo.sh
sudo bash setup-repo.sh
2023-04-12 09:07:36 +00:00
sudo yum install cockpit-navigator -y 1>/dev/null 2>& 1
fi
# uninstall plugins
2023-05-24 07:25:44 +00:00
rm -rf /usr/share/cockpit/apps /usr/share/cockpit/selinux /usr/share/cockpit/kdump /usr/share/cockpit/sosreport /usr/share/cockpit/packagekit
2023-04-12 09:07:36 +00:00
# configure cockpit
cp /data/apps/stackhub/cockpit/cockpit.conf /etc/cockpit/cockpit.conf
sudo systemctl daemon-reload
sudo systemctl enable --now cockpit
sudo systemctl enable --now cockpit.socket
sudo systemctl restart cockpit.socket
sudo systemctl restart cockpit
}
2023-05-18 09:15:59 +00:00
function fastest_url( ) {
2023-05-25 09:55:18 +00:00
urls = ( " $@ " )
fastest_url = ""
fastest_time = 0
for url in " ${ urls [@] } " ; do
2023-05-29 07:04:41 +00:00
time = $( curl --connect-timeout 3 -s -w '%{time_total}\n' -o /dev/null $url )
2023-05-25 09:55:18 +00:00
if ( ( $( echo " $time < $fastest_time || $fastest_time == 0 " | bc -l) ) ) ; then
fastest_time = $time
fastest_url = $url
fi
done
echo " $fastest_url "
2023-05-18 09:15:59 +00:00
}
2023-05-25 09:22:31 +00:00
function clone_repo( ) {
2023-04-12 09:07:36 +00:00
url = $1
path = $2
for i in { 1..5}
do
git clone $url $path
if [ $? -eq 0 ]
then
echo "Clone successful"
break
else
echo " Clone failed, retrying $i /5 "
fi
done
2023-05-25 07:04:45 +00:00
if [ ! -d " $path " ] ; then
echo " $path clone failed. "
exit 1
fi
2023-04-12 09:07:36 +00:00
}
2023-05-30 09:42:14 +00:00
PrepareStaticFiles( ) {
2023-04-12 09:07:36 +00:00
2023-05-30 09:42:14 +00:00
echo "Prepare to install ..."
2023-05-18 09:15:59 +00:00
fasturl = $( fastest_url " ${ urls [@] } " )
2023-05-30 07:10:17 +00:00
echo "fast url is: " $fasturl
2023-04-12 09:07:36 +00:00
# download apps
mkdir -p /data/apps
2023-05-18 09:15:59 +00:00
clone_repo $fasturl /Websoft9/docker-library /data/library
2023-05-30 07:10:17 +00:00
clone_repo $fasturl /Websoft9/StackHub /data/apps/stackhub
2023-05-18 09:15:59 +00:00
clone_repo $fasturl /Websoft9/stackhub-web /data/stackhubweb
2023-04-12 09:07:36 +00:00
}
StartAppMng( ) {
echo "Start appmanage API ..."
2023-05-18 09:15:59 +00:00
cd /data/apps/stackhub/docker/w9redis && sudo docker compose up -d
cd /data/apps/stackhub/docker/w9appmanage && sudo docker compose up -d
public_ip = ` bash /data/apps/stackhub/scripts/get_ip.sh`
echo $public_ip > /data/apps/stackhub/docker/w9appmanage/public_ip
2023-04-12 09:07:36 +00:00
}
2023-05-18 09:15:59 +00:00
StartPortainer( ) {
echo "Start Portainer ..."
cd /data/apps/stackhub/docker/w9portainer && sudo docker compose up -d
docker pull backplane/pwgen
new_password = $( docker run --name pwgen backplane/pwgen 15) !
docker rm -f pwgen
2023-05-25 01:09:42 +00:00
sudo sed -i 's/"PORTAINER_USERNAME": ".*"/"PORTAINER_USERNAME": "admin"/g' /usr/share/cockpit/appstore/config.json
sudo sed -i 's/"PORTAINER_PASSWORD": ".*"/"PORTAINER_PASSWORD": "' $new_password '"/g' /usr/share/cockpit/appstore/config.json
2023-05-18 09:15:59 +00:00
curl -X POST -H "Content-Type: application/json" -d '{"username":"admin", "Password":"' $new_password '"}' http://127.0.0.1:9091/api/users/admin/init
}
2023-05-25 01:09:42 +00:00
StartKopia( ) {
echo "Start Kopia ..."
docker pull backplane/pwgen
new_password = $( docker run --name pwgen backplane/pwgen 15) !
docker rm -f pwgen
sudo sed -i 's/POWER_PASSWORD=.*/POWER_PASSWORD="' $new_password '"/g' /data/apps/stackhub/docker/w9kopia/.env
cd /data/apps/stackhub/docker/w9kopia && sudo docker compose up -d
sudo sed -i 's/"KOPIA_USERNAME": ".*"/"KOPIA_USERNAME": "admin"/g' /usr/share/cockpit/appstore/config.json
sudo sed -i 's/"KOPIA_PASSWORD": ".*"/"KOPIA_PASSWORD": "' $new_password '"/g' /usr/share/cockpit/appstore/config.json
}
2023-04-12 09:07:36 +00:00
InstallNginx( ) {
echo "Install nginxproxymanager ..."
2023-05-18 09:15:59 +00:00
cd /data/apps/stackhub/docker/w9nginxproxymanager && sudo docker compose up -d
sleep 25
echo "edit nginxproxymanager password..."
login_data = $( curl -X POST -H "Content-Type: application/json" -d '{"identity":"admin@example.com","scope":"user", "secret":"changeme"}' http://127.0.0.1:9092/api/tokens)
sleep 3
token = $( echo $login_data | jq -r '.token' )
new_password = $( docker run --name pwgen backplane/pwgen 15) !
docker rm -f pwgen
curl -X PUT -H "Content-Type: application/json" -H " Authorization: Bearer $token " -d '{"email": "help@websoft9.com", "nickname": "admin", "is_disabled": false, "roles": ["admin"]}' http://127.0.0.1:9092/api/users/1
curl -X PUT -H "Content-Type: application/json" -H " Authorization: Bearer $token " -d '{"type":"password","current":"changeme","secret":"' $new_password '"}' http://127.0.0.1:9092/api/users/1/auth
sleep 3
2023-05-25 01:09:42 +00:00
sudo sed -i 's/"NGINXPROXYMANAGER_USERNAME": ".*"/"NGINXPROXYMANAGER_USERNAME": "help@websoft9.com"/g' /usr/share/cockpit/appstore/config.json
sudo sed -i 's/"NGINXPROXYMANAGER_PASSWORD": ".*"/"NGINXPROXYMANAGER_PASSWORD": "' $new_password '"/g' /usr/share/cockpit/appstore/config.json
2023-05-25 03:35:24 +00:00
sudo sed -i 's/"NGINXPROXYMANAGER_NIKENAME": ".*"/"NGINXPROXYMANAGER_NIKENAME": "admin"/g' /usr/share/cockpit/appstore/config.json
2023-05-18 09:15:59 +00:00
echo "edit password success ..."
while [ ! -d "/var/lib/docker/volumes/w9nginxproxymanager_nginx_data/_data/nginx/proxy_host" ] ; do
2023-04-12 09:07:36 +00:00
sleep 1
done
2023-05-18 09:15:59 +00:00
cp /data/apps/stackhub/docker/w9nginxproxymanager/initproxy.conf /var/lib/docker/volumes/w9nginxproxymanager_nginx_data/_data/nginx/proxy_host
2023-04-12 09:07:36 +00:00
public_ip = ` bash /data/apps/stackhub/scripts/get_ip.sh`
2023-05-18 09:15:59 +00:00
sudo sed -i " s/domain.com/ $public_ip /g " /var/lib/docker/volumes/w9nginxproxymanager_nginx_data/_data/nginx/proxy_host/initproxy.conf
2023-05-26 03:09:04 +00:00
echo "Add htpasswd for appmanage ..."
sudo sed -i 's/"APPMANAGE_USERNAME": ".*"/"APPMANAGE_USERNAME": "websoft9"/g' /usr/share/cockpit/appstore/config.json
sudo sed -i 's/"APPMANAGE_PASSWORD": ".*"/"APPMANAGE_PASSWORD": "' $new_password '"/g' /usr/share/cockpit/appstore/config.json
rm -rf /var/lib/docker/volumes/w9nginxproxymanager_nginx_data/_data/nginx/proxy_host/.htpasswd /tmp/.htpasswd
docker run --rm --volume /tmp:/work backplane/htpasswd -c -b .htpasswd websoft9 $new_password
cp /tmp/.htpasswd /var/lib/docker/volumes/w9nginxproxymanager_nginx_data/_data/nginx/proxy_host/.htpasswd
2023-04-12 09:07:36 +00:00
sudo docker restart websoft9-nginxproxymanager
2023-05-18 09:15:59 +00:00
2023-05-20 03:17:35 +00:00
echo "---------------------------------- Install success! you can install a app by websoft9's appstore -------------------------------------------------------"
2023-04-12 09:07:36 +00:00
}
CheckEnvironment
InstallTools
InstallDocker
2023-05-30 09:42:14 +00:00
PrepareStaticFiles
2023-04-12 09:07:36 +00:00
InstallCockpit
StartAppMng
2023-05-18 09:15:59 +00:00
StartPortainer
2023-05-25 01:09:42 +00:00
StartKopia
2023-04-12 09:07:36 +00:00
InstallNginx