lnbits-legend/lnbits/server.py

100 lines
2.8 KiB
Python
Raw Normal View History

import multiprocessing as mp
import time
from pathlib import Path
import click
import uvicorn
from uvicorn.supervisors import ChangeReload
2022-10-03 23:41:04 +02:00
from lnbits.settings import set_cli_settings, settings
@click.command(
context_settings=dict(
ignore_unknown_options=True,
allow_extra_args=True,
)
)
@click.option("--port", default=settings.port, help="Port to listen on")
@click.option("--host", default=settings.host, help="Host to run LNBits on")
2022-11-24 14:53:11 +01:00
@click.option(
"--forwarded-allow-ips",
default=settings.forwarded_allow_ips,
help="Allowed proxy servers",
)
@click.option("--ssl-keyfile", default=None, help="Path to SSL keyfile")
@click.option("--ssl-certfile", default=None, help="Path to SSL certificate")
@click.pass_context
def main(
ctx,
port: int,
host: str,
forwarded_allow_ips: str,
ssl_keyfile: str,
ssl_certfile: str,
):
"""Launched with `poetry run lnbits` at root level"""
2022-10-03 23:33:42 +02:00
# create data dir if it does not exist
Path(settings.lnbits_data_folder).mkdir(parents=True, exist_ok=True)
Path(settings.lnbits_data_folder, "logs").mkdir(parents=True, exist_ok=True)
# create `extensions`` dir if it does not exist
Path(settings.lnbits_extensions_path, "extensions").mkdir(
parents=True, exist_ok=True
)
2022-11-24 14:35:32 +01:00
set_cli_settings(host=host, port=port, forwarded_allow_ips=forwarded_allow_ips)
2022-10-03 23:33:42 +02:00
# this beautiful beast parses all command line arguments and
# passes them to the uvicorn server
d = dict()
for a in ctx.args:
item = a.split("=")
if len(item) > 1: # argument like --key=value
print(a, item)
d[item[0].strip("--").replace("-", "_")] = (
int(item[1]) # need to convert to int if it's a number
if item[1].isdigit()
else item[1]
)
else:
d[a.strip("--")] = True # argument like --key
while True:
config = uvicorn.Config(
"lnbits.__main__:app",
2022-10-21 10:00:47 +02:00
loop="uvloop",
port=port,
host=host,
2022-11-24 14:35:32 +01:00
forwarded_allow_ips=forwarded_allow_ips,
ssl_keyfile=ssl_keyfile,
ssl_certfile=ssl_certfile,
**d
)
2022-10-03 23:33:42 +02:00
server = uvicorn.Server(config=config)
if config.should_reload:
sock = config.bind_socket()
run = ChangeReload(config, target=server.run, sockets=[sock]).run
else:
run = server.run
process = mp.Process(target=run)
process.start()
server_restart.wait()
server_restart.clear()
server.should_exit = True
server.force_exit = True
2022-10-21 10:00:47 +02:00
time.sleep(3)
process.terminate()
process.join()
2022-10-21 10:00:47 +02:00
time.sleep(1)
server_restart = mp.Event()
if __name__ == "__main__":
main()