{"id":18330008,"url":"https://github.com/88plug/akash-provider-tools","last_synced_at":"2025-04-09T17:39:19.860Z","repository":{"id":37419925,"uuid":"461589226","full_name":"88plug/akash-provider-tools","owner":"88plug","description":"A collection of tools for setting up / deploying / and managing Kubernetes clusters on Akash.Network","archived":false,"fork":false,"pushed_at":"2024-05-24T06:18:00.000Z","size":316,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-15T10:31:43.582Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/88plug.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-02-20T19:10:53.000Z","updated_at":"2025-01-09T13:30:33.000Z","dependencies_parsed_at":"2023-01-19T08:45:33.392Z","dependency_job_id":"30913b70-c9ba-459a-af5f-638d603e4f35","html_url":"https://github.com/88plug/akash-provider-tools","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/88plug%2Fakash-provider-tools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/88plug%2Fakash-provider-tools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/88plug%2Fakash-provider-tools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/88plug%2Fakash-provider-tools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/88plug","download_url":"https://codeload.github.com/88plug/akash-provider-tools/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248078779,"owners_count":21044176,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-05T19:19:33.968Z","updated_at":"2025-04-09T17:39:19.832Z","avatar_url":"https://github.com/88plug.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# akash-provider-tools\nA collection of tools for setting up / deploying / and managing Kubernetes clusters on Akash.Network\n\n# Fix nvidia-smi broken\n```\nFirst disable Secure Boot so the driver updates will work - in BIOS required to disable!\nthen\nsudo apt-get update ; sudo apt-get autoremove nvidia* --purge -y ; sudo apt-get install -y nvidia-driver-535 nvidia-cuda-toolkit nvidia-container-runtime\nreboot now\n```\n\n\n# Always keep Provider Pod and Node running no matter what\n```\nHere's the PDB for the \"akash-provider\":\n\nyaml\n\napiVersion: policy/v1beta1\nkind: PodDisruptionBudget\nmetadata:\n  name: akash-provider-pdb\n  namespace: akash-services\n  annotations:\n    meta.helm.sh/release-name: akash-provider\n    meta.helm.sh/release-namespace: akash-services\nspec:\n  selector:\n    matchLabels:\n      app: akash-provider\n      app.kubernetes.io/instance: akash-provider\n      app.kubernetes.io/name: provider\n  minAvailable: 1\n\nAnd here's a PDB for the \"akash-node-1\":\n\nyaml\n\napiVersion: policy/v1beta1\nkind: PodDisruptionBudget\nmetadata:\n  name: akash-node-1-pdb\n  namespace: akash-services\n  annotations:\n    meta.helm.sh/release-name: akash-node\n    meta.helm.sh/release-namespace: akash-services\nspec:\n  selector:\n    matchLabels:\n      akash.network/node: \"1\"\n      app: akash-node\n  minAvailable: 1\n\nYou should apply both PDBs to ensure protection for both sets of pods:\n\nbash\n\nkubectl apply -f akash-provider-pdb.yaml\nkubectl apply -f akash-node-1-pdb.yaml\n```\n\n# Delete all Pods + Namespaces in a Terminating state - can cause a stuck cluster:\n```\nkubectl get pods --all-namespaces -o json | jq -r '.items[] | select(.metadata.deletionTimestamp != null) | \"-n \\(.metadata.namespace) \\(.metadata.name)\"' | xargs -L 1 kubectl delete pod --force --grace-period=0\nkubectl get namespaces -o json | jq -r '.items[] | select(.status.phase==\"Terminating\") | .metadata.name' | xargs -I {} kubectl patch namespace {} --type json -p '[{\"op\": \"remove\", \"path\": \"/metadata/finalizers\"}]'\n```\n\n# Run akash command until it works\n```\n#!/bin/bash\n\nwhile true; do\n  # Run just the akash command first, capturing both stdout and stderr\n  output=$(akash query market lease list --node=\"${AKASH_NODE}\" --provider $i --gseq 0 --oseq 0 --page 1 --limit 2000 --state active -o json 2\u003e\u00261)\n  \n  # Check if the output contains the word \"error\"\n  if [[ ! \"$output\" =~ \"error\" ]]; then\n    # If there are no errors, pipe the output to jq, awk, and save it to summary_leases.log\n    echo \"$output\" | etc | \u003e summary_leases.log\n    break\n  else\n    # If there is an error, print a retrying message\n    echo \"Retrying...\"\n    \n    # Optional: sleep for a few seconds before retrying\n    sleep 3\n  fi\ndone\n```\n\n# Run mainnet/testnet over Chisel on a single IP:\nCheck out chisel.sh!\n\n# Limit GPU power usage when nodes boot\n```\n[Unit]\nDescription=GPU power limit script\n\n[Service]\nExecStart=/bin/bash /home/akash/gpu-power.sh\nUser=root\nType=oneshot\nRemainAfterExit=yes\n\n[Install]\nWantedBy=multi-user.target\n```\n\n# Run testnet on a single IP:\nRun SOCAT on a public VPS / port forward the alternative ports to the proper port on firewall.\n```\n[Unit]\nDescription=Socat Service\nAfter=network.target\n\n[Service]\nExecStartPre=/bin/bash -c \"sleep 10\" # optional: wait a bit for the network to be ready\nExecStart=/bin/bash -c '/usr/bin/socat TCP-LISTEN:80,fork TCP:136.24.x.x:38472 \u0026 \\\n/usr/bin/socat TCP-LISTEN:443,fork TCP:136.24.x.x:38473 \u0026 \\\n/usr/bin/socat TCP-LISTEN:1317,fork TCP:136.24.x.x:38474 \u0026 \\\n/usr/bin/socat TCP-LISTEN:26656,fork TCP:136.24.x.x:38475 \u0026 \\\n/usr/bin/socat TCP-LISTEN:26657,fork TCP:136.24.x.x:38476 \u0026 \\\n/usr/bin/socat TCP-LISTEN:8443,fork TCP:136.24.x.x:38477'\nRestart=always\nUser=root\nGroup=root\nEnvironment=PATH=/usr/bin:/usr/local/bin:/sbin:/bin\nKillMode=process\n\n[Install]\nWantedBy=multi-user.target\n```\n\n\n# Limit User bandwidth on every pod\nCreate /etc/systemd/system/limits.service\n```\n[Unit]\nDescription=Run limits.sh script every 60 seconds\n\n[Service]\nExecStart=/bin/bash -c 'while true; do /root/limits.sh; echo \"Sleeping 60 seconds\"; sleep 60; done'\nRestart=always\n\n[Install]\nWantedBy=multi-user.target\n```\n\nCreate limits.sh to limit specific images\n```\n#!/bin/bash\n\nexport KUBECONFIG=/root/kubeconfig\necho \"Starting to patch with 1G down and 1M up per pod\"\n\ndeployments=$(kubectl get deployments -A | grep -E 'softether|dante|honeygain|cc-worker|pkt|miner|xmrig' | awk '{print $1,$2}')\n\nwhile read -r namespace deployment; do\n    echo \"Patching $deployment in namespace $namespace\"\n    kubectl patch deployment -n \"$namespace\" \"$deployment\" -p '{\"spec\": {\"template\":{\"metadata\":{\"annotations\":{\"kubernetes.io/ingress-bandwidth\":\"50M\"}}}}}'\n    kubectl patch deployment -n \"$namespace\" \"$deployment\" -p '{\"spec\": {\"template\":{\"metadata\":{\"annotations\":{\"kubernetes.io/egress-bandwidth\":\"50M\"}}}}}'\ndone \u003c\u003c\u003c \"$deployments\"\n```\nor create a limits.sh to limit all Akash deployments bandwidth\n```\n#!/bin/bash\n\nexport KUBECONFIG=/root/kubeconfig\n\necho \"Starting to patch with 50M down and 50M up per pod\"\n\nnamespaces=$(kubectl get namespaces -o jsonpath='{.items[*].metadata.name}')\n\nfor namespace in $namespaces; do\n    echo \"Patching deployments in namespace $namespace\"\n    \n    deployments=$(kubectl get deployments -n \"$namespace\" --selector=\"akash.network/namespace\" -o jsonpath='{.items[*].metadata.name}')\n    \n    for deployment in $deployments; do\n        echo \"Patching $deployment in namespace $namespace\"\n        \n        kubectl patch deployment -n \"$namespace\" \"$deployment\" -p '{\"spec\": {\"template\":{\"metadata\":{\"annotations\":{\"kubernetes.io/ingress-bandwidth\":\"50M\"}}}}}'\n        kubectl patch deployment -n \"$namespace\" \"$deployment\" -p '{\"spec\": {\"template\":{\"metadata\":{\"annotations\":{\"kubernetes.io/egress-bandwidth\":\"50M\"}}}}}'\n    done\ndone\n```\n\nEnable with\n```\nsystemctl daemon-reload\nsystemctl enable --now limit.service\nsystemctl status limits\n```\n\n# Upgrade ingress-nginx to new format helm charts\n```\nCreate ingress-nginx-custom.yaml\nhelm uninstall akash-ingress -n ingress-nginx\nhelm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx\nhelm upgrade --install ingress-nginx ingress-nginx/ingress-nginx   --version 4.6.0   --namespace ingress-nginx --create-namespace   -f ingress-nginx-custom.yaml\nkubectl label ingressclass akash-ingress-class akash.network=true\nkubectl label ns ingress-nginx app.kubernetes.io/name=ingress-nginx app.kubernetes.io/instance=ingress-nginx\n ```\n\n# Keep a small node / VPS clean of logs : requires bleachbit\n`(crontab -l | grep -q '0 3 \\* \\* \\* bleachbit --clean system.rotated_logs; bleachbit --clean system.cache; journalctl --vacuum-size=1M; bleachbit --clean apt.\\*; k3s crictl rmi --prune' || (apt update \u0026\u0026 apt --assume-yes install bleachbit) \u0026\u0026 (crontab -l 2\u003e/dev/null; echo '0 3 * * * bleachbit --clean system.rotated_logs; bleachbit --clean system.cache; journalctl --vacuum-size=1M; bleachbit --clean apt.*; k3s crictl rmi -a') | crontab -)`\n\n# Enable Security Updates on a node at 6:00am daily using a cronjob / run once during node setup:\n`(crontab -l | grep -q \"unattended-upgrades\" || (crontab -l ; echo \"0 6 * * * unattended-upgrades -d\")) | crontab - \u0026\u0026 if ! dpkg -s unattended-upgrades \u003e/dev/null 2\u003e\u00261; then apt-get update \u0026\u0026 apt-get install -y unattended-upgrades; fi \u0026\u0026 if ! grep -qE '^\\\"\\${distro_id}:\\${distro_codename}-security\\\";' /etc/apt/apt.conf.d/50unattended-upgrades; then sed -i 's/^\\/\\/\\s*\\\"\\${distro_id}:\\${distro_codename}-security\\\"/\\\"\\${distro_id}:\\${distro_codename}-security\\\"\\;/' /etc/apt/apt.conf.d/50unattended-upgrades; fi \u0026\u0026 if ! grep -qE '^\\\"\\${distro_id}:\\${distro_codename}-updates\\\";\\s*\\\"\\${distro_id}:\\${distro_codename}-security\\\";' /etc/apt/apt.conf.d/50unattended-upgrades; then sed -i 's/^\\/\\/\\s*\\\"\\${distro_id}:\\${distro_codename}-updates\\\"/\\\"\\${distro_id}:\\${distro_codename}-updates\\\"\\;\\n\\\"\\${distro_id}:\\${distro_codename}-security\\\"\\;/' /etc/apt/apt.conf.d/50unattended-upgrades; fi \u0026\u0026 unattended-upgrades -d`\n\n# Run payouts on your provider - source code for the Docker is under Dockerfile-payouts\n```\ndocker run -it -v key.pem:/key.pem --env PROVIDER=yourprovider.com --env PASS=replace_with_key_pass cryptoandcoffee/akash-provider-payout:1\n```\n\n# Deploy Akash RPC nodes one liner using Helm Charts. Set your DOMAIN= first.\n\n```\nDOMAIN=mydomain.com ; helm repo add akash https://ovrclk.github.io/helm-charts ; helm repo update ; kubectl create ns akash-services ; kubectl create ns ingress-nginx ; kubectl label ns ingress-nginx app.kubernetes.io/name=ingress-nginx app.kubernetes.io/instance=ingress-nginx ; helm upgrade --install akash-ingress akash/akash-ingress -n ingress-nginx --set domain=$DOMAIN ; helm upgrade --install akash-node akash/akash-node -n akash-services --set akash_node.api_enable=true --set akash_node.minimum_gas_prices=0uakt --set image.tag=\"0.16.4\" --set state_sync.enabled=true\n```\n\n# Enable HPA - never let your provider / node / hostname-operator pods go down!  This will migrate them if a host fails.\n\n```\n#Setup HPA / Easy ! \n\nkubectl patch deployment -n akash-services akash-provider -p='{\"spec\":{\"template\":{\"spec\":{\"containers\":[{\"name\":\"akash-provider\",\"resources\":{\"requests\":{\"cpu\":\"4000m\"}}}]}}}}'\nkubectl patch deployment -n akash-services akash-node-1 -p='{\"spec\":{\"template\":{\"spec\":{\"containers\":[{\"name\":\"akash-node\",\"resources\":{\"requests\":{\"cpu\":\"1750m\"}}}]}}}}'\nkubectl patch deployment -n akash-services hostname-operator -p='{\"spec\":{\"template\":{\"spec\":{\"containers\":[{\"name\":\"hostname-operator\",\"resources\":{\"requests\":{\"cpu\":\"500m\"}}}]}}}}'\n\n#Default policy\nkubectl autoscale deployment -n akash-services akash-provider --min=1 --max=10\nkubectl autoscale deployment -n akash-services akash-node-1 --min=1 --max=10\nkubectl autoscale deployment -n akash-services hostname-operator --min=1 --max=10\n\n#Scale based on CPU Utilization - if you need it\n#kubectl autoscale deployment -n akash-services akash-provider --cpu-percent=50 --min=1 --max=10\n#kubectl autoscale deployment -n akash-services akash-node-1 --cpu-percent=50 --min=1 --max=10\n#kubectl autoscale deployment -n akash-services hostname-operator --cpu-percent=50 --min=1 --max=10\n```\n# Cluster status monitoring\n\nThe best tool to use for cluster uptime monitoring is [UpDown.io](https://updown.io/r/ygC5V).  Here is a reference for how to configure your page: [status.akash.world.](https://status.akash.world).  Follow the instructions on UpDown to configure your status url to : `status.providerdomain.com`\n\n# Remove a failed node from your cluster\n\n# Change internal ip of microk8s node\n\nOn every node (including the master(s)):\n\n    microk8s stop (Stop all nodes before changing configuration files)\n    Get the VPN IP of the node, e.g. 10.x.y.z. Command ip a show dev tun1 will show info for interface tun1.\n    Add this to the bottom of /var/snap/microk8s/current/args/kubelet:\n\n--node-ip=10.x.y.z\n\n    Add this to the bottom of /var/snap/microk8s/current/args/kube-apiserver:\n\n--advertise-address=10.x.y.z\n\n    microk8s start\n\nNow I see the correct values in the INTERNAL-IP column with microk8s kubectl get nodes -o wide.\n\n\n# Excessive kubernetes master pod restarts\n\nhttps://platform9.com/kb/kubernetes/excessive-kubernetes-master-pod-restarts\n\nEdit `nano /etc/etcd.env` and update `heartbeat-interval` and `election-timeout` to 100 and 1000.\n\n# Enable DNS over TLS for Akash Provider / Cloudflare Secure DNS\n\nOn your Kubernetes cluster you need to update coredns with the Cloudflare config.\n\nIn a terminal with access to your cluster with kubectl:\n```\nKUBE_EDITOR=\"nano\" kubectl edit cm coredns -n kube-system\n```\nThen change Forward to\n\n\n        forward . tls://1.1.1.1 tls://1.0.0.1 {\n        tls_servername tls.cloudflare-dns.com\n        health_check 5s\n        }\n\n# Backup and Restore Akash Provider from Storj\n\nUse Velero and Storj to create snapshot backups.\n\n```\nvelero install --provider tardigrade \\\n    --plugins storjlabs/velero-plugin \\\n    --bucket provider-backups \\\n    --backup-location-config accessGrant=replaceme \\\n    --no-secret\n```\n\n## Backup command\n`velero backup create $(hostname)`\n\n## Restore command\n`velero restore create --from-backup $(hostname)`\n\n## Create a daily backup, each living for 90 days (2160 hours).\n`velero create schedule $(hostname) --schedule=\"@every 24h\" --ttl 2160h0m0s`\n\n# Withdraw \n```\napt-get install -y bc jq\nexport AKASH_OUTPUT=json\nexport AKASH_NODE=http://\nPROVIDER=\n\nHEIGHT=$(akash query block | jq -r '.block.header.height')\nakash query market lease list \\\n  --provider $PROVIDER \\\n  --gseq 0 --oseq 0 \\\n  --state active --page 1 --limit 5000 \\\n  | jq -r '.leases[].lease | [(.lease_id | .owner, (.dseq|tonumber), (.gseq|tonumber), (.oseq|tonumber), .provider)] | @tsv | gsub(\"\\\\t\";\",\")' \\\n    | while IFS=, read owner dseq gseq oseq provider; do \\\n      REMAINING=$(akash query escrow blocks-remaining --dseq $dseq --owner $owner | jq -r '.balance_remaining')\n      ## FOR DEBUGGING/INFORMATIONAL PURPOSES\n      echo \"INFO: $owner/$dseq/$gseq/$oseq balance remaining $REMAINING\"\n\n      if (( $(echo \"$REMAINING \u003c 0\" | bc -l) )); then\n\n        ## UNCOMMENT WHEN READY\n        ( sleep 2s; cat key-pass.txt; cat key-pass.txt ) | akash tx market lease withdraw --provider $provider --owner $owner --dseq $dseq --oseq $oseq --gseq $gseq --gas-prices=0.025uakt --gas=auto --gas-adjustment=1.3 -y --from $provider\n        sleep 10\n        ## TODO: sleep 10 is necessary as a safeguard against account sequence re-use.\n        ## BUG: this script needs NOT to run at the same time provider withdraws the lease.\n\n        ## FOR DEBUGGING PURPOSES, COMMENT WHEN READY\n        #echo \"INFO: akash tx market lease withdraw --provider $provider --owner $owner --dseq $dseq --oseq $oseq --gseq $gseq --gas-prices=0.025uakt --gas=auto --gas-adjustment=1.3 -y\";\n\n      fi\n      done\n```\n\n# Zerotier\n\n```\n#Vultr setup script\n\n\nufw disable\napt-get remove --purge -y ufw\n\ncurl -s https://install.zerotier.com | sudo bash\nzerotier-cli join xxx\n\n# Ensure that we can forward packets between interfaces\nsysctl net.ipv4.ip_forward=1\nsed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g' /etc/sysctl.conf\n\n# Set up iptables rules\nip link | awk -F: '$0 !~ \"lo|vir|wl|^[^0-9]\"{print $2;getline}'\n# eth0        \u003c== This is our physical ethernet\n# ztyou2j6dw  \u003c==This is our ZeroTier Virtual Adapter\nPHY_IFACE=\"$(ip link | grep 'enp' | awk '{print substr($2,1,length($2)-1)}')\"\nZT_IFACE=\"$(ip link | grep 'zt' | awk '{print substr($2,1,length($2)-1)}')\" # \u003c== This command will grab your ZeroTier interface name\niptables -t nat -A POSTROUTING -o $PHY_IFACE -j MASQUERADE\niptables -A FORWARD -i $PHY_IFACE -o $ZT_IFACE -m state --state RELATED,ESTABLISHED -j ACCEPT\niptables -A FORWARD -i $ZT_IFACE -o $PHY_IFACE -j ACCEPT\n\n# Make sure the rules are persistent after reboot/poweroff\napt-get install -y iptables-persistent\nbash -c iptables-save \u003e /etc/iptables/rules.v4\n\n# Ensure that ZeroTier always comes back up after a reboot\nsystemctl enable zerotier-one\n\n\nWORKING!\nFIRST NODE: (can be on LAN/ZT)\nk3sup install --cluster --user akash --ip 192.168.1.x --k3s-extra-args \"--disable servicelb --disable traefik --disable metrics-server --disable-network-policy --flannel-backend=none --flannel-iface ztjlhz343e\"\n\nAdditional Control Plane/SERVERS: (on WAN/ZT)\nk3sup join --user root --ip 45.32.x.x --server-user akash --server-ip 172.24.x.x --server --k3s-extra-args \"--disable servicelb --disable traefik --disable metrics-server --disable-network-policy --flannel-backend=none --flannel-iface ztjlhz343e\"\n\nAGENTS: (on WAN/ZT)\nk3sup join --user root --ip 45.32.x.x --server-user akash --server-ip 172.24.x.x --k3s-extra-args \"--flannel-iface ztjlhz343e\"\n```\n\n# Run an Akash Provider with k3sup + zerotier + helm\n\n1.  Setup mysql/postgres server \n2.  Setup zerotier account and create a new network\n3.  Join the zerotier network on the machine you plan to run commands from (install plane)\n3.  Install Ubuntu 22.04 on first server (full control plane)\n4.  Install k3sup on install plane\n\n\nReplace Server IP with zerotier IP\nChange tls-san to your load balancer \nChange node-external-ip to the public IP of the node\nChange node-ip to the $SERVER_IP\n```\nexport SERVER_IP=172.22.x.x\nexport USER=root\nexport datastore=\"mysql://user:pass@tcp(dbserver:25060)/databasename\"\nk3sup install --ip $SERVER_IP --user $USER --datastore $datastore --token yoursupersecretokenthatnobodyknows --no-extras --tls-san balance.x.com --k3s-extra-args '--node-external-ip x.x.x.x --node-ip 172.22.x.x --flannel-iface ztyxa36bu3'\n```\nto add an agent - \nInstall Ubuntu 22.04 and run\n```\ncurl -s 'https://raw.githubusercontent.com/zerotier/ZeroTierOne/master/doc/contact%40zerotier.com.gpg' | gpg --import \u0026\u0026 \\\nif z=$(curl -s 'https://install.zerotier.com/' | gpg); then echo \"$z\" | sudo bash; fi\nzerotier-cli join YOURZEROTIERNETWORK\n```\n\nReplace AGENT_IP with zerotier IP\n\n```\nexport AGENT_IP=172.22.x.x\nexport SERVER_IP=balance.bdl.computer\nexport USER=root\n\nk3sup join --user $USER --ip $AGENT_IP --server-host $SERVER_IP --server-ip x.x.x.x --k3s-extra-args '--node-ip 172.22.x.x --flannel-iface ztyxa36bu3'\n```\n\n```\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F88plug%2Fakash-provider-tools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F88plug%2Fakash-provider-tools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F88plug%2Fakash-provider-tools/lists"}