about summary refs log tree commit diff
path: root/guix/forge/klaus.scm
diff options
context:
space:
mode:
authorArun Isaac2025-11-09 12:05:57 +0000
committerArun Isaac2025-11-09 12:28:36 +0000
commit9741fba05c24f8cf81d0e03bbfc0d5817b8e69ba (patch)
treec0eb79ef919ec3edb532329a231885a3ad705bd1 /guix/forge/klaus.scm
parent4fb5ad671312091e10eff831600dab1b5cd4a6dd (diff)
downloadguix-forge-9741fba05c24f8cf81d0e03bbfc0d5817b8e69ba.tar.gz
guix-forge-9741fba05c24f8cf81d0e03bbfc0d5817b8e69ba.tar.lz
guix-forge-9741fba05c24f8cf81d0e03bbfc0d5817b8e69ba.zip
klaus: Implement klaus as a first class service.
Implement klaus as a first class service, deprecating the
klaus-gunicorn-app function.
Diffstat (limited to 'guix/forge/klaus.scm')
-rw-r--r--guix/forge/klaus.scm85
1 files changed, 77 insertions, 8 deletions
diff --git a/guix/forge/klaus.scm b/guix/forge/klaus.scm
index 7a0bff6..dffd61d 100644
--- a/guix/forge/klaus.scm
+++ b/guix/forge/klaus.scm
@@ -22,13 +22,28 @@
   #:use-module (forge environment)
   #:use-module ((forge git) #:select (git-without-safe-directory-check))
   #:use-module (forge gunicorn)
+  #:use-module (forge nginx)
   #:use-module (forge socket)
   #:use-module ((gnu packages version-control)
                 #:select (python-klaus)
                 #:prefix guix:)
+  #:use-module (gnu services)
+  #:use-module ((gnu services web) #:select (nginx-server-configuration
+                                             nginx-location-configuration))
   #:use-module (gnu system file-systems)
+  #:use-module (guix deprecation)
   #:use-module (guix packages)
-  #:export (klaus-gunicorn-app))
+  #:use-module (guix records)
+  #:export (<klaus-configuration>
+            klaus-configuration
+            klaus-configuration?
+            klaus-configuration-python-klaus
+            klaus-configuration-server-name
+            klaus-configuration-socket
+            klaus-configuration-repository-directory
+            klaus-configuration-site-name
+            klaus-service-type
+            klaus-gunicorn-app))
 
 (define-public python-klaus
   (package
@@ -39,14 +54,68 @@
      ;; more long term solution is to rewrite klaus to not use the git CLI at
      ;; all. See https://github.com/jonashaag/klaus/issues/322
      (modify-inputs (package-inputs guix:python-klaus)
-       (replace "git" git-without-safe-directory-check)))))
+       (replace "git-minimal" git-without-safe-directory-check)))))
 
-(define* (klaus-gunicorn-app repository-directory
-                             #:key
-                             (klaus python-klaus)
-                             (sockets (list (forge-unix-socket
-                                             (path "/var/run/gunicorn/klaus/socket"))))
-                             site-name)
+(define-record-type* <klaus-configuration>
+  klaus-configuration make-klaus-configuration
+  klaus-configuration?
+  (python-klaus klaus-configuration-python-klaus
+                (default python-klaus))
+  (server-name klaus-configuration-server-name)
+  (socket klaus-configuration-socket
+          (default (forge-unix-socket
+                    (path "/var/run/gunicorn/klaus/socket"))))
+  (repository-directory klaus-configuration-repository-directory
+                        (default "/srv/git"))
+  (site-name klaus-configuration-site-name
+             (default #f)))
+
+(define klaus-gunicorn-apps
+  (match-record-lambda <klaus-configuration>
+    (python-klaus socket repository-directory site-name)
+    (list (gunicorn-app
+           (name "klaus")
+           (package python-klaus)
+           (wsgi-app-module "klaus.contrib.wsgi_autoreload")
+           (sockets (list socket))
+           (environment-variables (cons (environment-variable
+                                         (name "KLAUS_REPOS_ROOT")
+                                         (value repository-directory))
+                                        (if site-name
+                                            (list (environment-variable
+                                                   (name "KLAUS_SITE_NAME")
+                                                   (value site-name)))
+                                            (list))))
+           (mappings (list (file-system-mapping
+                            (source repository-directory)
+                            (target source))))))))
+
+(define klaus-nginx-server-blocks
+  (match-record-lambda <klaus-configuration>
+    (server-name socket)
+    (list (nginx-server-configuration
+           (server-name (list server-name))
+           (locations
+            (list (nginx-location-configuration
+                   (uri "/")
+                   (body (list (socket->nginx-proxy-pass socket))))))))))
+
+(define klaus-service-type
+  (service-type
+   (name 'klaus)
+   (description "Run klaus.")
+   (extensions (list (service-extension gunicorn-service-type
+                                        klaus-gunicorn-apps)
+                     (service-extension forge-nginx-service-type
+                                        klaus-nginx-server-blocks)))))
+
+(define-deprecated (klaus-gunicorn-app repository-directory
+                                       #:key
+                                       (klaus python-klaus)
+                                       (sockets (list (forge-unix-socket
+                                                       (path "/var/run/gunicorn/klaus/socket"))))
+                                       site-name)
+  klaus-service-type
   "Return a @code{<gunicorn-app>} object to deploy klaus.
 
 @var{repository-directory} is the path to the directory containing git