From 38cf1023977f645072eea373d0ccab5e3c2ac6e9 Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Wed, 17 Jul 2024 23:11:48 +0200 Subject: [PATCH] [#401] Added `--redis-bin`/`PLATYPUSH_REDIS_BIN` option/variable. Closes: #401 --- README.md | 9 +++++++++ platypush/app/_app.py | 30 +++++++++++++++++++++++++----- platypush/cli.py | 10 ++++++++++ 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 2b87fcc62f..73aeb5d131 100644 --- a/README.md +++ b/README.md @@ -1178,6 +1178,15 @@ redis: password: redis-pass ``` +If `--start-redis` is set, the application can be configured to start a custom +`redis-server` executable through the: + +1. `--redis-bin` command-line option. +2. `PLATYPUSH_REDIS_BIN` environment variable. + +Alternative drop-in implementations such as `keydb-server`, `valkey` or +`redict` are also supported. + ### nginx If you want to access your Platypush web panel outside your home network, it may diff --git a/platypush/app/_app.py b/platypush/app/_app.py index 6d3d2f9240..9bcffdba03 100644 --- a/platypush/app/_app.py +++ b/platypush/app/_app.py @@ -32,6 +32,9 @@ class Application: # Default Redis port _default_redis_port = 6379 + # Default Redis binary, if --start-redis is set + _default_redis_bin = 'redis-server' + # backend_name => backend_obj map backends = None @@ -55,6 +58,7 @@ class Application: start_redis: bool = False, redis_host: Optional[str] = None, redis_port: Optional[int] = None, + redis_bin: Optional[str] = None, ctrl_sock: Optional[str] = None, ): """ @@ -142,10 +146,11 @@ class Application: :param verbose: Enable debug/verbose logging, overriding the stored configuration (default: False). :param start_redis: If set, it starts a managed Redis instance upon - boot (it requires the ``redis-server`` executable installed on the - server). This is particularly useful when running the application - inside of Docker containers, without relying on ``docker-compose`` - to start multiple containers, and in tests (default: False). + boot (it requires Redis installed on the server, see + ``redis_bin``). This is particularly useful when running the + application inside of Docker containers, without relying on + ``docker-compose`` to start multiple containers, and in tests + (default: False). :param redis_host: Host of the Redis server to be used. The order of precedence is: @@ -168,6 +173,16 @@ class Application: the configuration file. - ``6379`` + :param redis_bin: Path to the Redis server executable, if ``start_redis`` + is set. Alternative drop-in Redis implementations such as + ``keydb-server``, ``valkey``, ``redict`` can be used. The order of + precedence is: + + - The ``redis_bin`` parameter (or the ``--redis-bin`` command + line argument). + - The ``PLATYPUSH_REDIS_BIN`` environment variable. + - ``redis-server`` + :param ctrl_sock: If set, it identifies a path to a UNIX domain socket that the application can use to send control messages (e.g. STOP and RESTART) to its parent. @@ -211,6 +226,11 @@ class Application: self.start_redis = start_redis self.redis_host = redis_host or os.environ.get('PLATYPUSH_REDIS_HOST') self.redis_port = redis_port or os.environ.get('PLATYPUSH_REDIS_PORT') + self.redis_bin = ( + redis_bin + or os.environ.get('PLATYPUSH_REDIS_BIN') + or self._default_redis_bin + ) self._redis_conf = { 'host': self.redis_host or 'localhost', 'port': self.redis_port or self._default_redis_port, @@ -262,7 +282,7 @@ class Application: port = self._redis_conf['port'] log.info('Starting local Redis instance on %s', port) redis_cmd_args = [ - 'redis-server', + self.redis_bin, '--bind', 'localhost', '--port', diff --git a/platypush/cli.py b/platypush/cli.py index b7c3684456..5762cc54e5 100644 --- a/platypush/cli.py +++ b/platypush/cli.py @@ -159,6 +159,16 @@ def parse_cmdline(args: Sequence[str]) -> argparse.Namespace: "configuration file", ) + parser.add_argument( + '--redis-bin', + dest='redis_bin', + required=False, + default=None, + help="Path to the redis-server executable, if --start-redis is " + "specified. Drop-in replacements such as keydb-server, valkey or redict " + "are also supported", + ) + parser.add_argument( '--ctrl-sock', dest='ctrl_sock',