23 Commits

Author SHA1 Message Date
9d06151ed2 feat: Only send WP licence email on subscription start
All checks were successful
Build Docker / Build Master (push) Successful in 22s
Build Docker / Build Bot (push) Successful in 22s
2023-11-02 16:36:32 +11:00
63ee2aa82b Merge branch 'develop' into main
All checks were successful
Build Docker / Build Master (push) Successful in 30s
Build Docker / Build Bot (push) Successful in 29s
2023-10-23 15:46:25 +11:00
49acea31ac feat: Add instructions for enabling HIP2 on WordPress site
All checks were successful
Build Docker / Build Master (push) Successful in 26s
Build Docker / Build Bot (push) Successful in 25s
This commit adds detailed instructions for enabling HIP2 on a WordPress site. It includes steps to download, upload, and activate the HIP2 plugin, as well as setting the HNS wallet address and testing the functionality.
2023-10-23 15:46:16 +11:00
6b855a5b29 fix: Fix wordpress rewrites for hip2
All checks were successful
Build Docker / Build Master (push) Successful in 1m6s
Build Docker / Build Bot (push) Successful in 1m29s
2023-10-23 15:42:38 +11:00
9d57b8f858 main: Update admin page
All checks were successful
Build Docker / Build Master (push) Successful in 23s
Build Docker / Build Bot (push) Successful in 22s
2023-09-25 15:14:16 +10:00
6d9ba77568 main: Fix return for info page
All checks were successful
Build Docker / Build Master (push) Successful in 25s
Build Docker / Build Bot (push) Successful in 24s
2023-09-25 15:07:56 +10:00
9c5b00433f bot: Adding a few catches to the bot
All checks were successful
Build Docker / Build Master (push) Successful in 42s
Build Docker / Build Bot (push) Successful in 1m24s
2023-09-21 11:32:34 +10:00
e241f6ffeb main: Add return to info page
All checks were successful
Build Docker / Build Master (push) Successful in 22s
Build Docker / Build Bot (push) Successful in 22s
2023-09-20 22:33:09 +10:00
188334c850 main: Updated refresh script
All checks were successful
Build Docker / Build Master (push) Successful in 24s
Build Docker / Build Bot (push) Successful in 23s
2023-09-20 22:32:27 +10:00
6ea4e72e8a main: Add style to tlsa
All checks were successful
Build Docker / Build Bot (push) Successful in 22s
Build Docker / Build Master (push) Successful in 24s
2023-09-20 22:29:35 +10:00
56c7fcd617 main: Use the success page for info page
All checks were successful
Build Docker / Build Master (push) Successful in 24s
Build Docker / Build Bot (push) Successful in 23s
2023-09-20 22:26:34 +10:00
c9f8a8237d main: Add code block for tlsa info
All checks were successful
Build Docker / Build Bot (push) Successful in 21s
Build Docker / Build Master (push) Successful in 25s
2023-09-20 22:21:00 +10:00
bda99dbf5f main: Updated status page style
All checks were successful
Build Docker / Build Bot (push) Successful in 22s
Build Docker / Build Master (push) Successful in 24s
2023-09-20 22:11:58 +10:00
08f36a7a50 worker: Update wp script to use named volume for db
All checks were successful
Build Docker / Build Master (push) Successful in 26s
Build Docker / Build Bot (push) Successful in 26s
2023-09-20 22:01:01 +10:00
94ebacd84d Merge branch 'develop' into main
All checks were successful
Build Docker / Build Bot (push) Successful in 25s
Build Docker / Build Master (push) Successful in 26s
2023-09-18 14:56:15 +10:00
6f86987901 bot: Fix typo with variables
All checks were successful
Build Docker / Build Master (push) Successful in 19s
Build Docker / Build Bot (push) Successful in 21s
2023-09-18 14:49:22 +10:00
910ce1b098 bot: Display site count in bot status
All checks were successful
Build Docker / Build Master (push) Successful in 20s
Build Docker / Build Bot (push) Successful in 22s
2023-09-18 14:47:14 +10:00
6741f8cac2 main: Add route to get site count
All checks were successful
Build Docker / Build Master (push) Successful in 24s
Build Docker / Build Bot (push) Successful in 22s
2023-09-18 14:42:43 +10:00
0365832e40 actions: Build release for arm 2023-09-18 14:38:37 +10:00
40515700d1 actions: Build for arm
All checks were successful
Build Docker / Build Master (push) Successful in 22s
Build Docker / Build Bot (push) Successful in 21s
2023-09-17 08:48:51 +10:00
c130bfed69 fix: Set domain to lower in api requests
Some checks failed
Build Docker / Build Master (push) Failing after 12s
Build Docker / Build Bot (push) Successful in 46s
2023-09-17 08:47:36 +10:00
d19a121005 master: Fixed private ip reference
Some checks failed
Build Docker / Build Master (push) Successful in 40s
Build Docker / Build Bot (push) Failing after 17m41s
2023-09-16 17:10:20 +10:00
d0ff839ff4 main: Added register error messages
All checks were successful
Build Docker / Build Bot (push) Successful in 22s
Build Docker / Build Master (push) Successful in 29s
2023-09-03 13:48:26 +10:00
11 changed files with 258 additions and 49 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -115,4 +115,15 @@ Enable the free mode by setting the following environment variable.
This will allow you to create a wordpress site without using a licence key using the /createsite command. This will allow you to create a wordpress site without using a licence key using the /createsite command.
``` ```
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

Binary file not shown.

View File

@@ -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:
@@ -79,12 +88,12 @@ async def createsite(ctx, domain: str, licence: str = None):
else: else:
await ctx.response.send_message(f"Error getting license\n" + json['error']) await ctx.response.send_message(f"Error getting license\n" + json['error'])
return return
r = requests.post(f"http://{Master_IP}:{Master_Port}/new-site?domain={domain}",headers={"key":licence}) r = requests.post(f"http://{Master_IP}:{Master_Port}/new-site?domain={domain}",headers={"key":licence})
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")
@@ -128,6 +138,17 @@ async def check_site_ready(domain):
return False return False
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
@@ -135,6 +156,9 @@ 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)

View File

@@ -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:

View 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);

View File

@@ -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>

View 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&amp;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>

View File

@@ -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')

View File

@@ -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;