(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 mcron) #: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 account-service-type frontend-accounts) (service-extension shepherd-root-service-type frontend-shepherd-service))) (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 (backend-profile config) (match-record config (datarekisteri-backend) (list datarekisteri-backend))) (define (backend-mcron-jobs config) (match-record config (datarekisteri-backend) (list #~(job '(next-minute '(0)) (string-append #$datarekisteri-backend "/bin/datarekisteri-cli gc") #:user "datarekisteri-backend")))) (define plain-datarekisteri-backend-service-type (service-type (name 'plain-datarekisteri-backend) (extensions (list (service-extension account-service-type backend-accounts) (service-extension mcron-service-type backend-mcron-jobs) (service-extension postgresql-role-service-type backend-postgresql-roles) (service-extension profile-service-type backend-profile) (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) ; ""))