From 0a058e4cf208bbef16ab02c244fbef94de939260 Mon Sep 17 00:00:00 2001 From: qiaofeng1227 <76487013@qq.com> Date: Thu, 1 Jun 2023 17:21:35 +0800 Subject: [PATCH] installll_online --- install/install_online.sh | 465 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 465 insertions(+) create mode 100644 install/install_online.sh diff --git a/install/install_online.sh b/install/install_online.sh new file mode 100644 index 00000000..98ad3989 --- /dev/null +++ b/install/install_online.sh @@ -0,0 +1,465 @@ +#!/bin/bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +function error_exit { + echo "$1" 1>&2 + exit 1 +} +trap 'error_exit "Please push issue to: https://github.com/Websoft9/StackHub/issues"' ERR + +urls=( + https://ghproxy.com/https://github.com + https://github.com + https://gitee.com +) + +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(){ + +echo "---------------------------------- Welcome to install websoft9's appstore, it will take 3-5 minutes -------------------------------------------------------" + +echo "Check environment ..." +echo os_type: $os_type +echo os_version: $os_version +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 + +if [ $(getconf WORD_BIT) = '32' ] && [ $(getconf LONG_BIT) = '64' ] ; then + echo "64-bit operating system detected." +else + echo "This script only works on 64-bit operating systems." + exit 1 +fi + +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" =~ ^[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." +fi + +# 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." +fi + +} + +InstallTools(){ + +echo "Prepare to install Tools ..." + +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 + sudo yum install git curl wget yum-utils jq firewalld -y 1>/dev/null 2>&1 + +fi + +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 + sudo apt install git curl wget jq firewalld -y 1>/dev/null 2>&1 +fi + +} + +InstallDocker(){ + +echo "Prepare to install Docker ..." + +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 + +} + +InstallCockpit(){ +echo "Prepare to install Cockpit ..." + +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 + sudo apt install cockpit-pcp -y 1>/dev/null 2>&1 +fi + +if [ "${os_type}" == 'Ubuntu' ]; then + if grep -q "^#.*deb http://mirrors.tencentyun.com/ubuntu.*backports" /etc/apt/sources.list; then + echo "Add backports deb ..." + sudo sed -i 's/^#\(.*deb http:\/\/mirrors.tencentyun.com\/ubuntu.*backports.*\)/\1/' /etc/apt/sources.list + apt update + fi + VERSION_CODENAME=$(cat /etc/os-release |grep VERSION_CODENAME|cut -f2 -d"=") + sudo apt install -t ${VERSION_CODENAME}-backports cockpit -y + sudo apt install cockpit-pcp -y 1>/dev/null 2>&1 + echo "Cockpit allow root user" + echo "" >/etc/cockpit/disallowed-users 1>/dev/null 2>&1 +fi + +if [ "${os_type}" == 'CentOS' ] || [ "$os_type" == 'OracleLinux' ]; then + sudo yum install cockpit -y + sudo yum install cockpit-pcp -y 1>/dev/null 2>&1 + sudo systemctl enable --now cockpit.socket + sudo firewall-cmd --permanent --zone=public --add-service=cockpit + sudo firewall-cmd --reload +fi + +if [ "$os_type" == 'Fedora' ]; then + sudo dnf install cockpit -y + sudo dnf install cockpit-pcp -y 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" == 'Redhat' ] ; then + sudo subscription-manager repos --enable rhel-7-server-extras-rpms 1>/dev/null 2>&1 + sudo yum install cockpit -y + sudo yum install cockpit-pcp -y 1>/dev/null 2>&1 + 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 yum install cockpit-pcp -y 1>/dev/null 2>&1 + 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 +# install appstore +cp -r /data/apps/stackhub/appmanage/static/images /data/apps/stackhub/cockpit/appstore/static +cp -r /data/apps/stackhub/cockpit/appstore /usr/share/cockpit +# install portainer +cp -r /data/apps/stackhub/cockpit/portainer /usr/share/cockpit +mv /usr/share/cockpit/portainer /usr/share/cockpit/container +## install nginx +cp -r /data/apps/stackhub/cockpit/nginxproxymanager /usr/share/cockpit +mv /usr/share/cockpit/nginxproxymanager /usr/share/cockpit/nginx +## install kopia +cp -r /data/apps/stackhub/cockpit/kopia /usr/share/cockpit +mv /usr/share/cockpit/kopia /usr/share/cockpit/backup +## install myapps +cp -r /data/apps/stackhub/cockpit/myapps /usr/share/cockpit + +# install navigator +if [ "$os_type" == 'Ubuntu' ] || [ "$os_type" == 'Debian' ] ;then + 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 +fi + +if [ "$os_type" == 'Redhat' ] || [ "$os_type" == 'CentOS Stream' ] || [ "$os_type" == 'Fedora' ] ;then + curl -sSL https://repo.45drives.com/setup -o setup-repo.sh + sudo bash setup-repo.sh + sudo dnf install cockpit-navigator -y 1>/dev/null 2>&1 +fi + +if [ "${os_type}" == 'CentOS' ] || [ "$os_type" == 'OracleLinux' ] ;then + curl -sSL https://repo.45drives.com/setup -o setup-repo.sh + sudo bash setup-repo.sh + sudo yum install cockpit-navigator -y 1>/dev/null 2>&1 +fi + +# uninstall plugins +rm -rf /usr/share/cockpit/apps /usr/share/cockpit/selinux /usr/share/cockpit/kdump /usr/share/cockpit/sosreport + +# 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 + +} + +function fastest_url() { + urls=("$@") + fastest_url="" + fastest_time=0 + + for url in "${urls[@]}"; do + time=$(curl --connect-timeout 3 -s -w '%{time_total}\n' -o /dev/null $url) + if (( $(echo "$time < $fastest_time || $fastest_time == 0" | bc -l) )); then + fastest_time=$time + fastest_url=$url + fi + done + + echo "$fastest_url" +} + +function clone_repo() { + 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 + if [ ! -d "$path" ]; then + echo "$path clone failed." + exit 1 + fi +} + +PrepareStaticFiles(){ + +echo "Prepare to install ..." +fasturl=$(fastest_url "${urls[@]}") +echo "fast url is: "$fasturl + +# download apps +mkdir -p /data/apps +clone_repo $fasturl/Websoft9/docker-library /data/library +clone_repo $fasturl/Websoft9/StackHub /data/apps/stackhub +} + +StartAppMng(){ + +echo "Start appmanage API ..." +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 + +} + +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 +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 +curl -X POST -H "Content-Type: application/json" -d '{"username":"admin", "Password":"'$new_password'"}' http://127.0.0.1:9091/api/users/admin/init +} + +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 +} + +InstallNginx(){ + +echo "Install nginxproxymanager ..." +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 +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 +sudo sed -i 's/"NGINXPROXYMANAGER_NIKENAME": ".*"/"NGINXPROXYMANAGER_NIKENAME": "admin"/g' /usr/share/cockpit/appstore/config.json +echo "edit password success ..." +while [ ! -d "/var/lib/docker/volumes/w9nginxproxymanager_nginx_data/_data/nginx/proxy_host" ]; do + sleep 1 +done +cp /data/apps/stackhub/docker/w9nginxproxymanager/initproxy.conf /var/lib/docker/volumes/w9nginxproxymanager_nginx_data/_data/nginx/proxy_host +public_ip=`bash /data/apps/stackhub/scripts/get_ip.sh` +sudo sed -i "s/domain.com/$public_ip/g" /var/lib/docker/volumes/w9nginxproxymanager_nginx_data/_data/nginx/proxy_host/initproxy.conf + +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 +sudo docker restart websoft9-nginxproxymanager + +echo "---------------------------------- Install success! you can install a app by websoft9's appstore -------------------------------------------------------" +} + +EditMenu(){ + +echo "Start to Edit Cockpit Menu ..." +if [ -e /usr/share/cockpit/systemd ]; then + jq '. | .tools as $menu | .menu as $tools | .tools=$tools | .menu=$menu' /usr/share/cockpit/systemd/manifest.json > /usr/share/cockpit/systemd/manifest.json.tmp + rm -rf /usr/share/cockpit/systemd/manifest.json + mv /usr/share/cockpit/systemd/manifest.json.tmp /usr/share/cockpit/systemd/manifest.json +fi +if [ -e /usr/share/cockpit/networkmanager ]; then + sudo sed -i 's/menu/tools/g' /usr/share/cockpit/networkmanager/manifest.json +fi +if [ -e /usr/share/cockpit/storaged ]; then + sudo sed -i 's/menu/tools/g' /usr/share/cockpit/storaged/manifest.json +fi +if [ -e /usr/share/cockpit/users ]; then + sudo sed -i 's/menu/tools/g' /usr/share/cockpit/users/manifest.json +fi +} + +CheckEnvironment +InstallTools +InstallDocker +PrepareStaticFiles +InstallCockpit +StartAppMng +StartPortainer +StartKopia +InstallNginx +EditMenu \ No newline at end of file