Explorar o código

delete faile container

qiaofeng1227 %!s(int64=2) %!d(string=hai) anos
pai
achega
6ff9b30147
Modificáronse 2 ficheiros con 474 adicións e 0 borrados
  1. 7 0
      appmanage/api/service/manage.py
  2. 467 0
      install/install_release.sh

+ 7 - 0
appmanage/api/service/manage.py

@@ -147,6 +147,10 @@ def delete_app(app_id):
             if app_path != lib_path:
                 cmd = cmd + " && sudo rm -rf " + app_path
             shell_execute.execute_command_output_all(cmd)
+
+            # 强制删除失败又无法通过docker compose down 删除的容器
+            force_cmd = "docker rm -f $(docker ps -f name=^"+customer_name+" -aq)"
+            shell_execute.execute_command_output_all(force_cmd)
         else:
             if check_app_rq(app_id):
                 delete_app_failedjob(app_id)
@@ -194,6 +198,9 @@ def check_app(app_name, customer_name, app_version):
     elif customer_name == None:
         code = const.ERROR_CLIENT_PARAM_BLANK
         message = "customer_name is null"
+    elif len(customer_name) < 1:
+        code = const.ERROR_CLIENT_PARAM_BLANK
+        message = "customer_name must be longer than 2 chars"
     elif app_version == None:
         code = const.ERROR_CLIENT_PARAM_BLANK
         message = "app_version is null"

+ 467 - 0
install/install_release.sh

@@ -0,0 +1,467 @@
+#!/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
+
+}
+
+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
+
+echo "---------------------------------- Install success!  you can  install a app by websoft9's appstore -------------------------------------------------------" 
+
+}
+
+CheckEnvironment
+InstallTools
+InstallDocker
+PrepareStaticFiles
+InstallCockpit
+StartAppMng
+StartPortainer
+StartKopia
+InstallNginx
+EditMenu