main: Initial flask server

This commit is contained in:
Nathan Woodburn 2023-08-16 13:47:49 +10:00
parent 5fbdd00556
commit d4ebe6894e
Signed by: nathanwoodburn
GPG Key ID: 203B000478AD0EF1
4 changed files with 203 additions and 12 deletions

View File

@ -1 +1,27 @@
# hnshosting-wp # HNSHosting Wordpress
This is split into two parts.
There is the master server which is the server that will be used to manage the worker servers.
Then there is the worker server which is the server that will be used to host the wordpress site.
This is done to make it easier to manage multiple wordpress sites on multiple servers.
## Master server install
Install prerequisites:
```
chmod +x install.sh
./install.sh
```
This will create the service to run the master server.
## Worker server install
Install prerequisites:
```
chmod +x install.sh
./install.sh
```

View File

@ -1,18 +1,49 @@
#!/bin/bash #!/bin/bash
# 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.
# Update the system # Update the system
sudo apt update && sudo apt upgrade -y sudo apt update && sudo apt upgrade -y
# Install Docker # Install python prerequisites
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y python3 -m pip install -r requirements.txt
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 # Create a service to run the python web server
sudo apt install nginx -y
# Flask app directory and file
APP_DIR=$(pwd)
APP_FILE=main.py
# Name for your systemd service
SERVICE_NAME=HNSHosting-Main
# Create a user and group to run the service
SERVICE_USER=hnshosting
SERVICE_GROUP=hnshosting
sudo groupadd $SERVICE_GROUP
sudo useradd -g $SERVICE_GROUP $SERVICE_USER
# Create a systemd service unit file
echo "[Unit]
Description=HNSHosting Main Service
After=network.target
[Service]
User=$SERVICE_USER
Group=$SERVICE_GROUP
WorkingDirectory=$APP_DIR
ExecStart=/usr/bin/python3 $APP_DIR/$APP_FILE
Restart=always
[Install]
WantedBy=multi-user.target" | sudo tee /etc/systemd/system/$SERVICE_NAME.service
# Reload systemd to pick up the new unit file
sudo systemctl daemon-reload
# Enable and start the service
sudo systemctl enable $SERVICE_NAME
sudo systemctl start $SERVICE_NAME
echo "Service created and started."

130
main.py Normal file
View File

@ -0,0 +1,130 @@
from flask import Flask, request, jsonify
import dotenv
import os
dotenv.load_dotenv()
app = Flask(__name__)
# API add license key (requires API key in header)
@app.route('/add-licence', methods=['POST'])
def add_license():
# Get API header
api_key = request.headers.get('key')
if api_key != os.getenv('LICENCE-API'):
return jsonify({'error': 'Invalid API key', 'success': 'false'})
# Generate licence key
licence_key = os.urandom(16).hex()
# Add license key to file
key_file = open('licence_key.txt', 'a')
key_file.write(licence_key + '\n')
key_file.close()
return jsonify({'success': "true", 'licence_key': licence_key})
@app.route('/new-site', methods=['POST'])
def new_site():
domain=request.args.get('domain')
# Get API header
api_key = request.headers.get('key')
# Verify both API key and domain exist
if api_key == None or domain == None:
return jsonify({'error': 'Invalid API key or domain', 'success': 'false'})
# Check if API key is a valid site key
if api_key not in open('licence_key.txt', 'r').read():
return jsonify({'error': 'Invalid API key', 'success': 'false'})
# Check if domain already exists
if site_exists(domain):
return jsonify({'error': 'Domain already exists', 'success': 'false'})
# Add domain to file
sites_file = open('sites.txt', 'a')
sites_file.write(domain + '\n')
sites_file.close()
# Use key
key_file = open('licence_key.txt', 'r')
lines = key_file.readlines()
key_file.close()
key_file = open('licence_key.txt', 'w')
for line in lines:
if line.strip("\n") != api_key:
key_file.write(line)
key_file.close()
return jsonify({'success': 'true', 'domain': domain, 'status': "creating"})
# Add worker
@app.route('/add-worker', methods=['POST'])
def add_worker():
worker=request.args.get('worker')
# Get API header
api_key = request.headers.get('key')
if api_key == None or worker == None:
return jsonify({'error': 'Invalid API key or worker', 'success': 'false'})
if api_key != os.getenv('WORKER_KEY'):
return jsonify({'error': 'Invalid API key', 'success': 'false'})
# Check worker file
try:
workers_file = open('workers.txt', 'r')
except FileNotFoundError:
workers_file = open('workers.txt', 'w')
workers_file.close()
workers_file = open('workers.txt', 'r')
# Check if worker already exists
if worker in workers_file.read():
return jsonify({'error': 'Worker already exists', 'success': 'false'})
workers_file.close()
# Add worker to file
workers_file = open('workers.txt', 'a')
workers_file.write(worker + '\n')
workers_file.close()
return jsonify({'success': 'true', 'worker': worker, 'status': "ready to join"})
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')
num=len(sites_file.readlines())
sites_file.close()
# Return number of lines in file
return num
def site_exists(domain):
# 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')
contains_site = False
# Check if domain is in file
if domain in sites_file.read():
contains_site = True
sites_file.close()
return contains_site
# Start the server
if __name__ == '__main__':
app.run(debug=False, port=5000)

4
requirements.txt Normal file
View File

@ -0,0 +1,4 @@
python-dotenv
requests
flask
jsonify