summaryrefslogtreecommitdiff
path: root/px/services/databases.scm
blob: aa90f200f15affeef81c659fd0d166778b6456e5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
;;; Databases service definitions for PantherX
;;; Author: Reza Alizadeh Majd (r.majd@pantherx.org)


(define-module (px services databases)
  #:use-module (gnu services)
  #:use-module (gnu services shepherd)
  #:use-module (gnu system shadow)
  #:use-module (gnu packages admin)
  #:use-module (guix modules)
  #:use-module (guix records)
  #:use-module (guix gexp)
  #:use-module (px packages databases)
  #:use-module (srfi srfi-1)
  #:use-module (ice-9 match)
  #:export (mongodb-configuration
            mongodb-configuration?
            mongodb-configuration-mongodb
            mongodb-configuration-config-file
            mongodb-configuration-data-directory
            mongodb-service-type))


;;;
;;; MongoDB
;;;
;;; @subsubheading MongoDB
;;; @defvr {Scheme Variable} mongodb-service-type
;;; This is the service type for @uref{https://www.mongodb.com/, MongoDB}.
;;; The value for the service type is a @code{mongodb-configuration} object.
;;; @end defvr
;;; @lisp
;;; (service mongodb-service-type)
;;; @end lisp
;;; @deftp {Data Type} mongodb-configuration
;;; Data type representing the configuration of mongodb.
;;; @table @asis
;;; @item @code{mongodb} (default: @code{mongodb})
;;; The MongoDB package to use.
;;; @item @code{config-file} (default: @code{%default-mongodb-configuration-file})
;;; The configuration file for MongoDB.
;;; @item @code{data-directory} (default: @code{"/var/lib/mongodb"})
;;; This value is used to create the directory, so that it exists and is
;;; owned by the mongodb user.  It should match the data-directory which
;;; MongoDB is configured to use through the configuration file.
;;; @end table
;;; @end deftp


(define %default-mongodb-configuration-file
  (plain-file
   "mongodb.yaml"
   "# GNU Guix: MongoDB default configuration file
processManagement:
  pidFilePath: /var/run/mongodb/pid
storage:
  dbPath: /var/lib/mongodb
"))


(define-record-type* <mongodb-configuration>
  mongodb-configuration make-mongodb-configuration
  mongodb-configuration?
  (mongodb             mongodb-configuration-mongodb
                       (default mongodb))
  (config-file         mongodb-configuration-config-file
                       (default %default-mongodb-configuration-file))
  (data-directory      mongodb-configuration-data-directory
                       (default "/var/lib/mongodb")))

(define %mongodb-accounts
  (list (user-group (name "mongodb") (system? #t))
        (user-account
         (name "mongodb")
         (group "mongodb")
         (system? #t)
         (comment "Mongodb server user")
         (home-directory "/var/lib/mongodb")
         (shell (file-append shadow "/sbin/nologin")))))

(define mongodb-activation
  (match-lambda
    (($ <mongodb-configuration> mongodb config-file data-directory)
     #~(begin
         (use-modules (guix build utils))
         (let ((user (getpwnam "mongodb")))
           (for-each
            (lambda (directory)
              (mkdir-p directory)
              (chown directory
                     (passwd:uid user) (passwd:gid user)))
            '("/var/run/mongodb" #$data-directory)))))))

(define mongodb-shepherd-service
  (match-lambda
    (($ <mongodb-configuration> mongodb config-file data-directory)
     (shepherd-service
      (provision '(mongodb))
      (documentation "Run the Mongodb daemon.")
      (requirement '(user-processes loopback))
      (start #~(make-forkexec-constructor
                `(,(string-append #$mongodb "/bin/mongod")
                  "--config"
                  ,#$config-file)
                #:user "mongodb"
                #:group "mongodb"
                #:pid-file "/var/run/mongodb/pid"
                #:log-file "/var/log/mongodb.log"))
      (stop #~(make-kill-destructor))))))

(define mongodb-service-type
  (service-type
   (name 'mongodb)
   (description "Run the MongoDB document database server.")
   (extensions
    (list (service-extension shepherd-root-service-type
                             (compose list
                                      mongodb-shepherd-service))
          (service-extension activation-service-type
                             mongodb-activation)
          (service-extension account-service-type
                             (const %mongodb-accounts))))
   (default-value
     (mongodb-configuration))))


(use-modules (gnu system)
             (gnu bootloader)
             (gnu bootloader grub)
             (gnu system file-systems)
             (px system config))