diff options
Diffstat (limited to 'gnu/services/feed.scm')
-rw-r--r-- | gnu/services/feed.scm | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/gnu/services/feed.scm b/gnu/services/feed.scm new file mode 100644 index 0000000000..9ec61f16ad --- /dev/null +++ b/gnu/services/feed.scm @@ -0,0 +1,136 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2024 Rodion Goritskov <rodion.goritskov@gmail.com> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (gnu services feed) + #: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 packages web) + #:use-module (gnu services databases) + #:use-module (gnu packages web) + #:use-module (ice-9 string-fun) + #:export (miniflux-service-type + miniflux-configuration + miniflux-configuration?)) + +(define (initial-string? val) (string? val)) +(define (initial-boolean? val) (boolean? val)) +(define (strip-initial-prefix field-name) (string-drop (symbol->string field-name) 8)) + +(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-boolean field-name val) + (if val (serialize-string field-name "1") (serialize-string field-name "0"))) + +;; Initial string is just a string with 'initial-' prefix +(define (serialize-initial-string field-name val) + (serialize-string (strip-initial-prefix field-name) val)) + +(define (serialize-initial-boolean field-name val) + (serialize-boolean (strip-initial-prefix field-name) val)) + +(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 #f) + "Create an initial admin") + (initial-admin-username + (initial-string "admin") + "Initial admin username") + (initial-admin-password + (initial-string "password") + "Initial admin password") + (run-migrations + (boolean #t) + "Run database migrations during application startup.") + (database-url + (string "host=/var/run/postgresql") + "PostgreSQL connection string") + (user + (string "miniflux") + "User name for Postgresql and system account") + (group + (string "miniflux") + "Group for the system account" + empty-serializer) + (log-file + (string "/var/log/miniflux.log") + "Path to the log file" + empty-serializer)) + +(define miniflux-shepherd-service + (lambda (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 '(postgres networking)) + (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-accounts + (lambda (config) + (let ((group (miniflux-configuration-group config)) + (user (miniflux-configuration-user config))) + `(,(user-group + (name group) + (system? #t)) + ,(user-account + (name user) + (group group) + (system? #t) + (comment "miniflux server user") + (home-directory "/var/empty") + (shell (file-append shadow "/sbin/nologin"))))))) + +(define miniflux-postgresql-role + (lambda (config) + (list (postgresql-role + (name (miniflux-configuration-user config)) + (create-database? #t))))) + +(define miniflux-service-type + (service-type + (name 'miniflux) + (default-value (miniflux-configuration)) + (extensions + (list (service-extension account-service-type + miniflux-accounts) + (service-extension postgresql-role-service-type + miniflux-postgresql-role) + (service-extension shepherd-root-service-type + miniflux-shepherd-service))) + (description "Run Miniflux, minimalist feed reader"))) |