Skip to content

Commit

Permalink
load balancer in fix mode
Browse files Browse the repository at this point in the history
  • Loading branch information
hyperknot committed Jun 22, 2024
1 parent 8b3bd33 commit 62bf871
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 11 deletions.
8 changes: 5 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,7 @@ A very important part, probably needs the most work in the long term future.

#### load balancer script - scripts/loadbalancer

Round Robin DNS based load balancer, script for health checking and updating records. It pushes status messages to a Telegram bot.

Currently it's running in read-only mode, DNS updates need manual confirmation.
A Round Robin DNS based load balancer script for health checking and updating records. It pushes status messages to a Telegram bot.

## Self hosting

Expand Down Expand Up @@ -167,6 +165,10 @@ See [dev setup docs](docs/dev_setup.md).

## Changelog

##### v0.2

Load-balancing script is running in write mode, updating records when needed.

##### v0.1

Everything works. 1 server for tile gen, 2 servers for HTTP host. Load-balancing script is running in a read-only mode.
Expand Down
2 changes: 1 addition & 1 deletion scripts/loadbalancer/cron.d/ofm_loadbalancer
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# every minute
* * * * * ofm sudo /data/ofm/venv/bin/python -u /data/ofm/loadbalancer/loadbalancer.py check >> /data/ofm/loadbalancer/logs/check.log 2>&1
* * * * * ofm sudo /data/ofm/venv/bin/python -u /data/ofm/loadbalancer/loadbalancer.py fix >> /data/ofm/loadbalancer/logs/check.log 2>&1


20 changes: 16 additions & 4 deletions scripts/loadbalancer/loadbalancer.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,15 @@ def check_or_fix(fix=False):
if not working_hosts:
working_hosts = set(c['http_host_list'])

update_records(c, working_hosts)
message = 'OFM loadbalancer FIX found no working hosts, reverting to full list!'
print(message)
telegram_send_message(message, c['telegram_token'], c['telegram_chat_id'])

updated = update_records(c, working_hosts)
if updated:
message = f'OFM loadbalancer FIX modified records, new records: {working_hosts}'
print(message)
telegram_send_message(message, c['telegram_token'], c['telegram_chat_id'])


def run_area(c, area):
Expand Down Expand Up @@ -117,14 +125,16 @@ def get_target_version(area):
return response.text.strip()


def update_records(c, working_hosts):
def update_records(c, working_hosts) -> bool:
config = dotenv_values('/data/ofm/config/cloudflare.ini')
cloudflare_api_token = config['dns_cloudflare_api_token']

domain = '.'.join(c['domain_ledns'].split('.')[-2:])
zone_id = get_zone_id(domain, cloudflare_api_token=cloudflare_api_token)

set_records_round_robin(
updated = False

updated |= set_records_round_robin(
zone_id=zone_id,
name=c['domain_ledns'],
host_ip_set=working_hosts,
Expand All @@ -134,7 +144,7 @@ def update_records(c, working_hosts):
cloudflare_api_token=cloudflare_api_token,
)

set_records_round_robin(
updated |= set_records_round_robin(
zone_id=zone_id,
name=c['domain_cf'],
host_ip_set=working_hosts,
Expand All @@ -143,6 +153,8 @@ def update_records(c, working_hosts):
cloudflare_api_token=cloudflare_api_token,
)

return updated


if __name__ == '__main__':
cli()
6 changes: 4 additions & 2 deletions scripts/loadbalancer/loadbalancer_lib/cloudflare.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ def set_records_round_robin(
proxied: bool,
comment: str = None,
cloudflare_api_token: str,
):
) -> bool:
headers = {'Authorization': f'Bearer {cloudflare_api_token}'}

dns_records = get_dns_records_round_robin(zone_id, cloudflare_api_token=cloudflare_api_token)
Expand All @@ -64,7 +64,7 @@ def set_records_round_robin(
current_ips = {r['content'] for r in current_records}
if current_ips == host_ip_set:
print(f'No need to update records: {name} currently set: {sorted(current_ips)}')
return
return False

# changing records

Expand Down Expand Up @@ -92,6 +92,8 @@ def set_records_round_robin(
data = res.json()
assert data['success'] is True

return True


def delete_record(zone_id, *, id_: str, cloudflare_api_token: str):
headers = {'Authorization': f'Bearer {cloudflare_api_token}'}
Expand Down
2 changes: 2 additions & 0 deletions scripts/loadbalancer/loadbalancer_lib/curl.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ def pycurl_status(url, domain, host_ip):
c.setopt(c.CAINFO, '/etc/ssl/certs/ca-certificates.crt')
c.setopt(c.RESOLVE, [f'{domain}:443:{host_ip}'])
c.setopt(c.NOBODY, True)
c.setopt(c.TIMEOUT, 5)
c.perform()
status_code = c.getinfo(c.RESPONSE_CODE)
c.close()
Expand All @@ -33,6 +34,7 @@ def pycurl_get(url, domain, host_ip):
c.setopt(c.CAINFO, '/etc/ssl/certs/ca-certificates.crt')
c.setopt(c.RESOLVE, [f'{domain}:443:{host_ip}'])
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.TIMEOUT, 5)
c.perform()
status_code = c.getinfo(c.RESPONSE_CODE)
c.close()
Expand Down
3 changes: 2 additions & 1 deletion website/src/pages/index.astro
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ import { Content as RestText } from '../content/index/rest.md'
Have a look at the default styles and read more about how to integrate it to your website or
app here:
</p>
<p style="margin: 20px auto;"><a href="/quick_start">Quick Start Guide</a></p>

<a class="quick-start-button" href="/quick_start">Quick Start Guide</a>

<Donate />
<RestText />
Expand Down

0 comments on commit 62bf871

Please sign in to comment.