From 4b25873c123da8d835e2c2078f1ed3d07023666f Mon Sep 17 00:00:00 2001 From: Ashvith Shetty Date: Sat, 28 Jun 2025 22:23:05 +0530 Subject: [PATCH] services: Modernize redis service. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * gnu/services/databases.scm (redis-configuration): Rewrite using `define-configuration'. (redis-shepherd-service): Honor it. * doc/guix.texi (Database Services) : Regenerate documentation. Change-Id: I5b99822ca3d8d23fb5133497d00eada0336d0c65 Signed-off-by: Ludovic Courtès Merges: #2158 --- doc/guix.texi | 31 +++++++++++++++++++------ gnu/services/databases.scm | 46 ++++++++++++++++++++++++++------------ 2 files changed, 56 insertions(+), 21 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index 7caf4399ef3..d7d40ceb223 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -28343,30 +28343,47 @@ Additional command line options to pass to @code{memcached}. @subsubheading Redis +@uref{https://redis.io/, Redis} is an in-memory data store used +by millions of developers as a cache, vector database, document +database, streaming engine, and message broker. Redis has built-in +replication and different levels of on-disk persistence. It supports +complex data types (for example, strings, hashes, lists, sets, sorted +sets, and JSON), with atomic operations defined on those data types. + @defvar redis-service-type -This is the service type for the @uref{https://redis.io/, Redis} -key/value store, whose value is a @code{redis-configuration} object. +Type of the service that runs @command{redis}, an in-memory data store. +The value for this service is a @code{} object. @end defvar +@c %start of fragment + @deftp {Data Type} redis-configuration -Data type representing the configuration of redis. +Available @code{redis-configuration} fields are: @table @asis -@item @code{redis} (default: @code{redis}) +@item @code{redis} (default: @code{redis}) (type: package) The Redis package to use. -@item @code{bind} (default: @code{"127.0.0.1"}) +@item @code{bind} (default: @code{"127.0.0.1"}) (type: string) Network interface on which to listen. -@item @code{port} (default: @code{6379}) +@item @code{port} (default: @code{6379}) (type: number) Port on which to accept connections on, a value of 0 will disable listening on a TCP socket. -@item @code{working-directory} (default: @code{"/var/lib/redis"}) +@item @code{working-directory} (default: @code{"/var/lib/redis"}) (type: string) Directory in which to store the database and related files. + +@item @code{config-file} (type: maybe-string) +Default location for config file. + @end table + @end deftp + +@c %end of fragment + @node Mail Services @subsection Mail Services diff --git a/gnu/services/databases.scm b/gnu/services/databases.scm index f507727e5c3..f9820c37d56 100644 --- a/gnu/services/databases.scm +++ b/gnu/services/databases.scm @@ -28,6 +28,7 @@ (define-module (gnu services databases) #:use-module (gnu services) + #:use-module (gnu services configuration) #:use-module (gnu services shepherd) #:use-module (gnu system shadow) #:autoload (gnu system accounts) (default-shell) @@ -786,19 +787,29 @@ port=" (number->string port) " ;;; Redis ;;; -(define-record-type* - redis-configuration make-redis-configuration - redis-configuration? - (redis redis-configuration-redis ;file-like - (default redis)) - (bind redis-configuration-bind - (default "127.0.0.1")) - (port redis-configuration-port - (default 6379)) - (working-directory redis-configuration-working-directory - (default "/var/lib/redis")) - (config-file redis-configuration-config-file - (default #f))) +(define-maybe string) + +(define (uglify-field-name field-name) + (string-delete #\? (symbol->string field-name))) + +(define (serialize-field field-name val) + #~(format #f "~a=~a\n" #$(uglify-field-name field-name) #$val)) + +(define serialize-string serialize-field) +(define serialize-number serialize-field) + +(define-configuration redis-configuration + (redis (package redis) + "The Redis package to use.") + (bind (string "127.0.0.1") + "Network interface on which to listen.") + (port (number 6379) + "Port on which to accept connections on, +a value of 0 will disable listening on a TCP socket.") + (working-directory (string "/var/lib/redis") + "Directory in which to store the +database and related files.") + (config-file maybe-string "Default location for config file.")) (define (default-redis.conf bind port working-directory) (mixed-text-file "redis.conf" @@ -832,7 +843,8 @@ port=" (number->string port) " (match-lambda (($ redis bind port working-directory config-file) (let ((config-file - (or config-file + (if (maybe-value-set? config-file) + config-file (default-redis.conf bind port working-directory)))) (list (shepherd-service (provision '(redis)) @@ -857,3 +869,9 @@ port=" (number->string port) " (const %redis-accounts)))) (default-value (redis-configuration)) (description "Run Redis, a caching key/value store."))) + +;;; +;;; Generate documentation. +;;; +(define (redis-generate-doc) + (configuration->documentation 'redis-configuration))