From 158630a6d3069b2db4573211adb19853ef32c5bc Mon Sep 17 00:00:00 2001 From: Saku Laesvuori Date: Mon, 25 Sep 2023 22:31:41 +0300 Subject: [PATCH] Add Guix system services --- .guix/modules/datarekisteri-service.scm | 175 ++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 .guix/modules/datarekisteri-service.scm diff --git a/.guix/modules/datarekisteri-service.scm b/.guix/modules/datarekisteri-service.scm new file mode 100644 index 0000000..7eec70c --- /dev/null +++ b/.guix/modules/datarekisteri-service.scm @@ -0,0 +1,175 @@ +(define-module (datarekisteri-service) + #:use-module (datarekisteri-package) + #:use-module (guix gexp) + #:use-module (guix records) + #:use-module (gnu packages admin) + #:use-module (gnu services) + #:use-module (gnu services certbot) + #:use-module (gnu services configuration) + #:use-module (gnu services databases) + #:use-module (gnu services shepherd) + #:use-module (gnu services web) + #:use-module (gnu system shadow) + + #:export (plain-datarekisteri-frontend-service-type + plain-datarekisteri-frontend-configuration + + plain-datarekisteri-backend-service-type + plain-datarekisteri-backend-configuration)) + +(define-maybe/no-serialization string) + +(define-configuration/no-serialization plain-datarekisteri-frontend-configuration + (datarekisteri-frontend + (file-like datarekisteri-frontend) + "The datarekisteri-frontend package to use.") + (backend-url + (string) + "The URL for the datarekisteri backend server.") + (port + (integer 3000) + "The TCP port to listen on.") + (root-url + (string) + "The root URL for this server.")) + +(define (frontend-shepherd-service config) + (match-record config + (backend-url port root-url datarekisteri-frontend) + (list (shepherd-service + (documentation "Run the datarekisteri frontend HTTP server") + (requirement '(networking)) + (provision '(datarekisteri-frontend)) + (start + #~(make-forkexec-constructor + (list #$(file-append datarekisteri-frontend "/bin/datarekisteri-frontend") + "--server-url" #$backend-url + "--port" #$(number->string port) + "--approot" #$root-url) + #:user "datarekisteri-frontend" + #:group "datarekisteri-frontend" + #:directory "/var/lib/datarekisteri-frontend")) + (stop #~(make-kill-destructor)))))) + +(define (frontend-accounts _) + (list (user-group + (name "datarekisteri-frontend") + (system? #t)) + (user-account + (name "datarekisteri-frontend") + (system? #t) + (group "datarekisteri-frontend") + (home-directory "/var/lib/datarekisteri-frontend") + (shell (file-append shadow "/bin/nologin"))))) + +(define plain-datarekisteri-frontend-service-type + (service-type + (name 'plain-datarekisteri-frontend) + (extensions + (list (service-extension shepherd-root-service-type frontend-shepherd-service) + (service-extension account-service-type frontend-accounts))) + (description "Run the datarekisteri HTTP frontend server"))) + +(define (file-like-or-string? x) + (or (file-like? x) + (string? x))) + +(define-configuration/no-serialization plain-datarekisteri-backend-configuration + (datarekisteri-backend + (file-like datarekisteri-backend) + "The datarekisteri-backend package to use.") + (email-address + (string) + "The email address to send emails from.") + (email-sender + (maybe-string) + "The display name for sending emails.") + (port + (integer 3100) + "The TCP port to listen on.") + (sendmail + (file-like-or-string) + "Path to the sendmail program to send emails with.")) + +(define (backend-shepherd-service config) + (match-record config + (email-address email-sender sendmail port datarekisteri-backend) + (list (shepherd-service + (documentation "Run the datarekisteri backend HTTP server") + (requirement '(networking postgres)) + (provision '(datarekisteri-backend)) + (start + #~(make-forkexec-constructor + (list #$(file-append datarekisteri-backend "/bin/datarekisteri-backend") + "--address" #$email-address + #$@(if (maybe-value-set? email-sender) (list "--sender-name" email-sender) '()) + "--port" #$(number->string port) + "--sendmail" #$sendmail) + #:user "datarekisteri-backend" + #:group "datarekisteri-backend" + #:directory "/var/lib/datarekisteri-backend")) + (stop #~(make-kill-destructor)))))) + +(define (backend-accounts _) + (list (user-group + (name "datarekisteri-backend") + (system? #t)) + (user-account + (name "datarekisteri-backend") + (system? #t) + (group "datarekisteri-backend") + (home-directory "/var/lib/datarekisteri-backend") + (shell (file-append shadow "/bin/nologin"))))) + +(define (backend-postgresql-roles _) + (list (postgresql-role + (name "datarekisteri-backend") + (create-database? #t)))) + +(define plain-datarekisteri-backend-service-type + (service-type + (name 'plain-datarekisteri-backend) + (extensions + (list (service-extension postgresql-role-service-type backend-postgresql-roles) + (service-extension account-service-type backend-accounts) + (service-extension shepherd-root-service-type backend-shepherd-service))) + (description "Run the datarekisteri backend HTTP server"))) + +; (define datarekisteri-client-service-type +; (service-type +; (name 'datarekisteri-client) +; (extensions +; (list (service-extension certbot-service-type client-certbot) +; (service-extension nginx-service-type client-nginx) +; (service-extension shepherd-root-service-type client-shepherd-service))) +; (description "Run the datarekisteri HTTP client server") +; (default-value (datarekisteri-client-configuration)))) + +; (define datarekisteri-api-service-type +; (service-type +; (name 'datarekisteri-api) +; (extensions +; (list (service-extension certbot-service-type api-certbot) +; (service-extension nginx-service-type api-nginx) +; (service-extension postgresql-role-service-type api-postgresql-roles) +; (service-extension shepherd-root-service-type api-shepherd-service))) +; (description "Run the datarekisteri HTTP api server") +; (default-value (datarekisteri-api-configuration)))) + +; (define-configuration datarekisteri-client-configuration +; (https? +; (boolean #t) +; "Whether to configure HTTPS with certbot.") +; (nginx? +; (boolean #t) +; "Whether to configure nginx as a reverse proxy.") +; (api-url +; (string) +; "The URL for the graphql API server.") +; (port +; (integer 3000) +; "The TCP port to listen on.") +; (root-url +; (string) +; "")) +