Compare commits
23 Commits
8f5f8df0aa
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
9d06151ed2
|
|||
|
63ee2aa82b
|
|||
|
49acea31ac
|
|||
|
6b855a5b29
|
|||
|
9d57b8f858
|
|||
|
6d9ba77568
|
|||
|
9c5b00433f
|
|||
|
e241f6ffeb
|
|||
|
188334c850
|
|||
|
6ea4e72e8a
|
|||
|
56c7fcd617
|
|||
|
c9f8a8237d
|
|||
|
bda99dbf5f
|
|||
|
08f36a7a50
|
|||
|
94ebacd84d
|
|||
|
6f86987901
|
|||
|
910ce1b098
|
|||
|
6741f8cac2
|
|||
|
0365832e40
|
|||
|
40515700d1
|
|||
|
c130bfed69
|
|||
|
d19a121005
|
|||
|
d0ff839ff4
|
@@ -10,7 +10,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
Build Master:
|
Build Master:
|
||||||
runs-on: ubuntu-latest
|
runs-on: [ubuntu-latest, arm]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
@@ -51,7 +51,7 @@ jobs:
|
|||||||
|
|
||||||
|
|
||||||
Build Bot:
|
Build Bot:
|
||||||
runs-on: ubuntu-latest
|
runs-on: [ubuntu-latest, arm]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
Build Master:
|
Build Master:
|
||||||
runs-on: ubuntu-latest
|
runs-on: [ubuntu-latest,arm]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
@@ -34,7 +34,7 @@ jobs:
|
|||||||
docker push git.woodburn.au/nathanwoodburn/hnshosting-master:release
|
docker push git.woodburn.au/nathanwoodburn/hnshosting-master:release
|
||||||
|
|
||||||
Build Bot:
|
Build Bot:
|
||||||
runs-on: ubuntu-latest
|
runs-on: [ubuntu-latest,arm]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
|
|||||||
11
README.md
11
README.md
@@ -116,3 +116,14 @@ This will allow you to create a wordpress site without using a licence key using
|
|||||||
```
|
```
|
||||||
FREE_MODE: true
|
FREE_MODE: true
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Hip2
|
||||||
|
HIP2 allows sending HNS to a domain.
|
||||||
|
To enable HIP2 on your wordpress site you should
|
||||||
|
|
||||||
|
1. Download the [HIP2 plugin](https://git.woodburn.au/nathanwoodburn/hnshosting-wp/raw/branch/main/assets/hns-wallet-plugin.zip)
|
||||||
|
2. Upload the plugin to your wordpress site
|
||||||
|
3. Activate the plugin
|
||||||
|
4. Go to the settings page and enter your HNS wallet address
|
||||||
|
5. Ensure it works by settings the permalink to post name and saving
|
||||||
BIN
assets/hns-wallet-plugin.zip
Normal file
BIN
assets/hns-wallet-plugin.zip
Normal file
Binary file not shown.
@@ -51,6 +51,7 @@ async def listworkers(ctx):
|
|||||||
await ctx.response.send_message(f"Error listing workers\n" + r.text,ephemeral=True)
|
await ctx.response.send_message(f"Error listing workers\n" + r.text,ephemeral=True)
|
||||||
else:
|
else:
|
||||||
await ctx.response.send_message("You do not have permission to use this command",ephemeral=True)
|
await ctx.response.send_message("You do not have permission to use this command",ephemeral=True)
|
||||||
|
update_bot_status()
|
||||||
|
|
||||||
@tree.command(name="licence", description="Gets a licence key")
|
@tree.command(name="licence", description="Gets a licence key")
|
||||||
async def license(ctx):
|
async def license(ctx):
|
||||||
@@ -70,6 +71,14 @@ async def license(ctx):
|
|||||||
|
|
||||||
@tree.command(name="createsite", description="Create a new WordPress site")
|
@tree.command(name="createsite", description="Create a new WordPress site")
|
||||||
async def createsite(ctx, domain: str, licence: str = None):
|
async def createsite(ctx, domain: str, licence: str = None):
|
||||||
|
# Verify domain is valid
|
||||||
|
if domain == None:
|
||||||
|
await ctx.response.send_message("You must specify a domain",ephemeral=True)
|
||||||
|
return
|
||||||
|
if "http://" in domain or "https://" in domain:
|
||||||
|
await ctx.response.send_message("You must specify a domain without http:// or https://",ephemeral=True)
|
||||||
|
return
|
||||||
|
|
||||||
if FREE_LICENCE == True: # If free licences are enabled then auto generate a licence
|
if FREE_LICENCE == True: # If free licences are enabled then auto generate a licence
|
||||||
r = requests.post(f"http://{Master_IP}:{Master_Port}/add-licence",headers={"key":os.getenv('LICENCE_KEY')})
|
r = requests.post(f"http://{Master_IP}:{Master_Port}/add-licence",headers={"key":os.getenv('LICENCE_KEY')})
|
||||||
if r.status_code == 200:
|
if r.status_code == 200:
|
||||||
@@ -84,7 +93,7 @@ async def createsite(ctx, domain: str, licence: str = None):
|
|||||||
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...\nI'll send you a message when it's ready")
|
await ctx.response.send_message(f"Site https://{domain} creating...\nI'll send you a message when it's ready")
|
||||||
|
|
||||||
ready = False
|
ready = False
|
||||||
while ready == False:
|
while ready == False:
|
||||||
@@ -95,7 +104,7 @@ async def createsite(ctx, domain: str, licence: str = None):
|
|||||||
r = requests.get(f"http://{Master_IP}:{Master_Port}/site-info?domain={domain}")
|
r = requests.get(f"http://{Master_IP}:{Master_Port}/site-info?domain={domain}")
|
||||||
json = r.json()
|
json = r.json()
|
||||||
if json['success'] == "true":
|
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}`")
|
await ctx.user.send(f"Site https://{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:
|
else:
|
||||||
await ctx.user.send(f"Error getting site info\n" + json['error'])
|
await ctx.user.send(f"Error getting site info\n" + json['error'])
|
||||||
|
|
||||||
@@ -104,6 +113,7 @@ async def createsite(ctx, domain: str, licence: str = None):
|
|||||||
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:
|
||||||
await ctx.response.send_message(f"Error creating site\n" + r.text)
|
await ctx.response.send_message(f"Error creating site\n" + r.text)
|
||||||
|
update_bot_status()
|
||||||
|
|
||||||
|
|
||||||
@tree.command(name="siteinfo", description="Get info about a WordPress site")
|
@tree.command(name="siteinfo", description="Get info about a WordPress site")
|
||||||
@@ -129,12 +139,26 @@ async def check_site_ready(domain):
|
|||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def get_site_count():
|
||||||
|
r = requests.get(f"http://{Master_IP}:{Master_Port}/site-count")
|
||||||
|
if r.status_code == 200:
|
||||||
|
return r.text
|
||||||
|
else:
|
||||||
|
return "Error getting site count\n" + r.text
|
||||||
|
|
||||||
|
def update_bot_status():
|
||||||
|
site_count = get_site_count()
|
||||||
|
client.loop.create_task(client.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name="over " + site_count + " wordpress sites")))
|
||||||
|
|
||||||
# When the bot is ready
|
# When the bot is ready
|
||||||
@client.event
|
@client.event
|
||||||
async def on_ready():
|
async def on_ready():
|
||||||
global ADMINID
|
global ADMINID
|
||||||
ADMINID = client.application.owner.id
|
ADMINID = client.application.owner.id
|
||||||
await tree.sync()
|
await tree.sync()
|
||||||
await client.loop.create_task(client.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name="over HNSHosting wordpress")))
|
|
||||||
|
# Get the number of sites
|
||||||
|
site_count = get_site_count()
|
||||||
|
await client.loop.create_task(client.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name="over " + site_count + " wordpress sites")))
|
||||||
|
|
||||||
client.run(TOKEN)
|
client.run(TOKEN)
|
||||||
166
master/main.py
166
master/main.py
@@ -206,6 +206,7 @@ def list_workers():
|
|||||||
@app.route('/site-info', methods=['GET'])
|
@app.route('/site-info', methods=['GET'])
|
||||||
def site_status():
|
def site_status():
|
||||||
domain = request.args.get('domain')
|
domain = request.args.get('domain')
|
||||||
|
domain = domain.lower()
|
||||||
if domain == None:
|
if domain == None:
|
||||||
return jsonify({'error': 'Invalid domain', 'success': 'false'})
|
return jsonify({'error': 'Invalid domain', 'success': 'false'})
|
||||||
|
|
||||||
@@ -232,39 +233,10 @@ def site_status():
|
|||||||
else:
|
else:
|
||||||
return jsonify({'success': 'false', 'domain': domain, 'ip': publicIP, 'tlsa': 'none','error': 'No TLSA record found'})
|
return jsonify({'success': 'false', 'domain': domain, 'ip': publicIP, 'tlsa': 'none','error': 'No TLSA record found'})
|
||||||
|
|
||||||
|
|
||||||
@app.route('/info')
|
|
||||||
def site_status_human():
|
|
||||||
domain = request.args.get('domain')
|
|
||||||
if domain == None:
|
|
||||||
return "<h1>Invalid domain</h1>"
|
|
||||||
|
|
||||||
# Check if domain exists
|
|
||||||
if not site_exists(domain):
|
|
||||||
return "<h1>Domain does not exist</h1>"
|
|
||||||
|
|
||||||
# Get worker
|
|
||||||
worker = site_worker(domain)
|
|
||||||
if worker == None:
|
|
||||||
return "<h1>Domain does not exist</h1>"
|
|
||||||
|
|
||||||
# Get worker ip
|
|
||||||
ip = workerIP_PRIV(worker)
|
|
||||||
|
|
||||||
# Get TLSA record
|
|
||||||
resp=requests.get("http://"+ip + ":5000/tlsa?domain=" + domain,timeout=2)
|
|
||||||
json = resp.json()
|
|
||||||
publicIP = workerIP(worker)
|
|
||||||
|
|
||||||
if "tlsa" in json:
|
|
||||||
tlsa = json['tlsa']
|
|
||||||
return "<h1>Domain: " + domain + "</h1><br><p>IP: " + publicIP + "</p><br><p>TLSA: " + tlsa + "</p><br><p>Make sure to add the TLSA record to `_443._tcp." + domain + "` or `*." + domain + "`</p>"
|
|
||||||
else:
|
|
||||||
return "<h1>Domain: " + domain + "</h1><br><p>IP: " + publicIP + "</p><br><p>TLSA: none</p><br><p>No TLSA record found</p>"
|
|
||||||
|
|
||||||
@app.route('/tlsa', methods=['GET'])
|
@app.route('/tlsa', methods=['GET'])
|
||||||
def tlsa():
|
def tlsa():
|
||||||
domain = request.args.get('domain')
|
domain = request.args.get('domain')
|
||||||
|
domain = domain.lower()
|
||||||
if domain == None:
|
if domain == None:
|
||||||
return jsonify({'error': 'Invalid domain', 'success': 'false'})
|
return jsonify({'error': 'Invalid domain', 'success': 'false'})
|
||||||
|
|
||||||
@@ -305,7 +277,14 @@ def stripeapi():
|
|||||||
return jsonify({'success': 'false'})
|
return jsonify({'success': 'false'})
|
||||||
|
|
||||||
if event.type == 'payment_intent.succeeded':
|
if event.type == 'payment_intent.succeeded':
|
||||||
|
# Only for payments for licences
|
||||||
payment_intent = event.data.object
|
payment_intent = event.data.object
|
||||||
|
if payment_intent['amount'] != 1000:
|
||||||
|
return jsonify({'success': 'true'})
|
||||||
|
|
||||||
|
if payment_intent['description'] != "Subscription creation":
|
||||||
|
return jsonify({'success': 'true'})
|
||||||
|
|
||||||
# Get email
|
# Get email
|
||||||
email = payment_intent['receipt_email']
|
email = payment_intent['receipt_email']
|
||||||
# Create licence key
|
# Create licence key
|
||||||
@@ -401,7 +380,7 @@ def workerIP_PRIV(worker):
|
|||||||
ip = None
|
ip = None
|
||||||
for line in workers_file.readlines():
|
for line in workers_file.readlines():
|
||||||
if worker == line.split(':')[0]:
|
if worker == line.split(':')[0]:
|
||||||
ip = line.split(':')[2].strip('\n')
|
ip = line.split(':')[1].strip('\n')
|
||||||
break
|
break
|
||||||
|
|
||||||
workers_file.close()
|
workers_file.close()
|
||||||
@@ -419,7 +398,7 @@ def workerIP(worker):
|
|||||||
ip = None
|
ip = None
|
||||||
for line in workers_file.readlines():
|
for line in workers_file.readlines():
|
||||||
if worker == line.split(':')[0]:
|
if worker == line.split(':')[0]:
|
||||||
ip = line.split(':')[1].strip('\n')
|
ip = line.split(':')[2].strip('\n')
|
||||||
break
|
break
|
||||||
|
|
||||||
workers_file.close()
|
workers_file.close()
|
||||||
@@ -443,13 +422,128 @@ def home():
|
|||||||
return render_template('index.html', site_count = str(len(sites)))
|
return render_template('index.html', site_count = str(len(sites)))
|
||||||
|
|
||||||
# Register page
|
# Register page
|
||||||
@app.route('/register')
|
@app.route('/register', methods=['GET'])
|
||||||
def register():
|
def register():
|
||||||
buy_licence_link = os.getenv('BUY_LICENCE_LINK')
|
buy_licence_link = os.getenv('BUY_LICENCE_LINK')
|
||||||
|
|
||||||
|
|
||||||
# Show register template
|
# Show register template
|
||||||
return render_template('register.html', buy_licence_link=buy_licence_link)
|
return render_template('register.html', buy_licence_link=buy_licence_link, ERROR_MESSAGE="")
|
||||||
|
|
||||||
|
@app.route('/register', methods=['POST'])
|
||||||
|
def register_post():
|
||||||
|
buy_licence_link = os.getenv('BUY_LICENCE_LINK')
|
||||||
|
if 'licence' not in request.form:
|
||||||
|
return render_template('register.html', buy_licence_link=buy_licence_link, ERROR_MESSAGE="No licence key provided")
|
||||||
|
|
||||||
|
licence_key = request.form['licence']
|
||||||
|
# Check if licence key is valid
|
||||||
|
key_file = open('/data/licence_key.txt', 'r')
|
||||||
|
valid_key = False
|
||||||
|
for line in key_file.readlines():
|
||||||
|
if licence_key == line.strip('\n'):
|
||||||
|
valid_key = True
|
||||||
|
break
|
||||||
|
key_file.close()
|
||||||
|
if not valid_key:
|
||||||
|
return render_template('register.html', buy_licence_link=buy_licence_link, ERROR_MESSAGE="Invalid licence key")
|
||||||
|
|
||||||
|
# Get domain
|
||||||
|
domain = request.form['domain']
|
||||||
|
if domain == None:
|
||||||
|
return render_template('register.html', buy_licence_link=buy_licence_link, ERROR_MESSAGE="No domain provided")
|
||||||
|
# Check if domain already exists
|
||||||
|
if site_exists(domain):
|
||||||
|
return render_template('register.html', buy_licence_link=buy_licence_link, ERROR_MESSAGE="Domain already exists")
|
||||||
|
|
||||||
|
# Check if domain contains http:// or https://
|
||||||
|
if domain.startswith("http://") or domain.startswith("https://"):
|
||||||
|
return render_template('register.html', buy_licence_link=buy_licence_link, ERROR_MESSAGE="Domain should not contain http:// or https://")
|
||||||
|
|
||||||
|
# Set domain to lowercase
|
||||||
|
domain = domain.lower()
|
||||||
|
|
||||||
|
# Check if worker file exists
|
||||||
|
workers = None
|
||||||
|
try:
|
||||||
|
worker_file = open('/data/workers.txt', 'r')
|
||||||
|
workers = worker_file.readlines()
|
||||||
|
worker_file.close()
|
||||||
|
except FileNotFoundError:
|
||||||
|
return render_template('register.html', buy_licence_link=buy_licence_link, ERROR_MESSAGE="No workers available\nPlease contact support")
|
||||||
|
|
||||||
|
# Get a worker that has available slots
|
||||||
|
worker = None
|
||||||
|
for line in workers:
|
||||||
|
if not line.__contains__(':'):
|
||||||
|
continue
|
||||||
|
ip = line.split(':')[1].strip('\n')
|
||||||
|
resp=requests.get("http://"+ip + ":5000/status",timeout=2)
|
||||||
|
if (resp.status_code == 200):
|
||||||
|
if resp.json()['availability'] == True:
|
||||||
|
worker = line
|
||||||
|
break
|
||||||
|
|
||||||
|
if worker == None:
|
||||||
|
return render_template('register.html', buy_licence_link=buy_licence_link, ERROR_MESSAGE="No workers available\nPlease contact support")
|
||||||
|
|
||||||
|
# Delete licence key
|
||||||
|
key_file = open('/data/licence_key.txt', 'r')
|
||||||
|
lines = key_file.readlines()
|
||||||
|
key_file.close()
|
||||||
|
key_file = open('/data/licence_key.txt', 'w')
|
||||||
|
for line in lines:
|
||||||
|
if line.strip("\n") != licence_key:
|
||||||
|
key_file.write(line)
|
||||||
|
key_file.close()
|
||||||
|
|
||||||
|
# Add domain to file
|
||||||
|
sites_file = open('/data/sites.txt', 'a')
|
||||||
|
sites_file.write(domain + ':' + worker.split(':')[0] + '\n')
|
||||||
|
sites_file.close()
|
||||||
|
|
||||||
|
# Send worker request
|
||||||
|
requests.post("http://"+ worker.split(':')[1].strip('\n') + ":5000/new-site?domain=" + domain)
|
||||||
|
|
||||||
|
return redirect('/success?domain=' + domain + '&status=creating')
|
||||||
|
|
||||||
|
@app.route('/success')
|
||||||
|
@app.route('/info')
|
||||||
|
def success():
|
||||||
|
if 'domain' not in request.args:
|
||||||
|
return redirect('/')
|
||||||
|
domain = request.args.get('domain')
|
||||||
|
domain = domain.lower()
|
||||||
|
if not site_exists(domain):
|
||||||
|
return render_template('success.html', title="Your site is installing.<br>Please wait...",message="")
|
||||||
|
|
||||||
|
if 'status' not in request.args:
|
||||||
|
# Get worker
|
||||||
|
worker = site_worker(domain)
|
||||||
|
if worker == None:
|
||||||
|
return render_template('success.html', title="Your site is installing.<br>Please wait...",message="Error: Domain does not exist<br>Please contact support")
|
||||||
|
# Get worker ip
|
||||||
|
ip = workerIP_PRIV(worker)
|
||||||
|
|
||||||
|
# Get TLSA record
|
||||||
|
resp=requests.get("http://"+ip + ":5000/tlsa?domain=" + domain,timeout=2)
|
||||||
|
json = resp.json()
|
||||||
|
publicIP = workerIP(worker)
|
||||||
|
|
||||||
|
if "tlsa" in json:
|
||||||
|
tlsa = json['tlsa']
|
||||||
|
return render_template('success.html', title="Your site is ready!",message="Success<br>Domain: <code>" + domain + "</code><br>IP: <code>" + publicIP + "</code><br>TLSA: <code>" + tlsa + "</code><br>Make sure to add the TLSA record to <code>_443._tcp." + domain + "</code> or <code>*." + domain + "</code>")
|
||||||
|
else:
|
||||||
|
return render_template('success.html', title="Your site is installing.<br>Please wait...",message="Domain: <code>" + domain + "</code><br>IP: <code>" + publicIP + "</code><br>TLSA: Pending<br>No TLSA record found")
|
||||||
|
|
||||||
|
elif request.args.get('status') == 'creating':
|
||||||
|
return render_template('success.html')
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/site-count')
|
||||||
|
def site_count_route():
|
||||||
|
return str(get_sites_count())
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Admin page
|
# Admin page
|
||||||
@app.route('/admin')
|
@app.route('/admin')
|
||||||
@@ -604,7 +698,7 @@ def addsite():
|
|||||||
if domain.startswith("http://") or domain.startswith("https://"):
|
if domain.startswith("http://") or domain.startswith("https://"):
|
||||||
return jsonify({'error': 'Domain should not contain http:// or https://', 'success': 'false'})
|
return jsonify({'error': 'Domain should not contain http:// or https://', 'success': 'false'})
|
||||||
|
|
||||||
|
domain = domain.lower()
|
||||||
# Check if worker file exists
|
# Check if worker file exists
|
||||||
workers = None
|
workers = None
|
||||||
try:
|
try:
|
||||||
|
|||||||
12
master/templates/assets/js/status_update.js
Normal file
12
master/templates/assets/js/status_update.js
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
// Wait for 10 seconds
|
||||||
|
setTimeout(function() {
|
||||||
|
// Get the 'domain' parameter from the current URL
|
||||||
|
var urlParams = new URLSearchParams(window.location.search);
|
||||||
|
var domain = urlParams.get('domain');
|
||||||
|
|
||||||
|
// Construct the new URL with the 'domain' parameter
|
||||||
|
var newURL = "https://hnshosting.au/info?domain=" + domain;
|
||||||
|
|
||||||
|
// Redirect to the new URL
|
||||||
|
window.location.href = newURL;
|
||||||
|
}, 10000);
|
||||||
@@ -41,10 +41,12 @@
|
|||||||
<div class="col-md-6 col-xl-4">
|
<div class="col-md-6 col-xl-4">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-body text-center d-flex flex-column align-items-center">
|
<div class="card-body text-center d-flex flex-column align-items-center">
|
||||||
<form method="post" action="/add-site">
|
<form method="post" action="/register">
|
||||||
<div class="mb-3"><input type="text" name="domain" placeholder="Domain"></div>
|
<div class="mb-3"><input type="text" name="domain" placeholder="Domain"></div>
|
||||||
<div class="mb-3"><input type="text" placeholder="Licence Key" name="licence"></div>
|
<div class="mb-3"><input type="text" placeholder="Licence Key" name="licence"></div>
|
||||||
<div class="mb-3"><button class="btn btn-primary shadow d-block w-100" type="submit">Sign up</button></div>
|
<div class="mb-3">
|
||||||
|
<p style="color: rgb(255,0,0);">{{ERROR_MESSAGE}}</p><button class="btn btn-primary shadow d-block w-100" type="submit">Create site</button>
|
||||||
|
</div>
|
||||||
<p class="text-muted">Don't have a licence?<br><a href="{{buy_licence_link}}" target="_blank">Click here to buy one</a></p>
|
<p class="text-muted">Don't have a licence?<br><a href="{{buy_licence_link}}" target="_blank">Click here to buy one</a></p>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
58
master/templates/success.html
Normal file
58
master/templates/success.html
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html data-bs-theme="dark" lang="en" style="height: 100%;">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
|
||||||
|
<title>Home - HNSHosting</title>
|
||||||
|
<link rel="canonical" href="https://wp.hnshosting.au/success.html">
|
||||||
|
<meta property="og:url" content="https://wp.hnshosting.au/success.html">
|
||||||
|
<meta name="description" content="HNS Hosting Wordpress">
|
||||||
|
<link rel="icon" type="image/png" sizes="508x430" href="assets/img/favicon.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="508x430" href="assets/img/favicon.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="508x430" href="assets/img/favicon.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="508x430" href="assets/img/favicon.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="508x430" href="assets/img/favicon.png">
|
||||||
|
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
|
||||||
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800&display=swap">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body style="height: 100%;">
|
||||||
|
<nav class="navbar navbar-expand-md sticky-top py-3 navbar-dark" id="mainNav">
|
||||||
|
<div class="container"><a class="navbar-brand d-flex align-items-center" href="/"><span class="bs-icon-sm bs-icon-circle bs-icon-primary shadow d-flex justify-content-center align-items-center me-2 bs-icon" style="background: transparent;"><img src="assets/img/favicon.png" style="width: 100%;"></span><span>HNSHosting</span></a><button data-bs-toggle="collapse" class="navbar-toggler" data-bs-target="#navcol-1"><span class="visually-hidden">Toggle navigation</span><span class="navbar-toggler-icon"></span></button>
|
||||||
|
<div class="collapse navbar-collapse" id="navcol-1">
|
||||||
|
<ul class="navbar-nav mx-auto">
|
||||||
|
<li class="nav-item"><a class="nav-link" href="/">Home</a></li>
|
||||||
|
<li class="nav-item"><a class="nav-link" href="/#contact">Contact</a></li>
|
||||||
|
<li class="nav-item"><a class="nav-link" href="register">Register Site</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
<header class="bg-dark" style="height: 75%;">
|
||||||
|
<div class="container pt-4 pt-xl-5">
|
||||||
|
<div class="row pt-5" style="height: 100%;">
|
||||||
|
<div class="col-md-8 col-xl-6 text-center text-md-start mx-auto">
|
||||||
|
<div class="text-center">
|
||||||
|
<p class="fw-bold text-success mb-2">Success</p>
|
||||||
|
<h1 class="fw-bold">{{title| safe}}</h1>
|
||||||
|
</div>
|
||||||
|
<p class="text-center">{{message | safe}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<footer class="bg-dark">
|
||||||
|
<div class="container py-4 py-lg-5">
|
||||||
|
<hr>
|
||||||
|
<div class="text-muted d-flex justify-content-between align-items-center pt-3">
|
||||||
|
<p class="mb-0">Copyright © 2023 HNSHosting</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
|
||||||
|
<script src="assets/js/bold-and-dark.js"></script>
|
||||||
|
<script src="assets/js/status_update.js"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
@@ -44,8 +44,8 @@ def tlsa():
|
|||||||
tlsa_file = open('wordpress-'+domain+'/tlsa.txt', 'r')
|
tlsa_file = open('wordpress-'+domain+'/tlsa.txt', 'r')
|
||||||
tlsa = tlsa_file.readlines()
|
tlsa = tlsa_file.readlines()
|
||||||
tlsa_file.close()
|
tlsa_file.close()
|
||||||
except FileNotFoundError:
|
except FileNotFoundError as e:
|
||||||
return jsonify({'error': 'TLSA record not found', 'success': 'false'})
|
return jsonify({'error': 'TLSA record not found', 'success': 'false', 'ex': str(e)})
|
||||||
|
|
||||||
# Remove newlines
|
# Remove newlines
|
||||||
tlsa = tlsa[0].strip('\n')
|
tlsa = tlsa[0].strip('\n')
|
||||||
|
|||||||
@@ -43,6 +43,8 @@ services:
|
|||||||
MYSQL_DATABASE: WordPressDatabase
|
MYSQL_DATABASE: WordPressDatabase
|
||||||
MYSQL_USER: WordPressUser
|
MYSQL_USER: WordPressUser
|
||||||
MYSQL_PASSWORD: $MYSQL_PASSWORD
|
MYSQL_PASSWORD: $MYSQL_PASSWORD
|
||||||
|
volumes:
|
||||||
|
- mysql:/var/lib/mysql
|
||||||
wordpress:
|
wordpress:
|
||||||
depends_on:
|
depends_on:
|
||||||
- ${DOMAIN}db
|
- ${DOMAIN}db
|
||||||
@@ -87,6 +89,12 @@ printf "server {
|
|||||||
sub_filter_once on;
|
sub_filter_once on;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
location = /.well-known/wallets/HNS {
|
||||||
|
proxy_pass $URL;
|
||||||
|
proxy_set_header Host \$http_host;
|
||||||
|
rewrite ^(.*)$ \$1/ break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
listen 443 ssl;
|
listen 443 ssl;
|
||||||
ssl_certificate /etc/ssl/$DOMAIN.crt;
|
ssl_certificate /etc/ssl/$DOMAIN.crt;
|
||||||
|
|||||||
Reference in New Issue
Block a user