#!/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 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 "Check environment ..." echo os_type: $os_type echo os_version: $os_version 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 "Parpare 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 -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 -y 1>/dev/null 2>&1 fi } InstallDocker(){ echo "Parpare 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 "Parpare 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 fi if [ "${os_type}" == 'Ubuntu' ]; then 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 fi 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 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 # 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 # install navigator curl -sSL https://repo.45drives.com/setup -o setup-repo.sh sudo bash setup-repo.sh if [ "$os_type" == 'Ubuntu' ] || [ "$os_type" == 'Debian' ] ;then sudo apt install cockpit-navigator -y 1>/dev/null 2>&1 fi if [ "$os_type" == 'Redhat' ] || [ "$os_type" == 'CentOS Stream' ] || [ "$os_type" == 'Fedora' ] ;then sudo dnf install cockpit-navigator -y 1>/dev/null 2>&1 fi if [ "${os_type}" == 'CentOS' ] || [ "$os_type" == 'OracleLinux' ] ;then sudo yum install cockpit-navigator -y 1>/dev/null 2>&1 fi # install docker cp -r /data/apps/stackhub/cockpit/docker /usr/share/cockpit # uninstall plugins rm -rf /usr/share/cockpit/apps /usr/share/cockpit/selinux /usr/share/cockpit/kdump # 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 } 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 } ParpareStaticFiles(){ echo "Parpare to install ..." # download apps mkdir -p /data/apps clone_repo https://ghproxy.com/https://github.com/Websoft9/docker-library /data/library clone_repo https://ghproxy.com/https://github.com/Websoft9/Stackhub /data/apps/stackhub clone_repo https://ghproxy.com/https://github.com/Websoft9/stackhub-web /data/stackhubweb } StartAppMng(){ echo "Start appmanage API ..." cd /data/apps/stackhub/docker/redis && sudo docker compose up -d cd /data/apps/stackhub/docker/appmanage && sudo docker compose up -d } InstallNginx(){ echo "Install nginxproxymanager ..." cd /data/apps/stackhub/docker/nginxproxymanager && sudo docker compose up -d while [ ! -d "/var/lib/docker/volumes/nginxproxymanager_nginx_data/_data/nginx/proxy_host" ]; do sleep 1 done cp /data/apps/stackhub/docker/nginxproxymanager/initproxy.conf /var/lib/docker/volumes/nginxproxymanager_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/nginxproxymanager_nginx_data/_data/nginx/proxy_host/initproxy.conf sudo docker restart websoft9-nginxproxymanager } CheckEnvironment InstallTools InstallDocker ParpareStaticFiles InstallCockpit StartAppMng InstallNginx