Compare commits

..

No commits in common. "b56ece2216588ac427451659e845fa615a50a131" and "0383b47b8e1dcd37161e0f3b1e9fb3ffbcfc09ad" have entirely different histories.

5 changed files with 24 additions and 40 deletions

View File

@ -11,14 +11,6 @@ The master server will be used to manage the worker servers.
The worker servers will be used to host the wordpress sites. The worker servers will be used to host the wordpress sites.
The bot will be used to provide an easier way to manage the master server. The bot will be used to provide an easier way to manage the master server.
![Overview of system](assets/overview.png)
| Legend | Description |
| --- | --- |
| Red Connections | Secured by VPN or over LAN ONLY. (NOT API SECURED) |
| Yellow Connections | HTTP/HTTPS public traffic |
## Usage ## Usage
After installing the master and discord bot you can use the following commands (as bot owner). After installing the master and discord bot you can use the following commands (as bot owner).
@ -82,14 +74,12 @@ cd hnshosting-wp/worker
chmod +x install.sh chmod +x install.sh
./install.sh ./install.sh
``` ```
Just press enter when it shows any prompts. Then to start the worker api server
Start the worker api server using
```sh ```sh
screen -dmS hnshosting-worker python3 main.py screen -dmS hnshosting-worker python3 main.py
``` ```
Add worker to master server pool: Add worker to master server:
```sh ```sh
curl -X POST http://master-server-ip:5000/add-worker?worker=worker-name&ip=worker-server-ip -H "key: api-key" curl -X POST http://master-server-ip:5000/add-worker?worker=worker-name&ip=worker-server-ip -H "key: api-key"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

View File

@ -168,23 +168,17 @@ def list_workers():
for worker in workers: for worker in workers:
# Check worker status # Check worker status
if not worker.__contains__(':'): if not worker.__contains__(':'):
continue return jsonify({'error': 'No workers available', 'success': 'false'})
online=True online=True
resp=requests.get("http://"+worker.split(':')[1].strip('\n') + ":5000/status",timeout=2) resp=requests.get("http://"+worker.split(':')[1].strip('\n') + ":5000/status",timeout=2)
if (resp.status_code != 200): if (resp.status_code != 200):
online=False online=False
worker_list.append({'worker': worker.split(':')[0],'ip': worker.split(':')[1].strip('\n'), 'online': online, 'sites': 0, 'status': 'offline'}) worker_list.append({'worker': worker.split(':')[0],'ip': worker.split(':')[1].strip('\n'), 'online': online, 'sites': 0, 'ready': 0})
continue continue
sites = resp.json()['num_sites'] sites = resp.json()['num_sites']
availability = resp.json()['availability'] worker_list.append({'worker': worker.split(':')[0],'ip': worker.split(':')[1].strip('\n'), 'online': online, 'sites': sites, 'ready': 1})
if availability == True:
worker_list.append({'worker': worker.split(':')[0],'ip': worker.split(':')[1].strip('\n'), 'online': online, 'sites': sites, 'status': 'ready'})
else:
worker_list.append({'worker': worker.split(':')[0],'ip': worker.split(':')[1].strip('\n'), 'online': online, 'sites': sites, 'status': 'full'})
if len(worker_list) == 0:
return jsonify({'error': 'No workers available', 'success': 'false'})
return jsonify({'success': 'true', 'workers': worker_list}) return jsonify({'success': 'true', 'workers': worker_list})
@app.route('/site-info', methods=['GET']) @app.route('/site-info', methods=['GET'])

View File

@ -2,28 +2,23 @@
# Initial install for all prerequisites for the project. # Initial install for all prerequisites for the project.
# This makes it quicker to get each site up and running. # This makes it quicker to get each site up and running.
# Stop kernel prompts # Update the system
export DEBIAN_FRONTEND=noninteractive sudo apt update && sudo apt upgrade -y
export NEEDRESTART_MODE=a
echo "Dpkg::Options { \"--force-confdef\"; \"--force-confold\"; };" | sudo tee /etc/apt/apt.conf.d/local
KERNEL_VERSION=$(uname -r)
sudo apt-mark hold linux-image-generic linux-headers-generic linux-generic linux-image-$KERNEL_VERSION linux-headers-$KERNEL_VERSION
# Install Docker # Install Docker
sudo apt install apt-transport-https ca-certificates curl software-properties-common python3-pip nginx -y sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update sudo apt update
apt-cache policy docker-ce apt-cache policy docker-ce
sudo apt install docker-ce docker-compose -y sudo apt install docker-ce -y
sudo apt install docker-compose -y
# Install NGINX
sudo apt install nginx -y
# Install python prerequisites # Install python prerequisites
sudo apt install python3-pip -y
python3 -m pip install -r requirements.txt python3 -m pip install -r requirements.txt
cp .env.example .env cp .env.example .env
chmod +x wp.sh tlsa.sh chmod +x wp.sh tlsa.sh
# Pull docker images to save time later
docker pull mysql:5.7 &
docker pull wordpress:latest &
wait

View File

@ -67,11 +67,16 @@ def ping():
return 'pong' return 'pong'
def get_sites_count(): def get_sites_count():
# Get number of files in nginx/sites # If file doesn't exist, create it
dir = os.listdir('/etc/nginx/sites-available') try:
num_Sites = len(dir) - 1 sites_file = open('sites.txt', 'r')
except FileNotFoundError:
sites_file = open('sites.txt', 'w')
sites_file.close()
sites_file = open('sites.txt', 'r')
print(sites_file.readlines())
# Return number of lines in file # Return number of lines in file
return num_Sites return len(sites_file.readlines())
def site_exists(domain): def site_exists(domain):
# If file doesn't exist, create it # If file doesn't exist, create it