29 Commits

Author SHA1 Message Date
5efe4860fc actions: Fix syntax
All checks were successful
Build Docker for Release / Build Master (push) Successful in 24s
Build Docker for Release / Build Bot (push) Successful in 24s
Build Docker / Build Master (push) Successful in 29s
Build Docker / Build Bot (push) Successful in 27s
2023-08-25 13:55:31 +10:00
499a7e348b Merge branch 'develop' into main
All checks were successful
Build Docker / Build Master (push) Successful in 23s
Build Docker / Build Bot (push) Successful in 21s
2023-08-25 13:53:58 +10:00
ed94263050 actions: Don't run dev action when tag is pushed
All checks were successful
Build Docker / Build Master (push) Successful in 25s
Build Docker / Build Bot (push) Successful in 23s
2023-08-25 13:53:28 +10:00
4841344d63 actions: Finished adding release
All checks were successful
Build Docker / Build Master (push) Successful in 26s
Build Docker / Build Bot (push) Successful in 26s
2023-08-25 13:48:39 +10:00
51bcdda5d4 actions: Initial release job
All checks were successful
Build Docker / Build Bot (push) Successful in 21s
Build Docker / Build Master (push) Successful in 23s
Build Docker for Release / TEST (push) Successful in 5s
2023-08-25 13:44:13 +10:00
b38de6ad52 actions: Use same numbering on bot deployment
All checks were successful
Build Docker / Build Bot (push) Successful in 21s
Build Docker / Build Master (push) Successful in 23s
2023-08-25 13:39:26 +10:00
b642cf7269 actions: Try using the actions run variable
All checks were successful
Build Docker / Build Master (push) Successful in 24s
Build Docker / Build Bot (push) Successful in 22s
2023-08-25 13:37:24 +10:00
3e3c2fe61e actions: Test 4 change numbering
All checks were successful
Build Docker / Build Bot (push) Successful in 23s
Build Docker / Build Master (push) Successful in 25s
2023-08-25 13:28:06 +10:00
04edb8b456 actions: Test 3 change numbering
Some checks failed
Build Docker / Build Master (push) Failing after 21s
Build Docker / Build Bot (push) Successful in 27s
2023-08-25 13:26:41 +10:00
45c1ea3557 actions: Test 2 change numbering
All checks were successful
Build Docker / Build Bot (push) Successful in 22s
Build Docker / Build Master (push) Successful in 25s
2023-08-25 13:25:00 +10:00
778c1b3d92 actions: Change numbering
All checks were successful
Build Docker / Build Bot (push) Successful in 28s
Build Docker / Build Master (push) Successful in 29s
2023-08-25 13:21:24 +10:00
19806b7b1b Merge branch 'feature/send_info_on_ready' into develop
All checks were successful
Build Docker / Build Master (push) Successful in 26s
Build Docker / Build Bot (push) Successful in 26s
2023-08-25 12:59:19 +10:00
908a4e0422 bot: Check for install every 5 seconds
All checks were successful
Build Docker / Build Master (push) Successful in 22s
Build Docker / Build Bot (push) Successful in 26s
2023-08-25 12:54:31 +10:00
d217309e74 bot: Fixed check if site ready function args
All checks were successful
Build Docker / Build Master (push) Successful in 21s
Build Docker / Build Bot (push) Successful in 24s
2023-08-25 12:51:58 +10:00
ce8827ed97 worker: Install missing update repo
All checks were successful
Build Docker / Build Bot (push) Successful in 24s
Build Docker / Build Master (push) Successful in 25s
2023-08-25 12:49:29 +10:00
3b914abf7a bot: Send a dm with the site info when the site is ready
All checks were successful
Build Docker / Build Master (push) Successful in 23s
Build Docker / Build Bot (push) Successful in 26s
2023-08-25 12:46:08 +10:00
3266dbafa9 Merge branch 'develop' into main
All checks were successful
Build Docker / Build Master (push) Successful in 26s
Build Docker / Build Bot (push) Successful in 25s
2023-08-25 12:36:40 +10:00
d7c6e1cf70 docs: Cleared up some info
All checks were successful
Build Docker / Build Master (push) Successful in 24s
Build Docker / Build Bot (push) Successful in 22s
2023-08-25 12:36:23 +10:00
dbbb60cab8 bot: Add private ip to new worker command
All checks were successful
Build Docker / Build Bot (push) Successful in 27s
Build Docker / Build Master (push) Successful in 27s
2023-08-25 12:26:26 +10:00
f54d805371 main: Initial private ip for api 2023-08-25 12:25:23 +10:00
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
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
8 changed files with 176 additions and 42 deletions

View File

@@ -1,6 +1,11 @@
name: Build Docker name: Build Docker
run-name: Build Docker Images run-name: Build Docker Images
on: [push] on:
push:
branches:
- '*'
tags-ignore:
- '*'
jobs: jobs:
Build Master: Build Master:
@@ -21,10 +26,12 @@ jobs:
run : | run : |
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)
echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}"
tag=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}} tag=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}
tag=${tag//\//-} tag=${tag//\//-}
tag_num=${GITHUB_RUN_NUMBER}
echo "tag_num=$tag_num"
if [[ "$tag" == "main" ]]; then if [[ "$tag" == "main" ]]; then
tag="latest" tag="latest"
else else
@@ -60,10 +67,10 @@ jobs:
run : | run : |
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)
echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}"
tag=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}} tag=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}
tag=${tag//\//-} tag=${tag//\//-}
tag_num=${GITHUB_RUN_NUMBER}
if [[ "$tag" == "main" ]]; then if [[ "$tag" == "main" ]]; then
tag="latest" tag="latest"
else else
@@ -74,5 +81,4 @@ jobs:
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:$tag docker tag hnshosting-bot:$tag_num git.woodburn.au/nathanwoodburn/hnshosting-bot:$tag
docker push git.woodburn.au/nathanwoodburn/hnshosting-bot:$tag docker push git.woodburn.au/nathanwoodburn/hnshosting-bot:$tag

View File

@@ -0,0 +1,60 @@
name: Build Docker for Release
run-name: Build Docker Images
on:
push:
tags:
- '*'
jobs:
Build Master:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Install Docker
run : |
apt-get install ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install docker-ce-cli -y
- name: Build Docker image
run : |
cd master
echo "${{ secrets.DOCKERGIT_TOKEN }}" | docker login git.woodburn.au -u nathanwoodburn --password-stdin
tag=${GITHUB_REF#refs/tags/}
docker build -t hnshosting-master:release-$tag .
docker tag hnshosting-master:release-$tag git.woodburn.au/nathanwoodburn/hnshosting-master:release-$tag
docker push git.woodburn.au/nathanwoodburn/hnshosting-master:release-$tag
docker tag hnshosting-master:release-$tag git.woodburn.au/nathanwoodburn/hnshosting-master:release
docker push git.woodburn.au/nathanwoodburn/hnshosting-master:release
Build Bot:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Install Docker
run : |
apt-get install ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install docker-ce-cli -y
- name: Build Docker image
run : |
cd discord-bot
echo "${{ secrets.DOCKERGIT_TOKEN }}" | docker login git.woodburn.au -u nathanwoodburn --password-stdin
tag=${GITHUB_REF#refs/tags/}
docker build -t hnshosting-bot:release-$tag .
docker tag hnshosting-bot:release-$tag git.woodburn.au/nathanwoodburn/hnshosting-bot:release-$tag
docker push git.woodburn.au/nathanwoodburn/hnshosting-bot:release-$tag
docker tag hnshosting-bot:release-$tag git.woodburn.au/nathanwoodburn/hnshosting-bot:release
docker push git.woodburn.au/nathanwoodburn/hnshosting-bot:release

View File

@@ -11,12 +11,20 @@ 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).
``` ```
/addworker <ip> <name> | add a worker to the master server pool (Make sure the master can access port 5000 on the worker, and don't allow anyone else to access it) /addworker <ip> <private ip> <name> | add a worker to the master server pool
/listworkers | list all workers /listworkers | list all workers
/licence | Creates a licence key (valid for 1 wp site) /licence | Creates a licence key (valid for 1 wp site)
``` ```
@@ -74,15 +82,22 @@ 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:
The master server will need to be able to access port 5000 on the worker server over the PRIVATE ip. This is not secured by the api key so make sure you don't allow anyone else to access it.
```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&priv=worker-server-private-ip -H "key: api-key"
```
Alternatively you can use the discord bot to add the worker to the master server pool.
```
/addworker <ip> <private ip> <name>
``` ```
## Discord bot install ## Discord bot install

BIN
assets/overview.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

View File

@@ -3,6 +3,7 @@ from dotenv import load_dotenv
import discord import discord
from discord import app_commands from discord import app_commands
import requests import requests
import asyncio
load_dotenv() load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN') TOKEN = os.getenv('DISCORD_TOKEN')
@@ -21,9 +22,9 @@ client = discord.Client(intents=intents)
tree = app_commands.CommandTree(client) tree = app_commands.CommandTree(client)
@tree.command(name="addworker", description="Adds a worker to the master server") @tree.command(name="addworker", description="Adds a worker to the master server")
async def addworker(ctx, ip: str, name: str): async def addworker(ctx, ip: str,privateip: str, name: str):
if ctx.user.id == ADMINID: if ctx.user.id == ADMINID:
r = requests.post(f"http://{Master_IP}:{Master_Port}/add-worker?worker={name}&ip={ip}",headers={"key":os.getenv('WORKER_KEY')}) r = requests.post(f"http://{Master_IP}:{Master_Port}/add-worker?worker={name}&ip={ip}&priv={privateip}",headers={"key":os.getenv('WORKER_KEY')})
if r.status_code == 200: if r.status_code == 200:
await ctx.response.send_message(f"Worker {name} added to the master server",ephemeral=True) await ctx.response.send_message(f"Worker {name} added to the master server",ephemeral=True)
else: else:
@@ -69,7 +70,22 @@ async def createsite(ctx, domain: str, licence: str):
if r.status_code == 200: if r.status_code == 200:
json = r.json() json = r.json()
if json['success'] == "true": if json['success'] == "true":
await ctx.response.send_message(f"Site {domain} creating...\nPlease wait a few minutes and then send /siteinfo domain:{domain}") await ctx.response.send_message(f"Site {domain} creating...\nI'll send you a message when it's ready")
ready = False
while ready == False:
ready = await check_site_ready(domain)
if ready == False:
await asyncio.sleep(5)
r = requests.get(f"http://{Master_IP}:{Master_Port}/site-info?domain={domain}")
json = r.json()
if json['success'] == "true":
await ctx.user.send(f"Site {domain} is ready!\nHere is the site info for {json['domain']}\nA: `{json['ip']}`\nTLSA: `{json['tlsa']}`\nMake sure you put the TLSA in either `_443._tcp.{domain}` or `*.{domain}`")
else:
await ctx.user.send(f"Error getting site info\n" + json['error'])
else: else:
await ctx.response.send_message(f"Error creating site\n" + json['error']) await ctx.response.send_message(f"Error creating site\n" + json['error'])
else: else:
@@ -88,6 +104,17 @@ async def siteinfo(ctx, domain: str):
else: else:
await ctx.response.send_message(f"Error getting site info\n" + r.text) await ctx.response.send_message(f"Error getting site info\n" + r.text)
async def check_site_ready(domain):
r = requests.get(f"http://{Master_IP}:{Master_Port}/site-info?domain={domain}")
if r.status_code == 200:
json = r.json()
if json['success'] == "true":
return True
else:
return False
else:
return False
# When the bot is ready # When the bot is ready
@client.event @client.event
async def on_ready(): async def on_ready():

View File

@@ -107,9 +107,10 @@ def new_site():
def add_worker(): def add_worker():
worker=request.args.get('worker') worker=request.args.get('worker')
worker_IP=request.args.get('ip') worker_IP=request.args.get('ip')
worker_PRIV=request.args.get('priv')
# Get API header # Get API header
api_key = request.headers.get('key') api_key = request.headers.get('key')
if api_key == None or worker == None or worker_IP == None: if api_key == None or worker == None or worker_IP == None or worker_PRIV == None:
return jsonify({'error': 'Invalid API key or worker info', 'success': 'false'}) return jsonify({'error': 'Invalid API key or worker info', 'success': 'false'})
if api_key != os.getenv('WORKER_KEY'): if api_key != os.getenv('WORKER_KEY'):
return jsonify({'error': 'Invalid API key', 'success': 'false'}) return jsonify({'error': 'Invalid API key', 'success': 'false'})
@@ -130,11 +131,11 @@ def add_worker():
# Add worker to file # Add worker to file
workers_file = open('/data/workers.txt', 'a') workers_file = open('/data/workers.txt', 'a')
workers_file.write(worker + ":" + worker_IP + '\n') workers_file.write(worker + ":" + worker_PRIV + ":"+ worker_IP + '\n')
workers_file.close() workers_file.close()
online=True online=True
resp=requests.get("http://"+worker_IP + ":5000/ping",timeout=2) resp=requests.get("http://"+worker_PRIV + ":5000/ping",timeout=2)
if (resp.status_code != 200): if (resp.status_code != 200):
online=False online=False
@@ -168,17 +169,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(':')[2].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(':')[2].strip('\n'), 'online': online, 'sites': sites, 'status': 'ready'})
else:
worker_list.append({'worker': worker.split(':')[0],'ip': worker.split(':')[2].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'])
@@ -197,17 +204,18 @@ def site_status():
return jsonify({'error': 'Domain does not exist', 'success': 'false'}) return jsonify({'error': 'Domain does not exist', 'success': 'false'})
# Get worker ip # Get worker ip
ip = workerIP(worker) ip = workerIP_PRIV(worker)
# Get TLSA record # Get TLSA record
resp=requests.get("http://"+ip + ":5000/tlsa?domain=" + domain,timeout=2) resp=requests.get("http://"+ip + ":5000/tlsa?domain=" + domain,timeout=2)
json = resp.json() json = resp.json()
publicIP = workerIP(worker)
if "tlsa" in json: if "tlsa" in json:
tlsa = json['tlsa'] tlsa = json['tlsa']
return jsonify({'success': 'true', 'domain': domain, 'ip': ip, 'tlsa': tlsa}) return jsonify({'success': 'true', 'domain': domain, 'ip': publicIP, 'tlsa': tlsa})
else: else:
return jsonify({'success': 'false', 'domain': domain, 'ip': ip, 'tlsa': 'none','error': 'No TLSA record found'}) return jsonify({'success': 'false', 'domain': domain, 'ip': publicIP, 'tlsa': 'none','error': 'No TLSA record found'})
@app.route('/tlsa', methods=['GET']) @app.route('/tlsa', methods=['GET'])
@@ -226,7 +234,7 @@ def tlsa():
return jsonify({'error': 'Domain does not exist', 'success': 'false'}) return jsonify({'error': 'Domain does not exist', 'success': 'false'})
# Get worker ip # Get worker ip
ip = workerIP(worker) ip = workerIP_PRIV(worker)
# Get TLSA record # Get TLSA record
resp=requests.get("http://"+ip + ":5000/tlsa?domain=" + domain,timeout=2) resp=requests.get("http://"+ip + ":5000/tlsa?domain=" + domain,timeout=2)
@@ -337,6 +345,24 @@ def site_worker(domain):
sites_file.close() sites_file.close()
return worker return worker
def workerIP_PRIV(worker):
# If file doesn't exist, create it
try:
workers_file = open('/data/workers.txt', 'r')
except FileNotFoundError:
workers_file = open('/data/workers.txt', 'w')
workers_file.close()
workers_file = open('/data/workers.txt', 'r')
ip = None
for line in workers_file.readlines():
if worker == line.split(':')[0]:
ip = line.split(':')[2].strip('\n')
break
workers_file.close()
return ip
def workerIP(worker): def workerIP(worker):
# If file doesn't exist, create it # If file doesn't exist, create it
try: try:
@@ -354,7 +380,6 @@ def workerIP(worker):
workers_file.close() workers_file.close()
return ip return ip
# Start the server # Start the server

View File

@@ -2,23 +2,29 @@
# 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 update
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