~ruther/guix-local

guix-local/gnu/services/high-availability.scm -rw-r--r-- 6.0 KiB
56daff7e — Rutherther news: Add information about %desktop-services changes. a month ago
                                                                                
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2018 Christopher Baines <mail@cbaines.net>
;;; Copyright © 2025 Artur Wroblewski <wrobell@riseup.net>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

(define-module (gnu services high-availability)
  #:use-module (gnu packages admin)
  #:use-module (gnu packages high-availability)
  #:use-module (gnu services)
  #:use-module (gnu services shepherd)
  #:use-module (gnu system shadow)
  #:use-module (guix gexp)
  #:use-module (guix modules)
  #:use-module (guix records)
  #:use-module (ice-9 match)
  #:use-module (ice-9 format)

  #:export (rabbitmq-configuration rabbitmq-configuration?
                                   rabbitmq-configuration-rabbitmq
                                   rabbitmq-configuration-config-file
                                   rabbitmq-configuration-plugins
                                   rabbitmq-service-type))

;; By default, start on local ipv4 and ipv6 interfaces only, see also:
;;
;;   https://www.rabbitmq.com/docs/networking
;;
;; NOTE: How to enable plugins to listen on localhost only?
(define %default-rabbitmq-config-file
  (plain-file "rabbitmq.conf" "
listeners.tcp.1 = 127.0.0.1:5672
listeners.tcp.2 = ::1:5672
"))

(define-record-type* <rabbitmq-configuration> rabbitmq-configuration
                     make-rabbitmq-configuration
  rabbitmq-configuration?
  (rabbitmq rabbitmq-configuration-rabbitmq
            (default rabbitmq))
  (config-file rabbitmq-configuration-config-file
               (default %default-rabbitmq-config-file))
  ;; It can be a mnesia database or a khepri database, so use "data" instead
  ;; of the traditional "mnesia".
  (data-directory rabbitmq-configuration-data-directory
                  (default "/var/lib/rabbitmq/data"))
  (plugins rabbitmq-configuration-plugins
           (default '())))

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

(define (rabbitmq-activation config)
  (let* ((data-directory (rabbitmq-configuration-data-directory config))
         (plugins (string-join (rabbitmq-configuration-plugins config) ",")))
    (with-imported-modules '((guix build utils))
      #~(begin
          (use-modules (guix build utils))
          (let ((user (getpwnam "rabbitmq"))
                (srv-directories (list
                                  "/var/lib/rabbitmq"
                                  "/var/log/rabbitmq"
                                  "/var/run/rabbitmq"
                                  #$data-directory)))
            (for-each (lambda (directory)
                        (mkdir-p directory)
                        (chown directory
                               (passwd:uid user)
                               (passwd:gid user)))
                      srv-directories)

            ;; Create file with the enabled plugins.
            (with-output-to-file (string-append #$data-directory
                                  "/enabled_plugins")
              (lambda () (display (format #f "[~a]." #$plugins))))
            (chown (string-append #$data-directory "/enabled_plugins")
                   (passwd:uid user)
                   (passwd:gid user)))))))

(define (rabbitmq-shepherd-service config)
  (match-record config <rabbitmq-configuration>
    (rabbitmq data-directory config-file plugins)
    (with-imported-modules
      (source-module-closure '((gnu build shepherd)))
      (list
        (shepherd-service
          (provision '(rabbitmq))
          (documentation "Run the RabbitMQ daemon.")
          (requirement '(user-processes loopback))
          (modules '((gnu build shepherd)))
          (start
           #~(make-forkexec-constructor
              `(#$(file-append rabbitmq "/sbin/rabbitmq-server"))
              #:pid-file "/var/run/rabbitmq/pid"
              #:user "rabbitmq"
              #:group "rabbitmq"
              #:environment-variables
              (append
                (list
                  (string-append "RABBITMQ_CONFIG_FILE=" #$config-file)
                  "RABBITMQ_PID_FILE=/var/run/rabbitmq/pid"
                  "RABBITMQ_CONF_ENV_FILE=/run/current-system/profile/etc/rabbitmq/rabbitmq-env.conf"
                  (string-append
                    "RABBITMQ_ENABLED_PLUGINS_FILE="
                    #$data-directory
                    "/enabled_plugins")
                  (string-append
                    "RABBITMQ_MNESIA_BASE="
                    #$data-directory)
                  "RABBITMQ_LOG_BASE=/var/log/rabbitmq")
                (environ))))
          (stop #~(make-kill-destructor)))))))

(define rabbitmq-service-type
  (service-type (name 'rabbitmq)
                (description "Run the RabbitMQ message broker service.")
                (extensions (list (service-extension
                                   shepherd-root-service-type
                                   rabbitmq-shepherd-service)
                                  (service-extension activation-service-type
                                                     rabbitmq-activation)
                                  (service-extension account-service-type
                                                     (const %rabbitmq-accounts))))
                (default-value (rabbitmq-configuration))))