diff --git a/README.md b/README.md index 1217cb8..cc06834 100644 --- a/README.md +++ b/README.md @@ -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 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 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 ./install.sh ``` -Then to start the worker api server +Just press enter when it shows any prompts. + +Start the worker api server using ```sh screen -dmS hnshosting-worker python3 main.py ``` -Add worker to master server: +Add worker to master server pool: ```sh curl -X POST http://master-server-ip:5000/add-worker?worker=worker-name&ip=worker-server-ip -H "key: api-key" diff --git a/assets/overview.png b/assets/overview.png new file mode 100644 index 0000000..f7392ce Binary files /dev/null and b/assets/overview.png differ diff --git a/master/main.py b/master/main.py index b5effa2..36cd397 100644 --- a/master/main.py +++ b/master/main.py @@ -168,17 +168,23 @@ def list_workers(): for worker in workers: # Check worker status if not worker.__contains__(':'): - return jsonify({'error': 'No workers available', 'success': 'false'}) + continue online=True resp=requests.get("http://"+worker.split(':')[1].strip('\n') + ":5000/status",timeout=2) if (resp.status_code != 200): 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 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}) @app.route('/site-info', methods=['GET']) diff --git a/worker/install.sh b/worker/install.sh index e2eb95a..7a1a95b 100644 --- a/worker/install.sh +++ b/worker/install.sh @@ -2,23 +2,28 @@ # Initial install for all prerequisites for the project. # This makes it quicker to get each site up and running. -# Update the system -sudo apt update && sudo apt upgrade -y +# Stop kernel prompts +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 -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 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 apt-cache policy docker-ce -sudo apt install docker-ce -y -sudo apt install docker-compose -y - -# Install NGINX -sudo apt install nginx -y +sudo apt install docker-ce docker-compose -y # Install python prerequisites -sudo apt install python3-pip -y python3 -m pip install -r requirements.txt cp .env.example .env chmod +x wp.sh tlsa.sh + +# Pull docker images to save time later +docker pull mysql:5.7 & +docker pull wordpress:latest & +wait \ No newline at end of file diff --git a/worker/main.py b/worker/main.py index ea978d5..cdb9c62 100644 --- a/worker/main.py +++ b/worker/main.py @@ -67,16 +67,11 @@ def ping(): return 'pong' def get_sites_count(): - # If file doesn't exist, create it - try: - 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()) + # Get number of files in nginx/sites + dir = os.listdir('/etc/nginx/sites-available') + num_Sites = len(dir) - 1 # Return number of lines in file - return len(sites_file.readlines()) + return num_Sites def site_exists(domain): # If file doesn't exist, create it