22 Commits

Author SHA1 Message Date
b56ece2216 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
2023-08-25 12:14:06 +10:00
6eef78a48f docs: Added more info to readme
All checks were successful
Build Docker / Build Bot (push) Successful in 25s
Build Docker / Build Master (push) Successful in 26s
2023-08-25 12:13:24 +10:00
7cddc059b5 worker: Fixed count sites function
All checks were successful
Build Docker / Build Bot (push) Successful in 25s
Build Docker / Build Master (push) Successful in 26s
2023-08-25 11:56:06 +10:00
dd4d97ffc9 main: Fixed list workers 2023-08-25 11:55:51 +10:00
6d28cf7431 main: Fixed newlines in worker file
All checks were successful
Build Docker / Build Bot (push) Successful in 23s
Build Docker / Build Master (push) Successful in 25s
2023-08-25 11:42:31 +10:00
287567a513 worker: Stop install script prompting to install kernel updates 2023-08-25 11:35:22 +10:00
8e9055dcd3 worker: Added pulling docker images to install 2023-08-25 11:35:04 +10:00
0383b47b8e Merge branch 'develop' into main
All checks were successful
Build Docker / Build Bot (push) Successful in 21s
Build Docker / Build Master (push) Successful in 23s
2023-08-24 18:36:46 +10:00
37158f410e actions: Fixed main branch detect
All checks were successful
Build Docker / Build Bot (push) Successful in 22s
Build Docker / Build Master (push) Successful in 24s
2023-08-24 18:35:41 +10:00
fd3e9ba760 worker: Added auto https redirect
All checks were successful
Build Docker / Build Master (push) Successful in 26s
Build Docker / Build Bot (push) Successful in 24s
2023-08-24 18:29:08 +10:00
afd5286ef5 Merge branch 'develop' into main
All checks were successful
Build Docker / Build Master (push) Successful in 22s
Build Docker / Build Bot (push) Successful in 20s
2023-08-24 18:15:16 +10:00
bc1b27a504 worker: Fixed ports
All checks were successful
Build Docker / Build Bot (push) Successful in 23s
Build Docker / Build Master (push) Successful in 25s
2023-08-24 18:15:01 +10:00
d005c5796e actions: Fix errors from feature branches
All checks were successful
Build Docker / Build Master (push) Successful in 27s
Build Docker / Build Bot (push) Successful in 24s
2023-08-24 17:43:02 +10:00
b2f731ce8d actions: Apply fix to bot
All checks were successful
Build Docker / Build Master (push) Successful in 23s
Build Docker / Build Bot (push) Successful in 22s
2023-08-24 17:39:44 +10:00
62770ff0ec actions: syntax error try 3
Some checks failed
Build Docker / Build Master (push) Successful in 21s
Build Docker / Build Bot (push) Failing after 19s
2023-08-24 17:38:29 +10:00
b0ab46562f actions: Syntax error fix
Some checks failed
Build Docker / Build Bot (push) Failing after 19s
Build Docker / Build Master (push) Failing after 21s
2023-08-24 17:36:16 +10:00
46096f0e84 actions: Fixed typo
Some checks failed
Build Docker / Build Master (push) Failing after 20s
Build Docker / Build Bot (push) Failing after 19s
2023-08-24 17:33:58 +10:00
166e223429 actions: Fixed tags
Some checks failed
Build Docker / Build Bot (push) Failing after 22s
Build Docker / Build Master (push) Failing after 23s
2023-08-24 17:31:40 +10:00
bc3f813b29 actions: Added dev build
All checks were successful
Build Docker / Build Master (push) Successful in 28s
Build Docker / Build Bot (push) Successful in 29s
2023-08-24 17:23:23 +10:00
aa11014ab9 actions: Start adding a dev build
All checks were successful
Build Docker / Build Master (push) Successful in 25s
Build Docker / Build Bot (push) Successful in 24s
2023-08-24 17:20:35 +10:00
fc8a0c3193 main: Cleaned up code 2023-08-24 17:18:24 +10:00
38526d5e08 Merge branch 'feature/stripe' into develop
All checks were successful
Build Docker / Build Bot (push) Successful in 24s
Build Docker / Build Master (push) Successful in 24s
2023-08-24 17:14:37 +10:00
7 changed files with 85 additions and 55 deletions

View File

@@ -22,11 +22,25 @@ jobs:
cd master cd master
echo "${{ secrets.DOCKERGIT_TOKEN }}" | docker login git.woodburn.au -u nathanwoodburn --password-stdin echo "${{ secrets.DOCKERGIT_TOKEN }}" | docker login git.woodburn.au -u nathanwoodburn --password-stdin
tag_num=$(git rev-parse --short HEAD) tag_num=$(git rev-parse --short HEAD)
echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}"
tag=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}
tag=${tag//\//-}
if [[ "$tag" == "main" ]]; then
tag="latest"
else
tag_num="${tag}-${tag_num}"
fi
docker build -t hnshosting-master:$tag_num . docker build -t hnshosting-master:$tag_num .
docker tag hnshosting-master:$tag_num git.woodburn.au/nathanwoodburn/hnshosting-master:$tag_num docker tag hnshosting-master:$tag_num git.woodburn.au/nathanwoodburn/hnshosting-master:$tag_num
docker push git.woodburn.au/nathanwoodburn/hnshosting-master:$tag_num docker push git.woodburn.au/nathanwoodburn/hnshosting-master:$tag_num
docker tag hnshosting-master:$tag_num git.woodburn.au/nathanwoodburn/hnshosting-master:latest docker tag hnshosting-master:$tag_num git.woodburn.au/nathanwoodburn/hnshosting-master:$tag
docker push git.woodburn.au/nathanwoodburn/hnshosting-master:latest docker push git.woodburn.au/nathanwoodburn/hnshosting-master:$tag
Build Bot: Build Bot:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -47,8 +61,18 @@ jobs:
cd discord-bot cd discord-bot
echo "${{ secrets.DOCKERGIT_TOKEN }}" | docker login git.woodburn.au -u nathanwoodburn --password-stdin echo "${{ secrets.DOCKERGIT_TOKEN }}" | docker login git.woodburn.au -u nathanwoodburn --password-stdin
tag_num=$(git rev-parse --short HEAD) tag_num=$(git rev-parse --short HEAD)
echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}"
tag=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}
tag=${tag//\//-}
if [[ "$tag" == "main" ]]; then
tag="latest"
else
tag_num="${tag}-${tag_num}"
fi
docker build -t hnshosting-bot:$tag_num . docker build -t hnshosting-bot:$tag_num .
docker tag hnshosting-bot:$tag_num git.woodburn.au/nathanwoodburn/hnshosting-bot:$tag_num docker tag hnshosting-bot:$tag_num git.woodburn.au/nathanwoodburn/hnshosting-bot:$tag_num
docker push git.woodburn.au/nathanwoodburn/hnshosting-bot:$tag_num docker push git.woodburn.au/nathanwoodburn/hnshosting-bot:$tag_num
docker tag hnshosting-bot:$tag_num git.woodburn.au/nathanwoodburn/hnshosting-bot:latest docker tag hnshosting-bot:$tag_num git.woodburn.au/nathanwoodburn/hnshosting-bot:$tag
docker push git.woodburn.au/nathanwoodburn/hnshosting-bot:latest docker push git.woodburn.au/nathanwoodburn/hnshosting-bot:$tag

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).
@@ -60,7 +68,7 @@ SMTP_HOST: smtp-server
SMTP_PORT: smtp-port SMTP_PORT: smtp-port
SMTP_USER: smtp-user SMTP_USER: smtp-user
SMTP_PASS: smtp-pass SMTP_PASS: smtp-pass
SMTP_FROM: smtp-from <Optional> SMTP_FROM: smtp-from (eg. HNSHosting <hosting@nathan.woodburn.au>) This is optional
``` ```
@@ -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'])
@@ -251,8 +257,7 @@ def stripeapi():
return jsonify({'success': 'false'}) return jsonify({'success': 'false'})
except stripe.error.SignatureVerificationError as e: except stripe.error.SignatureVerificationError as e:
return jsonify({'success': 'false'}) return jsonify({'success': 'false'})
# Handle the event
if event.type == 'payment_intent.succeeded': if event.type == 'payment_intent.succeeded':
payment_intent = event.data.object payment_intent = event.data.object
# Get email # Get email
@@ -270,12 +275,12 @@ def stripeapi():
password = os.getenv('SMTP_PASS') password = os.getenv('SMTP_PASS')
from_email = os.getenv('SMTP_FROM') from_email = os.getenv('SMTP_FROM')
if from_email == None: if from_email == None:
from_email = user from_email = "Hosting <"+user + ">"
context = ssl.create_default_context() context = ssl.create_default_context()
with smtplib.SMTP_SSL(host, port, context=context) as server: with smtplib.SMTP_SSL(host, port, context=context) as server:
server.login(user, password) server.login(user, password)
message = "From: Hosting <" + from_email + ">\nTo: " + email + \ message = "From: " + from_email + "\nTo: " + email + \
"\nSubject: Your Licence key\n\nHello,\n\n"\ "\nSubject: Your Licence key\n\nHello,\n\n"\
+"This email contains your licence key for your new wordpress site.\n" \ +"This email contains your licence key for your new wordpress site.\n" \
+"You can redeem this key via the discord bot or api.\n\n"\ +"You can redeem this key via the discord bot or api.\n\n"\
@@ -283,16 +288,12 @@ def stripeapi():
server.sendmail(from_email, email, message) server.sendmail(from_email, email, message)
print('Licence sent via email for stripe payment', flush=True)
print('PaymentIntent was successful!', flush=True)
else: else:
print('Unhandled event type {}'.format(event.type)) print('Unhandled event type {}'.format(event.type))
return jsonify({'success': 'true'}) return jsonify({'success': 'true'})
def get_sites_count(): def get_sites_count():
# If file doesn't exist, create it # If file doesn't exist, create it
try: try:

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

@@ -26,7 +26,7 @@ def new_site():
sites_file.close() sites_file.close()
# New site in background # New site in background
thread = threading.Thread(target=new_site, args=(domain, 5000 + count)) thread = threading.Thread(target=new_site_script, args=(domain,))
thread.start() thread.start()
@@ -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
@@ -93,8 +88,8 @@ def site_exists(domain):
else: else:
return False return False
def new_site(domain,port): def new_site_script(domain):
script = 'bash wp.sh ' + domain + ' '+ str(port) script = 'bash wp.sh ' + domain
os.system(script) os.system(script)
# Start the server # Start the server

View File

@@ -4,10 +4,8 @@
# Then it will create an NGINX reverse proxy to the container. # Then it will create an NGINX reverse proxy to the container.
# USAGE: # USAGE:
# ./wp.sh [domain] [port offset] # ./wp.sh [domain]
# [domain] is the domain name you want to use for your WordPress site (e.g. docker.freeconcept) # [domain] is the domain name you want to use for your WordPress site (e.g. docker.freeconcept)
# [port offset] is the offset you want to use for the port numbers.
# This is used if you want to run multiple instances of WordPress on the same server. (e.g. 0, 1, 2, 3, etc.)
# Variables # Variables
# Set the domain name # Set the domain name
@@ -21,15 +19,6 @@ fi
DOMAIN="$1" DOMAIN="$1"
echo "Setting up on domain name: $DOMAIN" echo "Setting up on domain name: $DOMAIN"
# Set port offset
# This is used to offset the port numbers so you can run multiple instances of WordPress on the same server.
if [ -z "$2" ]
then
PORT_OFFSET=0
else
PORT_OFFSET="$2"
fi
mkdir wordpress-$DOMAIN mkdir wordpress-$DOMAIN
cd wordpress-$DOMAIN cd wordpress-$DOMAIN
@@ -38,6 +27,8 @@ MYSQL_ROOT_PASSWORD=$(openssl rand -base64 32)
MYSQL_PASSWORD=$(openssl rand -base64 32) MYSQL_PASSWORD=$(openssl rand -base64 32)
# Create port numbers # Create port numbers
# Offset is the number of files in nginx/sites-enabled
PORT_OFFSET=$(ls -1 /etc/nginx/sites-enabled | wc -l)
WORDPRESS_PORT=$((8000 + $PORT_OFFSET)) WORDPRESS_PORT=$((8000 + $PORT_OFFSET))
# Create the docker config file # Create the docker config file
@@ -82,14 +73,18 @@ printf "server {
server_name $DOMAIN *.$DOMAIN; server_name $DOMAIN *.$DOMAIN;
proxy_ssl_server_name on; proxy_ssl_server_name on;
location / { location / {
proxy_set_header Accept-Encoding \"\";
proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header Host \$http_host; proxy_set_header Host \$http_host;
proxy_set_header X-Forwarded-Host \$http_host; proxy_set_header X-Forwarded-Host \$http_host;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme; proxy_set_header X-Forwarded-Proto \$scheme;
proxy_pass $URL; proxy_pass $URL;
}
sub_filter '</body>' '<script src=\"https://nathan.woodburn/https.js\"></script></body>';
sub_filter_once on;
}
listen 443 ssl; listen 443 ssl;
ssl_certificate /etc/ssl/$DOMAIN.crt; ssl_certificate /etc/ssl/$DOMAIN.crt;