| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- #!/usr/bin/env python3
- __package__ = 'archivebox.cli'
- __command__ = 'archivebox server'
- import sys
- import argparse
- from pathlib import Path
- from typing import Optional, List, IO
- from archivebox.misc.util import docstring
- from archivebox.config import DATA_DIR
- from archivebox.config.common import SERVER_CONFIG
- from archivebox.misc.logging_util import SmartFormatter, reject_stdin
- # @enforce_types
- def server(runserver_args: Optional[List[str]]=None,
- reload: bool=False,
- debug: bool=False,
- init: bool=False,
- quick_init: bool=False,
- createsuperuser: bool=False,
- daemonize: bool=False,
- out_dir: Path=DATA_DIR) -> None:
- """Run the ArchiveBox HTTP server"""
- from rich import print
- runserver_args = runserver_args or []
-
- if init:
- run_subcommand('init', stdin=None, pwd=out_dir)
- print()
- elif quick_init:
- run_subcommand('init', subcommand_args=['--quick'], stdin=None, pwd=out_dir)
- print()
- if createsuperuser:
- run_subcommand('manage', subcommand_args=['createsuperuser'], pwd=out_dir)
- print()
- check_data_folder()
- from django.core.management import call_command
- from django.contrib.auth.models import User
-
- if not User.objects.filter(is_superuser=True).exclude(username='system').exists():
- print()
- # print('[yellow][!] No admin accounts exist, you must create one to be able to log in to the Admin UI![/yellow]')
- print('[violet]Hint:[/violet] To create an [bold]admin username & password[/bold] for the [deep_sky_blue3][underline][link=http://{host}:{port}/admin]Admin UI[/link][/underline][/deep_sky_blue3], run:')
- print(' [green]archivebox manage createsuperuser[/green]')
- print()
-
- host = '127.0.0.1'
- port = '8000'
-
- try:
- host_and_port = [arg for arg in runserver_args if arg.replace('.', '').replace(':', '').isdigit()][0]
- if ':' in host_and_port:
- host, port = host_and_port.split(':')
- else:
- if '.' in host_and_port:
- host = host_and_port
- else:
- port = host_and_port
- except IndexError:
- pass
- print('[green][+] Starting ArchiveBox webserver...[/green]')
- print(f' [blink][green]>[/green][/blink] Starting ArchiveBox webserver on [deep_sky_blue4][link=http://{host}:{port}]http://{host}:{port}[/link][/deep_sky_blue4]')
- print(f' [green]>[/green] Log in to ArchiveBox Admin UI on [deep_sky_blue3][link=http://{host}:{port}/admin]http://{host}:{port}/admin[/link][/deep_sky_blue3]')
- print(' > Writing ArchiveBox error log to ./logs/errors.log')
- if SHELL_CONFIG.DEBUG:
- if not reload:
- runserver_args.append('--noreload') # '--insecure'
- call_command("runserver", *runserver_args)
- else:
- from workers.supervisord_util import start_server_workers
- print()
- start_server_workers(host=host, port=port, daemonize=False)
- print("\n[i][green][🟩] ArchiveBox server shut down gracefully.[/green][/i]")
- @docstring(server.__doc__)
- def main(args: Optional[List[str]]=None, stdin: Optional[IO]=None, pwd: Optional[str]=None) -> None:
- parser = argparse.ArgumentParser(
- prog=__command__,
- description=server.__doc__,
- add_help=True,
- formatter_class=SmartFormatter,
- )
- parser.add_argument(
- 'runserver_args',
- nargs='*',
- type=str,
- default=[SERVER_CONFIG.BIND_ADDR],
- help='Arguments to pass to Django runserver'
- )
- parser.add_argument(
- '--reload',
- action='store_true',
- help='Enable auto-reloading when code or templates change',
- )
- parser.add_argument(
- '--debug',
- action='store_true',
- help='Enable DEBUG=True mode with more verbose errors',
- )
- parser.add_argument(
- '--nothreading',
- action='store_true',
- help='Force runserver to run in single-threaded mode',
- )
- parser.add_argument(
- '--init',
- action='store_true',
- help='Run a full archivebox init/upgrade before starting the server',
- )
- parser.add_argument(
- '--quick-init', '-i',
- action='store_true',
- help='Run quick archivebox init/upgrade before starting the server',
- )
- parser.add_argument(
- '--createsuperuser',
- action='store_true',
- help='Run archivebox manage createsuperuser before starting the server',
- )
- parser.add_argument(
- '--daemonize',
- action='store_true',
- help='Run the server in the background as a daemon',
- )
- command = parser.parse_args(args or ())
- reject_stdin(__command__, stdin)
-
- server(
- runserver_args=command.runserver_args + (['--nothreading'] if command.nothreading else []),
- reload=command.reload,
- debug=command.debug,
- init=command.init,
- quick_init=command.quick_init,
- createsuperuser=command.createsuperuser,
- daemonize=command.daemonize,
- out_dir=Path(pwd) if pwd else DATA_DIR,
- )
- if __name__ == '__main__':
- main(args=sys.argv[1:], stdin=sys.stdin)
|