diff --git a/Dockerfile b/Dockerfile index 5286d26..f2de83b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ ENV DOCKER_RUNNING=true # setup various container properties VOLUME ["/data"] -CMD ["python3", "-m", "relay"] +CMD ["python3", "-m", "relay", "run"] EXPOSE 8080/tcp WORKDIR /opt/activityrelay diff --git a/docker.sh b/docker.sh index 9897a23..f5c2621 100755 --- a/docker.sh +++ b/docker.sh @@ -2,9 +2,21 @@ case $1 in install) + if [[ -z ${2#$} ]]; then + host=127.0.0.1 + else + host=$2 + fi + + if [[ -z ${3#$} ]]; then + port=8080 + else + port=$3 + fi + docker build -f Dockerfile -t activityrelay . && \ docker volume create activityrelay-data && \ - docker run -it -p 8080:8080 -v activityrelay-data:/data --name activityrelay activityrelay + docker run -it -p target=8080,published=${host}:${port} -v activityrelay-data:/data --name activityrelay activityrelay ;; uninstall) @@ -22,6 +34,10 @@ case $1 in docker stop activityrelay ;; + restart) + docker restart activityrelay + ;; + manage) shift docker exec -it activityrelay python3 -m relay "$@" @@ -61,10 +77,7 @@ case $1 in printf "$COLS" "- edit" "Edit the relay's config in \$EDITOR" printf "$COLS" "- shell" "Drop into a bash shell on the running container" printf "$COLS" "- rescue" "Drop into a bash shell on a temp container with the data volume mounted" - printf "$COLS" "- install" "Build the image, create a new container and volume, and run relay setup" + printf "$COLS" "- install [address] [port]" "Build the image, create a new container and volume, and run relay setup" printf "$COLS" "- uninstall" "Delete the relay image, container, and volume" - - echo "" - echo "Note: This script may not work. It is recommended to manually install and manage the container if you know what you're doing." ;; esac diff --git a/relay/application.py b/relay/application.py index 628d9e5..0c2266f 100644 --- a/relay/application.py +++ b/relay/application.py @@ -55,7 +55,7 @@ class Application(web.Application): DEFAULT: Application | None = None - def __init__(self, cfgpath: str | None, dev: bool = False): + def __init__(self, cfgpath: Path | None, dev: bool = False): web.Application.__init__(self, middlewares = [ handle_api_path, diff --git a/relay/config.py b/relay/config.py index 7e95c29..dbfc0b4 100644 --- a/relay/config.py +++ b/relay/config.py @@ -33,7 +33,7 @@ else: DOCKER_VALUES = { 'listen': '0.0.0.0', 'port': 8080, - 'sq_path': '/data/relay.jsonld' + 'sq_path': '/data/relay.sqlite3' } @@ -65,7 +65,7 @@ class Config: rd_prefix: str = 'activityrelay' - def __init__(self, path: str | None = None, load: bool = False): + def __init__(self, path: Path | None = None, load: bool = False): self.path = Config.get_config_dir(path) self.reset() @@ -92,9 +92,12 @@ class Config: @staticmethod - def get_config_dir(path: str | None = None) -> Path: - if path: - return Path(path).expanduser().resolve() + def get_config_dir(path: Path | str | None = None) -> Path: + if isinstance(path, str): + path = Path(path) + + if path is not None: + return path.expanduser().resolve() paths = ( Path("relay.yaml").resolve(), diff --git a/relay/manage.py b/relay/manage.py index d768284..9c90193 100644 --- a/relay/manage.py +++ b/relay/manage.py @@ -32,25 +32,16 @@ def check_alphanumeric(text: str) -> str: return text -@click.group('cli', context_settings={'show_default': True}, invoke_without_command=True) -@click.option('--config', '-c', help='path to the relay\'s config') -@click.version_option(version=__version__, prog_name='ActivityRelay') +@click.group('cli', context_settings = {'show_default': True}) +@click.option('--config', '-c', type = Path, help = 'path to the relay\'s config') +@click.version_option(version = __version__, prog_name = 'ActivityRelay') @click.pass_context -def cli(ctx: click.Context, config: str | None) -> None: +def cli(ctx: click.Context, config: Path | None) -> None: + if IS_DOCKER: + config = Path("/data/relay.yaml") + ctx.obj = Application(config) - if not ctx.invoked_subcommand: - if ctx.obj.config.domain.endswith('example.com'): - cli_setup.callback() # type: ignore - - else: - click.echo( - '[DEPRECATED] Running the relay without the "run" command will be removed in the ' + - 'future.' - ) - - cli_run.callback() # type: ignore - @cli.command('setup') @click.pass_context @@ -86,7 +77,7 @@ def cli_setup(ctx: click.Context) -> None: type = click.Choice(['postgres', 'sqlite'], case_sensitive = False) ) - if ctx.obj.config.db_type == 'sqlite': + if ctx.obj.config.db_type == 'sqlite' and not IS_DOCKER: ctx.obj.config.sq_path = click.prompt( 'Where should the database be stored?', default = ctx.obj.config.sq_path @@ -174,7 +165,11 @@ def cli_setup(ctx: click.Context) -> None: for key, value in config.items(): conn.put_config(key, value) - if not IS_DOCKER and click.confirm('Relay all setup! Would you like to run it now?'): + if IS_DOCKER: + click.echo("Relay all setup! Start the container to run the relay.") + return + + if click.confirm('Relay all setup! Would you like to run it now?'): cli_run.callback() # type: ignore @@ -185,10 +180,14 @@ def cli_run(ctx: click.Context, dev: bool = False) -> None: 'Run the relay' if ctx.obj.config.domain.endswith('example.com') or not ctx.obj.signer: - click.echo( - 'Relay is not set up. Please edit your relay config or run "activityrelay setup".' - ) + if not IS_DOCKER: + click.echo( + 'Relay is not set up. Please edit your relay config or run "activityrelay setup".' + ) + return + + cli_setup.callback() # type: ignore return vers_split = platform.python_version().split('.')