Rosenthal/modules/rosenthal/services/mail.scm
Hilton Chain 677b4962a0
service: Add home-goimapnotify-service-type.
* modules/rosenthal/services/mail.scm (<home-goimapnotify-configuration>): New
data type.
(home-goimapnotify-shepherd): New procedure.
(home-goimapnotify-service-type): New variable.
2025-10-20 00:39:13 +08:00

123 lines
4.1 KiB
Scheme
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;;; SPDX-FileCopyrightText: 2024, 2025 Hilton Chain <hako@ultrarare.space>
;;;
;;; SPDX-License-Identifier: GPL-3.0-or-later
(define-module (rosenthal services mail)
#:use-module (srfi srfi-26)
#:use-module (guix gexp)
#:use-module (guix records)
#:use-module (rosenthal utils serializers yaml)
#:use-module (gnu services)
#:use-module (gnu services admin)
#:use-module (gnu services configuration)
#:use-module (gnu services docker)
#:use-module (gnu services shepherd)
#:use-module (gnu home services)
#:use-module (gnu home services shepherd)
#:use-module (gnu packages mail)
#:export (docker-mailserver-configuration
docker-mailserver-service-type
home-goimapnotify-service-type
home-goimapnotify-configuration))
;;;
;;; Docker Mailserver
;;; https://docker-mailserver.github.io/docker-mailserver/latest/
;;;
(define-configuration docker-mailserver-configuration
(data-directory
(string "/var/lib/docker-mailserver")
"Directory to store Docker Mailserver data.")
(log-file
(string "/var/log/docker-mailserver.log")
"Path to log file.")
(shepherd-requirement
(list-of-symbols '())
"List of Shepherd service dependencies.")
(options
(alist '())
"Alist of Docker Mailserver configuration. See also
@url{https://docker-mailserver.github.io/docker-mailserver/latest/config/environment/}.")
(extra-arguments
(list '())
"List of extra Docker arguments.")
(no-serialization))
(define docker-mailserver-oci-containers
(match-record-lambda <docker-mailserver-configuration>
(data-directory log-file shepherd-requirement options extra-arguments)
(let ((docker-mailserver-path
(cut string-append data-directory <>)))
(list (oci-container-configuration
(environment options)
(image "ghcr.io/docker-mailserver/docker-mailserver:latest")
(provision "docker-mailserver")
(requirement shepherd-requirement)
(log-file log-file)
(network "host")
(volumes
`((,(docker-mailserver-path "/data") . "/var/mail")
(,(docker-mailserver-path "/state") . "/var/mail-state")
(,(docker-mailserver-path "/logs") . "/var/log/mail")
(,(docker-mailserver-path "/config") . "/tmp/docker-mailserver")
("/etc/localtime" . "/etc/localtime:ro")))
(extra-arguments extra-arguments))))))
(define docker-mailserver-service-type
(service-type
(name 'docker-mailserver)
(extensions
(list (service-extension oci-container-service-type
docker-mailserver-oci-containers)
(service-extension log-rotation-service-type
(compose list docker-mailserver-configuration-log-file))))
(default-value (docker-mailserver-configuration))
(description "Run Docker Mailserver.")))
;;;
;;; goimapnotify
;;;
(define-configuration/no-serialization home-goimapnotify-configuration
(goimapnotify
(file-like goimapnotify)
"")
(config
yaml-config
"")
(shepherd-provision
(list-of-symbols '(goimapnotify))
"")
(shepherd-requirement
(list-of-symbols '())
"")
(auto-start?
(boolean #t)
""))
(define home-goimapnotify-shepherd
(match-record-lambda <home-goimapnotify-configuration>
(goimapnotify config shepherd-provision shepherd-requirement auto-start?)
(let ((config-file
(mixed-text-file "goimapnotify.yaml" (yaml-serialize config))))
(list (shepherd-service
(provision shepherd-provision)
(requirement shepherd-requirement)
(start
#~(make-forkexec-constructor
(list #$(file-append goimapnotify "/bin/goimapnotify")
"-conf" #$config-file)))
(stop #~(make-kill-destructor))
(auto-start? auto-start?))))))
(define home-goimapnotify-service-type
(service-type
(name 'home-goimapnotify)
(extensions
(list (service-extension home-shepherd-service-type
home-goimapnotify-shepherd)))
(description "")))