summaryrefslogtreecommitdiff
path: root/rodion/services/miniflux.scm
blob: 9ac78cce71114a551fc822f85fcd8c3170077897 (about) (plain)
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
(define-module (rodion services miniflux)
  #:use-module (gnu services shepherd)
  #:use-module (gnu services)
  #:use-module (gnu services configuration)
  #:use-module (gnu system shadow)
  #:use-module (guix gexp)
  #:use-module (guix records)
  #:use-module (gnu packages admin)
  #:use-module (gnu services databases)
  #:use-module (rodion packages go)
  #:use-module (ice-9 string-fun)
  #:export (miniflux-service-type
	    miniflux-configuration
	    miniflux-configuration?
	    miniflux-configuration-test?))

(define (initial-string? val) (string? val))
(define (initial-boolean? val) (boolean? val))

(define (serialize-string field-name val)
  (format #f "~a=~a\n" (string-upcase
			(string-replace-substring
			 (if (symbol? field-name) (symbol->string field-name) field-name) "-" "_"))
	  val))

(define (serialize-initial-string field-name val)
  (serialize-string (string-drop (symbol->string field-name) 8) val))

(define (serialize-initial-boolean field-name val)
  (serialize-boolean (string-drop (symbol->string field-name) 8) val))

(define (non-negative-integer? val)
  (and (exact-integer? val) (not (negative? val))))

(define (serialize-non-negative-integer field-name val)
  (serialize-string field-name (number->string val)))

(define (serialize-boolean field-name val)
  (if val (serialize-string field-name "1") ""))

(define-configuration miniflux-configuration
  (listen-addr
   (string "127.0.0.1:8080")
   "Address to listen on. Use absolute path for a Unix socket.")
  (base-url
   (string "http://localhost/")
   "Base URL to generate HTML links and base path for cookies.")
  (initial-create-admin
   (initial-boolean #t)
   "Create an initial admin")
  (initial-admin-username
   (initial-string "admin")
   "Initial admin username")
  (initial-admin-password
   (initial-string "password")
   "Initial admin password")
  (user
   (string "miniflux")
   "User name for Postgresql and system account")
  (database-url
   (string "host=/var/run/postgresql")
   "PostgreSQL connection string")
  (group
   (string "miniflux")
   "Group for the system account"
   empty-serializer)
  (run-migrations
   (boolean #t)
   "Run database migrations during application startup.")
  (log-file
   (string "/var/log/miniflux.log")
   "Path to the log file"
   empty-serializer))

(define (miniflux-shepherd-service config)
  (let* ((config-file (mixed-text-file "miniflux.conf" (serialize-configuration config miniflux-configuration-fields))))
    (list (shepherd-service
	   (documentation "Run Miniflux server")
	   (provision '(miniflux))
	   (requirement '(networking postgresql))
	   (start #~(make-forkexec-constructor
		     (list (string-append #$miniflux "/bin/miniflux")
			   "-config-file" #$config-file)
		     #:user #$(miniflux-configuration-user config)
		     #:group #$(miniflux-configuration-group config)
		     #:log-file #$(miniflux-configuration-log-file config)))
	   (stop #~(make-kill-destructor))))))

(define (miniflux-account config) (list (user-group
					 (name (miniflux-configuration-group config))
					  (system? #t))
					 (user-account
					  (name (miniflux-configuration-user config))
					  (group (miniflux-configuration-group config))
					  (home-directory "/var/empty")
					  (shell (file-append shadow "/sbin/nologin"))
					  (system? #t))))

(define (miniflux-postgresql-role config)
  (list (postgresql-role
	 (name (miniflux-configuration-user config))
         (create-database? #t))))

(define miniflux-service-type
  (service-type
   (name 'miniflux)
   (description "Miniflux service")
   (default-value (miniflux-configuration))
   (extensions
    (list (service-extension account-service-type
			     miniflux-account)
	  (service-extension postgresql-service-type (const #t))
	  (service-extension postgresql-role-service-type
			     miniflux-postgresql-role)
	  (service-extension shepherd-root-service-type
			     miniflux-shepherd-service)))))