diff --git a/doc/guix.texi b/doc/guix.texi index d2d278df47..b5c2d4d954 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -13383,13 +13383,49 @@ The @code{(gnu services databases)} module provides the following services. @deffn {Scheme Procedure} postgresql-service [#:postgresql postgresql] @ [#:config-file] [#:data-directory ``/var/lib/postgresql/data''] @ - [#:port 5432] [#:locale ``en_US.utf8''] + [#:port 5432] [#:locale ``en_US.utf8''] [#:extension-packages '()] Return a service that runs @var{postgresql}, the PostgreSQL database server. The PostgreSQL daemon loads its runtime configuration from @var{config-file}, creates a database cluster with @var{locale} as the default locale, stored in @var{data-directory}. It then listens on @var{port}. + +@cindex postgresql extension-packages +Additional extensions are loaded from packages listed in +@var{extension-packages}. Extensions are available at runtime. For instance, +to create a geographic database using the @code{postgis} extension, a user can +configure the postgresql-service as in this example: + +@cindex postgis +@example +(use-package-modules databases geo) + +(operating-system + ... + ;; postgresql is required to run `psql' but postgis is not required for + ;; proper operation. + (packages (cons* postgresql %base-packages)) + (services + (cons* + (postgresql-service #:extension-packages (list postgis)) + %base-services))) +@end example + +Then the extension becomes visible and you can initialise an empty geographic +database in this way: + +@example +psql -U postgres +> create database postgistest; +> \connect postgistest; +> create extension postgis; +> create extension postgis_topology; +@end example + +There is no need to add this field for contrib extensions such as hstore or +dblink as they are already loadable by postgresql. This field is only +required to add extensions provided by other packages. @end deffn @deffn {Scheme Procedure} mysql-service [#:config (mysql-configuration)] diff --git a/gnu/services/databases.scm b/gnu/services/databases.scm index aff78a0566..7113f1f2a1 100644 --- a/gnu/services/databases.scm +++ b/gnu/services/databases.scm @@ -4,6 +4,7 @@ ;;; Copyright © 2016 Leo Famulari ;;; Copyright © 2017 Christopher Baines ;;; Copyright © 2018 Clément Lassieur +;;; Copyright © 2018 Julien Lepiller ;;; ;;; This file is part of GNU Guix. ;;; @@ -26,7 +27,10 @@ #:use-module (gnu system shadow) #:use-module (gnu packages admin) #:use-module (gnu packages databases) + #:use-module (guix build-system trivial) + #:use-module (guix build union) #:use-module (guix modules) + #:use-module (guix packages) #:use-module (guix records) #:use-module (guix gexp) #:use-module (srfi srfi-1) @@ -141,16 +145,18 @@ host all all ::1/128 trust")) (define-record-type* postgresql-configuration make-postgresql-configuration postgresql-configuration? - (postgresql postgresql-configuration-postgresql ; - (default postgresql)) - (port postgresql-configuration-port - (default 5432)) - (locale postgresql-configuration-locale - (default "en_US.utf8")) - (config-file postgresql-configuration-file - (default (postgresql-config-file))) - (data-directory postgresql-configuration-data-directory - (default "/var/lib/postgresql/data"))) + (postgresql postgresql-configuration-postgresql ; + (default postgresql)) + (port postgresql-configuration-port + (default 5432)) + (locale postgresql-configuration-locale + (default "en_US.utf8")) + (config-file postgresql-configuration-file + (default (postgresql-config-file))) + (data-directory postgresql-configuration-data-directory + (default "/var/lib/postgresql/data")) + (extension-packages postgresql-configuration-extension-packages + (default '()))) (define %postgresql-accounts (list (user-group (name "postgres") (system? #t)) @@ -162,15 +168,36 @@ host all all ::1/128 trust")) (home-directory "/var/empty") (shell (file-append shadow "/sbin/nologin"))))) +(define (final-postgresql postgresql extension-packages) + (if (null? extension-packages) + postgresql + (package + (inherit postgresql) + (source #f) + (build-system trivial-build-system) + (arguments + `(#:modules ((guix build utils) (guix build union)) + #:builder + (begin + (use-modules (guix build utils) (guix build union) (srfi srfi-26)) + (union-build (assoc-ref %outputs "out") (map (lambda (input) (cdr input)) %build-inputs)) + #t))) + (inputs + `(("postgresql" ,postgresql) + ,@(map (lambda (extension) (list "extension" extension)) + extension-packages)))))) + (define postgresql-activation (match-lambda - (($ postgresql port locale config-file data-directory) + (($ postgresql port locale config-file data-directory + extension-packages) #~(begin (use-modules (guix build utils) (ice-9 match)) (let ((user (getpwnam "postgres")) - (initdb (string-append #$postgresql "/bin/initdb")) + (initdb (string-append #$(final-postgresql postgresql extension-packages) + "/bin/initdb")) (initdb-args (append (if #$locale @@ -202,7 +229,8 @@ host all all ::1/128 trust")) (define postgresql-shepherd-service (match-lambda - (($ postgresql port locale config-file data-directory) + (($ postgresql port locale config-file data-directory + extension-packages) (let* ((pg_ctl-wrapper ;; Wrapper script that switches to the 'postgres' user before ;; launching daemon. @@ -214,7 +242,8 @@ host all all ::1/128 trust")) (match (command-line) ((_ mode) (let ((user (getpwnam "postgres")) - (pg_ctl #$(file-append postgresql "/bin/pg_ctl")) + (pg_ctl #$(file-append (final-postgresql postgresql extension-packages) + "/bin/pg_ctl")) (options (format #f "--config-file=~a -p ~d" #$config-file #$port))) (setgid (passwd:gid user)) @@ -253,7 +282,8 @@ host all all ::1/128 trust")) (port 5432) (locale "en_US.utf8") (config-file (postgresql-config-file)) - (data-directory "/var/lib/postgresql/data")) + (data-directory "/var/lib/postgresql/data") + (extension-packages '())) "Return a service that runs @var{postgresql}, the PostgreSQL database server. The PostgreSQL daemon loads its runtime configuration from @var{config-file} @@ -264,7 +294,8 @@ and stores the database cluster in @var{data-directory}." (port port) (locale locale) (config-file config-file) - (data-directory data-directory)))) + (data-directory data-directory) + (extension-packages extension-packages)))) ;;;