1 ;;; GNU Guix --- Functional package management for GNU
2 ;;; Copyright © 2019, 2020, 2021, 2022 Christopher Baines <mail@cbaines.net>
4 ;;; This file is part of GNU Guix.
6 ;;; GNU Guix is free software; you can redistribute it and/or modify
7 ;;; it under the terms of the GNU General Public License as published by
8 ;;; the Free Software Foundation, either version 3 of the License, or
9 ;;; (at your option) any later version.
11 ;;; GNU Guix is distributed in the hope that it will be useful,
12 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 ;;; GNU General Public License for more details.
16 ;;; You should have received a copy of the GNU General Public License
17 ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
19 (define-module (gnu services guix)
20 #:use-module (srfi srfi-1)
21 #:use-module (ice-9 match)
22 #:use-module (guix gexp)
23 #:use-module (guix records)
24 #:use-module (guix packages)
25 #:use-module ((gnu packages base)
26 #:select (glibc-utf8-locales))
27 #:use-module (gnu packages admin)
28 #:use-module (gnu packages databases)
29 #:use-module (gnu packages web)
30 #:use-module (gnu packages guile)
31 #:use-module (gnu packages guile-xyz)
32 #:use-module (gnu packages package-management)
33 #:use-module (gnu services)
34 #:use-module (gnu services base)
35 #:use-module (gnu services admin)
36 #:use-module (gnu services shepherd)
37 #:use-module (gnu services getmail)
38 #:use-module (gnu system shadow)
39 #:export (guix-build-coordinator-configuration
40 guix-build-coordinator-configuration?
41 guix-build-coordinator-configuration-package
42 guix-build-coordinator-configuration-user
43 guix-build-coordinator-configuration-group
44 guix-build-coordinator-configuration-datastore-uri-string
45 guix-build-coordinator-configuration-agent-communication-uri-string
46 guix-build-coordinator-configuration-client-communication-uri-string
47 guix-build-coordinator-configuration-allocation-strategy
48 guix-build-coordinator-configuration-hooks
49 guix-build-coordinator-configuration-parallel-hooks
50 guix-build-coordinator-configuration-guile
52 guix-build-coordinator-service-type
54 guix-build-coordinator-agent-configuration
55 guix-build-coordinator-agent-configuration?
56 guix-build-coordinator-agent-configuration-package
57 guix-build-coordinator-agent-configuration-user
58 guix-build-coordinator-agent-configuration-coordinator
59 guix-build-coordinator-agent-configuration-authentication
60 guix-build-coordinator-agent-configuration-systems
61 guix-build-coordinator-agent-configuration-max-parallel-builds
62 guix-build-coordinator-agent-configuration-max-1min-load-average
63 guix-build-coordinator-agent-configuration-derivation-substitute-urls
64 guix-build-coordinator-agent-configuration-non-derivation-substitute-urls
66 guix-build-coordinator-agent-password-auth
67 guix-build-coordinator-agent-password-auth?
68 guix-build-coordinator-agent-password-auth-uuid
69 guix-build-coordinator-agent-password-auth-password
71 guix-build-coordinator-agent-password-file-auth
72 guix-build-coordinator-agent-password-file-auth?
73 guix-build-coordinator-agent-password-file-auth-uuid
74 guix-build-coordinator-agent-password-file-auth-password-file
76 guix-build-coordinator-agent-dynamic-auth
77 guix-build-coordinator-agent-dynamic-auth?
78 guix-build-coordinator-agent-dynamic-auth-agent-name
79 guix-build-coordinator-agent-dynamic-auth-token
81 guix-build-coordinator-agent-dynamic-auth-with-file
82 guix-build-coordinator-agent-dynamic-auth-with-file?
83 guix-build-coordinator-agent-dynamic-auth-with-file-agent-name
84 guix-build-coordinator-agent-dynamic-auth-with-file-token-file
86 guix-build-coordinator-agent-service-type
88 guix-build-coordinator-queue-builds-configuration
89 guix-build-coordinator-queue-builds-configuration?
90 guix-build-coordinator-queue-builds-configuration-package
91 guix-build-coordinator-queue-builds-configuration-user
92 guix-build-coordinator-queue-builds-coordinator
93 guix-build-coordinator-queue-builds-configuration-systems
94 guix-build-coordinator-queue-builds-configuration-system-and-targets
95 guix-build-coordinator-queue-builds-configuration-guix-data-service
96 guix-build-coordinator-queue-builds-configuration-guix-data-service-build-server-id
97 guix-build-coordinator-queue-builds-configuration-processed-commits-file
99 guix-build-coordinator-queue-builds-service-type
101 <guix-data-service-configuration>
102 guix-data-service-configuration
103 guix-data-service-configuration?
104 guix-data-service-package
105 guix-data-service-user
106 guix-data-service-group
107 guix-data-service-port
108 guix-data-service-host
109 guix-data-service-getmail-idle-mailboxes
110 guix-data-service-commits-getmail-retriever-configuration
112 guix-data-service-type
114 nar-herder-service-type
115 nar-herder-configuration
116 nar-herder-configuration?
117 nar-herder-configuration-package
118 nar-herder-configuration-user
119 nar-herder-configuration-group
120 nar-herder-configuration-mirror
121 nar-herder-configuration-database
122 nar-herder-configuration-database-dump
123 nar-herder-configuration-host
124 nar-herder-configuration-port
125 nar-herder-configuration-storage
126 nar-herder-configuration-storage-limit
127 nar-herder-configuration-storage-nar-removal-criteria
128 nar-herder-configuration-log-level))
132 ;;; Services specifically related to GNU Guix.
136 (define-record-type* <guix-build-coordinator-configuration>
137 guix-build-coordinator-configuration make-guix-build-coordinator-configuration
138 guix-build-coordinator-configuration?
139 (package guix-build-coordinator-configuration-package
140 (default guix-build-coordinator))
141 (user guix-build-coordinator-configuration-user
142 (default "guix-build-coordinator"))
143 (group guix-build-coordinator-configuration-group
144 (default "guix-build-coordinator"))
146 guix-build-coordinator-configuration-datastore-uri-string
147 (default "sqlite:///var/lib/guix-build-coordinator/guix_build_coordinator.db"))
148 (agent-communication-uri-string
149 guix-build-coordinator-configuration-agent-communication-uri-string
150 (default "http://0.0.0.0:8745"))
151 (client-communication-uri-string
152 guix-build-coordinator-configuration-client-communication-uri-string
153 (default "http://127.0.0.1:8746"))
155 guix-build-coordinator-configuration-allocation-strategy
156 (default #~basic-build-allocation-strategy))
157 (hooks guix-build-coordinator-configuration-hooks
159 (parallel-hooks guix-build-coordinator-configuration-parallel-hooks
161 (guile guix-build-coordinator-configuration-guile
162 (default guile-3.0-latest)))
164 (define-record-type* <guix-build-coordinator-agent-configuration>
165 guix-build-coordinator-agent-configuration
166 make-guix-build-coordinator-agent-configuration
167 guix-build-coordinator-agent-configuration?
168 (package guix-build-coordinator-agent-configuration-package
169 (default guix-build-coordinator/agent-only))
170 (user guix-build-coordinator-agent-configuration-user
171 (default "guix-build-coordinator-agent"))
172 (coordinator guix-build-coordinator-agent-configuration-coordinator
173 (default "http://localhost:8745"))
174 (authentication guix-build-coordinator-agent-configuration-authentication)
175 (systems guix-build-coordinator-agent-configuration-systems
178 guix-build-coordinator-agent-configuration-max-parallel-builds
180 (max-1min-load-average
181 guix-build-coordinator-agent-configuration-max-1min-load-average
183 (derivation-substitute-urls
184 guix-build-coordinator-agent-configuration-derivation-substitute-urls
186 (non-derivation-substitute-urls
187 guix-build-coordinator-agent-configuration-non-derivation-substitute-urls
190 (define-record-type* <guix-build-coordinator-agent-password-auth>
191 guix-build-coordinator-agent-password-auth
192 make-guix-build-coordinator-agent-password-auth
193 guix-build-coordinator-agent-password-auth?
194 (uuid guix-build-coordinator-agent-password-auth-uuid)
195 (password guix-build-coordinator-agent-password-auth-password))
197 (define-record-type* <guix-build-coordinator-agent-password-file-auth>
198 guix-build-coordinator-agent-password-file-auth
199 make-guix-build-coordinator-agent-password-file-auth
200 guix-build-coordinator-agent-password-file-auth?
201 (uuid guix-build-coordinator-agent-password-file-auth-uuid)
203 guix-build-coordinator-agent-password-file-auth-password-file))
205 (define-record-type* <guix-build-coordinator-agent-dynamic-auth>
206 guix-build-coordinator-agent-dynamic-auth
207 make-guix-build-coordinator-agent-dynamic-auth
208 guix-build-coordinator-agent-dynamic-auth?
209 (agent-name guix-build-coordinator-agent-dynamic-auth-agent-name)
210 (token guix-build-coordinator-agent-dynamic-auth-token))
212 (define-record-type* <guix-build-coordinator-agent-dynamic-auth-with-file>
213 guix-build-coordinator-agent-dynamic-auth-with-file
214 make-guix-build-coordinator-agent-dynamic-auth-with-file
215 guix-build-coordinator-agent-dynamic-auth-with-file?
216 (agent-name guix-build-coordinator-agent-dynamic-auth-with-file-agent-name)
217 (token-file guix-build-coordinator-agent-dynamic-auth-with-file-token-file))
219 (define-record-type* <guix-build-coordinator-queue-builds-configuration>
220 guix-build-coordinator-queue-builds-configuration
221 make-guix-build-coordinator-queue-builds-configuration
222 guix-build-coordinator-queue-builds-configuration?
223 (package guix-build-coordinator-queue-builds-configuration-package
224 (default guix-build-coordinator))
225 (user guix-build-coordinator-queue-builds-configuration-user
226 (default "guix-build-coordinator-queue-builds"))
227 (coordinator guix-build-coordinator-queue-builds-coordinator
228 (default "http://localhost:8746"))
229 (systems guix-build-coordinator-queue-builds-configuration-systems
232 guix-build-coordinator-queue-builds-configuration-system-and-targets
235 guix-build-coordinator-queue-builds-configuration-guix-data-service
236 (default "https://data.guix.gnu.org"))
237 (guix-data-service-build-server-id
238 guix-build-coordinator-queue-builds-configuration-guix-data-service-build-server-id
240 (processed-commits-file
241 guix-build-coordinator-queue-builds-configuration-processed-commits-file
242 (default "/var/cache/guix-build-coordinator-queue-builds/processed-commits")))
244 (define* (make-guix-build-coordinator-start-script database-uri-string
247 guix-build-coordinator-package
249 agent-communication-uri-string
250 client-communication-uri-string
255 "start-guix-build-coordinator"
256 (with-extensions (cons guix-build-coordinator-package
257 ;; This is a poorly constructed Guile load path,
258 ;; since it contains things that aren't Guile
259 ;; libraries, but it means that the Guile libraries
260 ;; needed for the Guix Build Coordinator don't need
261 ;; to be individually specified here.
263 (map second (package-inputs
264 guix-build-coordinator-package))
265 (map second (package-propagated-inputs
266 guix-build-coordinator-package))))
268 (use-modules (srfi srfi-1)
272 (guix-build-coordinator hooks)
273 (guix-build-coordinator datastore)
274 (guix-build-coordinator build-allocator)
275 (guix-build-coordinator coordinator))
277 (setvbuf (current-output-port) 'line)
278 (setvbuf (current-error-port) 'line)
280 (simple-format #t "starting the guix-build-coordinator:\n ~A\n"
282 (let* ((metrics-registry (make-metrics-registry
284 "guixbuildcoordinator"))
285 (datastore (database-uri->datastore
286 #$database-uri-string
287 #:metrics-registry metrics-registry))
289 (list #$@(map (match-lambda
291 #~(cons '#$name #$hook-gexp)))
295 ,@(remove (match-lambda
296 ((name . _) (assq-ref hooks name)))
298 (build-coordinator (make-build-coordinator
299 #:datastore datastore
300 #:hooks hooks-with-defaults
301 #:metrics-registry metrics-registry
302 #:allocation-strategy #$allocation-strategy)))
304 (run-coordinator-service
306 #:update-datastore? #t
307 #:pid-file #$pid-file
308 #:agent-communication-uri (string->uri
309 #$agent-communication-uri-string)
310 #:client-communication-uri (string->uri
311 #$client-communication-uri-string)
312 #:parallel-hooks (list #$@(map (match-lambda
314 #~(cons '#$name #$val)))
318 (define (guix-build-coordinator-shepherd-services config)
319 (match-record config <guix-build-coordinator-configuration>
320 (package user group database-uri-string
321 agent-communication-uri-string
322 client-communication-uri-string
329 (documentation "Guix Build Coordinator")
330 (provision '(guix-build-coordinator))
331 (requirement '(networking))
332 (start #~(make-forkexec-constructor
333 (list #$(make-guix-build-coordinator-start-script
336 "/var/run/guix-build-coordinator/pid"
338 #:agent-communication-uri-string
339 agent-communication-uri-string
340 #:client-communication-uri-string
341 client-communication-uri-string
343 #:parallel-hooks parallel-hooks
347 #:pid-file "/var/run/guix-build-coordinator/pid"
348 ;; Allow time for migrations to run
349 #:pid-file-timeout 60
350 #:environment-variables
352 "GUIX_LOCPATH=" #$glibc-utf8-locales "/lib/locale")
354 "PATH=/run/current-system/profile/bin") ; for hooks
355 #:log-file "/var/log/guix-build-coordinator/coordinator.log"))
356 (stop #~(make-kill-destructor))))))
358 (define (guix-build-coordinator-activation config)
360 (use-modules (guix build utils))
363 (getpw #$(guix-build-coordinator-configuration-user
366 (chmod "/var/lib/guix-build-coordinator" #o755)
368 (mkdir-p "/var/log/guix-build-coordinator")
370 ;; Allow writing the PID file
371 (mkdir-p "/var/run/guix-build-coordinator")
372 (chown "/var/run/guix-build-coordinator"
374 (passwd:gid %user))))
376 (define (guix-build-coordinator-account config)
377 (match-record config <guix-build-coordinator-configuration>
386 (comment "Guix Build Coordinator user")
387 (home-directory "/var/lib/guix-build-coordinator")
388 (shell (file-append shadow "/sbin/nologin"))))))
390 (define guix-build-coordinator-service-type
392 (name 'guix-build-coordinator)
395 (service-extension shepherd-root-service-type
396 guix-build-coordinator-shepherd-services)
397 (service-extension activation-service-type
398 guix-build-coordinator-activation)
399 (service-extension account-service-type
400 guix-build-coordinator-account)))
402 (guix-build-coordinator-configuration))
404 "Run an instance of the Guix Build Coordinator.")))
406 (define (guix-build-coordinator-agent-shepherd-services config)
407 (match-record config <guix-build-coordinator-agent-configuration>
408 (package user coordinator authentication max-parallel-builds
409 max-1min-load-average
410 derivation-substitute-urls non-derivation-substitute-urls
414 (documentation "Guix Build Coordinator Agent")
415 (provision '(guix-build-coordinator-agent))
416 (requirement '(networking))
417 (start #~(make-forkexec-constructor
418 (list #$(file-append package "/bin/guix-build-coordinator-agent")
419 #$(string-append "--coordinator=" coordinator)
420 #$@(match authentication
421 (($ <guix-build-coordinator-agent-password-auth>
423 #~(#$(string-append "--uuid=" uuid)
424 #$(string-append "--password=" password)))
425 (($ <guix-build-coordinator-agent-password-file-auth>
427 #~(#$(string-append "--uuid=" uuid)
428 #$(string-append "--password-file="
430 (($ <guix-build-coordinator-agent-dynamic-auth>
432 #~(#$(string-append "--name=" agent-name)
433 #$(string-append "--dynamic-auth-token=" token)))
435 <guix-build-coordinator-agent-dynamic-auth-with-file>
436 agent-name token-file)
437 #~(#$(string-append "--name=" agent-name)
438 #$(string-append "--dynamic-auth-token-file="
440 #$(simple-format #f "--max-parallel-builds=~A"
442 #$@(if max-1min-load-average
443 #~(#$(simple-format #f "--max-1min-load-average=~A"
444 max-1min-load-average))
446 #$@(if derivation-substitute-urls
448 "--derivation-substitute-urls="
449 (string-join derivation-substitute-urls " ")))
451 #$@(if non-derivation-substitute-urls
453 "--non-derivation-substitute-urls="
454 (string-join non-derivation-substitute-urls " ")))
456 #$@(map (lambda (system)
457 (string-append "--system=" system))
460 #:environment-variables
462 "GUIX_LOCPATH=" #$glibc-utf8-locales "/lib/locale")
463 ;; XDG_CACHE_HOME is used by Guix when caching narinfo files
464 "XDG_CACHE_HOME=/var/cache/guix-build-coordinator-agent"
466 #:log-file "/var/log/guix-build-coordinator/agent.log"))
467 (stop #~(make-kill-destructor))))))
469 (define (guix-build-coordinator-agent-activation config)
471 (use-modules (guix build utils))
474 (getpw #$(guix-build-coordinator-agent-configuration-user
477 (mkdir-p "/var/log/guix-build-coordinator")
479 ;; Create a cache directory for storing narinfo files if downloaded
480 (mkdir-p "/var/cache/guix-build-coordinator-agent")
481 (chown "/var/cache/guix-build-coordinator-agent"
483 (passwd:gid %user))))
485 (define (guix-build-coordinator-agent-account config)
487 (name (guix-build-coordinator-agent-configuration-user config))
490 (comment "Guix Build Coordinator agent user")
491 (home-directory "/var/empty")
492 (shell (file-append shadow "/sbin/nologin")))))
494 (define guix-build-coordinator-agent-service-type
496 (name 'guix-build-coordinator-agent)
499 (service-extension shepherd-root-service-type
500 guix-build-coordinator-agent-shepherd-services)
501 (service-extension activation-service-type
502 guix-build-coordinator-agent-activation)
503 (service-extension account-service-type
504 guix-build-coordinator-agent-account)))
506 "Run a Guix Build Coordinator agent.")))
508 (define (guix-build-coordinator-queue-builds-shepherd-services config)
509 (match-record config <guix-build-coordinator-queue-builds-configuration>
510 (package user coordinator systems systems-and-targets
512 guix-data-service-build-server-id
513 processed-commits-file)
516 (documentation "Guix Build Coordinator queue builds from Guix Data Service")
517 (provision '(guix-build-coordinator-queue-builds))
518 (requirement '(networking))
520 #~(make-forkexec-constructor
524 "/bin/guix-build-coordinator-queue-builds-from-guix-data-service")
525 #$(string-append "--coordinator=" coordinator)
526 #$@(map (lambda (system)
527 (string-append "--system=" system))
529 #$@(map (match-lambda
531 (string-append "--system-and-target=" system "=" target)))
532 (or systems-and-targets '()))
533 #$@(if guix-data-service
534 #~(#$(string-append "--guix-data-service=" guix-data-service))
536 #$@(if guix-data-service-build-server-id
539 "--guix-data-service-build-server-id=~A"
540 guix-data-service-build-server-id))
542 #$@(if processed-commits-file
543 #~(#$(string-append "--processed-commits-file="
544 processed-commits-file))
547 #:environment-variables
549 "GUIX_LOCPATH=" #$glibc-utf8-locales "/lib/locale")
551 #:log-file "/var/log/guix-build-coordinator/queue-builds.log"))
552 (stop #~(make-kill-destructor))))))
554 (define (guix-build-coordinator-queue-builds-activation config)
556 (use-modules (guix build utils))
559 (getpw #$(guix-build-coordinator-queue-builds-configuration-user
562 (mkdir-p "/var/log/guix-build-coordinator")
564 ;; Allow writing the processed commits file
565 (mkdir-p "/var/cache/guix-build-coordinator-queue-builds")
566 (chown "/var/cache/guix-build-coordinator-queue-builds"
568 (passwd:gid %user))))
570 (define (guix-build-coordinator-queue-builds-account config)
572 (name (guix-build-coordinator-queue-builds-configuration-user config))
575 (comment "Guix Build Coordinator queue-builds user")
576 (home-directory "/var/empty")
577 (shell (file-append shadow "/sbin/nologin")))))
579 (define guix-build-coordinator-queue-builds-service-type
581 (name 'guix-build-coordinator-queue-builds)
584 (service-extension shepherd-root-service-type
585 guix-build-coordinator-queue-builds-shepherd-services)
586 (service-extension activation-service-type
587 guix-build-coordinator-queue-builds-activation)
588 (service-extension account-service-type
589 guix-build-coordinator-queue-builds-account)))
591 "Run the guix-build-coordinator-queue-builds-from-guix-data-service
594 This is a script to assist in having the Guix Build Coordinator build
595 derivations stored in an instance of the Guix Data Service.")))
599 ;;; Guix Data Service
602 (define-record-type* <guix-data-service-configuration>
603 guix-data-service-configuration make-guix-data-service-configuration
604 guix-data-service-configuration?
605 (package guix-data-service-package
606 (default guix-data-service))
607 (user guix-data-service-configuration-user
608 (default "guix-data-service"))
609 (group guix-data-service-configuration-group
610 (default "guix-data-service"))
611 (port guix-data-service-port
613 (host guix-data-service-host
614 (default "127.0.0.1"))
615 (getmail-idle-mailboxes
616 guix-data-service-getmail-idle-mailboxes
618 (commits-getmail-retriever-configuration
619 guix-data-service-commits-getmail-retriever-configuration
621 (extra-options guix-data-service-extra-options
623 (extra-process-jobs-options
624 guix-data-service-extra-process-jobs-options
627 (define (guix-data-service-profile-packages config)
628 "Return the guix-data-service package, this will populate the
629 ca-certificates.crt file in the system profile."
631 (guix-data-service-package config)))
633 (define (guix-data-service-shepherd-services config)
634 (match-record config <guix-data-service-configuration>
635 (package user group port host extra-options extra-process-jobs-options)
638 (documentation "Guix Data Service web server")
639 (provision '(guix-data-service))
640 (requirement '(postgres networking))
641 (start #~(make-forkexec-constructor
642 (list #$(file-append package
643 "/bin/guix-data-service")
644 "--pid-file=/var/run/guix-data-service/pid"
645 #$(string-append "--port=" (number->string port))
646 #$(string-append "--host=" host)
647 ;; Perform any database migrations when the
648 ;; service is started
654 #:pid-file "/var/run/guix-data-service/pid"
655 #:environment-variables
657 "GUIX_LOCPATH=" #$glibc-utf8-locales "/lib/locale")
658 "LC_ALL=en_US.UTF-8")
659 #:log-file "/var/log/guix-data-service/web.log"))
660 (stop #~(make-kill-destructor)))
663 (documentation "Guix Data Service process jobs")
664 (provision '(guix-data-service-process-jobs))
665 (requirement '(postgres
667 ;; Require guix-data-service, as that the database
668 ;; migrations are handled through this service
670 (start #~(make-forkexec-constructor
672 #$(file-append package
673 "/bin/guix-data-service-process-jobs")
674 #$@extra-process-jobs-options)
677 #:environment-variables
678 `("HOME=/var/lib/guix-data-service"
679 "GIT_SSL_CAINFO=/etc/ssl/certs/ca-certificates.crt"
681 "GUIX_LOCPATH=" #$glibc-utf8-locales "/lib/locale")
682 "LC_ALL=en_US.UTF-8")
683 #:log-file "/var/log/guix-data-service/process-jobs.log"))
684 (stop #~(make-kill-destructor))))))
686 (define (guix-data-service-activation config)
688 (use-modules (guix build utils))
690 (define %user (getpw "guix-data-service"))
692 (chmod "/var/lib/guix-data-service" #o755)
694 (mkdir-p "/var/log/guix-data-service")
696 ;; Allow writing the PID file
697 (mkdir-p "/var/run/guix-data-service")
698 (chown "/var/run/guix-data-service"
700 (passwd:gid %user))))
702 (define (guix-data-service-account config)
703 (match-record config <guix-data-service-configuration>
712 (comment "Guix Data Service user")
713 (home-directory "/var/lib/guix-data-service")
714 (shell (file-append shadow "/sbin/nologin"))))))
716 (define (guix-data-service-getmail-configuration config)
718 (($ <guix-data-service-configuration> package user group
722 (($ <guix-data-service-configuration> package user group
724 getmail-idle-mailboxes
725 commits-getmail-retriever-configuration)
727 (getmail-configuration
728 (name 'guix-data-service)
731 (directory "/var/lib/getmail/guix-data-service")
733 (getmail-configuration-file
734 (retriever commits-getmail-retriever-configuration)
736 (getmail-destination-configuration
737 (type "MDA_external")
740 "/bin/guix-data-service-process-branch-updated-email"))))
742 (getmail-options-configuration
746 (idle getmail-idle-mailboxes))))))
748 (define guix-data-service-type
750 (name 'guix-data-service)
753 (service-extension profile-service-type
754 guix-data-service-profile-packages)
755 (service-extension shepherd-root-service-type
756 guix-data-service-shepherd-services)
757 (service-extension activation-service-type
758 guix-data-service-activation)
759 (service-extension account-service-type
760 guix-data-service-account)
761 (service-extension getmail-service-type
762 guix-data-service-getmail-configuration)))
764 (guix-data-service-configuration))
766 "Run an instance of the Guix Data Service.")))
773 (define-record-type* <nar-herder-configuration>
774 nar-herder-configuration make-nar-herder-configuration
775 nar-herder-configuration?
776 (package nar-herder-configuration-package
777 (default nar-herder))
778 (user nar-herder-configuration-user
779 (default "nar-herder"))
780 (group nar-herder-configuration-group
781 (default "nar-herder"))
782 (mirror nar-herder-configuration-mirror
784 (database nar-herder-configuration-database
785 (default "/var/lib/nar-herder/nar_herder.db"))
786 (database-dump nar-herder-configuration-database-dump
787 (default "/var/lib/nar-herder/nar_herder_dump.db"))
788 (host nar-herder-configuration-host
789 (default "127.0.0.1"))
790 (port nar-herder-configuration-port
792 (storage nar-herder-configuration-storage
794 (storage-limit nar-herder-configuration-storage-limit
796 (storage-nar-removal-criteria
797 nar-herder-configuration-storage-nar-removal-criteria
799 (ttl nar-herder-configuration-ttl
801 (negative-ttl nar-herder-configuration-negative-ttl
803 (log-level nar-herder-configuration-log-level
807 (define (nar-herder-shepherd-services config)
808 (match-record config <nar-herder-configuration>
811 database database-dump
813 storage storage-limit storage-nar-removal-criteria
814 ttl negative-ttl log-level)
816 (unless (or mirror storage)
817 (error "nar-herder: mirror or storage must be set"))
821 (documentation "Nar Herder")
822 (provision '(nar-herder))
823 (requirement '(networking))
824 (start #~(make-forkexec-constructor
825 (list #$(file-append package
828 "--pid-file=/var/run/nar-herder/pid"
829 #$(string-append "--port=" (number->string port))
830 #$(string-append "--host=" host)
832 (list (string-append "--mirror=" mirror))
834 #$(string-append "--database=" database)
835 #$(string-append "--database-dump=" database-dump)
837 (list (string-append "--storage=" storage))
839 #$(string-append "--storage-limit="
840 (if (number? storage-limit)
841 (number->string storage-limit)
843 #$@(map (lambda (criteria)
845 "--storage-nar-removal-criteria="
847 ((k . v) (simple-format #f "~A=~A" k v))
849 storage-nar-removal-criteria)
851 (list (string-append "--ttl=" ttl))
854 (list (string-append "--negative-ttl=" negative-ttl))
857 (list (simple-format #f "--log-level=~A" log-level))
861 #:pid-file "/var/run/nar-herder/pid"
862 #:environment-variables
864 "GUIX_LOCPATH=" #$glibc-utf8-locales "/lib/locale")
866 #:log-file "/var/log/nar-herder/server.log"))
867 (stop #~(make-kill-destructor))))))
869 (define (nar-herder-activation config)
871 (use-modules (guix build utils))
874 (getpw #$(nar-herder-configuration-user
877 (chmod "/var/lib/nar-herder" #o755)
879 (mkdir-p "/var/log/nar-herder")
881 ;; Allow writing the PID file
882 (mkdir-p "/var/run/nar-herder")
883 (chown "/var/run/nar-herder"
885 (passwd:gid %user))))
887 (define (nar-herder-account config)
888 (match-record config <nar-herder-configuration>
897 (comment "Nar Herder user")
898 (home-directory "/var/lib/nar-herder")
899 (shell (file-append shadow "/sbin/nologin"))))))
901 (define nar-herder-service-type
906 (service-extension shepherd-root-service-type
907 nar-herder-shepherd-services)
908 (service-extension activation-service-type
909 nar-herder-activation)
910 (service-extension account-service-type
911 nar-herder-account)))
913 "Run a Nar Herder server.")))