Merge branch 'develop' into main
All checks were successful
Build Docker / Build Bot (push) Successful in 25s
Build Docker / Build Master (push) Successful in 25s

This commit is contained in:
Nathan Woodburn 2023-08-25 12:14:06 +10:00
commit b56ece2216
Signed by: nathanwoodburn
GPG Key ID: 203B000478AD0EF1
5 changed files with 40 additions and 24 deletions

View File

@ -11,6 +11,14 @@ 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).
@ -74,12 +82,14 @@ cd hnshosting-wp/worker
chmod +x install.sh chmod +x install.sh
./install.sh ./install.sh
``` ```
Then to start the worker api server Just press enter when it shows any prompts.
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: Add worker to master server pool:
```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"

BIN
assets/overview.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

View File

@ -168,17 +168,23 @@ 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__(':'):
return jsonify({'error': 'No workers available', 'success': 'false'}) continue
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, 'ready': 0}) worker_list.append({'worker': worker.split(':')[0],'ip': worker.split(':')[1].strip('\n'), 'online': online, 'sites': 0, 'status': 'offline'})
continue continue
sites = resp.json()['num_sites'] sites = resp.json()['num_sites']
worker_list.append({'worker': worker.split(':')[0],'ip': worker.split(':')[1].strip('\n'), 'online': online, 'sites': sites, 'ready': 1}) availability = resp.json()['availability']
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,23 +2,28 @@
# 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.
# Update the system # Stop kernel prompts
sudo apt update && sudo apt upgrade -y export DEBIAN_FRONTEND=noninteractive
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 -y sudo apt install apt-transport-https ca-certificates curl software-properties-common python3-pip nginx -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 -y sudo apt install docker-ce docker-compose -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,16 +67,11 @@ def ping():
return 'pong' return 'pong'
def get_sites_count(): def get_sites_count():
# If file doesn't exist, create it # Get number of files in nginx/sites
try: dir = os.listdir('/etc/nginx/sites-available')
sites_file = open('sites.txt', 'r') num_Sites = len(dir) - 1
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 len(sites_file.readlines()) return num_Sites
def site_exists(domain): def site_exists(domain):
# If file doesn't exist, create it # If file doesn't exist, create it