From 9741fba05c24f8cf81d0e03bbfc0d5817b8e69ba Mon Sep 17 00:00:00 2001 From: Arun Isaac Date: Sun, 9 Nov 2025 12:05:57 +0000 Subject: klaus: Implement klaus as a first class service. Implement klaus as a first class service, deprecating the klaus-gunicorn-app function. --- guix/forge/klaus.scm | 85 +++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 77 insertions(+), 8 deletions(-) (limited to 'guix/forge/klaus.scm') 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-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 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 + (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 + (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{} object to deploy klaus. @var{repository-directory} is the path to the directory containing git -- cgit 1.4.1