(define-module (metznet services gitea) #:use-module (gnu services) #:use-module (gnu services base) #:use-module (gnu services admin) #:use-module (gnu system shadow) #:use-module (gnu packages admin) #:use-module (gnu services shepherd) #:use-module (gnu services configuration) #:use-module (metznet packages gitea) #:use-module (guix gexp) #:use-module (gnu packages shells) #:export (gitea-configuration gitea-configuation? gitea-service-type)) (define-maybe string) (define-configuration/no-serialization gitea-configuration (gitea (file-like gitea) "gitea package to use") (work-path (string "/var/lib/gitea") "Gitea's work path.") (custom-path maybe-string "Gitea's custom folder path.") (config maybe-string "Gitea configuration file path.") (port (integer 3000) "gitea web port")) (define (gitea-activation configuration) (let ((work-path (gitea-configuration-work-path configuration)) (custom-path (gitea-configuration-custom-path configuration))) #~(begin (use-modules (guix build utils)) (let ((user (getpwnam "gitea"))) (mkdir-p #$work-path) (chown #$work-path (passwd:uid user) (passwd:gid user)) (when #$(maybe-value-set? custom-path) (mkdir-p #$custom-path)))))) (define (gitea-accounts configuration) (list (user-group (name "gitea") (system? #t)) (user-account (name "gitea") (group "gitea") (system? #t) (comment "gitea server user") (home-directory (gitea-configuration-work-path configuration)) (shell (file-append shadow "/sbin/nologin"))))) (define (gitea-shepherd-service configuration) (let* ((work-path (gitea-configuration-work-path configuration)) (config-custom-path (gitea-configuration-custom-path configuration)) (custom-path (if (maybe-value-set? config-custom-path) config-custom-path (string-append work-path "/custom"))) (config-config-path (gitea-configuration-config configuration)) (config-path (if (maybe-value-set? config-config-path) config-config-path (string-append custom-path "/conf/app.ini"))) (port (gitea-configuration-port configuration))) (list (shepherd-service (provision '(gitea)) (documentation "Run `gitea web` as a daemon") (requirement '(networking user-processes)) (start #~(make-forkexec-constructor (list (string-append #$gitea "/bin/gitea") "--port" #$(number->string port) "--work-path" #$work-path "--custom-path" #$custom-path "--config" #$config-path) #:environment-variables (list (string-append "HOME=" #$(gitea-configuration-work-path configuration))) #:user "gitea" #:log-file "/var/log/gitea.log")) (stop #~(make-kill-destructor)))))) (define-public gitea-service-type (service-type (name 'gitea) (extensions (list (service-extension shepherd-root-service-type gitea-shepherd-service) (service-extension activation-service-type gitea-activation) (service-extension account-service-type gitea-accounts))) (default-value (gitea-configuration)) (description "Run the Gitea Web server.")))