about summary refs log tree commit diff
path: root/gn
diff options
context:
space:
mode:
Diffstat (limited to 'gn')
-rw-r--r--gn/packages/gitea.scm52
-rw-r--r--gn/services/gitea-README17
-rw-r--r--gn/services/gitea-container.scm94
-rw-r--r--gn/services/gitea.service9
4 files changed, 172 insertions, 0 deletions
diff --git a/gn/packages/gitea.scm b/gn/packages/gitea.scm
new file mode 100644
index 0000000..0447bb9
--- /dev/null
+++ b/gn/packages/gitea.scm
@@ -0,0 +1,52 @@
+(define-module (gn packages gitea)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix packages)
+  #:use-module (guix download)
+  #:use-module (guix build-system trivial)
+  #:use-module (gnu packages bash)
+  #:use-module (gnu packages version-control))
+
+(define-public gitea
+  (package
+    (name "gitea")
+    (version "1.9.4")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/go-gitea/gitea/releases"
+                                  "/download/v" version
+                                  "/gitea-" version "-linux-amd64"))
+              (sha256
+               (base32
+                 "017bf09ym3244wqvqbpdqxmpnb7gs23fqn7h5k1vfcrwamfwc82n"))))
+    (build-system trivial-build-system)
+    (arguments
+     `(#:modules ((guix build utils))
+       #:builder
+       (begin
+         (use-modules (guix build utils))
+         (let* ((out     (assoc-ref %outputs "out"))
+                (bin     (string-append out "/bin"))
+                (target  (string-append bin "/gitea"))
+                (git     (assoc-ref %build-inputs "git"))
+                (bash    (assoc-ref %build-inputs "bash"))
+                (path    (getenv "PATH"))
+                (source  (assoc-ref %build-inputs "source")))
+           (copy-file source "gitea")
+           (chmod "gitea" #o555)
+           (install-file "gitea" bin)
+           (setenv "PATH" (string-append bash "/bin"))
+           (wrap-program target
+                         `("PATH" ":" prefix (,(string-append git "/bin")))))
+         #t)))
+    (native-inputs
+     `(("source" ,source)))
+    (inputs
+     `(("bash" ,bash-minimal)
+       ("git" ,git)))
+    (home-page "https://gitea.io/")
+    (synopsis "Self-hosted git service")
+    ;; TODO: Rewrite description
+    (description "Gitea is a painless self-hosted Git service.  It is similar
+to GitHub, Bitbucket, and GitLab.")
+    (supported-systems '("x86_64-linux"))
+    (license license:expat)))
diff --git a/gn/services/gitea-README b/gn/services/gitea-README
new file mode 100644
index 0000000..51be573
--- /dev/null
+++ b/gn/services/gitea-README
@@ -0,0 +1,17 @@
+SETUP:
+
+The setup process works like this:
+Decide where you want the base directory for gitea
+  for example: /srv/services/gitea
+# mkdir -p /srv/services
+Make the directory itself writable
+# chmod o+w /srv/services
+Decide the user/group you want to own the directory and service and change the container
+$ sed -i 's/1009/<insert-number>/g' gitea-container.scm
+
+for running the service:
+see included gitea.service
+
+for upgrades:
+# guix pull
+# systemctl restart gitea.service
diff --git a/gn/services/gitea-container.scm b/gn/services/gitea-container.scm
new file mode 100644
index 0000000..bc861c0
--- /dev/null
+++ b/gn/services/gitea-container.scm
@@ -0,0 +1,94 @@
+(define-module (gn services gitea-container))
+
+(use-modules (gnu)
+             (gn packages gitea)
+             (guix records)
+             (ice-9 match))
+(use-service-modules base networking shepherd)
+
+(define %GITEA_WORK_DIR "/var/lib/gitea")
+(define-record-type* <gitea-configuration>
+  gitea-configuration
+  make-gitea-configuration
+  gitea-configuration?
+  (package          gitea-configuration-package     ; package
+                    (default gitea))
+  (work-dir         gitea-configuration-work-dir    ; string
+                    (default %GITEA_WORK_DIR))
+  (port             gitea-configuration-port        ; number
+                    (default 3001)))
+
+(define gitea-activation
+  (match-lambda
+    (($ <gitea-configuration> package work-dir port)
+     #~(begin
+         (use-modules (guix build utils))
+         (let ((%user (getpwnam "gitea")))
+           ;; Prepare the environment for gitea:
+           ;; https://docs.gitea.io/en-us/install-from-binary/
+           (unless (directory-exists? #$work-dir)
+             (mkdir-p #$work-dir)
+             ;; These two are supposed to be recursive.
+             (chown #$work-dir (passwd:uid %user) (passwd:gid %user))
+             (chmod #$work-dir #o750)))))))
+
+(define gitea-shepherd-service
+  (match-lambda
+    (($ <gitea-configuration> package work-dir port)
+     (list (shepherd-service
+             (documentation "Run the Gitea server.")
+             (requirement '(networking))
+             (provision '(gitea))
+             (start #~(make-forkexec-constructor
+                        (list
+                          #$(file-append package "/bin/gitea")
+                          "--port" #$(number->string port))
+                        #:environment-variables
+                        (list (string-append "GITEA_WORK_DIR=" #$work-dir)
+                              (string-append "HOME=" #$work-dir))
+                        #:user "gitea"
+                        #:group "gitea"))
+             (stop #~(make-kill-destructor)))))))
+
+(define 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)))
+    (description
+     "Run a Gitea server.")
+    (default-value (gitea-configuration))))
+
+
+(operating-system
+  (host-name "gitea")
+  (timezone "Etc/UTC")
+  (locale "en_US.utf8")
+
+  (bootloader (bootloader-configuration
+               (bootloader grub-bootloader)
+               (target "does-not-matter")))
+  (file-systems %base-file-systems)
+  ;; No firmware for VMs or containers.
+  (firmware '())
+
+  ;; The user and group names aren't important, but the user uid and group id
+  ;; NEED to match the directory outside of the container.
+  (users (cons (user-account
+                 (name "gitea")
+                 (group "gitea")
+                 (system? #t)
+                 (uid 1009))
+           %base-user-accounts))
+
+  (groups (cons (user-group
+                  (name "gitea")
+                  (system? #t)
+                  (id 1009))
+                %base-groups))
+
+  (services (list (service dhcp-client-service-type)
+                  (service gitea-service-type))))
diff --git a/gn/services/gitea.service b/gn/services/gitea.service
new file mode 100644
index 0000000..3b54f85
--- /dev/null
+++ b/gn/services/gitea.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Gitea git server and web ui
+Wants=guix-daemon.service
+
+[Service]
+ExecStart=$(/var/guix/profiles/per-user/efraim/current-guix/bin/guix system container /home/efraimf/workspace/guix-bioinformatics/gn/services/gitea-container.scm --share=/home/efraimf/tmp=/var/lib --network)
+
+[Install]
+WantedBy=multi-user.target